diff --git a/BCCrypto/BCCrypto.csproj b/BCCrypto/BCCrypto.csproj
deleted file mode 100644
index 24623d4..0000000
--- a/BCCrypto/BCCrypto.csproj
+++ /dev/null
@@ -1,1531 +0,0 @@
-
-
-
-
- Debug
- AnyCPU
- {D7022BC7-E21D-4A79-BDE7-30F01ED961DF}
- Library
- Properties
- BCCrypto
- BCCrypto
- v3.5
- 512
-
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/BCCrypto/Properties/AssemblyInfo.cs b/BCCrypto/Properties/AssemblyInfo.cs
deleted file mode 100644
index 8959114..0000000
--- a/BCCrypto/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,119 +0,0 @@
-using System;
-using System.Reflection;
-//using System.Security.Permissions;
-
-#if PORTABLE
-using System.Linq;
-#else
-using System.Runtime.InteropServices;
-#endif
-
-//
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-//
-[assembly: AssemblyTitle("BouncyCastle.Crypto")]
-[assembly: AssemblyDescription("Bouncy Castle Cryptography API")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Legion of the Bouncy Castle Inc.")]
-[assembly: AssemblyProduct("Bouncy Castle for .NET")]
-[assembly: AssemblyCopyright("Copyright (C) 2000-2015")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-//
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers
-// by using the '*' as shown below:
-
-[assembly: AssemblyVersion("1.8.1.0")]
-[assembly: AssemblyFileVersion("1.8.15362.1")]
-[assembly: AssemblyInformationalVersion("1.8.1")]
-
-//
-// In order to sign your assembly you must specify a key to use. Refer to the
-// Microsoft .NET Framework documentation for more information on assembly signing.
-//
-// Use the attributes below to control which key is used for signing.
-//
-// Notes:
-// (*) If no key is specified, the assembly is not signed.
-// (*) KeyName refers to a key that has been installed in the Crypto Service
-// Provider (CSP) on your machine. KeyFile refers to a file which contains
-// a key.
-// (*) If the KeyFile and the KeyName values are both specified, the
-// following processing occurs:
-// (1) If the KeyName can be found in the CSP, that key is used.
-// (2) If the KeyName does not exist and the KeyFile does exist, the key
-// in the KeyFile is installed into the CSP and used.
-// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
-// When specifying the KeyFile, the location of the KeyFile should be
-// relative to the project output directory which is
-// %Project Directory%\obj\. For example, if your KeyFile is
-// located in the project directory, you would specify the AssemblyKeyFile
-// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
-// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
-// documentation for more information on this.
-//
-[assembly: AssemblyDelaySign(false)]
-#if STRONG_NAME
-[assembly: AssemblyKeyFile(@"../BouncyCastle.snk")]
-#endif
-
-[assembly: CLSCompliant(true)]
-#if !PORTABLE
-[assembly: ComVisible(false)]
-#endif
-
-// Start with no permissions
-//[assembly: PermissionSet(SecurityAction.RequestOptional, Unrestricted=false)]
-//...and explicitly add those we need
-
-// see Org.BouncyCastle.Crypto.Encodings.Pkcs1Encoding.StrictLengthEnabledProperty
-//[assembly: EnvironmentPermission(SecurityAction.RequestOptional, Read="Org.BouncyCastle.Pkcs1.Strict")]
-
-internal class AssemblyInfo
-{
- private static string version = null;
-
- public static string Version
- {
- get
- {
- if (version == null)
- {
-#if PORTABLE
-#if NEW_REFLECTION
- var a = typeof(AssemblyInfo).GetTypeInfo().Assembly;
- var c = a.GetCustomAttributes(typeof(AssemblyVersionAttribute));
-#else
- var a = typeof(AssemblyInfo).Assembly;
- var c = a.GetCustomAttributes(typeof(AssemblyVersionAttribute), false);
-#endif
- var v = (AssemblyVersionAttribute)c.FirstOrDefault();
- if (v != null)
- {
- version = v.Version;
- }
-#else
- version = Assembly.GetExecutingAssembly().GetName().Version.ToString();
-#endif
-
- // if we're still here, then don't try again
- if (version == null)
- {
- version = string.Empty;
- }
- }
-
- return version;
- }
- }
-}
diff --git a/BCCrypto/bzip2/src/BZip2Constants.cs b/BCCrypto/bzip2/src/BZip2Constants.cs
deleted file mode 100644
index 4a5442d..0000000
--- a/BCCrypto/bzip2/src/BZip2Constants.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-/*
- * This package is based on the work done by Keiron Liddle, Aftex Software
- * to whom the Ant project is very grateful for his
- * great code.
- */
-
-using System;
-
-namespace Org.BouncyCastle.Apache.Bzip2
-{
- /**
- * Base class for both the compress and decompress classes.
- * Holds common arrays, and static data.
- *
- * @author Keiron Liddle
- */
- public class BZip2Constants {
-
- public const int baseBlockSize = 100000;
- public const int MAX_ALPHA_SIZE = 258;
- public const int MAX_CODE_LEN = 23;
- public const int RUNA = 0;
- public const int RUNB = 1;
- public const int N_GROUPS = 6;
- public const int G_SIZE = 50;
- public const int N_ITERS = 4;
- public const int MAX_SELECTORS = (2 + (900000 / G_SIZE));
- public const int NUM_OVERSHOOT_BYTES = 20;
-
- public static readonly int[] rNums = {
- 619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
- 985, 724, 205, 454, 863, 491, 741, 242, 949, 214,
- 733, 859, 335, 708, 621, 574, 73, 654, 730, 472,
- 419, 436, 278, 496, 867, 210, 399, 680, 480, 51,
- 878, 465, 811, 169, 869, 675, 611, 697, 867, 561,
- 862, 687, 507, 283, 482, 129, 807, 591, 733, 623,
- 150, 238, 59, 379, 684, 877, 625, 169, 643, 105,
- 170, 607, 520, 932, 727, 476, 693, 425, 174, 647,
- 73, 122, 335, 530, 442, 853, 695, 249, 445, 515,
- 909, 545, 703, 919, 874, 474, 882, 500, 594, 612,
- 641, 801, 220, 162, 819, 984, 589, 513, 495, 799,
- 161, 604, 958, 533, 221, 400, 386, 867, 600, 782,
- 382, 596, 414, 171, 516, 375, 682, 485, 911, 276,
- 98, 553, 163, 354, 666, 933, 424, 341, 533, 870,
- 227, 730, 475, 186, 263, 647, 537, 686, 600, 224,
- 469, 68, 770, 919, 190, 373, 294, 822, 808, 206,
- 184, 943, 795, 384, 383, 461, 404, 758, 839, 887,
- 715, 67, 618, 276, 204, 918, 873, 777, 604, 560,
- 951, 160, 578, 722, 79, 804, 96, 409, 713, 940,
- 652, 934, 970, 447, 318, 353, 859, 672, 112, 785,
- 645, 863, 803, 350, 139, 93, 354, 99, 820, 908,
- 609, 772, 154, 274, 580, 184, 79, 626, 630, 742,
- 653, 282, 762, 623, 680, 81, 927, 626, 789, 125,
- 411, 521, 938, 300, 821, 78, 343, 175, 128, 250,
- 170, 774, 972, 275, 999, 639, 495, 78, 352, 126,
- 857, 956, 358, 619, 580, 124, 737, 594, 701, 612,
- 669, 112, 134, 694, 363, 992, 809, 743, 168, 974,
- 944, 375, 748, 52, 600, 747, 642, 182, 862, 81,
- 344, 805, 988, 739, 511, 655, 814, 334, 249, 515,
- 897, 955, 664, 981, 649, 113, 974, 459, 893, 228,
- 433, 837, 553, 268, 926, 240, 102, 654, 459, 51,
- 686, 754, 806, 760, 493, 403, 415, 394, 687, 700,
- 946, 670, 656, 610, 738, 392, 760, 799, 887, 653,
- 978, 321, 576, 617, 626, 502, 894, 679, 243, 440,
- 680, 879, 194, 572, 640, 724, 926, 56, 204, 700,
- 707, 151, 457, 449, 797, 195, 791, 558, 945, 679,
- 297, 59, 87, 824, 713, 663, 412, 693, 342, 606,
- 134, 108, 571, 364, 631, 212, 174, 643, 304, 329,
- 343, 97, 430, 751, 497, 314, 983, 374, 822, 928,
- 140, 206, 73, 263, 980, 736, 876, 478, 430, 305,
- 170, 514, 364, 692, 829, 82, 855, 953, 676, 246,
- 369, 970, 294, 750, 807, 827, 150, 790, 288, 923,
- 804, 378, 215, 828, 592, 281, 565, 555, 710, 82,
- 896, 831, 547, 261, 524, 462, 293, 465, 502, 56,
- 661, 821, 976, 991, 658, 869, 905, 758, 745, 193,
- 768, 550, 608, 933, 378, 286, 215, 979, 792, 961,
- 61, 688, 793, 644, 986, 403, 106, 366, 905, 644,
- 372, 567, 466, 434, 645, 210, 389, 550, 919, 135,
- 780, 773, 635, 389, 707, 100, 626, 958, 165, 504,
- 920, 176, 193, 713, 857, 265, 203, 50, 668, 108,
- 645, 990, 626, 197, 510, 357, 358, 850, 858, 364,
- 936, 638
- };
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/bzip2/src/CBZip2InputStream.cs b/BCCrypto/bzip2/src/CBZip2InputStream.cs
deleted file mode 100644
index 82ff83e..0000000
--- a/BCCrypto/bzip2/src/CBZip2InputStream.cs
+++ /dev/null
@@ -1,921 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-/*
- * This package is based on the work done by Keiron Liddle, Aftex Software
- * to whom the Ant project is very grateful for his
- * great code.
- */
-
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Apache.Bzip2
-{
- /**
- * An input stream that decompresses from the BZip2 format (with the file
- * header chars) to be read as any other stream.
- *
- * @author Keiron Liddle
- *
- * NB: note this class has been modified to read the leading BZ from the
- * start of the BZIP2 stream to make it compatible with other PGP programs.
- */
- public class CBZip2InputStream : Stream
- {
- private static void Cadvise() {
- //System.out.Println("CRC Error");
- //throw new CCoruptionError();
- }
-
-// private static void BadBGLengths() {
-// Cadvise();
-// }
-//
-// private static void BitStreamEOF() {
-// Cadvise();
-// }
-
- private static void CompressedStreamEOF() {
- Cadvise();
- }
-
- private void MakeMaps() {
- int i;
- nInUse = 0;
- for (i = 0; i < 256; i++) {
- if (inUse[i]) {
- seqToUnseq[nInUse] = (char) i;
- unseqToSeq[i] = (char) nInUse;
- nInUse++;
- }
- }
- }
-
- /*
- index of the last char in the block, so
- the block size == last + 1.
- */
- private int last;
-
- /*
- index in zptr[] of original string after sorting.
- */
- private int origPtr;
-
- /*
- always: in the range 0 .. 9.
- The current block size is 100000 * this number.
- */
- private int blockSize100k;
-
- private bool blockRandomised;
-
- private int bsBuff;
- private int bsLive;
- private CRC mCrc = new CRC();
-
- private bool[] inUse = new bool[256];
- private int nInUse;
-
- private char[] seqToUnseq = new char[256];
- private char[] unseqToSeq = new char[256];
-
- private char[] selector = new char[BZip2Constants.MAX_SELECTORS];
- private char[] selectorMtf = new char[BZip2Constants.MAX_SELECTORS];
-
- private int[] tt;
- private char[] ll8;
-
- /*
- freq table collected to save a pass over the data
- during decompression.
- */
- private int[] unzftab = new int[256];
-
- private int[][] limit = InitIntArray(BZip2Constants.N_GROUPS, BZip2Constants.MAX_ALPHA_SIZE);
- private int[][] basev = InitIntArray(BZip2Constants.N_GROUPS, BZip2Constants.MAX_ALPHA_SIZE);
- private int[][] perm = InitIntArray(BZip2Constants.N_GROUPS, BZip2Constants.MAX_ALPHA_SIZE);
- private int[] minLens = new int[BZip2Constants.N_GROUPS];
-
- private Stream bsStream;
-
- private bool streamEnd = false;
-
- private int currentChar = -1;
-
- private const int START_BLOCK_STATE = 1;
- private const int RAND_PART_A_STATE = 2;
- private const int RAND_PART_B_STATE = 3;
- private const int RAND_PART_C_STATE = 4;
- private const int NO_RAND_PART_A_STATE = 5;
- private const int NO_RAND_PART_B_STATE = 6;
- private const int NO_RAND_PART_C_STATE = 7;
-
- private int currentState = START_BLOCK_STATE;
-
- private int storedBlockCRC, storedCombinedCRC;
- private int computedBlockCRC, computedCombinedCRC;
-
- int i2, count, chPrev, ch2;
- int i, tPos;
- int rNToGo = 0;
- int rTPos = 0;
- int j2;
- char z;
-
- public CBZip2InputStream(Stream zStream) {
- ll8 = null;
- tt = null;
- BsSetStream(zStream);
- Initialize();
- InitBlock();
- SetupBlock();
- }
-
- internal static int[][] InitIntArray(int n1, int n2) {
- int[][] a = new int[n1][];
- for (int k = 0; k < n1; ++k) {
- a[k] = new int[n2];
- }
- return a;
- }
-
- internal static char[][] InitCharArray(int n1, int n2) {
- char[][] a = new char[n1][];
- for (int k = 0; k < n1; ++k) {
- a[k] = new char[n2];
- }
- return a;
- }
-
- public override int ReadByte() {
- if (streamEnd) {
- return -1;
- } else {
- int retChar = currentChar;
- switch (currentState) {
- case START_BLOCK_STATE:
- break;
- case RAND_PART_A_STATE:
- break;
- case RAND_PART_B_STATE:
- SetupRandPartB();
- break;
- case RAND_PART_C_STATE:
- SetupRandPartC();
- break;
- case NO_RAND_PART_A_STATE:
- break;
- case NO_RAND_PART_B_STATE:
- SetupNoRandPartB();
- break;
- case NO_RAND_PART_C_STATE:
- SetupNoRandPartC();
- break;
- default:
- break;
- }
- return retChar;
- }
- }
-
- private void Initialize() {
- char magic3, magic4;
- magic3 = BsGetUChar();
- magic4 = BsGetUChar();
- if (magic3 != 'B' && magic4 != 'Z')
- {
- throw new IOException("Not a BZIP2 marked stream");
- }
- magic3 = BsGetUChar();
- magic4 = BsGetUChar();
- if (magic3 != 'h' || magic4 < '1' || magic4 > '9') {
- BsFinishedWithStream();
- streamEnd = true;
- return;
- }
-
- SetDecompressStructureSizes(magic4 - '0');
- computedCombinedCRC = 0;
- }
-
- private void InitBlock() {
- char magic1, magic2, magic3, magic4;
- char magic5, magic6;
- magic1 = BsGetUChar();
- magic2 = BsGetUChar();
- magic3 = BsGetUChar();
- magic4 = BsGetUChar();
- magic5 = BsGetUChar();
- magic6 = BsGetUChar();
- if (magic1 == 0x17 && magic2 == 0x72 && magic3 == 0x45
- && magic4 == 0x38 && magic5 == 0x50 && magic6 == 0x90) {
- Complete();
- return;
- }
-
- if (magic1 != 0x31 || magic2 != 0x41 || magic3 != 0x59
- || magic4 != 0x26 || magic5 != 0x53 || magic6 != 0x59) {
- BadBlockHeader();
- streamEnd = true;
- return;
- }
-
- storedBlockCRC = BsGetInt32();
-
- if (BsR(1) == 1) {
- blockRandomised = true;
- } else {
- blockRandomised = false;
- }
-
- // currBlockNo++;
- GetAndMoveToFrontDecode();
-
- mCrc.InitialiseCRC();
- currentState = START_BLOCK_STATE;
- }
-
- private void EndBlock() {
- computedBlockCRC = mCrc.GetFinalCRC();
- /* A bad CRC is considered a fatal error. */
- if (storedBlockCRC != computedBlockCRC) {
- CrcError();
- }
-
- computedCombinedCRC = (computedCombinedCRC << 1)
- | (int)(((uint)computedCombinedCRC) >> 31);
- computedCombinedCRC ^= computedBlockCRC;
- }
-
- private void Complete() {
- storedCombinedCRC = BsGetInt32();
- if (storedCombinedCRC != computedCombinedCRC) {
- CrcError();
- }
-
- BsFinishedWithStream();
- streamEnd = true;
- }
-
- private static void BlockOverrun() {
- Cadvise();
- }
-
- private static void BadBlockHeader() {
- Cadvise();
- }
-
- private static void CrcError() {
- Cadvise();
- }
-
- private void BsFinishedWithStream() {
- try {
- if (this.bsStream != null) {
- Platform.Dispose(this.bsStream);
- this.bsStream = null;
- }
- } catch {
- //ignore
- }
- }
-
- private void BsSetStream(Stream f) {
- bsStream = f;
- bsLive = 0;
- bsBuff = 0;
- }
-
- private int BsR(int n) {
- int v;
- while (bsLive < n) {
- int zzi;
- char thech = '\0';
- try {
- thech = (char) bsStream.ReadByte();
- } catch (IOException) {
- CompressedStreamEOF();
- }
- if (thech == '\uffff') {
- CompressedStreamEOF();
- }
- zzi = thech;
- bsBuff = (bsBuff << 8) | (zzi & 0xff);
- bsLive += 8;
- }
-
- v = (bsBuff >> (bsLive - n)) & ((1 << n) - 1);
- bsLive -= n;
- return v;
- }
-
- private char BsGetUChar() {
- return (char) BsR(8);
- }
-
- private int BsGetint() {
- int u = 0;
- u = (u << 8) | BsR(8);
- u = (u << 8) | BsR(8);
- u = (u << 8) | BsR(8);
- u = (u << 8) | BsR(8);
- return u;
- }
-
- private int BsGetIntVS(int numBits) {
- return (int) BsR(numBits);
- }
-
- private int BsGetInt32() {
- return (int) BsGetint();
- }
-
- private void HbCreateDecodeTables(int[] limit, int[] basev,
- int[] perm, char[] length,
- int minLen, int maxLen, int alphaSize) {
- int pp, i, j, vec;
-
- pp = 0;
- for (i = minLen; i <= maxLen; i++) {
- for (j = 0; j < alphaSize; j++) {
- if (length[j] == i) {
- perm[pp] = j;
- pp++;
- }
- }
- }
-
- for (i = 0; i < BZip2Constants.MAX_CODE_LEN; i++) {
- basev[i] = 0;
- }
- for (i = 0; i < alphaSize; i++) {
- basev[length[i] + 1]++;
- }
-
- for (i = 1; i < BZip2Constants.MAX_CODE_LEN; i++) {
- basev[i] += basev[i - 1];
- }
-
- for (i = 0; i < BZip2Constants.MAX_CODE_LEN; i++) {
- limit[i] = 0;
- }
- vec = 0;
-
- for (i = minLen; i <= maxLen; i++) {
- vec += (basev[i + 1] - basev[i]);
- limit[i] = vec - 1;
- vec <<= 1;
- }
- for (i = minLen + 1; i <= maxLen; i++) {
- basev[i] = ((limit[i - 1] + 1) << 1) - basev[i];
- }
- }
-
- private void RecvDecodingTables() {
- char[][] len = InitCharArray(BZip2Constants.N_GROUPS, BZip2Constants.MAX_ALPHA_SIZE);
- int i, j, t, nGroups, nSelectors, alphaSize;
- int minLen, maxLen;
- bool[] inUse16 = new bool[16];
-
- /* Receive the mapping table */
- for (i = 0; i < 16; i++) {
- if (BsR(1) == 1) {
- inUse16[i] = true;
- } else {
- inUse16[i] = false;
- }
- }
-
- for (i = 0; i < 256; i++) {
- inUse[i] = false;
- }
-
- for (i = 0; i < 16; i++) {
- if (inUse16[i]) {
- for (j = 0; j < 16; j++) {
- if (BsR(1) == 1) {
- inUse[i * 16 + j] = true;
- }
- }
- }
- }
-
- MakeMaps();
- alphaSize = nInUse + 2;
-
- /* Now the selectors */
- nGroups = BsR(3);
- nSelectors = BsR(15);
- for (i = 0; i < nSelectors; i++) {
- j = 0;
- while (BsR(1) == 1) {
- j++;
- }
- selectorMtf[i] = (char) j;
- }
-
- /* Undo the MTF values for the selectors. */
- {
- char[] pos = new char[BZip2Constants.N_GROUPS];
- char tmp, v;
- for (v = '\0'; v < nGroups; v++) {
- pos[v] = v;
- }
-
- for (i = 0; i < nSelectors; i++) {
- v = selectorMtf[i];
- tmp = pos[v];
- while (v > 0) {
- pos[v] = pos[v - 1];
- v--;
- }
- pos[0] = tmp;
- selector[i] = tmp;
- }
- }
-
- /* Now the coding tables */
- for (t = 0; t < nGroups; t++) {
- int curr = BsR(5);
- for (i = 0; i < alphaSize; i++) {
- while (BsR(1) == 1) {
- if (BsR(1) == 0) {
- curr++;
- } else {
- curr--;
- }
- }
- len[t][i] = (char) curr;
- }
- }
-
- /* Create the Huffman decoding tables */
- for (t = 0; t < nGroups; t++) {
- minLen = 32;
- maxLen = 0;
- for (i = 0; i < alphaSize; i++) {
- if (len[t][i] > maxLen) {
- maxLen = len[t][i];
- }
- if (len[t][i] < minLen) {
- minLen = len[t][i];
- }
- }
- HbCreateDecodeTables(limit[t], basev[t], perm[t], len[t], minLen,
- maxLen, alphaSize);
- minLens[t] = minLen;
- }
- }
-
- private void GetAndMoveToFrontDecode() {
- char[] yy = new char[256];
- int i, j, nextSym, limitLast;
- int EOB, groupNo, groupPos;
-
- limitLast = BZip2Constants.baseBlockSize * blockSize100k;
- origPtr = BsGetIntVS(24);
-
- RecvDecodingTables();
- EOB = nInUse + 1;
- groupNo = -1;
- groupPos = 0;
-
- /*
- Setting up the unzftab entries here is not strictly
- necessary, but it does save having to do it later
- in a separate pass, and so saves a block's worth of
- cache misses.
- */
- for (i = 0; i <= 255; i++) {
- unzftab[i] = 0;
- }
-
- for (i = 0; i <= 255; i++) {
- yy[i] = (char) i;
- }
-
- last = -1;
-
- {
- int zt, zn, zvec, zj;
- if (groupPos == 0) {
- groupNo++;
- groupPos = BZip2Constants.G_SIZE;
- }
- groupPos--;
- zt = selector[groupNo];
- zn = minLens[zt];
- zvec = BsR(zn);
- while (zvec > limit[zt][zn]) {
- zn++;
- {
- {
- while (bsLive < 1) {
- int zzi;
- char thech = '\0';
- try {
- thech = (char) bsStream.ReadByte();
- } catch (IOException) {
- CompressedStreamEOF();
- }
- if (thech == '\uffff') {
- CompressedStreamEOF();
- }
- zzi = thech;
- bsBuff = (bsBuff << 8) | (zzi & 0xff);
- bsLive += 8;
- }
- }
- zj = (bsBuff >> (bsLive - 1)) & 1;
- bsLive--;
- }
- zvec = (zvec << 1) | zj;
- }
- nextSym = perm[zt][zvec - basev[zt][zn]];
- }
-
- while (true) {
-
- if (nextSym == EOB) {
- break;
- }
-
- if (nextSym == BZip2Constants.RUNA || nextSym == BZip2Constants.RUNB) {
- char ch;
- int s = -1;
- int N = 1;
- do {
- if (nextSym == BZip2Constants.RUNA) {
- s = s + (0 + 1) * N;
- } else if (nextSym == BZip2Constants.RUNB) {
- s = s + (1 + 1) * N;
- }
- N = N * 2;
- {
- int zt, zn, zvec, zj;
- if (groupPos == 0) {
- groupNo++;
- groupPos = BZip2Constants.G_SIZE;
- }
- groupPos--;
- zt = selector[groupNo];
- zn = minLens[zt];
- zvec = BsR(zn);
- while (zvec > limit[zt][zn]) {
- zn++;
- {
- {
- while (bsLive < 1) {
- int zzi;
- char thech = '\0';
- try {
- thech = (char) bsStream.ReadByte();
- } catch (IOException) {
- CompressedStreamEOF();
- }
- if (thech == '\uffff') {
- CompressedStreamEOF();
- }
- zzi = thech;
- bsBuff = (bsBuff << 8) | (zzi & 0xff);
- bsLive += 8;
- }
- }
- zj = (bsBuff >> (bsLive - 1)) & 1;
- bsLive--;
- }
- zvec = (zvec << 1) | zj;
- }
- nextSym = perm[zt][zvec - basev[zt][zn]];
- }
- } while (nextSym == BZip2Constants.RUNA || nextSym == BZip2Constants.RUNB);
-
- s++;
- ch = seqToUnseq[yy[0]];
- unzftab[ch] += s;
-
- while (s > 0) {
- last++;
- ll8[last] = ch;
- s--;
- }
-
- if (last >= limitLast) {
- BlockOverrun();
- }
- continue;
- } else {
- char tmp;
- last++;
- if (last >= limitLast) {
- BlockOverrun();
- }
-
- tmp = yy[nextSym - 1];
- unzftab[seqToUnseq[tmp]]++;
- ll8[last] = seqToUnseq[tmp];
-
- /*
- This loop is hammered during decompression,
- hence the unrolling.
-
- for (j = nextSym-1; j > 0; j--) yy[j] = yy[j-1];
- */
-
- j = nextSym - 1;
- for (; j > 3; j -= 4) {
- yy[j] = yy[j - 1];
- yy[j - 1] = yy[j - 2];
- yy[j - 2] = yy[j - 3];
- yy[j - 3] = yy[j - 4];
- }
- for (; j > 0; j--) {
- yy[j] = yy[j - 1];
- }
-
- yy[0] = tmp;
- {
- int zt, zn, zvec, zj;
- if (groupPos == 0) {
- groupNo++;
- groupPos = BZip2Constants.G_SIZE;
- }
- groupPos--;
- zt = selector[groupNo];
- zn = minLens[zt];
- zvec = BsR(zn);
- while (zvec > limit[zt][zn]) {
- zn++;
- {
- {
- while (bsLive < 1) {
- int zzi;
- char thech = '\0';
- try {
- thech = (char) bsStream.ReadByte();
- } catch (IOException) {
- CompressedStreamEOF();
- }
- zzi = thech;
- bsBuff = (bsBuff << 8) | (zzi & 0xff);
- bsLive += 8;
- }
- }
- zj = (bsBuff >> (bsLive - 1)) & 1;
- bsLive--;
- }
- zvec = (zvec << 1) | zj;
- }
- nextSym = perm[zt][zvec - basev[zt][zn]];
- }
- continue;
- }
- }
- }
-
- private void SetupBlock() {
- int[] cftab = new int[257];
- char ch;
-
- cftab[0] = 0;
- for (i = 1; i <= 256; i++) {
- cftab[i] = unzftab[i - 1];
- }
- for (i = 1; i <= 256; i++) {
- cftab[i] += cftab[i - 1];
- }
-
- for (i = 0; i <= last; i++) {
- ch = (char) ll8[i];
- tt[cftab[ch]] = i;
- cftab[ch]++;
- }
- cftab = null;
-
- tPos = tt[origPtr];
-
- count = 0;
- i2 = 0;
- ch2 = 256; /* not a char and not EOF */
-
- if (blockRandomised) {
- rNToGo = 0;
- rTPos = 0;
- SetupRandPartA();
- } else {
- SetupNoRandPartA();
- }
- }
-
- private void SetupRandPartA() {
- if (i2 <= last) {
- chPrev = ch2;
- ch2 = ll8[tPos];
- tPos = tt[tPos];
- if (rNToGo == 0) {
- rNToGo = BZip2Constants.rNums[rTPos];
- rTPos++;
- if (rTPos == 512) {
- rTPos = 0;
- }
- }
- rNToGo--;
- ch2 ^= (int) ((rNToGo == 1) ? 1 : 0);
- i2++;
-
- currentChar = ch2;
- currentState = RAND_PART_B_STATE;
- mCrc.UpdateCRC(ch2);
- } else {
- EndBlock();
- InitBlock();
- SetupBlock();
- }
- }
-
- private void SetupNoRandPartA() {
- if (i2 <= last) {
- chPrev = ch2;
- ch2 = ll8[tPos];
- tPos = tt[tPos];
- i2++;
-
- currentChar = ch2;
- currentState = NO_RAND_PART_B_STATE;
- mCrc.UpdateCRC(ch2);
- } else {
- EndBlock();
- InitBlock();
- SetupBlock();
- }
- }
-
- private void SetupRandPartB() {
- if (ch2 != chPrev) {
- currentState = RAND_PART_A_STATE;
- count = 1;
- SetupRandPartA();
- } else {
- count++;
- if (count >= 4) {
- z = ll8[tPos];
- tPos = tt[tPos];
- if (rNToGo == 0) {
- rNToGo = BZip2Constants.rNums[rTPos];
- rTPos++;
- if (rTPos == 512) {
- rTPos = 0;
- }
- }
- rNToGo--;
- z ^= (char)((rNToGo == 1) ? 1 : 0);
- j2 = 0;
- currentState = RAND_PART_C_STATE;
- SetupRandPartC();
- } else {
- currentState = RAND_PART_A_STATE;
- SetupRandPartA();
- }
- }
- }
-
- private void SetupRandPartC() {
- if (j2 < (int) z) {
- currentChar = ch2;
- mCrc.UpdateCRC(ch2);
- j2++;
- } else {
- currentState = RAND_PART_A_STATE;
- i2++;
- count = 0;
- SetupRandPartA();
- }
- }
-
- private void SetupNoRandPartB() {
- if (ch2 != chPrev) {
- currentState = NO_RAND_PART_A_STATE;
- count = 1;
- SetupNoRandPartA();
- } else {
- count++;
- if (count >= 4) {
- z = ll8[tPos];
- tPos = tt[tPos];
- currentState = NO_RAND_PART_C_STATE;
- j2 = 0;
- SetupNoRandPartC();
- } else {
- currentState = NO_RAND_PART_A_STATE;
- SetupNoRandPartA();
- }
- }
- }
-
- private void SetupNoRandPartC() {
- if (j2 < (int) z) {
- currentChar = ch2;
- mCrc.UpdateCRC(ch2);
- j2++;
- } else {
- currentState = NO_RAND_PART_A_STATE;
- i2++;
- count = 0;
- SetupNoRandPartA();
- }
- }
-
- private void SetDecompressStructureSizes(int newSize100k) {
- if (!(0 <= newSize100k && newSize100k <= 9 && 0 <= blockSize100k
- && blockSize100k <= 9)) {
- // throw new IOException("Invalid block size");
- }
-
- blockSize100k = newSize100k;
-
- if (newSize100k == 0) {
- return;
- }
-
- int n = BZip2Constants.baseBlockSize * newSize100k;
- ll8 = new char[n];
- tt = new int[n];
- }
-
- public override void Flush() {
- }
-
- public override int Read(byte[] buffer, int offset, int count) {
- int c = -1;
- int k;
- for (k = 0; k < count; ++k) {
- c = ReadByte();
- if (c == -1)
- break;
- buffer[k + offset] = (byte)c;
- }
- return k;
- }
-
- public override long Seek(long offset, SeekOrigin origin) {
- return 0;
- }
-
- public override void SetLength(long value) {
- }
-
- public override void Write(byte[] buffer, int offset, int count) {
- }
-
- public override bool CanRead {
- get {
- return true;
- }
- }
-
- public override bool CanSeek {
- get {
- return false;
- }
- }
-
- public override bool CanWrite {
- get {
- return false;
- }
- }
-
- public override long Length {
- get {
- return 0;
- }
- }
-
- public override long Position {
- get {
- return 0;
- }
- set {
- }
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/bzip2/src/CBZip2OutputStream.cs b/BCCrypto/bzip2/src/CBZip2OutputStream.cs
deleted file mode 100644
index ffac073..0000000
--- a/BCCrypto/bzip2/src/CBZip2OutputStream.cs
+++ /dev/null
@@ -1,1709 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-/*
- * This package is based on the work done by Keiron Liddle, Aftex Software
- * to whom the Ant project is very grateful for his
- * great code.
- */
-
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Apache.Bzip2
-{
- /**
- * An output stream that compresses into the BZip2 format (with the file
- * header chars) into another stream.
- *
- * @author Keiron Liddle
- *
- * TODO: Update to BZip2 1.0.1
- * NB: note this class has been modified to add a leading BZ to the
- * start of the BZIP2 stream to make it compatible with other PGP programs.
- */
- public class CBZip2OutputStream : Stream
- {
- protected const int SETMASK = (1 << 21);
- protected const int CLEARMASK = (~SETMASK);
- protected const int GREATER_ICOST = 15;
- protected const int LESSER_ICOST = 0;
- protected const int SMALL_THRESH = 20;
- protected const int DEPTH_THRESH = 10;
-
- /*
- If you are ever unlucky/improbable enough
- to get a stack overflow whilst sorting,
- increase the following constant and try
- again. In practice I have never seen the
- stack go above 27 elems, so the following
- limit seems very generous.
- */
- protected const int QSORT_STACK_SIZE = 1000;
- private bool finished;
-
- private static void Panic() {
- //System.out.Println("panic");
- //throw new CError();
- }
-
- private void MakeMaps() {
- int i;
- nInUse = 0;
- for (i = 0; i < 256; i++) {
- if (inUse[i]) {
- seqToUnseq[nInUse] = (char) i;
- unseqToSeq[i] = (char) nInUse;
- nInUse++;
- }
- }
- }
-
- protected static void HbMakeCodeLengths(char[] len, int[] freq,
- int alphaSize, int maxLen) {
- /*
- Nodes and heap entries run from 1. Entry 0
- for both the heap and nodes is a sentinel.
- */
- int nNodes, nHeap, n1, n2, i, j, k;
- bool tooLong;
-
- int[] heap = new int[BZip2Constants.MAX_ALPHA_SIZE + 2];
- int[] weight = new int[BZip2Constants.MAX_ALPHA_SIZE * 2];
- int[] parent = new int[BZip2Constants.MAX_ALPHA_SIZE * 2];
-
- for (i = 0; i < alphaSize; i++) {
- weight[i + 1] = (freq[i] == 0 ? 1 : freq[i]) << 8;
- }
-
- while (true) {
- nNodes = alphaSize;
- nHeap = 0;
-
- heap[0] = 0;
- weight[0] = 0;
- parent[0] = -2;
-
- for (i = 1; i <= alphaSize; i++) {
- parent[i] = -1;
- nHeap++;
- heap[nHeap] = i;
- {
- int zz, tmp;
- zz = nHeap;
- tmp = heap[zz];
- while (weight[tmp] < weight[heap[zz >> 1]]) {
- heap[zz] = heap[zz >> 1];
- zz >>= 1;
- }
- heap[zz] = tmp;
- }
- }
- if (!(nHeap < (BZip2Constants.MAX_ALPHA_SIZE + 2))) {
- Panic();
- }
-
- while (nHeap > 1) {
- n1 = heap[1];
- heap[1] = heap[nHeap];
- nHeap--;
- {
- int zz = 0, yy = 0, tmp = 0;
- zz = 1;
- tmp = heap[zz];
- while (true) {
- yy = zz << 1;
- if (yy > nHeap) {
- break;
- }
- if (yy < nHeap
- && weight[heap[yy + 1]] < weight[heap[yy]]) {
- yy++;
- }
- if (weight[tmp] < weight[heap[yy]]) {
- break;
- }
- heap[zz] = heap[yy];
- zz = yy;
- }
- heap[zz] = tmp;
- }
- n2 = heap[1];
- heap[1] = heap[nHeap];
- nHeap--;
- {
- int zz = 0, yy = 0, tmp = 0;
- zz = 1;
- tmp = heap[zz];
- while (true) {
- yy = zz << 1;
- if (yy > nHeap) {
- break;
- }
- if (yy < nHeap
- && weight[heap[yy + 1]] < weight[heap[yy]]) {
- yy++;
- }
- if (weight[tmp] < weight[heap[yy]]) {
- break;
- }
- heap[zz] = heap[yy];
- zz = yy;
- }
- heap[zz] = tmp;
- }
- nNodes++;
- parent[n1] = parent[n2] = nNodes;
-
- weight[nNodes] = (int)((uint)((weight[n1] & 0xffffff00)
- + (weight[n2] & 0xffffff00))
- | (uint)(1 + (((weight[n1] & 0x000000ff) >
- (weight[n2] & 0x000000ff)) ?
- (weight[n1] & 0x000000ff) :
- (weight[n2] & 0x000000ff))));
-
- parent[nNodes] = -1;
- nHeap++;
- heap[nHeap] = nNodes;
- {
- int zz = 0, tmp = 0;
- zz = nHeap;
- tmp = heap[zz];
- while (weight[tmp] < weight[heap[zz >> 1]]) {
- heap[zz] = heap[zz >> 1];
- zz >>= 1;
- }
- heap[zz] = tmp;
- }
- }
- if (!(nNodes < (BZip2Constants.MAX_ALPHA_SIZE * 2))) {
- Panic();
- }
-
- tooLong = false;
- for (i = 1; i <= alphaSize; i++) {
- j = 0;
- k = i;
- while (parent[k] >= 0) {
- k = parent[k];
- j++;
- }
- len[i - 1] = (char) j;
- if (j > maxLen) {
- tooLong = true;
- }
- }
-
- if (!tooLong) {
- break;
- }
-
- for (i = 1; i < alphaSize; i++) {
- j = weight[i] >> 8;
- j = 1 + (j / 2);
- weight[i] = j << 8;
- }
- }
- }
-
- /*
- index of the last char in the block, so
- the block size == last + 1.
- */
- int last;
-
- /*
- index in zptr[] of original string after sorting.
- */
- int origPtr;
-
- /*
- always: in the range 0 .. 9.
- The current block size is 100000 * this number.
- */
- int blockSize100k;
-
- bool blockRandomised;
-
- int bytesOut;
- int bsBuff;
- int bsLive;
- CRC mCrc = new CRC();
-
- private bool[] inUse = new bool[256];
- private int nInUse;
-
- private char[] seqToUnseq = new char[256];
- private char[] unseqToSeq = new char[256];
-
- private char[] selector = new char[BZip2Constants.MAX_SELECTORS];
- private char[] selectorMtf = new char[BZip2Constants.MAX_SELECTORS];
-
- private char[] block;
- private int[] quadrant;
- private int[] zptr;
- private short[] szptr;
- private int[] ftab;
-
- private int nMTF;
-
- private int[] mtfFreq = new int[BZip2Constants.MAX_ALPHA_SIZE];
-
- /*
- * Used when sorting. If too many long comparisons
- * happen, we stop sorting, randomise the block
- * slightly, and try again.
- */
- private int workFactor;
- private int workDone;
- private int workLimit;
- private bool firstAttempt;
- private int nBlocksRandomised;
-
- private int currentChar = -1;
- private int runLength = 0;
-
- public CBZip2OutputStream(Stream inStream) : this(inStream, 9) {
- }
-
- public CBZip2OutputStream(Stream inStream, int inBlockSize)
- {
- block = null;
- quadrant = null;
- zptr = null;
- ftab = null;
-
- inStream.WriteByte((byte)'B');
- inStream.WriteByte((byte)'Z');
-
- BsSetStream(inStream);
-
- workFactor = 50;
- if (inBlockSize > 9) {
- inBlockSize = 9;
- }
- if (inBlockSize < 1) {
- inBlockSize = 1;
- }
- blockSize100k = inBlockSize;
- AllocateCompressStructures();
- Initialize();
- InitBlock();
- }
-
- /**
- *
- * modified by Oliver Merkel, 010128
- *
- */
- public override void WriteByte(byte bv) {
- int b = (256 + bv) % 256;
- if (currentChar != -1) {
- if (currentChar == b) {
- runLength++;
- if (runLength > 254) {
- WriteRun();
- currentChar = -1;
- runLength = 0;
- }
- } else {
- WriteRun();
- runLength = 1;
- currentChar = b;
- }
- } else {
- currentChar = b;
- runLength++;
- }
- }
-
- private void WriteRun() {
- if (last < allowableBlockSize) {
- inUse[currentChar] = true;
- for (int i = 0; i < runLength; i++) {
- mCrc.UpdateCRC((char) currentChar);
- }
- switch (runLength) {
- case 1:
- last++;
- block[last + 1] = (char) currentChar;
- break;
- case 2:
- last++;
- block[last + 1] = (char) currentChar;
- last++;
- block[last + 1] = (char) currentChar;
- break;
- case 3:
- last++;
- block[last + 1] = (char) currentChar;
- last++;
- block[last + 1] = (char) currentChar;
- last++;
- block[last + 1] = (char) currentChar;
- break;
- default:
- inUse[runLength - 4] = true;
- last++;
- block[last + 1] = (char) currentChar;
- last++;
- block[last + 1] = (char) currentChar;
- last++;
- block[last + 1] = (char) currentChar;
- last++;
- block[last + 1] = (char) currentChar;
- last++;
- block[last + 1] = (char) (runLength - 4);
- break;
- }
- } else {
- EndBlock();
- InitBlock();
- WriteRun();
- }
- }
-
- bool closed = false;
-
-// protected void Finalize() {
-// Close();
-// }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- if (closed)
- return;
-
- Finish();
- closed = true;
- Platform.Dispose(this.bsStream);
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close() {
- if (closed)
- return;
-
- Finish();
-
- closed = true;
- Platform.Dispose(this.bsStream);
-
- base.Close();
- }
-#endif
-
- public void Finish() {
- if (finished) {
- return;
- }
-
- if (runLength > 0) {
- WriteRun();
- }
- currentChar = -1;
- EndBlock();
- EndCompression();
- finished = true;
- Flush();
- }
-
- public override void Flush() {
- bsStream.Flush();
- }
-
- private int blockCRC, combinedCRC;
-
- private void Initialize() {
- bytesOut = 0;
- nBlocksRandomised = 0;
-
- /* Write `magic' bytes h indicating file-format == huffmanised,
- followed by a digit indicating blockSize100k.
- */
- BsPutUChar('h');
- BsPutUChar('0' + blockSize100k);
-
- combinedCRC = 0;
- }
-
- private int allowableBlockSize;
-
- private void InitBlock() {
- // blockNo++;
- mCrc.InitialiseCRC();
- last = -1;
- // ch = 0;
-
- for (int i = 0; i < 256; i++) {
- inUse[i] = false;
- }
-
- /* 20 is just a paranoia constant */
- allowableBlockSize = BZip2Constants.baseBlockSize * blockSize100k - 20;
- }
-
- private void EndBlock() {
- blockCRC = mCrc.GetFinalCRC();
- combinedCRC = (combinedCRC << 1) | (int)(((uint)combinedCRC) >> 31);
- combinedCRC ^= blockCRC;
-
- /* sort the block and establish posn of original string */
- DoReversibleTransformation();
-
- /*
- A 6-byte block header, the value chosen arbitrarily
- as 0x314159265359 :-). A 32 bit value does not really
- give a strong enough guarantee that the value will not
- appear by chance in the compressed datastream. Worst-case
- probability of this event, for a 900k block, is about
- 2.0e-3 for 32 bits, 1.0e-5 for 40 bits and 4.0e-8 for 48 bits.
- For a compressed file of size 100Gb -- about 100000 blocks --
- only a 48-bit marker will do. NB: normal compression/
- decompression do *not* rely on these statistical properties.
- They are only important when trying to recover blocks from
- damaged files.
- */
- BsPutUChar(0x31);
- BsPutUChar(0x41);
- BsPutUChar(0x59);
- BsPutUChar(0x26);
- BsPutUChar(0x53);
- BsPutUChar(0x59);
-
- /* Now the block's CRC, so it is in a known place. */
- BsPutint(blockCRC);
-
- /* Now a single bit indicating randomisation. */
- if (blockRandomised) {
- BsW(1, 1);
- nBlocksRandomised++;
- } else {
- BsW(1, 0);
- }
-
- /* Finally, block's contents proper. */
- MoveToFrontCodeAndSend();
- }
-
- private void EndCompression() {
- /*
- Now another magic 48-bit number, 0x177245385090, to
- indicate the end of the last block. (Sqrt(pi), if
- you want to know. I did want to use e, but it contains
- too much repetition -- 27 18 28 18 28 46 -- for me
- to feel statistically comfortable. Call me paranoid.)
- */
- BsPutUChar(0x17);
- BsPutUChar(0x72);
- BsPutUChar(0x45);
- BsPutUChar(0x38);
- BsPutUChar(0x50);
- BsPutUChar(0x90);
-
- BsPutint(combinedCRC);
-
- BsFinishedWithStream();
- }
-
- private void HbAssignCodes(int[] code, char[] length, int minLen,
- int maxLen, int alphaSize) {
- int n, vec, i;
-
- vec = 0;
- for (n = minLen; n <= maxLen; n++) {
- for (i = 0; i < alphaSize; i++) {
- if (length[i] == n) {
- code[i] = vec;
- vec++;
- }
- };
- vec <<= 1;
- }
- }
-
- private void BsSetStream(Stream f) {
- bsStream = f;
- bsLive = 0;
- bsBuff = 0;
- bytesOut = 0;
- }
-
- private void BsFinishedWithStream() {
- while (bsLive > 0) {
- int ch = (bsBuff >> 24);
- try {
- bsStream.WriteByte((byte)ch); // write 8-bit
- } catch (IOException e) {
- throw e;
- }
- bsBuff <<= 8;
- bsLive -= 8;
- bytesOut++;
- }
- }
-
- private void BsW(int n, int v) {
- while (bsLive >= 8) {
- int ch = (bsBuff >> 24);
- try {
- bsStream.WriteByte((byte)ch); // write 8-bit
- } catch (IOException e) {
- throw e;
- }
- bsBuff <<= 8;
- bsLive -= 8;
- bytesOut++;
- }
- bsBuff |= (v << (32 - bsLive - n));
- bsLive += n;
- }
-
- private void BsPutUChar(int c) {
- BsW(8, c);
- }
-
- private void BsPutint(int u) {
- BsW(8, (u >> 24) & 0xff);
- BsW(8, (u >> 16) & 0xff);
- BsW(8, (u >> 8) & 0xff);
- BsW(8, u & 0xff);
- }
-
- private void BsPutIntVS(int numBits, int c) {
- BsW(numBits, c);
- }
-
- private void SendMTFValues() {
- char[][] len = CBZip2InputStream.InitCharArray(BZip2Constants.N_GROUPS, BZip2Constants.MAX_ALPHA_SIZE);
-
- int v, t, i, j, gs, ge, totc, bt, bc, iter;
- int nSelectors = 0, alphaSize, minLen, maxLen, selCtr;
- int nGroups;
-
- alphaSize = nInUse + 2;
- for (t = 0; t < BZip2Constants.N_GROUPS; t++) {
- for (v = 0; v < alphaSize; v++) {
- len[t][v] = (char) GREATER_ICOST;
- }
- }
-
- /* Decide how many coding tables to use */
- if (nMTF <= 0) {
- Panic();
- }
-
- if (nMTF < 200) {
- nGroups = 2;
- } else if (nMTF < 600) {
- nGroups = 3;
- } else if (nMTF < 1200) {
- nGroups = 4;
- } else if (nMTF < 2400) {
- nGroups = 5;
- } else {
- nGroups = 6;
- }
-
- /* Generate an initial set of coding tables */ {
- int nPart, remF, tFreq, aFreq;
-
- nPart = nGroups;
- remF = nMTF;
- gs = 0;
- while (nPart > 0) {
- tFreq = remF / nPart;
- ge = gs - 1;
- aFreq = 0;
- while (aFreq < tFreq && ge < alphaSize - 1) {
- ge++;
- aFreq += mtfFreq[ge];
- }
-
- if (ge > gs && nPart != nGroups && nPart != 1
- && ((nGroups - nPart) % 2 == 1)) {
- aFreq -= mtfFreq[ge];
- ge--;
- }
-
- for (v = 0; v < alphaSize; v++) {
- if (v >= gs && v <= ge) {
- len[nPart - 1][v] = (char) LESSER_ICOST;
- } else {
- len[nPart - 1][v] = (char) GREATER_ICOST;
- }
- }
-
- nPart--;
- gs = ge + 1;
- remF -= aFreq;
- }
- }
-
- int[][] rfreq = CBZip2InputStream.InitIntArray(BZip2Constants.N_GROUPS, BZip2Constants.MAX_ALPHA_SIZE);
- int[] fave = new int[BZip2Constants.N_GROUPS];
- short[] cost = new short[BZip2Constants.N_GROUPS];
- /*
- Iterate up to N_ITERS times to improve the tables.
- */
- for (iter = 0; iter < BZip2Constants.N_ITERS; iter++) {
- for (t = 0; t < nGroups; t++) {
- fave[t] = 0;
- }
-
- for (t = 0; t < nGroups; t++) {
- for (v = 0; v < alphaSize; v++) {
- rfreq[t][v] = 0;
- }
- }
-
- nSelectors = 0;
- totc = 0;
- gs = 0;
- while (true) {
-
- /* Set group start & end marks. */
- if (gs >= nMTF) {
- break;
- }
- ge = gs + BZip2Constants.G_SIZE - 1;
- if (ge >= nMTF) {
- ge = nMTF - 1;
- }
-
- /*
- Calculate the cost of this group as coded
- by each of the coding tables.
- */
- for (t = 0; t < nGroups; t++) {
- cost[t] = 0;
- }
-
- if (nGroups == 6) {
- short cost0, cost1, cost2, cost3, cost4, cost5;
- cost0 = cost1 = cost2 = cost3 = cost4 = cost5 = 0;
- for (i = gs; i <= ge; i++) {
- short icv = szptr[i];
- cost0 += (short)len[0][icv];
- cost1 += (short)len[1][icv];
- cost2 += (short)len[2][icv];
- cost3 += (short)len[3][icv];
- cost4 += (short)len[4][icv];
- cost5 += (short)len[5][icv];
- }
- cost[0] = cost0;
- cost[1] = cost1;
- cost[2] = cost2;
- cost[3] = cost3;
- cost[4] = cost4;
- cost[5] = cost5;
- } else {
- for (i = gs; i <= ge; i++) {
- short icv = szptr[i];
- for (t = 0; t < nGroups; t++) {
- cost[t] += (short)len[t][icv];
- }
- }
- }
-
- /*
- Find the coding table which is best for this group,
- and record its identity in the selector table.
- */
- bc = 999999999;
- bt = -1;
- for (t = 0; t < nGroups; t++) {
- if (cost[t] < bc) {
- bc = cost[t];
- bt = t;
- }
- };
- totc += bc;
- fave[bt]++;
- selector[nSelectors] = (char) bt;
- nSelectors++;
-
- /*
- Increment the symbol frequencies for the selected table.
- */
- for (i = gs; i <= ge; i++) {
- rfreq[bt][szptr[i]]++;
- }
-
- gs = ge + 1;
- }
-
- /*
- Recompute the tables based on the accumulated frequencies.
- */
- for (t = 0; t < nGroups; t++) {
- HbMakeCodeLengths(len[t], rfreq[t], alphaSize, 20);
- }
- }
-
- rfreq = null;
- fave = null;
- cost = null;
-
- if (!(nGroups < 8)) {
- Panic();
- }
- if (!(nSelectors < 32768 && nSelectors <= (2 + (900000 / BZip2Constants.G_SIZE)))) {
- Panic();
- }
-
-
- /* Compute MTF values for the selectors. */
- {
- char[] pos = new char[BZip2Constants.N_GROUPS];
- char ll_i, tmp2, tmp;
- for (i = 0; i < nGroups; i++) {
- pos[i] = (char) i;
- }
- for (i = 0; i < nSelectors; i++) {
- ll_i = selector[i];
- j = 0;
- tmp = pos[j];
- while (ll_i != tmp) {
- j++;
- tmp2 = tmp;
- tmp = pos[j];
- pos[j] = tmp2;
- }
- pos[0] = tmp;
- selectorMtf[i] = (char) j;
- }
- }
-
- int[][] code = CBZip2InputStream.InitIntArray(BZip2Constants.N_GROUPS, BZip2Constants.MAX_ALPHA_SIZE);
-
- /* Assign actual codes for the tables. */
- for (t = 0; t < nGroups; t++) {
- minLen = 32;
- maxLen = 0;
- for (i = 0; i < alphaSize; i++) {
- if (len[t][i] > maxLen) {
- maxLen = len[t][i];
- }
- if (len[t][i] < minLen) {
- minLen = len[t][i];
- }
- }
- if (maxLen > 20) {
- Panic();
- }
- if (minLen < 1) {
- Panic();
- }
- HbAssignCodes(code[t], len[t], minLen, maxLen, alphaSize);
- }
-
- /* Transmit the mapping table. */
- {
- bool[] inUse16 = new bool[16];
- for (i = 0; i < 16; i++) {
- inUse16[i] = false;
- for (j = 0; j < 16; j++) {
- if (inUse[i * 16 + j]) {
- inUse16[i] = true;
- }
- }
- }
-
- for (i = 0; i < 16; i++) {
- if (inUse16[i]) {
- BsW(1, 1);
- } else {
- BsW(1, 0);
- }
- }
-
- for (i = 0; i < 16; i++) {
- if (inUse16[i]) {
- for (j = 0; j < 16; j++) {
- if (inUse[i * 16 + j]) {
- BsW(1, 1);
- } else {
- BsW(1, 0);
- }
- }
- }
- }
-
- }
-
- /* Now the selectors. */
- BsW(3, nGroups);
- BsW(15, nSelectors);
- for (i = 0; i < nSelectors; i++) {
- for (j = 0; j < selectorMtf[i]; j++) {
- BsW(1, 1);
- }
- BsW(1, 0);
- }
-
- /* Now the coding tables. */
- for (t = 0; t < nGroups; t++) {
- int curr = len[t][0];
- BsW(5, curr);
- for (i = 0; i < alphaSize; i++) {
- while (curr < len[t][i]) {
- BsW(2, 2);
- curr++; /* 10 */
- }
- while (curr > len[t][i]) {
- BsW(2, 3);
- curr--; /* 11 */
- }
- BsW(1, 0);
- }
- }
-
- /* And finally, the block data proper */
- selCtr = 0;
- gs = 0;
- while (true) {
- if (gs >= nMTF) {
- break;
- }
- ge = gs + BZip2Constants.G_SIZE - 1;
- if (ge >= nMTF) {
- ge = nMTF - 1;
- }
- for (i = gs; i <= ge; i++) {
- BsW(len[selector[selCtr]][szptr[i]],
- code[selector[selCtr]][szptr[i]]);
- }
-
- gs = ge + 1;
- selCtr++;
- }
- if (!(selCtr == nSelectors)) {
- Panic();
- }
- }
-
- private void MoveToFrontCodeAndSend() {
- BsPutIntVS(24, origPtr);
- GenerateMTFValues();
- SendMTFValues();
- }
-
- private Stream bsStream;
-
- private void SimpleSort(int lo, int hi, int d) {
- int i, j, h, bigN, hp;
- int v;
-
- bigN = hi - lo + 1;
- if (bigN < 2) {
- return;
- }
-
- hp = 0;
- while (incs[hp] < bigN) {
- hp++;
- }
- hp--;
-
- for (; hp >= 0; hp--) {
- h = incs[hp];
-
- i = lo + h;
- while (true) {
- /* copy 1 */
- if (i > hi) {
- break;
- }
- v = zptr[i];
- j = i;
- while (FullGtU(zptr[j - h] + d, v + d)) {
- zptr[j] = zptr[j - h];
- j = j - h;
- if (j <= (lo + h - 1)) {
- break;
- }
- }
- zptr[j] = v;
- i++;
-
- /* copy 2 */
- if (i > hi) {
- break;
- }
- v = zptr[i];
- j = i;
- while (FullGtU(zptr[j - h] + d, v + d)) {
- zptr[j] = zptr[j - h];
- j = j - h;
- if (j <= (lo + h - 1)) {
- break;
- }
- }
- zptr[j] = v;
- i++;
-
- /* copy 3 */
- if (i > hi) {
- break;
- }
- v = zptr[i];
- j = i;
- while (FullGtU(zptr[j - h] + d, v + d)) {
- zptr[j] = zptr[j - h];
- j = j - h;
- if (j <= (lo + h - 1)) {
- break;
- }
- }
- zptr[j] = v;
- i++;
-
- if (workDone > workLimit && firstAttempt) {
- return;
- }
- }
- }
- }
-
- private void Vswap(int p1, int p2, int n) {
- int temp = 0;
- while (n > 0) {
- temp = zptr[p1];
- zptr[p1] = zptr[p2];
- zptr[p2] = temp;
- p1++;
- p2++;
- n--;
- }
- }
-
- private char Med3(char a, char b, char c) {
- char t;
- if (a > b) {
- t = a;
- a = b;
- b = t;
- }
- if (b > c) {
- t = b;
- b = c;
- c = t;
- }
- if (a > b) {
- b = a;
- }
- return b;
- }
-
- internal class StackElem {
- internal int ll;
- internal int hh;
- internal int dd;
- }
-
- private void QSort3(int loSt, int hiSt, int dSt) {
- int unLo, unHi, ltLo, gtHi, med, n, m;
- int sp, lo, hi, d;
- StackElem[] stack = new StackElem[QSORT_STACK_SIZE];
- for (int count = 0; count < QSORT_STACK_SIZE; count++) {
- stack[count] = new StackElem();
- }
-
- sp = 0;
-
- stack[sp].ll = loSt;
- stack[sp].hh = hiSt;
- stack[sp].dd = dSt;
- sp++;
-
- while (sp > 0) {
- if (sp >= QSORT_STACK_SIZE) {
- Panic();
- }
-
- sp--;
- lo = stack[sp].ll;
- hi = stack[sp].hh;
- d = stack[sp].dd;
-
- if (hi - lo < SMALL_THRESH || d > DEPTH_THRESH) {
- SimpleSort(lo, hi, d);
- if (workDone > workLimit && firstAttempt) {
- return;
- }
- continue;
- }
-
- med = Med3(block[zptr[lo] + d + 1],
- block[zptr[hi ] + d + 1],
- block[zptr[(lo + hi) >> 1] + d + 1]);
-
- unLo = ltLo = lo;
- unHi = gtHi = hi;
-
- while (true) {
- while (true) {
- if (unLo > unHi) {
- break;
- }
- n = ((int) block[zptr[unLo] + d + 1]) - med;
- if (n == 0) {
- int temp = 0;
- temp = zptr[unLo];
- zptr[unLo] = zptr[ltLo];
- zptr[ltLo] = temp;
- ltLo++;
- unLo++;
- continue;
- };
- if (n > 0) {
- break;
- }
- unLo++;
- }
- while (true) {
- if (unLo > unHi) {
- break;
- }
- n = ((int) block[zptr[unHi] + d + 1]) - med;
- if (n == 0) {
- int temp = 0;
- temp = zptr[unHi];
- zptr[unHi] = zptr[gtHi];
- zptr[gtHi] = temp;
- gtHi--;
- unHi--;
- continue;
- };
- if (n < 0) {
- break;
- }
- unHi--;
- }
- if (unLo > unHi) {
- break;
- }
- int tempx = zptr[unLo];
- zptr[unLo] = zptr[unHi];
- zptr[unHi] = tempx;
- unLo++;
- unHi--;
- }
-
- if (gtHi < ltLo) {
- stack[sp].ll = lo;
- stack[sp].hh = hi;
- stack[sp].dd = d + 1;
- sp++;
- continue;
- }
-
- n = ((ltLo - lo) < (unLo - ltLo)) ? (ltLo - lo) : (unLo - ltLo);
- Vswap(lo, unLo - n, n);
- m = ((hi - gtHi) < (gtHi - unHi)) ? (hi - gtHi) : (gtHi - unHi);
- Vswap(unLo, hi - m + 1, m);
-
- n = lo + unLo - ltLo - 1;
- m = hi - (gtHi - unHi) + 1;
-
- stack[sp].ll = lo;
- stack[sp].hh = n;
- stack[sp].dd = d;
- sp++;
-
- stack[sp].ll = n + 1;
- stack[sp].hh = m - 1;
- stack[sp].dd = d + 1;
- sp++;
-
- stack[sp].ll = m;
- stack[sp].hh = hi;
- stack[sp].dd = d;
- sp++;
- }
- }
-
- private void MainSort() {
- int i, j, ss, sb;
- int[] runningOrder = new int[256];
- int[] copy = new int[256];
- bool[] bigDone = new bool[256];
- int c1, c2;
- int numQSorted;
-
- /*
- In the various block-sized structures, live data runs
- from 0 to last+NUM_OVERSHOOT_BYTES inclusive. First,
- set up the overshoot area for block.
- */
-
- // if (verbosity >= 4) fprintf ( stderr, " sort initialise ...\n" );
- for (i = 0; i < BZip2Constants.NUM_OVERSHOOT_BYTES; i++) {
- block[last + i + 2] = block[(i % (last + 1)) + 1];
- }
- for (i = 0; i <= last + BZip2Constants.NUM_OVERSHOOT_BYTES; i++) {
- quadrant[i] = 0;
- }
-
- block[0] = (char) (block[last + 1]);
-
- if (last < 4000) {
- /*
- Use SimpleSort(), since the full sorting mechanism
- has quite a large constant overhead.
- */
- for (i = 0; i <= last; i++) {
- zptr[i] = i;
- }
- firstAttempt = false;
- workDone = workLimit = 0;
- SimpleSort(0, last, 0);
- } else {
- numQSorted = 0;
- for (i = 0; i <= 255; i++) {
- bigDone[i] = false;
- }
-
- for (i = 0; i <= 65536; i++) {
- ftab[i] = 0;
- }
-
- c1 = block[0];
- for (i = 0; i <= last; i++) {
- c2 = block[i + 1];
- ftab[(c1 << 8) + c2]++;
- c1 = c2;
- }
-
- for (i = 1; i <= 65536; i++) {
- ftab[i] += ftab[i - 1];
- }
-
- c1 = block[1];
- for (i = 0; i < last; i++) {
- c2 = block[i + 2];
- j = (c1 << 8) + c2;
- c1 = c2;
- ftab[j]--;
- zptr[ftab[j]] = i;
- }
-
- j = ((block[last + 1]) << 8) + (block[1]);
- ftab[j]--;
- zptr[ftab[j]] = last;
-
- /*
- Now ftab contains the first loc of every small bucket.
- Calculate the running order, from smallest to largest
- big bucket.
- */
-
- for (i = 0; i <= 255; i++) {
- runningOrder[i] = i;
- }
-
- {
- int vv;
- int h = 1;
- do {
- h = 3 * h + 1;
- }
- while (h <= 256);
- do {
- h = h / 3;
- for (i = h; i <= 255; i++) {
- vv = runningOrder[i];
- j = i;
- while ((ftab[((runningOrder[j - h]) + 1) << 8]
- - ftab[(runningOrder[j - h]) << 8]) >
- (ftab[((vv) + 1) << 8] - ftab[(vv) << 8])) {
- runningOrder[j] = runningOrder[j - h];
- j = j - h;
- if (j <= (h - 1)) {
- break;
- }
- }
- runningOrder[j] = vv;
- }
- } while (h != 1);
- }
-
- /*
- The main sorting loop.
- */
- for (i = 0; i <= 255; i++) {
-
- /*
- Process big buckets, starting with the least full.
- */
- ss = runningOrder[i];
-
- /*
- Complete the big bucket [ss] by quicksorting
- any unsorted small buckets [ss, j]. Hopefully
- previous pointer-scanning phases have already
- completed many of the small buckets [ss, j], so
- we don't have to sort them at all.
- */
- for (j = 0; j <= 255; j++) {
- sb = (ss << 8) + j;
- if (!((ftab[sb] & SETMASK) == SETMASK)) {
- int lo = ftab[sb] & CLEARMASK;
- int hi = (ftab[sb + 1] & CLEARMASK) - 1;
- if (hi > lo) {
- QSort3(lo, hi, 2);
- numQSorted += (hi - lo + 1);
- if (workDone > workLimit && firstAttempt) {
- return;
- }
- }
- ftab[sb] |= SETMASK;
- }
- }
-
- /*
- The ss big bucket is now done. Record this fact,
- and update the quadrant descriptors. Remember to
- update quadrants in the overshoot area too, if
- necessary. The "if (i < 255)" test merely skips
- this updating for the last bucket processed, since
- updating for the last bucket is pointless.
- */
- bigDone[ss] = true;
-
- if (i < 255) {
- int bbStart = ftab[ss << 8] & CLEARMASK;
- int bbSize = (ftab[(ss + 1) << 8] & CLEARMASK) - bbStart;
- int shifts = 0;
-
- while ((bbSize >> shifts) > 65534) {
- shifts++;
- }
-
- for (j = 0; j < bbSize; j++) {
- int a2update = zptr[bbStart + j];
- int qVal = (j >> shifts);
- quadrant[a2update] = qVal;
- if (a2update < BZip2Constants.NUM_OVERSHOOT_BYTES) {
- quadrant[a2update + last + 1] = qVal;
- }
- }
-
- if (!(((bbSize - 1) >> shifts) <= 65535)) {
- Panic();
- }
- }
-
- /*
- Now scan this big bucket so as to synthesise the
- sorted order for small buckets [t, ss] for all t != ss.
- */
- for (j = 0; j <= 255; j++) {
- copy[j] = ftab[(j << 8) + ss] & CLEARMASK;
- }
-
- for (j = ftab[ss << 8] & CLEARMASK;
- j < (ftab[(ss + 1) << 8] & CLEARMASK); j++) {
- c1 = block[zptr[j]];
- if (!bigDone[c1]) {
- zptr[copy[c1]] = zptr[j] == 0 ? last : zptr[j] - 1;
- copy[c1]++;
- }
- }
-
- for (j = 0; j <= 255; j++) {
- ftab[(j << 8) + ss] |= SETMASK;
- }
- }
- }
- }
-
- private void RandomiseBlock() {
- int i;
- int rNToGo = 0;
- int rTPos = 0;
- for (i = 0; i < 256; i++) {
- inUse[i] = false;
- }
-
- for (i = 0; i <= last; i++) {
- if (rNToGo == 0) {
- rNToGo = (char) BZip2Constants.rNums[rTPos];
- rTPos++;
- if (rTPos == 512) {
- rTPos = 0;
- }
- }
- rNToGo--;
- block[i + 1] ^= (char)((rNToGo == 1) ? 1 : 0);
- // handle 16 bit signed numbers
- block[i + 1] &= (char)0xFF;
-
- inUse[block[i + 1]] = true;
- }
- }
-
- private void DoReversibleTransformation() {
- int i;
-
- workLimit = workFactor * last;
- workDone = 0;
- blockRandomised = false;
- firstAttempt = true;
-
- MainSort();
-
- if (workDone > workLimit && firstAttempt) {
- RandomiseBlock();
- workLimit = workDone = 0;
- blockRandomised = true;
- firstAttempt = false;
- MainSort();
- }
-
- origPtr = -1;
- for (i = 0; i <= last; i++) {
- if (zptr[i] == 0) {
- origPtr = i;
- break;
- }
- };
-
- if (origPtr == -1) {
- Panic();
- }
- }
-
- private bool FullGtU(int i1, int i2) {
- int k;
- char c1, c2;
- int s1, s2;
-
- c1 = block[i1 + 1];
- c2 = block[i2 + 1];
- if (c1 != c2) {
- return (c1 > c2);
- }
- i1++;
- i2++;
-
- c1 = block[i1 + 1];
- c2 = block[i2 + 1];
- if (c1 != c2) {
- return (c1 > c2);
- }
- i1++;
- i2++;
-
- c1 = block[i1 + 1];
- c2 = block[i2 + 1];
- if (c1 != c2) {
- return (c1 > c2);
- }
- i1++;
- i2++;
-
- c1 = block[i1 + 1];
- c2 = block[i2 + 1];
- if (c1 != c2) {
- return (c1 > c2);
- }
- i1++;
- i2++;
-
- c1 = block[i1 + 1];
- c2 = block[i2 + 1];
- if (c1 != c2) {
- return (c1 > c2);
- }
- i1++;
- i2++;
-
- c1 = block[i1 + 1];
- c2 = block[i2 + 1];
- if (c1 != c2) {
- return (c1 > c2);
- }
- i1++;
- i2++;
-
- k = last + 1;
-
- do {
- c1 = block[i1 + 1];
- c2 = block[i2 + 1];
- if (c1 != c2) {
- return (c1 > c2);
- }
- s1 = quadrant[i1];
- s2 = quadrant[i2];
- if (s1 != s2) {
- return (s1 > s2);
- }
- i1++;
- i2++;
-
- c1 = block[i1 + 1];
- c2 = block[i2 + 1];
- if (c1 != c2) {
- return (c1 > c2);
- }
- s1 = quadrant[i1];
- s2 = quadrant[i2];
- if (s1 != s2) {
- return (s1 > s2);
- }
- i1++;
- i2++;
-
- c1 = block[i1 + 1];
- c2 = block[i2 + 1];
- if (c1 != c2) {
- return (c1 > c2);
- }
- s1 = quadrant[i1];
- s2 = quadrant[i2];
- if (s1 != s2) {
- return (s1 > s2);
- }
- i1++;
- i2++;
-
- c1 = block[i1 + 1];
- c2 = block[i2 + 1];
- if (c1 != c2) {
- return (c1 > c2);
- }
- s1 = quadrant[i1];
- s2 = quadrant[i2];
- if (s1 != s2) {
- return (s1 > s2);
- }
- i1++;
- i2++;
-
- if (i1 > last) {
- i1 -= last;
- i1--;
- };
- if (i2 > last) {
- i2 -= last;
- i2--;
- };
-
- k -= 4;
- workDone++;
- } while (k >= 0);
-
- return false;
- }
-
- /*
- Knuth's increments seem to work better
- than Incerpi-Sedgewick here. Possibly
- because the number of elems to sort is
- usually small, typically <= 20.
- */
- private int[] incs = { 1, 4, 13, 40, 121, 364, 1093, 3280,
- 9841, 29524, 88573, 265720,
- 797161, 2391484 };
-
- private void AllocateCompressStructures() {
- int n = BZip2Constants.baseBlockSize * blockSize100k;
- block = new char[(n + 1 + BZip2Constants.NUM_OVERSHOOT_BYTES)];
- quadrant = new int[(n + BZip2Constants.NUM_OVERSHOOT_BYTES)];
- zptr = new int[n];
- ftab = new int[65537];
-
- if (block == null || quadrant == null || zptr == null
- || ftab == null) {
- //int totalDraw = (n + 1 + NUM_OVERSHOOT_BYTES) + (n + NUM_OVERSHOOT_BYTES) + n + 65537;
- //compressOutOfMemory ( totalDraw, n );
- }
-
- /*
- The back end needs a place to store the MTF values
- whilst it calculates the coding tables. We could
- put them in the zptr array. However, these values
- will fit in a short, so we overlay szptr at the
- start of zptr, in the hope of reducing the number
- of cache misses induced by the multiple traversals
- of the MTF values when calculating coding tables.
- Seems to improve compression speed by about 1%.
- */
- // szptr = zptr;
-
-
- szptr = new short[2 * n];
- }
-
- private void GenerateMTFValues() {
- char[] yy = new char[256];
- int i, j;
- char tmp;
- char tmp2;
- int zPend;
- int wr;
- int EOB;
-
- MakeMaps();
- EOB = nInUse + 1;
-
- for (i = 0; i <= EOB; i++) {
- mtfFreq[i] = 0;
- }
-
- wr = 0;
- zPend = 0;
- for (i = 0; i < nInUse; i++) {
- yy[i] = (char) i;
- }
-
-
- for (i = 0; i <= last; i++) {
- char ll_i;
-
- ll_i = unseqToSeq[block[zptr[i]]];
-
- j = 0;
- tmp = yy[j];
- while (ll_i != tmp) {
- j++;
- tmp2 = tmp;
- tmp = yy[j];
- yy[j] = tmp2;
- };
- yy[0] = tmp;
-
- if (j == 0) {
- zPend++;
- } else {
- if (zPend > 0) {
- zPend--;
- while (true) {
- switch (zPend % 2) {
- case 0:
- szptr[wr] = (short) BZip2Constants.RUNA;
- wr++;
- mtfFreq[BZip2Constants.RUNA]++;
- break;
- case 1:
- szptr[wr] = (short) BZip2Constants.RUNB;
- wr++;
- mtfFreq[BZip2Constants.RUNB]++;
- break;
- };
- if (zPend < 2) {
- break;
- }
- zPend = (zPend - 2) / 2;
- };
- zPend = 0;
- }
- szptr[wr] = (short) (j + 1);
- wr++;
- mtfFreq[j + 1]++;
- }
- }
-
- if (zPend > 0) {
- zPend--;
- while (true) {
- switch (zPend % 2) {
- case 0:
- szptr[wr] = (short) BZip2Constants.RUNA;
- wr++;
- mtfFreq[BZip2Constants.RUNA]++;
- break;
- case 1:
- szptr[wr] = (short) BZip2Constants.RUNB;
- wr++;
- mtfFreq[BZip2Constants.RUNB]++;
- break;
- }
- if (zPend < 2) {
- break;
- }
- zPend = (zPend - 2) / 2;
- }
- }
-
- szptr[wr] = (short) EOB;
- wr++;
- mtfFreq[EOB]++;
-
- nMTF = wr;
- }
-
- public override int Read(byte[] buffer, int offset, int count) {
- return 0;
- }
-
- public override long Seek(long offset, SeekOrigin origin) {
- return 0;
- }
-
- public override void SetLength(long value) {
- }
-
- public override void Write(byte[] buffer, int offset, int count) {
- for (int k = 0; k < count; ++k) {
- WriteByte(buffer[k + offset]);
- }
- }
-
- public override bool CanRead {
- get {
- return false;
- }
- }
-
- public override bool CanSeek {
- get {
- return false;
- }
- }
-
- public override bool CanWrite {
- get {
- return true;
- }
- }
-
- public override long Length {
- get {
- return 0;
- }
- }
-
- public override long Position {
- get {
- return 0;
- }
- set {
- }
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/bzip2/src/CRC.cs b/BCCrypto/bzip2/src/CRC.cs
deleted file mode 100644
index 278a9f3..0000000
--- a/BCCrypto/bzip2/src/CRC.cs
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-/*
- * This package is based on the work done by Keiron Liddle), Aftex Software
- * to whom the Ant project is very grateful for his
- * great code.
- */
-
-using System;
-
-namespace Org.BouncyCastle.Apache.Bzip2
-{
- /**
- * A simple class the hold and calculate the CRC for sanity checking
- * of the data.
- *
- * @author Keiron Liddle
- */
- internal class CRC
- {
- public static readonly int[] crc32Table = {
- unchecked((int)0x00000000), unchecked((int)0x04c11db7), unchecked((int)0x09823b6e), unchecked((int)0x0d4326d9),
- unchecked((int)0x130476dc), unchecked((int)0x17c56b6b), unchecked((int)0x1a864db2), unchecked((int)0x1e475005),
- unchecked((int)0x2608edb8), unchecked((int)0x22c9f00f), unchecked((int)0x2f8ad6d6), unchecked((int)0x2b4bcb61),
- unchecked((int)0x350c9b64), unchecked((int)0x31cd86d3), unchecked((int)0x3c8ea00a), unchecked((int)0x384fbdbd),
- unchecked((int)0x4c11db70), unchecked((int)0x48d0c6c7), unchecked((int)0x4593e01e), unchecked((int)0x4152fda9),
- unchecked((int)0x5f15adac), unchecked((int)0x5bd4b01b), unchecked((int)0x569796c2), unchecked((int)0x52568b75),
- unchecked((int)0x6a1936c8), unchecked((int)0x6ed82b7f), unchecked((int)0x639b0da6), unchecked((int)0x675a1011),
- unchecked((int)0x791d4014), unchecked((int)0x7ddc5da3), unchecked((int)0x709f7b7a), unchecked((int)0x745e66cd),
- unchecked((int)0x9823b6e0), unchecked((int)0x9ce2ab57), unchecked((int)0x91a18d8e), unchecked((int)0x95609039),
- unchecked((int)0x8b27c03c), unchecked((int)0x8fe6dd8b), unchecked((int)0x82a5fb52), unchecked((int)0x8664e6e5),
- unchecked((int)0xbe2b5b58), unchecked((int)0xbaea46ef), unchecked((int)0xb7a96036), unchecked((int)0xb3687d81),
- unchecked((int)0xad2f2d84), unchecked((int)0xa9ee3033), unchecked((int)0xa4ad16ea), unchecked((int)0xa06c0b5d),
- unchecked((int)0xd4326d90), unchecked((int)0xd0f37027), unchecked((int)0xddb056fe), unchecked((int)0xd9714b49),
- unchecked((int)0xc7361b4c), unchecked((int)0xc3f706fb), unchecked((int)0xceb42022), unchecked((int)0xca753d95),
- unchecked((int)0xf23a8028), unchecked((int)0xf6fb9d9f), unchecked((int)0xfbb8bb46), unchecked((int)0xff79a6f1),
- unchecked((int)0xe13ef6f4), unchecked((int)0xe5ffeb43), unchecked((int)0xe8bccd9a), unchecked((int)0xec7dd02d),
- unchecked((int)0x34867077), unchecked((int)0x30476dc0), unchecked((int)0x3d044b19), unchecked((int)0x39c556ae),
- unchecked((int)0x278206ab), unchecked((int)0x23431b1c), unchecked((int)0x2e003dc5), unchecked((int)0x2ac12072),
- unchecked((int)0x128e9dcf), unchecked((int)0x164f8078), unchecked((int)0x1b0ca6a1), unchecked((int)0x1fcdbb16),
- unchecked((int)0x018aeb13), unchecked((int)0x054bf6a4), unchecked((int)0x0808d07d), unchecked((int)0x0cc9cdca),
- unchecked((int)0x7897ab07), unchecked((int)0x7c56b6b0), unchecked((int)0x71159069), unchecked((int)0x75d48dde),
- unchecked((int)0x6b93dddb), unchecked((int)0x6f52c06c), unchecked((int)0x6211e6b5), unchecked((int)0x66d0fb02),
- unchecked((int)0x5e9f46bf), unchecked((int)0x5a5e5b08), unchecked((int)0x571d7dd1), unchecked((int)0x53dc6066),
- unchecked((int)0x4d9b3063), unchecked((int)0x495a2dd4), unchecked((int)0x44190b0d), unchecked((int)0x40d816ba),
- unchecked((int)0xaca5c697), unchecked((int)0xa864db20), unchecked((int)0xa527fdf9), unchecked((int)0xa1e6e04e),
- unchecked((int)0xbfa1b04b), unchecked((int)0xbb60adfc), unchecked((int)0xb6238b25), unchecked((int)0xb2e29692),
- unchecked((int)0x8aad2b2f), unchecked((int)0x8e6c3698), unchecked((int)0x832f1041), unchecked((int)0x87ee0df6),
- unchecked((int)0x99a95df3), unchecked((int)0x9d684044), unchecked((int)0x902b669d), unchecked((int)0x94ea7b2a),
- unchecked((int)0xe0b41de7), unchecked((int)0xe4750050), unchecked((int)0xe9362689), unchecked((int)0xedf73b3e),
- unchecked((int)0xf3b06b3b), unchecked((int)0xf771768c), unchecked((int)0xfa325055), unchecked((int)0xfef34de2),
- unchecked((int)0xc6bcf05f), unchecked((int)0xc27dede8), unchecked((int)0xcf3ecb31), unchecked((int)0xcbffd686),
- unchecked((int)0xd5b88683), unchecked((int)0xd1799b34), unchecked((int)0xdc3abded), unchecked((int)0xd8fba05a),
- unchecked((int)0x690ce0ee), unchecked((int)0x6dcdfd59), unchecked((int)0x608edb80), unchecked((int)0x644fc637),
- unchecked((int)0x7a089632), unchecked((int)0x7ec98b85), unchecked((int)0x738aad5c), unchecked((int)0x774bb0eb),
- unchecked((int)0x4f040d56), unchecked((int)0x4bc510e1), unchecked((int)0x46863638), unchecked((int)0x42472b8f),
- unchecked((int)0x5c007b8a), unchecked((int)0x58c1663d), unchecked((int)0x558240e4), unchecked((int)0x51435d53),
- unchecked((int)0x251d3b9e), unchecked((int)0x21dc2629), unchecked((int)0x2c9f00f0), unchecked((int)0x285e1d47),
- unchecked((int)0x36194d42), unchecked((int)0x32d850f5), unchecked((int)0x3f9b762c), unchecked((int)0x3b5a6b9b),
- unchecked((int)0x0315d626), unchecked((int)0x07d4cb91), unchecked((int)0x0a97ed48), unchecked((int)0x0e56f0ff),
- unchecked((int)0x1011a0fa), unchecked((int)0x14d0bd4d), unchecked((int)0x19939b94), unchecked((int)0x1d528623),
- unchecked((int)0xf12f560e), unchecked((int)0xf5ee4bb9), unchecked((int)0xf8ad6d60), unchecked((int)0xfc6c70d7),
- unchecked((int)0xe22b20d2), unchecked((int)0xe6ea3d65), unchecked((int)0xeba91bbc), unchecked((int)0xef68060b),
- unchecked((int)0xd727bbb6), unchecked((int)0xd3e6a601), unchecked((int)0xdea580d8), unchecked((int)0xda649d6f),
- unchecked((int)0xc423cd6a), unchecked((int)0xc0e2d0dd), unchecked((int)0xcda1f604), unchecked((int)0xc960ebb3),
- unchecked((int)0xbd3e8d7e), unchecked((int)0xb9ff90c9), unchecked((int)0xb4bcb610), unchecked((int)0xb07daba7),
- unchecked((int)0xae3afba2), unchecked((int)0xaafbe615), unchecked((int)0xa7b8c0cc), unchecked((int)0xa379dd7b),
- unchecked((int)0x9b3660c6), unchecked((int)0x9ff77d71), unchecked((int)0x92b45ba8), unchecked((int)0x9675461f),
- unchecked((int)0x8832161a), unchecked((int)0x8cf30bad), unchecked((int)0x81b02d74), unchecked((int)0x857130c3),
- unchecked((int)0x5d8a9099), unchecked((int)0x594b8d2e), unchecked((int)0x5408abf7), unchecked((int)0x50c9b640),
- unchecked((int)0x4e8ee645), unchecked((int)0x4a4ffbf2), unchecked((int)0x470cdd2b), unchecked((int)0x43cdc09c),
- unchecked((int)0x7b827d21), unchecked((int)0x7f436096), unchecked((int)0x7200464f), unchecked((int)0x76c15bf8),
- unchecked((int)0x68860bfd), unchecked((int)0x6c47164a), unchecked((int)0x61043093), unchecked((int)0x65c52d24),
- unchecked((int)0x119b4be9), unchecked((int)0x155a565e), unchecked((int)0x18197087), unchecked((int)0x1cd86d30),
- unchecked((int)0x029f3d35), unchecked((int)0x065e2082), unchecked((int)0x0b1d065b), unchecked((int)0x0fdc1bec),
- unchecked((int)0x3793a651), unchecked((int)0x3352bbe6), unchecked((int)0x3e119d3f), unchecked((int)0x3ad08088),
- unchecked((int)0x2497d08d), unchecked((int)0x2056cd3a), unchecked((int)0x2d15ebe3), unchecked((int)0x29d4f654),
- unchecked((int)0xc5a92679), unchecked((int)0xc1683bce), unchecked((int)0xcc2b1d17), unchecked((int)0xc8ea00a0),
- unchecked((int)0xd6ad50a5), unchecked((int)0xd26c4d12), unchecked((int)0xdf2f6bcb), unchecked((int)0xdbee767c),
- unchecked((int)0xe3a1cbc1), unchecked((int)0xe760d676), unchecked((int)0xea23f0af), unchecked((int)0xeee2ed18),
- unchecked((int)0xf0a5bd1d), unchecked((int)0xf464a0aa), unchecked((int)0xf9278673), unchecked((int)0xfde69bc4),
- unchecked((int)0x89b8fd09), unchecked((int)0x8d79e0be), unchecked((int)0x803ac667), unchecked((int)0x84fbdbd0),
- unchecked((int)0x9abc8bd5), unchecked((int)0x9e7d9662), unchecked((int)0x933eb0bb), unchecked((int)0x97ffad0c),
- unchecked((int)0xafb010b1), unchecked((int)0xab710d06), unchecked((int)0xa6322bdf), unchecked((int)0xa2f33668),
- unchecked((int)0xbcb4666d), unchecked((int)0xb8757bda), unchecked((int)0xb5365d03), unchecked((int)0xb1f740b4)
- };
-
- public CRC() {
- InitialiseCRC();
- }
-
- internal void InitialiseCRC() {
- globalCrc = unchecked((int)0xffffffff);
- }
-
- internal int GetFinalCRC() {
- return ~globalCrc;
- }
-
- internal int GetGlobalCRC() {
- return globalCrc;
- }
-
- internal void SetGlobalCRC(int newCrc) {
- globalCrc = newCrc;
- }
-
- internal void UpdateCRC(int inCh) {
- int temp = (globalCrc >> 24) ^ inCh;
- if (temp < 0) {
- temp = 256 + temp;
- }
- globalCrc = (globalCrc << 8) ^ CRC.crc32Table[temp];
- }
-
- internal int globalCrc;
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/asn1/ASN1Generator.cs b/BCCrypto/src/asn1/ASN1Generator.cs
deleted file mode 100644
index e560517..0000000
--- a/BCCrypto/src/asn1/ASN1Generator.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System.Collections;
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public abstract class Asn1Generator
- {
- private Stream _out;
-
- protected Asn1Generator(
- Stream outStream)
- {
- _out = outStream;
- }
-
- protected Stream Out
- {
- get { return _out; }
- }
-
- public abstract void AddObject(Asn1Encodable obj);
-
- public abstract Stream GetRawOutputStream();
-
- public abstract void Close();
- }
-}
diff --git a/BCCrypto/src/asn1/ASN1OctetStringParser.cs b/BCCrypto/src/asn1/ASN1OctetStringParser.cs
deleted file mode 100644
index 5815aa4..0000000
--- a/BCCrypto/src/asn1/ASN1OctetStringParser.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public interface Asn1OctetStringParser
- : IAsn1Convertible
- {
- Stream GetOctetStream();
- }
-}
diff --git a/BCCrypto/src/asn1/ASN1SequenceParser.cs b/BCCrypto/src/asn1/ASN1SequenceParser.cs
deleted file mode 100644
index 9e88ac7..0000000
--- a/BCCrypto/src/asn1/ASN1SequenceParser.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public interface Asn1SequenceParser
- : IAsn1Convertible
- {
- IAsn1Convertible ReadObject();
- }
-}
diff --git a/BCCrypto/src/asn1/ASN1SetParser.cs b/BCCrypto/src/asn1/ASN1SetParser.cs
deleted file mode 100644
index d1b9c64..0000000
--- a/BCCrypto/src/asn1/ASN1SetParser.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public interface Asn1SetParser
- : IAsn1Convertible
- {
- IAsn1Convertible ReadObject();
- }
-}
diff --git a/BCCrypto/src/asn1/ASN1StreamParser.cs b/BCCrypto/src/asn1/ASN1StreamParser.cs
deleted file mode 100644
index 0c6b441..0000000
--- a/BCCrypto/src/asn1/ASN1StreamParser.cs
+++ /dev/null
@@ -1,234 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class Asn1StreamParser
- {
- private readonly Stream _in;
- private readonly int _limit;
-
- private readonly byte[][] tmpBuffers;
-
- public Asn1StreamParser(
- Stream inStream)
- : this(inStream, Asn1InputStream.FindLimit(inStream))
- {
- }
-
- public Asn1StreamParser(
- Stream inStream,
- int limit)
- {
- if (!inStream.CanRead)
- throw new ArgumentException("Expected stream to be readable", "inStream");
-
- this._in = inStream;
- this._limit = limit;
- this.tmpBuffers = new byte[16][];
- }
-
- public Asn1StreamParser(
- byte[] encoding)
- : this(new MemoryStream(encoding, false), encoding.Length)
- {
- }
-
- internal IAsn1Convertible ReadIndef(int tagValue)
- {
- // Note: INDEF => CONSTRUCTED
-
- // TODO There are other tags that may be constructed (e.g. BIT_STRING)
- switch (tagValue)
- {
- case Asn1Tags.External:
- return new DerExternalParser(this);
- case Asn1Tags.OctetString:
- return new BerOctetStringParser(this);
- case Asn1Tags.Sequence:
- return new BerSequenceParser(this);
- case Asn1Tags.Set:
- return new BerSetParser(this);
- default:
- throw new Asn1Exception("unknown BER object encountered: 0x" + tagValue.ToString("X"));
- }
- }
-
- internal IAsn1Convertible ReadImplicit(bool constructed, int tag)
- {
- if (_in is IndefiniteLengthInputStream)
- {
- if (!constructed)
- throw new IOException("indefinite length primitive encoding encountered");
-
- return ReadIndef(tag);
- }
-
- if (constructed)
- {
- switch (tag)
- {
- case Asn1Tags.Set:
- return new DerSetParser(this);
- case Asn1Tags.Sequence:
- return new DerSequenceParser(this);
- case Asn1Tags.OctetString:
- return new BerOctetStringParser(this);
- }
- }
- else
- {
- switch (tag)
- {
- case Asn1Tags.Set:
- throw new Asn1Exception("sequences must use constructed encoding (see X.690 8.9.1/8.10.1)");
- case Asn1Tags.Sequence:
- throw new Asn1Exception("sets must use constructed encoding (see X.690 8.11.1/8.12.1)");
- case Asn1Tags.OctetString:
- return new DerOctetStringParser((DefiniteLengthInputStream)_in);
- }
- }
-
- throw new Asn1Exception("implicit tagging not implemented");
- }
-
- internal Asn1Object ReadTaggedObject(bool constructed, int tag)
- {
- if (!constructed)
- {
- // Note: !CONSTRUCTED => IMPLICIT
- DefiniteLengthInputStream defIn = (DefiniteLengthInputStream)_in;
- return new DerTaggedObject(false, tag, new DerOctetString(defIn.ToArray()));
- }
-
- Asn1EncodableVector v = ReadVector();
-
- if (_in is IndefiniteLengthInputStream)
- {
- return v.Count == 1
- ? new BerTaggedObject(true, tag, v[0])
- : new BerTaggedObject(false, tag, BerSequence.FromVector(v));
- }
-
- return v.Count == 1
- ? new DerTaggedObject(true, tag, v[0])
- : new DerTaggedObject(false, tag, DerSequence.FromVector(v));
- }
-
- public virtual IAsn1Convertible ReadObject()
- {
- int tag = _in.ReadByte();
- if (tag == -1)
- return null;
-
- // turn of looking for "00" while we resolve the tag
- Set00Check(false);
-
- //
- // calculate tag number
- //
- int tagNo = Asn1InputStream.ReadTagNumber(_in, tag);
-
- bool isConstructed = (tag & Asn1Tags.Constructed) != 0;
-
- //
- // calculate length
- //
- int length = Asn1InputStream.ReadLength(_in, _limit);
-
- if (length < 0) // indefinite length method
- {
- if (!isConstructed)
- throw new IOException("indefinite length primitive encoding encountered");
-
- IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(_in, _limit);
- Asn1StreamParser sp = new Asn1StreamParser(indIn, _limit);
-
- if ((tag & Asn1Tags.Application) != 0)
- {
- return new BerApplicationSpecificParser(tagNo, sp);
- }
-
- if ((tag & Asn1Tags.Tagged) != 0)
- {
- return new BerTaggedObjectParser(true, tagNo, sp);
- }
-
- return sp.ReadIndef(tagNo);
- }
- else
- {
- DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(_in, length);
-
- if ((tag & Asn1Tags.Application) != 0)
- {
- return new DerApplicationSpecific(isConstructed, tagNo, defIn.ToArray());
- }
-
- if ((tag & Asn1Tags.Tagged) != 0)
- {
- return new BerTaggedObjectParser(isConstructed, tagNo, new Asn1StreamParser(defIn));
- }
-
- if (isConstructed)
- {
- // TODO There are other tags that may be constructed (e.g. BitString)
- switch (tagNo)
- {
- case Asn1Tags.OctetString:
- //
- // yes, people actually do this...
- //
- return new BerOctetStringParser(new Asn1StreamParser(defIn));
- case Asn1Tags.Sequence:
- return new DerSequenceParser(new Asn1StreamParser(defIn));
- case Asn1Tags.Set:
- return new DerSetParser(new Asn1StreamParser(defIn));
- case Asn1Tags.External:
- return new DerExternalParser(new Asn1StreamParser(defIn));
- default:
- throw new IOException("unknown tag " + tagNo + " encountered");
- }
- }
-
- // Some primitive encodings can be handled by parsers too...
- switch (tagNo)
- {
- case Asn1Tags.OctetString:
- return new DerOctetStringParser(defIn);
- }
-
- try
- {
- return Asn1InputStream.CreatePrimitiveDerObject(tagNo, defIn, tmpBuffers);
- }
- catch (ArgumentException e)
- {
- throw new Asn1Exception("corrupted stream detected", e);
- }
- }
- }
-
- private void Set00Check(
- bool enabled)
- {
- if (_in is IndefiniteLengthInputStream)
- {
- ((IndefiniteLengthInputStream) _in).SetEofOn00(enabled);
- }
- }
-
- internal Asn1EncodableVector ReadVector()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- IAsn1Convertible obj;
- while ((obj = ReadObject()) != null)
- {
- v.Add(obj.ToAsn1Object());
- }
-
- return v;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ASN1TaggedObjectParser.cs b/BCCrypto/src/asn1/ASN1TaggedObjectParser.cs
deleted file mode 100644
index 32327a2..0000000
--- a/BCCrypto/src/asn1/ASN1TaggedObjectParser.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public interface Asn1TaggedObjectParser
- : IAsn1Convertible
- {
- int TagNo { get; }
-
- IAsn1Convertible GetObjectParser(int tag, bool isExplicit);
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1Encodable.cs b/BCCrypto/src/asn1/Asn1Encodable.cs
deleted file mode 100644
index e3dd9a1..0000000
--- a/BCCrypto/src/asn1/Asn1Encodable.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public abstract class Asn1Encodable
- : IAsn1Convertible
- {
- public const string Der = "DER";
- public const string Ber = "BER";
-
- public byte[] GetEncoded()
- {
- MemoryStream bOut = new MemoryStream();
- Asn1OutputStream aOut = new Asn1OutputStream(bOut);
-
- aOut.WriteObject(this);
-
- return bOut.ToArray();
- }
-
- public byte[] GetEncoded(
- string encoding)
- {
- if (encoding.Equals(Der))
- {
- MemoryStream bOut = new MemoryStream();
- DerOutputStream dOut = new DerOutputStream(bOut);
-
- dOut.WriteObject(this);
-
- return bOut.ToArray();
- }
-
- return GetEncoded();
- }
-
- /**
- * Return the DER encoding of the object, null if the DER encoding can not be made.
- *
- * @return a DER byte array, null otherwise.
- */
- public byte[] GetDerEncoded()
- {
- try
- {
- return GetEncoded(Der);
- }
- catch (IOException)
- {
- return null;
- }
- }
-
- public sealed override int GetHashCode()
- {
- return ToAsn1Object().CallAsn1GetHashCode();
- }
-
- public sealed override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- IAsn1Convertible other = obj as IAsn1Convertible;
-
- if (other == null)
- return false;
-
- Asn1Object o1 = ToAsn1Object();
- Asn1Object o2 = other.ToAsn1Object();
-
- return o1 == o2 || o1.CallAsn1Equals(o2);
- }
-
- public abstract Asn1Object ToAsn1Object();
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1EncodableVector.cs b/BCCrypto/src/asn1/Asn1EncodableVector.cs
deleted file mode 100644
index 49532fe..0000000
--- a/BCCrypto/src/asn1/Asn1EncodableVector.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class Asn1EncodableVector
- : IEnumerable
- {
- private IList v = Platform.CreateArrayList();
-
- public static Asn1EncodableVector FromEnumerable(
- IEnumerable e)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
- foreach (Asn1Encodable obj in e)
- {
- v.Add(obj);
- }
- return v;
- }
-
-// public Asn1EncodableVector()
-// {
-// }
-
- public Asn1EncodableVector(
- params Asn1Encodable[] v)
- {
- Add(v);
- }
-
-// public void Add(
-// Asn1Encodable obj)
-// {
-// v.Add(obj);
-// }
-
- public void Add(
- params Asn1Encodable[] objs)
- {
- foreach (Asn1Encodable obj in objs)
- {
- v.Add(obj);
- }
- }
-
- public void AddOptional(
- params Asn1Encodable[] objs)
- {
- if (objs != null)
- {
- foreach (Asn1Encodable obj in objs)
- {
- if (obj != null)
- {
- v.Add(obj);
- }
- }
- }
- }
-
- public Asn1Encodable this[
- int index]
- {
- get { return (Asn1Encodable) v[index]; }
- }
-
- [Obsolete("Use 'object[index]' syntax instead")]
- public Asn1Encodable Get(
- int index)
- {
- return this[index];
- }
-
- [Obsolete("Use 'Count' property instead")]
- public int Size
- {
- get { return v.Count; }
- }
-
- public int Count
- {
- get { return v.Count; }
- }
-
- public IEnumerator GetEnumerator()
- {
- return v.GetEnumerator();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1Exception.cs b/BCCrypto/src/asn1/Asn1Exception.cs
deleted file mode 100644
index 1dfe173..0000000
--- a/BCCrypto/src/asn1/Asn1Exception.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class Asn1Exception
- : IOException
- {
- public Asn1Exception()
- : base()
- {
- }
-
- public Asn1Exception(
- string message)
- : base(message)
- {
- }
-
- public Asn1Exception(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1InputStream.cs b/BCCrypto/src/asn1/Asn1InputStream.cs
deleted file mode 100644
index a94ae52..0000000
--- a/BCCrypto/src/asn1/Asn1InputStream.cs
+++ /dev/null
@@ -1,371 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * a general purpose ASN.1 decoder - note: this class differs from the
- * others in that it returns null after it has read the last object in
- * the stream. If an ASN.1 Null is encountered a Der/BER Null object is
- * returned.
- */
- public class Asn1InputStream
- : FilterStream
- {
- private readonly int limit;
-
- private readonly byte[][] tmpBuffers;
-
- internal static int FindLimit(Stream input)
- {
- if (input is LimitedInputStream)
- {
- return ((LimitedInputStream)input).GetRemaining();
- }
- else if (input is MemoryStream)
- {
- MemoryStream mem = (MemoryStream)input;
- return (int)(mem.Length - mem.Position);
- }
-
- return int.MaxValue;
- }
-
- public Asn1InputStream(
- Stream inputStream)
- : this(inputStream, FindLimit(inputStream))
- {
- }
-
- /**
- * Create an ASN1InputStream where no DER object will be longer than limit.
- *
- * @param input stream containing ASN.1 encoded data.
- * @param limit maximum size of a DER encoded object.
- */
- public Asn1InputStream(
- Stream inputStream,
- int limit)
- : base(inputStream)
- {
- this.limit = limit;
- this.tmpBuffers = new byte[16][];
- }
-
- /**
- * Create an ASN1InputStream based on the input byte array. The length of DER objects in
- * the stream is automatically limited to the length of the input array.
- *
- * @param input array containing ASN.1 encoded data.
- */
- public Asn1InputStream(
- byte[] input)
- : this(new MemoryStream(input, false), input.Length)
- {
- }
-
- /**
- * build an object given its tag and the number of bytes to construct it from.
- */
- private Asn1Object BuildObject(
- int tag,
- int tagNo,
- int length)
- {
- bool isConstructed = (tag & Asn1Tags.Constructed) != 0;
-
- DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(this.s, length);
-
- if ((tag & Asn1Tags.Application) != 0)
- {
- return new DerApplicationSpecific(isConstructed, tagNo, defIn.ToArray());
- }
-
- if ((tag & Asn1Tags.Tagged) != 0)
- {
- return new Asn1StreamParser(defIn).ReadTaggedObject(isConstructed, tagNo);
- }
-
- if (isConstructed)
- {
- // TODO There are other tags that may be constructed (e.g. BitString)
- switch (tagNo)
- {
- case Asn1Tags.OctetString:
- //
- // yes, people actually do this...
- //
- return new BerOctetString(BuildDerEncodableVector(defIn));
- case Asn1Tags.Sequence:
- return CreateDerSequence(defIn);
- case Asn1Tags.Set:
- return CreateDerSet(defIn);
- case Asn1Tags.External:
- return new DerExternal(BuildDerEncodableVector(defIn));
- default:
- throw new IOException("unknown tag " + tagNo + " encountered");
- }
- }
-
- return CreatePrimitiveDerObject(tagNo, defIn, tmpBuffers);
- }
-
- internal Asn1EncodableVector BuildEncodableVector()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- Asn1Object o;
- while ((o = ReadObject()) != null)
- {
- v.Add(o);
- }
-
- return v;
- }
-
- internal virtual Asn1EncodableVector BuildDerEncodableVector(
- DefiniteLengthInputStream dIn)
- {
- return new Asn1InputStream(dIn).BuildEncodableVector();
- }
-
- internal virtual DerSequence CreateDerSequence(
- DefiniteLengthInputStream dIn)
- {
- return DerSequence.FromVector(BuildDerEncodableVector(dIn));
- }
-
- internal virtual DerSet CreateDerSet(
- DefiniteLengthInputStream dIn)
- {
- return DerSet.FromVector(BuildDerEncodableVector(dIn), false);
- }
-
- public Asn1Object ReadObject()
- {
- int tag = ReadByte();
- if (tag <= 0)
- {
- if (tag == 0)
- throw new IOException("unexpected end-of-contents marker");
-
- return null;
- }
-
- //
- // calculate tag number
- //
- int tagNo = ReadTagNumber(this.s, tag);
-
- bool isConstructed = (tag & Asn1Tags.Constructed) != 0;
-
- //
- // calculate length
- //
- int length = ReadLength(this.s, limit);
-
- if (length < 0) // indefinite length method
- {
- if (!isConstructed)
- throw new IOException("indefinite length primitive encoding encountered");
-
- IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(this.s, limit);
- Asn1StreamParser sp = new Asn1StreamParser(indIn, limit);
-
- if ((tag & Asn1Tags.Application) != 0)
- {
- return new BerApplicationSpecificParser(tagNo, sp).ToAsn1Object();
- }
-
- if ((tag & Asn1Tags.Tagged) != 0)
- {
- return new BerTaggedObjectParser(true, tagNo, sp).ToAsn1Object();
- }
-
- // TODO There are other tags that may be constructed (e.g. BitString)
- switch (tagNo)
- {
- case Asn1Tags.OctetString:
- return new BerOctetStringParser(sp).ToAsn1Object();
- case Asn1Tags.Sequence:
- return new BerSequenceParser(sp).ToAsn1Object();
- case Asn1Tags.Set:
- return new BerSetParser(sp).ToAsn1Object();
- case Asn1Tags.External:
- return new DerExternalParser(sp).ToAsn1Object();
- default:
- throw new IOException("unknown BER object encountered");
- }
- }
- else
- {
- try
- {
- return BuildObject(tag, tagNo, length);
- }
- catch (ArgumentException e)
- {
- throw new Asn1Exception("corrupted stream detected", e);
- }
- }
- }
-
- internal static int ReadTagNumber(
- Stream s,
- int tag)
- {
- int tagNo = tag & 0x1f;
-
- //
- // with tagged object tag number is bottom 5 bits, or stored at the start of the content
- //
- if (tagNo == 0x1f)
- {
- tagNo = 0;
-
- int b = s.ReadByte();
-
- // X.690-0207 8.1.2.4.2
- // "c) bits 7 to 1 of the first subsequent octet shall not all be zero."
- if ((b & 0x7f) == 0) // Note: -1 will pass
- {
- throw new IOException("Corrupted stream - invalid high tag number found");
- }
-
- while ((b >= 0) && ((b & 0x80) != 0))
- {
- tagNo |= (b & 0x7f);
- tagNo <<= 7;
- b = s.ReadByte();
- }
-
- if (b < 0)
- throw new EndOfStreamException("EOF found inside tag value.");
-
- tagNo |= (b & 0x7f);
- }
-
- return tagNo;
- }
-
- internal static int ReadLength(
- Stream s,
- int limit)
- {
- int length = s.ReadByte();
- if (length < 0)
- throw new EndOfStreamException("EOF found when length expected");
-
- if (length == 0x80)
- return -1; // indefinite-length encoding
-
- if (length > 127)
- {
- int size = length & 0x7f;
-
- // Note: The invalid long form "0xff" (see X.690 8.1.3.5c) will be caught here
- if (size > 4)
- throw new IOException("DER length more than 4 bytes: " + size);
-
- length = 0;
- for (int i = 0; i < size; i++)
- {
- int next = s.ReadByte();
-
- if (next < 0)
- throw new EndOfStreamException("EOF found reading length");
-
- length = (length << 8) + next;
- }
-
- if (length < 0)
- throw new IOException("Corrupted stream - negative length found");
-
- if (length >= limit) // after all we must have read at least 1 byte
- throw new IOException("Corrupted stream - out of bounds length found");
- }
-
- return length;
- }
-
- internal static byte[] GetBuffer(DefiniteLengthInputStream defIn, byte[][] tmpBuffers)
- {
- int len = defIn.GetRemaining();
- if (len >= tmpBuffers.Length)
- {
- return defIn.ToArray();
- }
-
- byte[] buf = tmpBuffers[len];
- if (buf == null)
- {
- buf = tmpBuffers[len] = new byte[len];
- }
-
- defIn.ReadAllIntoByteArray(buf);
-
- return buf;
- }
-
- internal static Asn1Object CreatePrimitiveDerObject(
- int tagNo,
- DefiniteLengthInputStream defIn,
- byte[][] tmpBuffers)
- {
- switch (tagNo)
- {
- case Asn1Tags.Boolean:
- return DerBoolean.FromOctetString(GetBuffer(defIn, tmpBuffers));
- case Asn1Tags.Enumerated:
- return DerEnumerated.FromOctetString(GetBuffer(defIn, tmpBuffers));
- case Asn1Tags.ObjectIdentifier:
- return DerObjectIdentifier.FromOctetString(GetBuffer(defIn, tmpBuffers));
- }
-
- byte[] bytes = defIn.ToArray();
-
- switch (tagNo)
- {
- case Asn1Tags.BitString:
- return DerBitString.FromAsn1Octets(bytes);
- case Asn1Tags.BmpString:
- return new DerBmpString(bytes);
- case Asn1Tags.GeneralizedTime:
- return new DerGeneralizedTime(bytes);
- case Asn1Tags.GeneralString:
- return new DerGeneralString(bytes);
- case Asn1Tags.GraphicString:
- return new DerGraphicString(bytes);
- case Asn1Tags.IA5String:
- return new DerIA5String(bytes);
- case Asn1Tags.Integer:
- return new DerInteger(bytes);
- case Asn1Tags.Null:
- return DerNull.Instance; // actual content is ignored (enforce 0 length?)
- case Asn1Tags.NumericString:
- return new DerNumericString(bytes);
- case Asn1Tags.OctetString:
- return new DerOctetString(bytes);
- case Asn1Tags.PrintableString:
- return new DerPrintableString(bytes);
- case Asn1Tags.T61String:
- return new DerT61String(bytes);
- case Asn1Tags.UniversalString:
- return new DerUniversalString(bytes);
- case Asn1Tags.UtcTime:
- return new DerUtcTime(bytes);
- case Asn1Tags.Utf8String:
- return new DerUtf8String(bytes);
- case Asn1Tags.VideotexString:
- return new DerVideotexString(bytes);
- case Asn1Tags.VisibleString:
- return new DerVisibleString(bytes);
- default:
- throw new IOException("unknown tag " + tagNo + " encountered");
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1Null.cs b/BCCrypto/src/asn1/Asn1Null.cs
deleted file mode 100644
index d54019f..0000000
--- a/BCCrypto/src/asn1/Asn1Null.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * A Null object.
- */
- public abstract class Asn1Null
- : Asn1Object
- {
- internal Asn1Null()
- {
- }
-
- public override string ToString()
- {
- return "NULL";
- }
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1Object.cs b/BCCrypto/src/asn1/Asn1Object.cs
deleted file mode 100644
index 4faa81a..0000000
--- a/BCCrypto/src/asn1/Asn1Object.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public abstract class Asn1Object
- : Asn1Encodable
- {
- /// Create a base ASN.1 object from a byte array.
- /// The byte array to parse.
- /// The base ASN.1 object represented by the byte array.
- ///
- /// If there is a problem parsing the data, or parsing an object did not exhaust the available data.
- ///
- public static Asn1Object FromByteArray(
- byte[] data)
- {
- try
- {
- MemoryStream input = new MemoryStream(data, false);
- Asn1InputStream asn1 = new Asn1InputStream(input, data.Length);
- Asn1Object result = asn1.ReadObject();
- if (input.Position != input.Length)
- throw new IOException("extra data found after object");
- return result;
- }
- catch (InvalidCastException)
- {
- throw new IOException("cannot recognise object in byte array");
- }
- }
-
- /// Read a base ASN.1 object from a stream.
- /// The stream to parse.
- /// The base ASN.1 object represented by the byte array.
- /// If there is a problem parsing the data.
- public static Asn1Object FromStream(
- Stream inStr)
- {
- try
- {
- return new Asn1InputStream(inStr).ReadObject();
- }
- catch (InvalidCastException)
- {
- throw new IOException("cannot recognise object in stream");
- }
- }
-
- public sealed override Asn1Object ToAsn1Object()
- {
- return this;
- }
-
- internal abstract void Encode(DerOutputStream derOut);
-
- protected abstract bool Asn1Equals(Asn1Object asn1Object);
- protected abstract int Asn1GetHashCode();
-
- internal bool CallAsn1Equals(Asn1Object obj)
- {
- return Asn1Equals(obj);
- }
-
- internal int CallAsn1GetHashCode()
- {
- return Asn1GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1OctetString.cs b/BCCrypto/src/asn1/Asn1OctetString.cs
deleted file mode 100644
index 73b6e51..0000000
--- a/BCCrypto/src/asn1/Asn1OctetString.cs
+++ /dev/null
@@ -1,119 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Asn1
-{
- public abstract class Asn1OctetString
- : Asn1Object, Asn1OctetStringParser
- {
- internal byte[] str;
-
- /**
- * return an Octet string from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static Asn1OctetString GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is Asn1OctetString)
- {
- return GetInstance(o);
- }
-
- return BerOctetString.FromSequence(Asn1Sequence.GetInstance(o));
- }
-
- /**
- * return an Octet string from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static Asn1OctetString GetInstance(object obj)
- {
- if (obj == null || obj is Asn1OctetString)
- {
- return (Asn1OctetString)obj;
- }
-
- // TODO: this needs to be deleted in V2
- if (obj is Asn1TaggedObject)
- return GetInstance(((Asn1TaggedObject)obj).GetObject());
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * @param string the octets making up the octet string.
- */
- internal Asn1OctetString(
- byte[] str)
- {
- if (str == null)
- throw new ArgumentNullException("str");
-
- this.str = str;
- }
-
- internal Asn1OctetString(
- Asn1Encodable obj)
- {
- try
- {
- this.str = obj.GetEncoded(Asn1Encodable.Der);
- }
- catch (IOException e)
- {
- throw new ArgumentException("Error processing object : " + e.ToString());
- }
- }
-
- public Stream GetOctetStream()
- {
- return new MemoryStream(str, false);
- }
-
- public Asn1OctetStringParser Parser
- {
- get { return this; }
- }
-
- public virtual byte[] GetOctets()
- {
- return str;
- }
-
- protected override int Asn1GetHashCode()
- {
- return Arrays.GetHashCode(GetOctets());
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerOctetString other = asn1Object as DerOctetString;
-
- if (other == null)
- return false;
-
- return Arrays.AreEqual(GetOctets(), other.GetOctets());
- }
-
- public override string ToString()
- {
- return "#" + Hex.ToHexString(str);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1OutputStream.cs b/BCCrypto/src/asn1/Asn1OutputStream.cs
deleted file mode 100644
index 39c8b1e..0000000
--- a/BCCrypto/src/asn1/Asn1OutputStream.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class Asn1OutputStream
- : DerOutputStream
- {
- public Asn1OutputStream(Stream os) : base(os)
- {
- }
-
- [Obsolete("Use version taking an Asn1Encodable arg instead")]
- public override void WriteObject(
- object obj)
- {
- if (obj == null)
- {
- WriteNull();
- }
- else if (obj is Asn1Object)
- {
- ((Asn1Object)obj).Encode(this);
- }
- else if (obj is Asn1Encodable)
- {
- ((Asn1Encodable)obj).ToAsn1Object().Encode(this);
- }
- else
- {
- throw new IOException("object not Asn1Encodable");
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1ParsingException.cs b/BCCrypto/src/asn1/Asn1ParsingException.cs
deleted file mode 100644
index 84cdb78..0000000
--- a/BCCrypto/src/asn1/Asn1ParsingException.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class Asn1ParsingException
- : InvalidOperationException
- {
- public Asn1ParsingException()
- : base()
- {
- }
-
- public Asn1ParsingException(
- string message)
- : base(message)
- {
- }
-
- public Asn1ParsingException(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1Sequence.cs b/BCCrypto/src/asn1/Asn1Sequence.cs
deleted file mode 100644
index 849f5e3..0000000
--- a/BCCrypto/src/asn1/Asn1Sequence.cs
+++ /dev/null
@@ -1,268 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1
-{
- public abstract class Asn1Sequence
- : Asn1Object, IEnumerable
- {
- private readonly IList seq;
-
- /**
- * return an Asn1Sequence from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static Asn1Sequence GetInstance(
- object obj)
- {
- if (obj == null || obj is Asn1Sequence)
- {
- return (Asn1Sequence)obj;
- }
- else if (obj is Asn1SequenceParser)
- {
- return Asn1Sequence.GetInstance(((Asn1SequenceParser)obj).ToAsn1Object());
- }
- else if (obj is byte[])
- {
- try
- {
- return Asn1Sequence.GetInstance(FromByteArray((byte[])obj));
- }
- catch (IOException e)
- {
- throw new ArgumentException("failed to construct sequence from byte[]: " + e.Message);
- }
- }
- else if (obj is Asn1Encodable)
- {
- Asn1Object primitive = ((Asn1Encodable)obj).ToAsn1Object();
-
- if (primitive is Asn1Sequence)
- {
- return (Asn1Sequence)primitive;
- }
- }
-
- throw new ArgumentException("Unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Return an ASN1 sequence from a tagged object. There is a special
- * case here, if an object appears to have been explicitly tagged on
- * reading but we were expecting it to be implicitly tagged in the
- * normal course of events it indicates that we lost the surrounding
- * sequence - so we need to add it back (this will happen if the tagged
- * object is a sequence that contains other sequences). If you are
- * dealing with implicitly tagged sequences you really should
- * be using this method.
- *
- * @param obj the tagged object.
- * @param explicitly true if the object is meant to be explicitly tagged,
- * false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static Asn1Sequence GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- Asn1Object inner = obj.GetObject();
-
- if (explicitly)
- {
- if (!obj.IsExplicit())
- throw new ArgumentException("object implicit - explicit expected.");
-
- return (Asn1Sequence) inner;
- }
-
- //
- // constructed object which appears to be explicitly tagged
- // when it should be implicit means we have to add the
- // surrounding sequence.
- //
- if (obj.IsExplicit())
- {
- if (obj is BerTaggedObject)
- {
- return new BerSequence(inner);
- }
-
- return new DerSequence(inner);
- }
-
- if (inner is Asn1Sequence)
- {
- return (Asn1Sequence) inner;
- }
-
- throw new ArgumentException("Unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- protected internal Asn1Sequence(
- int capacity)
- {
- seq = Platform.CreateArrayList(capacity);
- }
-
- public virtual IEnumerator GetEnumerator()
- {
- return seq.GetEnumerator();
- }
-
- [Obsolete("Use GetEnumerator() instead")]
- public IEnumerator GetObjects()
- {
- return GetEnumerator();
- }
-
- private class Asn1SequenceParserImpl
- : Asn1SequenceParser
- {
- private readonly Asn1Sequence outer;
- private readonly int max;
- private int index;
-
- public Asn1SequenceParserImpl(
- Asn1Sequence outer)
- {
- this.outer = outer;
- this.max = outer.Count;
- }
-
- public IAsn1Convertible ReadObject()
- {
- if (index == max)
- return null;
-
- Asn1Encodable obj = outer[index++];
-
- if (obj is Asn1Sequence)
- return ((Asn1Sequence)obj).Parser;
-
- if (obj is Asn1Set)
- return ((Asn1Set)obj).Parser;
-
- // NB: Asn1OctetString implements Asn1OctetStringParser directly
-// if (obj is Asn1OctetString)
-// return ((Asn1OctetString)obj).Parser;
-
- return obj;
- }
-
- public Asn1Object ToAsn1Object()
- {
- return outer;
- }
- }
-
- public virtual Asn1SequenceParser Parser
- {
- get { return new Asn1SequenceParserImpl(this); }
- }
-
- /**
- * return the object at the sequence position indicated by index.
- *
- * @param index the sequence number (starting at zero) of the object
- * @return the object at the sequence position indicated by index.
- */
- public virtual Asn1Encodable this[int index]
- {
- get { return (Asn1Encodable) seq[index]; }
- }
-
- [Obsolete("Use 'object[index]' syntax instead")]
- public Asn1Encodable GetObjectAt(
- int index)
- {
- return this[index];
- }
-
- [Obsolete("Use 'Count' property instead")]
- public int Size
- {
- get { return Count; }
- }
-
- public virtual int Count
- {
- get { return seq.Count; }
- }
-
- protected override int Asn1GetHashCode()
- {
- int hc = Count;
-
- foreach (object o in this)
- {
- hc *= 17;
- if (o == null)
- {
- hc ^= DerNull.Instance.GetHashCode();
- }
- else
- {
- hc ^= o.GetHashCode();
- }
- }
-
- return hc;
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- Asn1Sequence other = asn1Object as Asn1Sequence;
-
- if (other == null)
- return false;
-
- if (Count != other.Count)
- return false;
-
- IEnumerator s1 = GetEnumerator();
- IEnumerator s2 = other.GetEnumerator();
-
- while (s1.MoveNext() && s2.MoveNext())
- {
- Asn1Object o1 = GetCurrent(s1).ToAsn1Object();
- Asn1Object o2 = GetCurrent(s2).ToAsn1Object();
-
- if (!o1.Equals(o2))
- return false;
- }
-
- return true;
- }
-
- private Asn1Encodable GetCurrent(IEnumerator e)
- {
- Asn1Encodable encObj = (Asn1Encodable)e.Current;
-
- // unfortunately null was allowed as a substitute for DER null
- if (encObj == null)
- return DerNull.Instance;
-
- return encObj;
- }
-
- protected internal void AddObject(
- Asn1Encodable obj)
- {
- seq.Add(obj);
- }
-
- public override string ToString()
- {
- return CollectionUtilities.ToString(seq);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1Set.cs b/BCCrypto/src/asn1/Asn1Set.cs
deleted file mode 100644
index bf83dbd..0000000
--- a/BCCrypto/src/asn1/Asn1Set.cs
+++ /dev/null
@@ -1,372 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-#if PORTABLE
-using System.Collections.Generic;
-using System.Linq;
-#endif
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1
-{
- abstract public class Asn1Set
- : Asn1Object, IEnumerable
- {
- private readonly IList _set;
-
- /**
- * return an ASN1Set from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static Asn1Set GetInstance(
- object obj)
- {
- if (obj == null || obj is Asn1Set)
- {
- return (Asn1Set)obj;
- }
- else if (obj is Asn1SetParser)
- {
- return Asn1Set.GetInstance(((Asn1SetParser)obj).ToAsn1Object());
- }
- else if (obj is byte[])
- {
- try
- {
- return Asn1Set.GetInstance(FromByteArray((byte[])obj));
- }
- catch (IOException e)
- {
- throw new ArgumentException("failed to construct set from byte[]: " + e.Message);
- }
- }
- else if (obj is Asn1Encodable)
- {
- Asn1Object primitive = ((Asn1Encodable)obj).ToAsn1Object();
-
- if (primitive is Asn1Set)
- {
- return (Asn1Set)primitive;
- }
- }
-
- throw new ArgumentException("Unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Return an ASN1 set from a tagged object. There is a special
- * case here, if an object appears to have been explicitly tagged on
- * reading but we were expecting it to be implicitly tagged in the
- * normal course of events it indicates that we lost the surrounding
- * set - so we need to add it back (this will happen if the tagged
- * object is a sequence that contains other sequences). If you are
- * dealing with implicitly tagged sets you really should
- * be using this method.
- *
- * @param obj the tagged object.
- * @param explicitly true if the object is meant to be explicitly tagged
- * false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static Asn1Set GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- Asn1Object inner = obj.GetObject();
-
- if (explicitly)
- {
- if (!obj.IsExplicit())
- throw new ArgumentException("object implicit - explicit expected.");
-
- return (Asn1Set) inner;
- }
-
- //
- // constructed object which appears to be explicitly tagged
- // and it's really implicit means we have to add the
- // surrounding sequence.
- //
- if (obj.IsExplicit())
- {
- return new DerSet(inner);
- }
-
- if (inner is Asn1Set)
- {
- return (Asn1Set) inner;
- }
-
- //
- // in this case the parser returns a sequence, convert it
- // into a set.
- //
- if (inner is Asn1Sequence)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
- Asn1Sequence s = (Asn1Sequence) inner;
-
- foreach (Asn1Encodable ae in s)
- {
- v.Add(ae);
- }
-
- // TODO Should be able to construct set directly from sequence?
- return new DerSet(v, false);
- }
-
- throw new ArgumentException("Unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- protected internal Asn1Set(
- int capacity)
- {
- _set = Platform.CreateArrayList(capacity);
- }
-
- public virtual IEnumerator GetEnumerator()
- {
- return _set.GetEnumerator();
- }
-
- [Obsolete("Use GetEnumerator() instead")]
- public IEnumerator GetObjects()
- {
- return GetEnumerator();
- }
-
- /**
- * return the object at the set position indicated by index.
- *
- * @param index the set number (starting at zero) of the object
- * @return the object at the set position indicated by index.
- */
- public virtual Asn1Encodable this[int index]
- {
- get { return (Asn1Encodable) _set[index]; }
- }
-
- [Obsolete("Use 'object[index]' syntax instead")]
- public Asn1Encodable GetObjectAt(
- int index)
- {
- return this[index];
- }
-
- [Obsolete("Use 'Count' property instead")]
- public int Size
- {
- get { return Count; }
- }
-
- public virtual int Count
- {
- get { return _set.Count; }
- }
-
- public virtual Asn1Encodable[] ToArray()
- {
- Asn1Encodable[] values = new Asn1Encodable[this.Count];
- for (int i = 0; i < this.Count; ++i)
- {
- values[i] = this[i];
- }
- return values;
- }
-
- private class Asn1SetParserImpl
- : Asn1SetParser
- {
- private readonly Asn1Set outer;
- private readonly int max;
- private int index;
-
- public Asn1SetParserImpl(
- Asn1Set outer)
- {
- this.outer = outer;
- this.max = outer.Count;
- }
-
- public IAsn1Convertible ReadObject()
- {
- if (index == max)
- return null;
-
- Asn1Encodable obj = outer[index++];
- if (obj is Asn1Sequence)
- return ((Asn1Sequence)obj).Parser;
-
- if (obj is Asn1Set)
- return ((Asn1Set)obj).Parser;
-
- // NB: Asn1OctetString implements Asn1OctetStringParser directly
-// if (obj is Asn1OctetString)
-// return ((Asn1OctetString)obj).Parser;
-
- return obj;
- }
-
- public virtual Asn1Object ToAsn1Object()
- {
- return outer;
- }
- }
-
- public Asn1SetParser Parser
- {
- get { return new Asn1SetParserImpl(this); }
- }
-
- protected override int Asn1GetHashCode()
- {
- int hc = Count;
-
- foreach (object o in this)
- {
- hc *= 17;
- if (o == null)
- {
- hc ^= DerNull.Instance.GetHashCode();
- }
- else
- {
- hc ^= o.GetHashCode();
- }
- }
-
- return hc;
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- Asn1Set other = asn1Object as Asn1Set;
-
- if (other == null)
- return false;
-
- if (Count != other.Count)
- {
- return false;
- }
-
- IEnumerator s1 = GetEnumerator();
- IEnumerator s2 = other.GetEnumerator();
-
- while (s1.MoveNext() && s2.MoveNext())
- {
- Asn1Object o1 = GetCurrent(s1).ToAsn1Object();
- Asn1Object o2 = GetCurrent(s2).ToAsn1Object();
-
- if (!o1.Equals(o2))
- return false;
- }
-
- return true;
- }
-
- private Asn1Encodable GetCurrent(IEnumerator e)
- {
- Asn1Encodable encObj = (Asn1Encodable)e.Current;
-
- // unfortunately null was allowed as a substitute for DER null
- if (encObj == null)
- return DerNull.Instance;
-
- return encObj;
- }
-
- protected internal void Sort()
- {
- if (_set.Count < 2)
- return;
-
-#if PORTABLE
- var sorted = _set.Cast()
- .Select(a => new { Item = a, Key = a.GetEncoded(Asn1Encodable.Der) })
- .OrderBy(t => t.Key, new DerComparer())
- .Select(t => t.Item)
- .ToList();
-
- for (int i = 0; i < _set.Count; ++i)
- {
- _set[i] = sorted[i];
- }
-#else
- Asn1Encodable[] items = new Asn1Encodable[_set.Count];
- byte[][] keys = new byte[_set.Count][];
-
- for (int i = 0; i < _set.Count; ++i)
- {
- Asn1Encodable item = (Asn1Encodable)_set[i];
- items[i] = item;
- keys[i] = item.GetEncoded(Asn1Encodable.Der);
- }
-
- Array.Sort(keys, items, new DerComparer());
-
- for (int i = 0; i < _set.Count; ++i)
- {
- _set[i] = items[i];
- }
-#endif
- }
-
- protected internal void AddObject(Asn1Encodable obj)
- {
- _set.Add(obj);
- }
-
- public override string ToString()
- {
- return CollectionUtilities.ToString(_set);
- }
-
-#if PORTABLE
- private class DerComparer
- : IComparer
- {
- public int Compare(byte[] x, byte[] y)
- {
- byte[] a = x, b = y;
-#else
- private class DerComparer
- : IComparer
- {
- public int Compare(object x, object y)
- {
- byte[] a = (byte[])x, b = (byte[])y;
-#endif
- int len = System.Math.Min(a.Length, b.Length);
- for (int i = 0; i != len; ++i)
- {
- byte ai = a[i], bi = b[i];
- if (ai != bi)
- return ai < bi ? -1 : 1;
- }
- if (a.Length > b.Length)
- return AllZeroesFrom(a, len) ? 0 : 1;
- if (a.Length < b.Length)
- return AllZeroesFrom(b, len) ? 0 : -1;
- return 0;
- }
-
- private bool AllZeroesFrom(byte[] bs, int pos)
- {
- while (pos < bs.Length)
- {
- if (bs[pos++] != 0)
- return false;
- }
- return true;
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1TaggedObject.cs b/BCCrypto/src/asn1/Asn1TaggedObject.cs
deleted file mode 100644
index a6d4b2c..0000000
--- a/BCCrypto/src/asn1/Asn1TaggedObject.cs
+++ /dev/null
@@ -1,188 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * ASN.1 TaggedObject - in ASN.1 notation this is any object preceded by
- * a [n] where n is some number - these are assumed to follow the construction
- * rules (as with sequences).
- */
- public abstract class Asn1TaggedObject
- : Asn1Object, Asn1TaggedObjectParser
- {
- internal static bool IsConstructed(bool isExplicit, Asn1Object obj)
- {
- if (isExplicit || obj is Asn1Sequence || obj is Asn1Set)
- return true;
- Asn1TaggedObject tagged = obj as Asn1TaggedObject;
- if (tagged == null)
- return false;
- return IsConstructed(tagged.IsExplicit(), tagged.GetObject());
- }
-
- internal int tagNo;
-// internal bool empty;
- internal bool explicitly = true;
- internal Asn1Encodable obj;
-
- static public Asn1TaggedObject GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- if (explicitly)
- {
- return (Asn1TaggedObject) obj.GetObject();
- }
-
- throw new ArgumentException("implicitly tagged tagged object");
- }
-
- static public Asn1TaggedObject GetInstance(
- object obj)
- {
- if (obj == null || obj is Asn1TaggedObject)
- {
- return (Asn1TaggedObject) obj;
- }
-
- throw new ArgumentException("Unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * @param tagNo the tag number for this object.
- * @param obj the tagged object.
- */
- protected Asn1TaggedObject(
- int tagNo,
- Asn1Encodable obj)
- {
- this.explicitly = true;
- this.tagNo = tagNo;
- this.obj = obj;
- }
-
- /**
- * @param explicitly true if the object is explicitly tagged.
- * @param tagNo the tag number for this object.
- * @param obj the tagged object.
- */
- protected Asn1TaggedObject(
- bool explicitly,
- int tagNo,
- Asn1Encodable obj)
- {
- // IAsn1Choice marker interface 'insists' on explicit tagging
- this.explicitly = explicitly || (obj is IAsn1Choice);
- this.tagNo = tagNo;
- this.obj = obj;
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- Asn1TaggedObject other = asn1Object as Asn1TaggedObject;
-
- if (other == null)
- return false;
-
- return this.tagNo == other.tagNo
-// && this.empty == other.empty
- && this.explicitly == other.explicitly // TODO Should this be part of equality?
- && Platform.Equals(GetObject(), other.GetObject());
- }
-
- protected override int Asn1GetHashCode()
- {
- int code = tagNo.GetHashCode();
-
- // TODO: actually this is wrong - the problem is that a re-encoded
- // object may end up with a different hashCode due to implicit
- // tagging. As implicit tagging is ambiguous if a sequence is involved
- // it seems the only correct method for both equals and hashCode is to
- // compare the encodings...
-// code ^= explicitly.GetHashCode();
-
- if (obj != null)
- {
- code ^= obj.GetHashCode();
- }
-
- return code;
- }
-
- public int TagNo
- {
- get { return tagNo; }
- }
-
- /**
- * return whether or not the object may be explicitly tagged.
- *
- * Note: if the object has been read from an input stream, the only
- * time you can be sure if isExplicit is returning the true state of
- * affairs is if it returns false. An implicitly tagged object may appear
- * to be explicitly tagged, so you need to understand the context under
- * which the reading was done as well, see GetObject below.
- */
- public bool IsExplicit()
- {
- return explicitly;
- }
-
- public bool IsEmpty()
- {
- return false; //empty;
- }
-
- /**
- * return whatever was following the tag.
- *
- * Note: tagged objects are generally context dependent if you're
- * trying to extract a tagged object you should be going via the
- * appropriate GetInstance method.
- */
- public Asn1Object GetObject()
- {
- if (obj != null)
- {
- return obj.ToAsn1Object();
- }
-
- return null;
- }
-
- /**
- * Return the object held in this tagged object as a parser assuming it has
- * the type of the passed in tag. If the object doesn't have a parser
- * associated with it, the base object is returned.
- */
- public IAsn1Convertible GetObjectParser(
- int tag,
- bool isExplicit)
- {
- switch (tag)
- {
- case Asn1Tags.Set:
- return Asn1Set.GetInstance(this, isExplicit).Parser;
- case Asn1Tags.Sequence:
- return Asn1Sequence.GetInstance(this, isExplicit).Parser;
- case Asn1Tags.OctetString:
- return Asn1OctetString.GetInstance(this, isExplicit).Parser;
- }
-
- if (isExplicit)
- {
- return GetObject();
- }
-
- throw Platform.CreateNotImplementedException("implicit tagging for tag: " + tag);
- }
-
- public override string ToString()
- {
- return "[" + tagNo + "]" + obj;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/Asn1Tags.cs b/BCCrypto/src/asn1/Asn1Tags.cs
deleted file mode 100644
index 32ac6bc..0000000
--- a/BCCrypto/src/asn1/Asn1Tags.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public class Asn1Tags
- {
- public const int Boolean = 0x01;
- public const int Integer = 0x02;
- public const int BitString = 0x03;
- public const int OctetString = 0x04;
- public const int Null = 0x05;
- public const int ObjectIdentifier = 0x06;
- public const int External = 0x08;
- public const int Enumerated = 0x0a;
- public const int Sequence = 0x10;
- public const int SequenceOf = 0x10; // for completeness
- public const int Set = 0x11;
- public const int SetOf = 0x11; // for completeness
-
- public const int NumericString = 0x12;
- public const int PrintableString = 0x13;
- public const int T61String = 0x14;
- public const int VideotexString = 0x15;
- public const int IA5String = 0x16;
- public const int UtcTime = 0x17;
- public const int GeneralizedTime = 0x18;
- public const int GraphicString = 0x19;
- public const int VisibleString = 0x1a;
- public const int GeneralString = 0x1b;
- public const int UniversalString = 0x1c;
- public const int BmpString = 0x1e;
- public const int Utf8String = 0x0c;
-
- public const int Constructed = 0x20;
- public const int Application = 0x40;
- public const int Tagged = 0x80;
- }
-}
diff --git a/BCCrypto/src/asn1/BERBitString.cs b/BCCrypto/src/asn1/BERBitString.cs
deleted file mode 100644
index d8cd003..0000000
--- a/BCCrypto/src/asn1/BERBitString.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class BerBitString
- : DerBitString
- {
- public BerBitString(byte[] data, int padBits)
- : base(data, padBits)
- {
- }
-
- public BerBitString(byte[] data)
- : base(data)
- {
- }
-
- public BerBitString(int namedBits)
- : base(namedBits)
- {
- }
-
- public BerBitString(Asn1Encodable obj)
- : base(obj)
- {
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- if (derOut is Asn1OutputStream || derOut is BerOutputStream)
- {
- derOut.WriteEncoded(Asn1Tags.BitString, (byte)mPadBits, mData);
- }
- else
- {
- base.Encode(derOut);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BERGenerator.cs b/BCCrypto/src/asn1/BERGenerator.cs
deleted file mode 100644
index 271572c..0000000
--- a/BCCrypto/src/asn1/BERGenerator.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class BerGenerator
- : Asn1Generator
- {
- private bool _tagged = false;
- private bool _isExplicit;
- private int _tagNo;
-
- protected BerGenerator(
- Stream outStream)
- : base(outStream)
- {
- }
-
- public BerGenerator(
- Stream outStream,
- int tagNo,
- bool isExplicit)
- : base(outStream)
- {
- _tagged = true;
- _isExplicit = isExplicit;
- _tagNo = tagNo;
- }
-
- public override void AddObject(
- Asn1Encodable obj)
- {
- new BerOutputStream(Out).WriteObject(obj);
- }
-
- public override Stream GetRawOutputStream()
- {
- return Out;
- }
-
- public override void Close()
- {
- WriteBerEnd();
- }
-
- private void WriteHdr(
- int tag)
- {
- Out.WriteByte((byte) tag);
- Out.WriteByte(0x80);
- }
-
- protected void WriteBerHeader(
- int tag)
- {
- if (_tagged)
- {
- int tagNum = _tagNo | Asn1Tags.Tagged;
-
- if (_isExplicit)
- {
- WriteHdr(tagNum | Asn1Tags.Constructed);
- WriteHdr(tag);
- }
- else
- {
- if ((tag & Asn1Tags.Constructed) != 0)
- {
- WriteHdr(tagNum | Asn1Tags.Constructed);
- }
- else
- {
- WriteHdr(tagNum);
- }
- }
- }
- else
- {
- WriteHdr(tag);
- }
- }
-
- protected void WriteBerBody(
- Stream contentStream)
- {
- Streams.PipeAll(contentStream, Out);
- }
-
- protected void WriteBerEnd()
- {
- Out.WriteByte(0x00);
- Out.WriteByte(0x00);
-
- if (_tagged && _isExplicit) // write extra end for tag header
- {
- Out.WriteByte(0x00);
- Out.WriteByte(0x00);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BEROctetStringGenerator.cs b/BCCrypto/src/asn1/BEROctetStringGenerator.cs
deleted file mode 100644
index f34538f..0000000
--- a/BCCrypto/src/asn1/BEROctetStringGenerator.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class BerOctetStringGenerator
- : BerGenerator
- {
- public BerOctetStringGenerator(Stream outStream)
- : base(outStream)
- {
- WriteBerHeader(Asn1Tags.Constructed | Asn1Tags.OctetString);
- }
-
- public BerOctetStringGenerator(
- Stream outStream,
- int tagNo,
- bool isExplicit)
- : base(outStream, tagNo, isExplicit)
- {
- WriteBerHeader(Asn1Tags.Constructed | Asn1Tags.OctetString);
- }
-
- public Stream GetOctetOutputStream()
- {
- return GetOctetOutputStream(new byte[1000]); // limit for CER encoding.
- }
-
- public Stream GetOctetOutputStream(
- int bufSize)
- {
- return bufSize < 1
- ? GetOctetOutputStream()
- : GetOctetOutputStream(new byte[bufSize]);
- }
-
- public Stream GetOctetOutputStream(
- byte[] buf)
- {
- return new BufferedBerOctetStream(this, buf);
- }
-
- private class BufferedBerOctetStream
- : BaseOutputStream
- {
- private byte[] _buf;
- private int _off;
- private readonly BerOctetStringGenerator _gen;
- private readonly DerOutputStream _derOut;
-
- internal BufferedBerOctetStream(
- BerOctetStringGenerator gen,
- byte[] buf)
- {
- _gen = gen;
- _buf = buf;
- _off = 0;
- _derOut = new DerOutputStream(_gen.Out);
- }
-
- public override void WriteByte(
- byte b)
- {
- _buf[_off++] = b;
-
- if (_off == _buf.Length)
- {
- DerOctetString.Encode(_derOut, _buf, 0, _off);
- _off = 0;
- }
- }
-
- public override void Write(
- byte[] buf,
- int offset,
- int len)
- {
- while (len > 0)
- {
- int numToCopy = System.Math.Min(len, _buf.Length - _off);
-
- if (numToCopy == _buf.Length)
- {
- DerOctetString.Encode(_derOut, buf, offset, numToCopy);
- }
- else
- {
- Array.Copy(buf, offset, _buf, _off, numToCopy);
-
- _off += numToCopy;
- if (_off < _buf.Length)
- break;
-
- DerOctetString.Encode(_derOut, _buf, 0, _off);
- _off = 0;
- }
-
- offset += numToCopy;
- len -= numToCopy;
- }
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- if (_off != 0)
- {
- DerOctetString.Encode(_derOut, _buf, 0, _off);
- }
-
- _gen.WriteBerEnd();
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- if (_off != 0)
- {
- DerOctetString.Encode(_derOut, _buf, 0, _off);
- }
-
- _gen.WriteBerEnd();
- base.Close();
- }
-#endif
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BEROctetStringParser.cs b/BCCrypto/src/asn1/BEROctetStringParser.cs
deleted file mode 100644
index 3bfd2a9..0000000
--- a/BCCrypto/src/asn1/BEROctetStringParser.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class BerOctetStringParser
- : Asn1OctetStringParser
- {
- private readonly Asn1StreamParser _parser;
-
- internal BerOctetStringParser(
- Asn1StreamParser parser)
- {
- _parser = parser;
- }
-
- public Stream GetOctetStream()
- {
- return new ConstructedOctetStream(_parser);
- }
-
- public Asn1Object ToAsn1Object()
- {
- try
- {
- return new BerOctetString(Streams.ReadAll(GetOctetStream()));
- }
- catch (IOException e)
- {
- throw new Asn1ParsingException("IOException converting stream to byte array: " + e.Message, e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BERSequenceGenerator.cs b/BCCrypto/src/asn1/BERSequenceGenerator.cs
deleted file mode 100644
index 5ea2c9b..0000000
--- a/BCCrypto/src/asn1/BERSequenceGenerator.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class BerSequenceGenerator
- : BerGenerator
- {
- public BerSequenceGenerator(
- Stream outStream)
- : base(outStream)
- {
- WriteBerHeader(Asn1Tags.Constructed | Asn1Tags.Sequence);
- }
-
- public BerSequenceGenerator(
- Stream outStream,
- int tagNo,
- bool isExplicit)
- : base(outStream, tagNo, isExplicit)
- {
- WriteBerHeader(Asn1Tags.Constructed | Asn1Tags.Sequence);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BERSequenceParser.cs b/BCCrypto/src/asn1/BERSequenceParser.cs
deleted file mode 100644
index 8474b8d..0000000
--- a/BCCrypto/src/asn1/BERSequenceParser.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public class BerSequenceParser
- : Asn1SequenceParser
- {
- private readonly Asn1StreamParser _parser;
-
- internal BerSequenceParser(
- Asn1StreamParser parser)
- {
- this._parser = parser;
- }
-
- public IAsn1Convertible ReadObject()
- {
- return _parser.ReadObject();
- }
-
- public Asn1Object ToAsn1Object()
- {
- return new BerSequence(_parser.ReadVector());
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BERSetGenerator.cs b/BCCrypto/src/asn1/BERSetGenerator.cs
deleted file mode 100644
index 72b1f90..0000000
--- a/BCCrypto/src/asn1/BERSetGenerator.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class BerSetGenerator
- : BerGenerator
- {
- public BerSetGenerator(
- Stream outStream)
- : base(outStream)
- {
- WriteBerHeader(Asn1Tags.Constructed | Asn1Tags.Set);
- }
-
- public BerSetGenerator(
- Stream outStream,
- int tagNo,
- bool isExplicit)
- : base(outStream, tagNo, isExplicit)
- {
- WriteBerHeader(Asn1Tags.Constructed | Asn1Tags.Set);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BERSetParser.cs b/BCCrypto/src/asn1/BERSetParser.cs
deleted file mode 100644
index aa9ccbc..0000000
--- a/BCCrypto/src/asn1/BERSetParser.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public class BerSetParser
- : Asn1SetParser
- {
- private readonly Asn1StreamParser _parser;
-
- internal BerSetParser(
- Asn1StreamParser parser)
- {
- this._parser = parser;
- }
-
- public IAsn1Convertible ReadObject()
- {
- return _parser.ReadObject();
- }
-
- public Asn1Object ToAsn1Object()
- {
- return new BerSet(_parser.ReadVector(), false);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BERTaggedObjectParser.cs b/BCCrypto/src/asn1/BERTaggedObjectParser.cs
deleted file mode 100644
index 354437a..0000000
--- a/BCCrypto/src/asn1/BERTaggedObjectParser.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class BerTaggedObjectParser
- : Asn1TaggedObjectParser
- {
- private bool _constructed;
- private int _tagNumber;
- private Asn1StreamParser _parser;
-
- [Obsolete]
- internal BerTaggedObjectParser(
- int baseTag,
- int tagNumber,
- Stream contentStream)
- : this((baseTag & Asn1Tags.Constructed) != 0, tagNumber, new Asn1StreamParser(contentStream))
- {
- }
-
- internal BerTaggedObjectParser(
- bool constructed,
- int tagNumber,
- Asn1StreamParser parser)
- {
- _constructed = constructed;
- _tagNumber = tagNumber;
- _parser = parser;
- }
-
- public bool IsConstructed
- {
- get { return _constructed; }
- }
-
- public int TagNo
- {
- get { return _tagNumber; }
- }
-
- public IAsn1Convertible GetObjectParser(
- int tag,
- bool isExplicit)
- {
- if (isExplicit)
- {
- if (!_constructed)
- throw new IOException("Explicit tags must be constructed (see X.690 8.14.2)");
-
- return _parser.ReadObject();
- }
-
- return _parser.ReadImplicit(_constructed, tag);
- }
-
- public Asn1Object ToAsn1Object()
- {
- try
- {
- return _parser.ReadTaggedObject(_constructed, _tagNumber);
- }
- catch (IOException e)
- {
- throw new Asn1ParsingException(e.Message);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BerApplicationSpecific.cs b/BCCrypto/src/asn1/BerApplicationSpecific.cs
deleted file mode 100644
index 65fbecb..0000000
--- a/BCCrypto/src/asn1/BerApplicationSpecific.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class BerApplicationSpecific
- : DerApplicationSpecific
- {
- public BerApplicationSpecific(
- int tagNo,
- Asn1EncodableVector vec)
- : base(tagNo, vec)
- {
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BerApplicationSpecificParser.cs b/BCCrypto/src/asn1/BerApplicationSpecificParser.cs
deleted file mode 100644
index 7d2c4b3..0000000
--- a/BCCrypto/src/asn1/BerApplicationSpecificParser.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class BerApplicationSpecificParser
- : IAsn1ApplicationSpecificParser
- {
- private readonly int tag;
- private readonly Asn1StreamParser parser;
-
- internal BerApplicationSpecificParser(
- int tag,
- Asn1StreamParser parser)
- {
- this.tag = tag;
- this.parser = parser;
- }
-
- public IAsn1Convertible ReadObject()
- {
- return parser.ReadObject();
- }
-
- public Asn1Object ToAsn1Object()
- {
- return new BerApplicationSpecific(tag, parser.ReadVector());
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BerNull.cs b/BCCrypto/src/asn1/BerNull.cs
deleted file mode 100644
index 0751bba..0000000
--- a/BCCrypto/src/asn1/BerNull.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * A BER Null object.
- */
- public class BerNull
- : DerNull
- {
- public static new readonly BerNull Instance = new BerNull(0);
-
- [Obsolete("Use static Instance object")]
- public BerNull()
- {
- }
-
- private BerNull(int dummy) : base(dummy)
- {
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- if (derOut is Asn1OutputStream || derOut is BerOutputStream)
- {
- derOut.WriteByte(Asn1Tags.Null);
- }
- else
- {
- base.Encode(derOut);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BerOctetString.cs b/BCCrypto/src/asn1/BerOctetString.cs
deleted file mode 100644
index a7c8ad3..0000000
--- a/BCCrypto/src/asn1/BerOctetString.cs
+++ /dev/null
@@ -1,135 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class BerOctetString
- : DerOctetString, IEnumerable
- {
- public static BerOctetString FromSequence(Asn1Sequence seq)
- {
- IList v = Platform.CreateArrayList();
-
- foreach (Asn1Encodable obj in seq)
- {
- v.Add(obj);
- }
-
- return new BerOctetString(v);
- }
-
- private const int MaxLength = 1000;
-
- /**
- * convert a vector of octet strings into a single byte string
- */
- private static byte[] ToBytes(
- IEnumerable octs)
- {
- MemoryStream bOut = new MemoryStream();
- foreach (DerOctetString o in octs)
- {
- byte[] octets = o.GetOctets();
- bOut.Write(octets, 0, octets.Length);
- }
- return bOut.ToArray();
- }
-
- private readonly IEnumerable octs;
-
- /// The octets making up the octet string.
- public BerOctetString(
- byte[] str)
- : base(str)
- {
- }
-
- public BerOctetString(
- IEnumerable octets)
- : base(ToBytes(octets))
- {
- this.octs = octets;
- }
-
- public BerOctetString(
- Asn1Object obj)
- : base(obj)
- {
- }
-
- public BerOctetString(
- Asn1Encodable obj)
- : base(obj.ToAsn1Object())
- {
- }
-
- public override byte[] GetOctets()
- {
- return str;
- }
-
- /**
- * return the DER octets that make up this string.
- */
- public IEnumerator GetEnumerator()
- {
- if (octs == null)
- {
- return GenerateOcts().GetEnumerator();
- }
-
- return octs.GetEnumerator();
- }
-
- [Obsolete("Use GetEnumerator() instead")]
- public IEnumerator GetObjects()
- {
- return GetEnumerator();
- }
-
- private IList GenerateOcts()
- {
- IList vec = Platform.CreateArrayList();
- for (int i = 0; i < str.Length; i += MaxLength)
- {
- int end = System.Math.Min(str.Length, i + MaxLength);
-
- byte[] nStr = new byte[end - i];
-
- Array.Copy(str, i, nStr, 0, nStr.Length);
-
- vec.Add(new DerOctetString(nStr));
- }
- return vec;
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- if (derOut is Asn1OutputStream || derOut is BerOutputStream)
- {
- derOut.WriteByte(Asn1Tags.Constructed | Asn1Tags.OctetString);
-
- derOut.WriteByte(0x80);
-
- //
- // write out the octet array
- //
- foreach (DerOctetString oct in this)
- {
- derOut.WriteObject(oct);
- }
-
- derOut.WriteByte(0x00);
- derOut.WriteByte(0x00);
- }
- else
- {
- base.Encode(derOut);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BerOutputStream.cs b/BCCrypto/src/asn1/BerOutputStream.cs
deleted file mode 100644
index b3ece10..0000000
--- a/BCCrypto/src/asn1/BerOutputStream.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- // TODO Make Obsolete in favour of Asn1OutputStream?
- public class BerOutputStream
- : DerOutputStream
- {
- public BerOutputStream(Stream os) : base(os)
- {
- }
-
- [Obsolete("Use version taking an Asn1Encodable arg instead")]
- public override void WriteObject(
- object obj)
- {
- if (obj == null)
- {
- WriteNull();
- }
- else if (obj is Asn1Object)
- {
- ((Asn1Object)obj).Encode(this);
- }
- else if (obj is Asn1Encodable)
- {
- ((Asn1Encodable)obj).ToAsn1Object().Encode(this);
- }
- else
- {
- throw new IOException("object not BerEncodable");
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BerSequence.cs b/BCCrypto/src/asn1/BerSequence.cs
deleted file mode 100644
index 70b43fc..0000000
--- a/BCCrypto/src/asn1/BerSequence.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public class BerSequence
- : DerSequence
- {
- public static new readonly BerSequence Empty = new BerSequence();
-
- public static new BerSequence FromVector(
- Asn1EncodableVector v)
- {
- return v.Count < 1 ? Empty : new BerSequence(v);
- }
-
- /**
- * create an empty sequence
- */
- public BerSequence()
- {
- }
-
- /**
- * create a sequence containing one object
- */
- public BerSequence(
- Asn1Encodable obj)
- : base(obj)
- {
- }
-
- public BerSequence(
- params Asn1Encodable[] v)
- : base(v)
- {
- }
-
- /**
- * create a sequence containing a vector of objects.
- */
- public BerSequence(
- Asn1EncodableVector v)
- : base(v)
- {
- }
-
- /*
- */
- internal override void Encode(
- DerOutputStream derOut)
- {
- if (derOut is Asn1OutputStream || derOut is BerOutputStream)
- {
- derOut.WriteByte(Asn1Tags.Sequence | Asn1Tags.Constructed);
- derOut.WriteByte(0x80);
-
- foreach (Asn1Encodable o in this)
- {
- derOut.WriteObject(o);
- }
-
- derOut.WriteByte(0x00);
- derOut.WriteByte(0x00);
- }
- else
- {
- base.Encode(derOut);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BerSet.cs b/BCCrypto/src/asn1/BerSet.cs
deleted file mode 100644
index a181e17..0000000
--- a/BCCrypto/src/asn1/BerSet.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public class BerSet
- : DerSet
- {
- public static new readonly BerSet Empty = new BerSet();
-
- public static new BerSet FromVector(
- Asn1EncodableVector v)
- {
- return v.Count < 1 ? Empty : new BerSet(v);
- }
-
- internal static new BerSet FromVector(
- Asn1EncodableVector v,
- bool needsSorting)
- {
- return v.Count < 1 ? Empty : new BerSet(v, needsSorting);
- }
-
- /**
- * create an empty sequence
- */
- public BerSet()
- {
- }
-
- /**
- * create a set containing one object
- */
- public BerSet(Asn1Encodable obj) : base(obj)
- {
- }
-
- /**
- * create a set containing a vector of objects.
- */
- public BerSet(Asn1EncodableVector v) : base(v, false)
- {
- }
-
- internal BerSet(Asn1EncodableVector v, bool needsSorting) : base(v, needsSorting)
- {
- }
-
- /*
- */
- internal override void Encode(
- DerOutputStream derOut)
- {
- if (derOut is Asn1OutputStream || derOut is BerOutputStream)
- {
- derOut.WriteByte(Asn1Tags.Set | Asn1Tags.Constructed);
- derOut.WriteByte(0x80);
-
- foreach (Asn1Encodable o in this)
- {
- derOut.WriteObject(o);
- }
-
- derOut.WriteByte(0x00);
- derOut.WriteByte(0x00);
- }
- else
- {
- base.Encode(derOut);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/BerTaggedObject.cs b/BCCrypto/src/asn1/BerTaggedObject.cs
deleted file mode 100644
index fd0bdc2..0000000
--- a/BCCrypto/src/asn1/BerTaggedObject.cs
+++ /dev/null
@@ -1,108 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * BER TaggedObject - in ASN.1 notation this is any object preceded by
- * a [n] where n is some number - these are assumed to follow the construction
- * rules (as with sequences).
- */
- public class BerTaggedObject
- : DerTaggedObject
- {
- /**
- * @param tagNo the tag number for this object.
- * @param obj the tagged object.
- */
- public BerTaggedObject(
- int tagNo,
- Asn1Encodable obj)
- : base(tagNo, obj)
- {
- }
-
- /**
- * @param explicitly true if an explicitly tagged object.
- * @param tagNo the tag number for this object.
- * @param obj the tagged object.
- */
- public BerTaggedObject(
- bool explicitly,
- int tagNo,
- Asn1Encodable obj)
- : base(explicitly, tagNo, obj)
- {
- }
-
- /**
- * create an implicitly tagged object that contains a zero
- * length sequence.
- */
- public BerTaggedObject(
- int tagNo)
- : base(false, tagNo, BerSequence.Empty)
- {
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- if (derOut is Asn1OutputStream || derOut is BerOutputStream)
- {
- derOut.WriteTag((byte)(Asn1Tags.Constructed | Asn1Tags.Tagged), tagNo);
- derOut.WriteByte(0x80);
-
- if (!IsEmpty())
- {
- if (!explicitly)
- {
- IEnumerable eObj;
- if (obj is Asn1OctetString)
- {
- if (obj is BerOctetString)
- {
- eObj = (BerOctetString) obj;
- }
- else
- {
- Asn1OctetString octs = (Asn1OctetString)obj;
- eObj = new BerOctetString(octs.GetOctets());
- }
- }
- else if (obj is Asn1Sequence)
- {
- eObj = (Asn1Sequence) obj;
- }
- else if (obj is Asn1Set)
- {
- eObj = (Asn1Set) obj;
- }
- else
- {
- throw Platform.CreateNotImplementedException(Platform.GetTypeName(obj));
- }
-
- foreach (Asn1Encodable o in eObj)
- {
- derOut.WriteObject(o);
- }
- }
- else
- {
- derOut.WriteObject(obj);
- }
- }
-
- derOut.WriteByte(0x00);
- derOut.WriteByte(0x00);
- }
- else
- {
- base.Encode(derOut);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ConstructedOctetStream.cs b/BCCrypto/src/asn1/ConstructedOctetStream.cs
deleted file mode 100644
index 1773b22..0000000
--- a/BCCrypto/src/asn1/ConstructedOctetStream.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- internal class ConstructedOctetStream
- : BaseInputStream
- {
- private readonly Asn1StreamParser _parser;
-
- private bool _first = true;
- private Stream _currentStream;
-
- internal ConstructedOctetStream(
- Asn1StreamParser parser)
- {
- _parser = parser;
- }
-
- public override int Read(byte[] buffer, int offset, int count)
- {
- if (_currentStream == null)
- {
- if (!_first)
- return 0;
-
- Asn1OctetStringParser s = (Asn1OctetStringParser)_parser.ReadObject();
-
- if (s == null)
- return 0;
-
- _first = false;
- _currentStream = s.GetOctetStream();
- }
-
- int totalRead = 0;
-
- for (;;)
- {
- int numRead = _currentStream.Read(buffer, offset + totalRead, count - totalRead);
-
- if (numRead > 0)
- {
- totalRead += numRead;
-
- if (totalRead == count)
- return totalRead;
- }
- else
- {
- Asn1OctetStringParser aos = (Asn1OctetStringParser)_parser.ReadObject();
-
- if (aos == null)
- {
- _currentStream = null;
- return totalRead;
- }
-
- _currentStream = aos.GetOctetStream();
- }
- }
- }
-
- public override int ReadByte()
- {
- if (_currentStream == null)
- {
- if (!_first)
- return 0;
-
- Asn1OctetStringParser s = (Asn1OctetStringParser)_parser.ReadObject();
-
- if (s == null)
- return 0;
-
- _first = false;
- _currentStream = s.GetOctetStream();
- }
-
- for (;;)
- {
- int b = _currentStream.ReadByte();
-
- if (b >= 0)
- {
- return b;
- }
-
- Asn1OctetStringParser aos = (Asn1OctetStringParser)_parser.ReadObject();
-
- if (aos == null)
- {
- _currentStream = null;
- return -1;
- }
-
- _currentStream = aos.GetOctetStream();
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DERExternal.cs b/BCCrypto/src/asn1/DERExternal.cs
deleted file mode 100644
index c299751..0000000
--- a/BCCrypto/src/asn1/DERExternal.cs
+++ /dev/null
@@ -1,202 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * Class representing the DER-type External
- */
- public class DerExternal
- : Asn1Object
- {
- private DerObjectIdentifier directReference;
- private DerInteger indirectReference;
- private Asn1Object dataValueDescriptor;
- private int encoding;
- private Asn1Object externalContent;
-
- public DerExternal(
- Asn1EncodableVector vector)
- {
- int offset = 0;
- Asn1Object enc = GetObjFromVector(vector, offset);
- if (enc is DerObjectIdentifier)
- {
- directReference = (DerObjectIdentifier)enc;
- offset++;
- enc = GetObjFromVector(vector, offset);
- }
- if (enc is DerInteger)
- {
- indirectReference = (DerInteger) enc;
- offset++;
- enc = GetObjFromVector(vector, offset);
- }
- if (!(enc is Asn1TaggedObject))
- {
- dataValueDescriptor = enc;
- offset++;
- enc = GetObjFromVector(vector, offset);
- }
-
- if (vector.Count != offset + 1)
- throw new ArgumentException("input vector too large", "vector");
-
- if (!(enc is Asn1TaggedObject))
- throw new ArgumentException("No tagged object found in vector. Structure doesn't seem to be of type External", "vector");
-
- Asn1TaggedObject obj = (Asn1TaggedObject)enc;
-
- // Use property accessor to include check on value
- Encoding = obj.TagNo;
-
- if (encoding < 0 || encoding > 2)
- throw new InvalidOperationException("invalid encoding value");
-
- externalContent = obj.GetObject();
- }
-
- /**
- * Creates a new instance of DerExternal
- * See X.690 for more informations about the meaning of these parameters
- * @param directReference The direct reference or null if not set.
- * @param indirectReference The indirect reference or null if not set.
- * @param dataValueDescriptor The data value descriptor or null if not set.
- * @param externalData The external data in its encoded form.
- */
- public DerExternal(DerObjectIdentifier directReference, DerInteger indirectReference, Asn1Object dataValueDescriptor, DerTaggedObject externalData)
- : this(directReference, indirectReference, dataValueDescriptor, externalData.TagNo, externalData.ToAsn1Object())
- {
- }
-
- /**
- * Creates a new instance of DerExternal.
- * See X.690 for more informations about the meaning of these parameters
- * @param directReference The direct reference or null if not set.
- * @param indirectReference The indirect reference or null if not set.
- * @param dataValueDescriptor The data value descriptor or null if not set.
- * @param encoding The encoding to be used for the external data
- * @param externalData The external data
- */
- public DerExternal(DerObjectIdentifier directReference, DerInteger indirectReference, Asn1Object dataValueDescriptor, int encoding, Asn1Object externalData)
- {
- DirectReference = directReference;
- IndirectReference = indirectReference;
- DataValueDescriptor = dataValueDescriptor;
- Encoding = encoding;
- ExternalContent = externalData.ToAsn1Object();
- }
-
- internal override void Encode(DerOutputStream derOut)
- {
- MemoryStream ms = new MemoryStream();
- WriteEncodable(ms, directReference);
- WriteEncodable(ms, indirectReference);
- WriteEncodable(ms, dataValueDescriptor);
- WriteEncodable(ms, new DerTaggedObject(Asn1Tags.External, externalContent));
-
- derOut.WriteEncoded(Asn1Tags.Constructed, Asn1Tags.External, ms.ToArray());
- }
-
- protected override int Asn1GetHashCode()
- {
- int ret = externalContent.GetHashCode();
- if (directReference != null)
- {
- ret ^= directReference.GetHashCode();
- }
- if (indirectReference != null)
- {
- ret ^= indirectReference.GetHashCode();
- }
- if (dataValueDescriptor != null)
- {
- ret ^= dataValueDescriptor.GetHashCode();
- }
- return ret;
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- if (this == asn1Object)
- return true;
-
- DerExternal other = asn1Object as DerExternal;
-
- if (other == null)
- return false;
-
- return Platform.Equals(directReference, other.directReference)
- && Platform.Equals(indirectReference, other.indirectReference)
- && Platform.Equals(dataValueDescriptor, other.dataValueDescriptor)
- && externalContent.Equals(other.externalContent);
- }
-
- public Asn1Object DataValueDescriptor
- {
- get { return dataValueDescriptor; }
- set { this.dataValueDescriptor = value; }
- }
-
- public DerObjectIdentifier DirectReference
- {
- get { return directReference; }
- set { this.directReference = value; }
- }
-
- /**
- * The encoding of the content. Valid values are
- *
- * 0 single-ASN1-type
- * 1 OCTET STRING
- * 2 BIT STRING
- *
- */
- public int Encoding
- {
- get
- {
- return encoding;
- }
- set
- {
- if (encoding < 0 || encoding > 2)
- throw new InvalidOperationException("invalid encoding value: " + encoding);
-
- this.encoding = value;
- }
- }
-
- public Asn1Object ExternalContent
- {
- get { return externalContent; }
- set { this.externalContent = value; }
- }
-
- public DerInteger IndirectReference
- {
- get { return indirectReference; }
- set { this.indirectReference = value; }
- }
-
- private static Asn1Object GetObjFromVector(Asn1EncodableVector v, int index)
- {
- if (v.Count <= index)
- throw new ArgumentException("too few objects in input vector", "v");
-
- return v[index].ToAsn1Object();
- }
-
- private static void WriteEncodable(MemoryStream ms, Asn1Encodable e)
- {
- if (e != null)
- {
- byte[] bs = e.GetDerEncoded();
- ms.Write(bs, 0, bs.Length);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DERExternalParser.cs b/BCCrypto/src/asn1/DERExternalParser.cs
deleted file mode 100644
index 70e426f..0000000
--- a/BCCrypto/src/asn1/DERExternalParser.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerExternalParser
- : Asn1Encodable
- {
- private readonly Asn1StreamParser _parser;
-
- public DerExternalParser(Asn1StreamParser parser)
- {
- this._parser = parser;
- }
-
- public IAsn1Convertible ReadObject()
- {
- return _parser.ReadObject();
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerExternal(_parser.ReadVector());
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DERGenerator.cs b/BCCrypto/src/asn1/DERGenerator.cs
deleted file mode 100644
index aab40fe..0000000
--- a/BCCrypto/src/asn1/DERGenerator.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public abstract class DerGenerator
- : Asn1Generator
- {
- private bool _tagged = false;
- private bool _isExplicit;
- private int _tagNo;
-
- protected DerGenerator(
- Stream outStream)
- : base(outStream)
- {
- }
-
- protected DerGenerator(
- Stream outStream,
- int tagNo,
- bool isExplicit)
- : base(outStream)
- {
- _tagged = true;
- _isExplicit = isExplicit;
- _tagNo = tagNo;
- }
-
- private static void WriteLength(
- Stream outStr,
- int length)
- {
- if (length > 127)
- {
- int size = 1;
- int val = length;
-
- while ((val >>= 8) != 0)
- {
- size++;
- }
-
- outStr.WriteByte((byte)(size | 0x80));
-
- for (int i = (size - 1) * 8; i >= 0; i -= 8)
- {
- outStr.WriteByte((byte)(length >> i));
- }
- }
- else
- {
- outStr.WriteByte((byte)length);
- }
- }
-
- internal static void WriteDerEncoded(
- Stream outStream,
- int tag,
- byte[] bytes)
- {
- outStream.WriteByte((byte) tag);
- WriteLength(outStream, bytes.Length);
- outStream.Write(bytes, 0, bytes.Length);
- }
-
- internal void WriteDerEncoded(
- int tag,
- byte[] bytes)
- {
- if (_tagged)
- {
- int tagNum = _tagNo | Asn1Tags.Tagged;
-
- if (_isExplicit)
- {
- int newTag = _tagNo | Asn1Tags.Constructed | Asn1Tags.Tagged;
- MemoryStream bOut = new MemoryStream();
- WriteDerEncoded(bOut, tag, bytes);
- WriteDerEncoded(Out, newTag, bOut.ToArray());
- }
- else
- {
- if ((tag & Asn1Tags.Constructed) != 0)
- {
- tagNum |= Asn1Tags.Constructed;
- }
-
- WriteDerEncoded(Out, tagNum, bytes);
- }
- }
- else
- {
- WriteDerEncoded(Out, tag, bytes);
- }
- }
-
- internal static void WriteDerEncoded(
- Stream outStr,
- int tag,
- Stream inStr)
- {
- WriteDerEncoded(outStr, tag, Streams.ReadAll(inStr));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DEROctetStringParser.cs b/BCCrypto/src/asn1/DEROctetStringParser.cs
deleted file mode 100644
index b0d3ad8..0000000
--- a/BCCrypto/src/asn1/DEROctetStringParser.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerOctetStringParser
- : Asn1OctetStringParser
- {
- private readonly DefiniteLengthInputStream stream;
-
- internal DerOctetStringParser(
- DefiniteLengthInputStream stream)
- {
- this.stream = stream;
- }
-
- public Stream GetOctetStream()
- {
- return stream;
- }
-
- public Asn1Object ToAsn1Object()
- {
- try
- {
- return new DerOctetString(stream.ToArray());
- }
- catch (IOException e)
- {
- throw new InvalidOperationException("IOException converting stream to byte array: " + e.Message, e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DERSequenceGenerator.cs b/BCCrypto/src/asn1/DERSequenceGenerator.cs
deleted file mode 100644
index 4c2bfd0..0000000
--- a/BCCrypto/src/asn1/DERSequenceGenerator.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerSequenceGenerator
- : DerGenerator
- {
- private readonly MemoryStream _bOut = new MemoryStream();
-
- public DerSequenceGenerator(
- Stream outStream)
- : base(outStream)
- {
- }
-
- public DerSequenceGenerator(
- Stream outStream,
- int tagNo,
- bool isExplicit)
- : base(outStream, tagNo, isExplicit)
- {
- }
-
- public override void AddObject(
- Asn1Encodable obj)
- {
- new DerOutputStream(_bOut).WriteObject(obj);
- }
-
- public override Stream GetRawOutputStream()
- {
- return _bOut;
- }
-
- public override void Close()
- {
- WriteDerEncoded(Asn1Tags.Constructed | Asn1Tags.Sequence, _bOut.ToArray());
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DERSequenceParser.cs b/BCCrypto/src/asn1/DERSequenceParser.cs
deleted file mode 100644
index 69c2b9b..0000000
--- a/BCCrypto/src/asn1/DERSequenceParser.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public class DerSequenceParser
- : Asn1SequenceParser
- {
- private readonly Asn1StreamParser _parser;
-
- internal DerSequenceParser(
- Asn1StreamParser parser)
- {
- this._parser = parser;
- }
-
- public IAsn1Convertible ReadObject()
- {
- return _parser.ReadObject();
- }
-
- public Asn1Object ToAsn1Object()
- {
- return new DerSequence(_parser.ReadVector());
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DERSetGenerator.cs b/BCCrypto/src/asn1/DERSetGenerator.cs
deleted file mode 100644
index 455ca88..0000000
--- a/BCCrypto/src/asn1/DERSetGenerator.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerSetGenerator
- : DerGenerator
- {
- private readonly MemoryStream _bOut = new MemoryStream();
-
- public DerSetGenerator(
- Stream outStream)
- : base(outStream)
- {
- }
-
- public DerSetGenerator(
- Stream outStream,
- int tagNo,
- bool isExplicit)
- : base(outStream, tagNo, isExplicit)
- {
- }
-
- public override void AddObject(
- Asn1Encodable obj)
- {
- new DerOutputStream(_bOut).WriteObject(obj);
- }
-
- public override Stream GetRawOutputStream()
- {
- return _bOut;
- }
-
- public override void Close()
- {
- WriteDerEncoded(Asn1Tags.Constructed | Asn1Tags.Set, _bOut.ToArray());
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DERSetParser.cs b/BCCrypto/src/asn1/DERSetParser.cs
deleted file mode 100644
index d67f135..0000000
--- a/BCCrypto/src/asn1/DERSetParser.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public class DerSetParser
- : Asn1SetParser
- {
- private readonly Asn1StreamParser _parser;
-
- internal DerSetParser(
- Asn1StreamParser parser)
- {
- this._parser = parser;
- }
-
- public IAsn1Convertible ReadObject()
- {
- return _parser.ReadObject();
- }
-
- public Asn1Object ToAsn1Object()
- {
- return new DerSet(_parser.ReadVector(), false);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DefiniteLengthInputStream.cs b/BCCrypto/src/asn1/DefiniteLengthInputStream.cs
deleted file mode 100644
index 4ae803c..0000000
--- a/BCCrypto/src/asn1/DefiniteLengthInputStream.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- class DefiniteLengthInputStream
- : LimitedInputStream
- {
- private static readonly byte[] EmptyBytes = new byte[0];
-
- private readonly int _originalLength;
- private int _remaining;
-
- internal DefiniteLengthInputStream(
- Stream inStream,
- int length)
- : base(inStream, length)
- {
- if (length < 0)
- throw new ArgumentException("negative lengths not allowed", "length");
-
- this._originalLength = length;
- this._remaining = length;
-
- if (length == 0)
- {
- SetParentEofDetect(true);
- }
- }
-
- internal int Remaining
- {
- get { return _remaining; }
- }
-
- public override int ReadByte()
- {
- if (_remaining == 0)
- return -1;
-
- int b = _in.ReadByte();
-
- if (b < 0)
- throw new EndOfStreamException("DEF length " + _originalLength + " object truncated by " + _remaining);
-
- if (--_remaining == 0)
- {
- SetParentEofDetect(true);
- }
-
- return b;
- }
-
- public override int Read(
- byte[] buf,
- int off,
- int len)
- {
- if (_remaining == 0)
- return 0;
-
- int toRead = System.Math.Min(len, _remaining);
- int numRead = _in.Read(buf, off, toRead);
-
- if (numRead < 1)
- throw new EndOfStreamException("DEF length " + _originalLength + " object truncated by " + _remaining);
-
- if ((_remaining -= numRead) == 0)
- {
- SetParentEofDetect(true);
- }
-
- return numRead;
- }
-
- internal void ReadAllIntoByteArray(byte[] buf)
- {
- if (_remaining != buf.Length)
- throw new ArgumentException("buffer length not right for data");
-
- if ((_remaining -= Streams.ReadFully(_in, buf)) != 0)
- throw new EndOfStreamException("DEF length " + _originalLength + " object truncated by " + _remaining);
- SetParentEofDetect(true);
- }
-
- internal byte[] ToArray()
- {
- if (_remaining == 0)
- return EmptyBytes;
-
- byte[] bytes = new byte[_remaining];
- if ((_remaining -= Streams.ReadFully(_in, bytes)) != 0)
- throw new EndOfStreamException("DEF length " + _originalLength + " object truncated by " + _remaining);
- SetParentEofDetect(true);
- return bytes;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerApplicationSpecific.cs b/BCCrypto/src/asn1/DerApplicationSpecific.cs
deleted file mode 100644
index 52467fa..0000000
--- a/BCCrypto/src/asn1/DerApplicationSpecific.cs
+++ /dev/null
@@ -1,237 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * Base class for an application specific object
- */
- public class DerApplicationSpecific
- : Asn1Object
- {
- private readonly bool isConstructed;
- private readonly int tag;
- private readonly byte[] octets;
-
- internal DerApplicationSpecific(
- bool isConstructed,
- int tag,
- byte[] octets)
- {
- this.isConstructed = isConstructed;
- this.tag = tag;
- this.octets = octets;
- }
-
- public DerApplicationSpecific(
- int tag,
- byte[] octets)
- : this(false, tag, octets)
- {
- }
-
- public DerApplicationSpecific(
- int tag,
- Asn1Encodable obj)
- : this(true, tag, obj)
- {
- }
-
- public DerApplicationSpecific(
- bool isExplicit,
- int tag,
- Asn1Encodable obj)
- {
- Asn1Object asn1Obj = obj.ToAsn1Object();
-
- byte[] data = asn1Obj.GetDerEncoded();
-
- this.isConstructed = Asn1TaggedObject.IsConstructed(isExplicit, asn1Obj);
- this.tag = tag;
-
- if (isExplicit)
- {
- this.octets = data;
- }
- else
- {
- int lenBytes = GetLengthOfHeader(data);
- byte[] tmp = new byte[data.Length - lenBytes];
- Array.Copy(data, lenBytes, tmp, 0, tmp.Length);
- this.octets = tmp;
- }
- }
-
- public DerApplicationSpecific(
- int tagNo,
- Asn1EncodableVector vec)
- {
- this.tag = tagNo;
- this.isConstructed = true;
- MemoryStream bOut = new MemoryStream();
-
- for (int i = 0; i != vec.Count; i++)
- {
- try
- {
- byte[] bs = vec[i].GetDerEncoded();
- bOut.Write(bs, 0, bs.Length);
- }
- catch (IOException e)
- {
- throw new InvalidOperationException("malformed object", e);
- }
- }
- this.octets = bOut.ToArray();
- }
-
- private int GetLengthOfHeader(
- byte[] data)
- {
- int length = data[1]; // TODO: assumes 1 byte tag
-
- if (length == 0x80)
- {
- return 2; // indefinite-length encoding
- }
-
- if (length > 127)
- {
- int size = length & 0x7f;
-
- // Note: The invalid long form "0xff" (see X.690 8.1.3.5c) will be caught here
- if (size > 4)
- {
- throw new InvalidOperationException("DER length more than 4 bytes: " + size);
- }
-
- return size + 2;
- }
-
- return 2;
- }
-
- public bool IsConstructed()
- {
- return isConstructed;
- }
-
- public byte[] GetContents()
- {
- return octets;
- }
-
- public int ApplicationTag
- {
- get { return tag; }
- }
-
- /**
- * Return the enclosed object assuming explicit tagging.
- *
- * @return the resulting object
- * @throws IOException if reconstruction fails.
- */
- public Asn1Object GetObject()
- {
- return FromByteArray(GetContents());
- }
-
- /**
- * Return the enclosed object assuming implicit tagging.
- *
- * @param derTagNo the type tag that should be applied to the object's contents.
- * @return the resulting object
- * @throws IOException if reconstruction fails.
- */
- public Asn1Object GetObject(
- int derTagNo)
- {
- if (derTagNo >= 0x1f)
- throw new IOException("unsupported tag number");
-
- byte[] orig = this.GetEncoded();
- byte[] tmp = ReplaceTagNumber(derTagNo, orig);
-
- if ((orig[0] & Asn1Tags.Constructed) != 0)
- {
- tmp[0] |= Asn1Tags.Constructed;
- }
-
- return FromByteArray(tmp);
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- int classBits = Asn1Tags.Application;
- if (isConstructed)
- {
- classBits |= Asn1Tags.Constructed;
- }
-
- derOut.WriteEncoded(classBits, tag, octets);
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerApplicationSpecific other = asn1Object as DerApplicationSpecific;
-
- if (other == null)
- return false;
-
- return this.isConstructed == other.isConstructed
- && this.tag == other.tag
- && Arrays.AreEqual(this.octets, other.octets);
- }
-
- protected override int Asn1GetHashCode()
- {
- return isConstructed.GetHashCode() ^ tag.GetHashCode() ^ Arrays.GetHashCode(octets);
- }
-
- private byte[] ReplaceTagNumber(
- int newTag,
- byte[] input)
- {
- int tagNo = input[0] & 0x1f;
- int index = 1;
- //
- // with tagged object tag number is bottom 5 bits, or stored at the start of the content
- //
- if (tagNo == 0x1f)
- {
- tagNo = 0;
-
- int b = input[index++] & 0xff;
-
- // X.690-0207 8.1.2.4.2
- // "c) bits 7 to 1 of the first subsequent octet shall not all be zero."
- if ((b & 0x7f) == 0) // Note: -1 will pass
- {
- throw new InvalidOperationException("corrupted stream - invalid high tag number found");
- }
-
- while ((b >= 0) && ((b & 0x80) != 0))
- {
- tagNo |= (b & 0x7f);
- tagNo <<= 7;
- b = input[index++] & 0xff;
- }
-
- tagNo |= (b & 0x7f);
- }
-
- byte[] tmp = new byte[input.Length - index + 1];
-
- Array.Copy(input, index, tmp, 1, tmp.Length - 1);
-
- tmp[0] = (byte)newTag;
-
- return tmp;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerBMPString.cs b/BCCrypto/src/asn1/DerBMPString.cs
deleted file mode 100644
index 33d950f..0000000
--- a/BCCrypto/src/asn1/DerBMPString.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * Der BMPString object.
- */
- public class DerBmpString
- : DerStringBase
- {
- private readonly string str;
-
- /**
- * return a BMP string from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerBmpString GetInstance(
- object obj)
- {
- if (obj == null || obj is DerBmpString)
- {
- return (DerBmpString)obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return a BMP string from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerBmpString GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerBmpString)
- {
- return GetInstance(o);
- }
-
- return new DerBmpString(Asn1OctetString.GetInstance(o).GetOctets());
- }
-
- /**
- * basic constructor - byte encoded string.
- */
- public DerBmpString(
- byte[] str)
- {
- if (str == null)
- throw new ArgumentNullException("str");
-
- char[] cs = new char[str.Length / 2];
-
- for (int i = 0; i != cs.Length; i++)
- {
- cs[i] = (char)((str[2 * i] << 8) | (str[2 * i + 1] & 0xff));
- }
-
- this.str = new string(cs);
- }
-
- /**
- * basic constructor
- */
- public DerBmpString(
- string str)
- {
- if (str == null)
- throw new ArgumentNullException("str");
-
- this.str = str;
- }
-
- public override string GetString()
- {
- return str;
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerBmpString other = asn1Object as DerBmpString;
-
- if (other == null)
- return false;
-
- return this.str.Equals(other.str);
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- char[] c = str.ToCharArray();
- byte[] b = new byte[c.Length * 2];
-
- for (int i = 0; i != c.Length; i++)
- {
- b[2 * i] = (byte)(c[i] >> 8);
- b[2 * i + 1] = (byte)c[i];
- }
-
- derOut.WriteEncoded(Asn1Tags.BmpString, b);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerBitString.cs b/BCCrypto/src/asn1/DerBitString.cs
deleted file mode 100644
index 26adc57..0000000
--- a/BCCrypto/src/asn1/DerBitString.cs
+++ /dev/null
@@ -1,276 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.Text;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerBitString
- : DerStringBase
- {
- private static readonly char[] table
- = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
-
- protected readonly byte[] mData;
- protected readonly int mPadBits;
-
- /**
- * return a Bit string from the passed in object
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerBitString GetInstance(
- object obj)
- {
- if (obj == null || obj is DerBitString)
- {
- return (DerBitString) obj;
- }
- if (obj is byte[])
- {
- try
- {
- return (DerBitString)FromByteArray((byte[])obj);
- }
- catch (Exception e)
- {
- throw new ArgumentException("encoding error in GetInstance: " + e.ToString());
- }
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return a Bit string from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerBitString GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerBitString)
- {
- return GetInstance(o);
- }
-
- return FromAsn1Octets(((Asn1OctetString)o).GetOctets());
- }
-
- /**
- * @param data the octets making up the bit string.
- * @param padBits the number of extra bits at the end of the string.
- */
- public DerBitString(
- byte[] data,
- int padBits)
- {
- if (data == null)
- throw new ArgumentNullException("data");
- if (padBits < 0 || padBits > 7)
- throw new ArgumentException("must be in the range 0 to 7", "padBits");
- if (data.Length == 0 && padBits != 0)
- throw new ArgumentException("if 'data' is empty, 'padBits' must be 0");
-
- this.mData = Arrays.Clone(data);
- this.mPadBits = padBits;
- }
-
- public DerBitString(
- byte[] data)
- : this(data, 0)
- {
- }
-
- public DerBitString(
- int namedBits)
- {
- if (namedBits == 0)
- {
- this.mData = new byte[0];
- this.mPadBits = 0;
- return;
- }
-
- int bits = BigInteger.BitLen(namedBits);
- int bytes = (bits + 7) / 8;
-
- Debug.Assert(0 < bytes && bytes <= 4);
-
- byte[] data = new byte[bytes];
- --bytes;
-
- for (int i = 0; i < bytes; i++)
- {
- data[i] = (byte)namedBits;
- namedBits >>= 8;
- }
-
- Debug.Assert((namedBits & 0xFF) != 0);
-
- data[bytes] = (byte)namedBits;
-
- int padBits = 0;
- while ((namedBits & (1 << padBits)) == 0)
- {
- ++padBits;
- }
-
- Debug.Assert(padBits < 8);
-
- this.mData = data;
- this.mPadBits = padBits;
- }
-
- public DerBitString(
- Asn1Encodable obj)
- : this(obj.GetDerEncoded())
- {
- }
-
- /**
- * Return the octets contained in this BIT STRING, checking that this BIT STRING really
- * does represent an octet aligned string. Only use this method when the standard you are
- * following dictates that the BIT STRING will be octet aligned.
- *
- * @return a copy of the octet aligned data.
- */
- public virtual byte[] GetOctets()
- {
- if (mPadBits != 0)
- throw new InvalidOperationException("attempt to get non-octet aligned data from BIT STRING");
-
- return Arrays.Clone(mData);
- }
-
- public virtual byte[] GetBytes()
- {
- byte[] data = Arrays.Clone(mData);
-
- // DER requires pad bits be zero
- if (mPadBits > 0)
- {
- data[data.Length - 1] &= (byte)(0xFF << mPadBits);
- }
-
- return data;
- }
-
- public virtual int PadBits
- {
- get { return mPadBits; }
- }
-
- /**
- * @return the value of the bit string as an int (truncating if necessary)
- */
- public virtual int IntValue
- {
- get
- {
- int value = 0, length = System.Math.Min(4, mData.Length);
- for (int i = 0; i < length; ++i)
- {
- value |= (int)mData[i] << (8 * i);
- }
- if (mPadBits > 0 && length == mData.Length)
- {
- int mask = (1 << mPadBits) - 1;
- value &= ~(mask << (8 * (length - 1)));
- }
- return value;
- }
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- if (mPadBits > 0)
- {
- int last = mData[mData.Length - 1];
- int mask = (1 << mPadBits) - 1;
- int unusedBits = last & mask;
-
- if (unusedBits != 0)
- {
- byte[] contents = Arrays.Prepend(mData, (byte)mPadBits);
-
- /*
- * X.690-0207 11.2.1: Each unused bit in the final octet of the encoding of a bit string value shall be set to zero.
- */
- contents[contents.Length - 1] = (byte)(last ^ unusedBits);
-
- derOut.WriteEncoded(Asn1Tags.BitString, contents);
- return;
- }
- }
-
- derOut.WriteEncoded(Asn1Tags.BitString, (byte)mPadBits, mData);
- }
-
- protected override int Asn1GetHashCode()
- {
- return mPadBits.GetHashCode() ^ Arrays.GetHashCode(mData);
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerBitString other = asn1Object as DerBitString;
-
- if (other == null)
- return false;
-
- return this.mPadBits == other.mPadBits
- && Arrays.AreEqual(this.mData, other.mData);
- }
-
- public override string GetString()
- {
- StringBuilder buffer = new StringBuilder("#");
-
- byte[] str = GetDerEncoded();
-
- for (int i = 0; i != str.Length; i++)
- {
- uint ubyte = str[i];
- buffer.Append(table[(ubyte >> 4) & 0xf]);
- buffer.Append(table[str[i] & 0xf]);
- }
-
- return buffer.ToString();
- }
-
- internal static DerBitString FromAsn1Octets(byte[] octets)
- {
- if (octets.Length < 1)
- throw new ArgumentException("truncated BIT STRING detected", "octets");
-
- int padBits = octets[0];
- byte[] data = Arrays.CopyOfRange(octets, 1, octets.Length);
-
- if (padBits > 0 && padBits < 8 && data.Length > 0)
- {
- int last = data[data.Length - 1];
- int mask = (1 << padBits) - 1;
-
- if ((last & mask) != 0)
- {
- return new BerBitString(data, padBits);
- }
- }
-
- return new DerBitString(data, padBits);
- }
- }
-}
-
diff --git a/BCCrypto/src/asn1/DerBoolean.cs b/BCCrypto/src/asn1/DerBoolean.cs
deleted file mode 100644
index 709f4dd..0000000
--- a/BCCrypto/src/asn1/DerBoolean.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerBoolean
- : Asn1Object
- {
- private readonly byte value;
-
- public static readonly DerBoolean False = new DerBoolean(false);
- public static readonly DerBoolean True = new DerBoolean(true);
-
- /**
- * return a bool from the passed in object.
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerBoolean GetInstance(
- object obj)
- {
- if (obj == null || obj is DerBoolean)
- {
- return (DerBoolean) obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return a DerBoolean from the passed in bool.
- */
- public static DerBoolean GetInstance(
- bool value)
- {
- return value ? True : False;
- }
-
- /**
- * return a Boolean from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerBoolean GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerBoolean)
- {
- return GetInstance(o);
- }
-
- return FromOctetString(((Asn1OctetString)o).GetOctets());
- }
-
- public DerBoolean(
- byte[] val)
- {
- if (val.Length != 1)
- throw new ArgumentException("byte value should have 1 byte in it", "val");
-
- // TODO Are there any constraints on the possible byte values?
- this.value = val[0];
- }
-
- private DerBoolean(
- bool value)
- {
- this.value = value ? (byte)0xff : (byte)0;
- }
-
- public bool IsTrue
- {
- get { return value != 0; }
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- // TODO Should we make sure the byte value is one of '0' or '0xff' here?
- derOut.WriteEncoded(Asn1Tags.Boolean, new byte[]{ value });
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerBoolean other = asn1Object as DerBoolean;
-
- if (other == null)
- return false;
-
- return IsTrue == other.IsTrue;
- }
-
- protected override int Asn1GetHashCode()
- {
- return IsTrue.GetHashCode();
- }
-
- public override string ToString()
- {
- return IsTrue ? "TRUE" : "FALSE";
- }
-
- internal static DerBoolean FromOctetString(byte[] value)
- {
- if (value.Length != 1)
- {
- throw new ArgumentException("BOOLEAN value should have 1 byte in it", "value");
- }
-
- byte b = value[0];
-
- return b == 0 ? False : b == 0xFF ? True : new DerBoolean(value);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerEnumerated.cs b/BCCrypto/src/asn1/DerEnumerated.cs
deleted file mode 100644
index db27065..0000000
--- a/BCCrypto/src/asn1/DerEnumerated.cs
+++ /dev/null
@@ -1,135 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerEnumerated
- : Asn1Object
- {
- private readonly byte[] bytes;
-
- /**
- * return an integer from the passed in object
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerEnumerated GetInstance(
- object obj)
- {
- if (obj == null || obj is DerEnumerated)
- {
- return (DerEnumerated)obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return an Enumerated from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerEnumerated GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerEnumerated)
- {
- return GetInstance(o);
- }
-
- return FromOctetString(((Asn1OctetString)o).GetOctets());
- }
-
- public DerEnumerated(
- int val)
- {
- bytes = BigInteger.ValueOf(val).ToByteArray();
- }
-
- public DerEnumerated(
- BigInteger val)
- {
- bytes = val.ToByteArray();
- }
-
- public DerEnumerated(
- byte[] bytes)
- {
- if (bytes.Length > 1)
- {
- if (bytes[0] == 0 && (bytes[1] & 0x80) == 0)
- {
- throw new ArgumentException("malformed enumerated");
- }
- if (bytes[0] == (byte)0xff && (bytes[1] & 0x80) != 0)
- {
- throw new ArgumentException("malformed enumerated");
- }
- }
- this.bytes = Arrays.Clone(bytes);
- }
-
- public BigInteger Value
- {
- get { return new BigInteger(bytes); }
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.Enumerated, bytes);
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerEnumerated other = asn1Object as DerEnumerated;
-
- if (other == null)
- return false;
-
- return Arrays.AreEqual(this.bytes, other.bytes);
- }
-
- protected override int Asn1GetHashCode()
- {
- return Arrays.GetHashCode(bytes);
- }
-
- private static readonly DerEnumerated[] cache = new DerEnumerated[12];
-
- internal static DerEnumerated FromOctetString(byte[] enc)
- {
- if (enc.Length == 0)
- {
- throw new ArgumentException("ENUMERATED has zero length", "enc");
- }
-
- if (enc.Length == 1)
- {
- int value = enc[0];
- if (value < cache.Length)
- {
- DerEnumerated cached = cache[value];
- if (cached != null)
- {
- return cached;
- }
-
- return cache[value] = new DerEnumerated(Arrays.Clone(enc));
- }
- }
-
- return new DerEnumerated(Arrays.Clone(enc));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerGeneralString.cs b/BCCrypto/src/asn1/DerGeneralString.cs
deleted file mode 100644
index 553b0e0..0000000
--- a/BCCrypto/src/asn1/DerGeneralString.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerGeneralString
- : DerStringBase
- {
- private readonly string str;
-
- public static DerGeneralString GetInstance(
- object obj)
- {
- if (obj == null || obj is DerGeneralString)
- {
- return (DerGeneralString) obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: "
- + Platform.GetTypeName(obj));
- }
-
- public static DerGeneralString GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerGeneralString)
- {
- return GetInstance(o);
- }
-
- return new DerGeneralString(((Asn1OctetString)o).GetOctets());
- }
-
- public DerGeneralString(
- byte[] str)
- : this(Strings.FromAsciiByteArray(str))
- {
- }
-
- public DerGeneralString(
- string str)
- {
- if (str == null)
- throw new ArgumentNullException("str");
-
- this.str = str;
- }
-
- public override string GetString()
- {
- return str;
- }
-
- public byte[] GetOctets()
- {
- return Strings.ToAsciiByteArray(str);
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.GeneralString, GetOctets());
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerGeneralString other = asn1Object as DerGeneralString;
-
- if (other == null)
- return false;
-
- return this.str.Equals(other.str);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerGeneralizedTime.cs b/BCCrypto/src/asn1/DerGeneralizedTime.cs
deleted file mode 100644
index b224ebe..0000000
--- a/BCCrypto/src/asn1/DerGeneralizedTime.cs
+++ /dev/null
@@ -1,320 +0,0 @@
-using System;
-using System.Globalization;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * Generalized time object.
- */
- public class DerGeneralizedTime
- : Asn1Object
- {
- private readonly string time;
-
- /**
- * return a generalized time from the passed in object
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerGeneralizedTime GetInstance(
- object obj)
- {
- if (obj == null || obj is DerGeneralizedTime)
- {
- return (DerGeneralizedTime)obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * return a Generalized Time object from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerGeneralizedTime GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerGeneralizedTime)
- {
- return GetInstance(o);
- }
-
- return new DerGeneralizedTime(((Asn1OctetString)o).GetOctets());
- }
-
- /**
- * The correct format for this is YYYYMMDDHHMMSS[.f]Z, or without the Z
- * for local time, or Z+-HHMM on the end, for difference between local
- * time and UTC time. The fractional second amount f must consist of at
- * least one number with trailing zeroes removed.
- *
- * @param time the time string.
- * @exception ArgumentException if string is an illegal format.
- */
- public DerGeneralizedTime(
- string time)
- {
- this.time = time;
-
- try
- {
- ToDateTime();
- }
- catch (FormatException e)
- {
- throw new ArgumentException("invalid date string: " + e.Message);
- }
- }
-
- /**
- * base constructor from a local time object
- */
- public DerGeneralizedTime(
- DateTime time)
- {
-#if PORTABLE
- this.time = time.ToUniversalTime().ToString(@"yyyyMMddHHmmss\Z");
-#else
- this.time = time.ToString(@"yyyyMMddHHmmss\Z");
-#endif
- }
-
- internal DerGeneralizedTime(
- byte[] bytes)
- {
- //
- // explicitly convert to characters
- //
- this.time = Strings.FromAsciiByteArray(bytes);
- }
-
- /**
- * Return the time.
- * @return The time string as it appeared in the encoded object.
- */
- public string TimeString
- {
- get { return time; }
- }
-
- /**
- * return the time - always in the form of
- * YYYYMMDDhhmmssGMT(+hh:mm|-hh:mm).
- *
- * Normally in a certificate we would expect "Z" rather than "GMT",
- * however adding the "GMT" means we can just use:
- *
- * dateF = new SimpleDateFormat("yyyyMMddHHmmssz");
- *
- * To read in the time and Get a date which is compatible with our local
- * time zone.
- */
- public string GetTime()
- {
- //
- // standardise the format.
- //
- if (time[time.Length - 1] == 'Z')
- {
- return time.Substring(0, time.Length - 1) + "GMT+00:00";
- }
- else
- {
- int signPos = time.Length - 5;
- char sign = time[signPos];
- if (sign == '-' || sign == '+')
- {
- return time.Substring(0, signPos)
- + "GMT"
- + time.Substring(signPos, 3)
- + ":"
- + time.Substring(signPos + 3);
- }
- else
- {
- signPos = time.Length - 3;
- sign = time[signPos];
- if (sign == '-' || sign == '+')
- {
- return time.Substring(0, signPos)
- + "GMT"
- + time.Substring(signPos)
- + ":00";
- }
- }
- }
-
- return time + CalculateGmtOffset();
- }
-
- private string CalculateGmtOffset()
- {
- char sign = '+';
- DateTime time = ToDateTime();
-
-#if SILVERLIGHT || PORTABLE
- long offset = time.Ticks - time.ToUniversalTime().Ticks;
- if (offset < 0)
- {
- sign = '-';
- offset = -offset;
- }
- int hours = (int)(offset / TimeSpan.TicksPerHour);
- int minutes = (int)(offset / TimeSpan.TicksPerMinute) % 60;
-#else
- // Note: GetUtcOffset incorporates Daylight Savings offset
- TimeSpan offset = TimeZone.CurrentTimeZone.GetUtcOffset(time);
- if (offset.CompareTo(TimeSpan.Zero) < 0)
- {
- sign = '-';
- offset = offset.Duration();
- }
- int hours = offset.Hours;
- int minutes = offset.Minutes;
-#endif
-
- return "GMT" + sign + Convert(hours) + ":" + Convert(minutes);
- }
-
- private static string Convert(
- int time)
- {
- if (time < 10)
- {
- return "0" + time;
- }
-
- return time.ToString();
- }
-
- public DateTime ToDateTime()
- {
- string formatStr;
- string d = time;
- bool makeUniversal = false;
-
- if (Platform.EndsWith(d, "Z"))
- {
- if (HasFractionalSeconds)
- {
- int fCount = d.Length - d.IndexOf('.') - 2;
- formatStr = @"yyyyMMddHHmmss." + FString(fCount) + @"\Z";
- }
- else
- {
- formatStr = @"yyyyMMddHHmmss\Z";
- }
- }
- else if (time.IndexOf('-') > 0 || time.IndexOf('+') > 0)
- {
- d = GetTime();
- makeUniversal = true;
-
- if (HasFractionalSeconds)
- {
- int fCount = Platform.IndexOf(d, "GMT") - 1 - d.IndexOf('.');
- formatStr = @"yyyyMMddHHmmss." + FString(fCount) + @"'GMT'zzz";
- }
- else
- {
- formatStr = @"yyyyMMddHHmmss'GMT'zzz";
- }
- }
- else
- {
- if (HasFractionalSeconds)
- {
- int fCount = d.Length - 1 - d.IndexOf('.');
- formatStr = @"yyyyMMddHHmmss." + FString(fCount);
- }
- else
- {
- formatStr = @"yyyyMMddHHmmss";
- }
-
- // TODO?
-// dateF.setTimeZone(new SimpleTimeZone(0, TimeZone.getDefault().getID()));
- }
-
- return ParseDateString(d, formatStr, makeUniversal);
- }
-
- private string FString(
- int count)
- {
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < count; ++i)
- {
- sb.Append('f');
- }
- return sb.ToString();
- }
-
- private DateTime ParseDateString(string s, string format, bool makeUniversal)
- {
- /*
- * NOTE: DateTime.Kind and DateTimeStyles.AssumeUniversal not available in .NET 1.1
- */
- DateTimeStyles style = DateTimeStyles.None;
- if (Platform.EndsWith(format, "Z"))
- {
- try
- {
- style = (DateTimeStyles)Enums.GetEnumValue(typeof(DateTimeStyles), "AssumeUniversal");
- }
- catch (Exception)
- {
- }
-
- style |= DateTimeStyles.AdjustToUniversal;
- }
-
- DateTime dt = DateTime.ParseExact(s, format, DateTimeFormatInfo.InvariantInfo, style);
-
- return makeUniversal ? dt.ToUniversalTime() : dt;
- }
-
- private bool HasFractionalSeconds
- {
- get { return time.IndexOf('.') == 14; }
- }
-
- private byte[] GetOctets()
- {
- return Strings.ToAsciiByteArray(time);
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.GeneralizedTime, GetOctets());
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerGeneralizedTime other = asn1Object as DerGeneralizedTime;
-
- if (other == null)
- return false;
-
- return this.time.Equals(other.time);
- }
-
- protected override int Asn1GetHashCode()
- {
- return time.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerGraphicString.cs b/BCCrypto/src/asn1/DerGraphicString.cs
deleted file mode 100644
index f213f46..0000000
--- a/BCCrypto/src/asn1/DerGraphicString.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerGraphicString
- : DerStringBase
- {
- private readonly byte[] mString;
-
- /**
- * return a Graphic String from the passed in object
- *
- * @param obj a DerGraphicString or an object that can be converted into one.
- * @exception IllegalArgumentException if the object cannot be converted.
- * @return a DerGraphicString instance, or null.
- */
- public static DerGraphicString GetInstance(object obj)
- {
- if (obj == null || obj is DerGraphicString)
- {
- return (DerGraphicString)obj;
- }
-
- if (obj is byte[])
- {
- try
- {
- return (DerGraphicString)FromByteArray((byte[])obj);
- }
- catch (Exception e)
- {
- throw new ArgumentException("encoding error in GetInstance: " + e.ToString(), "obj");
- }
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * return a Graphic String from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception IllegalArgumentException if the tagged object cannot
- * be converted.
- * @return a DerGraphicString instance, or null.
- */
- public static DerGraphicString GetInstance(Asn1TaggedObject obj, bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerGraphicString)
- {
- return GetInstance(o);
- }
-
- return new DerGraphicString(((Asn1OctetString)o).GetOctets());
- }
-
- /**
- * basic constructor - with bytes.
- * @param string the byte encoding of the characters making up the string.
- */
- public DerGraphicString(byte[] encoding)
- {
- this.mString = Arrays.Clone(encoding);
- }
-
- public override string GetString()
- {
- return Strings.FromByteArray(mString);
- }
-
- public byte[] GetOctets()
- {
- return Arrays.Clone(mString);
- }
-
- internal override void Encode(DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.GraphicString, mString);
- }
-
- protected override int Asn1GetHashCode()
- {
- return Arrays.GetHashCode(mString);
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerGraphicString other = asn1Object as DerGraphicString;
-
- if (other == null)
- return false;
-
- return Arrays.AreEqual(mString, other.mString);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerIA5String.cs b/BCCrypto/src/asn1/DerIA5String.cs
deleted file mode 100644
index 63e9158..0000000
--- a/BCCrypto/src/asn1/DerIA5String.cs
+++ /dev/null
@@ -1,145 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * Der IA5String object - this is an ascii string.
- */
- public class DerIA5String
- : DerStringBase
- {
- private readonly string str;
-
- /**
- * return a IA5 string from the passed in object
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerIA5String GetInstance(
- object obj)
- {
- if (obj == null || obj is DerIA5String)
- {
- return (DerIA5String)obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return an IA5 string from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerIA5String GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerIA5String)
- {
- return GetInstance(o);
- }
-
- return new DerIA5String(((Asn1OctetString)o).GetOctets());
- }
-
- /**
- * basic constructor - with bytes.
- */
- public DerIA5String(
- byte[] str)
- : this(Strings.FromAsciiByteArray(str), false)
- {
- }
-
- /**
- * basic constructor - without validation.
- */
- public DerIA5String(
- string str)
- : this(str, false)
- {
- }
-
- /**
- * Constructor with optional validation.
- *
- * @param string the base string to wrap.
- * @param validate whether or not to check the string.
- * @throws ArgumentException if validate is true and the string
- * contains characters that should not be in an IA5String.
- */
- public DerIA5String(
- string str,
- bool validate)
- {
- if (str == null)
- throw new ArgumentNullException("str");
- if (validate && !IsIA5String(str))
- throw new ArgumentException("string contains illegal characters", "str");
-
- this.str = str;
- }
-
- public override string GetString()
- {
- return str;
- }
-
- public byte[] GetOctets()
- {
- return Strings.ToAsciiByteArray(str);
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.IA5String, GetOctets());
- }
-
- protected override int Asn1GetHashCode()
- {
- return this.str.GetHashCode();
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerIA5String other = asn1Object as DerIA5String;
-
- if (other == null)
- return false;
-
- return this.str.Equals(other.str);
- }
-
- /**
- * return true if the passed in String can be represented without
- * loss as an IA5String, false otherwise.
- *
- * @return true if in printable set, false otherwise.
- */
- public static bool IsIA5String(
- string str)
- {
- foreach (char ch in str)
- {
- if (ch > 0x007f)
- {
- return false;
- }
- }
-
- return true;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerInteger.cs b/BCCrypto/src/asn1/DerInteger.cs
deleted file mode 100644
index 5b240d2..0000000
--- a/BCCrypto/src/asn1/DerInteger.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerInteger
- : Asn1Object
- {
- private readonly byte[] bytes;
-
- /**
- * return an integer from the passed in object
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerInteger GetInstance(
- object obj)
- {
- if (obj == null || obj is DerInteger)
- {
- return (DerInteger)obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return an Integer from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param isExplicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerInteger GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- if (obj == null)
- throw new ArgumentNullException("obj");
-
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerInteger)
- {
- return GetInstance(o);
- }
-
- return new DerInteger(Asn1OctetString.GetInstance(o).GetOctets());
- }
-
- public DerInteger(
- int value)
- {
- bytes = BigInteger.ValueOf(value).ToByteArray();
- }
-
- public DerInteger(
- BigInteger value)
- {
- if (value == null)
- throw new ArgumentNullException("value");
-
- bytes = value.ToByteArray();
- }
-
- public DerInteger(
- byte[] bytes)
- {
- if (bytes.Length > 1)
- {
- if (bytes[0] == 0 && (bytes[1] & 0x80) == 0)
- {
- throw new ArgumentException("malformed integer");
- }
- if (bytes[0] == (byte)0xff && (bytes[1] & 0x80) != 0)
- {
- throw new ArgumentException("malformed integer");
- }
- }
- this.bytes = Arrays.Clone(bytes);
- }
-
- public BigInteger Value
- {
- get { return new BigInteger(bytes); }
- }
-
- /**
- * in some cases positive values Get crammed into a space,
- * that's not quite big enough...
- */
- public BigInteger PositiveValue
- {
- get { return new BigInteger(1, bytes); }
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.Integer, bytes);
- }
-
- protected override int Asn1GetHashCode()
- {
- return Arrays.GetHashCode(bytes);
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerInteger other = asn1Object as DerInteger;
-
- if (other == null)
- return false;
-
- return Arrays.AreEqual(this.bytes, other.bytes);
- }
-
- public override string ToString()
- {
- return Value.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerNull.cs b/BCCrypto/src/asn1/DerNull.cs
deleted file mode 100644
index a802f64..0000000
--- a/BCCrypto/src/asn1/DerNull.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * A Null object.
- */
- public class DerNull
- : Asn1Null
- {
- public static readonly DerNull Instance = new DerNull(0);
-
- byte[] zeroBytes = new byte[0];
-
- [Obsolete("Use static Instance object")]
- public DerNull()
- {
- }
-
- protected internal DerNull(int dummy)
- {
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.Null, zeroBytes);
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- return asn1Object is DerNull;
- }
-
- protected override int Asn1GetHashCode()
- {
- return -1;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerNumericString.cs b/BCCrypto/src/asn1/DerNumericString.cs
deleted file mode 100644
index a729f9e..0000000
--- a/BCCrypto/src/asn1/DerNumericString.cs
+++ /dev/null
@@ -1,138 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * Der NumericString object - this is an ascii string of characters {0,1,2,3,4,5,6,7,8,9, }.
- */
- public class DerNumericString
- : DerStringBase
- {
- private readonly string str;
-
- /**
- * return a Numeric string from the passed in object
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerNumericString GetInstance(
- object obj)
- {
- if (obj == null || obj is DerNumericString)
- {
- return (DerNumericString)obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return an Numeric string from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerNumericString GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerNumericString)
- {
- return GetInstance(o);
- }
-
- return new DerNumericString(Asn1OctetString.GetInstance(o).GetOctets());
- }
-
- /**
- * basic constructor - with bytes.
- */
- public DerNumericString(
- byte[] str)
- : this(Strings.FromAsciiByteArray(str), false)
- {
- }
-
- /**
- * basic constructor - without validation..
- */
- public DerNumericString(
- string str)
- : this(str, false)
- {
- }
-
- /**
- * Constructor with optional validation.
- *
- * @param string the base string to wrap.
- * @param validate whether or not to check the string.
- * @throws ArgumentException if validate is true and the string
- * contains characters that should not be in a NumericString.
- */
- public DerNumericString(
- string str,
- bool validate)
- {
- if (str == null)
- throw new ArgumentNullException("str");
- if (validate && !IsNumericString(str))
- throw new ArgumentException("string contains illegal characters", "str");
-
- this.str = str;
- }
-
- public override string GetString()
- {
- return str;
- }
-
- public byte[] GetOctets()
- {
- return Strings.ToAsciiByteArray(str);
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.NumericString, GetOctets());
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerNumericString other = asn1Object as DerNumericString;
-
- if (other == null)
- return false;
-
- return this.str.Equals(other.str);
- }
-
- /**
- * Return true if the string can be represented as a NumericString ('0'..'9', ' ')
- *
- * @param str string to validate.
- * @return true if numeric, fale otherwise.
- */
- public static bool IsNumericString(
- string str)
- {
- foreach (char ch in str)
- {
- if (ch > 0x007f || (ch != ' ' && !char.IsDigit(ch)))
- return false;
- }
-
- return true;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerObjectIdentifier.cs b/BCCrypto/src/asn1/DerObjectIdentifier.cs
deleted file mode 100644
index 6ac2b7e..0000000
--- a/BCCrypto/src/asn1/DerObjectIdentifier.cs
+++ /dev/null
@@ -1,347 +0,0 @@
-using System;
-using System.IO;
-using System.Text;
-using System.Text.RegularExpressions;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerObjectIdentifier
- : Asn1Object
- {
- private readonly string identifier;
-
- private byte[] body = null;
-
- /**
- * return an Oid from the passed in object
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerObjectIdentifier GetInstance(object obj)
- {
- if (obj == null || obj is DerObjectIdentifier)
- return (DerObjectIdentifier) obj;
- if (obj is byte[])
- return FromOctetString((byte[])obj);
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * return an object Identifier from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerObjectIdentifier GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(obj.GetObject());
- }
-
- public DerObjectIdentifier(
- string identifier)
- {
- if (identifier == null)
- throw new ArgumentNullException("identifier");
- if (!IsValidIdentifier(identifier))
- throw new FormatException("string " + identifier + " not an OID");
-
- this.identifier = identifier;
- }
-
- internal DerObjectIdentifier(DerObjectIdentifier oid, string branchID)
- {
- if (!IsValidBranchID(branchID, 0))
- throw new ArgumentException("string " + branchID + " not a valid OID branch", "branchID");
-
- this.identifier = oid.Id + "." + branchID;
- }
-
- // TODO Change to ID?
- public string Id
- {
- get { return identifier; }
- }
-
- public virtual DerObjectIdentifier Branch(string branchID)
- {
- return new DerObjectIdentifier(this, branchID);
- }
-
- /**
- * Return true if this oid is an extension of the passed in branch, stem.
- * @param stem the arc or branch that is a possible parent.
- * @return true if the branch is on the passed in stem, false otherwise.
- */
- public virtual bool On(DerObjectIdentifier stem)
- {
- string id = Id, stemId = stem.Id;
- return id.Length > stemId.Length && id[stemId.Length] == '.' && Platform.StartsWith(id, stemId);
- }
-
- internal DerObjectIdentifier(byte[] bytes)
- {
- this.identifier = MakeOidStringFromBytes(bytes);
- this.body = Arrays.Clone(bytes);
- }
-
- private void WriteField(
- Stream outputStream,
- long fieldValue)
- {
- byte[] result = new byte[9];
- int pos = 8;
- result[pos] = (byte)(fieldValue & 0x7f);
- while (fieldValue >= (1L << 7))
- {
- fieldValue >>= 7;
- result[--pos] = (byte)((fieldValue & 0x7f) | 0x80);
- }
- outputStream.Write(result, pos, 9 - pos);
- }
-
- private void WriteField(
- Stream outputStream,
- BigInteger fieldValue)
- {
- int byteCount = (fieldValue.BitLength + 6) / 7;
- if (byteCount == 0)
- {
- outputStream.WriteByte(0);
- }
- else
- {
- BigInteger tmpValue = fieldValue;
- byte[] tmp = new byte[byteCount];
- for (int i = byteCount-1; i >= 0; i--)
- {
- tmp[i] = (byte) ((tmpValue.IntValue & 0x7f) | 0x80);
- tmpValue = tmpValue.ShiftRight(7);
- }
- tmp[byteCount-1] &= 0x7f;
- outputStream.Write(tmp, 0, tmp.Length);
- }
- }
-
- private void DoOutput(MemoryStream bOut)
- {
- OidTokenizer tok = new OidTokenizer(identifier);
-
- string token = tok.NextToken();
- int first = int.Parse(token) * 40;
-
- token = tok.NextToken();
- if (token.Length <= 18)
- {
- WriteField(bOut, first + Int64.Parse(token));
- }
- else
- {
- WriteField(bOut, new BigInteger(token).Add(BigInteger.ValueOf(first)));
- }
-
- while (tok.HasMoreTokens)
- {
- token = tok.NextToken();
- if (token.Length <= 18)
- {
- WriteField(bOut, Int64.Parse(token));
- }
- else
- {
- WriteField(bOut, new BigInteger(token));
- }
- }
- }
-
- internal byte[] GetBody()
- {
- lock (this)
- {
- if (body == null)
- {
- MemoryStream bOut = new MemoryStream();
- DoOutput(bOut);
- body = bOut.ToArray();
- }
- }
-
- return body;
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.ObjectIdentifier, GetBody());
- }
-
- protected override int Asn1GetHashCode()
- {
- return identifier.GetHashCode();
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerObjectIdentifier other = asn1Object as DerObjectIdentifier;
-
- if (other == null)
- return false;
-
- return this.identifier.Equals(other.identifier);
- }
-
- public override string ToString()
- {
- return identifier;
- }
-
- private static bool IsValidBranchID(
- String branchID, int start)
- {
- bool periodAllowed = false;
-
- int pos = branchID.Length;
- while (--pos >= start)
- {
- char ch = branchID[pos];
-
- // TODO Leading zeroes?
- if ('0' <= ch && ch <= '9')
- {
- periodAllowed = true;
- continue;
- }
-
- if (ch == '.')
- {
- if (!periodAllowed)
- return false;
-
- periodAllowed = false;
- continue;
- }
-
- return false;
- }
-
- return periodAllowed;
- }
-
- private static bool IsValidIdentifier(string identifier)
- {
- if (identifier.Length < 3 || identifier[1] != '.')
- return false;
-
- char first = identifier[0];
- if (first < '0' || first > '2')
- return false;
-
- return IsValidBranchID(identifier, 2);
- }
-
- private const long LONG_LIMIT = (long.MaxValue >> 7) - 0x7f;
-
- private static string MakeOidStringFromBytes(
- byte[] bytes)
- {
- StringBuilder objId = new StringBuilder();
- long value = 0;
- BigInteger bigValue = null;
- bool first = true;
-
- for (int i = 0; i != bytes.Length; i++)
- {
- int b = bytes[i];
-
- if (value <= LONG_LIMIT)
- {
- value += (b & 0x7f);
- if ((b & 0x80) == 0) // end of number reached
- {
- if (first)
- {
- if (value < 40)
- {
- objId.Append('0');
- }
- else if (value < 80)
- {
- objId.Append('1');
- value -= 40;
- }
- else
- {
- objId.Append('2');
- value -= 80;
- }
- first = false;
- }
-
- objId.Append('.');
- objId.Append(value);
- value = 0;
- }
- else
- {
- value <<= 7;
- }
- }
- else
- {
- if (bigValue == null)
- {
- bigValue = BigInteger.ValueOf(value);
- }
- bigValue = bigValue.Or(BigInteger.ValueOf(b & 0x7f));
- if ((b & 0x80) == 0)
- {
- if (first)
- {
- objId.Append('2');
- bigValue = bigValue.Subtract(BigInteger.ValueOf(80));
- first = false;
- }
-
- objId.Append('.');
- objId.Append(bigValue);
- bigValue = null;
- value = 0;
- }
- else
- {
- bigValue = bigValue.ShiftLeft(7);
- }
- }
- }
-
- return objId.ToString();
- }
-
- private static readonly DerObjectIdentifier[] cache = new DerObjectIdentifier[1024];
-
- internal static DerObjectIdentifier FromOctetString(byte[] enc)
- {
- int hashCode = Arrays.GetHashCode(enc);
- int first = hashCode & 1023;
-
- lock (cache)
- {
- DerObjectIdentifier entry = cache[first];
- if (entry != null && Arrays.AreEqual(enc, entry.GetBody()))
- {
- return entry;
- }
-
- return cache[first] = new DerObjectIdentifier(enc);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerOctetString.cs b/BCCrypto/src/asn1/DerOctetString.cs
deleted file mode 100644
index c046c94..0000000
--- a/BCCrypto/src/asn1/DerOctetString.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public class DerOctetString
- : Asn1OctetString
- {
- /// The octets making up the octet string.
- public DerOctetString(
- byte[] str)
- : base(str)
- {
- }
-
- public DerOctetString(
- Asn1Encodable obj)
- : base(obj)
- {
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.OctetString, str);
- }
-
- internal static void Encode(
- DerOutputStream derOut,
- byte[] bytes,
- int offset,
- int length)
- {
- derOut.WriteEncoded(Asn1Tags.OctetString, bytes, offset, length);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerOutputStream.cs b/BCCrypto/src/asn1/DerOutputStream.cs
deleted file mode 100644
index 69d5d5f..0000000
--- a/BCCrypto/src/asn1/DerOutputStream.cs
+++ /dev/null
@@ -1,171 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerOutputStream
- : FilterStream
- {
- public DerOutputStream(Stream os)
- : base(os)
- {
- }
-
- private void WriteLength(
- int length)
- {
- if (length > 127)
- {
- int size = 1;
- uint val = (uint)length;
-
- while ((val >>= 8) != 0)
- {
- size++;
- }
-
- WriteByte((byte)(size | 0x80));
-
- for (int i = (size - 1) * 8; i >= 0; i -= 8)
- {
- WriteByte((byte)(length >> i));
- }
- }
- else
- {
- WriteByte((byte)length);
- }
- }
-
- internal void WriteEncoded(
- int tag,
- byte[] bytes)
- {
- WriteByte((byte)tag);
- WriteLength(bytes.Length);
- Write(bytes, 0, bytes.Length);
- }
-
- internal void WriteEncoded(
- int tag,
- byte first,
- byte[] bytes)
- {
- WriteByte((byte)tag);
- WriteLength(bytes.Length + 1);
- WriteByte(first);
- Write(bytes, 0, bytes.Length);
- }
-
- internal void WriteEncoded(
- int tag,
- byte[] bytes,
- int offset,
- int length)
- {
- WriteByte((byte)tag);
- WriteLength(length);
- Write(bytes, offset, length);
- }
-
- internal void WriteTag(
- int flags,
- int tagNo)
- {
- if (tagNo < 31)
- {
- WriteByte((byte)(flags | tagNo));
- }
- else
- {
- WriteByte((byte)(flags | 0x1f));
- if (tagNo < 128)
- {
- WriteByte((byte)tagNo);
- }
- else
- {
- byte[] stack = new byte[5];
- int pos = stack.Length;
-
- stack[--pos] = (byte)(tagNo & 0x7F);
-
- do
- {
- tagNo >>= 7;
- stack[--pos] = (byte)(tagNo & 0x7F | 0x80);
- }
- while (tagNo > 127);
-
- Write(stack, pos, stack.Length - pos);
- }
- }
- }
-
- internal void WriteEncoded(
- int flags,
- int tagNo,
- byte[] bytes)
- {
- WriteTag(flags, tagNo);
- WriteLength(bytes.Length);
- Write(bytes, 0, bytes.Length);
- }
-
- protected void WriteNull()
- {
- WriteByte(Asn1Tags.Null);
- WriteByte(0x00);
- }
-
- [Obsolete("Use version taking an Asn1Encodable arg instead")]
- public virtual void WriteObject(
- object obj)
- {
- if (obj == null)
- {
- WriteNull();
- }
- else if (obj is Asn1Object)
- {
- ((Asn1Object)obj).Encode(this);
- }
- else if (obj is Asn1Encodable)
- {
- ((Asn1Encodable)obj).ToAsn1Object().Encode(this);
- }
- else
- {
- throw new IOException("object not Asn1Object");
- }
- }
-
- public virtual void WriteObject(
- Asn1Encodable obj)
- {
- if (obj == null)
- {
- WriteNull();
- }
- else
- {
- obj.ToAsn1Object().Encode(this);
- }
- }
-
- public virtual void WriteObject(
- Asn1Object obj)
- {
- if (obj == null)
- {
- WriteNull();
- }
- else
- {
- obj.Encode(this);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerPrintableString.cs b/BCCrypto/src/asn1/DerPrintableString.cs
deleted file mode 100644
index e179734..0000000
--- a/BCCrypto/src/asn1/DerPrintableString.cs
+++ /dev/null
@@ -1,163 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * Der PrintableString object.
- */
- public class DerPrintableString
- : DerStringBase
- {
- private readonly string str;
-
- /**
- * return a printable string from the passed in object.
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerPrintableString GetInstance(
- object obj)
- {
- if (obj == null || obj is DerPrintableString)
- {
- return (DerPrintableString)obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return a Printable string from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerPrintableString GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerPrintableString)
- {
- return GetInstance(o);
- }
-
- return new DerPrintableString(Asn1OctetString.GetInstance(o).GetOctets());
- }
-
- /**
- * basic constructor - byte encoded string.
- */
- public DerPrintableString(
- byte[] str)
- : this(Strings.FromAsciiByteArray(str), false)
- {
- }
-
- /**
- * basic constructor - this does not validate the string
- */
- public DerPrintableString(
- string str)
- : this(str, false)
- {
- }
-
- /**
- * Constructor with optional validation.
- *
- * @param string the base string to wrap.
- * @param validate whether or not to check the string.
- * @throws ArgumentException if validate is true and the string
- * contains characters that should not be in a PrintableString.
- */
- public DerPrintableString(
- string str,
- bool validate)
- {
- if (str == null)
- throw new ArgumentNullException("str");
- if (validate && !IsPrintableString(str))
- throw new ArgumentException("string contains illegal characters", "str");
-
- this.str = str;
- }
-
- public override string GetString()
- {
- return str;
- }
-
- public byte[] GetOctets()
- {
- return Strings.ToAsciiByteArray(str);
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.PrintableString, GetOctets());
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerPrintableString other = asn1Object as DerPrintableString;
-
- if (other == null)
- return false;
-
- return this.str.Equals(other.str);
- }
-
- /**
- * return true if the passed in String can be represented without
- * loss as a PrintableString, false otherwise.
- *
- * @return true if in printable set, false otherwise.
- */
- public static bool IsPrintableString(
- string str)
- {
- foreach (char ch in str)
- {
- if (ch > 0x007f)
- return false;
-
- if (char.IsLetterOrDigit(ch))
- continue;
-
-// if (char.IsPunctuation(ch))
-// continue;
-
- switch (ch)
- {
- case ' ':
- case '\'':
- case '(':
- case ')':
- case '+':
- case '-':
- case '.':
- case ':':
- case '=':
- case '?':
- case '/':
- case ',':
- continue;
- }
-
- return false;
- }
-
- return true;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerSequence.cs b/BCCrypto/src/asn1/DerSequence.cs
deleted file mode 100644
index a76cf28..0000000
--- a/BCCrypto/src/asn1/DerSequence.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerSequence
- : Asn1Sequence
- {
- public static readonly DerSequence Empty = new DerSequence();
-
- public static DerSequence FromVector(
- Asn1EncodableVector v)
- {
- return v.Count < 1 ? Empty : new DerSequence(v);
- }
-
- /**
- * create an empty sequence
- */
- public DerSequence()
- : base(0)
- {
- }
-
- /**
- * create a sequence containing one object
- */
- public DerSequence(
- Asn1Encodable obj)
- : base(1)
- {
- AddObject(obj);
- }
-
- public DerSequence(
- params Asn1Encodable[] v)
- : base(v.Length)
- {
- foreach (Asn1Encodable ae in v)
- {
- AddObject(ae);
- }
- }
-
- /**
- * create a sequence containing a vector of objects.
- */
- public DerSequence(
- Asn1EncodableVector v)
- : base(v.Count)
- {
- foreach (Asn1Encodable ae in v)
- {
- AddObject(ae);
- }
- }
-
- /*
- * A note on the implementation:
- *
- * As Der requires the constructed, definite-length model to
- * be used for structured types, this varies slightly from the
- * ASN.1 descriptions given. Rather than just outputing Sequence,
- * we also have to specify Constructed, and the objects length.
- */
- internal override void Encode(
- DerOutputStream derOut)
- {
- // TODO Intermediate buffer could be avoided if we could calculate expected length
- MemoryStream bOut = new MemoryStream();
- DerOutputStream dOut = new DerOutputStream(bOut);
-
- foreach (Asn1Encodable obj in this)
- {
- dOut.WriteObject(obj);
- }
-
- Platform.Dispose(dOut);
-
- byte[] bytes = bOut.ToArray();
-
- derOut.WriteEncoded(Asn1Tags.Sequence | Asn1Tags.Constructed, bytes);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerSet.cs b/BCCrypto/src/asn1/DerSet.cs
deleted file mode 100644
index 3df1a67..0000000
--- a/BCCrypto/src/asn1/DerSet.cs
+++ /dev/null
@@ -1,111 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * A Der encoded set object
- */
- public class DerSet
- : Asn1Set
- {
- public static readonly DerSet Empty = new DerSet();
-
- public static DerSet FromVector(
- Asn1EncodableVector v)
- {
- return v.Count < 1 ? Empty : new DerSet(v);
- }
-
- internal static DerSet FromVector(
- Asn1EncodableVector v,
- bool needsSorting)
- {
- return v.Count < 1 ? Empty : new DerSet(v, needsSorting);
- }
-
- /**
- * create an empty set
- */
- public DerSet()
- : base(0)
- {
- }
-
- /**
- * @param obj - a single object that makes up the set.
- */
- public DerSet(
- Asn1Encodable obj)
- : base(1)
- {
- AddObject(obj);
- }
-
- public DerSet(
- params Asn1Encodable[] v)
- : base(v.Length)
- {
- foreach (Asn1Encodable o in v)
- {
- AddObject(o);
- }
-
- Sort();
- }
-
- /**
- * @param v - a vector of objects making up the set.
- */
- public DerSet(
- Asn1EncodableVector v)
- : this(v, true)
- {
- }
-
- internal DerSet(
- Asn1EncodableVector v,
- bool needsSorting)
- : base(v.Count)
- {
- foreach (Asn1Encodable o in v)
- {
- AddObject(o);
- }
-
- if (needsSorting)
- {
- Sort();
- }
- }
-
- /*
- * A note on the implementation:
- *
- * As Der requires the constructed, definite-length model to
- * be used for structured types, this varies slightly from the
- * ASN.1 descriptions given. Rather than just outputing Set,
- * we also have to specify Constructed, and the objects length.
- */
- internal override void Encode(
- DerOutputStream derOut)
- {
- // TODO Intermediate buffer could be avoided if we could calculate expected length
- MemoryStream bOut = new MemoryStream();
- DerOutputStream dOut = new DerOutputStream(bOut);
-
- foreach (Asn1Encodable obj in this)
- {
- dOut.WriteObject(obj);
- }
-
- Platform.Dispose(dOut);
-
- byte[] bytes = bOut.ToArray();
-
- derOut.WriteEncoded(Asn1Tags.Set | Asn1Tags.Constructed, bytes);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerStringBase.cs b/BCCrypto/src/asn1/DerStringBase.cs
deleted file mode 100644
index 2a5fb04..0000000
--- a/BCCrypto/src/asn1/DerStringBase.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public abstract class DerStringBase
- : Asn1Object, IAsn1String
- {
- protected DerStringBase()
- {
- }
-
- public abstract string GetString();
-
- public override string ToString()
- {
- return GetString();
- }
-
- protected override int Asn1GetHashCode()
- {
- return GetString().GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerT61String.cs b/BCCrypto/src/asn1/DerT61String.cs
deleted file mode 100644
index 746ccfe..0000000
--- a/BCCrypto/src/asn1/DerT61String.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * Der T61String (also the teletex string) - 8-bit characters
- */
- public class DerT61String
- : DerStringBase
- {
- private readonly string str;
-
- /**
- * return a T61 string from the passed in object.
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerT61String GetInstance(
- object obj)
- {
- if (obj == null || obj is DerT61String)
- {
- return (DerT61String)obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return an T61 string from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerT61String GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerT61String)
- {
- return GetInstance(o);
- }
-
- return new DerT61String(Asn1OctetString.GetInstance(o).GetOctets());
- }
-
- /**
- * basic constructor - with bytes.
- */
- public DerT61String(
- byte[] str)
- : this(Strings.FromByteArray(str))
- {
- }
-
- /**
- * basic constructor - with string.
- */
- public DerT61String(
- string str)
- {
- if (str == null)
- throw new ArgumentNullException("str");
-
- this.str = str;
- }
-
- public override string GetString()
- {
- return str;
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.T61String, GetOctets());
- }
-
- public byte[] GetOctets()
- {
- return Strings.ToByteArray(str);
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerT61String other = asn1Object as DerT61String;
-
- if (other == null)
- return false;
-
- return this.str.Equals(other.str);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerTaggedObject.cs b/BCCrypto/src/asn1/DerTaggedObject.cs
deleted file mode 100644
index 717d724..0000000
--- a/BCCrypto/src/asn1/DerTaggedObject.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * DER TaggedObject - in ASN.1 notation this is any object preceded by
- * a [n] where n is some number - these are assumed to follow the construction
- * rules (as with sequences).
- */
- public class DerTaggedObject
- : Asn1TaggedObject
- {
- /**
- * @param tagNo the tag number for this object.
- * @param obj the tagged object.
- */
- public DerTaggedObject(
- int tagNo,
- Asn1Encodable obj)
- : base(tagNo, obj)
- {
- }
-
- /**
- * @param explicitly true if an explicitly tagged object.
- * @param tagNo the tag number for this object.
- * @param obj the tagged object.
- */
- public DerTaggedObject(
- bool explicitly,
- int tagNo,
- Asn1Encodable obj)
- : base(explicitly, tagNo, obj)
- {
- }
-
- /**
- * create an implicitly tagged object that contains a zero
- * length sequence.
- */
- public DerTaggedObject(
- int tagNo)
- : base(false, tagNo, DerSequence.Empty)
- {
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- if (!IsEmpty())
- {
- byte[] bytes = obj.GetDerEncoded();
-
- if (explicitly)
- {
- derOut.WriteEncoded(Asn1Tags.Constructed | Asn1Tags.Tagged, tagNo, bytes);
- }
- else
- {
- //
- // need to mark constructed types... (preserve Constructed tag)
- //
- int flags = (bytes[0] & Asn1Tags.Constructed) | Asn1Tags.Tagged;
- derOut.WriteTag(flags, tagNo);
- derOut.Write(bytes, 1, bytes.Length - 1);
- }
- }
- else
- {
- derOut.WriteEncoded(Asn1Tags.Constructed | Asn1Tags.Tagged, tagNo, new byte[0]);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerUTCTime.cs b/BCCrypto/src/asn1/DerUTCTime.cs
deleted file mode 100644
index 99af8bf..0000000
--- a/BCCrypto/src/asn1/DerUTCTime.cs
+++ /dev/null
@@ -1,267 +0,0 @@
-using System;
-using System.Globalization;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * UTC time object.
- */
- public class DerUtcTime
- : Asn1Object
- {
- private readonly string time;
-
- /**
- * return an UTC Time from the passed in object.
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerUtcTime GetInstance(
- object obj)
- {
- if (obj == null || obj is DerUtcTime)
- {
- return (DerUtcTime)obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return an UTC Time from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerUtcTime GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerUtcTime)
- {
- return GetInstance(o);
- }
-
- return new DerUtcTime(((Asn1OctetString)o).GetOctets());
- }
-
- /**
- * The correct format for this is YYMMDDHHMMSSZ (it used to be that seconds were
- * never encoded. When you're creating one of these objects from scratch, that's
- * what you want to use, otherwise we'll try to deal with whatever Gets read from
- * the input stream... (this is why the input format is different from the GetTime()
- * method output).
- *
- * @param time the time string.
- */
- public DerUtcTime(
- string time)
- {
- if (time == null)
- throw new ArgumentNullException("time");
-
- this.time = time;
-
- try
- {
- ToDateTime();
- }
- catch (FormatException e)
- {
- throw new ArgumentException("invalid date string: " + e.Message);
- }
- }
-
- /**
- * base constructor from a DateTime object
- */
- public DerUtcTime(
- DateTime time)
- {
-#if PORTABLE
- this.time = time.ToUniversalTime().ToString("yyMMddHHmmss", CultureInfo.InvariantCulture) + "Z";
-#else
- this.time = time.ToString("yyMMddHHmmss", CultureInfo.InvariantCulture) + "Z";
-#endif
- }
-
- internal DerUtcTime(
- byte[] bytes)
- {
- //
- // explicitly convert to characters
- //
- this.time = Strings.FromAsciiByteArray(bytes);
- }
-
-// public DateTime ToDateTime()
-// {
-// string tm = this.AdjustedTimeString;
-//
-// return new DateTime(
-// Int16.Parse(tm.Substring(0, 4)),
-// Int16.Parse(tm.Substring(4, 2)),
-// Int16.Parse(tm.Substring(6, 2)),
-// Int16.Parse(tm.Substring(8, 2)),
-// Int16.Parse(tm.Substring(10, 2)),
-// Int16.Parse(tm.Substring(12, 2)));
-// }
-
- /**
- * return the time as a date based on whatever a 2 digit year will return. For
- * standardised processing use ToAdjustedDateTime().
- *
- * @return the resulting date
- * @exception ParseException if the date string cannot be parsed.
- */
- public DateTime ToDateTime()
- {
- return ParseDateString(TimeString, @"yyMMddHHmmss'GMT'zzz");
- }
-
- /**
- * return the time as an adjusted date
- * in the range of 1950 - 2049.
- *
- * @return a date in the range of 1950 to 2049.
- * @exception ParseException if the date string cannot be parsed.
- */
- public DateTime ToAdjustedDateTime()
- {
- return ParseDateString(AdjustedTimeString, @"yyyyMMddHHmmss'GMT'zzz");
- }
-
- private DateTime ParseDateString(
- string dateStr,
- string formatStr)
- {
- DateTime dt = DateTime.ParseExact(
- dateStr,
- formatStr,
- DateTimeFormatInfo.InvariantInfo);
-
- return dt.ToUniversalTime();
- }
-
- /**
- * return the time - always in the form of
- * YYMMDDhhmmssGMT(+hh:mm|-hh:mm).
- *
- * Normally in a certificate we would expect "Z" rather than "GMT",
- * however adding the "GMT" means we can just use:
- *
- * dateF = new SimpleDateFormat("yyMMddHHmmssz");
- *
- * To read in the time and Get a date which is compatible with our local
- * time zone.
- *
- * Note: In some cases, due to the local date processing, this
- * may lead to unexpected results. If you want to stick the normal
- * convention of 1950 to 2049 use the GetAdjustedTime() method.
- */
- public string TimeString
- {
- get
- {
- //
- // standardise the format.
- //
- if (time.IndexOf('-') < 0 && time.IndexOf('+') < 0)
- {
- if (time.Length == 11)
- {
- return time.Substring(0, 10) + "00GMT+00:00";
- }
- else
- {
- return time.Substring(0, 12) + "GMT+00:00";
- }
- }
- else
- {
- int index = time.IndexOf('-');
- if (index < 0)
- {
- index = time.IndexOf('+');
- }
- string d = time;
-
- if (index == time.Length - 3)
- {
- d += "00";
- }
-
- if (index == 10)
- {
- return d.Substring(0, 10) + "00GMT" + d.Substring(10, 3) + ":" + d.Substring(13, 2);
- }
- else
- {
- return d.Substring(0, 12) + "GMT" + d.Substring(12, 3) + ":" + d.Substring(15, 2);
- }
- }
- }
- }
-
- [Obsolete("Use 'AdjustedTimeString' property instead")]
- public string AdjustedTime
- {
- get { return AdjustedTimeString; }
- }
-
- ///
- /// Return a time string as an adjusted date with a 4 digit year.
- /// This goes in the range of 1950 - 2049.
- ///
- public string AdjustedTimeString
- {
- get
- {
- string d = TimeString;
- string c = d[0] < '5' ? "20" : "19";
-
- return c + d;
- }
- }
-
- private byte[] GetOctets()
- {
- return Strings.ToAsciiByteArray(time);
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.UtcTime, GetOctets());
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerUtcTime other = asn1Object as DerUtcTime;
-
- if (other == null)
- return false;
-
- return this.time.Equals(other.time);
- }
-
- protected override int Asn1GetHashCode()
- {
- return time.GetHashCode();
- }
-
- public override string ToString()
- {
- return time;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerUTF8String.cs b/BCCrypto/src/asn1/DerUTF8String.cs
deleted file mode 100644
index 758a506..0000000
--- a/BCCrypto/src/asn1/DerUTF8String.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * Der UTF8String object.
- */
- public class DerUtf8String
- : DerStringBase
- {
- private readonly string str;
-
- /**
- * return an UTF8 string from the passed in object.
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerUtf8String GetInstance(
- object obj)
- {
- if (obj == null || obj is DerUtf8String)
- {
- return (DerUtf8String)obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return an UTF8 string from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerUtf8String GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerUtf8String)
- {
- return GetInstance(o);
- }
-
- return new DerUtf8String(Asn1OctetString.GetInstance(o).GetOctets());
- }
-
- /**
- * basic constructor - byte encoded string.
- */
- public DerUtf8String(
- byte[] str)
- : this(Encoding.UTF8.GetString(str, 0, str.Length))
- {
- }
-
- /**
- * basic constructor
- */
- public DerUtf8String(
- string str)
- {
- if (str == null)
- throw new ArgumentNullException("str");
-
- this.str = str;
- }
-
- public override string GetString()
- {
- return str;
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerUtf8String other = asn1Object as DerUtf8String;
-
- if (other == null)
- return false;
-
- return this.str.Equals(other.str);
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.Utf8String, Encoding.UTF8.GetBytes(str));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerUniversalString.cs b/BCCrypto/src/asn1/DerUniversalString.cs
deleted file mode 100644
index 284d0f8..0000000
--- a/BCCrypto/src/asn1/DerUniversalString.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * Der UniversalString object.
- */
- public class DerUniversalString
- : DerStringBase
- {
- private static readonly char[] table = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
-
- private readonly byte[] str;
-
- /**
- * return a Universal string from the passed in object.
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerUniversalString GetInstance(
- object obj)
- {
- if (obj == null || obj is DerUniversalString)
- {
- return (DerUniversalString)obj;
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return a Universal string from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerUniversalString GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerUniversalString)
- {
- return GetInstance(o);
- }
-
- return new DerUniversalString(Asn1OctetString.GetInstance(o).GetOctets());
- }
-
- /**
- * basic constructor - byte encoded string.
- */
- public DerUniversalString(
- byte[] str)
- {
- if (str == null)
- throw new ArgumentNullException("str");
-
- this.str = str;
- }
-
- public override string GetString()
- {
- StringBuilder buffer = new StringBuilder("#");
- byte[] enc = GetDerEncoded();
-
- for (int i = 0; i != enc.Length; i++)
- {
- uint ubyte = enc[i];
- buffer.Append(table[(ubyte >> 4) & 0xf]);
- buffer.Append(table[enc[i] & 0xf]);
- }
-
- return buffer.ToString();
- }
-
- public byte[] GetOctets()
- {
- return (byte[]) str.Clone();
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.UniversalString, this.str);
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerUniversalString other = asn1Object as DerUniversalString;
-
- if (other == null)
- return false;
-
-// return this.GetString().Equals(other.GetString());
- return Arrays.AreEqual(this.str, other.str);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerVideotexString.cs b/BCCrypto/src/asn1/DerVideotexString.cs
deleted file mode 100644
index b254010..0000000
--- a/BCCrypto/src/asn1/DerVideotexString.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class DerVideotexString
- : DerStringBase
- {
- private readonly byte[] mString;
-
- /**
- * return a Videotex String from the passed in object
- *
- * @param obj a DERVideotexString or an object that can be converted into one.
- * @exception IllegalArgumentException if the object cannot be converted.
- * @return a DERVideotexString instance, or null.
- */
- public static DerVideotexString GetInstance(object obj)
- {
- if (obj == null || obj is DerVideotexString)
- {
- return (DerVideotexString)obj;
- }
-
- if (obj is byte[])
- {
- try
- {
- return (DerVideotexString)FromByteArray((byte[])obj);
- }
- catch (Exception e)
- {
- throw new ArgumentException("encoding error in GetInstance: " + e.ToString(), "obj");
- }
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * return a Videotex String from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception IllegalArgumentException if the tagged object cannot
- * be converted.
- * @return a DERVideotexString instance, or null.
- */
- public static DerVideotexString GetInstance(Asn1TaggedObject obj, bool isExplicit)
- {
- Asn1Object o = obj.GetObject();
-
- if (isExplicit || o is DerVideotexString)
- {
- return GetInstance(o);
- }
-
- return new DerVideotexString(((Asn1OctetString)o).GetOctets());
- }
-
- /**
- * basic constructor - with bytes.
- * @param string the byte encoding of the characters making up the string.
- */
- public DerVideotexString(byte[] encoding)
- {
- this.mString = Arrays.Clone(encoding);
- }
-
- public override string GetString()
- {
- return Strings.FromByteArray(mString);
- }
-
- public byte[] GetOctets()
- {
- return Arrays.Clone(mString);
- }
-
- internal override void Encode(DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.VideotexString, mString);
- }
-
- protected override int Asn1GetHashCode()
- {
- return Arrays.GetHashCode(mString);
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerVideotexString other = asn1Object as DerVideotexString;
-
- if (other == null)
- return false;
-
- return Arrays.AreEqual(mString, other.mString);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/DerVisibleString.cs b/BCCrypto/src/asn1/DerVisibleString.cs
deleted file mode 100644
index e111220..0000000
--- a/BCCrypto/src/asn1/DerVisibleString.cs
+++ /dev/null
@@ -1,111 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * Der VisibleString object.
- */
- public class DerVisibleString
- : DerStringBase
- {
- private readonly string str;
-
- /**
- * return a Visible string from the passed in object.
- *
- * @exception ArgumentException if the object cannot be converted.
- */
- public static DerVisibleString GetInstance(
- object obj)
- {
- if (obj == null || obj is DerVisibleString)
- {
- return (DerVisibleString)obj;
- }
-
- if (obj is Asn1OctetString)
- {
- return new DerVisibleString(((Asn1OctetString)obj).GetOctets());
- }
-
- if (obj is Asn1TaggedObject)
- {
- return GetInstance(((Asn1TaggedObject)obj).GetObject());
- }
-
- throw new ArgumentException("illegal object in GetInstance: " + Platform.GetTypeName(obj));
- }
-
- /**
- * return a Visible string from a tagged object.
- *
- * @param obj the tagged object holding the object we want
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the tagged object cannot
- * be converted.
- */
- public static DerVisibleString GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(obj.GetObject());
- }
-
- /**
- * basic constructor - byte encoded string.
- */
- public DerVisibleString(
- byte[] str)
- : this(Strings.FromAsciiByteArray(str))
- {
- }
-
- /**
- * basic constructor
- */
- public DerVisibleString(
- string str)
- {
- if (str == null)
- throw new ArgumentNullException("str");
-
- this.str = str;
- }
-
- public override string GetString()
- {
- return str;
- }
-
- public byte[] GetOctets()
- {
- return Strings.ToAsciiByteArray(str);
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- derOut.WriteEncoded(Asn1Tags.VisibleString, GetOctets());
- }
-
- protected override bool Asn1Equals(
- Asn1Object asn1Object)
- {
- DerVisibleString other = asn1Object as DerVisibleString;
-
- if (other == null)
- return false;
-
- return this.str.Equals(other.str);
- }
-
- protected override int Asn1GetHashCode()
- {
- return this.str.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/IAsn1ApplicationSpecificParser.cs b/BCCrypto/src/asn1/IAsn1ApplicationSpecificParser.cs
deleted file mode 100644
index 89cf64c..0000000
--- a/BCCrypto/src/asn1/IAsn1ApplicationSpecificParser.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1
-{
- public interface IAsn1ApplicationSpecificParser
- : IAsn1Convertible
- {
- IAsn1Convertible ReadObject();
- }
-}
diff --git a/BCCrypto/src/asn1/IAsn1Choice.cs b/BCCrypto/src/asn1/IAsn1Choice.cs
deleted file mode 100644
index ecd76e4..0000000
--- a/BCCrypto/src/asn1/IAsn1Choice.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * Marker interface for CHOICE objects - if you implement this in a roll-your-own
- * object, any attempt to tag the object implicitly will convert the tag to an
- * explicit one as the encoding rules require.
- *
- * If you use this interface your class should also implement the getInstance
- * pattern which takes a tag object and the tagging mode used.
- *
- */
- public interface IAsn1Choice
- {
- // marker interface
- }
-}
diff --git a/BCCrypto/src/asn1/IAsn1Convertible.cs b/BCCrypto/src/asn1/IAsn1Convertible.cs
deleted file mode 100644
index d3f83af..0000000
--- a/BCCrypto/src/asn1/IAsn1Convertible.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- public interface IAsn1Convertible
- {
- Asn1Object ToAsn1Object();
- }
-}
diff --git a/BCCrypto/src/asn1/IAsn1String.cs b/BCCrypto/src/asn1/IAsn1String.cs
deleted file mode 100644
index cbc2635..0000000
--- a/BCCrypto/src/asn1/IAsn1String.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * basic interface for Der string objects.
- */
- public interface IAsn1String
- {
- string GetString();
- }
-}
diff --git a/BCCrypto/src/asn1/IndefiniteLengthInputStream.cs b/BCCrypto/src/asn1/IndefiniteLengthInputStream.cs
deleted file mode 100644
index 09d0e3a..0000000
--- a/BCCrypto/src/asn1/IndefiniteLengthInputStream.cs
+++ /dev/null
@@ -1,170 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- class IndefiniteLengthInputStream
- : LimitedInputStream
- {
- private int _lookAhead;
- private bool _eofOn00 = true;
-
- internal IndefiniteLengthInputStream(
- Stream inStream,
- int limit)
- : base(inStream, limit)
- {
- _lookAhead = RequireByte();
- CheckForEof();
- }
-
- internal void SetEofOn00(
- bool eofOn00)
- {
- _eofOn00 = eofOn00;
- if (_eofOn00)
- {
- CheckForEof();
- }
- }
-
- private bool CheckForEof()
- {
- if (_lookAhead == 0x00)
- {
- int extra = RequireByte();
- if (extra != 0)
- {
- throw new IOException("malformed end-of-contents marker");
- }
-
- _lookAhead = -1;
- SetParentEofDetect(true);
- return true;
- }
- return _lookAhead < 0;
- }
-
- public override int Read(
- byte[] buffer,
- int offset,
- int count)
- {
- // Only use this optimisation if we aren't checking for 00
- if (_eofOn00 || count <= 1)
- return base.Read(buffer, offset, count);
-
- if (_lookAhead < 0)
- return 0;
-
- int numRead = _in.Read(buffer, offset + 1, count - 1);
-
- if (numRead <= 0)
- {
- // Corrupted stream
- throw new EndOfStreamException();
- }
-
- buffer[offset] = (byte)_lookAhead;
- _lookAhead = RequireByte();
-
- return numRead + 1;
- }
-
- public override int ReadByte()
- {
- if (_eofOn00 && CheckForEof())
- return -1;
-
- int result = _lookAhead;
- _lookAhead = RequireByte();
- return result;
- }
-
- private int RequireByte()
- {
- int b = _in.ReadByte();
- if (b < 0)
- {
- // Corrupted stream
- throw new EndOfStreamException();
- }
- return b;
- }
- }
-}
-
-//using System;
-//using System.IO;
-
-//namespace Org.BouncyCastle.Asn1
-//{
-// class IndefiniteLengthInputStream
-// : LimitedInputStream
-// {
-// private bool _eofReached = false;
-// private bool _eofOn00 = true;
-
-// internal IndefiniteLengthInputStream(
-// Stream inStream,
-// int limit)
-// : base(inStream, limit)
-// {
-// }
-
-// internal void SetEofOn00(
-// bool eofOn00)
-// {
-// _eofOn00 = eofOn00;
-// }
-
-// public override int Read(
-// byte[] buffer,
-// int offset,
-// int count)
-// {
-// if (_eofReached)
-// return 0;
-
-// if (_eofOn00)
-// return base.Read(buffer, offset, count);
-
-// int numRead = _in.Read(buffer, offset, count);
-
-// if (numRead <= 0)
-// throw new EndOfStreamException();
-
-// return numRead;
-// }
-
-// public override int ReadByte()
-// {
-// if (_eofReached)
-// return -1;
-
-// int b1 = _in.ReadByte();
-
-// if (b1 < 0)
-// throw new EndOfStreamException();
-
-// if (b1 == 0 && _eofOn00)
-// {
-// int b2 = _in.ReadByte();
-
-// if (b2 < 0)
-// throw new EndOfStreamException();
-
-// if (b2 == 0)
-// {
-// _eofReached = true;
-// SetParentEofDetect(true);
-// return -1;
-// }
-
-// throw new InvalidDataException();
-// }
-
-// return b1;
-// }
-// }
-//}
diff --git a/BCCrypto/src/asn1/LazyASN1InputStream.cs b/BCCrypto/src/asn1/LazyASN1InputStream.cs
deleted file mode 100644
index 4cf2305..0000000
--- a/BCCrypto/src/asn1/LazyASN1InputStream.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- public class LazyAsn1InputStream
- : Asn1InputStream
- {
- public LazyAsn1InputStream(
- byte[] input)
- : base(input)
- {
- }
-
- public LazyAsn1InputStream(
- Stream inputStream)
- : base(inputStream)
- {
- }
-
- internal override DerSequence CreateDerSequence(
- DefiniteLengthInputStream dIn)
- {
- return new LazyDerSequence(dIn.ToArray());
- }
-
- internal override DerSet CreateDerSet(
- DefiniteLengthInputStream dIn)
- {
- return new LazyDerSet(dIn.ToArray());
- }
- }
-}
diff --git a/BCCrypto/src/asn1/LazyDERSequence.cs b/BCCrypto/src/asn1/LazyDERSequence.cs
deleted file mode 100644
index 7301bc1..0000000
--- a/BCCrypto/src/asn1/LazyDERSequence.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-using System.Collections;
-using System.Diagnostics;
-
-namespace Org.BouncyCastle.Asn1
-{
- internal class LazyDerSequence
- : DerSequence
- {
- private byte[] encoded;
-
- internal LazyDerSequence(
- byte[] encoded)
- {
- this.encoded = encoded;
- }
-
- private void Parse()
- {
- lock (this)
- {
- if (encoded != null)
- {
- Asn1InputStream e = new LazyAsn1InputStream(encoded);
-
- Asn1Object o;
- while ((o = e.ReadObject()) != null)
- {
- AddObject(o);
- }
-
- encoded = null;
- }
- }
- }
-
- public override Asn1Encodable this[int index]
- {
- get
- {
- Parse();
-
- return base[index];
- }
- }
-
- public override IEnumerator GetEnumerator()
- {
- Parse();
-
- return base.GetEnumerator();
- }
-
- public override int Count
- {
- get
- {
- Parse();
-
- return base.Count;
- }
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- lock (this)
- {
- if (encoded == null)
- {
- base.Encode(derOut);
- }
- else
- {
- derOut.WriteEncoded(Asn1Tags.Sequence | Asn1Tags.Constructed, encoded);
- }
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/LazyDERSet.cs b/BCCrypto/src/asn1/LazyDERSet.cs
deleted file mode 100644
index e6c9319..0000000
--- a/BCCrypto/src/asn1/LazyDERSet.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-using System.Collections;
-using System.Diagnostics;
-
-namespace Org.BouncyCastle.Asn1
-{
- internal class LazyDerSet
- : DerSet
- {
- private byte[] encoded;
-
- internal LazyDerSet(
- byte[] encoded)
- {
- this.encoded = encoded;
- }
-
- private void Parse()
- {
- lock (this)
- {
- if (encoded != null)
- {
- Asn1InputStream e = new LazyAsn1InputStream(encoded);
-
- Asn1Object o;
- while ((o = e.ReadObject()) != null)
- {
- AddObject(o);
- }
-
- encoded = null;
- }
- }
- }
-
- public override Asn1Encodable this[int index]
- {
- get
- {
- Parse();
-
- return base[index];
- }
- }
-
- public override IEnumerator GetEnumerator()
- {
- Parse();
-
- return base.GetEnumerator();
- }
-
- public override int Count
- {
- get
- {
- Parse();
-
- return base.Count;
- }
- }
-
- internal override void Encode(
- DerOutputStream derOut)
- {
- lock (this)
- {
- if (encoded == null)
- {
- base.Encode(derOut);
- }
- else
- {
- derOut.WriteEncoded(Asn1Tags.Set | Asn1Tags.Constructed, encoded);
- }
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/LimitedInputStream.cs b/BCCrypto/src/asn1/LimitedInputStream.cs
deleted file mode 100644
index 62486aa..0000000
--- a/BCCrypto/src/asn1/LimitedInputStream.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Asn1
-{
- internal abstract class LimitedInputStream
- : BaseInputStream
- {
- protected readonly Stream _in;
- private int _limit;
-
- internal LimitedInputStream(
- Stream inStream,
- int limit)
- {
- this._in = inStream;
- this._limit = limit;
- }
-
- internal virtual int GetRemaining()
- {
- // TODO: maybe one day this can become more accurate
- return _limit;
- }
-
- protected virtual void SetParentEofDetect(bool on)
- {
- if (_in is IndefiniteLengthInputStream)
- {
- ((IndefiniteLengthInputStream)_in).SetEofOn00(on);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/OidTokenizer.cs b/BCCrypto/src/asn1/OidTokenizer.cs
deleted file mode 100644
index 6e76e8c..0000000
--- a/BCCrypto/src/asn1/OidTokenizer.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-namespace Org.BouncyCastle.Asn1
-{
- /**
- * class for breaking up an Oid into it's component tokens, ala
- * java.util.StringTokenizer. We need this class as some of the
- * lightweight Java environment don't support classes like
- * StringTokenizer.
- */
- public class OidTokenizer
- {
- private string oid;
- private int index;
-
- public OidTokenizer(
- string oid)
- {
- this.oid = oid;
- }
-
- public bool HasMoreTokens
- {
- get { return index != -1; }
- }
-
- public string NextToken()
- {
- if (index == -1)
- {
- return null;
- }
-
- int end = oid.IndexOf('.', index);
- if (end == -1)
- {
- string lastToken = oid.Substring(index);
- index = -1;
- return lastToken;
- }
-
- string nextToken = oid.Substring(index, end - index);
- index = end + 1;
- return nextToken;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/anssi/ANSSINamedCurves.cs b/BCCrypto/src/asn1/anssi/ANSSINamedCurves.cs
deleted file mode 100644
index d0c90eb..0000000
--- a/BCCrypto/src/asn1/anssi/ANSSINamedCurves.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Asn1.Anssi
-{
- public class AnssiNamedCurves
- {
- private static ECCurve ConfigureCurve(ECCurve curve)
- {
- return curve;
- }
-
- private static BigInteger FromHex(string hex)
- {
- return new BigInteger(1, Hex.Decode(hex));
- }
-
- /*
- * FRP256v1
- */
- internal class Frp256v1Holder
- : X9ECParametersHolder
- {
- private Frp256v1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Frp256v1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger p = FromHex("F1FD178C0B3AD58F10126DE8CE42435B3961ADBCABC8CA6DE8FCF353D86E9C03");
- BigInteger a = FromHex("F1FD178C0B3AD58F10126DE8CE42435B3961ADBCABC8CA6DE8FCF353D86E9C00");
- BigInteger b = FromHex("EE353FCA5428A9300D4ABA754A44C00FDFEC0C9AE4B1A1803075ED967B7BB73F");
- byte[] S = null;
- BigInteger n = FromHex("F1FD178C0B3AD58F10126DE8CE42435B53DC67E140D2BF941FFDD459C6D655E1");
- BigInteger h = BigInteger.One;
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "B6B3D4C356C139EB31183D4749D423958C27D2DCAF98B70164C97A2DD98F5CFF"
- + "6142E0F7C8B204911F9271F0F3ECEF8C2701C307E8E4C9E183115A1554062CFB"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- };
-
-
- private static readonly IDictionary objIds = Platform.CreateHashtable();
- private static readonly IDictionary curves = Platform.CreateHashtable();
- private static readonly IDictionary names = Platform.CreateHashtable();
-
- private static void DefineCurve(
- string name,
- DerObjectIdentifier oid,
- X9ECParametersHolder holder)
- {
- objIds.Add(Platform.ToUpperInvariant(name), oid);
- names.Add(oid, name);
- curves.Add(oid, holder);
- }
-
- static AnssiNamedCurves()
- {
- DefineCurve("FRP256v1", AnssiObjectIdentifiers.FRP256v1, Frp256v1Holder.Instance);
- }
-
- public static X9ECParameters GetByName(
- string name)
- {
- DerObjectIdentifier oid = GetOid(name);
- return oid == null ? null : GetByOid(oid);
- }
-
- /**
- * return the X9ECParameters object for the named curve represented by
- * the passed in object identifier. Null if the curve isn't present.
- *
- * @param oid an object identifier representing a named curve, if present.
- */
- public static X9ECParameters GetByOid(
- DerObjectIdentifier oid)
- {
- X9ECParametersHolder holder = (X9ECParametersHolder)curves[oid];
- return holder == null ? null : holder.Parameters;
- }
-
- /**
- * return the object identifier signified by the passed in name. Null
- * if there is no object identifier associated with name.
- *
- * @return the object identifier associated with name, if present.
- */
- public static DerObjectIdentifier GetOid(
- string name)
- {
- return (DerObjectIdentifier)objIds[Platform.ToUpperInvariant(name)];
- }
-
- /**
- * return the named curve name represented by the given object identifier.
- */
- public static string GetName(
- DerObjectIdentifier oid)
- {
- return (string)names[oid];
- }
-
- /**
- * returns an enumeration containing the name strings for curves
- * contained in this structure.
- */
- public static IEnumerable Names
- {
- get { return new EnumerableProxy(names.Values); }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/anssi/ANSSIObjectIdentifiers.cs b/BCCrypto/src/asn1/anssi/ANSSIObjectIdentifiers.cs
deleted file mode 100644
index d230832..0000000
--- a/BCCrypto/src/asn1/anssi/ANSSIObjectIdentifiers.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Anssi
-{
- public sealed class AnssiObjectIdentifiers
- {
- private AnssiObjectIdentifiers()
- {
- }
-
- public static readonly DerObjectIdentifier FRP256v1 = new DerObjectIdentifier("1.2.250.1.223.101.256.1");
- }
-}
diff --git a/BCCrypto/src/asn1/bc/BCObjectIdentifiers.cs b/BCCrypto/src/asn1/bc/BCObjectIdentifiers.cs
deleted file mode 100644
index 075e538..0000000
--- a/BCCrypto/src/asn1/bc/BCObjectIdentifiers.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.BC
-{
- public abstract class BCObjectIdentifiers
- {
- // iso.org.dod.internet.private.enterprise.legion-of-the-bouncy-castle
- // 1.3.6.1.4.1.22554
- public static readonly DerObjectIdentifier bc = new DerObjectIdentifier("1.3.6.1.4.1.22554");
-
- // pbe(1) algorithms
- public static readonly DerObjectIdentifier bc_pbe = new DerObjectIdentifier(bc + ".1");
-
- // SHA-1(1)
- public static readonly DerObjectIdentifier bc_pbe_sha1 = new DerObjectIdentifier(bc_pbe + ".1");
-
- // SHA-2(2) . (SHA-256(1)|SHA-384(2)|SHA-512(3)|SHA-224(4))
- public static readonly DerObjectIdentifier bc_pbe_sha256 = new DerObjectIdentifier(bc_pbe + ".2.1");
- public static readonly DerObjectIdentifier bc_pbe_sha384 = new DerObjectIdentifier(bc_pbe + ".2.2");
- public static readonly DerObjectIdentifier bc_pbe_sha512 = new DerObjectIdentifier(bc_pbe + ".2.3");
- public static readonly DerObjectIdentifier bc_pbe_sha224 = new DerObjectIdentifier(bc_pbe + ".2.4");
-
- // PKCS-5(1)|PKCS-12(2)
- public static readonly DerObjectIdentifier bc_pbe_sha1_pkcs5 = new DerObjectIdentifier(bc_pbe_sha1 + ".1");
- public static readonly DerObjectIdentifier bc_pbe_sha1_pkcs12 = new DerObjectIdentifier(bc_pbe_sha1 + ".2");
-
- public static readonly DerObjectIdentifier bc_pbe_sha256_pkcs5 = new DerObjectIdentifier(bc_pbe_sha256 + ".1");
- public static readonly DerObjectIdentifier bc_pbe_sha256_pkcs12 = new DerObjectIdentifier(bc_pbe_sha256 + ".2");
-
- // AES(1) . (CBC-128(2)|CBC-192(22)|CBC-256(42))
- public static readonly DerObjectIdentifier bc_pbe_sha1_pkcs12_aes128_cbc = new DerObjectIdentifier(bc_pbe_sha1_pkcs12 + ".1.2");
- public static readonly DerObjectIdentifier bc_pbe_sha1_pkcs12_aes192_cbc = new DerObjectIdentifier(bc_pbe_sha1_pkcs12 + ".1.22");
- public static readonly DerObjectIdentifier bc_pbe_sha1_pkcs12_aes256_cbc = new DerObjectIdentifier(bc_pbe_sha1_pkcs12 + ".1.42");
-
- public static readonly DerObjectIdentifier bc_pbe_sha256_pkcs12_aes128_cbc = new DerObjectIdentifier(bc_pbe_sha256_pkcs12 + ".1.2");
- public static readonly DerObjectIdentifier bc_pbe_sha256_pkcs12_aes192_cbc = new DerObjectIdentifier(bc_pbe_sha256_pkcs12 + ".1.22");
- public static readonly DerObjectIdentifier bc_pbe_sha256_pkcs12_aes256_cbc = new DerObjectIdentifier(bc_pbe_sha256_pkcs12 + ".1.42");
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/asn1/cmp/CAKeyUpdAnnContent.cs b/BCCrypto/src/asn1/cmp/CAKeyUpdAnnContent.cs
deleted file mode 100644
index b74bac8..0000000
--- a/BCCrypto/src/asn1/cmp/CAKeyUpdAnnContent.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class CAKeyUpdAnnContent
- : Asn1Encodable
- {
- private readonly CmpCertificate oldWithNew;
- private readonly CmpCertificate newWithOld;
- private readonly CmpCertificate newWithNew;
-
- private CAKeyUpdAnnContent(Asn1Sequence seq)
- {
- oldWithNew = CmpCertificate.GetInstance(seq[0]);
- newWithOld = CmpCertificate.GetInstance(seq[1]);
- newWithNew = CmpCertificate.GetInstance(seq[2]);
- }
-
- public static CAKeyUpdAnnContent GetInstance(object obj)
- {
- if (obj is CAKeyUpdAnnContent)
- return (CAKeyUpdAnnContent)obj;
-
- if (obj is Asn1Sequence)
- return new CAKeyUpdAnnContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual CmpCertificate OldWithNew
- {
- get { return oldWithNew; }
- }
-
- public virtual CmpCertificate NewWithOld
- {
- get { return newWithOld; }
- }
-
- public virtual CmpCertificate NewWithNew
- {
- get { return newWithNew; }
- }
-
- /**
- *
- * CAKeyUpdAnnContent ::= SEQUENCE {
- * oldWithNew CmpCertificate, -- old pub signed with new priv
- * newWithOld CmpCertificate, -- new pub signed with old priv
- * newWithNew CmpCertificate -- new pub signed with new priv
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(oldWithNew, newWithOld, newWithNew);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/CertConfirmContent.cs b/BCCrypto/src/asn1/cmp/CertConfirmContent.cs
deleted file mode 100644
index 370a9e7..0000000
--- a/BCCrypto/src/asn1/cmp/CertConfirmContent.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class CertConfirmContent
- : Asn1Encodable
- {
- private readonly Asn1Sequence content;
-
- private CertConfirmContent(Asn1Sequence seq)
- {
- content = seq;
- }
-
- public static CertConfirmContent GetInstance(object obj)
- {
- if (obj is CertConfirmContent)
- return (CertConfirmContent)obj;
-
- if (obj is Asn1Sequence)
- return new CertConfirmContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual CertStatus[] ToCertStatusArray()
- {
- CertStatus[] result = new CertStatus[content.Count];
- for (int i = 0; i != result.Length; i++)
- {
- result[i] = CertStatus.GetInstance(content[i]);
- }
- return result;
- }
-
- /**
- *
- * CertConfirmContent ::= SEQUENCE OF CertStatus
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return content;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/CertOrEncCert.cs b/BCCrypto/src/asn1/cmp/CertOrEncCert.cs
deleted file mode 100644
index eb200e1..0000000
--- a/BCCrypto/src/asn1/cmp/CertOrEncCert.cs
+++ /dev/null
@@ -1,86 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Crmf;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class CertOrEncCert
- : Asn1Encodable, IAsn1Choice
- {
- private readonly CmpCertificate certificate;
- private readonly EncryptedValue encryptedCert;
-
- private CertOrEncCert(Asn1TaggedObject tagged)
- {
- if (tagged.TagNo == 0)
- {
- certificate = CmpCertificate.GetInstance(tagged.GetObject());
- }
- else if (tagged.TagNo == 1)
- {
- encryptedCert = EncryptedValue.GetInstance(tagged.GetObject());
- }
- else
- {
- throw new ArgumentException("unknown tag: " + tagged.TagNo, "tagged");
- }
- }
-
- public static CertOrEncCert GetInstance(object obj)
- {
- if (obj is CertOrEncCert)
- return (CertOrEncCert)obj;
-
- if (obj is Asn1TaggedObject)
- return new CertOrEncCert((Asn1TaggedObject)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public CertOrEncCert(CmpCertificate certificate)
- {
- if (certificate == null)
- throw new ArgumentNullException("certificate");
-
- this.certificate = certificate;
- }
-
- public CertOrEncCert(EncryptedValue encryptedCert)
- {
- if (encryptedCert == null)
- throw new ArgumentNullException("encryptedCert");
-
- this.encryptedCert = encryptedCert;
- }
-
- public virtual CmpCertificate Certificate
- {
- get { return certificate; }
- }
-
- public virtual EncryptedValue EncryptedCert
- {
- get { return encryptedCert; }
- }
-
- /**
- *
- * CertOrEncCert ::= CHOICE {
- * certificate [0] CMPCertificate,
- * encryptedCert [1] EncryptedValue
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- if (certificate != null)
- {
- return new DerTaggedObject(true, 0, certificate);
- }
-
- return new DerTaggedObject(true, 1, encryptedCert);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/CertRepMessage.cs b/BCCrypto/src/asn1/cmp/CertRepMessage.cs
deleted file mode 100644
index 8286978..0000000
--- a/BCCrypto/src/asn1/cmp/CertRepMessage.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class CertRepMessage
- : Asn1Encodable
- {
- private readonly Asn1Sequence caPubs;
- private readonly Asn1Sequence response;
-
- private CertRepMessage(Asn1Sequence seq)
- {
- int index = 0;
-
- if (seq.Count > 1)
- {
- caPubs = Asn1Sequence.GetInstance((Asn1TaggedObject)seq[index++], true);
- }
-
- response = Asn1Sequence.GetInstance(seq[index]);
- }
-
- public static CertRepMessage GetInstance(object obj)
- {
- if (obj is CertRepMessage)
- return (CertRepMessage)obj;
-
- if (obj is Asn1Sequence)
- return new CertRepMessage((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public CertRepMessage(CmpCertificate[] caPubs, CertResponse[] response)
- {
- if (response == null)
- throw new ArgumentNullException("response");
-
- if (caPubs != null)
- {
- this.caPubs = new DerSequence(caPubs);
- }
-
- this.response = new DerSequence(response);
- }
-
- public virtual CmpCertificate[] GetCAPubs()
- {
- if (caPubs == null)
- return null;
-
- CmpCertificate[] results = new CmpCertificate[caPubs.Count];
- for (int i = 0; i != results.Length; ++i)
- {
- results[i] = CmpCertificate.GetInstance(caPubs[i]);
- }
- return results;
- }
-
- public virtual CertResponse[] GetResponse()
- {
- CertResponse[] results = new CertResponse[response.Count];
- for (int i = 0; i != results.Length; ++i)
- {
- results[i] = CertResponse.GetInstance(response[i]);
- }
- return results;
- }
-
- /**
- *
- * CertRepMessage ::= SEQUENCE {
- * caPubs [1] SEQUENCE SIZE (1..MAX) OF CMPCertificate
- * OPTIONAL,
- * response SEQUENCE OF CertResponse
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (caPubs != null)
- {
- v.Add(new DerTaggedObject(true, 1, caPubs));
- }
-
- v.Add(response);
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/CertResponse.cs b/BCCrypto/src/asn1/cmp/CertResponse.cs
deleted file mode 100644
index 843fd92..0000000
--- a/BCCrypto/src/asn1/cmp/CertResponse.cs
+++ /dev/null
@@ -1,116 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class CertResponse
- : Asn1Encodable
- {
- private readonly DerInteger certReqId;
- private readonly PkiStatusInfo status;
- private readonly CertifiedKeyPair certifiedKeyPair;
- private readonly Asn1OctetString rspInfo;
-
- private CertResponse(Asn1Sequence seq)
- {
- certReqId = DerInteger.GetInstance(seq[0]);
- status = PkiStatusInfo.GetInstance(seq[1]);
-
- if (seq.Count >= 3)
- {
- if (seq.Count == 3)
- {
- Asn1Encodable o = seq[2];
- if (o is Asn1OctetString)
- {
- rspInfo = Asn1OctetString.GetInstance(o);
- }
- else
- {
- certifiedKeyPair = CertifiedKeyPair.GetInstance(o);
- }
- }
- else
- {
- certifiedKeyPair = CertifiedKeyPair.GetInstance(seq[2]);
- rspInfo = Asn1OctetString.GetInstance(seq[3]);
- }
- }
- }
-
- public static CertResponse GetInstance(object obj)
- {
- if (obj is CertResponse)
- return (CertResponse)obj;
-
- if (obj is Asn1Sequence)
- return new CertResponse((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public CertResponse(
- DerInteger certReqId,
- PkiStatusInfo status)
- : this(certReqId, status, null, null)
- {
- }
-
- public CertResponse(
- DerInteger certReqId,
- PkiStatusInfo status,
- CertifiedKeyPair certifiedKeyPair,
- Asn1OctetString rspInfo)
- {
- if (certReqId == null)
- throw new ArgumentNullException("certReqId");
-
- if (status == null)
- throw new ArgumentNullException("status");
-
- this.certReqId = certReqId;
- this.status = status;
- this.certifiedKeyPair = certifiedKeyPair;
- this.rspInfo = rspInfo;
- }
-
- public virtual DerInteger CertReqID
- {
- get { return certReqId; }
- }
-
- public virtual PkiStatusInfo Status
- {
- get { return status; }
- }
-
- public virtual CertifiedKeyPair CertifiedKeyPair
- {
- get { return certifiedKeyPair; }
- }
-
- /**
- *
- * CertResponse ::= SEQUENCE {
- * certReqId INTEGER,
- * -- to match this response with corresponding request (a value
- * -- of -1 is to be used if certReqId is not specified in the
- * -- corresponding request)
- * status PKIStatusInfo,
- * certifiedKeyPair CertifiedKeyPair OPTIONAL,
- * rspInfo OCTET STRING OPTIONAL
- * -- analogous to the id-regInfo-utf8Pairs string defined
- * -- for regInfo in CertReqMsg [CRMF]
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(certReqId, status);
- v.AddOptional(certifiedKeyPair, rspInfo);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/CertStatus.cs b/BCCrypto/src/asn1/cmp/CertStatus.cs
deleted file mode 100644
index d437b57..0000000
--- a/BCCrypto/src/asn1/cmp/CertStatus.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class CertStatus
- : Asn1Encodable
- {
- private readonly Asn1OctetString certHash;
- private readonly DerInteger certReqId;
- private readonly PkiStatusInfo statusInfo;
-
- private CertStatus(Asn1Sequence seq)
- {
- certHash = Asn1OctetString.GetInstance(seq[0]);
- certReqId = DerInteger.GetInstance(seq[1]);
-
- if (seq.Count > 2)
- {
- statusInfo = PkiStatusInfo.GetInstance(seq[2]);
- }
- }
-
- public CertStatus(byte[] certHash, BigInteger certReqId)
- {
- this.certHash = new DerOctetString(certHash);
- this.certReqId = new DerInteger(certReqId);
- }
-
- public CertStatus(byte[] certHash, BigInteger certReqId, PkiStatusInfo statusInfo)
- {
- this.certHash = new DerOctetString(certHash);
- this.certReqId = new DerInteger(certReqId);
- this.statusInfo = statusInfo;
- }
-
- public static CertStatus GetInstance(object obj)
- {
- if (obj is CertStatus)
- return (CertStatus)obj;
-
- if (obj is Asn1Sequence)
- return new CertStatus((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual Asn1OctetString CertHash
- {
- get { return certHash; }
- }
-
- public virtual DerInteger CertReqID
- {
- get { return certReqId; }
- }
-
- public virtual PkiStatusInfo StatusInfo
- {
- get { return statusInfo; }
- }
-
- /**
- *
- * CertStatus ::= SEQUENCE {
- * certHash OCTET STRING,
- * -- the hash of the certificate, using the same hash algorithm
- * -- as is used to create and verify the certificate signature
- * certReqId INTEGER,
- * -- to match this confirmation with the corresponding req/rep
- * statusInfo PKIStatusInfo OPTIONAL
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(certHash, certReqId);
- v.AddOptional(statusInfo);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/CertifiedKeyPair.cs b/BCCrypto/src/asn1/cmp/CertifiedKeyPair.cs
deleted file mode 100644
index c06f000..0000000
--- a/BCCrypto/src/asn1/cmp/CertifiedKeyPair.cs
+++ /dev/null
@@ -1,115 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Crmf;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class CertifiedKeyPair
- : Asn1Encodable
- {
- private readonly CertOrEncCert certOrEncCert;
- private readonly EncryptedValue privateKey;
- private readonly PkiPublicationInfo publicationInfo;
-
- private CertifiedKeyPair(Asn1Sequence seq)
- {
- certOrEncCert = CertOrEncCert.GetInstance(seq[0]);
-
- if (seq.Count >= 2)
- {
- if (seq.Count == 2)
- {
- Asn1TaggedObject tagged = Asn1TaggedObject.GetInstance(seq[1]);
- if (tagged.TagNo == 0)
- {
- privateKey = EncryptedValue.GetInstance(tagged.GetObject());
- }
- else
- {
- publicationInfo = PkiPublicationInfo.GetInstance(tagged.GetObject());
- }
- }
- else
- {
- privateKey = EncryptedValue.GetInstance(Asn1TaggedObject.GetInstance(seq[1]));
- publicationInfo = PkiPublicationInfo.GetInstance(Asn1TaggedObject.GetInstance(seq[2]));
- }
- }
- }
-
- public static CertifiedKeyPair GetInstance(object obj)
- {
- if (obj is CertifiedKeyPair)
- return (CertifiedKeyPair)obj;
-
- if (obj is Asn1Sequence)
- return new CertifiedKeyPair((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public CertifiedKeyPair(
- CertOrEncCert certOrEncCert)
- : this(certOrEncCert, null, null)
- {
- }
-
- public CertifiedKeyPair(
- CertOrEncCert certOrEncCert,
- EncryptedValue privateKey,
- PkiPublicationInfo publicationInfo
- )
- {
- if (certOrEncCert == null)
- throw new ArgumentNullException("certOrEncCert");
-
- this.certOrEncCert = certOrEncCert;
- this.privateKey = privateKey;
- this.publicationInfo = publicationInfo;
- }
-
- public virtual CertOrEncCert CertOrEncCert
- {
- get { return certOrEncCert; }
- }
-
- public virtual EncryptedValue PrivateKey
- {
- get { return privateKey; }
- }
-
- public virtual PkiPublicationInfo PublicationInfo
- {
- get { return publicationInfo; }
- }
-
- /**
- *
- * CertifiedKeyPair ::= SEQUENCE {
- * certOrEncCert CertOrEncCert,
- * privateKey [0] EncryptedValue OPTIONAL,
- * -- see [CRMF] for comment on encoding
- * publicationInfo [1] PKIPublicationInfo OPTIONAL
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(certOrEncCert);
-
- if (privateKey != null)
- {
- v.Add(new DerTaggedObject(true, 0, privateKey));
- }
-
- if (publicationInfo != null)
- {
- v.Add(new DerTaggedObject(true, 1, publicationInfo));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/Challenge.cs b/BCCrypto/src/asn1/cmp/Challenge.cs
deleted file mode 100644
index 5c78c2a..0000000
--- a/BCCrypto/src/asn1/cmp/Challenge.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class Challenge
- : Asn1Encodable
- {
- private readonly AlgorithmIdentifier owf;
- private readonly Asn1OctetString witness;
- private readonly Asn1OctetString challenge;
-
- private Challenge(Asn1Sequence seq)
- {
- int index = 0;
-
- if (seq.Count == 3)
- {
- owf = AlgorithmIdentifier.GetInstance(seq[index++]);
- }
-
- witness = Asn1OctetString.GetInstance(seq[index++]);
- challenge = Asn1OctetString.GetInstance(seq[index]);
- }
-
- public static Challenge GetInstance(object obj)
- {
- if (obj is Challenge)
- return (Challenge)obj;
-
- if (obj is Asn1Sequence)
- return new Challenge((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual AlgorithmIdentifier Owf
- {
- get { return owf; }
- }
-
- /**
- *
- * Challenge ::= SEQUENCE {
- * owf AlgorithmIdentifier OPTIONAL,
- *
- * -- MUST be present in the first Challenge; MAY be omitted in
- * -- any subsequent Challenge in POPODecKeyChallContent (if
- * -- omitted, then the owf used in the immediately preceding
- * -- Challenge is to be used).
- *
- * witness OCTET STRING,
- * -- the result of applying the one-way function (owf) to a
- * -- randomly-generated INTEGER, A. [Note that a different
- * -- INTEGER MUST be used for each Challenge.]
- * challenge OCTET STRING
- * -- the encryption (under the public key for which the cert.
- * -- request is being made) of Rand, where Rand is specified as
- * -- Rand ::= SEQUENCE {
- * -- int INTEGER,
- * -- - the randomly-generated INTEGER A (above)
- * -- sender GeneralName
- * -- - the sender's name (as included in PKIHeader)
- * -- }
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
- v.AddOptional(owf);
- v.Add(witness);
- v.Add(challenge);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/CmpCertificate.cs b/BCCrypto/src/asn1/cmp/CmpCertificate.cs
deleted file mode 100644
index 33356b4..0000000
--- a/BCCrypto/src/asn1/cmp/CmpCertificate.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class CmpCertificate
- : Asn1Encodable, IAsn1Choice
- {
- private readonly X509CertificateStructure x509v3PKCert;
- private readonly AttributeCertificate x509v2AttrCert;
-
- /**
- * Note: the addition of attribute certificates is a BC extension.
- */
- public CmpCertificate(AttributeCertificate x509v2AttrCert)
- {
- this.x509v2AttrCert = x509v2AttrCert;
- }
-
- public CmpCertificate(X509CertificateStructure x509v3PKCert)
- {
- if (x509v3PKCert.Version != 3)
- throw new ArgumentException("only version 3 certificates allowed", "x509v3PKCert");
-
- this.x509v3PKCert = x509v3PKCert;
- }
-
- public static CmpCertificate GetInstance(object obj)
- {
- if (obj is CmpCertificate)
- return (CmpCertificate)obj;
-
- if (obj is Asn1Sequence)
- return new CmpCertificate(X509CertificateStructure.GetInstance(obj));
-
- if (obj is Asn1TaggedObject)
- return new CmpCertificate(AttributeCertificate.GetInstance(((Asn1TaggedObject)obj).GetObject()));
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual bool IsX509v3PKCert
- {
- get { return x509v3PKCert != null; }
- }
-
- public virtual X509CertificateStructure X509v3PKCert
- {
- get { return x509v3PKCert; }
- }
-
- public virtual AttributeCertificate X509v2AttrCert
- {
- get { return x509v2AttrCert; }
- }
-
- /**
- *
- * CMPCertificate ::= CHOICE {
- * x509v3PKCert Certificate
- * x509v2AttrCert [1] AttributeCertificate
- * }
- *
- * Note: the addition of attribute certificates is a BC extension.
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- if (x509v2AttrCert != null)
- {
- // explicit following CMP conventions
- return new DerTaggedObject(true, 1, x509v2AttrCert);
- }
-
- return x509v3PKCert.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/CmpObjectIdentifiers.cs b/BCCrypto/src/asn1/cmp/CmpObjectIdentifiers.cs
deleted file mode 100644
index 7e82741..0000000
--- a/BCCrypto/src/asn1/cmp/CmpObjectIdentifiers.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public abstract class CmpObjectIdentifiers
- {
- // RFC 4210
-
- // id-PasswordBasedMac OBJECT IDENTIFIER ::= {1 2 840 113533 7 66 13}
- public static readonly DerObjectIdentifier passwordBasedMac = new DerObjectIdentifier("1.2.840.113533.7.66.13");
-
- // id-DHBasedMac OBJECT IDENTIFIER ::= {1 2 840 113533 7 66 30}
- public static readonly DerObjectIdentifier dhBasedMac = new DerObjectIdentifier("1.2.840.113533.7.66.30");
-
- // Example InfoTypeAndValue contents include, but are not limited
- // to, the following (un-comment in this ASN.1 module and use as
- // appropriate for a given environment):
- //
- // id-it-caProtEncCert OBJECT IDENTIFIER ::= {id-it 1}
- // CAProtEncCertValue ::= CMPCertificate
- // id-it-signKeyPairTypes OBJECT IDENTIFIER ::= {id-it 2}
- // SignKeyPairTypesValue ::= SEQUENCE OF AlgorithmIdentifier
- // id-it-encKeyPairTypes OBJECT IDENTIFIER ::= {id-it 3}
- // EncKeyPairTypesValue ::= SEQUENCE OF AlgorithmIdentifier
- // id-it-preferredSymmAlg OBJECT IDENTIFIER ::= {id-it 4}
- // PreferredSymmAlgValue ::= AlgorithmIdentifier
- // id-it-caKeyUpdateInfo OBJECT IDENTIFIER ::= {id-it 5}
- // CAKeyUpdateInfoValue ::= CAKeyUpdAnnContent
- // id-it-currentCRL OBJECT IDENTIFIER ::= {id-it 6}
- // CurrentCRLValue ::= CertificateList
- // id-it-unsupportedOIDs OBJECT IDENTIFIER ::= {id-it 7}
- // UnsupportedOIDsValue ::= SEQUENCE OF OBJECT IDENTIFIER
- // id-it-keyPairParamReq OBJECT IDENTIFIER ::= {id-it 10}
- // KeyPairParamReqValue ::= OBJECT IDENTIFIER
- // id-it-keyPairParamRep OBJECT IDENTIFIER ::= {id-it 11}
- // KeyPairParamRepValue ::= AlgorithmIdentifer
- // id-it-revPassphrase OBJECT IDENTIFIER ::= {id-it 12}
- // RevPassphraseValue ::= EncryptedValue
- // id-it-implicitConfirm OBJECT IDENTIFIER ::= {id-it 13}
- // ImplicitConfirmValue ::= NULL
- // id-it-confirmWaitTime OBJECT IDENTIFIER ::= {id-it 14}
- // ConfirmWaitTimeValue ::= GeneralizedTime
- // id-it-origPKIMessage OBJECT IDENTIFIER ::= {id-it 15}
- // OrigPKIMessageValue ::= PKIMessages
- // id-it-suppLangTags OBJECT IDENTIFIER ::= {id-it 16}
- // SuppLangTagsValue ::= SEQUENCE OF UTF8String
- //
- // where
- //
- // id-pkix OBJECT IDENTIFIER ::= {
- // iso(1) identified-organization(3)
- // dod(6) internet(1) security(5) mechanisms(5) pkix(7)}
- // and
- // id-it OBJECT IDENTIFIER ::= {id-pkix 4}
- public static readonly DerObjectIdentifier it_caProtEncCert = new DerObjectIdentifier("1.3.6.1.5.5.7.4.1");
- public static readonly DerObjectIdentifier it_signKeyPairTypes = new DerObjectIdentifier("1.3.6.1.5.5.7.4.2");
- public static readonly DerObjectIdentifier it_encKeyPairTypes = new DerObjectIdentifier("1.3.6.1.5.5.7.4.3");
- public static readonly DerObjectIdentifier it_preferredSymAlg = new DerObjectIdentifier("1.3.6.1.5.5.7.4.4");
- public static readonly DerObjectIdentifier it_caKeyUpdateInfo = new DerObjectIdentifier("1.3.6.1.5.5.7.4.5");
- public static readonly DerObjectIdentifier it_currentCRL = new DerObjectIdentifier("1.3.6.1.5.5.7.4.6");
- public static readonly DerObjectIdentifier it_unsupportedOIDs = new DerObjectIdentifier("1.3.6.1.5.5.7.4.7");
- public static readonly DerObjectIdentifier it_keyPairParamReq = new DerObjectIdentifier("1.3.6.1.5.5.7.4.10");
- public static readonly DerObjectIdentifier it_keyPairParamRep = new DerObjectIdentifier("1.3.6.1.5.5.7.4.11");
- public static readonly DerObjectIdentifier it_revPassphrase = new DerObjectIdentifier("1.3.6.1.5.5.7.4.12");
- public static readonly DerObjectIdentifier it_implicitConfirm = new DerObjectIdentifier("1.3.6.1.5.5.7.4.13");
- public static readonly DerObjectIdentifier it_confirmWaitTime = new DerObjectIdentifier("1.3.6.1.5.5.7.4.14");
- public static readonly DerObjectIdentifier it_origPKIMessage = new DerObjectIdentifier("1.3.6.1.5.5.7.4.15");
- public static readonly DerObjectIdentifier it_suppLangTags = new DerObjectIdentifier("1.3.6.1.5.5.7.4.16");
-
- // RFC 4211
-
- // id-pkix OBJECT IDENTIFIER ::= { iso(1) identified-organization(3)
- // dod(6) internet(1) security(5) mechanisms(5) pkix(7) }
- //
- // arc for Internet X.509 PKI protocols and their components
- // id-pkip OBJECT IDENTIFIER :: { id-pkix pkip(5) }
- //
- // arc for Registration Controls in CRMF
- // id-regCtrl OBJECT IDENTIFIER ::= { id-pkip regCtrl(1) }
- //
- // arc for Registration Info in CRMF
- // id-regInfo OBJECT IDENTIFIER ::= { id-pkip id-regInfo(2) }
-
- public static readonly DerObjectIdentifier regCtrl_regToken = new DerObjectIdentifier("1.3.6.1.5.5.7.5.1.1");
- public static readonly DerObjectIdentifier regCtrl_authenticator = new DerObjectIdentifier("1.3.6.1.5.5.7.5.1.2");
- public static readonly DerObjectIdentifier regCtrl_pkiPublicationInfo = new DerObjectIdentifier("1.3.6.1.5.5.7.5.1.3");
- public static readonly DerObjectIdentifier regCtrl_pkiArchiveOptions = new DerObjectIdentifier("1.3.6.1.5.5.7.5.1.4");
- public static readonly DerObjectIdentifier regCtrl_oldCertID = new DerObjectIdentifier("1.3.6.1.5.5.7.5.1.5");
- public static readonly DerObjectIdentifier regCtrl_protocolEncrKey = new DerObjectIdentifier("1.3.6.1.5.5.7.5.1.6");
-
- // From RFC4210:
- // id-regCtrl-altCertTemplate OBJECT IDENTIFIER ::= {id-regCtrl 7}
- public static readonly DerObjectIdentifier regCtrl_altCertTemplate = new DerObjectIdentifier("1.3.6.1.5.5.7.5.1.7");
-
- public static readonly DerObjectIdentifier regInfo_utf8Pairs = new DerObjectIdentifier("1.3.6.1.5.5.7.5.2.1");
- public static readonly DerObjectIdentifier regInfo_certReq = new DerObjectIdentifier("1.3.6.1.5.5.7.5.2.2");
-
- // id-smime OBJECT IDENTIFIER ::= { iso(1) member-body(2)
- // us(840) rsadsi(113549) pkcs(1) pkcs9(9) 16 }
- //
- // id-ct OBJECT IDENTIFIER ::= { id-smime 1 } -- content types
- //
- // id-ct-encKeyWithID OBJECT IDENTIFIER ::= {id-ct 21}
- public static readonly DerObjectIdentifier ct_encKeyWithID = new DerObjectIdentifier("1.2.840.113549.1.9.16.1.21");
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/CrlAnnContent.cs b/BCCrypto/src/asn1/cmp/CrlAnnContent.cs
deleted file mode 100644
index db8ecfa..0000000
--- a/BCCrypto/src/asn1/cmp/CrlAnnContent.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class CrlAnnContent
- : Asn1Encodable
- {
- private readonly Asn1Sequence content;
-
- private CrlAnnContent(Asn1Sequence seq)
- {
- content = seq;
- }
-
- public static CrlAnnContent GetInstance(object obj)
- {
- if (obj is CrlAnnContent)
- return (CrlAnnContent)obj;
-
- if (obj is Asn1Sequence)
- return new CrlAnnContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual CertificateList[] ToCertificateListArray()
- {
- CertificateList[] result = new CertificateList[content.Count];
- for (int i = 0; i != result.Length; ++ i)
- {
- result[i] = CertificateList.GetInstance(content[i]);
- }
- return result;
- }
-
- /**
- *
- * CrlAnnContent ::= SEQUENCE OF CertificateList
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return content;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/ErrorMsgContent.cs b/BCCrypto/src/asn1/cmp/ErrorMsgContent.cs
deleted file mode 100644
index 5d2132b..0000000
--- a/BCCrypto/src/asn1/cmp/ErrorMsgContent.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class ErrorMsgContent
- : Asn1Encodable
- {
- private readonly PkiStatusInfo pkiStatusInfo;
- private readonly DerInteger errorCode;
- private readonly PkiFreeText errorDetails;
-
- private ErrorMsgContent(Asn1Sequence seq)
- {
- pkiStatusInfo = PkiStatusInfo.GetInstance(seq[0]);
-
- for (int pos = 1; pos < seq.Count; ++pos)
- {
- Asn1Encodable ae = seq[pos];
- if (ae is DerInteger)
- {
- errorCode = DerInteger.GetInstance(ae);
- }
- else
- {
- errorDetails = PkiFreeText.GetInstance(ae);
- }
- }
- }
-
- public static ErrorMsgContent GetInstance(object obj)
- {
- if (obj is ErrorMsgContent)
- return (ErrorMsgContent)obj;
-
- if (obj is Asn1Sequence)
- return new ErrorMsgContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public ErrorMsgContent(PkiStatusInfo pkiStatusInfo)
- : this(pkiStatusInfo, null, null)
- {
- }
-
- public ErrorMsgContent(
- PkiStatusInfo pkiStatusInfo,
- DerInteger errorCode,
- PkiFreeText errorDetails)
- {
- if (pkiStatusInfo == null)
- throw new ArgumentNullException("pkiStatusInfo");
-
- this.pkiStatusInfo = pkiStatusInfo;
- this.errorCode = errorCode;
- this.errorDetails = errorDetails;
- }
-
- public virtual PkiStatusInfo PkiStatusInfo
- {
- get { return pkiStatusInfo; }
- }
-
- public virtual DerInteger ErrorCode
- {
- get { return errorCode; }
- }
-
- public virtual PkiFreeText ErrorDetails
- {
- get { return errorDetails; }
- }
-
- /**
- *
- * ErrorMsgContent ::= SEQUENCE {
- * pKIStatusInfo PKIStatusInfo,
- * errorCode INTEGER OPTIONAL,
- * -- implementation-specific error codes
- * errorDetails PKIFreeText OPTIONAL
- * -- implementation-specific error details
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(pkiStatusInfo);
- v.AddOptional(errorCode, errorDetails);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/GenMsgContent.cs b/BCCrypto/src/asn1/cmp/GenMsgContent.cs
deleted file mode 100644
index f3142b5..0000000
--- a/BCCrypto/src/asn1/cmp/GenMsgContent.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class GenMsgContent
- : Asn1Encodable
- {
- private readonly Asn1Sequence content;
-
- private GenMsgContent(Asn1Sequence seq)
- {
- content = seq;
- }
-
- public static GenMsgContent GetInstance(object obj)
- {
- if (obj is GenMsgContent)
- return (GenMsgContent)obj;
-
- if (obj is Asn1Sequence)
- return new GenMsgContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public GenMsgContent(params InfoTypeAndValue[] itv)
- {
- content = new DerSequence(itv);
- }
-
- public virtual InfoTypeAndValue[] ToInfoTypeAndValueArray()
- {
- InfoTypeAndValue[] result = new InfoTypeAndValue[content.Count];
- for (int i = 0; i != result.Length; ++i)
- {
- result[i] = InfoTypeAndValue.GetInstance(content[i]);
- }
- return result;
- }
-
- /**
- *
- * GenMsgContent ::= SEQUENCE OF InfoTypeAndValue
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return content;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/GenRepContent.cs b/BCCrypto/src/asn1/cmp/GenRepContent.cs
deleted file mode 100644
index 3c3573e..0000000
--- a/BCCrypto/src/asn1/cmp/GenRepContent.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class GenRepContent
- : Asn1Encodable
- {
- private readonly Asn1Sequence content;
-
- private GenRepContent(Asn1Sequence seq)
- {
- content = seq;
- }
-
- public static GenRepContent GetInstance(object obj)
- {
- if (obj is GenRepContent)
- return (GenRepContent)obj;
-
- if (obj is Asn1Sequence)
- return new GenRepContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public GenRepContent(params InfoTypeAndValue[] itv)
- {
- content = new DerSequence(itv);
- }
-
- public virtual InfoTypeAndValue[] ToInfoTypeAndValueArray()
- {
- InfoTypeAndValue[] result = new InfoTypeAndValue[content.Count];
- for (int i = 0; i != result.Length; ++i)
- {
- result[i] = InfoTypeAndValue.GetInstance(content[i]);
- }
- return result;
- }
-
- /**
- *
- * GenRepContent ::= SEQUENCE OF InfoTypeAndValue
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return content;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/InfoTypeAndValue.cs b/BCCrypto/src/asn1/cmp/InfoTypeAndValue.cs
deleted file mode 100644
index 0ce6f73..0000000
--- a/BCCrypto/src/asn1/cmp/InfoTypeAndValue.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- /**
- * Example InfoTypeAndValue contents include, but are not limited
- * to, the following (un-comment in this ASN.1 module and use as
- * appropriate for a given environment):
- *
- * id-it-caProtEncCert OBJECT IDENTIFIER ::= {id-it 1}
- * CAProtEncCertValue ::= CMPCertificate
- * id-it-signKeyPairTypes OBJECT IDENTIFIER ::= {id-it 2}
- * SignKeyPairTypesValue ::= SEQUENCE OF AlgorithmIdentifier
- * id-it-encKeyPairTypes OBJECT IDENTIFIER ::= {id-it 3}
- * EncKeyPairTypesValue ::= SEQUENCE OF AlgorithmIdentifier
- * id-it-preferredSymmAlg OBJECT IDENTIFIER ::= {id-it 4}
- * PreferredSymmAlgValue ::= AlgorithmIdentifier
- * id-it-caKeyUpdateInfo OBJECT IDENTIFIER ::= {id-it 5}
- * CAKeyUpdateInfoValue ::= CAKeyUpdAnnContent
- * id-it-currentCRL OBJECT IDENTIFIER ::= {id-it 6}
- * CurrentCRLValue ::= CertificateList
- * id-it-unsupportedOIDs OBJECT IDENTIFIER ::= {id-it 7}
- * UnsupportedOIDsValue ::= SEQUENCE OF OBJECT IDENTIFIER
- * id-it-keyPairParamReq OBJECT IDENTIFIER ::= {id-it 10}
- * KeyPairParamReqValue ::= OBJECT IDENTIFIER
- * id-it-keyPairParamRep OBJECT IDENTIFIER ::= {id-it 11}
- * KeyPairParamRepValue ::= AlgorithmIdentifer
- * id-it-revPassphrase OBJECT IDENTIFIER ::= {id-it 12}
- * RevPassphraseValue ::= EncryptedValue
- * id-it-implicitConfirm OBJECT IDENTIFIER ::= {id-it 13}
- * ImplicitConfirmValue ::= NULL
- * id-it-confirmWaitTime OBJECT IDENTIFIER ::= {id-it 14}
- * ConfirmWaitTimeValue ::= GeneralizedTime
- * id-it-origPKIMessage OBJECT IDENTIFIER ::= {id-it 15}
- * OrigPKIMessageValue ::= PKIMessages
- * id-it-suppLangTags OBJECT IDENTIFIER ::= {id-it 16}
- * SuppLangTagsValue ::= SEQUENCE OF UTF8String
- *
- * where
- *
- * id-pkix OBJECT IDENTIFIER ::= {
- * iso(1) identified-organization(3)
- * dod(6) internet(1) security(5) mechanisms(5) pkix(7)}
- * and
- * id-it OBJECT IDENTIFIER ::= {id-pkix 4}
- *
- */
- public class InfoTypeAndValue
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier infoType;
- private readonly Asn1Encodable infoValue;
-
- private InfoTypeAndValue(Asn1Sequence seq)
- {
- infoType = DerObjectIdentifier.GetInstance(seq[0]);
-
- if (seq.Count > 1)
- {
- infoValue = (Asn1Encodable)seq[1];
- }
- }
-
- public static InfoTypeAndValue GetInstance(object obj)
- {
- if (obj is InfoTypeAndValue)
- return (InfoTypeAndValue)obj;
-
- if (obj is Asn1Sequence)
- return new InfoTypeAndValue((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public InfoTypeAndValue(
- DerObjectIdentifier infoType)
- {
- this.infoType = infoType;
- this.infoValue = null;
- }
-
- public InfoTypeAndValue(
- DerObjectIdentifier infoType,
- Asn1Encodable optionalValue)
- {
- this.infoType = infoType;
- this.infoValue = optionalValue;
- }
-
- public virtual DerObjectIdentifier InfoType
- {
- get { return infoType; }
- }
-
- public virtual Asn1Encodable InfoValue
- {
- get { return infoValue; }
- }
-
- /**
- *
- * InfoTypeAndValue ::= SEQUENCE {
- * infoType OBJECT IDENTIFIER,
- * infoValue ANY DEFINED BY infoType OPTIONAL
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(infoType);
-
- if (infoValue != null)
- {
- v.Add(infoValue);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/KeyRecRepContent.cs b/BCCrypto/src/asn1/cmp/KeyRecRepContent.cs
deleted file mode 100644
index 00c4612..0000000
--- a/BCCrypto/src/asn1/cmp/KeyRecRepContent.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class KeyRecRepContent
- : Asn1Encodable
- {
- private readonly PkiStatusInfo status;
- private readonly CmpCertificate newSigCert;
- private readonly Asn1Sequence caCerts;
- private readonly Asn1Sequence keyPairHist;
-
- private KeyRecRepContent(Asn1Sequence seq)
- {
- status = PkiStatusInfo.GetInstance(seq[0]);
-
- for (int pos = 1; pos < seq.Count; ++pos)
- {
- Asn1TaggedObject tObj = Asn1TaggedObject.GetInstance(seq[pos]);
-
- switch (tObj.TagNo)
- {
- case 0:
- newSigCert = CmpCertificate.GetInstance(tObj.GetObject());
- break;
- case 1:
- caCerts = Asn1Sequence.GetInstance(tObj.GetObject());
- break;
- case 2:
- keyPairHist = Asn1Sequence.GetInstance(tObj.GetObject());
- break;
- default:
- throw new ArgumentException("unknown tag number: " + tObj.TagNo, "seq");
- }
- }
- }
-
- public static KeyRecRepContent GetInstance(object obj)
- {
- if (obj is KeyRecRepContent)
- return (KeyRecRepContent)obj;
-
- if (obj is Asn1Sequence)
- return new KeyRecRepContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual PkiStatusInfo Status
- {
- get { return status; }
- }
-
- public virtual CmpCertificate NewSigCert
- {
- get { return newSigCert; }
- }
-
- public virtual CmpCertificate[] GetCACerts()
- {
- if (caCerts == null)
- return null;
-
- CmpCertificate[] results = new CmpCertificate[caCerts.Count];
- for (int i = 0; i != results.Length; ++i)
- {
- results[i] = CmpCertificate.GetInstance(caCerts[i]);
- }
- return results;
- }
-
- public virtual CertifiedKeyPair[] GetKeyPairHist()
- {
- if (keyPairHist == null)
- return null;
-
- CertifiedKeyPair[] results = new CertifiedKeyPair[keyPairHist.Count];
- for (int i = 0; i != results.Length; ++i)
- {
- results[i] = CertifiedKeyPair.GetInstance(keyPairHist[i]);
- }
- return results;
- }
-
- /**
- *
- * KeyRecRepContent ::= SEQUENCE {
- * status PKIStatusInfo,
- * newSigCert [0] CMPCertificate OPTIONAL,
- * caCerts [1] SEQUENCE SIZE (1..MAX) OF
- * CMPCertificate OPTIONAL,
- * keyPairHist [2] SEQUENCE SIZE (1..MAX) OF
- * CertifiedKeyPair OPTIONAL
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(status);
- AddOptional(v, 0, newSigCert);
- AddOptional(v, 1, caCerts);
- AddOptional(v, 2, keyPairHist);
- return new DerSequence(v);
- }
-
- private void AddOptional(Asn1EncodableVector v, int tagNo, Asn1Encodable obj)
- {
- if (obj != null)
- {
- v.Add(new DerTaggedObject(true, tagNo, obj));
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/OobCertHash.cs b/BCCrypto/src/asn1/cmp/OobCertHash.cs
deleted file mode 100644
index cd8192b..0000000
--- a/BCCrypto/src/asn1/cmp/OobCertHash.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Crmf;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class OobCertHash
- : Asn1Encodable
- {
- private readonly AlgorithmIdentifier hashAlg;
- private readonly CertId certId;
- private readonly DerBitString hashVal;
-
- private OobCertHash(Asn1Sequence seq)
- {
- int index = seq.Count - 1;
-
- hashVal = DerBitString.GetInstance(seq[index--]);
-
- for (int i = index; i >= 0; i--)
- {
- Asn1TaggedObject tObj = (Asn1TaggedObject)seq[i];
-
- if (tObj.TagNo == 0)
- {
- hashAlg = AlgorithmIdentifier.GetInstance(tObj, true);
- }
- else
- {
- certId = CertId.GetInstance(tObj, true);
- }
- }
- }
-
- public static OobCertHash GetInstance(object obj)
- {
- if (obj is OobCertHash)
- return (OobCertHash)obj;
-
- if (obj is Asn1Sequence)
- return new OobCertHash((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual AlgorithmIdentifier HashAlg
- {
- get { return hashAlg; }
- }
-
- public virtual CertId CertID
- {
- get { return certId; }
- }
-
- /**
- *
- * OobCertHash ::= SEQUENCE {
- * hashAlg [0] AlgorithmIdentifier OPTIONAL,
- * certId [1] CertId OPTIONAL,
- * hashVal BIT STRING
- * -- hashVal is calculated over the Der encoding of the
- * -- self-signed certificate with the identifier certID.
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
- AddOptional(v, 0, hashAlg);
- AddOptional(v, 1, certId);
- v.Add(hashVal);
- return new DerSequence(v);
- }
-
- private void AddOptional(Asn1EncodableVector v, int tagNo, Asn1Encodable obj)
- {
- if (obj != null)
- {
- v.Add(new DerTaggedObject(true, tagNo, obj));
- }
- }
- }
-}
-
diff --git a/BCCrypto/src/asn1/cmp/PKIBody.cs b/BCCrypto/src/asn1/cmp/PKIBody.cs
deleted file mode 100644
index f17eed6..0000000
--- a/BCCrypto/src/asn1/cmp/PKIBody.cs
+++ /dev/null
@@ -1,187 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Crmf;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PkiBody
- : Asn1Encodable, IAsn1Choice
- {
- public const int TYPE_INIT_REQ = 0;
- public const int TYPE_INIT_REP = 1;
- public const int TYPE_CERT_REQ = 2;
- public const int TYPE_CERT_REP = 3;
- public const int TYPE_P10_CERT_REQ = 4;
- public const int TYPE_POPO_CHALL = 5;
- public const int TYPE_POPO_REP = 6;
- public const int TYPE_KEY_UPDATE_REQ = 7;
- public const int TYPE_KEY_UPDATE_REP = 8;
- public const int TYPE_KEY_RECOVERY_REQ = 9;
- public const int TYPE_KEY_RECOVERY_REP = 10;
- public const int TYPE_REVOCATION_REQ = 11;
- public const int TYPE_REVOCATION_REP = 12;
- public const int TYPE_CROSS_CERT_REQ = 13;
- public const int TYPE_CROSS_CERT_REP = 14;
- public const int TYPE_CA_KEY_UPDATE_ANN = 15;
- public const int TYPE_CERT_ANN = 16;
- public const int TYPE_REVOCATION_ANN = 17;
- public const int TYPE_CRL_ANN = 18;
- public const int TYPE_CONFIRM = 19;
- public const int TYPE_NESTED = 20;
- public const int TYPE_GEN_MSG = 21;
- public const int TYPE_GEN_REP = 22;
- public const int TYPE_ERROR = 23;
- public const int TYPE_CERT_CONFIRM = 24;
- public const int TYPE_POLL_REQ = 25;
- public const int TYPE_POLL_REP = 26;
-
- private int tagNo;
- private Asn1Encodable body;
-
- public static PkiBody GetInstance(object obj)
- {
- if (obj is PkiBody)
- return (PkiBody)obj;
-
- if (obj is Asn1TaggedObject)
- return new PkiBody((Asn1TaggedObject)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- private PkiBody(Asn1TaggedObject tagged)
- {
- tagNo = tagged.TagNo;
- body = GetBodyForType(tagNo, tagged.GetObject());
- }
-
- /**
- * Creates a new PkiBody.
- * @param type one of the TYPE_* constants
- * @param content message content
- */
- public PkiBody(
- int type,
- Asn1Encodable content)
- {
- tagNo = type;
- body = GetBodyForType(type, content);
- }
-
- private static Asn1Encodable GetBodyForType(
- int type,
- Asn1Encodable o)
- {
- switch (type)
- {
- case TYPE_INIT_REQ:
- return CertReqMessages.GetInstance(o);
- case TYPE_INIT_REP:
- return CertRepMessage.GetInstance(o);
- case TYPE_CERT_REQ:
- return CertReqMessages.GetInstance(o);
- case TYPE_CERT_REP:
- return CertRepMessage.GetInstance(o);
- case TYPE_P10_CERT_REQ:
- return CertificationRequest.GetInstance(o);
- case TYPE_POPO_CHALL:
- return PopoDecKeyChallContent.GetInstance(o);
- case TYPE_POPO_REP:
- return PopoDecKeyRespContent.GetInstance(o);
- case TYPE_KEY_UPDATE_REQ:
- return CertReqMessages.GetInstance(o);
- case TYPE_KEY_UPDATE_REP:
- return CertRepMessage.GetInstance(o);
- case TYPE_KEY_RECOVERY_REQ:
- return CertReqMessages.GetInstance(o);
- case TYPE_KEY_RECOVERY_REP:
- return KeyRecRepContent.GetInstance(o);
- case TYPE_REVOCATION_REQ:
- return RevReqContent.GetInstance(o);
- case TYPE_REVOCATION_REP:
- return RevRepContent.GetInstance(o);
- case TYPE_CROSS_CERT_REQ:
- return CertReqMessages.GetInstance(o);
- case TYPE_CROSS_CERT_REP:
- return CertRepMessage.GetInstance(o);
- case TYPE_CA_KEY_UPDATE_ANN:
- return CAKeyUpdAnnContent.GetInstance(o);
- case TYPE_CERT_ANN:
- return CmpCertificate.GetInstance(o);
- case TYPE_REVOCATION_ANN:
- return RevAnnContent.GetInstance(o);
- case TYPE_CRL_ANN:
- return CrlAnnContent.GetInstance(o);
- case TYPE_CONFIRM:
- return PkiConfirmContent.GetInstance(o);
- case TYPE_NESTED:
- return PkiMessages.GetInstance(o);
- case TYPE_GEN_MSG:
- return GenMsgContent.GetInstance(o);
- case TYPE_GEN_REP:
- return GenRepContent.GetInstance(o);
- case TYPE_ERROR:
- return ErrorMsgContent.GetInstance(o);
- case TYPE_CERT_CONFIRM:
- return CertConfirmContent.GetInstance(o);
- case TYPE_POLL_REQ:
- return PollReqContent.GetInstance(o);
- case TYPE_POLL_REP:
- return PollRepContent.GetInstance(o);
- default:
- throw new ArgumentException("unknown tag number: " + type, "type");
- }
- }
-
- public virtual int Type
- {
- get { return tagNo; }
- }
-
- public virtual Asn1Encodable Content
- {
- get { return body; }
- }
-
- /**
- *
- * PkiBody ::= CHOICE { -- message-specific body elements
- * ir [0] CertReqMessages, --Initialization Request
- * ip [1] CertRepMessage, --Initialization Response
- * cr [2] CertReqMessages, --Certification Request
- * cp [3] CertRepMessage, --Certification Response
- * p10cr [4] CertificationRequest, --imported from [PKCS10]
- * popdecc [5] POPODecKeyChallContent, --pop Challenge
- * popdecr [6] POPODecKeyRespContent, --pop Response
- * kur [7] CertReqMessages, --Key Update Request
- * kup [8] CertRepMessage, --Key Update Response
- * krr [9] CertReqMessages, --Key Recovery Request
- * krp [10] KeyRecRepContent, --Key Recovery Response
- * rr [11] RevReqContent, --Revocation Request
- * rp [12] RevRepContent, --Revocation Response
- * ccr [13] CertReqMessages, --Cross-Cert. Request
- * ccp [14] CertRepMessage, --Cross-Cert. Response
- * ckuann [15] CAKeyUpdAnnContent, --CA Key Update Ann.
- * cann [16] CertAnnContent, --Certificate Ann.
- * rann [17] RevAnnContent, --Revocation Ann.
- * crlann [18] CRLAnnContent, --CRL Announcement
- * pkiconf [19] PKIConfirmContent, --Confirmation
- * nested [20] NestedMessageContent, --Nested Message
- * genm [21] GenMsgContent, --General Message
- * genp [22] GenRepContent, --General Response
- * error [23] ErrorMsgContent, --Error Message
- * certConf [24] CertConfirmContent, --Certificate confirm
- * pollReq [25] PollReqContent, --Polling request
- * pollRep [26] PollRepContent --Polling response
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerTaggedObject(true, tagNo, body);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PKIConfirmContent.cs b/BCCrypto/src/asn1/cmp/PKIConfirmContent.cs
deleted file mode 100644
index d154427..0000000
--- a/BCCrypto/src/asn1/cmp/PKIConfirmContent.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PkiConfirmContent
- : Asn1Encodable
- {
- public static PkiConfirmContent GetInstance(object obj)
- {
- if (obj is PkiConfirmContent)
- return (PkiConfirmContent)obj;
-
- if (obj is Asn1Null)
- return new PkiConfirmContent();
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public PkiConfirmContent()
- {
- }
-
- /**
- *
- * PkiConfirmContent ::= NULL
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return DerNull.Instance;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PKIFailureInfo.cs b/BCCrypto/src/asn1/cmp/PKIFailureInfo.cs
deleted file mode 100644
index 75a3ff0..0000000
--- a/BCCrypto/src/asn1/cmp/PKIFailureInfo.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- /**
- *
- * PKIFailureInfo ::= BIT STRING {
- * badAlg (0),
- * -- unrecognized or unsupported Algorithm Identifier
- * badMessageCheck (1), -- integrity check failed (e.g., signature did not verify)
- * badRequest (2),
- * -- transaction not permitted or supported
- * badTime (3), -- messageTime was not sufficiently close to the system time, as defined by local policy
- * badCertId (4), -- no certificate could be found matching the provided criteria
- * badDataFormat (5),
- * -- the data submitted has the wrong format
- * wrongAuthority (6), -- the authority indicated in the request is different from the one creating the response token
- * incorrectData (7), -- the requester's data is incorrect (for notary services)
- * missingTimeStamp (8), -- when the timestamp is missing but should be there (by policy)
- * badPOP (9) -- the proof-of-possession failed
- * certRevoked (10),
- * certConfirmed (11),
- * wrongIntegrity (12),
- * badRecipientNonce (13),
- * timeNotAvailable (14),
- * -- the TSA's time source is not available
- * unacceptedPolicy (15),
- * -- the requested TSA policy is not supported by the TSA
- * unacceptedExtension (16),
- * -- the requested extension is not supported by the TSA
- * addInfoNotAvailable (17)
- * -- the additional information requested could not be understood
- * -- or is not available
- * badSenderNonce (18),
- * badCertTemplate (19),
- * signerNotTrusted (20),
- * transactionIdInUse (21),
- * unsupportedVersion (22),
- * notAuthorized (23),
- * systemUnavail (24),
- * systemFailure (25),
- * -- the request cannot be handled due to system failure
- * duplicateCertReq (26)
- *
- */
- public class PkiFailureInfo
- : DerBitString
- {
- public const int BadAlg = (1 << 7); // unrecognized or unsupported Algorithm Identifier
- public const int BadMessageCheck = (1 << 6); // integrity check failed (e.g., signature did not verify)
- public const int BadRequest = (1 << 5);
- public const int BadTime = (1 << 4); // -- messageTime was not sufficiently close to the system time, as defined by local policy
- public const int BadCertId = (1 << 3); // no certificate could be found matching the provided criteria
- public const int BadDataFormat = (1 << 2);
- public const int WrongAuthority = (1 << 1); // the authority indicated in the request is different from the one creating the response token
- public const int IncorrectData = 1; // the requester's data is incorrect (for notary services)
- public const int MissingTimeStamp = (1 << 15); // when the timestamp is missing but should be there (by policy)
- public const int BadPop = (1 << 14); // the proof-of-possession failed
- public const int CertRevoked = (1 << 13);
- public const int CertConfirmed = (1 << 12);
- public const int WrongIntegrity = (1 << 11);
- public const int BadRecipientNonce = (1 << 10);
- public const int TimeNotAvailable = (1 << 9); // the TSA's time source is not available
- public const int UnacceptedPolicy = (1 << 8); // the requested TSA policy is not supported by the TSA
- public const int UnacceptedExtension = (1 << 23); //the requested extension is not supported by the TSA
- public const int AddInfoNotAvailable = (1 << 22); //the additional information requested could not be understood or is not available
- public const int BadSenderNonce = (1 << 21);
- public const int BadCertTemplate = (1 << 20);
- public const int SignerNotTrusted = (1 << 19);
- public const int TransactionIdInUse = (1 << 18);
- public const int UnsupportedVersion = (1 << 17);
- public const int NotAuthorized = (1 << 16);
- public const int SystemUnavail = (1 << 31);
- public const int SystemFailure = (1 << 30); //the request cannot be handled due to system failure
- public const int DuplicateCertReq = (1 << 29);
-
- /**
- * Basic constructor.
- */
- public PkiFailureInfo(int info)
- : base(info)
- {
- }
-
- public PkiFailureInfo(
- DerBitString info)
- : base(info.GetBytes(), info.PadBits)
- {
- }
-
- public override string ToString()
- {
- return "PkiFailureInfo: 0x" + this.IntValue.ToString("X");
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PKIFreeText.cs b/BCCrypto/src/asn1/cmp/PKIFreeText.cs
deleted file mode 100644
index fef5254..0000000
--- a/BCCrypto/src/asn1/cmp/PKIFreeText.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PkiFreeText
- : Asn1Encodable
- {
- internal Asn1Sequence strings;
-
- public static PkiFreeText GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- public static PkiFreeText GetInstance(
- object obj)
- {
- if (obj is PkiFreeText)
- {
- return (PkiFreeText)obj;
- }
- else if (obj is Asn1Sequence)
- {
- return new PkiFreeText((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public PkiFreeText(
- Asn1Sequence seq)
- {
- foreach (object o in seq)
- {
- if (!(o is DerUtf8String))
- {
- throw new ArgumentException("attempt to insert non UTF8 STRING into PkiFreeText");
- }
- }
-
- this.strings = seq;
- }
-
- public PkiFreeText(
- DerUtf8String p)
- {
- strings = new DerSequence(p);
- }
-
- /**
- * Return the number of string elements present.
- *
- * @return number of elements present.
- */
- [Obsolete("Use 'Count' property instead")]
- public int Size
- {
- get { return strings.Count; }
- }
-
- public int Count
- {
- get { return strings.Count; }
- }
-
- /**
- * Return the UTF8STRING at index.
- *
- * @param index index of the string of interest
- * @return the string at index.
- */
- public DerUtf8String this[int index]
- {
- get { return (DerUtf8String) strings[index]; }
- }
-
- [Obsolete("Use 'object[index]' syntax instead")]
- public DerUtf8String GetStringAt(
- int index)
- {
- return this[index];
- }
-
- /**
- *
- * PkiFreeText ::= SEQUENCE SIZE (1..MAX) OF UTF8String
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return strings;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PKIHeader.cs b/BCCrypto/src/asn1/cmp/PKIHeader.cs
deleted file mode 100644
index 577cb45..0000000
--- a/BCCrypto/src/asn1/cmp/PKIHeader.cs
+++ /dev/null
@@ -1,238 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PkiHeader
- : Asn1Encodable
- {
- /**
- * Value for a "null" recipient or sender.
- */
- public static readonly GeneralName NULL_NAME = new GeneralName(X509Name.GetInstance(new DerSequence()));
-
- public static readonly int CMP_1999 = 1;
- public static readonly int CMP_2000 = 2;
-
- private readonly DerInteger pvno;
- private readonly GeneralName sender;
- private readonly GeneralName recipient;
- private readonly DerGeneralizedTime messageTime;
- private readonly AlgorithmIdentifier protectionAlg;
- private readonly Asn1OctetString senderKID; // KeyIdentifier
- private readonly Asn1OctetString recipKID; // KeyIdentifier
- private readonly Asn1OctetString transactionID;
- private readonly Asn1OctetString senderNonce;
- private readonly Asn1OctetString recipNonce;
- private readonly PkiFreeText freeText;
- private readonly Asn1Sequence generalInfo;
-
- private PkiHeader(Asn1Sequence seq)
- {
- pvno = DerInteger.GetInstance(seq[0]);
- sender = GeneralName.GetInstance(seq[1]);
- recipient = GeneralName.GetInstance(seq[2]);
-
- for (int pos = 3; pos < seq.Count; ++pos)
- {
- Asn1TaggedObject tObj = (Asn1TaggedObject)seq[pos];
-
- switch (tObj.TagNo)
- {
- case 0:
- messageTime = DerGeneralizedTime.GetInstance(tObj, true);
- break;
- case 1:
- protectionAlg = AlgorithmIdentifier.GetInstance(tObj, true);
- break;
- case 2:
- senderKID = Asn1OctetString.GetInstance(tObj, true);
- break;
- case 3:
- recipKID = Asn1OctetString.GetInstance(tObj, true);
- break;
- case 4:
- transactionID = Asn1OctetString.GetInstance(tObj, true);
- break;
- case 5:
- senderNonce = Asn1OctetString.GetInstance(tObj, true);
- break;
- case 6:
- recipNonce = Asn1OctetString.GetInstance(tObj, true);
- break;
- case 7:
- freeText = PkiFreeText.GetInstance(tObj, true);
- break;
- case 8:
- generalInfo = Asn1Sequence.GetInstance(tObj, true);
- break;
- default:
- throw new ArgumentException("unknown tag number: " + tObj.TagNo, "seq");
- }
- }
- }
-
- public static PkiHeader GetInstance(object obj)
- {
- if (obj is PkiHeader)
- return (PkiHeader)obj;
-
- if (obj is Asn1Sequence)
- return new PkiHeader((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public PkiHeader(
- int pvno,
- GeneralName sender,
- GeneralName recipient)
- : this(new DerInteger(pvno), sender, recipient)
- {
- }
-
- private PkiHeader(
- DerInteger pvno,
- GeneralName sender,
- GeneralName recipient)
- {
- this.pvno = pvno;
- this.sender = sender;
- this.recipient = recipient;
- }
-
- public virtual DerInteger Pvno
- {
- get { return pvno; }
- }
-
- public virtual GeneralName Sender
- {
- get { return sender; }
- }
-
- public virtual GeneralName Recipient
- {
- get { return recipient; }
- }
-
- public virtual DerGeneralizedTime MessageTime
- {
- get { return messageTime; }
- }
-
- public virtual AlgorithmIdentifier ProtectionAlg
- {
- get { return protectionAlg; }
- }
-
- public virtual Asn1OctetString SenderKID
- {
- get { return senderKID; }
- }
-
- public virtual Asn1OctetString RecipKID
- {
- get { return recipKID; }
- }
-
- public virtual Asn1OctetString TransactionID
- {
- get { return transactionID; }
- }
-
- public virtual Asn1OctetString SenderNonce
- {
- get { return senderNonce; }
- }
-
- public virtual Asn1OctetString RecipNonce
- {
- get { return recipNonce; }
- }
-
- public virtual PkiFreeText FreeText
- {
- get { return freeText; }
- }
-
- public virtual InfoTypeAndValue[] GetGeneralInfo()
- {
- if (generalInfo == null)
- {
- return null;
- }
- InfoTypeAndValue[] results = new InfoTypeAndValue[generalInfo.Count];
- for (int i = 0; i < results.Length; i++)
- {
- results[i] = InfoTypeAndValue.GetInstance(generalInfo[i]);
- }
- return results;
- }
-
- /**
- *
- * PkiHeader ::= SEQUENCE {
- * pvno INTEGER { cmp1999(1), cmp2000(2) },
- * sender GeneralName,
- * -- identifies the sender
- * recipient GeneralName,
- * -- identifies the intended recipient
- * messageTime [0] GeneralizedTime OPTIONAL,
- * -- time of production of this message (used when sender
- * -- believes that the transport will be "suitable"; i.e.,
- * -- that the time will still be meaningful upon receipt)
- * protectionAlg [1] AlgorithmIdentifier OPTIONAL,
- * -- algorithm used for calculation of protection bits
- * senderKID [2] KeyIdentifier OPTIONAL,
- * recipKID [3] KeyIdentifier OPTIONAL,
- * -- to identify specific keys used for protection
- * transactionID [4] OCTET STRING OPTIONAL,
- * -- identifies the transaction; i.e., this will be the same in
- * -- corresponding request, response, certConf, and PKIConf
- * -- messages
- * senderNonce [5] OCTET STRING OPTIONAL,
- * recipNonce [6] OCTET STRING OPTIONAL,
- * -- nonces used to provide replay protection, senderNonce
- * -- is inserted by the creator of this message; recipNonce
- * -- is a nonce previously inserted in a related message by
- * -- the intended recipient of this message
- * freeText [7] PKIFreeText OPTIONAL,
- * -- this may be used to indicate context-specific instructions
- * -- (this field is intended for human consumption)
- * generalInfo [8] SEQUENCE SIZE (1..MAX) OF
- * InfoTypeAndValue OPTIONAL
- * -- this may be used to convey context-specific information
- * -- (this field not primarily intended for human consumption)
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(pvno, sender, recipient);
-
- AddOptional(v, 0, messageTime);
- AddOptional(v, 1, protectionAlg);
- AddOptional(v, 2, senderKID);
- AddOptional(v, 3, recipKID);
- AddOptional(v, 4, transactionID);
- AddOptional(v, 5, senderNonce);
- AddOptional(v, 6, recipNonce);
- AddOptional(v, 7, freeText);
- AddOptional(v, 8, generalInfo);
-
- return new DerSequence(v);
- }
-
- private static void AddOptional(Asn1EncodableVector v, int tagNo, Asn1Encodable obj)
- {
- if (obj != null)
- {
- v.Add(new DerTaggedObject(true, tagNo, obj));
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PKIHeaderBuilder.cs b/BCCrypto/src/asn1/cmp/PKIHeaderBuilder.cs
deleted file mode 100644
index 00073c0..0000000
--- a/BCCrypto/src/asn1/cmp/PKIHeaderBuilder.cs
+++ /dev/null
@@ -1,223 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PkiHeaderBuilder
- {
- private DerInteger pvno;
- private GeneralName sender;
- private GeneralName recipient;
- private DerGeneralizedTime messageTime;
- private AlgorithmIdentifier protectionAlg;
- private Asn1OctetString senderKID; // KeyIdentifier
- private Asn1OctetString recipKID; // KeyIdentifier
- private Asn1OctetString transactionID;
- private Asn1OctetString senderNonce;
- private Asn1OctetString recipNonce;
- private PkiFreeText freeText;
- private Asn1Sequence generalInfo;
-
- public PkiHeaderBuilder(
- int pvno,
- GeneralName sender,
- GeneralName recipient)
- : this(new DerInteger(pvno), sender, recipient)
- {
- }
-
- private PkiHeaderBuilder(
- DerInteger pvno,
- GeneralName sender,
- GeneralName recipient)
- {
- this.pvno = pvno;
- this.sender = sender;
- this.recipient = recipient;
- }
-
- public virtual PkiHeaderBuilder SetMessageTime(DerGeneralizedTime time)
- {
- messageTime = time;
- return this;
- }
-
- public virtual PkiHeaderBuilder SetProtectionAlg(AlgorithmIdentifier aid)
- {
- protectionAlg = aid;
- return this;
- }
-
- public virtual PkiHeaderBuilder SetSenderKID(byte[] kid)
- {
- return SetSenderKID(kid == null ? null : new DerOctetString(kid));
- }
-
- public virtual PkiHeaderBuilder SetSenderKID(Asn1OctetString kid)
- {
- senderKID = kid;
- return this;
- }
-
- public virtual PkiHeaderBuilder SetRecipKID(byte[] kid)
- {
- return SetRecipKID(kid == null ? null : new DerOctetString(kid));
- }
-
- public virtual PkiHeaderBuilder SetRecipKID(DerOctetString kid)
- {
- recipKID = kid;
- return this;
- }
-
- public virtual PkiHeaderBuilder SetTransactionID(byte[] tid)
- {
- return SetTransactionID(tid == null ? null : new DerOctetString(tid));
- }
-
- public virtual PkiHeaderBuilder SetTransactionID(Asn1OctetString tid)
- {
- transactionID = tid;
- return this;
- }
-
- public virtual PkiHeaderBuilder SetSenderNonce(byte[] nonce)
- {
- return SetSenderNonce(nonce == null ? null : new DerOctetString(nonce));
- }
-
- public virtual PkiHeaderBuilder SetSenderNonce(Asn1OctetString nonce)
- {
- senderNonce = nonce;
- return this;
- }
-
- public virtual PkiHeaderBuilder SetRecipNonce(byte[] nonce)
- {
- return SetRecipNonce(nonce == null ? null : new DerOctetString(nonce));
- }
-
- public virtual PkiHeaderBuilder SetRecipNonce(Asn1OctetString nonce)
- {
- recipNonce = nonce;
- return this;
- }
-
- public virtual PkiHeaderBuilder SetFreeText(PkiFreeText text)
- {
- freeText = text;
- return this;
- }
-
- public virtual PkiHeaderBuilder SetGeneralInfo(InfoTypeAndValue genInfo)
- {
- return SetGeneralInfo(MakeGeneralInfoSeq(genInfo));
- }
-
- public virtual PkiHeaderBuilder SetGeneralInfo(InfoTypeAndValue[] genInfos)
- {
- return SetGeneralInfo(MakeGeneralInfoSeq(genInfos));
- }
-
- public virtual PkiHeaderBuilder SetGeneralInfo(Asn1Sequence seqOfInfoTypeAndValue)
- {
- generalInfo = seqOfInfoTypeAndValue;
- return this;
- }
-
- private static Asn1Sequence MakeGeneralInfoSeq(
- InfoTypeAndValue generalInfo)
- {
- return new DerSequence(generalInfo);
- }
-
- private static Asn1Sequence MakeGeneralInfoSeq(
- InfoTypeAndValue[] generalInfos)
- {
- Asn1Sequence genInfoSeq = null;
- if (generalInfos != null)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
- for (int i = 0; i < generalInfos.Length; ++i)
- {
- v.Add(generalInfos[i]);
- }
- genInfoSeq = new DerSequence(v);
- }
- return genInfoSeq;
- }
-
- /**
- *
- * PKIHeader ::= SEQUENCE {
- * pvno INTEGER { cmp1999(1), cmp2000(2) },
- * sender GeneralName,
- * -- identifies the sender
- * recipient GeneralName,
- * -- identifies the intended recipient
- * messageTime [0] GeneralizedTime OPTIONAL,
- * -- time of production of this message (used when sender
- * -- believes that the transport will be "suitable"; i.e.,
- * -- that the time will still be meaningful upon receipt)
- * protectionAlg [1] AlgorithmIdentifier OPTIONAL,
- * -- algorithm used for calculation of protection bits
- * senderKID [2] KeyIdentifier OPTIONAL,
- * recipKID [3] KeyIdentifier OPTIONAL,
- * -- to identify specific keys used for protection
- * transactionID [4] OCTET STRING OPTIONAL,
- * -- identifies the transaction; i.e., this will be the same in
- * -- corresponding request, response, certConf, and PKIConf
- * -- messages
- * senderNonce [5] OCTET STRING OPTIONAL,
- * recipNonce [6] OCTET STRING OPTIONAL,
- * -- nonces used to provide replay protection, senderNonce
- * -- is inserted by the creator of this message; recipNonce
- * -- is a nonce previously inserted in a related message by
- * -- the intended recipient of this message
- * freeText [7] PKIFreeText OPTIONAL,
- * -- this may be used to indicate context-specific instructions
- * -- (this field is intended for human consumption)
- * generalInfo [8] SEQUENCE SIZE (1..MAX) OF
- * InfoTypeAndValue OPTIONAL
- * -- this may be used to convey context-specific information
- * -- (this field not primarily intended for human consumption)
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public virtual PkiHeader Build()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(pvno, sender, recipient);
- AddOptional(v, 0, messageTime);
- AddOptional(v, 1, protectionAlg);
- AddOptional(v, 2, senderKID);
- AddOptional(v, 3, recipKID);
- AddOptional(v, 4, transactionID);
- AddOptional(v, 5, senderNonce);
- AddOptional(v, 6, recipNonce);
- AddOptional(v, 7, freeText);
- AddOptional(v, 8, generalInfo);
-
- messageTime = null;
- protectionAlg = null;
- senderKID = null;
- recipKID = null;
- transactionID = null;
- senderNonce = null;
- recipNonce = null;
- freeText = null;
- generalInfo = null;
-
- return PkiHeader.GetInstance(new DerSequence(v));
- }
-
- private void AddOptional(Asn1EncodableVector v, int tagNo, Asn1Encodable obj)
- {
- if (obj != null)
- {
- v.Add(new DerTaggedObject(true, tagNo, obj));
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PKIMessage.cs b/BCCrypto/src/asn1/cmp/PKIMessage.cs
deleted file mode 100644
index 086a2d9..0000000
--- a/BCCrypto/src/asn1/cmp/PKIMessage.cs
+++ /dev/null
@@ -1,140 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PkiMessage
- : Asn1Encodable
- {
- private readonly PkiHeader header;
- private readonly PkiBody body;
- private readonly DerBitString protection;
- private readonly Asn1Sequence extraCerts;
-
- private PkiMessage(Asn1Sequence seq)
- {
- header = PkiHeader.GetInstance(seq[0]);
- body = PkiBody.GetInstance(seq[1]);
-
- for (int pos = 2; pos < seq.Count; ++pos)
- {
- Asn1TaggedObject tObj = (Asn1TaggedObject)seq[pos].ToAsn1Object();
-
- if (tObj.TagNo == 0)
- {
- protection = DerBitString.GetInstance(tObj, true);
- }
- else
- {
- extraCerts = Asn1Sequence.GetInstance(tObj, true);
- }
- }
- }
-
- public static PkiMessage GetInstance(object obj)
- {
- if (obj is PkiMessage)
- return (PkiMessage)obj;
-
- if (obj != null)
- return new PkiMessage(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- /**
- * Creates a new PkiMessage.
- *
- * @param header message header
- * @param body message body
- * @param protection message protection (may be null)
- * @param extraCerts extra certificates (may be null)
- */
- public PkiMessage(
- PkiHeader header,
- PkiBody body,
- DerBitString protection,
- CmpCertificate[] extraCerts)
- {
- this.header = header;
- this.body = body;
- this.protection = protection;
- if (extraCerts != null)
- {
- this.extraCerts = new DerSequence(extraCerts);
- }
- }
-
- public PkiMessage(
- PkiHeader header,
- PkiBody body,
- DerBitString protection)
- : this(header, body, protection, null)
- {
- }
-
- public PkiMessage(
- PkiHeader header,
- PkiBody body)
- : this(header, body, null, null)
- {
- }
-
- public virtual PkiHeader Header
- {
- get { return header; }
- }
-
- public virtual PkiBody Body
- {
- get { return body; }
- }
-
- public virtual DerBitString Protection
- {
- get { return protection; }
- }
-
- public virtual CmpCertificate[] GetExtraCerts()
- {
- if (extraCerts == null)
- return null;
-
- CmpCertificate[] results = new CmpCertificate[extraCerts.Count];
- for (int i = 0; i < results.Length; ++i)
- {
- results[i] = CmpCertificate.GetInstance(extraCerts[i]);
- }
- return results;
- }
-
- /**
- *
- * PkiMessage ::= SEQUENCE {
- * header PKIHeader,
- * body PKIBody,
- * protection [0] PKIProtection OPTIONAL,
- * extraCerts [1] SEQUENCE SIZE (1..MAX) OF CMPCertificate
- * OPTIONAL
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(header, body);
-
- AddOptional(v, 0, protection);
- AddOptional(v, 1, extraCerts);
-
- return new DerSequence(v);
- }
-
- private static void AddOptional(Asn1EncodableVector v, int tagNo, Asn1Encodable obj)
- {
- if (obj != null)
- {
- v.Add(new DerTaggedObject(true, tagNo, obj));
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PKIMessages.cs b/BCCrypto/src/asn1/cmp/PKIMessages.cs
deleted file mode 100644
index eb01e54..0000000
--- a/BCCrypto/src/asn1/cmp/PKIMessages.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PkiMessages
- : Asn1Encodable
- {
- private Asn1Sequence content;
-
- private PkiMessages(Asn1Sequence seq)
- {
- content = seq;
- }
-
- public static PkiMessages GetInstance(object obj)
- {
- if (obj is PkiMessages)
- return (PkiMessages)obj;
-
- if (obj is Asn1Sequence)
- return new PkiMessages((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public PkiMessages(params PkiMessage[] msgs)
- {
- content = new DerSequence(msgs);
- }
-
- public virtual PkiMessage[] ToPkiMessageArray()
- {
- PkiMessage[] result = new PkiMessage[content.Count];
- for (int i = 0; i != result.Length; ++i)
- {
- result[i] = PkiMessage.GetInstance(content[i]);
- }
- return result;
- }
-
- /**
- *
- * PkiMessages ::= SEQUENCE SIZE (1..MAX) OF PkiMessage
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return content;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PKIStatus.cs b/BCCrypto/src/asn1/cmp/PKIStatus.cs
deleted file mode 100644
index ba757df..0000000
--- a/BCCrypto/src/asn1/cmp/PKIStatus.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public enum PkiStatus
- {
- Granted = 0,
- GrantedWithMods = 1,
- Rejection = 2,
- Waiting = 3,
- RevocationWarning = 4,
- RevocationNotification = 5,
- KeyUpdateWarning = 6,
- }
-
- public class PkiStatusEncodable
- : Asn1Encodable
- {
- public static readonly PkiStatusEncodable granted = new PkiStatusEncodable(PkiStatus.Granted);
- public static readonly PkiStatusEncodable grantedWithMods = new PkiStatusEncodable(PkiStatus.GrantedWithMods);
- public static readonly PkiStatusEncodable rejection = new PkiStatusEncodable(PkiStatus.Rejection);
- public static readonly PkiStatusEncodable waiting = new PkiStatusEncodable(PkiStatus.Waiting);
- public static readonly PkiStatusEncodable revocationWarning = new PkiStatusEncodable(PkiStatus.RevocationWarning);
- public static readonly PkiStatusEncodable revocationNotification = new PkiStatusEncodable(PkiStatus.RevocationNotification);
- public static readonly PkiStatusEncodable keyUpdateWaiting = new PkiStatusEncodable(PkiStatus.KeyUpdateWarning);
-
- private readonly DerInteger status;
-
- private PkiStatusEncodable(PkiStatus status)
- : this(new DerInteger((int)status))
- {
- }
-
- private PkiStatusEncodable(DerInteger status)
- {
- this.status = status;
- }
-
- public static PkiStatusEncodable GetInstance(object obj)
- {
- if (obj is PkiStatusEncodable)
- return (PkiStatusEncodable)obj;
-
- if (obj is DerInteger)
- return new PkiStatusEncodable((DerInteger)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual BigInteger Value
- {
- get { return status.Value; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return status;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PKIStatusInfo.cs b/BCCrypto/src/asn1/cmp/PKIStatusInfo.cs
deleted file mode 100644
index b19bf74..0000000
--- a/BCCrypto/src/asn1/cmp/PKIStatusInfo.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PkiStatusInfo
- : Asn1Encodable
- {
- DerInteger status;
- PkiFreeText statusString;
- DerBitString failInfo;
-
- public static PkiStatusInfo GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- public static PkiStatusInfo GetInstance(
- object obj)
- {
- if (obj is PkiStatusInfo)
- {
- return (PkiStatusInfo)obj;
- }
- else if (obj is Asn1Sequence)
- {
- return new PkiStatusInfo((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public PkiStatusInfo(
- Asn1Sequence seq)
- {
- this.status = DerInteger.GetInstance(seq[0]);
-
- this.statusString = null;
- this.failInfo = null;
-
- if (seq.Count > 2)
- {
- this.statusString = PkiFreeText.GetInstance(seq[1]);
- this.failInfo = DerBitString.GetInstance(seq[2]);
- }
- else if (seq.Count > 1)
- {
- object obj = seq[1];
- if (obj is DerBitString)
- {
- this.failInfo = DerBitString.GetInstance(obj);
- }
- else
- {
- this.statusString = PkiFreeText.GetInstance(obj);
- }
- }
- }
-
- /**
- * @param status
- */
- public PkiStatusInfo(int status)
- {
- this.status = new DerInteger(status);
- }
-
- /**
- * @param status
- * @param statusString
- */
- public PkiStatusInfo(
- int status,
- PkiFreeText statusString)
- {
- this.status = new DerInteger(status);
- this.statusString = statusString;
- }
-
- public PkiStatusInfo(
- int status,
- PkiFreeText statusString,
- PkiFailureInfo failInfo)
- {
- this.status = new DerInteger(status);
- this.statusString = statusString;
- this.failInfo = failInfo;
- }
-
- public BigInteger Status
- {
- get
- {
- return status.Value;
- }
- }
-
- public PkiFreeText StatusString
- {
- get
- {
- return statusString;
- }
- }
-
- public DerBitString FailInfo
- {
- get
- {
- return failInfo;
- }
- }
-
- /**
- *
- * PkiStatusInfo ::= SEQUENCE {
- * status PKIStatus, (INTEGER)
- * statusString PkiFreeText OPTIONAL,
- * failInfo PkiFailureInfo OPTIONAL (BIT STRING)
- * }
- *
- * PKIStatus:
- * granted (0), -- you got exactly what you asked for
- * grantedWithMods (1), -- you got something like what you asked for
- * rejection (2), -- you don't get it, more information elsewhere in the message
- * waiting (3), -- the request body part has not yet been processed, expect to hear more later
- * revocationWarning (4), -- this message contains a warning that a revocation is imminent
- * revocationNotification (5), -- notification that a revocation has occurred
- * keyUpdateWarning (6) -- update already done for the oldCertId specified in CertReqMsg
- *
- * PkiFailureInfo:
- * badAlg (0), -- unrecognized or unsupported Algorithm Identifier
- * badMessageCheck (1), -- integrity check failed (e.g., signature did not verify)
- * badRequest (2), -- transaction not permitted or supported
- * badTime (3), -- messageTime was not sufficiently close to the system time, as defined by local policy
- * badCertId (4), -- no certificate could be found matching the provided criteria
- * badDataFormat (5), -- the data submitted has the wrong format
- * wrongAuthority (6), -- the authority indicated in the request is different from the one creating the response token
- * incorrectData (7), -- the requester's data is incorrect (for notary services)
- * missingTimeStamp (8), -- when the timestamp is missing but should be there (by policy)
- * badPOP (9) -- the proof-of-possession failed
- *
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(status);
-
- if (statusString != null)
- {
- v.Add(statusString);
- }
-
- if (failInfo!= null)
- {
- v.Add(failInfo);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PbmParameter.cs b/BCCrypto/src/asn1/cmp/PbmParameter.cs
deleted file mode 100644
index 206b89b..0000000
--- a/BCCrypto/src/asn1/cmp/PbmParameter.cs
+++ /dev/null
@@ -1,101 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PbmParameter
- : Asn1Encodable
- {
- private Asn1OctetString salt;
- private AlgorithmIdentifier owf;
- private DerInteger iterationCount;
- private AlgorithmIdentifier mac;
-
- private PbmParameter(Asn1Sequence seq)
- {
- salt = Asn1OctetString.GetInstance(seq[0]);
- owf = AlgorithmIdentifier.GetInstance(seq[1]);
- iterationCount = DerInteger.GetInstance(seq[2]);
- mac = AlgorithmIdentifier.GetInstance(seq[3]);
- }
-
- public static PbmParameter GetInstance(object obj)
- {
- if (obj is PbmParameter)
- return (PbmParameter)obj;
-
- if (obj is Asn1Sequence)
- return new PbmParameter((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public PbmParameter(
- byte[] salt,
- AlgorithmIdentifier owf,
- int iterationCount,
- AlgorithmIdentifier mac)
- : this(new DerOctetString(salt), owf, new DerInteger(iterationCount), mac)
- {
- }
-
- public PbmParameter(
- Asn1OctetString salt,
- AlgorithmIdentifier owf,
- DerInteger iterationCount,
- AlgorithmIdentifier mac)
- {
- this.salt = salt;
- this.owf = owf;
- this.iterationCount = iterationCount;
- this.mac = mac;
- }
-
- public virtual Asn1OctetString Salt
- {
- get { return salt; }
- }
-
- public virtual AlgorithmIdentifier Owf
- {
- get { return owf; }
- }
-
- public virtual DerInteger IterationCount
- {
- get { return iterationCount; }
- }
-
- public virtual AlgorithmIdentifier Mac
- {
- get { return mac; }
- }
-
- /**
- *
- * PbmParameter ::= SEQUENCE {
- * salt OCTET STRING,
- * -- note: implementations MAY wish to limit acceptable sizes
- * -- of this string to values appropriate for their environment
- * -- in order to reduce the risk of denial-of-service attacks
- * owf AlgorithmIdentifier,
- * -- AlgId for a One-Way Function (SHA-1 recommended)
- * iterationCount INTEGER,
- * -- number of times the OWF is applied
- * -- note: implementations MAY wish to limit acceptable sizes
- * -- of this integer to values appropriate for their environment
- * -- in order to reduce the risk of denial-of-service attacks
- * mac AlgorithmIdentifier
- * -- the MAC AlgId (e.g., DES-MAC, Triple-DES-MAC [PKCS11],
- * } -- or HMAC [RFC2104, RFC2202])
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(salt, owf, iterationCount, mac);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PollRepContent.cs b/BCCrypto/src/asn1/cmp/PollRepContent.cs
deleted file mode 100644
index f8bb098..0000000
--- a/BCCrypto/src/asn1/cmp/PollRepContent.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PollRepContent
- : Asn1Encodable
- {
- private readonly DerInteger certReqId;
- private readonly DerInteger checkAfter;
- private readonly PkiFreeText reason;
-
- private PollRepContent(Asn1Sequence seq)
- {
- certReqId = DerInteger.GetInstance(seq[0]);
- checkAfter = DerInteger.GetInstance(seq[1]);
-
- if (seq.Count > 2)
- {
- reason = PkiFreeText.GetInstance(seq[2]);
- }
- }
-
- public static PollRepContent GetInstance(object obj)
- {
- if (obj is PollRepContent)
- return (PollRepContent)obj;
-
- if (obj is Asn1Sequence)
- return new PollRepContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual DerInteger CertReqID
- {
- get { return certReqId; }
- }
-
- public virtual DerInteger CheckAfter
- {
- get { return checkAfter; }
- }
-
- public virtual PkiFreeText Reason
- {
- get { return reason; }
- }
-
- /**
- *
- * PollRepContent ::= SEQUENCE OF SEQUENCE {
- * certReqId INTEGER,
- * checkAfter INTEGER, -- time in seconds
- * reason PKIFreeText OPTIONAL
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(certReqId, checkAfter);
- v.AddOptional(reason);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PollReqContent.cs b/BCCrypto/src/asn1/cmp/PollReqContent.cs
deleted file mode 100644
index dd9b0c3..0000000
--- a/BCCrypto/src/asn1/cmp/PollReqContent.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PollReqContent
- : Asn1Encodable
- {
- private readonly Asn1Sequence content;
-
- private PollReqContent(Asn1Sequence seq)
- {
- content = seq;
- }
-
- public static PollReqContent GetInstance(object obj)
- {
- if (obj is PollReqContent)
- return (PollReqContent)obj;
-
- if (obj is Asn1Sequence)
- return new PollReqContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual DerInteger[][] GetCertReqIDs()
- {
- DerInteger[][] result = new DerInteger[content.Count][];
- for (int i = 0; i != result.Length; ++i)
- {
- result[i] = SequenceToDerIntegerArray((Asn1Sequence)content[i]);
- }
- return result;
- }
-
- private static DerInteger[] SequenceToDerIntegerArray(Asn1Sequence seq)
- {
- DerInteger[] result = new DerInteger[seq.Count];
- for (int i = 0; i != result.Length; ++i)
- {
- result[i] = DerInteger.GetInstance(seq[i]);
- }
- return result;
- }
-
- /**
- *
- * PollReqContent ::= SEQUENCE OF SEQUENCE {
- * certReqId INTEGER
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return content;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PopoDecKeyChallContent.cs b/BCCrypto/src/asn1/cmp/PopoDecKeyChallContent.cs
deleted file mode 100644
index 03a13a5..0000000
--- a/BCCrypto/src/asn1/cmp/PopoDecKeyChallContent.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PopoDecKeyChallContent
- : Asn1Encodable
- {
- private readonly Asn1Sequence content;
-
- private PopoDecKeyChallContent(Asn1Sequence seq)
- {
- content = seq;
- }
-
- public static PopoDecKeyChallContent GetInstance(object obj)
- {
- if (obj is PopoDecKeyChallContent)
- return (PopoDecKeyChallContent)obj;
-
- if (obj is Asn1Sequence)
- return new PopoDecKeyChallContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual Challenge[] ToChallengeArray()
- {
- Challenge[] result = new Challenge[content.Count];
- for (int i = 0; i != result.Length; ++i)
- {
- result[i] = Challenge.GetInstance(content[i]);
- }
- return result;
- }
-
- /**
- *
- * PopoDecKeyChallContent ::= SEQUENCE OF Challenge
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return content;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/PopoDecKeyRespContent.cs b/BCCrypto/src/asn1/cmp/PopoDecKeyRespContent.cs
deleted file mode 100644
index 73f59b7..0000000
--- a/BCCrypto/src/asn1/cmp/PopoDecKeyRespContent.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class PopoDecKeyRespContent
- : Asn1Encodable
- {
- private readonly Asn1Sequence content;
-
- private PopoDecKeyRespContent(Asn1Sequence seq)
- {
- content = seq;
- }
-
- public static PopoDecKeyRespContent GetInstance(object obj)
- {
- if (obj is PopoDecKeyRespContent)
- return (PopoDecKeyRespContent)obj;
-
- if (obj is Asn1Sequence)
- return new PopoDecKeyRespContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual DerInteger[] ToDerIntegerArray()
- {
- DerInteger[] result = new DerInteger[content.Count];
- for (int i = 0; i != result.Length; ++i)
- {
- result[i] = DerInteger.GetInstance(content[i]);
- }
- return result;
- }
-
- /**
- *
- * PopoDecKeyRespContent ::= SEQUENCE OF INTEGER
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return content;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/ProtectedPart.cs b/BCCrypto/src/asn1/cmp/ProtectedPart.cs
deleted file mode 100644
index ed90708..0000000
--- a/BCCrypto/src/asn1/cmp/ProtectedPart.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class ProtectedPart
- : Asn1Encodable
- {
- private readonly PkiHeader header;
- private readonly PkiBody body;
-
- private ProtectedPart(Asn1Sequence seq)
- {
- header = PkiHeader.GetInstance(seq[0]);
- body = PkiBody.GetInstance(seq[1]);
- }
-
- public static ProtectedPart GetInstance(object obj)
- {
- if (obj is ProtectedPart)
- return (ProtectedPart)obj;
-
- if (obj is Asn1Sequence)
- return new ProtectedPart((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public ProtectedPart(PkiHeader header, PkiBody body)
- {
- this.header = header;
- this.body = body;
- }
-
- public virtual PkiHeader Header
- {
- get { return header; }
- }
-
- public virtual PkiBody Body
- {
- get { return body; }
- }
-
- /**
- *
- * ProtectedPart ::= SEQUENCE {
- * header PKIHeader,
- * body PKIBody
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(header, body);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/RevAnnContent.cs b/BCCrypto/src/asn1/cmp/RevAnnContent.cs
deleted file mode 100644
index d5d4262..0000000
--- a/BCCrypto/src/asn1/cmp/RevAnnContent.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Crmf;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class RevAnnContent
- : Asn1Encodable
- {
- private readonly PkiStatusEncodable status;
- private readonly CertId certId;
- private readonly DerGeneralizedTime willBeRevokedAt;
- private readonly DerGeneralizedTime badSinceDate;
- private readonly X509Extensions crlDetails;
-
- private RevAnnContent(Asn1Sequence seq)
- {
- status = PkiStatusEncodable.GetInstance(seq[0]);
- certId = CertId.GetInstance(seq[1]);
- willBeRevokedAt = DerGeneralizedTime.GetInstance(seq[2]);
- badSinceDate = DerGeneralizedTime.GetInstance(seq[3]);
-
- if (seq.Count > 4)
- {
- crlDetails = X509Extensions.GetInstance(seq[4]);
- }
- }
-
- public static RevAnnContent GetInstance(object obj)
- {
- if (obj is RevAnnContent)
- return (RevAnnContent)obj;
-
- if (obj is Asn1Sequence)
- return new RevAnnContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual PkiStatusEncodable Status
- {
- get { return status; }
- }
-
- public virtual CertId CertID
- {
- get { return certId; }
- }
-
- public virtual DerGeneralizedTime WillBeRevokedAt
- {
- get { return willBeRevokedAt; }
- }
-
- public virtual DerGeneralizedTime BadSinceDate
- {
- get { return badSinceDate; }
- }
-
- public virtual X509Extensions CrlDetails
- {
- get { return crlDetails; }
- }
-
- /**
- *
- * RevAnnContent ::= SEQUENCE {
- * status PKIStatus,
- * certId CertId,
- * willBeRevokedAt GeneralizedTime,
- * badSinceDate GeneralizedTime,
- * crlDetails Extensions OPTIONAL
- * -- extra CRL details (e.g., crl number, reason, location, etc.)
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(status, certId, willBeRevokedAt, badSinceDate);
- v.AddOptional(crlDetails);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/RevDetails.cs b/BCCrypto/src/asn1/cmp/RevDetails.cs
deleted file mode 100644
index 7d2a65a..0000000
--- a/BCCrypto/src/asn1/cmp/RevDetails.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Crmf;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class RevDetails
- : Asn1Encodable
- {
- private readonly CertTemplate certDetails;
- private readonly X509Extensions crlEntryDetails;
-
- private RevDetails(Asn1Sequence seq)
- {
- certDetails = CertTemplate.GetInstance(seq[0]);
- crlEntryDetails = seq.Count <= 1
- ? null
- : X509Extensions.GetInstance(seq[1]);
- }
-
- public static RevDetails GetInstance(object obj)
- {
- if (obj is RevDetails)
- return (RevDetails)obj;
-
- if (obj is Asn1Sequence)
- return new RevDetails((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public RevDetails(CertTemplate certDetails)
- : this(certDetails, null)
- {
- }
-
- public RevDetails(CertTemplate certDetails, X509Extensions crlEntryDetails)
- {
- this.certDetails = certDetails;
- this.crlEntryDetails = crlEntryDetails;
- }
-
- public virtual CertTemplate CertDetails
- {
- get { return certDetails; }
- }
-
- public virtual X509Extensions CrlEntryDetails
- {
- get { return crlEntryDetails; }
- }
-
- /**
- *
- * RevDetails ::= SEQUENCE {
- * certDetails CertTemplate,
- * -- allows requester to specify as much as they can about
- * -- the cert. for which revocation is requested
- * -- (e.g., for cases in which serialNumber is not available)
- * crlEntryDetails Extensions OPTIONAL
- * -- requested crlEntryExtensions
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(certDetails);
- v.AddOptional(crlEntryDetails);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/RevRepContent.cs b/BCCrypto/src/asn1/cmp/RevRepContent.cs
deleted file mode 100644
index 8e382a6..0000000
--- a/BCCrypto/src/asn1/cmp/RevRepContent.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Crmf;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class RevRepContent
- : Asn1Encodable
- {
- private readonly Asn1Sequence status;
- private readonly Asn1Sequence revCerts;
- private readonly Asn1Sequence crls;
-
- private RevRepContent(Asn1Sequence seq)
- {
- status = Asn1Sequence.GetInstance(seq[0]);
-
- for (int pos = 1; pos < seq.Count; ++pos)
- {
- Asn1TaggedObject tObj = Asn1TaggedObject.GetInstance(seq[pos]);
-
- if (tObj.TagNo == 0)
- {
- revCerts = Asn1Sequence.GetInstance(tObj, true);
- }
- else
- {
- crls = Asn1Sequence.GetInstance(tObj, true);
- }
- }
- }
-
- public static RevRepContent GetInstance(object obj)
- {
- if (obj is RevRepContent)
- return (RevRepContent)obj;
-
- if (obj is Asn1Sequence)
- return new RevRepContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual PkiStatusInfo[] GetStatus()
- {
- PkiStatusInfo[] results = new PkiStatusInfo[status.Count];
- for (int i = 0; i != results.Length; ++i)
- {
- results[i] = PkiStatusInfo.GetInstance(status[i]);
- }
- return results;
- }
-
- public virtual CertId[] GetRevCerts()
- {
- if (revCerts == null)
- return null;
-
- CertId[] results = new CertId[revCerts.Count];
- for (int i = 0; i != results.Length; ++i)
- {
- results[i] = CertId.GetInstance(revCerts[i]);
- }
- return results;
- }
-
- public virtual CertificateList[] GetCrls()
- {
- if (crls == null)
- return null;
-
- CertificateList[] results = new CertificateList[crls.Count];
- for (int i = 0; i != results.Length; ++i)
- {
- results[i] = CertificateList.GetInstance(crls[i]);
- }
- return results;
- }
-
- /**
- *
- * RevRepContent ::= SEQUENCE {
- * status SEQUENCE SIZE (1..MAX) OF PKIStatusInfo,
- * -- in same order as was sent in RevReqContent
- * revCerts [0] SEQUENCE SIZE (1..MAX) OF CertId OPTIONAL,
- * -- IDs for which revocation was requested
- * -- (same order as status)
- * crls [1] SEQUENCE SIZE (1..MAX) OF CertificateList OPTIONAL
- * -- the resulting CRLs (there may be more than one)
- * }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(status);
- AddOptional(v, 0, revCerts);
- AddOptional(v, 1, crls);
- return new DerSequence(v);
- }
-
- private void AddOptional(Asn1EncodableVector v, int tagNo, Asn1Encodable obj)
- {
- if (obj != null)
- {
- v.Add(new DerTaggedObject(true, tagNo, obj));
- }
- }
- }
-}
-
diff --git a/BCCrypto/src/asn1/cmp/RevRepContentBuilder.cs b/BCCrypto/src/asn1/cmp/RevRepContentBuilder.cs
deleted file mode 100644
index cc17d1d..0000000
--- a/BCCrypto/src/asn1/cmp/RevRepContentBuilder.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Crmf;
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class RevRepContentBuilder
- {
- private readonly Asn1EncodableVector status = new Asn1EncodableVector();
- private readonly Asn1EncodableVector revCerts = new Asn1EncodableVector();
- private readonly Asn1EncodableVector crls = new Asn1EncodableVector();
-
- public virtual RevRepContentBuilder Add(PkiStatusInfo status)
- {
- this.status.Add(status);
- return this;
- }
-
- public virtual RevRepContentBuilder Add(PkiStatusInfo status, CertId certId)
- {
- if (this.status.Count != this.revCerts.Count)
- throw new InvalidOperationException("status and revCerts sequence must be in common order");
-
- this.status.Add(status);
- this.revCerts.Add(certId);
- return this;
- }
-
- public virtual RevRepContentBuilder AddCrl(CertificateList crl)
- {
- this.crls.Add(crl);
- return this;
- }
-
- public virtual RevRepContent Build()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- v.Add(new DerSequence(status));
-
- if (revCerts.Count != 0)
- {
- v.Add(new DerTaggedObject(true, 0, new DerSequence(revCerts)));
- }
-
- if (crls.Count != 0)
- {
- v.Add(new DerTaggedObject(true, 1, new DerSequence(crls)));
- }
-
- return RevRepContent.GetInstance(new DerSequence(v));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cmp/RevReqContent.cs b/BCCrypto/src/asn1/cmp/RevReqContent.cs
deleted file mode 100644
index 1522d37..0000000
--- a/BCCrypto/src/asn1/cmp/RevReqContent.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cmp
-{
- public class RevReqContent
- : Asn1Encodable
- {
- private readonly Asn1Sequence content;
-
- private RevReqContent(Asn1Sequence seq)
- {
- content = seq;
- }
-
- public static RevReqContent GetInstance(object obj)
- {
- if (obj is RevReqContent)
- return (RevReqContent)obj;
-
- if (obj is Asn1Sequence)
- return new RevReqContent((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public RevReqContent(params RevDetails[] revDetails)
- {
- this.content = new DerSequence(revDetails);
- }
-
- public virtual RevDetails[] ToRevDetailsArray()
- {
- RevDetails[] result = new RevDetails[content.Count];
- for (int i = 0; i != result.Length; ++i)
- {
- result[i] = RevDetails.GetInstance(content[i]);
- }
- return result;
- }
-
- /**
- *
- * RevReqContent ::= SEQUENCE OF RevDetails
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return content;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/Attribute.cs b/BCCrypto/src/asn1/cms/Attribute.cs
deleted file mode 100644
index 69ac441..0000000
--- a/BCCrypto/src/asn1/cms/Attribute.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class Attribute
- : Asn1Encodable
- {
- private DerObjectIdentifier attrType;
- private Asn1Set attrValues;
-
- /**
- * return an Attribute object from the given object.
- *
- * @param o the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static Attribute GetInstance(
- object obj)
- {
- if (obj == null || obj is Attribute)
- return (Attribute) obj;
-
- if (obj is Asn1Sequence)
- return new Attribute((Asn1Sequence) obj);
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public Attribute(
- Asn1Sequence seq)
- {
- attrType = (DerObjectIdentifier)seq[0];
- attrValues = (Asn1Set)seq[1];
- }
-
- public Attribute(
- DerObjectIdentifier attrType,
- Asn1Set attrValues)
- {
- this.attrType = attrType;
- this.attrValues = attrValues;
- }
-
- public DerObjectIdentifier AttrType
- {
- get { return attrType; }
- }
-
- public Asn1Set AttrValues
- {
- get { return attrValues; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Attribute ::= SEQUENCE {
- * attrType OBJECT IDENTIFIER,
- * attrValues SET OF AttributeValue
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(attrType, attrValues);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/AttributeTable.cs b/BCCrypto/src/asn1/cms/AttributeTable.cs
deleted file mode 100644
index 8d357f1..0000000
--- a/BCCrypto/src/asn1/cms/AttributeTable.cs
+++ /dev/null
@@ -1,231 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class AttributeTable
- {
- private readonly IDictionary attributes;
-
-#if !(SILVERLIGHT || PORTABLE)
- [Obsolete]
- public AttributeTable(
- Hashtable attrs)
- {
- this.attributes = Platform.CreateHashtable(attrs);
- }
-#endif
-
- public AttributeTable(
- IDictionary attrs)
- {
- this.attributes = Platform.CreateHashtable(attrs);
- }
-
- public AttributeTable(
- Asn1EncodableVector v)
- {
- this.attributes = Platform.CreateHashtable(v.Count);
-
- foreach (Asn1Encodable o in v)
- {
- Attribute a = Attribute.GetInstance(o);
-
- AddAttribute(a);
- }
- }
-
- public AttributeTable(
- Asn1Set s)
- {
- this.attributes = Platform.CreateHashtable(s.Count);
-
- for (int i = 0; i != s.Count; i++)
- {
- Attribute a = Attribute.GetInstance(s[i]);
-
- AddAttribute(a);
- }
- }
-
- public AttributeTable(
- Attributes attrs)
- : this(Asn1Set.GetInstance(attrs.ToAsn1Object()))
- {
- }
-
- private void AddAttribute(
- Attribute a)
- {
- DerObjectIdentifier oid = a.AttrType;
- object obj = attributes[oid];
-
- if (obj == null)
- {
- attributes[oid] = a;
- }
- else
- {
- IList v;
-
- if (obj is Attribute)
- {
- v = Platform.CreateArrayList();
-
- v.Add(obj);
- v.Add(a);
- }
- else
- {
- v = (IList) obj;
-
- v.Add(a);
- }
-
- attributes[oid] = v;
- }
- }
-
- /// Return the first attribute matching the given OBJECT IDENTIFIER
- public Attribute this[DerObjectIdentifier oid]
- {
- get
- {
- object obj = attributes[oid];
-
- if (obj is IList)
- {
- return (Attribute)((IList)obj)[0];
- }
-
- return (Attribute) obj;
- }
- }
-
- [Obsolete("Use 'object[oid]' syntax instead")]
- public Attribute Get(
- DerObjectIdentifier oid)
- {
- return this[oid];
- }
-
- /**
- * Return all the attributes matching the OBJECT IDENTIFIER oid. The vector will be
- * empty if there are no attributes of the required type present.
- *
- * @param oid type of attribute required.
- * @return a vector of all the attributes found of type oid.
- */
- public Asn1EncodableVector GetAll(
- DerObjectIdentifier oid)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- object obj = attributes[oid];
-
- if (obj is IList)
- {
- foreach (Attribute a in (IList)obj)
- {
- v.Add(a);
- }
- }
- else if (obj != null)
- {
- v.Add((Attribute) obj);
- }
-
- return v;
- }
-
- public int Count
- {
- get
- {
- int total = 0;
-
- foreach (object o in attributes.Values)
- {
- if (o is IList)
- {
- total += ((IList)o).Count;
- }
- else
- {
- ++total;
- }
- }
-
- return total;
- }
- }
-
- public IDictionary ToDictionary()
- {
- return Platform.CreateHashtable(attributes);
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- [Obsolete("Use 'ToDictionary' instead")]
- public Hashtable ToHashtable()
- {
- return new Hashtable(attributes);
- }
-#endif
-
- public Asn1EncodableVector ToAsn1EncodableVector()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- foreach (object obj in attributes.Values)
- {
- if (obj is IList)
- {
- foreach (object el in (IList)obj)
- {
- v.Add(Attribute.GetInstance(el));
- }
- }
- else
- {
- v.Add(Attribute.GetInstance(obj));
- }
- }
-
- return v;
- }
-
- public Attributes ToAttributes()
- {
- return new Attributes(this.ToAsn1EncodableVector());
- }
-
- /**
- * Return a new table with the passed in attribute added.
- *
- * @param attrType
- * @param attrValue
- * @return
- */
- public AttributeTable Add(DerObjectIdentifier attrType, Asn1Encodable attrValue)
- {
- AttributeTable newTable = new AttributeTable(attributes);
-
- newTable.AddAttribute(new Attribute(attrType, new DerSet(attrValue)));
-
- return newTable;
- }
-
- public AttributeTable Remove(DerObjectIdentifier attrType)
- {
- AttributeTable newTable = new AttributeTable(attributes);
-
- newTable.attributes.Remove(attrType);
-
- return newTable;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/Attributes.cs b/BCCrypto/src/asn1/cms/Attributes.cs
deleted file mode 100644
index 5b6b130..0000000
--- a/BCCrypto/src/asn1/cms/Attributes.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class Attributes
- : Asn1Encodable
- {
- private readonly Asn1Set attributes;
-
- private Attributes(Asn1Set attributes)
- {
- this.attributes = attributes;
- }
-
- public Attributes(Asn1EncodableVector v)
- {
- attributes = new BerSet(v);
- }
-
- public static Attributes GetInstance(object obj)
- {
- if (obj is Attributes)
- return (Attributes)obj;
-
- if (obj != null)
- return new Attributes(Asn1Set.GetInstance(obj));
-
- return null;
- }
-
- public virtual Attribute[] GetAttributes()
- {
- Attribute[] rv = new Attribute[attributes.Count];
-
- for (int i = 0; i != rv.Length; i++)
- {
- rv[i] = Attribute.GetInstance(attributes[i]);
- }
-
- return rv;
- }
-
- /**
- *
- * Attributes ::=
- * SET SIZE(1..MAX) OF Attribute -- according to RFC 5652
- *
- * @return
- */
- public override Asn1Object ToAsn1Object()
- {
- return attributes;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/AuthEnvelopedData.cs b/BCCrypto/src/asn1/cms/AuthEnvelopedData.cs
deleted file mode 100644
index c30ec6b..0000000
--- a/BCCrypto/src/asn1/cms/AuthEnvelopedData.cs
+++ /dev/null
@@ -1,205 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class AuthEnvelopedData
- : Asn1Encodable
- {
- private DerInteger version;
- private OriginatorInfo originatorInfo;
- private Asn1Set recipientInfos;
- private EncryptedContentInfo authEncryptedContentInfo;
- private Asn1Set authAttrs;
- private Asn1OctetString mac;
- private Asn1Set unauthAttrs;
-
- public AuthEnvelopedData(
- OriginatorInfo originatorInfo,
- Asn1Set recipientInfos,
- EncryptedContentInfo authEncryptedContentInfo,
- Asn1Set authAttrs,
- Asn1OctetString mac,
- Asn1Set unauthAttrs)
- {
- // "It MUST be set to 0."
- this.version = new DerInteger(0);
-
- this.originatorInfo = originatorInfo;
-
- // TODO
- // "There MUST be at least one element in the collection."
- this.recipientInfos = recipientInfos;
-
- this.authEncryptedContentInfo = authEncryptedContentInfo;
-
- // TODO
- // "The authAttrs MUST be present if the content type carried in
- // EncryptedContentInfo is not id-data."
- this.authAttrs = authAttrs;
-
- this.mac = mac;
-
- this.unauthAttrs = unauthAttrs;
- }
-
- private AuthEnvelopedData(
- Asn1Sequence seq)
- {
- int index = 0;
-
- // TODO
- // "It MUST be set to 0."
- Asn1Object tmp = seq[index++].ToAsn1Object();
- version = (DerInteger)tmp;
-
- tmp = seq[index++].ToAsn1Object();
- if (tmp is Asn1TaggedObject)
- {
- originatorInfo = OriginatorInfo.GetInstance((Asn1TaggedObject)tmp, false);
- tmp = seq[index++].ToAsn1Object();
- }
-
- // TODO
- // "There MUST be at least one element in the collection."
- recipientInfos = Asn1Set.GetInstance(tmp);
-
- tmp = seq[index++].ToAsn1Object();
- authEncryptedContentInfo = EncryptedContentInfo.GetInstance(tmp);
-
- tmp = seq[index++].ToAsn1Object();
- if (tmp is Asn1TaggedObject)
- {
- authAttrs = Asn1Set.GetInstance((Asn1TaggedObject)tmp, false);
- tmp = seq[index++].ToAsn1Object();
- }
- else
- {
- // TODO
- // "The authAttrs MUST be present if the content type carried in
- // EncryptedContentInfo is not id-data."
- }
-
- mac = Asn1OctetString.GetInstance(tmp);
-
- if (seq.Count > index)
- {
- tmp = seq[index++].ToAsn1Object();
- unauthAttrs = Asn1Set.GetInstance((Asn1TaggedObject)tmp, false);
- }
- }
-
- /**
- * return an AuthEnvelopedData object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param isExplicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @throws ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static AuthEnvelopedData GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- /**
- * return an AuthEnvelopedData object from the given object.
- *
- * @param obj the object we want converted.
- * @throws ArgumentException if the object cannot be converted.
- */
- public static AuthEnvelopedData GetInstance(
- object obj)
- {
- if (obj == null || obj is AuthEnvelopedData)
- return (AuthEnvelopedData)obj;
-
- if (obj is Asn1Sequence)
- return new AuthEnvelopedData((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid AuthEnvelopedData: " + Platform.GetTypeName(obj));
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public OriginatorInfo OriginatorInfo
- {
- get { return originatorInfo; }
- }
-
- public Asn1Set RecipientInfos
- {
- get { return recipientInfos; }
- }
-
- public EncryptedContentInfo AuthEncryptedContentInfo
- {
- get { return authEncryptedContentInfo; }
- }
-
- public Asn1Set AuthAttrs
- {
- get { return authAttrs; }
- }
-
- public Asn1OctetString Mac
- {
- get { return mac; }
- }
-
- public Asn1Set UnauthAttrs
- {
- get { return unauthAttrs; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * AuthEnvelopedData ::= SEQUENCE {
- * version CMSVersion,
- * originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
- * recipientInfos RecipientInfos,
- * authEncryptedContentInfo EncryptedContentInfo,
- * authAttrs [1] IMPLICIT AuthAttributes OPTIONAL,
- * mac MessageAuthenticationCode,
- * unauthAttrs [2] IMPLICIT UnauthAttributes OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(version);
-
- if (originatorInfo != null)
- {
- v.Add(new DerTaggedObject(false, 0, originatorInfo));
- }
-
- v.Add(recipientInfos, authEncryptedContentInfo);
-
- // "authAttrs optionally contains the authenticated attributes."
- if (authAttrs != null)
- {
- // "AuthAttributes MUST be DER encoded, even if the rest of the
- // AuthEnvelopedData structure is BER encoded."
- v.Add(new DerTaggedObject(false, 1, authAttrs));
- }
-
- v.Add(mac);
-
- // "unauthAttrs optionally contains the unauthenticated attributes."
- if (unauthAttrs != null)
- {
- v.Add(new DerTaggedObject(false, 2, unauthAttrs));
- }
-
- return new BerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/AuthEnvelopedDataParser.cs b/BCCrypto/src/asn1/cms/AuthEnvelopedDataParser.cs
deleted file mode 100644
index 35cb3bf..0000000
--- a/BCCrypto/src/asn1/cms/AuthEnvelopedDataParser.cs
+++ /dev/null
@@ -1,145 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- *
- * AuthEnvelopedData ::= SEQUENCE {
- * version CMSVersion,
- * originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
- * recipientInfos RecipientInfos,
- * authEncryptedContentInfo EncryptedContentInfo,
- * authAttrs [1] IMPLICIT AuthAttributes OPTIONAL,
- * mac MessageAuthenticationCode,
- * unauthAttrs [2] IMPLICIT UnauthAttributes OPTIONAL }
- *
- */
- public class AuthEnvelopedDataParser
- {
- private Asn1SequenceParser seq;
- private DerInteger version;
- private IAsn1Convertible nextObject;
- private bool originatorInfoCalled;
-
- public AuthEnvelopedDataParser(
- Asn1SequenceParser seq)
- {
- this.seq = seq;
-
- // TODO
- // "It MUST be set to 0."
- this.version = (DerInteger)seq.ReadObject();
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public OriginatorInfo GetOriginatorInfo()
- {
- originatorInfoCalled = true;
-
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- if (nextObject is Asn1TaggedObjectParser && ((Asn1TaggedObjectParser)nextObject).TagNo == 0)
- {
- Asn1SequenceParser originatorInfo = (Asn1SequenceParser) ((Asn1TaggedObjectParser)nextObject).GetObjectParser(Asn1Tags.Sequence, false);
- nextObject = null;
- return OriginatorInfo.GetInstance(originatorInfo.ToAsn1Object());
- }
-
- return null;
- }
-
- public Asn1SetParser GetRecipientInfos()
- {
- if (!originatorInfoCalled)
- {
- GetOriginatorInfo();
- }
-
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- Asn1SetParser recipientInfos = (Asn1SetParser)nextObject;
- nextObject = null;
- return recipientInfos;
- }
-
- public EncryptedContentInfoParser GetAuthEncryptedContentInfo()
- {
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- if (nextObject != null)
- {
- Asn1SequenceParser o = (Asn1SequenceParser) nextObject;
- nextObject = null;
- return new EncryptedContentInfoParser(o);
- }
-
- return null;
- }
-
- public Asn1SetParser GetAuthAttrs()
- {
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- if (nextObject is Asn1TaggedObjectParser)
- {
- IAsn1Convertible o = nextObject;
- nextObject = null;
- return (Asn1SetParser)((Asn1TaggedObjectParser)o).GetObjectParser(Asn1Tags.Set, false);
- }
-
- // TODO
- // "The authAttrs MUST be present if the content type carried in
- // EncryptedContentInfo is not id-data."
-
- return null;
- }
-
- public Asn1OctetString GetMac()
- {
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- IAsn1Convertible o = nextObject;
- nextObject = null;
-
- return Asn1OctetString.GetInstance(o.ToAsn1Object());
- }
-
- public Asn1SetParser GetUnauthAttrs()
- {
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- if (nextObject != null)
- {
- IAsn1Convertible o = nextObject;
- nextObject = null;
- return (Asn1SetParser)((Asn1TaggedObjectParser)o).GetObjectParser(Asn1Tags.Set, false);
- }
-
- return null;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/AuthenticatedData.cs b/BCCrypto/src/asn1/cms/AuthenticatedData.cs
deleted file mode 100644
index 6f13a6f..0000000
--- a/BCCrypto/src/asn1/cms/AuthenticatedData.cs
+++ /dev/null
@@ -1,271 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class AuthenticatedData
- : Asn1Encodable
- {
- private DerInteger version;
- private OriginatorInfo originatorInfo;
- private Asn1Set recipientInfos;
- private AlgorithmIdentifier macAlgorithm;
- private AlgorithmIdentifier digestAlgorithm;
- private ContentInfo encapsulatedContentInfo;
- private Asn1Set authAttrs;
- private Asn1OctetString mac;
- private Asn1Set unauthAttrs;
-
- public AuthenticatedData(
- OriginatorInfo originatorInfo,
- Asn1Set recipientInfos,
- AlgorithmIdentifier macAlgorithm,
- AlgorithmIdentifier digestAlgorithm,
- ContentInfo encapsulatedContent,
- Asn1Set authAttrs,
- Asn1OctetString mac,
- Asn1Set unauthAttrs)
- {
- if (digestAlgorithm != null || authAttrs != null)
- {
- if (digestAlgorithm == null || authAttrs == null)
- {
- throw new ArgumentException("digestAlgorithm and authAttrs must be set together");
- }
- }
-
- version = new DerInteger(CalculateVersion(originatorInfo));
-
- this.originatorInfo = originatorInfo;
- this.macAlgorithm = macAlgorithm;
- this.digestAlgorithm = digestAlgorithm;
- this.recipientInfos = recipientInfos;
- this.encapsulatedContentInfo = encapsulatedContent;
- this.authAttrs = authAttrs;
- this.mac = mac;
- this.unauthAttrs = unauthAttrs;
- }
-
- private AuthenticatedData(
- Asn1Sequence seq)
- {
- int index = 0;
-
- version = (DerInteger)seq[index++];
-
- Asn1Encodable tmp = seq[index++];
- if (tmp is Asn1TaggedObject)
- {
- originatorInfo = OriginatorInfo.GetInstance((Asn1TaggedObject)tmp, false);
- tmp = seq[index++];
- }
-
- recipientInfos = Asn1Set.GetInstance(tmp);
- macAlgorithm = AlgorithmIdentifier.GetInstance(seq[index++]);
-
- tmp = seq[index++];
- if (tmp is Asn1TaggedObject)
- {
- digestAlgorithm = AlgorithmIdentifier.GetInstance((Asn1TaggedObject)tmp, false);
- tmp = seq[index++];
- }
-
- encapsulatedContentInfo = ContentInfo.GetInstance(tmp);
-
- tmp = seq[index++];
- if (tmp is Asn1TaggedObject)
- {
- authAttrs = Asn1Set.GetInstance((Asn1TaggedObject)tmp, false);
- tmp = seq[index++];
- }
-
- mac = Asn1OctetString.GetInstance(tmp);
-
- if (seq.Count > index)
- {
- unauthAttrs = Asn1Set.GetInstance((Asn1TaggedObject)seq[index], false);
- }
- }
-
- /**
- * return an AuthenticatedData object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param isExplicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @throws ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static AuthenticatedData GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- /**
- * return an AuthenticatedData object from the given object.
- *
- * @param obj the object we want converted.
- * @throws ArgumentException if the object cannot be converted.
- */
- public static AuthenticatedData GetInstance(
- object obj)
- {
- if (obj == null || obj is AuthenticatedData)
- {
- return (AuthenticatedData)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new AuthenticatedData((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("Invalid AuthenticatedData: " + Platform.GetTypeName(obj));
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public OriginatorInfo OriginatorInfo
- {
- get { return originatorInfo; }
- }
-
- public Asn1Set RecipientInfos
- {
- get { return recipientInfos; }
- }
-
- public AlgorithmIdentifier MacAlgorithm
- {
- get { return macAlgorithm; }
- }
-
- public AlgorithmIdentifier DigestAlgorithm
- {
- get { return digestAlgorithm; }
- }
-
- public ContentInfo EncapsulatedContentInfo
- {
- get { return encapsulatedContentInfo; }
- }
-
- public Asn1Set AuthAttrs
- {
- get { return authAttrs; }
- }
-
- public Asn1OctetString Mac
- {
- get { return mac; }
- }
-
- public Asn1Set UnauthAttrs
- {
- get { return unauthAttrs; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * AuthenticatedData ::= SEQUENCE {
- * version CMSVersion,
- * originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
- * recipientInfos RecipientInfos,
- * macAlgorithm MessageAuthenticationCodeAlgorithm,
- * digestAlgorithm [1] DigestAlgorithmIdentifier OPTIONAL,
- * encapContentInfo EncapsulatedContentInfo,
- * authAttrs [2] IMPLICIT AuthAttributes OPTIONAL,
- * mac MessageAuthenticationCode,
- * unauthAttrs [3] IMPLICIT UnauthAttributes OPTIONAL }
- *
- * AuthAttributes ::= SET SIZE (1..MAX) OF Attribute
- *
- * UnauthAttributes ::= SET SIZE (1..MAX) OF Attribute
- *
- * MessageAuthenticationCode ::= OCTET STRING
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(version);
-
- if (originatorInfo != null)
- {
- v.Add(new DerTaggedObject(false, 0, originatorInfo));
- }
-
- v.Add(recipientInfos, macAlgorithm);
-
- if (digestAlgorithm != null)
- {
- v.Add(new DerTaggedObject(false, 1, digestAlgorithm));
- }
-
- v.Add(encapsulatedContentInfo);
-
- if (authAttrs != null)
- {
- v.Add(new DerTaggedObject(false, 2, authAttrs));
- }
-
- v.Add(mac);
-
- if (unauthAttrs != null)
- {
- v.Add(new DerTaggedObject(false, 3, unauthAttrs));
- }
-
- return new BerSequence(v);
- }
-
- public static int CalculateVersion(OriginatorInfo origInfo)
- {
- if (origInfo == null)
- return 0;
-
- int ver = 0;
-
- foreach (object obj in origInfo.Certificates)
- {
- if (obj is Asn1TaggedObject)
- {
- Asn1TaggedObject tag = (Asn1TaggedObject)obj;
-
- if (tag.TagNo == 2)
- {
- ver = 1;
- }
- else if (tag.TagNo == 3)
- {
- ver = 3;
- break;
- }
- }
- }
-
- foreach (object obj in origInfo.Crls)
- {
- if (obj is Asn1TaggedObject)
- {
- Asn1TaggedObject tag = (Asn1TaggedObject)obj;
-
- if (tag.TagNo == 1)
- {
- ver = 3;
- break;
- }
- }
- }
-
- return ver;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/AuthenticatedDataParser.cs b/BCCrypto/src/asn1/cms/AuthenticatedDataParser.cs
deleted file mode 100644
index 4b80d1b..0000000
--- a/BCCrypto/src/asn1/cms/AuthenticatedDataParser.cs
+++ /dev/null
@@ -1,182 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * AuthenticatedData ::= SEQUENCE {
- * version CMSVersion,
- * originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
- * recipientInfos RecipientInfos,
- * macAlgorithm MessageAuthenticationCodeAlgorithm,
- * digestAlgorithm [1] DigestAlgorithmIdentifier OPTIONAL,
- * encapContentInfo EncapsulatedContentInfo,
- * authAttrs [2] IMPLICIT AuthAttributes OPTIONAL,
- * mac MessageAuthenticationCode,
- * unauthAttrs [3] IMPLICIT UnauthAttributes OPTIONAL }
- *
- * AuthAttributes ::= SET SIZE (1..MAX) OF Attribute
- *
- * UnauthAttributes ::= SET SIZE (1..MAX) OF Attribute
- *
- * MessageAuthenticationCode ::= OCTET STRING
- *
- */
- public class AuthenticatedDataParser
- {
- private Asn1SequenceParser seq;
- private DerInteger version;
- private IAsn1Convertible nextObject;
- private bool originatorInfoCalled;
-
- public AuthenticatedDataParser(
- Asn1SequenceParser seq)
- {
- this.seq = seq;
- this.version = (DerInteger)seq.ReadObject();
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public OriginatorInfo GetOriginatorInfo()
- {
- originatorInfoCalled = true;
-
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- if (nextObject is Asn1TaggedObjectParser && ((Asn1TaggedObjectParser)nextObject).TagNo == 0)
- {
- Asn1SequenceParser originatorInfo = (Asn1SequenceParser) ((Asn1TaggedObjectParser)nextObject).GetObjectParser(Asn1Tags.Sequence, false);
- nextObject = null;
- return OriginatorInfo.GetInstance(originatorInfo.ToAsn1Object());
- }
-
- return null;
- }
-
- public Asn1SetParser GetRecipientInfos()
- {
- if (!originatorInfoCalled)
- {
- GetOriginatorInfo();
- }
-
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- Asn1SetParser recipientInfos = (Asn1SetParser)nextObject;
- nextObject = null;
- return recipientInfos;
- }
-
- public AlgorithmIdentifier GetMacAlgorithm()
- {
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- if (nextObject != null)
- {
- Asn1SequenceParser o = (Asn1SequenceParser)nextObject;
- nextObject = null;
- return AlgorithmIdentifier.GetInstance(o.ToAsn1Object());
- }
-
- return null;
- }
-
- public AlgorithmIdentifier GetDigestAlgorithm()
- {
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- if (nextObject is Asn1TaggedObjectParser)
- {
- AlgorithmIdentifier obj = AlgorithmIdentifier.GetInstance(
- (Asn1TaggedObject)nextObject.ToAsn1Object(), false);
- nextObject = null;
- return obj;
- }
-
- return null;
- }
-
- public ContentInfoParser GetEnapsulatedContentInfo()
- {
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- if (nextObject != null)
- {
- Asn1SequenceParser o = (Asn1SequenceParser)nextObject;
- nextObject = null;
- return new ContentInfoParser(o);
- }
-
- return null;
- }
-
- public Asn1SetParser GetAuthAttrs()
- {
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- if (nextObject is Asn1TaggedObjectParser)
- {
- IAsn1Convertible o = nextObject;
- nextObject = null;
- return (Asn1SetParser)((Asn1TaggedObjectParser)o).GetObjectParser(Asn1Tags.Set, false);
- }
-
- return null;
- }
-
- public Asn1OctetString GetMac()
- {
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- IAsn1Convertible o = nextObject;
- nextObject = null;
-
- return Asn1OctetString.GetInstance(o.ToAsn1Object());
- }
-
- public Asn1SetParser GetUnauthAttrs()
- {
- if (nextObject == null)
- {
- nextObject = seq.ReadObject();
- }
-
- if (nextObject != null)
- {
- IAsn1Convertible o = nextObject;
- nextObject = null;
- return (Asn1SetParser)((Asn1TaggedObjectParser)o).GetObjectParser(Asn1Tags.Set, false);
- }
-
- return null;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/CMSAttributes.cs b/BCCrypto/src/asn1/cms/CMSAttributes.cs
deleted file mode 100644
index fca2b67..0000000
--- a/BCCrypto/src/asn1/cms/CMSAttributes.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Pkcs;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public abstract class CmsAttributes
- {
- public static readonly DerObjectIdentifier ContentType = PkcsObjectIdentifiers.Pkcs9AtContentType;
- public static readonly DerObjectIdentifier MessageDigest = PkcsObjectIdentifiers.Pkcs9AtMessageDigest;
- public static readonly DerObjectIdentifier SigningTime = PkcsObjectIdentifiers.Pkcs9AtSigningTime;
- public static readonly DerObjectIdentifier CounterSignature = PkcsObjectIdentifiers.Pkcs9AtCounterSignature;
- public static readonly DerObjectIdentifier ContentHint = PkcsObjectIdentifiers.IdAAContentHint;
- }
-}
diff --git a/BCCrypto/src/asn1/cms/CMSObjectIdentifiers.cs b/BCCrypto/src/asn1/cms/CMSObjectIdentifiers.cs
deleted file mode 100644
index 2ad0a3c..0000000
--- a/BCCrypto/src/asn1/cms/CMSObjectIdentifiers.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using Org.BouncyCastle.Asn1.Pkcs;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public abstract class CmsObjectIdentifiers
- {
- public static readonly DerObjectIdentifier Data = PkcsObjectIdentifiers.Data;
- public static readonly DerObjectIdentifier SignedData = PkcsObjectIdentifiers.SignedData;
- public static readonly DerObjectIdentifier EnvelopedData = PkcsObjectIdentifiers.EnvelopedData;
- public static readonly DerObjectIdentifier SignedAndEnvelopedData = PkcsObjectIdentifiers.SignedAndEnvelopedData;
- public static readonly DerObjectIdentifier DigestedData = PkcsObjectIdentifiers.DigestedData;
- public static readonly DerObjectIdentifier EncryptedData = PkcsObjectIdentifiers.EncryptedData;
- public static readonly DerObjectIdentifier AuthenticatedData = PkcsObjectIdentifiers.IdCTAuthData;
- public static readonly DerObjectIdentifier CompressedData = PkcsObjectIdentifiers.IdCTCompressedData;
- public static readonly DerObjectIdentifier AuthEnvelopedData = PkcsObjectIdentifiers.IdCTAuthEnvelopedData;
- public static readonly DerObjectIdentifier timestampedData = PkcsObjectIdentifiers.IdCTTimestampedData;
-
- /**
- * The other Revocation Info arc
- * id-ri OBJECT IDENTIFIER ::= { iso(1) identified-organization(3)
- * dod(6) internet(1) security(5) mechanisms(5) pkix(7) ri(16) }
- */
- public static readonly DerObjectIdentifier id_ri = new DerObjectIdentifier("1.3.6.1.5.5.7.16");
-
- public static readonly DerObjectIdentifier id_ri_ocsp_response = id_ri.Branch("2");
- public static readonly DerObjectIdentifier id_ri_scvp = id_ri.Branch("4");
- }
-}
diff --git a/BCCrypto/src/asn1/cms/CompressedData.cs b/BCCrypto/src/asn1/cms/CompressedData.cs
deleted file mode 100644
index 154ed35..0000000
--- a/BCCrypto/src/asn1/cms/CompressedData.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- /**
- * RFC 3274 - CMS Compressed Data.
- *
- * CompressedData ::= Sequence {
- * version CMSVersion,
- * compressionAlgorithm CompressionAlgorithmIdentifier,
- * encapContentInfo EncapsulatedContentInfo
- * }
- *
- */
- public class CompressedData
- : Asn1Encodable
- {
- private DerInteger version;
- private AlgorithmIdentifier compressionAlgorithm;
- private ContentInfo encapContentInfo;
-
- public CompressedData(
- AlgorithmIdentifier compressionAlgorithm,
- ContentInfo encapContentInfo)
- {
- this.version = new DerInteger(0);
- this.compressionAlgorithm = compressionAlgorithm;
- this.encapContentInfo = encapContentInfo;
- }
-
- public CompressedData(
- Asn1Sequence seq)
- {
- this.version = (DerInteger) seq[0];
- this.compressionAlgorithm = AlgorithmIdentifier.GetInstance(seq[1]);
- this.encapContentInfo = ContentInfo.GetInstance(seq[2]);
- }
-
- /**
- * return a CompressedData object from a tagged object.
- *
- * @param ato the tagged object holding the object we want.
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static CompressedData GetInstance(
- Asn1TaggedObject ato,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(ato, explicitly));
- }
-
- /**
- * return a CompressedData object from the given object.
- *
- * @param _obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static CompressedData GetInstance(
- object obj)
- {
- if (obj == null || obj is CompressedData)
- return (CompressedData)obj;
-
- if (obj is Asn1Sequence)
- return new CompressedData((Asn1Sequence) obj);
-
- throw new ArgumentException("Invalid CompressedData: " + Platform.GetTypeName(obj));
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public AlgorithmIdentifier CompressionAlgorithmIdentifier
- {
- get { return compressionAlgorithm; }
- }
-
- public ContentInfo EncapContentInfo
- {
- get { return encapContentInfo; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new BerSequence(version, compressionAlgorithm, encapContentInfo);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/CompressedDataParser.cs b/BCCrypto/src/asn1/cms/CompressedDataParser.cs
deleted file mode 100644
index 7c53453..0000000
--- a/BCCrypto/src/asn1/cms/CompressedDataParser.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- /**
- * RFC 3274 - CMS Compressed Data.
- *
- * CompressedData ::= SEQUENCE {
- * version CMSVersion,
- * compressionAlgorithm CompressionAlgorithmIdentifier,
- * encapContentInfo EncapsulatedContentInfo
- * }
- *
- */
- public class CompressedDataParser
- {
- private DerInteger _version;
- private AlgorithmIdentifier _compressionAlgorithm;
- private ContentInfoParser _encapContentInfo;
-
- public CompressedDataParser(
- Asn1SequenceParser seq)
- {
- this._version = (DerInteger)seq.ReadObject();
- this._compressionAlgorithm = AlgorithmIdentifier.GetInstance(seq.ReadObject().ToAsn1Object());
- this._encapContentInfo = new ContentInfoParser((Asn1SequenceParser)seq.ReadObject());
- }
-
- public DerInteger Version
- {
- get { return _version; }
- }
-
- public AlgorithmIdentifier CompressionAlgorithmIdentifier
- {
- get { return _compressionAlgorithm; }
- }
-
- public ContentInfoParser GetEncapContentInfo()
- {
- return _encapContentInfo;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/ContentInfo.cs b/BCCrypto/src/asn1/cms/ContentInfo.cs
deleted file mode 100644
index f130a4b..0000000
--- a/BCCrypto/src/asn1/cms/ContentInfo.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class ContentInfo
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier contentType;
- private readonly Asn1Encodable content;
-
- public static ContentInfo GetInstance(
- object obj)
- {
- if (obj == null || obj is ContentInfo)
- return (ContentInfo) obj;
-
- if (obj is Asn1Sequence)
- return new ContentInfo((Asn1Sequence) obj);
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj));
- }
-
- public static ContentInfo GetInstance(Asn1TaggedObject obj, bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- private ContentInfo(
- Asn1Sequence seq)
- {
- if (seq.Count < 1 || seq.Count > 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- contentType = (DerObjectIdentifier) seq[0];
-
- if (seq.Count > 1)
- {
- Asn1TaggedObject tagged = (Asn1TaggedObject) seq[1];
- if (!tagged.IsExplicit() || tagged.TagNo != 0)
- throw new ArgumentException("Bad tag for 'content'", "seq");
-
- content = tagged.GetObject();
- }
- }
-
- public ContentInfo(
- DerObjectIdentifier contentType,
- Asn1Encodable content)
- {
- this.contentType = contentType;
- this.content = content;
- }
-
- public DerObjectIdentifier ContentType
- {
- get { return contentType; }
- }
-
- public Asn1Encodable Content
- {
- get { return content; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * ContentInfo ::= Sequence {
- * contentType ContentType,
- * content
- * [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(contentType);
-
- if (content != null)
- {
- v.Add(new BerTaggedObject(0, content));
- }
-
- return new BerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/ContentInfoParser.cs b/BCCrypto/src/asn1/cms/ContentInfoParser.cs
deleted file mode 100644
index 541cc0f..0000000
--- a/BCCrypto/src/asn1/cms/ContentInfoParser.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * ContentInfo ::= SEQUENCE {
- * contentType ContentType,
- * content
- * [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
- *
- */
- public class ContentInfoParser
- {
- private DerObjectIdentifier contentType;
- private Asn1TaggedObjectParser content;
-
- public ContentInfoParser(
- Asn1SequenceParser seq)
- {
- contentType = (DerObjectIdentifier)seq.ReadObject();
- content = (Asn1TaggedObjectParser)seq.ReadObject();
- }
-
- public DerObjectIdentifier ContentType
- {
- get { return contentType; }
- }
-
- public IAsn1Convertible GetContent(
- int tag)
- {
- if (content == null)
- return null;
-
- return content.GetObjectParser(tag, true);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/EncryptedContentInfo.cs b/BCCrypto/src/asn1/cms/EncryptedContentInfo.cs
deleted file mode 100644
index 999f2a0..0000000
--- a/BCCrypto/src/asn1/cms/EncryptedContentInfo.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class EncryptedContentInfo
- : Asn1Encodable
- {
- private DerObjectIdentifier contentType;
- private AlgorithmIdentifier contentEncryptionAlgorithm;
- private Asn1OctetString encryptedContent;
-
- public EncryptedContentInfo(
- DerObjectIdentifier contentType,
- AlgorithmIdentifier contentEncryptionAlgorithm,
- Asn1OctetString encryptedContent)
- {
- this.contentType = contentType;
- this.contentEncryptionAlgorithm = contentEncryptionAlgorithm;
- this.encryptedContent = encryptedContent;
- }
-
- public EncryptedContentInfo(
- Asn1Sequence seq)
- {
- contentType = (DerObjectIdentifier) seq[0];
- contentEncryptionAlgorithm = AlgorithmIdentifier.GetInstance(seq[1]);
-
- if (seq.Count > 2)
- {
- encryptedContent = Asn1OctetString.GetInstance(
- (Asn1TaggedObject) seq[2], false);
- }
- }
-
- /**
- * return an EncryptedContentInfo object from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static EncryptedContentInfo GetInstance(
- object obj)
- {
- if (obj == null || obj is EncryptedContentInfo)
- return (EncryptedContentInfo)obj;
-
- if (obj is Asn1Sequence)
- return new EncryptedContentInfo((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid EncryptedContentInfo: " + Platform.GetTypeName(obj));
- }
-
- public DerObjectIdentifier ContentType
- {
- get { return contentType; }
- }
-
- public AlgorithmIdentifier ContentEncryptionAlgorithm
- {
- get { return contentEncryptionAlgorithm; }
- }
-
- public Asn1OctetString EncryptedContent
- {
- get { return encryptedContent; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * EncryptedContentInfo ::= Sequence {
- * contentType ContentType,
- * contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
- * encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- contentType, contentEncryptionAlgorithm);
-
- if (encryptedContent != null)
- {
- v.Add(new BerTaggedObject(false, 0, encryptedContent));
- }
-
- return new BerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/EncryptedContentInfoParser.cs b/BCCrypto/src/asn1/cms/EncryptedContentInfoParser.cs
deleted file mode 100644
index af748b1..0000000
--- a/BCCrypto/src/asn1/cms/EncryptedContentInfoParser.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- /**
- *
- * EncryptedContentInfo ::= SEQUENCE {
- * contentType ContentType,
- * contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
- * encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
- * }
- *
- */
- public class EncryptedContentInfoParser
- {
- private DerObjectIdentifier _contentType;
- private AlgorithmIdentifier _contentEncryptionAlgorithm;
- private Asn1TaggedObjectParser _encryptedContent;
-
- public EncryptedContentInfoParser(
- Asn1SequenceParser seq)
- {
- _contentType = (DerObjectIdentifier)seq.ReadObject();
- _contentEncryptionAlgorithm = AlgorithmIdentifier.GetInstance(seq.ReadObject().ToAsn1Object());
- _encryptedContent = (Asn1TaggedObjectParser)seq.ReadObject();
- }
-
- public DerObjectIdentifier ContentType
- {
- get { return _contentType; }
- }
-
- public AlgorithmIdentifier ContentEncryptionAlgorithm
- {
- get { return _contentEncryptionAlgorithm; }
- }
-
- public IAsn1Convertible GetEncryptedContent(
- int tag)
- {
- return _encryptedContent.GetObjectParser(tag, false);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/EncryptedData.cs b/BCCrypto/src/asn1/cms/EncryptedData.cs
deleted file mode 100644
index b8492d1..0000000
--- a/BCCrypto/src/asn1/cms/EncryptedData.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class EncryptedData
- : Asn1Encodable
- {
- private readonly DerInteger version;
- private readonly EncryptedContentInfo encryptedContentInfo;
- private readonly Asn1Set unprotectedAttrs;
-
- public static EncryptedData GetInstance(
- object obj)
- {
- if (obj is EncryptedData)
- return (EncryptedData) obj;
-
- if (obj is Asn1Sequence)
- return new EncryptedData((Asn1Sequence) obj);
-
- throw new ArgumentException("Invalid EncryptedData: " + Platform.GetTypeName(obj));
- }
-
- public EncryptedData(
- EncryptedContentInfo encInfo)
- : this(encInfo, null)
- {
- }
-
- public EncryptedData(
- EncryptedContentInfo encInfo,
- Asn1Set unprotectedAttrs)
- {
- if (encInfo == null)
- throw new ArgumentNullException("encInfo");
-
- this.version = new DerInteger((unprotectedAttrs == null) ? 0 : 2);
- this.encryptedContentInfo = encInfo;
- this.unprotectedAttrs = unprotectedAttrs;
- }
-
- private EncryptedData(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count < 2 || seq.Count > 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.version = DerInteger.GetInstance(seq[0]);
- this.encryptedContentInfo = EncryptedContentInfo.GetInstance(seq[1]);
-
- if (seq.Count > 2)
- {
- this.unprotectedAttrs = Asn1Set.GetInstance((Asn1TaggedObject)seq[2], false);
- }
- }
-
- public virtual DerInteger Version
- {
- get { return version; }
- }
-
- public virtual EncryptedContentInfo EncryptedContentInfo
- {
- get { return encryptedContentInfo; }
- }
-
- public virtual Asn1Set UnprotectedAttrs
- {
- get { return unprotectedAttrs; }
- }
-
- /**
- *
- * EncryptedData ::= SEQUENCE {
- * version CMSVersion,
- * encryptedContentInfo EncryptedContentInfo,
- * unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(version, encryptedContentInfo);
-
- if (unprotectedAttrs != null)
- {
- v.Add(new BerTaggedObject(false, 1, unprotectedAttrs));
- }
-
- return new BerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/EnvelopedData.cs b/BCCrypto/src/asn1/cms/EnvelopedData.cs
deleted file mode 100644
index 09f291a..0000000
--- a/BCCrypto/src/asn1/cms/EnvelopedData.cs
+++ /dev/null
@@ -1,176 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class EnvelopedData
- : Asn1Encodable
- {
- private DerInteger version;
- private OriginatorInfo originatorInfo;
- private Asn1Set recipientInfos;
- private EncryptedContentInfo encryptedContentInfo;
- private Asn1Set unprotectedAttrs;
-
- public EnvelopedData(
- OriginatorInfo originatorInfo,
- Asn1Set recipientInfos,
- EncryptedContentInfo encryptedContentInfo,
- Asn1Set unprotectedAttrs)
- {
- this.version = new DerInteger(CalculateVersion(originatorInfo, recipientInfos, unprotectedAttrs));
- this.originatorInfo = originatorInfo;
- this.recipientInfos = recipientInfos;
- this.encryptedContentInfo = encryptedContentInfo;
- this.unprotectedAttrs = unprotectedAttrs;
- }
-
- public EnvelopedData(
- OriginatorInfo originatorInfo,
- Asn1Set recipientInfos,
- EncryptedContentInfo encryptedContentInfo,
- Attributes unprotectedAttrs)
- {
- this.version = new DerInteger(CalculateVersion(originatorInfo, recipientInfos, Asn1Set.GetInstance(unprotectedAttrs)));
- this.originatorInfo = originatorInfo;
- this.recipientInfos = recipientInfos;
- this.encryptedContentInfo = encryptedContentInfo;
- this.unprotectedAttrs = Asn1Set.GetInstance(unprotectedAttrs);
- }
-
- [Obsolete("Use 'GetInstance' instead")]
- public EnvelopedData(
- Asn1Sequence seq)
- {
- int index = 0;
-
- version = (DerInteger) seq[index++];
-
- object tmp = seq[index++];
-
- if (tmp is Asn1TaggedObject)
- {
- originatorInfo = OriginatorInfo.GetInstance((Asn1TaggedObject) tmp, false);
- tmp = seq[index++];
- }
-
- recipientInfos = Asn1Set.GetInstance(tmp);
- encryptedContentInfo = EncryptedContentInfo.GetInstance(seq[index++]);
-
- if (seq.Count > index)
- {
- unprotectedAttrs = Asn1Set.GetInstance((Asn1TaggedObject) seq[index], false);
- }
- }
-
- /**
- * return an EnvelopedData object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static EnvelopedData GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- /**
- * return an EnvelopedData object from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static EnvelopedData GetInstance(
- object obj)
- {
- if (obj is EnvelopedData)
- return (EnvelopedData)obj;
- if (obj == null)
- return null;
- return new EnvelopedData(Asn1Sequence.GetInstance(obj));
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public OriginatorInfo OriginatorInfo
- {
- get { return originatorInfo; }
- }
-
- public Asn1Set RecipientInfos
- {
- get { return recipientInfos; }
- }
-
- public EncryptedContentInfo EncryptedContentInfo
- {
- get { return encryptedContentInfo; }
- }
-
- public Asn1Set UnprotectedAttrs
- {
- get { return unprotectedAttrs; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * EnvelopedData ::= Sequence {
- * version CMSVersion,
- * originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
- * recipientInfos RecipientInfos,
- * encryptedContentInfo EncryptedContentInfo,
- * unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(version);
-
- if (originatorInfo != null)
- {
- v.Add(new DerTaggedObject(false, 0, originatorInfo));
- }
-
- v.Add(recipientInfos, encryptedContentInfo);
-
- if (unprotectedAttrs != null)
- {
- v.Add(new DerTaggedObject(false, 1, unprotectedAttrs));
- }
-
- return new BerSequence(v);
- }
-
- public static int CalculateVersion(OriginatorInfo originatorInfo, Asn1Set recipientInfos, Asn1Set unprotectedAttrs)
- {
- if (originatorInfo != null || unprotectedAttrs != null)
- {
- return 2;
- }
-
- foreach (object o in recipientInfos)
- {
- RecipientInfo ri = RecipientInfo.GetInstance(o);
-
- if (ri.Version.Value.IntValue != 0)
- {
- return 2;
- }
- }
-
- return 0;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/EnvelopedDataParser.cs b/BCCrypto/src/asn1/cms/EnvelopedDataParser.cs
deleted file mode 100644
index 5993537..0000000
--- a/BCCrypto/src/asn1/cms/EnvelopedDataParser.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * EnvelopedData ::= SEQUENCE {
- * version CMSVersion,
- * originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
- * recipientInfos RecipientInfos,
- * encryptedContentInfo EncryptedContentInfo,
- * unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL
- * }
- *
- */
- public class EnvelopedDataParser
- {
- private Asn1SequenceParser _seq;
- private DerInteger _version;
- private IAsn1Convertible _nextObject;
- private bool _originatorInfoCalled;
-
- public EnvelopedDataParser(
- Asn1SequenceParser seq)
- {
- this._seq = seq;
- this._version = (DerInteger)seq.ReadObject();
- }
-
- public DerInteger Version
- {
- get { return _version; }
- }
-
- public OriginatorInfo GetOriginatorInfo()
- {
- _originatorInfoCalled = true;
-
- if (_nextObject == null)
- {
- _nextObject = _seq.ReadObject();
- }
-
- if (_nextObject is Asn1TaggedObjectParser && ((Asn1TaggedObjectParser)_nextObject).TagNo == 0)
- {
- Asn1SequenceParser originatorInfo = (Asn1SequenceParser)
- ((Asn1TaggedObjectParser)_nextObject).GetObjectParser(Asn1Tags.Sequence, false);
- _nextObject = null;
- return OriginatorInfo.GetInstance(originatorInfo.ToAsn1Object());
- }
-
- return null;
- }
-
- public Asn1SetParser GetRecipientInfos()
- {
- if (!_originatorInfoCalled)
- {
- GetOriginatorInfo();
- }
-
- if (_nextObject == null)
- {
- _nextObject = _seq.ReadObject();
- }
-
- Asn1SetParser recipientInfos = (Asn1SetParser)_nextObject;
- _nextObject = null;
- return recipientInfos;
- }
-
- public EncryptedContentInfoParser GetEncryptedContentInfo()
- {
- if (_nextObject == null)
- {
- _nextObject = _seq.ReadObject();
- }
-
- if (_nextObject != null)
- {
- Asn1SequenceParser o = (Asn1SequenceParser) _nextObject;
- _nextObject = null;
- return new EncryptedContentInfoParser(o);
- }
-
- return null;
- }
-
- public Asn1SetParser GetUnprotectedAttrs()
- {
- if (_nextObject == null)
- {
- _nextObject = _seq.ReadObject();
- }
-
- if (_nextObject != null)
- {
- IAsn1Convertible o = _nextObject;
- _nextObject = null;
- return (Asn1SetParser)((Asn1TaggedObjectParser)o).GetObjectParser(Asn1Tags.Set, false);
- }
-
- return null;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/Evidence.cs b/BCCrypto/src/asn1/cms/Evidence.cs
deleted file mode 100644
index 8374aed..0000000
--- a/BCCrypto/src/asn1/cms/Evidence.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class Evidence
- : Asn1Encodable, IAsn1Choice
- {
- private TimeStampTokenEvidence tstEvidence;
-
- public Evidence(TimeStampTokenEvidence tstEvidence)
- {
- this.tstEvidence = tstEvidence;
- }
-
- private Evidence(Asn1TaggedObject tagged)
- {
- if (tagged.TagNo == 0)
- {
- this.tstEvidence = TimeStampTokenEvidence.GetInstance(tagged, false);
- }
- }
-
- public static Evidence GetInstance(object obj)
- {
- if (obj is Evidence)
- return (Evidence)obj;
-
- if (obj is Asn1TaggedObject)
- return new Evidence(Asn1TaggedObject.GetInstance(obj));
-
- throw new ArgumentException("Unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual TimeStampTokenEvidence TstEvidence
- {
- get { return tstEvidence; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- if (tstEvidence != null)
- return new DerTaggedObject(false, 0, tstEvidence);
-
- return null;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/IssuerAndSerialNumber.cs b/BCCrypto/src/asn1/cms/IssuerAndSerialNumber.cs
deleted file mode 100644
index b509e7e..0000000
--- a/BCCrypto/src/asn1/cms/IssuerAndSerialNumber.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class IssuerAndSerialNumber
- : Asn1Encodable
- {
- private X509Name name;
- private DerInteger serialNumber;
-
- public static IssuerAndSerialNumber GetInstance(object obj)
- {
- if (obj == null)
- return null;
- IssuerAndSerialNumber existing = obj as IssuerAndSerialNumber;
- if (existing != null)
- return existing;
- return new IssuerAndSerialNumber(Asn1Sequence.GetInstance(obj));
- }
-
- [Obsolete("Use GetInstance() instead")]
- public IssuerAndSerialNumber(
- Asn1Sequence seq)
- {
- this.name = X509Name.GetInstance(seq[0]);
- this.serialNumber = (DerInteger) seq[1];
- }
-
- public IssuerAndSerialNumber(
- X509Name name,
- BigInteger serialNumber)
- {
- this.name = name;
- this.serialNumber = new DerInteger(serialNumber);
- }
-
- public IssuerAndSerialNumber(
- X509Name name,
- DerInteger serialNumber)
- {
- this.name = name;
- this.serialNumber = serialNumber;
- }
-
- public X509Name Name
- {
- get { return name; }
- }
-
- public DerInteger SerialNumber
- {
- get { return serialNumber; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(name, serialNumber);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/KEKIdentifier.cs b/BCCrypto/src/asn1/cms/KEKIdentifier.cs
deleted file mode 100644
index a422174..0000000
--- a/BCCrypto/src/asn1/cms/KEKIdentifier.cs
+++ /dev/null
@@ -1,119 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class KekIdentifier
- : Asn1Encodable
- {
- private Asn1OctetString keyIdentifier;
- private DerGeneralizedTime date;
- private OtherKeyAttribute other;
-
- public KekIdentifier(
- byte[] keyIdentifier,
- DerGeneralizedTime date,
- OtherKeyAttribute other)
- {
- this.keyIdentifier = new DerOctetString(keyIdentifier);
- this.date = date;
- this.other = other;
- }
-
- public KekIdentifier(
- Asn1Sequence seq)
- {
- keyIdentifier = (Asn1OctetString) seq[0];
-
- switch (seq.Count)
- {
- case 1:
- break;
- case 2:
- if (seq[1] is DerGeneralizedTime)
- {
- date = (DerGeneralizedTime) seq[1];
- }
- else
- {
- other = OtherKeyAttribute.GetInstance(seq[2]);
- }
- break;
- case 3:
- date = (DerGeneralizedTime) seq[1];
- other = OtherKeyAttribute.GetInstance(seq[2]);
- break;
- default:
- throw new ArgumentException("Invalid KekIdentifier");
- }
- }
-
- /**
- * return a KekIdentifier object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static KekIdentifier GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- /**
- * return a KekIdentifier object from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static KekIdentifier GetInstance(
- object obj)
- {
- if (obj == null || obj is KekIdentifier)
- return (KekIdentifier)obj;
-
- if (obj is Asn1Sequence)
- return new KekIdentifier((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid KekIdentifier: " + Platform.GetTypeName(obj));
- }
-
- public Asn1OctetString KeyIdentifier
- {
- get { return keyIdentifier; }
- }
-
- public DerGeneralizedTime Date
- {
- get { return date; }
- }
-
- public OtherKeyAttribute Other
- {
- get { return other; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * KekIdentifier ::= Sequence {
- * keyIdentifier OCTET STRING,
- * date GeneralizedTime OPTIONAL,
- * other OtherKeyAttribute OPTIONAL
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(keyIdentifier);
- v.AddOptional(date, other);
- return new DerSequence(v);
- }
- }
-}
-
diff --git a/BCCrypto/src/asn1/cms/KEKRecipientInfo.cs b/BCCrypto/src/asn1/cms/KEKRecipientInfo.cs
deleted file mode 100644
index 810e7fc..0000000
--- a/BCCrypto/src/asn1/cms/KEKRecipientInfo.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class KekRecipientInfo
- : Asn1Encodable
- {
- private DerInteger version;
- private KekIdentifier kekID;
- private AlgorithmIdentifier keyEncryptionAlgorithm;
- private Asn1OctetString encryptedKey;
-
- public KekRecipientInfo(
- KekIdentifier kekID,
- AlgorithmIdentifier keyEncryptionAlgorithm,
- Asn1OctetString encryptedKey)
- {
- this.version = new DerInteger(4);
- this.kekID = kekID;
- this.keyEncryptionAlgorithm = keyEncryptionAlgorithm;
- this.encryptedKey = encryptedKey;
- }
-
- public KekRecipientInfo(
- Asn1Sequence seq)
- {
- version = (DerInteger) seq[0];
- kekID = KekIdentifier.GetInstance(seq[1]);
- keyEncryptionAlgorithm = AlgorithmIdentifier.GetInstance(seq[2]);
- encryptedKey = (Asn1OctetString) seq[3];
- }
-
- /**
- * return a KekRecipientInfo object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static KekRecipientInfo GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- /**
- * return a KekRecipientInfo object from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static KekRecipientInfo GetInstance(
- object obj)
- {
- if (obj == null || obj is KekRecipientInfo)
- return (KekRecipientInfo)obj;
-
- if(obj is Asn1Sequence)
- return new KekRecipientInfo((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid KekRecipientInfo: " + Platform.GetTypeName(obj));
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public KekIdentifier KekID
- {
- get { return kekID; }
- }
-
- public AlgorithmIdentifier KeyEncryptionAlgorithm
- {
- get { return keyEncryptionAlgorithm; }
- }
-
- public Asn1OctetString EncryptedKey
- {
- get { return encryptedKey; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * KekRecipientInfo ::= Sequence {
- * version CMSVersion, -- always set to 4
- * kekID KekIdentifier,
- * keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
- * encryptedKey EncryptedKey
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(version, kekID, keyEncryptionAlgorithm, encryptedKey);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/KeyAgreeRecipientIdentifier.cs b/BCCrypto/src/asn1/cms/KeyAgreeRecipientIdentifier.cs
deleted file mode 100644
index 0256c2d..0000000
--- a/BCCrypto/src/asn1/cms/KeyAgreeRecipientIdentifier.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class KeyAgreeRecipientIdentifier
- : Asn1Encodable, IAsn1Choice
- {
- /**
- * return an KeyAgreeRecipientIdentifier object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param isExplicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static KeyAgreeRecipientIdentifier GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- /**
- * return an KeyAgreeRecipientIdentifier object from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static KeyAgreeRecipientIdentifier GetInstance(
- object obj)
- {
- if (obj == null || obj is KeyAgreeRecipientIdentifier)
- return (KeyAgreeRecipientIdentifier)obj;
-
- if (obj is Asn1Sequence)
- return new KeyAgreeRecipientIdentifier(IssuerAndSerialNumber.GetInstance(obj));
-
- if (obj is Asn1TaggedObject && ((Asn1TaggedObject)obj).TagNo == 0)
- {
- return new KeyAgreeRecipientIdentifier(RecipientKeyIdentifier.GetInstance(
- (Asn1TaggedObject)obj, false));
- }
-
- throw new ArgumentException("Invalid KeyAgreeRecipientIdentifier: " + Platform.GetTypeName(obj), "obj");
- }
-
- private readonly IssuerAndSerialNumber issuerSerial;
- private readonly RecipientKeyIdentifier rKeyID;
-
- public KeyAgreeRecipientIdentifier(
- IssuerAndSerialNumber issuerSerial)
- {
- this.issuerSerial = issuerSerial;
- }
-
- public KeyAgreeRecipientIdentifier(
- RecipientKeyIdentifier rKeyID)
- {
- this.rKeyID = rKeyID;
- }
-
- public IssuerAndSerialNumber IssuerAndSerialNumber
- {
- get { return issuerSerial; }
- }
-
- public RecipientKeyIdentifier RKeyID
- {
- get { return rKeyID; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * KeyAgreeRecipientIdentifier ::= CHOICE {
- * issuerAndSerialNumber IssuerAndSerialNumber,
- * rKeyId [0] IMPLICIT RecipientKeyIdentifier
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- if (issuerSerial != null)
- {
- return issuerSerial.ToAsn1Object();
- }
-
- return new DerTaggedObject(false, 0, rKeyID);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/KeyAgreeRecipientInfo.cs b/BCCrypto/src/asn1/cms/KeyAgreeRecipientInfo.cs
deleted file mode 100644
index 62a3892..0000000
--- a/BCCrypto/src/asn1/cms/KeyAgreeRecipientInfo.cs
+++ /dev/null
@@ -1,141 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class KeyAgreeRecipientInfo
- : Asn1Encodable
- {
- private DerInteger version;
- private OriginatorIdentifierOrKey originator;
- private Asn1OctetString ukm;
- private AlgorithmIdentifier keyEncryptionAlgorithm;
- private Asn1Sequence recipientEncryptedKeys;
-
- public KeyAgreeRecipientInfo(
- OriginatorIdentifierOrKey originator,
- Asn1OctetString ukm,
- AlgorithmIdentifier keyEncryptionAlgorithm,
- Asn1Sequence recipientEncryptedKeys)
- {
- this.version = new DerInteger(3);
- this.originator = originator;
- this.ukm = ukm;
- this.keyEncryptionAlgorithm = keyEncryptionAlgorithm;
- this.recipientEncryptedKeys = recipientEncryptedKeys;
- }
-
- public KeyAgreeRecipientInfo(
- Asn1Sequence seq)
- {
- int index = 0;
-
- version = (DerInteger) seq[index++];
- originator = OriginatorIdentifierOrKey.GetInstance(
- (Asn1TaggedObject) seq[index++], true);
-
- if (seq[index] is Asn1TaggedObject)
- {
- ukm = Asn1OctetString.GetInstance(
- (Asn1TaggedObject) seq[index++], true);
- }
-
- keyEncryptionAlgorithm = AlgorithmIdentifier.GetInstance(
- seq[index++]);
-
- recipientEncryptedKeys = (Asn1Sequence) seq[index++];
- }
-
- /**
- * return a KeyAgreeRecipientInfo object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static KeyAgreeRecipientInfo GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- /**
- * return a KeyAgreeRecipientInfo object from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static KeyAgreeRecipientInfo GetInstance(
- object obj)
- {
- if (obj == null || obj is KeyAgreeRecipientInfo)
- return (KeyAgreeRecipientInfo)obj;
-
- if (obj is Asn1Sequence)
- return new KeyAgreeRecipientInfo((Asn1Sequence)obj);
-
- throw new ArgumentException(
- "Illegal object in KeyAgreeRecipientInfo: " + Platform.GetTypeName(obj));
-
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public OriginatorIdentifierOrKey Originator
- {
- get { return originator; }
- }
-
- public Asn1OctetString UserKeyingMaterial
- {
- get { return ukm; }
- }
-
- public AlgorithmIdentifier KeyEncryptionAlgorithm
- {
- get { return keyEncryptionAlgorithm; }
- }
-
- public Asn1Sequence RecipientEncryptedKeys
- {
- get { return recipientEncryptedKeys; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * KeyAgreeRecipientInfo ::= Sequence {
- * version CMSVersion, -- always set to 3
- * originator [0] EXPLICIT OriginatorIdentifierOrKey,
- * ukm [1] EXPLICIT UserKeyingMaterial OPTIONAL,
- * keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
- * recipientEncryptedKeys RecipientEncryptedKeys
- * }
- *
- * UserKeyingMaterial ::= OCTET STRING
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- version, new DerTaggedObject(true, 0, originator));
-
- if (ukm != null)
- {
- v.Add(new DerTaggedObject(true, 1, ukm));
- }
-
- v.Add(keyEncryptionAlgorithm, recipientEncryptedKeys);
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/KeyTransRecipientInfo.cs b/BCCrypto/src/asn1/cms/KeyTransRecipientInfo.cs
deleted file mode 100644
index 5e4fd22..0000000
--- a/BCCrypto/src/asn1/cms/KeyTransRecipientInfo.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class KeyTransRecipientInfo
- : Asn1Encodable
- {
- private DerInteger version;
- private RecipientIdentifier rid;
- private AlgorithmIdentifier keyEncryptionAlgorithm;
- private Asn1OctetString encryptedKey;
-
- public KeyTransRecipientInfo(
- RecipientIdentifier rid,
- AlgorithmIdentifier keyEncryptionAlgorithm,
- Asn1OctetString encryptedKey)
- {
- if (rid.ToAsn1Object() is Asn1TaggedObject)
- {
- this.version = new DerInteger(2);
- }
- else
- {
- this.version = new DerInteger(0);
- }
-
- this.rid = rid;
- this.keyEncryptionAlgorithm = keyEncryptionAlgorithm;
- this.encryptedKey = encryptedKey;
- }
-
- public KeyTransRecipientInfo(
- Asn1Sequence seq)
- {
- this.version = (DerInteger) seq[0];
- this.rid = RecipientIdentifier.GetInstance(seq[1]);
- this.keyEncryptionAlgorithm = AlgorithmIdentifier.GetInstance(seq[2]);
- this.encryptedKey = (Asn1OctetString) seq[3];
- }
-
- /**
- * return a KeyTransRecipientInfo object from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static KeyTransRecipientInfo GetInstance(
- object obj)
- {
- if (obj == null || obj is KeyTransRecipientInfo)
- return (KeyTransRecipientInfo) obj;
-
- if(obj is Asn1Sequence)
- return new KeyTransRecipientInfo((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Illegal object in KeyTransRecipientInfo: " + Platform.GetTypeName(obj));
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public RecipientIdentifier RecipientIdentifier
- {
- get { return rid; }
- }
-
- public AlgorithmIdentifier KeyEncryptionAlgorithm
- {
- get { return keyEncryptionAlgorithm; }
- }
-
- public Asn1OctetString EncryptedKey
- {
- get { return encryptedKey; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * KeyTransRecipientInfo ::= Sequence {
- * version CMSVersion, -- always set to 0 or 2
- * rid RecipientIdentifier,
- * keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
- * encryptedKey EncryptedKey
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(version, rid, keyEncryptionAlgorithm, encryptedKey);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/MetaData.cs b/BCCrypto/src/asn1/cms/MetaData.cs
deleted file mode 100644
index ad2b5c4..0000000
--- a/BCCrypto/src/asn1/cms/MetaData.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class MetaData
- : Asn1Encodable
- {
- private DerBoolean hashProtected;
- private DerUtf8String fileName;
- private DerIA5String mediaType;
- private Attributes otherMetaData;
-
- public MetaData(
- DerBoolean hashProtected,
- DerUtf8String fileName,
- DerIA5String mediaType,
- Attributes otherMetaData)
- {
- this.hashProtected = hashProtected;
- this.fileName = fileName;
- this.mediaType = mediaType;
- this.otherMetaData = otherMetaData;
- }
-
- private MetaData(Asn1Sequence seq)
- {
- this.hashProtected = DerBoolean.GetInstance(seq[0]);
-
- int index = 1;
-
- if (index < seq.Count && seq[index] is DerUtf8String)
- {
- this.fileName = DerUtf8String.GetInstance(seq[index++]);
- }
- if (index < seq.Count && seq[index] is DerIA5String)
- {
- this.mediaType = DerIA5String.GetInstance(seq[index++]);
- }
- if (index < seq.Count)
- {
- this.otherMetaData = Attributes.GetInstance(seq[index++]);
- }
- }
-
- public static MetaData GetInstance(object obj)
- {
- if (obj is MetaData)
- return (MetaData)obj;
-
- if (obj != null)
- return new MetaData(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- /**
- *
- * MetaData ::= SEQUENCE {
- * hashProtected BOOLEAN,
- * fileName UTF8String OPTIONAL,
- * mediaType IA5String OPTIONAL,
- * otherMetaData Attributes OPTIONAL
- * }
- *
- * @return
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(hashProtected);
- v.AddOptional(fileName, mediaType, otherMetaData);
- return new DerSequence(v);
- }
-
- public virtual bool IsHashProtected
- {
- get { return hashProtected.IsTrue; }
- }
-
- public virtual DerUtf8String FileName
- {
- get { return fileName; }
- }
-
- public virtual DerIA5String MediaType
- {
- get { return mediaType; }
- }
-
- public virtual Attributes OtherMetaData
- {
- get { return otherMetaData; }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/OriginatorIdentifierOrKey.cs b/BCCrypto/src/asn1/cms/OriginatorIdentifierOrKey.cs
deleted file mode 100644
index f197fe9..0000000
--- a/BCCrypto/src/asn1/cms/OriginatorIdentifierOrKey.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class OriginatorIdentifierOrKey
- : Asn1Encodable, IAsn1Choice
- {
- private Asn1Encodable id;
-
- public OriginatorIdentifierOrKey(
- IssuerAndSerialNumber id)
- {
- this.id = id;
- }
-
- [Obsolete("Use version taking a 'SubjectKeyIdentifier'")]
- public OriginatorIdentifierOrKey(
- Asn1OctetString id)
- : this(new SubjectKeyIdentifier(id))
- {
- }
-
- public OriginatorIdentifierOrKey(
- SubjectKeyIdentifier id)
- {
- this.id = new DerTaggedObject(false, 0, id);
- }
-
- public OriginatorIdentifierOrKey(
- OriginatorPublicKey id)
- {
- this.id = new DerTaggedObject(false, 1, id);
- }
-
- [Obsolete("Use more specific version")]
- public OriginatorIdentifierOrKey(
- Asn1Object id)
- {
- this.id = id;
- }
-
- private OriginatorIdentifierOrKey(
- Asn1TaggedObject id)
- {
- // TODO Add validation
- this.id = id;
- }
-
- /**
- * return an OriginatorIdentifierOrKey object from a tagged object.
- *
- * @param o the tagged object holding the object we want.
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static OriginatorIdentifierOrKey GetInstance(
- Asn1TaggedObject o,
- bool explicitly)
- {
- if (!explicitly)
- {
- throw new ArgumentException(
- "Can't implicitly tag OriginatorIdentifierOrKey");
- }
-
- return GetInstance(o.GetObject());
- }
-
- /**
- * return an OriginatorIdentifierOrKey object from the given object.
- *
- * @param o the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static OriginatorIdentifierOrKey GetInstance(
- object o)
- {
- if (o == null || o is OriginatorIdentifierOrKey)
- return (OriginatorIdentifierOrKey)o;
-
- if (o is IssuerAndSerialNumber)
- return new OriginatorIdentifierOrKey((IssuerAndSerialNumber)o);
-
- if (o is SubjectKeyIdentifier)
- return new OriginatorIdentifierOrKey((SubjectKeyIdentifier)o);
-
- if (o is OriginatorPublicKey)
- return new OriginatorIdentifierOrKey((OriginatorPublicKey)o);
-
- if (o is Asn1TaggedObject)
- return new OriginatorIdentifierOrKey((Asn1TaggedObject)o);
-
- throw new ArgumentException("Invalid OriginatorIdentifierOrKey: " + Platform.GetTypeName(o));
- }
-
- public Asn1Encodable ID
- {
- get { return id; }
- }
-
- public IssuerAndSerialNumber IssuerAndSerialNumber
- {
- get
- {
- if (id is IssuerAndSerialNumber)
- {
- return (IssuerAndSerialNumber)id;
- }
-
- return null;
- }
- }
-
- public SubjectKeyIdentifier SubjectKeyIdentifier
- {
- get
- {
- if (id is Asn1TaggedObject && ((Asn1TaggedObject)id).TagNo == 0)
- {
- return SubjectKeyIdentifier.GetInstance((Asn1TaggedObject)id, false);
- }
-
- return null;
- }
- }
-
- [Obsolete("Use 'OriginatorPublicKey' property")]
- public OriginatorPublicKey OriginatorKey
- {
- get { return OriginatorPublicKey; }
- }
-
- public OriginatorPublicKey OriginatorPublicKey
- {
- get
- {
- if (id is Asn1TaggedObject && ((Asn1TaggedObject)id).TagNo == 1)
- {
- return OriginatorPublicKey.GetInstance((Asn1TaggedObject)id, false);
- }
-
- return null;
- }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * OriginatorIdentifierOrKey ::= CHOICE {
- * issuerAndSerialNumber IssuerAndSerialNumber,
- * subjectKeyIdentifier [0] SubjectKeyIdentifier,
- * originatorKey [1] OriginatorPublicKey
- * }
- *
- * SubjectKeyIdentifier ::= OCTET STRING
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return id.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/OriginatorInfo.cs b/BCCrypto/src/asn1/cms/OriginatorInfo.cs
deleted file mode 100644
index 33b049e..0000000
--- a/BCCrypto/src/asn1/cms/OriginatorInfo.cs
+++ /dev/null
@@ -1,121 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class OriginatorInfo
- : Asn1Encodable
- {
- private Asn1Set certs;
- private Asn1Set crls;
-
- public OriginatorInfo(
- Asn1Set certs,
- Asn1Set crls)
- {
- this.certs = certs;
- this.crls = crls;
- }
-
- public OriginatorInfo(
- Asn1Sequence seq)
- {
- switch (seq.Count)
- {
- case 0: // empty
- break;
- case 1:
- Asn1TaggedObject o = (Asn1TaggedObject) seq[0];
- switch (o.TagNo)
- {
- case 0 :
- certs = Asn1Set.GetInstance(o, false);
- break;
- case 1 :
- crls = Asn1Set.GetInstance(o, false);
- break;
- default:
- throw new ArgumentException("Bad tag in OriginatorInfo: " + o.TagNo);
- }
- break;
- case 2:
- certs = Asn1Set.GetInstance((Asn1TaggedObject) seq[0], false);
- crls = Asn1Set.GetInstance((Asn1TaggedObject) seq[1], false);
- break;
- default:
- throw new ArgumentException("OriginatorInfo too big");
- }
- }
-
- /**
- * return an OriginatorInfo object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static OriginatorInfo GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- /**
- * return an OriginatorInfo object from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static OriginatorInfo GetInstance(
- object obj)
- {
- if (obj == null || obj is OriginatorInfo)
- return (OriginatorInfo)obj;
-
- if (obj is Asn1Sequence)
- return new OriginatorInfo((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid OriginatorInfo: " + Platform.GetTypeName(obj));
- }
-
- public Asn1Set Certificates
- {
- get { return certs; }
- }
-
- public Asn1Set Crls
- {
- get { return crls; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * OriginatorInfo ::= Sequence {
- * certs [0] IMPLICIT CertificateSet OPTIONAL,
- * crls [1] IMPLICIT CertificateRevocationLists OPTIONAL
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (certs != null)
- {
- v.Add(new DerTaggedObject(false, 0, certs));
- }
-
- if (crls != null)
- {
- v.Add(new DerTaggedObject(false, 1, crls));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/OriginatorPublicKey.cs b/BCCrypto/src/asn1/cms/OriginatorPublicKey.cs
deleted file mode 100644
index 9f29c62..0000000
--- a/BCCrypto/src/asn1/cms/OriginatorPublicKey.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class OriginatorPublicKey
- : Asn1Encodable
- {
- private readonly AlgorithmIdentifier mAlgorithm;
- private readonly DerBitString mPublicKey;
-
- public OriginatorPublicKey(
- AlgorithmIdentifier algorithm,
- byte[] publicKey)
- {
- this.mAlgorithm = algorithm;
- this.mPublicKey = new DerBitString(publicKey);
- }
-
- [Obsolete("Use 'GetInstance' instead")]
- public OriginatorPublicKey(
- Asn1Sequence seq)
- {
- this.mAlgorithm = AlgorithmIdentifier.GetInstance(seq[0]);
- this.mPublicKey = DerBitString.GetInstance(seq[1]);
- }
-
- /**
- * return an OriginatorPublicKey object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static OriginatorPublicKey GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- /**
- * return an OriginatorPublicKey object from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static OriginatorPublicKey GetInstance(
- object obj)
- {
- if (obj == null || obj is OriginatorPublicKey)
- return (OriginatorPublicKey)obj;
-
- if (obj is Asn1Sequence)
- return new OriginatorPublicKey(Asn1Sequence.GetInstance(obj));
-
- throw new ArgumentException("Invalid OriginatorPublicKey: " + Platform.GetTypeName(obj));
- }
-
- public AlgorithmIdentifier Algorithm
- {
- get { return mAlgorithm; }
- }
-
- public DerBitString PublicKey
- {
- get { return mPublicKey; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * OriginatorPublicKey ::= Sequence {
- * algorithm AlgorithmIdentifier,
- * publicKey BIT STRING
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(mAlgorithm, mPublicKey);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/OtherKeyAttribute.cs b/BCCrypto/src/asn1/cms/OtherKeyAttribute.cs
deleted file mode 100644
index 285c881..0000000
--- a/BCCrypto/src/asn1/cms/OtherKeyAttribute.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class OtherKeyAttribute
- : Asn1Encodable
- {
- private DerObjectIdentifier keyAttrId;
- private Asn1Encodable keyAttr;
-
- /**
- * return an OtherKeyAttribute object from the given object.
- *
- * @param o the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static OtherKeyAttribute GetInstance(
- object obj)
- {
- if (obj == null || obj is OtherKeyAttribute)
- return (OtherKeyAttribute) obj;
-
- if (obj is Asn1Sequence)
- return new OtherKeyAttribute((Asn1Sequence) obj);
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public OtherKeyAttribute(
- Asn1Sequence seq)
- {
- keyAttrId = (DerObjectIdentifier) seq[0];
- keyAttr = seq[1];
- }
-
- public OtherKeyAttribute(
- DerObjectIdentifier keyAttrId,
- Asn1Encodable keyAttr)
- {
- this.keyAttrId = keyAttrId;
- this.keyAttr = keyAttr;
- }
-
- public DerObjectIdentifier KeyAttrId
- {
- get { return keyAttrId; }
- }
-
- public Asn1Encodable KeyAttr
- {
- get { return keyAttr; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * OtherKeyAttribute ::= Sequence {
- * keyAttrId OBJECT IDENTIFIER,
- * keyAttr ANY DEFINED BY keyAttrId OPTIONAL
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(keyAttrId, keyAttr);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/OtherRecipientInfo.cs b/BCCrypto/src/asn1/cms/OtherRecipientInfo.cs
deleted file mode 100644
index 80dd68e..0000000
--- a/BCCrypto/src/asn1/cms/OtherRecipientInfo.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class OtherRecipientInfo
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier oriType;
- private readonly Asn1Encodable oriValue;
-
- public OtherRecipientInfo(
- DerObjectIdentifier oriType,
- Asn1Encodable oriValue)
- {
- this.oriType = oriType;
- this.oriValue = oriValue;
- }
-
- [Obsolete("Use GetInstance() instead")]
- public OtherRecipientInfo(
- Asn1Sequence seq)
- {
- oriType = DerObjectIdentifier.GetInstance(seq[0]);
- oriValue = seq[1];
- }
-
- /**
- * return a OtherRecipientInfo object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static OtherRecipientInfo GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- /**
- * return a OtherRecipientInfo object from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static OtherRecipientInfo GetInstance(
- object obj)
- {
- if (obj == null)
- return null;
- OtherRecipientInfo existing = obj as OtherRecipientInfo;
- if (existing != null)
- return existing;
- return new OtherRecipientInfo(Asn1Sequence.GetInstance(obj));
- }
-
- public virtual DerObjectIdentifier OriType
- {
- get { return oriType; }
- }
-
- public virtual Asn1Encodable OriValue
- {
- get { return oriValue; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * OtherRecipientInfo ::= Sequence {
- * oriType OBJECT IDENTIFIER,
- * oriValue ANY DEFINED BY oriType }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(oriType, oriValue);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/OtherRevocationInfoFormat.cs b/BCCrypto/src/asn1/cms/OtherRevocationInfoFormat.cs
deleted file mode 100644
index 7835489..0000000
--- a/BCCrypto/src/asn1/cms/OtherRevocationInfoFormat.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class OtherRevocationInfoFormat
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier otherRevInfoFormat;
- private readonly Asn1Encodable otherRevInfo;
-
- public OtherRevocationInfoFormat(
- DerObjectIdentifier otherRevInfoFormat,
- Asn1Encodable otherRevInfo)
- {
- this.otherRevInfoFormat = otherRevInfoFormat;
- this.otherRevInfo = otherRevInfo;
- }
-
- private OtherRevocationInfoFormat(Asn1Sequence seq)
- {
- otherRevInfoFormat = DerObjectIdentifier.GetInstance(seq[0]);
- otherRevInfo = seq[1];
- }
-
- /**
- * return a OtherRevocationInfoFormat object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param explicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception IllegalArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static OtherRevocationInfoFormat GetInstance(Asn1TaggedObject obj, bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- /**
- * return a OtherRevocationInfoFormat object from the given object.
- *
- * @param obj the object we want converted.
- * @exception IllegalArgumentException if the object cannot be converted.
- */
- public static OtherRevocationInfoFormat GetInstance(object obj)
- {
- if (obj is OtherRevocationInfoFormat)
- return (OtherRevocationInfoFormat)obj;
- if (obj != null)
- return new OtherRevocationInfoFormat(Asn1Sequence.GetInstance(obj));
- return null;
- }
-
- public virtual DerObjectIdentifier InfoFormat
- {
- get { return otherRevInfoFormat; }
- }
-
- public virtual Asn1Encodable Info
- {
- get { return otherRevInfo; }
- }
-
- /**
- * Produce an object suitable for an ASN1OutputStream.
- *
- * OtherRevocationInfoFormat ::= SEQUENCE {
- * otherRevInfoFormat OBJECT IDENTIFIER,
- * otherRevInfo ANY DEFINED BY otherRevInfoFormat }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(otherRevInfoFormat, otherRevInfo);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/PasswordRecipientInfo.cs b/BCCrypto/src/asn1/cms/PasswordRecipientInfo.cs
deleted file mode 100644
index 7f275fd..0000000
--- a/BCCrypto/src/asn1/cms/PasswordRecipientInfo.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class PasswordRecipientInfo
- : Asn1Encodable
- {
- private readonly DerInteger version;
- private readonly AlgorithmIdentifier keyDerivationAlgorithm;
- private readonly AlgorithmIdentifier keyEncryptionAlgorithm;
- private readonly Asn1OctetString encryptedKey;
-
- public PasswordRecipientInfo(
- AlgorithmIdentifier keyEncryptionAlgorithm,
- Asn1OctetString encryptedKey)
- {
- this.version = new DerInteger(0);
- this.keyEncryptionAlgorithm = keyEncryptionAlgorithm;
- this.encryptedKey = encryptedKey;
- }
-
- public PasswordRecipientInfo(
- AlgorithmIdentifier keyDerivationAlgorithm,
- AlgorithmIdentifier keyEncryptionAlgorithm,
- Asn1OctetString encryptedKey)
- {
- this.version = new DerInteger(0);
- this.keyDerivationAlgorithm = keyDerivationAlgorithm;
- this.keyEncryptionAlgorithm = keyEncryptionAlgorithm;
- this.encryptedKey = encryptedKey;
- }
-
- public PasswordRecipientInfo(
- Asn1Sequence seq)
- {
- version = (DerInteger) seq[0];
-
- if (seq[1] is Asn1TaggedObject)
- {
- keyDerivationAlgorithm = AlgorithmIdentifier.GetInstance((Asn1TaggedObject) seq[1], false);
- keyEncryptionAlgorithm = AlgorithmIdentifier.GetInstance(seq[2]);
- encryptedKey = (Asn1OctetString) seq[3];
- }
- else
- {
- keyEncryptionAlgorithm = AlgorithmIdentifier.GetInstance(seq[1]);
- encryptedKey = (Asn1OctetString) seq[2];
- }
- }
-
- /**
- * return a PasswordRecipientInfo object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param explicitly true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static PasswordRecipientInfo GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- /**
- * return a PasswordRecipientInfo object from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static PasswordRecipientInfo GetInstance(
- object obj)
- {
- if (obj == null || obj is PasswordRecipientInfo)
- return (PasswordRecipientInfo) obj;
-
- if (obj is Asn1Sequence)
- return new PasswordRecipientInfo((Asn1Sequence) obj);
-
- throw new ArgumentException("Invalid PasswordRecipientInfo: " + Platform.GetTypeName(obj));
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public AlgorithmIdentifier KeyDerivationAlgorithm
- {
- get { return keyDerivationAlgorithm; }
- }
-
- public AlgorithmIdentifier KeyEncryptionAlgorithm
- {
- get { return keyEncryptionAlgorithm; }
- }
-
- public Asn1OctetString EncryptedKey
- {
- get { return encryptedKey; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * PasswordRecipientInfo ::= Sequence {
- * version CMSVersion, -- Always set to 0
- * keyDerivationAlgorithm [0] KeyDerivationAlgorithmIdentifier
- * OPTIONAL,
- * keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
- * encryptedKey EncryptedKey }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(version);
-
- if (keyDerivationAlgorithm != null)
- {
- v.Add(new DerTaggedObject(false, 0, keyDerivationAlgorithm));
- }
-
- v.Add(keyEncryptionAlgorithm, encryptedKey);
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/RecipientEncryptedKey.cs b/BCCrypto/src/asn1/cms/RecipientEncryptedKey.cs
deleted file mode 100644
index 1afba4a..0000000
--- a/BCCrypto/src/asn1/cms/RecipientEncryptedKey.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class RecipientEncryptedKey
- : Asn1Encodable
- {
- private readonly KeyAgreeRecipientIdentifier identifier;
- private readonly Asn1OctetString encryptedKey;
-
- private RecipientEncryptedKey(
- Asn1Sequence seq)
- {
- identifier = KeyAgreeRecipientIdentifier.GetInstance(seq[0]);
- encryptedKey = (Asn1OctetString) seq[1];
- }
-
- /**
- * return an RecipientEncryptedKey object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param isExplicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static RecipientEncryptedKey GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- /**
- * return a RecipientEncryptedKey object from the given object.
- *
- * @param obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static RecipientEncryptedKey GetInstance(
- object obj)
- {
- if (obj == null || obj is RecipientEncryptedKey)
- {
- return (RecipientEncryptedKey) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new RecipientEncryptedKey((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Invalid RecipientEncryptedKey: " + Platform.GetTypeName(obj), "obj");
- }
-
- public RecipientEncryptedKey(
- KeyAgreeRecipientIdentifier id,
- Asn1OctetString encryptedKey)
- {
- this.identifier = id;
- this.encryptedKey = encryptedKey;
- }
-
- public KeyAgreeRecipientIdentifier Identifier
- {
- get { return identifier; }
- }
-
- public Asn1OctetString EncryptedKey
- {
- get { return encryptedKey; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * RecipientEncryptedKey ::= SEQUENCE {
- * rid KeyAgreeRecipientIdentifier,
- * encryptedKey EncryptedKey
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(identifier, encryptedKey);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/RecipientIdentifier.cs b/BCCrypto/src/asn1/cms/RecipientIdentifier.cs
deleted file mode 100644
index f29fa8d..0000000
--- a/BCCrypto/src/asn1/cms/RecipientIdentifier.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class RecipientIdentifier
- : Asn1Encodable, IAsn1Choice
- {
- private Asn1Encodable id;
-
- public RecipientIdentifier(
- IssuerAndSerialNumber id)
- {
- this.id = id;
- }
-
- public RecipientIdentifier(
- Asn1OctetString id)
- {
- this.id = new DerTaggedObject(false, 0, id);
- }
-
- public RecipientIdentifier(
- Asn1Object id)
- {
- this.id = id;
- }
-
- /**
- * return a RecipientIdentifier object from the given object.
- *
- * @param o the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static RecipientIdentifier GetInstance(
- object o)
- {
- if (o == null || o is RecipientIdentifier)
- return (RecipientIdentifier)o;
-
- if (o is IssuerAndSerialNumber)
- return new RecipientIdentifier((IssuerAndSerialNumber) o);
-
- if (o is Asn1OctetString)
- return new RecipientIdentifier((Asn1OctetString) o);
-
- if (o is Asn1Object)
- return new RecipientIdentifier((Asn1Object) o);
-
- throw new ArgumentException(
- "Illegal object in RecipientIdentifier: " + Platform.GetTypeName(o));
- }
-
- public bool IsTagged
- {
- get { return (id is Asn1TaggedObject); }
- }
-
- public Asn1Encodable ID
- {
- get
- {
- if (id is Asn1TaggedObject)
- {
- return Asn1OctetString.GetInstance((Asn1TaggedObject) id, false);
- }
-
- return IssuerAndSerialNumber.GetInstance(id);
- }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * RecipientIdentifier ::= CHOICE {
- * issuerAndSerialNumber IssuerAndSerialNumber,
- * subjectKeyIdentifier [0] SubjectKeyIdentifier
- * }
- *
- * SubjectKeyIdentifier ::= OCTET STRING
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return id.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/RecipientInfo.cs b/BCCrypto/src/asn1/cms/RecipientInfo.cs
deleted file mode 100644
index c03ad90..0000000
--- a/BCCrypto/src/asn1/cms/RecipientInfo.cs
+++ /dev/null
@@ -1,145 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class RecipientInfo
- : Asn1Encodable, IAsn1Choice
- {
- internal Asn1Encodable info;
-
- public RecipientInfo(
- KeyTransRecipientInfo info)
- {
- this.info = info;
- }
-
- public RecipientInfo(
- KeyAgreeRecipientInfo info)
- {
- this.info = new DerTaggedObject(false, 1, info);
- }
-
- public RecipientInfo(
- KekRecipientInfo info)
- {
- this.info = new DerTaggedObject(false, 2, info);
- }
-
- public RecipientInfo(
- PasswordRecipientInfo info)
- {
- this.info = new DerTaggedObject(false, 3, info);
- }
-
- public RecipientInfo(
- OtherRecipientInfo info)
- {
- this.info = new DerTaggedObject(false, 4, info);
- }
-
- public RecipientInfo(
- Asn1Object info)
- {
- this.info = info;
- }
-
- public static RecipientInfo GetInstance(
- object o)
- {
- if (o == null || o is RecipientInfo)
- return (RecipientInfo) o;
-
- if (o is Asn1Sequence)
- return new RecipientInfo((Asn1Sequence) o);
-
- if (o is Asn1TaggedObject)
- return new RecipientInfo((Asn1TaggedObject) o);
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(o));
- }
-
- public DerInteger Version
- {
- get
- {
- if (info is Asn1TaggedObject)
- {
- Asn1TaggedObject o = (Asn1TaggedObject) info;
-
- switch (o.TagNo)
- {
- case 1:
- return KeyAgreeRecipientInfo.GetInstance(o, false).Version;
- case 2:
- return GetKekInfo(o).Version;
- case 3:
- return PasswordRecipientInfo.GetInstance(o, false).Version;
- case 4:
- return new DerInteger(0); // no syntax version for OtherRecipientInfo
- default:
- throw new InvalidOperationException("unknown tag");
- }
- }
-
- return KeyTransRecipientInfo.GetInstance(info).Version;
- }
- }
-
- public bool IsTagged
- {
- get { return info is Asn1TaggedObject; }
- }
-
- public Asn1Encodable Info
- {
- get
- {
- if (info is Asn1TaggedObject)
- {
- Asn1TaggedObject o = (Asn1TaggedObject) info;
-
- switch (o.TagNo)
- {
- case 1:
- return KeyAgreeRecipientInfo.GetInstance(o, false);
- case 2:
- return GetKekInfo(o);
- case 3:
- return PasswordRecipientInfo.GetInstance(o, false);
- case 4:
- return OtherRecipientInfo.GetInstance(o, false);
- default:
- throw new InvalidOperationException("unknown tag");
- }
- }
-
- return KeyTransRecipientInfo.GetInstance(info);
- }
- }
-
- private KekRecipientInfo GetKekInfo(
- Asn1TaggedObject o)
- {
- // For compatibility with erroneous version, we don't always pass 'false' here
- return KekRecipientInfo.GetInstance(o, o.IsExplicit());
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * RecipientInfo ::= CHOICE {
- * ktri KeyTransRecipientInfo,
- * kari [1] KeyAgreeRecipientInfo,
- * kekri [2] KekRecipientInfo,
- * pwri [3] PasswordRecipientInfo,
- * ori [4] OtherRecipientInfo }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return info.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/RecipientKeyIdentifier.cs b/BCCrypto/src/asn1/cms/RecipientKeyIdentifier.cs
deleted file mode 100644
index 995ddab..0000000
--- a/BCCrypto/src/asn1/cms/RecipientKeyIdentifier.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class RecipientKeyIdentifier
- : Asn1Encodable
- {
- private Asn1OctetString subjectKeyIdentifier;
- private DerGeneralizedTime date;
- private OtherKeyAttribute other;
-
- public RecipientKeyIdentifier(
- Asn1OctetString subjectKeyIdentifier,
- DerGeneralizedTime date,
- OtherKeyAttribute other)
- {
- this.subjectKeyIdentifier = subjectKeyIdentifier;
- this.date = date;
- this.other = other;
- }
-
- public RecipientKeyIdentifier(
- byte[] subjectKeyIdentifier)
- : this(subjectKeyIdentifier, null, null)
- {
- }
-
- public RecipientKeyIdentifier(
- byte[] subjectKeyIdentifier,
- DerGeneralizedTime date,
- OtherKeyAttribute other)
- {
- this.subjectKeyIdentifier = new DerOctetString(subjectKeyIdentifier);
- this.date = date;
- this.other = other;
- }
-
- public RecipientKeyIdentifier(
- Asn1Sequence seq)
- {
- subjectKeyIdentifier = Asn1OctetString.GetInstance(
- seq[0]);
-
- switch(seq.Count)
- {
- case 1:
- break;
- case 2:
- if (seq[1] is DerGeneralizedTime)
- {
- date = (DerGeneralizedTime) seq[1];
- }
- else
- {
- other = OtherKeyAttribute.GetInstance(seq[2]);
- }
- break;
- case 3:
- date = (DerGeneralizedTime) seq[1];
- other = OtherKeyAttribute.GetInstance(seq[2]);
- break;
- default:
- throw new ArgumentException("Invalid RecipientKeyIdentifier");
- }
- }
-
- /**
- * return a RecipientKeyIdentifier object from a tagged object.
- *
- * @param _ato the tagged object holding the object we want.
- * @param _explicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @exception ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static RecipientKeyIdentifier GetInstance(
- Asn1TaggedObject ato,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(ato, explicitly));
- }
-
- /**
- * return a RecipientKeyIdentifier object from the given object.
- *
- * @param _obj the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static RecipientKeyIdentifier GetInstance(
- object obj)
- {
- if (obj == null || obj is RecipientKeyIdentifier)
- return (RecipientKeyIdentifier) obj;
-
- if (obj is Asn1Sequence)
- return new RecipientKeyIdentifier((Asn1Sequence) obj);
-
- throw new ArgumentException("Invalid RecipientKeyIdentifier: " + Platform.GetTypeName(obj));
- }
-
- public Asn1OctetString SubjectKeyIdentifier
- {
- get { return subjectKeyIdentifier; }
- }
-
- public DerGeneralizedTime Date
- {
- get { return date; }
- }
-
- public OtherKeyAttribute OtherKeyAttribute
- {
- get { return other; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * RecipientKeyIdentifier ::= Sequence {
- * subjectKeyIdentifier SubjectKeyIdentifier,
- * date GeneralizedTime OPTIONAL,
- * other OtherKeyAttribute OPTIONAL
- * }
- *
- * SubjectKeyIdentifier ::= OCTET STRING
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(subjectKeyIdentifier);
- v.AddOptional(date, other);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/SCVPReqRes.cs b/BCCrypto/src/asn1/cms/SCVPReqRes.cs
deleted file mode 100644
index 486979a..0000000
--- a/BCCrypto/src/asn1/cms/SCVPReqRes.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class ScvpReqRes
- : Asn1Encodable
- {
- private readonly ContentInfo request;
- private readonly ContentInfo response;
-
- public static ScvpReqRes GetInstance(object obj)
- {
- if (obj is ScvpReqRes)
- return (ScvpReqRes)obj;
- if (obj != null)
- return new ScvpReqRes(Asn1Sequence.GetInstance(obj));
- return null;
- }
-
- private ScvpReqRes(Asn1Sequence seq)
- {
- if (seq[0] is Asn1TaggedObject)
- {
- this.request = ContentInfo.GetInstance(Asn1TaggedObject.GetInstance(seq[0]), true);
- this.response = ContentInfo.GetInstance(seq[1]);
- }
- else
- {
- this.request = null;
- this.response = ContentInfo.GetInstance(seq[0]);
- }
- }
-
- public ScvpReqRes(ContentInfo response)
- : this(null, response)
- {
- }
-
- public ScvpReqRes(ContentInfo request, ContentInfo response)
- {
- this.request = request;
- this.response = response;
- }
-
- public virtual ContentInfo Request
- {
- get { return request; }
- }
-
- public virtual ContentInfo Response
- {
- get { return response; }
- }
-
- /**
- *
- * ScvpReqRes ::= SEQUENCE {
- * request [0] EXPLICIT ContentInfo OPTIONAL,
- * response ContentInfo }
- *
- * @return the ASN.1 primitive representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (request != null)
- {
- v.Add(new DerTaggedObject(true, 0, request));
- }
-
- v.Add(response);
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/SignedData.cs b/BCCrypto/src/asn1/cms/SignedData.cs
deleted file mode 100644
index 957b81c..0000000
--- a/BCCrypto/src/asn1/cms/SignedData.cs
+++ /dev/null
@@ -1,287 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- /**
- * a signed data object.
- */
- public class SignedData
- : Asn1Encodable
- {
- private static readonly DerInteger Version1 = new DerInteger(1);
- private static readonly DerInteger Version3 = new DerInteger(3);
- private static readonly DerInteger Version4 = new DerInteger(4);
- private static readonly DerInteger Version5 = new DerInteger(5);
-
- private readonly DerInteger version;
- private readonly Asn1Set digestAlgorithms;
- private readonly ContentInfo contentInfo;
- private readonly Asn1Set certificates;
- private readonly Asn1Set crls;
- private readonly Asn1Set signerInfos;
- private readonly bool certsBer;
- private readonly bool crlsBer;
-
- public static SignedData GetInstance(
- object obj)
- {
- if (obj is SignedData)
- return (SignedData) obj;
-
- if (obj is Asn1Sequence)
- return new SignedData((Asn1Sequence) obj);
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public SignedData(
- Asn1Set digestAlgorithms,
- ContentInfo contentInfo,
- Asn1Set certificates,
- Asn1Set crls,
- Asn1Set signerInfos)
- {
- this.version = CalculateVersion(contentInfo.ContentType, certificates, crls, signerInfos);
- this.digestAlgorithms = digestAlgorithms;
- this.contentInfo = contentInfo;
- this.certificates = certificates;
- this.crls = crls;
- this.signerInfos = signerInfos;
- this.crlsBer = crls is BerSet;
- this.certsBer = certificates is BerSet;
- }
-
- // RFC3852, section 5.1:
- // IF ((certificates is present) AND
- // (any certificates with a type of other are present)) OR
- // ((crls is present) AND
- // (any crls with a type of other are present))
- // THEN version MUST be 5
- // ELSE
- // IF (certificates is present) AND
- // (any version 2 attribute certificates are present)
- // THEN version MUST be 4
- // ELSE
- // IF ((certificates is present) AND
- // (any version 1 attribute certificates are present)) OR
- // (any SignerInfo structures are version 3) OR
- // (encapContentInfo eContentType is other than id-data)
- // THEN version MUST be 3
- // ELSE version MUST be 1
- //
- private DerInteger CalculateVersion(
- DerObjectIdentifier contentOid,
- Asn1Set certs,
- Asn1Set crls,
- Asn1Set signerInfs)
- {
- bool otherCert = false;
- bool otherCrl = false;
- bool attrCertV1Found = false;
- bool attrCertV2Found = false;
-
- if (certs != null)
- {
- foreach (object obj in certs)
- {
- if (obj is Asn1TaggedObject)
- {
- Asn1TaggedObject tagged = (Asn1TaggedObject)obj;
-
- if (tagged.TagNo == 1)
- {
- attrCertV1Found = true;
- }
- else if (tagged.TagNo == 2)
- {
- attrCertV2Found = true;
- }
- else if (tagged.TagNo == 3)
- {
- otherCert = true;
- break;
- }
- }
- }
- }
-
- if (otherCert)
- {
- return Version5;
- }
-
- if (crls != null)
- {
- foreach (object obj in crls)
- {
- if (obj is Asn1TaggedObject)
- {
- otherCrl = true;
- break;
- }
- }
- }
-
- if (otherCrl)
- {
- return Version5;
- }
-
- if (attrCertV2Found)
- {
- return Version4;
- }
-
- if (attrCertV1Found || !CmsObjectIdentifiers.Data.Equals(contentOid) || CheckForVersion3(signerInfs))
- {
- return Version3;
- }
-
- return Version1;
- }
-
- private bool CheckForVersion3(
- Asn1Set signerInfs)
- {
- foreach (object obj in signerInfs)
- {
- SignerInfo s = SignerInfo.GetInstance(obj);
-
- if (s.Version.Value.IntValue == 3)
- {
- return true;
- }
- }
-
- return false;
- }
-
- private SignedData(
- Asn1Sequence seq)
- {
- IEnumerator e = seq.GetEnumerator();
-
- e.MoveNext();
- version = (DerInteger)e.Current;
-
- e.MoveNext();
- digestAlgorithms = ((Asn1Set)e.Current);
-
- e.MoveNext();
- contentInfo = ContentInfo.GetInstance(e.Current);
-
- while (e.MoveNext())
- {
- Asn1Object o = (Asn1Object)e.Current;
-
- //
- // an interesting feature of SignedData is that there appear
- // to be varying implementations...
- // for the moment we ignore anything which doesn't fit.
- //
- if (o is Asn1TaggedObject)
- {
- Asn1TaggedObject tagged = (Asn1TaggedObject)o;
-
- switch (tagged.TagNo)
- {
- case 0:
- certsBer = tagged is BerTaggedObject;
- certificates = Asn1Set.GetInstance(tagged, false);
- break;
- case 1:
- crlsBer = tagged is BerTaggedObject;
- crls = Asn1Set.GetInstance(tagged, false);
- break;
- default:
- throw new ArgumentException("unknown tag value " + tagged.TagNo);
- }
- }
- else
- {
- signerInfos = (Asn1Set) o;
- }
- }
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public Asn1Set DigestAlgorithms
- {
- get { return digestAlgorithms; }
- }
-
- public ContentInfo EncapContentInfo
- {
- get { return contentInfo; }
- }
-
- public Asn1Set Certificates
- {
- get { return certificates; }
- }
-
- public Asn1Set CRLs
- {
- get { return crls; }
- }
-
- public Asn1Set SignerInfos
- {
- get { return signerInfos; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * SignedData ::= Sequence {
- * version CMSVersion,
- * digestAlgorithms DigestAlgorithmIdentifiers,
- * encapContentInfo EncapsulatedContentInfo,
- * certificates [0] IMPLICIT CertificateSet OPTIONAL,
- * crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
- * signerInfos SignerInfos
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- version, digestAlgorithms, contentInfo);
-
- if (certificates != null)
- {
- if (certsBer)
- {
- v.Add(new BerTaggedObject(false, 0, certificates));
- }
- else
- {
- v.Add(new DerTaggedObject(false, 0, certificates));
- }
- }
-
- if (crls != null)
- {
- if (crlsBer)
- {
- v.Add(new BerTaggedObject(false, 1, crls));
- }
- else
- {
- v.Add(new DerTaggedObject(false, 1, crls));
- }
- }
-
- v.Add(signerInfos);
-
- return new BerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/SignedDataParser.cs b/BCCrypto/src/asn1/cms/SignedDataParser.cs
deleted file mode 100644
index cd07f40..0000000
--- a/BCCrypto/src/asn1/cms/SignedDataParser.cs
+++ /dev/null
@@ -1,114 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- /**
- *
- * SignedData ::= SEQUENCE {
- * version CMSVersion,
- * digestAlgorithms DigestAlgorithmIdentifiers,
- * encapContentInfo EncapsulatedContentInfo,
- * certificates [0] IMPLICIT CertificateSet OPTIONAL,
- * crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
- * signerInfos SignerInfos
- * }
- *
- */
- public class SignedDataParser
- {
- private Asn1SequenceParser _seq;
- private DerInteger _version;
- private object _nextObject;
- private bool _certsCalled;
- private bool _crlsCalled;
-
- public static SignedDataParser GetInstance(
- object o)
- {
- if (o is Asn1Sequence)
- return new SignedDataParser(((Asn1Sequence)o).Parser);
-
- if (o is Asn1SequenceParser)
- return new SignedDataParser((Asn1SequenceParser)o);
-
- throw new IOException("unknown object encountered: " + Platform.GetTypeName(o));
- }
-
- public SignedDataParser(
- Asn1SequenceParser seq)
- {
- this._seq = seq;
- this._version = (DerInteger)seq.ReadObject();
- }
-
- public DerInteger Version
- {
- get { return _version; }
- }
-
- public Asn1SetParser GetDigestAlgorithms()
- {
- return (Asn1SetParser)_seq.ReadObject();
- }
-
- public ContentInfoParser GetEncapContentInfo()
- {
- return new ContentInfoParser((Asn1SequenceParser)_seq.ReadObject());
- }
-
- public Asn1SetParser GetCertificates()
- {
- _certsCalled = true;
- _nextObject = _seq.ReadObject();
-
- if (_nextObject is Asn1TaggedObjectParser && ((Asn1TaggedObjectParser)_nextObject).TagNo == 0)
- {
- Asn1SetParser certs = (Asn1SetParser)((Asn1TaggedObjectParser)_nextObject).GetObjectParser(Asn1Tags.Set, false);
- _nextObject = null;
-
- return certs;
- }
-
- return null;
- }
-
- public Asn1SetParser GetCrls()
- {
- if (!_certsCalled)
- throw new IOException("GetCerts() has not been called.");
-
- _crlsCalled = true;
-
- if (_nextObject == null)
- {
- _nextObject = _seq.ReadObject();
- }
-
- if (_nextObject is Asn1TaggedObjectParser && ((Asn1TaggedObjectParser)_nextObject).TagNo == 1)
- {
- Asn1SetParser crls = (Asn1SetParser)((Asn1TaggedObjectParser)_nextObject).GetObjectParser(Asn1Tags.Set, false);
- _nextObject = null;
-
- return crls;
- }
-
- return null;
- }
-
- public Asn1SetParser GetSignerInfos()
- {
- if (!_certsCalled || !_crlsCalled)
- throw new IOException("GetCerts() and/or GetCrls() has not been called.");
-
- if (_nextObject == null)
- {
- _nextObject = _seq.ReadObject();
- }
-
- return (Asn1SetParser)_nextObject;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/SignerIdentifier.cs b/BCCrypto/src/asn1/cms/SignerIdentifier.cs
deleted file mode 100644
index 195ab74..0000000
--- a/BCCrypto/src/asn1/cms/SignerIdentifier.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class SignerIdentifier
- : Asn1Encodable, IAsn1Choice
- {
- private Asn1Encodable id;
-
- public SignerIdentifier(
- IssuerAndSerialNumber id)
- {
- this.id = id;
- }
-
- public SignerIdentifier(
- Asn1OctetString id)
- {
- this.id = new DerTaggedObject(false, 0, id);
- }
-
- public SignerIdentifier(
- Asn1Object id)
- {
- this.id = id;
- }
-
- /**
- * return a SignerIdentifier object from the given object.
- *
- * @param o the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static SignerIdentifier GetInstance(
- object o)
- {
- if (o == null || o is SignerIdentifier)
- return (SignerIdentifier) o;
-
- if (o is IssuerAndSerialNumber)
- return new SignerIdentifier((IssuerAndSerialNumber) o);
-
- if (o is Asn1OctetString)
- return new SignerIdentifier((Asn1OctetString) o);
-
- if (o is Asn1Object)
- return new SignerIdentifier((Asn1Object) o);
-
- throw new ArgumentException(
- "Illegal object in SignerIdentifier: " + Platform.GetTypeName(o));
- }
-
- public bool IsTagged
- {
- get { return (id is Asn1TaggedObject); }
- }
-
- public Asn1Encodable ID
- {
- get
- {
- if (id is Asn1TaggedObject)
- {
- return Asn1OctetString.GetInstance((Asn1TaggedObject)id, false);
- }
-
- return id;
- }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * SignerIdentifier ::= CHOICE {
- * issuerAndSerialNumber IssuerAndSerialNumber,
- * subjectKeyIdentifier [0] SubjectKeyIdentifier
- * }
- *
- * SubjectKeyIdentifier ::= OCTET STRING
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return id.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/SignerInfo.cs b/BCCrypto/src/asn1/cms/SignerInfo.cs
deleted file mode 100644
index b6bd319..0000000
--- a/BCCrypto/src/asn1/cms/SignerInfo.cs
+++ /dev/null
@@ -1,185 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class SignerInfo
- : Asn1Encodable
- {
- private DerInteger version;
- private SignerIdentifier sid;
- private AlgorithmIdentifier digAlgorithm;
- private Asn1Set authenticatedAttributes;
- private AlgorithmIdentifier digEncryptionAlgorithm;
- private Asn1OctetString encryptedDigest;
- private Asn1Set unauthenticatedAttributes;
-
- public static SignerInfo GetInstance(
- object obj)
- {
- if (obj == null || obj is SignerInfo)
- return (SignerInfo) obj;
-
- if (obj is Asn1Sequence)
- return new SignerInfo((Asn1Sequence) obj);
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public SignerInfo(
- SignerIdentifier sid,
- AlgorithmIdentifier digAlgorithm,
- Asn1Set authenticatedAttributes,
- AlgorithmIdentifier digEncryptionAlgorithm,
- Asn1OctetString encryptedDigest,
- Asn1Set unauthenticatedAttributes)
- {
- this.version = new DerInteger(sid.IsTagged ? 3 : 1);
- this.sid = sid;
- this.digAlgorithm = digAlgorithm;
- this.authenticatedAttributes = authenticatedAttributes;
- this.digEncryptionAlgorithm = digEncryptionAlgorithm;
- this.encryptedDigest = encryptedDigest;
- this.unauthenticatedAttributes = unauthenticatedAttributes;
- }
-
- public SignerInfo(
- SignerIdentifier sid,
- AlgorithmIdentifier digAlgorithm,
- Attributes authenticatedAttributes,
- AlgorithmIdentifier digEncryptionAlgorithm,
- Asn1OctetString encryptedDigest,
- Attributes unauthenticatedAttributes)
- {
- this.version = new DerInteger(sid.IsTagged ? 3 : 1);
- this.sid = sid;
- this.digAlgorithm = digAlgorithm;
- this.authenticatedAttributes = Asn1Set.GetInstance(authenticatedAttributes);
- this.digEncryptionAlgorithm = digEncryptionAlgorithm;
- this.encryptedDigest = encryptedDigest;
- this.unauthenticatedAttributes = Asn1Set.GetInstance(unauthenticatedAttributes);
- }
-
- [Obsolete("Use 'GetInstance' instead")]
- public SignerInfo(
- Asn1Sequence seq)
- {
- IEnumerator e = seq.GetEnumerator();
-
- e.MoveNext();
- version = (DerInteger) e.Current;
-
- e.MoveNext();
- sid = SignerIdentifier.GetInstance(e.Current);
-
- e.MoveNext();
- digAlgorithm = AlgorithmIdentifier.GetInstance(e.Current);
-
- e.MoveNext();
- object obj = e.Current;
-
- if (obj is Asn1TaggedObject)
- {
- authenticatedAttributes = Asn1Set.GetInstance((Asn1TaggedObject) obj, false);
-
- e.MoveNext();
- digEncryptionAlgorithm = AlgorithmIdentifier.GetInstance(e.Current);
- }
- else
- {
- authenticatedAttributes = null;
- digEncryptionAlgorithm = AlgorithmIdentifier.GetInstance(obj);
- }
-
- e.MoveNext();
- encryptedDigest = DerOctetString.GetInstance(e.Current);
-
- if (e.MoveNext())
- {
- unauthenticatedAttributes = Asn1Set.GetInstance((Asn1TaggedObject) e.Current, false);
- }
- else
- {
- unauthenticatedAttributes = null;
- }
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public SignerIdentifier SignerID
- {
- get { return sid; }
- }
-
- public Asn1Set AuthenticatedAttributes
- {
- get { return authenticatedAttributes; }
- }
-
- public AlgorithmIdentifier DigestAlgorithm
- {
- get { return digAlgorithm; }
- }
-
- public Asn1OctetString EncryptedDigest
- {
- get { return encryptedDigest; }
- }
-
- public AlgorithmIdentifier DigestEncryptionAlgorithm
- {
- get { return digEncryptionAlgorithm; }
- }
-
- public Asn1Set UnauthenticatedAttributes
- {
- get { return unauthenticatedAttributes; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * SignerInfo ::= Sequence {
- * version Version,
- * SignerIdentifier sid,
- * digestAlgorithm DigestAlgorithmIdentifier,
- * authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
- * digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
- * encryptedDigest EncryptedDigest,
- * unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
- * }
- *
- * EncryptedDigest ::= OCTET STRING
- *
- * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
- *
- * DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- version, sid, digAlgorithm);
-
- if (authenticatedAttributes != null)
- {
- v.Add(new DerTaggedObject(false, 0, authenticatedAttributes));
- }
-
- v.Add(digEncryptionAlgorithm, encryptedDigest);
-
- if (unauthenticatedAttributes != null)
- {
- v.Add(new DerTaggedObject(false, 1, unauthenticatedAttributes));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/Time.cs b/BCCrypto/src/asn1/cms/Time.cs
deleted file mode 100644
index 52fb4f9..0000000
--- a/BCCrypto/src/asn1/cms/Time.cs
+++ /dev/null
@@ -1,115 +0,0 @@
-using System;
-using System.Globalization;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class Time
- : Asn1Encodable, IAsn1Choice
- {
- private readonly Asn1Object time;
-
- public static Time GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(obj.GetObject());
- }
-
- public Time(
- Asn1Object time)
- {
- if (time == null)
- throw new ArgumentNullException("time");
- if (!(time is DerUtcTime) && !(time is DerGeneralizedTime))
- throw new ArgumentException("unknown object passed to Time");
-
- this.time = time;
- }
-
- /**
- * creates a time object from a given date - if the date is between 1950
- * and 2049 a UTCTime object is Generated, otherwise a GeneralizedTime
- * is used.
- */
- public Time(
- DateTime date)
- {
- string d = date.ToString("yyyyMMddHHmmss", CultureInfo.InvariantCulture) + "Z";
-
- int year = int.Parse(d.Substring(0, 4));
-
- if (year < 1950 || year > 2049)
- {
- time = new DerGeneralizedTime(d);
- }
- else
- {
- time = new DerUtcTime(d.Substring(2));
- }
- }
-
- public static Time GetInstance(
- object obj)
- {
- if (obj == null || obj is Time)
- return (Time)obj;
- if (obj is DerUtcTime)
- return new Time((DerUtcTime)obj);
- if (obj is DerGeneralizedTime)
- return new Time((DerGeneralizedTime)obj);
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public string TimeString
- {
- get
- {
- if (time is DerUtcTime)
- {
- return ((DerUtcTime)time).AdjustedTimeString;
- }
- else
- {
- return ((DerGeneralizedTime)time).GetTime();
- }
- }
- }
-
- public DateTime Date
- {
- get
- {
- try
- {
- if (time is DerUtcTime)
- {
- return ((DerUtcTime)time).ToAdjustedDateTime();
- }
-
- return ((DerGeneralizedTime)time).ToDateTime();
- }
- catch (FormatException e)
- {
- // this should never happen
- throw new InvalidOperationException("invalid date string: " + e.Message);
- }
- }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Time ::= CHOICE {
- * utcTime UTCTime,
- * generalTime GeneralizedTime }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return time;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/TimeStampAndCRL.cs b/BCCrypto/src/asn1/cms/TimeStampAndCRL.cs
deleted file mode 100644
index 4cb5f2a..0000000
--- a/BCCrypto/src/asn1/cms/TimeStampAndCRL.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class TimeStampAndCrl
- : Asn1Encodable
- {
- private ContentInfo timeStamp;
- private X509.CertificateList crl;
-
- public TimeStampAndCrl(ContentInfo timeStamp)
- {
- this.timeStamp = timeStamp;
- }
-
- private TimeStampAndCrl(Asn1Sequence seq)
- {
- this.timeStamp = ContentInfo.GetInstance(seq[0]);
- if (seq.Count == 2)
- {
- this.crl = X509.CertificateList.GetInstance(seq[1]);
- }
- }
-
- public static TimeStampAndCrl GetInstance(object obj)
- {
- if (obj is TimeStampAndCrl)
- return (TimeStampAndCrl)obj;
-
- if (obj != null)
- return new TimeStampAndCrl(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- public virtual ContentInfo TimeStampToken
- {
- get { return this.timeStamp; }
- }
-
- public virtual X509.CertificateList Crl
- {
- get { return this.crl; }
- }
-
- /**
- *
- * TimeStampAndCRL ::= SEQUENCE {
- * timeStamp TimeStampToken, -- according to RFC 3161
- * crl CertificateList OPTIONAL -- according to RFC 5280
- * }
- *
- * @return
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(timeStamp);
- v.AddOptional(crl);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/TimeStampTokenEvidence.cs b/BCCrypto/src/asn1/cms/TimeStampTokenEvidence.cs
deleted file mode 100644
index 8625d05..0000000
--- a/BCCrypto/src/asn1/cms/TimeStampTokenEvidence.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class TimeStampTokenEvidence
- : Asn1Encodable
- {
- private TimeStampAndCrl[] timeStampAndCrls;
-
- public TimeStampTokenEvidence(TimeStampAndCrl[] timeStampAndCrls)
- {
- this.timeStampAndCrls = timeStampAndCrls;
- }
-
- public TimeStampTokenEvidence(TimeStampAndCrl timeStampAndCrl)
- {
- this.timeStampAndCrls = new TimeStampAndCrl[]{ timeStampAndCrl };
- }
-
- private TimeStampTokenEvidence(Asn1Sequence seq)
- {
- this.timeStampAndCrls = new TimeStampAndCrl[seq.Count];
-
- int count = 0;
-
- foreach (Asn1Encodable ae in seq)
- {
- this.timeStampAndCrls[count++] = TimeStampAndCrl.GetInstance(ae.ToAsn1Object());
- }
- }
-
- public static TimeStampTokenEvidence GetInstance(Asn1TaggedObject tagged, bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(tagged, isExplicit));
- }
-
- public static TimeStampTokenEvidence GetInstance(object obj)
- {
- if (obj is TimeStampTokenEvidence)
- return (TimeStampTokenEvidence)obj;
-
- if (obj != null)
- return new TimeStampTokenEvidence(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- public virtual TimeStampAndCrl[] ToTimeStampAndCrlArray()
- {
- return (TimeStampAndCrl[])timeStampAndCrls.Clone();
- }
-
- /**
- *
- * TimeStampTokenEvidence ::=
- * SEQUENCE SIZE(1..MAX) OF TimeStampAndCrl
- *
- * @return
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(timeStampAndCrls);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/TimeStampedData.cs b/BCCrypto/src/asn1/cms/TimeStampedData.cs
deleted file mode 100644
index 15448a9..0000000
--- a/BCCrypto/src/asn1/cms/TimeStampedData.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class TimeStampedData
- : Asn1Encodable
- {
- private DerInteger version;
- private DerIA5String dataUri;
- private MetaData metaData;
- private Asn1OctetString content;
- private Evidence temporalEvidence;
-
- public TimeStampedData(DerIA5String dataUri, MetaData metaData, Asn1OctetString content,
- Evidence temporalEvidence)
- {
- this.version = new DerInteger(1);
- this.dataUri = dataUri;
- this.metaData = metaData;
- this.content = content;
- this.temporalEvidence = temporalEvidence;
- }
-
- private TimeStampedData(Asn1Sequence seq)
- {
- this.version = DerInteger.GetInstance(seq[0]);
-
- int index = 1;
- if (seq[index] is DerIA5String)
- {
- this.dataUri = DerIA5String.GetInstance(seq[index++]);
- }
- if (seq[index] is MetaData || seq[index] is Asn1Sequence)
- {
- this.metaData = MetaData.GetInstance(seq[index++]);
- }
- if (seq[index] is Asn1OctetString)
- {
- this.content = Asn1OctetString.GetInstance(seq[index++]);
- }
- this.temporalEvidence = Evidence.GetInstance(seq[index]);
- }
-
- public static TimeStampedData GetInstance(object obj)
- {
- if (obj is TimeStampedData)
- return (TimeStampedData)obj;
-
- if (obj != null)
- return new TimeStampedData(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- public virtual DerIA5String DataUri
- {
- get { return dataUri; }
- }
-
- public MetaData MetaData
- {
- get { return metaData; }
- }
-
- public Asn1OctetString Content
- {
- get { return content; }
- }
-
- public Evidence TemporalEvidence
- {
- get { return temporalEvidence; }
- }
-
- /**
- *
- * TimeStampedData ::= SEQUENCE {
- * version INTEGER { v1(1) },
- * dataUri IA5String OPTIONAL,
- * metaData MetaData OPTIONAL,
- * content OCTET STRING OPTIONAL,
- * temporalEvidence Evidence
- * }
- *
- * @return
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(version);
- v.AddOptional(dataUri, metaData, content);
- v.Add(temporalEvidence);
- return new BerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/TimeStampedDataParser.cs b/BCCrypto/src/asn1/cms/TimeStampedDataParser.cs
deleted file mode 100644
index 90307bf..0000000
--- a/BCCrypto/src/asn1/cms/TimeStampedDataParser.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
-{
- public class TimeStampedDataParser
- {
- private DerInteger version;
- private DerIA5String dataUri;
- private MetaData metaData;
- private Asn1OctetStringParser content;
- private Evidence temporalEvidence;
- private Asn1SequenceParser parser;
-
- private TimeStampedDataParser(Asn1SequenceParser parser)
- {
- this.parser = parser;
- this.version = DerInteger.GetInstance(parser.ReadObject());
-
- Asn1Object obj = parser.ReadObject().ToAsn1Object();
-
- if (obj is DerIA5String)
- {
- this.dataUri = DerIA5String.GetInstance(obj);
- obj = parser.ReadObject().ToAsn1Object();
- }
-
- if (//obj is MetaData ||
- obj is Asn1SequenceParser)
- {
- this.metaData = MetaData.GetInstance(obj.ToAsn1Object());
- obj = parser.ReadObject().ToAsn1Object();
- }
-
- if (obj is Asn1OctetStringParser)
- {
- this.content = (Asn1OctetStringParser)obj;
- }
- }
-
- public static TimeStampedDataParser GetInstance(object obj)
- {
- if (obj is Asn1Sequence)
- return new TimeStampedDataParser(((Asn1Sequence)obj).Parser);
-
- if (obj is Asn1SequenceParser)
- return new TimeStampedDataParser((Asn1SequenceParser)obj);
-
- return null;
- }
-
- public virtual DerIA5String DataUri
- {
- get { return dataUri; }
- }
-
- public virtual MetaData MetaData
- {
- get { return metaData; }
- }
-
- public virtual Asn1OctetStringParser Content
- {
- get { return content; }
- }
-
- public virtual Evidence GetTemporalEvidence()
- {
- if (temporalEvidence == null)
- {
- temporalEvidence = Evidence.GetInstance(parser.ReadObject().ToAsn1Object());
- }
-
- return temporalEvidence;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cms/ecc/MQVuserKeyingMaterial.cs b/BCCrypto/src/asn1/cms/ecc/MQVuserKeyingMaterial.cs
deleted file mode 100644
index dc4ac1a..0000000
--- a/BCCrypto/src/asn1/cms/ecc/MQVuserKeyingMaterial.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Cms.Ecc
-{
- public class MQVuserKeyingMaterial
- : Asn1Encodable
- {
- private OriginatorPublicKey ephemeralPublicKey;
- private Asn1OctetString addedukm;
-
- public MQVuserKeyingMaterial(
- OriginatorPublicKey ephemeralPublicKey,
- Asn1OctetString addedukm)
- {
- // TODO Check ephemeralPublicKey not null
-
- this.ephemeralPublicKey = ephemeralPublicKey;
- this.addedukm = addedukm;
- }
-
- private MQVuserKeyingMaterial(
- Asn1Sequence seq)
- {
- // TODO Check seq has either 1 or 2 elements
-
- this.ephemeralPublicKey = OriginatorPublicKey.GetInstance(seq[0]);
-
- if (seq.Count > 1)
- {
- this.addedukm = Asn1OctetString.GetInstance(
- (Asn1TaggedObject)seq[1], true);
- }
- }
-
- /**
- * return an AuthEnvelopedData object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param isExplicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @throws ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static MQVuserKeyingMaterial GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- /**
- * return an AuthEnvelopedData object from the given object.
- *
- * @param obj the object we want converted.
- * @throws ArgumentException if the object cannot be converted.
- */
- public static MQVuserKeyingMaterial GetInstance(
- object obj)
- {
- if (obj == null || obj is MQVuserKeyingMaterial)
- {
- return (MQVuserKeyingMaterial)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new MQVuserKeyingMaterial((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("Invalid MQVuserKeyingMaterial: " + Platform.GetTypeName(obj));
- }
-
- public OriginatorPublicKey EphemeralPublicKey
- {
- get { return ephemeralPublicKey; }
- }
-
- public Asn1OctetString AddedUkm
- {
- get { return addedukm; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * MQVuserKeyingMaterial ::= SEQUENCE {
- * ephemeralPublicKey OriginatorPublicKey,
- * addedukm [0] EXPLICIT UserKeyingMaterial OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(ephemeralPublicKey);
-
- if (addedukm != null)
- {
- v.Add(new DerTaggedObject(true, 0, addedukm));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/AttributeTypeAndValue.cs b/BCCrypto/src/asn1/crmf/AttributeTypeAndValue.cs
deleted file mode 100644
index 0a4b5bd..0000000
--- a/BCCrypto/src/asn1/crmf/AttributeTypeAndValue.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class AttributeTypeAndValue
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier type;
- private readonly Asn1Encodable value;
-
- private AttributeTypeAndValue(Asn1Sequence seq)
- {
- type = (DerObjectIdentifier)seq[0];
- value = (Asn1Encodable)seq[1];
- }
-
- public static AttributeTypeAndValue GetInstance(object obj)
- {
- if (obj is AttributeTypeAndValue)
- return (AttributeTypeAndValue)obj;
-
- if (obj is Asn1Sequence)
- return new AttributeTypeAndValue((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public AttributeTypeAndValue(
- String oid,
- Asn1Encodable value)
- : this(new DerObjectIdentifier(oid), value)
- {
- }
-
- public AttributeTypeAndValue(
- DerObjectIdentifier type,
- Asn1Encodable value)
- {
- this.type = type;
- this.value = value;
- }
-
- public virtual DerObjectIdentifier Type
- {
- get { return type; }
- }
-
- public virtual Asn1Encodable Value
- {
- get { return value; }
- }
-
- /**
- *
- * AttributeTypeAndValue ::= SEQUENCE {
- * type OBJECT IDENTIFIER,
- * value ANY DEFINED BY type }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(type, value);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/CertId.cs b/BCCrypto/src/asn1/crmf/CertId.cs
deleted file mode 100644
index f0cc946..0000000
--- a/BCCrypto/src/asn1/crmf/CertId.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class CertId
- : Asn1Encodable
- {
- private readonly GeneralName issuer;
- private readonly DerInteger serialNumber;
-
- private CertId(Asn1Sequence seq)
- {
- issuer = GeneralName.GetInstance(seq[0]);
- serialNumber = DerInteger.GetInstance(seq[1]);
- }
-
- public static CertId GetInstance(object obj)
- {
- if (obj is CertId)
- return (CertId)obj;
-
- if (obj is Asn1Sequence)
- return new CertId((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public static CertId GetInstance(Asn1TaggedObject obj, bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- public virtual GeneralName Issuer
- {
- get { return issuer; }
- }
-
- public virtual DerInteger SerialNumber
- {
- get { return serialNumber; }
- }
-
- /**
- *
- * CertId ::= SEQUENCE {
- * issuer GeneralName,
- * serialNumber INTEGER }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(issuer, serialNumber);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/CertReqMessages.cs b/BCCrypto/src/asn1/crmf/CertReqMessages.cs
deleted file mode 100644
index 422950b..0000000
--- a/BCCrypto/src/asn1/crmf/CertReqMessages.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class CertReqMessages
- : Asn1Encodable
- {
- private readonly Asn1Sequence content;
-
- private CertReqMessages(Asn1Sequence seq)
- {
- content = seq;
- }
-
- public static CertReqMessages GetInstance(object obj)
- {
- if (obj is CertReqMessages)
- return (CertReqMessages)obj;
-
- if (obj is Asn1Sequence)
- return new CertReqMessages((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public CertReqMessages(params CertReqMsg[] msgs)
- {
- content = new DerSequence(msgs);
- }
-
- public virtual CertReqMsg[] ToCertReqMsgArray()
- {
- CertReqMsg[] result = new CertReqMsg[content.Count];
- for (int i = 0; i != result.Length; ++i)
- {
- result[i] = CertReqMsg.GetInstance(content[i]);
- }
- return result;
- }
-
- /**
- *
- * CertReqMessages ::= SEQUENCE SIZE (1..MAX) OF CertReqMsg
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return content;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/CertReqMsg.cs b/BCCrypto/src/asn1/crmf/CertReqMsg.cs
deleted file mode 100644
index 03ce32d..0000000
--- a/BCCrypto/src/asn1/crmf/CertReqMsg.cs
+++ /dev/null
@@ -1,112 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class CertReqMsg
- : Asn1Encodable
- {
- private readonly CertRequest certReq;
- private readonly ProofOfPossession popo;
- private readonly Asn1Sequence regInfo;
-
- private CertReqMsg(Asn1Sequence seq)
- {
- certReq = CertRequest.GetInstance(seq[0]);
-
- for (int pos = 1; pos < seq.Count; ++pos)
- {
- object o = seq[pos];
-
- if (o is Asn1TaggedObject || o is ProofOfPossession)
- {
- popo = ProofOfPossession.GetInstance(o);
- }
- else
- {
- regInfo = Asn1Sequence.GetInstance(o);
- }
- }
- }
-
- public static CertReqMsg GetInstance(object obj)
- {
- if (obj is CertReqMsg)
- return (CertReqMsg)obj;
-
- if (obj != null)
- return new CertReqMsg(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- public static CertReqMsg GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- /**
- * Creates a new CertReqMsg.
- * @param certReq CertRequest
- * @param popo may be null
- * @param regInfo may be null
- */
- public CertReqMsg(
- CertRequest certReq,
- ProofOfPossession popo,
- AttributeTypeAndValue[] regInfo)
- {
- if (certReq == null)
- throw new ArgumentNullException("certReq");
-
- this.certReq = certReq;
- this.popo = popo;
-
- if (regInfo != null)
- {
- this.regInfo = new DerSequence(regInfo);
- }
- }
-
- public virtual CertRequest CertReq
- {
- get { return certReq; }
- }
-
- public virtual ProofOfPossession Popo
- {
- get { return popo; }
- }
-
- public virtual AttributeTypeAndValue[] GetRegInfo()
- {
- if (regInfo == null)
- return null;
-
- AttributeTypeAndValue[] results = new AttributeTypeAndValue[regInfo.Count];
- for (int i = 0; i != results.Length; ++i)
- {
- results[i] = AttributeTypeAndValue.GetInstance(regInfo[i]);
- }
- return results;
- }
-
- /**
- *
- * CertReqMsg ::= SEQUENCE {
- * certReq CertRequest,
- * pop ProofOfPossession OPTIONAL,
- * -- content depends upon key type
- * regInfo SEQUENCE SIZE(1..MAX) OF AttributeTypeAndValue OPTIONAL }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(certReq);
- v.AddOptional(popo, regInfo);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/CertRequest.cs b/BCCrypto/src/asn1/crmf/CertRequest.cs
deleted file mode 100644
index 625a9b5..0000000
--- a/BCCrypto/src/asn1/crmf/CertRequest.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class CertRequest
- : Asn1Encodable
- {
- private readonly DerInteger certReqId;
- private readonly CertTemplate certTemplate;
- private readonly Controls controls;
-
- private CertRequest(Asn1Sequence seq)
- {
- certReqId = DerInteger.GetInstance(seq[0]);
- certTemplate = CertTemplate.GetInstance(seq[1]);
- if (seq.Count > 2)
- {
- controls = Controls.GetInstance(seq[2]);
- }
- }
-
- public static CertRequest GetInstance(object obj)
- {
- if (obj is CertRequest)
- return (CertRequest)obj;
-
- if (obj != null)
- return new CertRequest(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- public CertRequest(
- int certReqId,
- CertTemplate certTemplate,
- Controls controls)
- : this(new DerInteger(certReqId), certTemplate, controls)
- {
- }
-
- public CertRequest(
- DerInteger certReqId,
- CertTemplate certTemplate,
- Controls controls)
- {
- this.certReqId = certReqId;
- this.certTemplate = certTemplate;
- this.controls = controls;
- }
-
- public virtual DerInteger CertReqID
- {
- get { return certReqId; }
- }
-
- public virtual CertTemplate CertTemplate
- {
- get { return certTemplate; }
- }
-
- public virtual Controls Controls
- {
- get { return controls; }
- }
-
- /**
- *
- * CertRequest ::= SEQUENCE {
- * certReqId INTEGER, -- ID for matching request and reply
- * certTemplate CertTemplate, -- Selected fields of cert to be issued
- * controls Controls OPTIONAL } -- Attributes affecting issuance
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(certReqId, certTemplate);
- v.AddOptional(controls);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/CertTemplate.cs b/BCCrypto/src/asn1/crmf/CertTemplate.cs
deleted file mode 100644
index 3de9f1d..0000000
--- a/BCCrypto/src/asn1/crmf/CertTemplate.cs
+++ /dev/null
@@ -1,149 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class CertTemplate
- : Asn1Encodable
- {
- private readonly Asn1Sequence seq;
-
- private readonly DerInteger version;
- private readonly DerInteger serialNumber;
- private readonly AlgorithmIdentifier signingAlg;
- private readonly X509Name issuer;
- private readonly OptionalValidity validity;
- private readonly X509Name subject;
- private readonly SubjectPublicKeyInfo publicKey;
- private readonly DerBitString issuerUID;
- private readonly DerBitString subjectUID;
- private readonly X509Extensions extensions;
-
- private CertTemplate(Asn1Sequence seq)
- {
- this.seq = seq;
-
- foreach (Asn1TaggedObject tObj in seq)
- {
- switch (tObj.TagNo)
- {
- case 0:
- version = DerInteger.GetInstance(tObj, false);
- break;
- case 1:
- serialNumber = DerInteger.GetInstance(tObj, false);
- break;
- case 2:
- signingAlg = AlgorithmIdentifier.GetInstance(tObj, false);
- break;
- case 3:
- issuer = X509Name.GetInstance(tObj, true); // CHOICE
- break;
- case 4:
- validity = OptionalValidity.GetInstance(Asn1Sequence.GetInstance(tObj, false));
- break;
- case 5:
- subject = X509Name.GetInstance(tObj, true); // CHOICE
- break;
- case 6:
- publicKey = SubjectPublicKeyInfo.GetInstance(tObj, false);
- break;
- case 7:
- issuerUID = DerBitString.GetInstance(tObj, false);
- break;
- case 8:
- subjectUID = DerBitString.GetInstance(tObj, false);
- break;
- case 9:
- extensions = X509Extensions.GetInstance(tObj, false);
- break;
- default:
- throw new ArgumentException("unknown tag: " + tObj.TagNo, "seq");
- }
- }
- }
-
- public static CertTemplate GetInstance(object obj)
- {
- if (obj is CertTemplate)
- return (CertTemplate)obj;
-
- if (obj != null)
- return new CertTemplate(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- public virtual int Version
- {
- get { return version.Value.IntValue; }
- }
-
- public virtual DerInteger SerialNumber
- {
- get { return serialNumber; }
- }
-
- public virtual AlgorithmIdentifier SigningAlg
- {
- get { return signingAlg; }
- }
-
- public virtual X509Name Issuer
- {
- get { return issuer; }
- }
-
- public virtual OptionalValidity Validity
- {
- get { return validity; }
- }
-
- public virtual X509Name Subject
- {
- get { return subject; }
- }
-
- public virtual SubjectPublicKeyInfo PublicKey
- {
- get { return publicKey; }
- }
-
- public virtual DerBitString IssuerUID
- {
- get { return issuerUID; }
- }
-
- public virtual DerBitString SubjectUID
- {
- get { return subjectUID; }
- }
-
- public virtual X509Extensions Extensions
- {
- get { return extensions; }
- }
-
- /**
- *
- * CertTemplate ::= SEQUENCE {
- * version [0] Version OPTIONAL,
- * serialNumber [1] INTEGER OPTIONAL,
- * signingAlg [2] AlgorithmIdentifier OPTIONAL,
- * issuer [3] Name OPTIONAL,
- * validity [4] OptionalValidity OPTIONAL,
- * subject [5] Name OPTIONAL,
- * publicKey [6] SubjectPublicKeyInfo OPTIONAL,
- * issuerUID [7] UniqueIdentifier OPTIONAL,
- * subjectUID [8] UniqueIdentifier OPTIONAL,
- * extensions [9] Extensions OPTIONAL }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return seq;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/CertTemplateBuilder.cs b/BCCrypto/src/asn1/crmf/CertTemplateBuilder.cs
deleted file mode 100644
index 51c73c4..0000000
--- a/BCCrypto/src/asn1/crmf/CertTemplateBuilder.cs
+++ /dev/null
@@ -1,125 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class CertTemplateBuilder
- {
- private DerInteger version;
- private DerInteger serialNumber;
- private AlgorithmIdentifier signingAlg;
- private X509Name issuer;
- private OptionalValidity validity;
- private X509Name subject;
- private SubjectPublicKeyInfo publicKey;
- private DerBitString issuerUID;
- private DerBitString subjectUID;
- private X509Extensions extensions;
-
- /** Sets the X.509 version. Note: for X509v3, use 2 here. */
- public virtual CertTemplateBuilder SetVersion(int ver)
- {
- version = new DerInteger(ver);
- return this;
- }
-
- public virtual CertTemplateBuilder SetSerialNumber(DerInteger ser)
- {
- serialNumber = ser;
- return this;
- }
-
- public virtual CertTemplateBuilder SetSigningAlg(AlgorithmIdentifier aid)
- {
- signingAlg = aid;
- return this;
- }
-
- public virtual CertTemplateBuilder SetIssuer(X509Name name)
- {
- issuer = name;
- return this;
- }
-
- public virtual CertTemplateBuilder SetValidity(OptionalValidity v)
- {
- validity = v;
- return this;
- }
-
- public virtual CertTemplateBuilder SetSubject(X509Name name)
- {
- subject = name;
- return this;
- }
-
- public virtual CertTemplateBuilder SetPublicKey(SubjectPublicKeyInfo spki)
- {
- publicKey = spki;
- return this;
- }
-
- /** Sets the issuer unique ID (deprecated in X.509v3) */
- public virtual CertTemplateBuilder SetIssuerUID(DerBitString uid)
- {
- issuerUID = uid;
- return this;
- }
-
- /** Sets the subject unique ID (deprecated in X.509v3) */
- public virtual CertTemplateBuilder SetSubjectUID(DerBitString uid)
- {
- subjectUID = uid;
- return this;
- }
-
- public virtual CertTemplateBuilder SetExtensions(X509Extensions extens)
- {
- extensions = extens;
- return this;
- }
-
- /**
- *
- * CertTemplate ::= SEQUENCE {
- * version [0] Version OPTIONAL,
- * serialNumber [1] INTEGER OPTIONAL,
- * signingAlg [2] AlgorithmIdentifier OPTIONAL,
- * issuer [3] Name OPTIONAL,
- * validity [4] OptionalValidity OPTIONAL,
- * subject [5] Name OPTIONAL,
- * publicKey [6] SubjectPublicKeyInfo OPTIONAL,
- * issuerUID [7] UniqueIdentifier OPTIONAL,
- * subjectUID [8] UniqueIdentifier OPTIONAL,
- * extensions [9] Extensions OPTIONAL }
- *
- * @return a basic ASN.1 object representation.
- */
- public virtual CertTemplate Build()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- AddOptional(v, 0, false, version);
- AddOptional(v, 1, false, serialNumber);
- AddOptional(v, 2, false, signingAlg);
- AddOptional(v, 3, true, issuer); // CHOICE
- AddOptional(v, 4, false, validity);
- AddOptional(v, 5, true, subject); // CHOICE
- AddOptional(v, 6, false, publicKey);
- AddOptional(v, 7, false, issuerUID);
- AddOptional(v, 8, false, subjectUID);
- AddOptional(v, 9, false, extensions);
-
- return CertTemplate.GetInstance(new DerSequence(v));
- }
-
- private void AddOptional(Asn1EncodableVector v, int tagNo, bool isExplicit, Asn1Encodable obj)
- {
- if (obj != null)
- {
- v.Add(new DerTaggedObject(isExplicit, tagNo, obj));
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/Controls.cs b/BCCrypto/src/asn1/crmf/Controls.cs
deleted file mode 100644
index e8b9f3d..0000000
--- a/BCCrypto/src/asn1/crmf/Controls.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class Controls
- : Asn1Encodable
- {
- private readonly Asn1Sequence content;
-
- private Controls(Asn1Sequence seq)
- {
- content = seq;
- }
-
- public static Controls GetInstance(object obj)
- {
- if (obj is Controls)
- return (Controls)obj;
-
- if (obj is Asn1Sequence)
- return new Controls((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public Controls(params AttributeTypeAndValue[] atvs)
- {
- content = new DerSequence(atvs);
- }
-
- public virtual AttributeTypeAndValue[] ToAttributeTypeAndValueArray()
- {
- AttributeTypeAndValue[] result = new AttributeTypeAndValue[content.Count];
- for (int i = 0; i != result.Length; ++i)
- {
- result[i] = AttributeTypeAndValue.GetInstance(content[i]);
- }
- return result;
- }
-
- /**
- *
- * Controls ::= SEQUENCE SIZE(1..MAX) OF AttributeTypeAndValue
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return content;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/CrmfObjectIdentifiers.cs b/BCCrypto/src/asn1/crmf/CrmfObjectIdentifiers.cs
deleted file mode 100644
index eaa1f7b..0000000
--- a/BCCrypto/src/asn1/crmf/CrmfObjectIdentifiers.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Pkcs;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public abstract class CrmfObjectIdentifiers
- {
- public static readonly DerObjectIdentifier id_pkix = new DerObjectIdentifier("1.3.6.1.5.5.7");
-
- // arc for Internet X.509 PKI protocols and their components
-
- public static readonly DerObjectIdentifier id_pkip = id_pkix.Branch("5");
-
- public static readonly DerObjectIdentifier id_regCtrl = id_pkip.Branch("1");
- public static readonly DerObjectIdentifier id_regCtrl_regToken = id_regCtrl.Branch("1");
- public static readonly DerObjectIdentifier id_regCtrl_authenticator = id_regCtrl.Branch("2");
- public static readonly DerObjectIdentifier id_regCtrl_pkiPublicationInfo = id_regCtrl.Branch("3");
- public static readonly DerObjectIdentifier id_regCtrl_pkiArchiveOptions = id_regCtrl.Branch("4");
-
- public static readonly DerObjectIdentifier id_ct_encKeyWithID = new DerObjectIdentifier(PkcsObjectIdentifiers.IdCT + ".21");
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/EncKeyWithID.cs b/BCCrypto/src/asn1/crmf/EncKeyWithID.cs
deleted file mode 100644
index 6de56fa..0000000
--- a/BCCrypto/src/asn1/crmf/EncKeyWithID.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class EncKeyWithID
- : Asn1Encodable
- {
- private readonly PrivateKeyInfo privKeyInfo;
- private readonly Asn1Encodable identifier;
-
- public static EncKeyWithID GetInstance(object obj)
- {
- if (obj is EncKeyWithID)
- return (EncKeyWithID)obj;
-
- if (obj != null)
- return new EncKeyWithID(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- private EncKeyWithID(Asn1Sequence seq)
- {
- this.privKeyInfo = PrivateKeyInfo.GetInstance(seq[0]);
-
- if (seq.Count > 1)
- {
- if (!(seq[1] is DerUtf8String))
- {
- this.identifier = GeneralName.GetInstance(seq[1]);
- }
- else
- {
- this.identifier = (Asn1Encodable)seq[1];
- }
- }
- else
- {
- this.identifier = null;
- }
- }
-
- public EncKeyWithID(PrivateKeyInfo privKeyInfo)
- {
- this.privKeyInfo = privKeyInfo;
- this.identifier = null;
- }
-
- public EncKeyWithID(PrivateKeyInfo privKeyInfo, DerUtf8String str)
- {
- this.privKeyInfo = privKeyInfo;
- this.identifier = str;
- }
-
- public EncKeyWithID(PrivateKeyInfo privKeyInfo, GeneralName generalName)
- {
- this.privKeyInfo = privKeyInfo;
- this.identifier = generalName;
- }
-
- public virtual PrivateKeyInfo PrivateKey
- {
- get { return privKeyInfo; }
- }
-
- public virtual bool HasIdentifier
- {
- get { return identifier != null; }
- }
-
- public virtual bool IsIdentifierUtf8String
- {
- get { return identifier is DerUtf8String; }
- }
-
- public virtual Asn1Encodable Identifier
- {
- get { return identifier; }
- }
-
- /**
- *
- * EncKeyWithID ::= SEQUENCE {
- * privateKey PrivateKeyInfo,
- * identifier CHOICE {
- * string UTF8String,
- * generalName GeneralName
- * } OPTIONAL
- * }
- *
- * @return
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(privKeyInfo);
- v.AddOptional(identifier);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/EncryptedKey.cs b/BCCrypto/src/asn1/crmf/EncryptedKey.cs
deleted file mode 100644
index 850fbd2..0000000
--- a/BCCrypto/src/asn1/crmf/EncryptedKey.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Cms;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class EncryptedKey
- : Asn1Encodable, IAsn1Choice
- {
- private readonly EnvelopedData envelopedData;
- private readonly EncryptedValue encryptedValue;
-
- public static EncryptedKey GetInstance(object o)
- {
- if (o is EncryptedKey)
- {
- return (EncryptedKey)o;
- }
- else if (o is Asn1TaggedObject)
- {
- return new EncryptedKey(EnvelopedData.GetInstance((Asn1TaggedObject)o, false));
- }
- else if (o is EncryptedValue)
- {
- return new EncryptedKey((EncryptedValue)o);
- }
- else
- {
- return new EncryptedKey(EncryptedValue.GetInstance(o));
- }
- }
-
- public EncryptedKey(EnvelopedData envelopedData)
- {
- this.envelopedData = envelopedData;
- }
-
- public EncryptedKey(EncryptedValue encryptedValue)
- {
- this.encryptedValue = encryptedValue;
- }
-
- public virtual bool IsEncryptedValue
- {
- get { return encryptedValue != null; }
- }
-
- public virtual Asn1Encodable Value
- {
- get
- {
- if (encryptedValue != null)
- return encryptedValue;
-
- return envelopedData;
- }
- }
-
- /**
- *
- * EncryptedKey ::= CHOICE {
- * encryptedValue EncryptedValue, -- deprecated
- * envelopedData [0] EnvelopedData }
- * -- The encrypted private key MUST be placed in the envelopedData
- * -- encryptedContentInfo encryptedContent OCTET STRING.
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- if (encryptedValue != null)
- {
- return encryptedValue.ToAsn1Object();
- }
-
- return new DerTaggedObject(false, 0, envelopedData);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/EncryptedValue.cs b/BCCrypto/src/asn1/crmf/EncryptedValue.cs
deleted file mode 100644
index 83122e2..0000000
--- a/BCCrypto/src/asn1/crmf/EncryptedValue.cs
+++ /dev/null
@@ -1,154 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class EncryptedValue
- : Asn1Encodable
- {
- private readonly AlgorithmIdentifier intendedAlg;
- private readonly AlgorithmIdentifier symmAlg;
- private readonly DerBitString encSymmKey;
- private readonly AlgorithmIdentifier keyAlg;
- private readonly Asn1OctetString valueHint;
- private readonly DerBitString encValue;
-
- private EncryptedValue(Asn1Sequence seq)
- {
- int index = 0;
- while (seq[index] is Asn1TaggedObject)
- {
- Asn1TaggedObject tObj = (Asn1TaggedObject)seq[index];
-
- switch (tObj.TagNo)
- {
- case 0:
- intendedAlg = AlgorithmIdentifier.GetInstance(tObj, false);
- break;
- case 1:
- symmAlg = AlgorithmIdentifier.GetInstance(tObj, false);
- break;
- case 2:
- encSymmKey = DerBitString.GetInstance(tObj, false);
- break;
- case 3:
- keyAlg = AlgorithmIdentifier.GetInstance(tObj, false);
- break;
- case 4:
- valueHint = Asn1OctetString.GetInstance(tObj, false);
- break;
- }
- ++index;
- }
-
- encValue = DerBitString.GetInstance(seq[index]);
- }
-
- public static EncryptedValue GetInstance(object obj)
- {
- if (obj is EncryptedValue)
- return (EncryptedValue)obj;
-
- if (obj != null)
- return new EncryptedValue(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- public EncryptedValue(
- AlgorithmIdentifier intendedAlg,
- AlgorithmIdentifier symmAlg,
- DerBitString encSymmKey,
- AlgorithmIdentifier keyAlg,
- Asn1OctetString valueHint,
- DerBitString encValue)
- {
- if (encValue == null)
- {
- throw new ArgumentNullException("encValue");
- }
-
- this.intendedAlg = intendedAlg;
- this.symmAlg = symmAlg;
- this.encSymmKey = encSymmKey;
- this.keyAlg = keyAlg;
- this.valueHint = valueHint;
- this.encValue = encValue;
- }
-
- public virtual AlgorithmIdentifier IntendedAlg
- {
- get { return intendedAlg; }
- }
-
- public virtual AlgorithmIdentifier SymmAlg
- {
- get { return symmAlg; }
- }
-
- public virtual DerBitString EncSymmKey
- {
- get { return encSymmKey; }
- }
-
- public virtual AlgorithmIdentifier KeyAlg
- {
- get { return keyAlg; }
- }
-
- public virtual Asn1OctetString ValueHint
- {
- get { return valueHint; }
- }
-
- public virtual DerBitString EncValue
- {
- get { return encValue; }
- }
-
- /**
- *
- * EncryptedValue ::= SEQUENCE {
- * intendedAlg [0] AlgorithmIdentifier OPTIONAL,
- * -- the intended algorithm for which the value will be used
- * symmAlg [1] AlgorithmIdentifier OPTIONAL,
- * -- the symmetric algorithm used to encrypt the value
- * encSymmKey [2] BIT STRING OPTIONAL,
- * -- the (encrypted) symmetric key used to encrypt the value
- * keyAlg [3] AlgorithmIdentifier OPTIONAL,
- * -- algorithm used to encrypt the symmetric key
- * valueHint [4] OCTET STRING OPTIONAL,
- * -- a brief description or identifier of the encValue content
- * -- (may be meaningful only to the sending entity, and used only
- * -- if EncryptedValue might be re-examined by the sending entity
- * -- in the future)
- * encValue BIT STRING }
- * -- the encrypted value itself
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- AddOptional(v, 0, intendedAlg);
- AddOptional(v, 1, symmAlg);
- AddOptional(v, 2, encSymmKey);
- AddOptional(v, 3, keyAlg);
- AddOptional(v, 4, valueHint);
-
- v.Add(encValue);
-
- return new DerSequence(v);
- }
-
- private void AddOptional(Asn1EncodableVector v, int tagNo, Asn1Encodable obj)
- {
- if (obj != null)
- {
- v.Add(new DerTaggedObject(false, tagNo, obj));
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/OptionalValidity.cs b/BCCrypto/src/asn1/crmf/OptionalValidity.cs
deleted file mode 100644
index d1a0f7f..0000000
--- a/BCCrypto/src/asn1/crmf/OptionalValidity.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class OptionalValidity
- : Asn1Encodable
- {
- private readonly Time notBefore;
- private readonly Time notAfter;
-
- private OptionalValidity(Asn1Sequence seq)
- {
- foreach (Asn1TaggedObject tObj in seq)
- {
- if (tObj.TagNo == 0)
- {
- notBefore = Time.GetInstance(tObj, true);
- }
- else
- {
- notAfter = Time.GetInstance(tObj, true);
- }
- }
- }
-
- public static OptionalValidity GetInstance(object obj)
- {
- if (obj == null || obj is OptionalValidity)
- return (OptionalValidity)obj;
-
- return new OptionalValidity(Asn1Sequence.GetInstance(obj));
- }
-
- public virtual Time NotBefore
- {
- get { return notBefore; }
- }
-
- public virtual Time NotAfter
- {
- get { return notAfter; }
- }
-
- /**
- *
- * OptionalValidity ::= SEQUENCE {
- * notBefore [0] Time OPTIONAL,
- * notAfter [1] Time OPTIONAL } --at least one MUST be present
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (notBefore != null)
- {
- v.Add(new DerTaggedObject(true, 0, notBefore));
- }
-
- if (notAfter != null)
- {
- v.Add(new DerTaggedObject(true, 1, notAfter));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/PKIArchiveOptions.cs b/BCCrypto/src/asn1/crmf/PKIArchiveOptions.cs
deleted file mode 100644
index 1813d87..0000000
--- a/BCCrypto/src/asn1/crmf/PKIArchiveOptions.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class PkiArchiveOptions
- : Asn1Encodable, IAsn1Choice
- {
- public const int encryptedPrivKey = 0;
- public const int keyGenParameters = 1;
- public const int archiveRemGenPrivKey = 2;
-
- private readonly Asn1Encodable value;
-
- public static PkiArchiveOptions GetInstance(object obj)
- {
- if (obj is PkiArchiveOptions)
- return (PkiArchiveOptions)obj;
-
- if (obj is Asn1TaggedObject)
- return new PkiArchiveOptions((Asn1TaggedObject)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- private PkiArchiveOptions(Asn1TaggedObject tagged)
- {
- switch (tagged.TagNo)
- {
- case encryptedPrivKey:
- value = EncryptedKey.GetInstance(tagged.GetObject());
- break;
- case keyGenParameters:
- value = Asn1OctetString.GetInstance(tagged, false);
- break;
- case archiveRemGenPrivKey:
- value = DerBoolean.GetInstance(tagged, false);
- break;
- default:
- throw new ArgumentException("unknown tag number: " + tagged.TagNo, "tagged");
- }
- }
-
- public PkiArchiveOptions(EncryptedKey encKey)
- {
- this.value = encKey;
- }
-
- public PkiArchiveOptions(Asn1OctetString keyGenParameters)
- {
- this.value = keyGenParameters;
- }
-
- public PkiArchiveOptions(bool archiveRemGenPrivKey)
- {
- this.value = DerBoolean.GetInstance(archiveRemGenPrivKey);
- }
-
- public virtual int Type
- {
- get
- {
- if (value is EncryptedKey)
- return encryptedPrivKey;
-
- if (value is Asn1OctetString)
- return keyGenParameters;
-
- return archiveRemGenPrivKey;
- }
- }
-
- public virtual Asn1Encodable Value
- {
- get { return value; }
- }
-
- /**
- *
- * PkiArchiveOptions ::= CHOICE {
- * encryptedPrivKey [0] EncryptedKey,
- * -- the actual value of the private key
- * keyGenParameters [1] KeyGenParameters,
- * -- parameters which allow the private key to be re-generated
- * archiveRemGenPrivKey [2] BOOLEAN }
- * -- set to TRUE if sender wishes receiver to archive the private
- * -- key of a key pair that the receiver generates in response to
- * -- this request; set to FALSE if no archival is desired.
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- if (value is EncryptedKey)
- {
- return new DerTaggedObject(true, encryptedPrivKey, value); // choice
- }
-
- if (value is Asn1OctetString)
- {
- return new DerTaggedObject(false, keyGenParameters, value);
- }
-
- return new DerTaggedObject(false, archiveRemGenPrivKey, value);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/PKIPublicationInfo.cs b/BCCrypto/src/asn1/crmf/PKIPublicationInfo.cs
deleted file mode 100644
index a7d2bc6..0000000
--- a/BCCrypto/src/asn1/crmf/PKIPublicationInfo.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class PkiPublicationInfo
- : Asn1Encodable
- {
- private readonly DerInteger action;
- private readonly Asn1Sequence pubInfos;
-
- private PkiPublicationInfo(Asn1Sequence seq)
- {
- action = DerInteger.GetInstance(seq[0]);
- pubInfos = Asn1Sequence.GetInstance(seq[1]);
- }
-
- public static PkiPublicationInfo GetInstance(object obj)
- {
- if (obj is PkiPublicationInfo)
- return (PkiPublicationInfo)obj;
-
- if (obj is Asn1Sequence)
- return new PkiPublicationInfo((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual DerInteger Action
- {
- get { return action; }
- }
-
- public virtual SinglePubInfo[] GetPubInfos()
- {
- if (pubInfos == null)
- return null;
-
- SinglePubInfo[] results = new SinglePubInfo[pubInfos.Count];
- for (int i = 0; i != results.Length; ++i)
- {
- results[i] = SinglePubInfo.GetInstance(pubInfos[i]);
- }
- return results;
- }
-
- /**
- *
- * PkiPublicationInfo ::= SEQUENCE {
- * action INTEGER {
- * dontPublish (0),
- * pleasePublish (1) },
- * pubInfos SEQUENCE SIZE (1..MAX) OF SinglePubInfo OPTIONAL }
- * -- pubInfos MUST NOT be present if action is "dontPublish"
- * -- (if action is "pleasePublish" and pubInfos is omitted,
- * -- "dontCare" is assumed)
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(action, pubInfos);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/PKMacValue.cs b/BCCrypto/src/asn1/crmf/PKMacValue.cs
deleted file mode 100644
index e104c08..0000000
--- a/BCCrypto/src/asn1/crmf/PKMacValue.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Cmp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- /**
- * Password-based MAC value for use with POPOSigningKeyInput.
- */
- public class PKMacValue
- : Asn1Encodable
- {
- private readonly AlgorithmIdentifier algID;
- private readonly DerBitString macValue;
-
- private PKMacValue(Asn1Sequence seq)
- {
- this.algID = AlgorithmIdentifier.GetInstance(seq[0]);
- this.macValue = DerBitString.GetInstance(seq[1]);
- }
-
- public static PKMacValue GetInstance(object obj)
- {
- if (obj is PKMacValue)
- return (PKMacValue)obj;
-
- if (obj is Asn1Sequence)
- return new PKMacValue((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public static PKMacValue GetInstance(Asn1TaggedObject obj, bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- /**
- * Creates a new PKMACValue.
- * @param params parameters for password-based MAC
- * @param value MAC of the DER-encoded SubjectPublicKeyInfo
- */
- public PKMacValue(
- PbmParameter pbmParams,
- DerBitString macValue)
- : this(new AlgorithmIdentifier(CmpObjectIdentifiers.passwordBasedMac, pbmParams), macValue)
- {
- }
-
- /**
- * Creates a new PKMACValue.
- * @param aid CMPObjectIdentifiers.passwordBasedMAC, with PBMParameter
- * @param value MAC of the DER-encoded SubjectPublicKeyInfo
- */
- public PKMacValue(
- AlgorithmIdentifier algID,
- DerBitString macValue)
- {
- this.algID = algID;
- this.macValue = macValue;
- }
-
- public virtual AlgorithmIdentifier AlgID
- {
- get { return algID; }
- }
-
- public virtual DerBitString MacValue
- {
- get { return macValue; }
- }
-
- /**
- *
- * PKMACValue ::= SEQUENCE {
- * algId AlgorithmIdentifier,
- * -- algorithm value shall be PasswordBasedMac 1.2.840.113533.7.66.13
- * -- parameter value is PBMParameter
- * value BIT STRING }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(algID, macValue);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/PopoPrivKey.cs b/BCCrypto/src/asn1/crmf/PopoPrivKey.cs
deleted file mode 100644
index 0cedc51..0000000
--- a/BCCrypto/src/asn1/crmf/PopoPrivKey.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Cms;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class PopoPrivKey
- : Asn1Encodable, IAsn1Choice
- {
- public const int thisMessage = 0;
- public const int subsequentMessage = 1;
- public const int dhMAC = 2;
- public const int agreeMAC = 3;
- public const int encryptedKey = 4;
-
- private readonly int tagNo;
- private readonly Asn1Encodable obj;
-
- private PopoPrivKey(Asn1TaggedObject obj)
- {
- this.tagNo = obj.TagNo;
-
- switch (tagNo)
- {
- case thisMessage:
- this.obj = DerBitString.GetInstance(obj, false);
- break;
- case subsequentMessage:
- this.obj = SubsequentMessage.ValueOf(DerInteger.GetInstance(obj, false).Value.IntValue);
- break;
- case dhMAC:
- this.obj = DerBitString.GetInstance(obj, false);
- break;
- case agreeMAC:
- this.obj = PKMacValue.GetInstance(obj, false);
- break;
- case encryptedKey:
- this.obj = EnvelopedData.GetInstance(obj, false);
- break;
- default:
- throw new ArgumentException("unknown tag in PopoPrivKey", "obj");
- }
- }
-
- public static PopoPrivKey GetInstance(Asn1TaggedObject tagged, bool isExplicit)
- {
- return new PopoPrivKey(Asn1TaggedObject.GetInstance(tagged.GetObject()));
- }
-
- public PopoPrivKey(SubsequentMessage msg)
- {
- this.tagNo = subsequentMessage;
- this.obj = msg;
- }
-
- public virtual int Type
- {
- get { return tagNo; }
- }
-
- public virtual Asn1Encodable Value
- {
- get { return obj; }
- }
-
- /**
- *
- * PopoPrivKey ::= CHOICE {
- * thisMessage [0] BIT STRING, -- Deprecated
- * -- possession is proven in this message (which contains the private
- * -- key itself (encrypted for the CA))
- * subsequentMessage [1] SubsequentMessage,
- * -- possession will be proven in a subsequent message
- * dhMAC [2] BIT STRING, -- Deprecated
- * agreeMAC [3] PKMACValue,
- * encryptedKey [4] EnvelopedData }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerTaggedObject(false, tagNo, obj);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/PopoSigningKey.cs b/BCCrypto/src/asn1/crmf/PopoSigningKey.cs
deleted file mode 100644
index 1c24db8..0000000
--- a/BCCrypto/src/asn1/crmf/PopoSigningKey.cs
+++ /dev/null
@@ -1,116 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class PopoSigningKey
- : Asn1Encodable
- {
- private readonly PopoSigningKeyInput poposkInput;
- private readonly AlgorithmIdentifier algorithmIdentifier;
- private readonly DerBitString signature;
-
- private PopoSigningKey(Asn1Sequence seq)
- {
- int index = 0;
-
- if (seq[index] is Asn1TaggedObject)
- {
- Asn1TaggedObject tagObj
- = (Asn1TaggedObject) seq[index++];
- if (tagObj.TagNo != 0)
- {
- throw new ArgumentException( "Unknown PopoSigningKeyInput tag: " + tagObj.TagNo, "seq");
- }
- poposkInput = PopoSigningKeyInput.GetInstance(tagObj.GetObject());
- }
- algorithmIdentifier = AlgorithmIdentifier.GetInstance(seq[index++]);
- signature = DerBitString.GetInstance(seq[index]);
- }
-
- public static PopoSigningKey GetInstance(object obj)
- {
- if (obj is PopoSigningKey)
- return (PopoSigningKey)obj;
-
- if (obj is Asn1Sequence)
- return new PopoSigningKey((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public static PopoSigningKey GetInstance(Asn1TaggedObject obj, bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- /**
- * Creates a new Proof of Possession object for a signing key.
- * @param poposkIn the PopoSigningKeyInput structure, or null if the
- * CertTemplate includes both subject and publicKey values.
- * @param aid the AlgorithmIdentifier used to sign the proof of possession.
- * @param signature a signature over the DER-encoded value of poposkIn,
- * or the DER-encoded value of certReq if poposkIn is null.
- */
- public PopoSigningKey(
- PopoSigningKeyInput poposkIn,
- AlgorithmIdentifier aid,
- DerBitString signature)
- {
- this.poposkInput = poposkIn;
- this.algorithmIdentifier = aid;
- this.signature = signature;
- }
-
- public virtual PopoSigningKeyInput PoposkInput
- {
- get { return poposkInput; }
- }
-
- public virtual AlgorithmIdentifier AlgorithmIdentifier
- {
- get { return algorithmIdentifier; }
- }
-
- public virtual DerBitString Signature
- {
- get { return signature; }
- }
-
- /**
- *
- * PopoSigningKey ::= SEQUENCE {
- * poposkInput [0] PopoSigningKeyInput OPTIONAL,
- * algorithmIdentifier AlgorithmIdentifier,
- * signature BIT STRING }
- * -- The signature (using "algorithmIdentifier") is on the
- * -- DER-encoded value of poposkInput. NOTE: If the CertReqMsg
- * -- certReq CertTemplate contains the subject and publicKey values,
- * -- then poposkInput MUST be omitted and the signature MUST be
- * -- computed on the DER-encoded value of CertReqMsg certReq. If
- * -- the CertReqMsg certReq CertTemplate does not contain the public
- * -- key and subject values, then poposkInput MUST be present and
- * -- MUST be signed. This strategy ensures that the public key is
- * -- not present in both the poposkInput and CertReqMsg certReq
- * -- CertTemplate fields.
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (poposkInput != null)
- {
- v.Add(new DerTaggedObject(false, 0, poposkInput));
- }
-
- v.Add(algorithmIdentifier);
- v.Add(signature);
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/PopoSigningKeyInput.cs b/BCCrypto/src/asn1/crmf/PopoSigningKeyInput.cs
deleted file mode 100644
index e43fa13..0000000
--- a/BCCrypto/src/asn1/crmf/PopoSigningKeyInput.cs
+++ /dev/null
@@ -1,116 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class PopoSigningKeyInput
- : Asn1Encodable
- {
- private readonly GeneralName sender;
- private readonly PKMacValue publicKeyMac;
- private readonly SubjectPublicKeyInfo publicKey;
-
- private PopoSigningKeyInput(Asn1Sequence seq)
- {
- Asn1Encodable authInfo = (Asn1Encodable)seq[0];
-
- if (authInfo is Asn1TaggedObject)
- {
- Asn1TaggedObject tagObj = (Asn1TaggedObject)authInfo;
- if (tagObj.TagNo != 0)
- {
- throw new ArgumentException("Unknown authInfo tag: " + tagObj.TagNo, "seq");
- }
- sender = GeneralName.GetInstance(tagObj.GetObject());
- }
- else
- {
- publicKeyMac = PKMacValue.GetInstance(authInfo);
- }
-
- publicKey = SubjectPublicKeyInfo.GetInstance(seq[1]);
- }
-
- public static PopoSigningKeyInput GetInstance(object obj)
- {
- if (obj is PopoSigningKeyInput)
- return (PopoSigningKeyInput)obj;
-
- if (obj is Asn1Sequence)
- return new PopoSigningKeyInput((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- /** Creates a new PopoSigningKeyInput with sender name as authInfo. */
- public PopoSigningKeyInput(
- GeneralName sender,
- SubjectPublicKeyInfo spki)
- {
- this.sender = sender;
- this.publicKey = spki;
- }
-
- /** Creates a new PopoSigningKeyInput using password-based MAC. */
- public PopoSigningKeyInput(
- PKMacValue pkmac,
- SubjectPublicKeyInfo spki)
- {
- this.publicKeyMac = pkmac;
- this.publicKey = spki;
- }
-
- /** Returns the sender field, or null if authInfo is publicKeyMac */
- public virtual GeneralName Sender
- {
- get { return sender; }
- }
-
- /** Returns the publicKeyMac field, or null if authInfo is sender */
- public virtual PKMacValue PublicKeyMac
- {
- get { return publicKeyMac; }
- }
-
- public virtual SubjectPublicKeyInfo PublicKey
- {
- get { return publicKey; }
- }
-
- /**
- *
- * PopoSigningKeyInput ::= SEQUENCE {
- * authInfo CHOICE {
- * sender [0] GeneralName,
- * -- used only if an authenticated identity has been
- * -- established for the sender (e.g., a DN from a
- * -- previously-issued and currently-valid certificate
- * publicKeyMac PKMacValue },
- * -- used if no authenticated GeneralName currently exists for
- * -- the sender; publicKeyMac contains a password-based MAC
- * -- on the DER-encoded value of publicKey
- * publicKey SubjectPublicKeyInfo } -- from CertTemplate
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (sender != null)
- {
- v.Add(new DerTaggedObject(false, 0, sender));
- }
- else
- {
- v.Add(publicKeyMac);
- }
-
- v.Add(publicKey);
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/ProofOfPossession.cs b/BCCrypto/src/asn1/crmf/ProofOfPossession.cs
deleted file mode 100644
index 8957169..0000000
--- a/BCCrypto/src/asn1/crmf/ProofOfPossession.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class ProofOfPossession
- : Asn1Encodable, IAsn1Choice
- {
- public const int TYPE_RA_VERIFIED = 0;
- public const int TYPE_SIGNING_KEY = 1;
- public const int TYPE_KEY_ENCIPHERMENT = 2;
- public const int TYPE_KEY_AGREEMENT = 3;
-
- private readonly int tagNo;
- private readonly Asn1Encodable obj;
-
- private ProofOfPossession(Asn1TaggedObject tagged)
- {
- tagNo = tagged.TagNo;
- switch (tagNo)
- {
- case 0:
- obj = DerNull.Instance;
- break;
- case 1:
- obj = PopoSigningKey.GetInstance(tagged, false);
- break;
- case 2:
- case 3:
- obj = PopoPrivKey.GetInstance(tagged, false);
- break;
- default:
- throw new ArgumentException("unknown tag: " + tagNo, "tagged");
- }
- }
-
- public static ProofOfPossession GetInstance(object obj)
- {
- if (obj is ProofOfPossession)
- return (ProofOfPossession)obj;
-
- if (obj is Asn1TaggedObject)
- return new ProofOfPossession((Asn1TaggedObject)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- /** Creates a ProofOfPossession with type raVerified. */
- public ProofOfPossession()
- {
- tagNo = TYPE_RA_VERIFIED;
- obj = DerNull.Instance;
- }
-
- /** Creates a ProofOfPossession for a signing key. */
- public ProofOfPossession(PopoSigningKey Poposk)
- {
- tagNo = TYPE_SIGNING_KEY;
- obj = Poposk;
- }
-
- /**
- * Creates a ProofOfPossession for key encipherment or agreement.
- * @param type one of TYPE_KEY_ENCIPHERMENT or TYPE_KEY_AGREEMENT
- */
- public ProofOfPossession(int type, PopoPrivKey privkey)
- {
- tagNo = type;
- obj = privkey;
- }
-
- public virtual int Type
- {
- get { return tagNo; }
- }
-
- public virtual Asn1Encodable Object
- {
- get { return obj; }
- }
-
- /**
- *
- * ProofOfPossession ::= CHOICE {
- * raVerified [0] NULL,
- * -- used if the RA has already verified that the requester is in
- * -- possession of the private key
- * signature [1] PopoSigningKey,
- * keyEncipherment [2] PopoPrivKey,
- * keyAgreement [3] PopoPrivKey }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerTaggedObject(false, tagNo, obj);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/SinglePubInfo.cs b/BCCrypto/src/asn1/crmf/SinglePubInfo.cs
deleted file mode 100644
index 5205ce3..0000000
--- a/BCCrypto/src/asn1/crmf/SinglePubInfo.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class SinglePubInfo
- : Asn1Encodable
- {
- private readonly DerInteger pubMethod;
- private readonly GeneralName pubLocation;
-
- private SinglePubInfo(Asn1Sequence seq)
- {
- pubMethod = DerInteger.GetInstance(seq[0]);
-
- if (seq.Count == 2)
- {
- pubLocation = GeneralName.GetInstance(seq[1]);
- }
- }
-
- public static SinglePubInfo GetInstance(object obj)
- {
- if (obj is SinglePubInfo)
- return (SinglePubInfo)obj;
-
- if (obj is Asn1Sequence)
- return new SinglePubInfo((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
- }
-
- public virtual GeneralName PubLocation
- {
- get { return pubLocation; }
- }
-
- /**
- *
- * SinglePubInfo ::= SEQUENCE {
- * pubMethod INTEGER {
- * dontCare (0),
- * x500 (1),
- * web (2),
- * ldap (3) },
- * pubLocation GeneralName OPTIONAL }
- *
- * @return a basic ASN.1 object representation.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(pubMethod);
- v.AddOptional(pubLocation);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/crmf/SubsequentMessage.cs b/BCCrypto/src/asn1/crmf/SubsequentMessage.cs
deleted file mode 100644
index cc1c164..0000000
--- a/BCCrypto/src/asn1/crmf/SubsequentMessage.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Crmf
-{
- public class SubsequentMessage
- : DerInteger
- {
- public static readonly SubsequentMessage encrCert = new SubsequentMessage(0);
- public static readonly SubsequentMessage challengeResp = new SubsequentMessage(1);
-
- private SubsequentMessage(int value)
- : base(value)
- {
- }
-
- public static SubsequentMessage ValueOf(int value)
- {
- if (value == 0)
- return encrCert;
-
- if (value == 1)
- return challengeResp;
-
- throw new ArgumentException("unknown value: " + value, "value");
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cryptopro/CryptoProObjectIdentifiers.cs b/BCCrypto/src/asn1/cryptopro/CryptoProObjectIdentifiers.cs
deleted file mode 100644
index e2f2c18..0000000
--- a/BCCrypto/src/asn1/cryptopro/CryptoProObjectIdentifiers.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.CryptoPro
-{
- public abstract class CryptoProObjectIdentifiers
- {
- // GOST Algorithms OBJECT IDENTIFIERS :
- // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2)}
- public const string GostID = "1.2.643.2.2";
-
- public static readonly DerObjectIdentifier GostR3411 = new DerObjectIdentifier(GostID + ".9");
- public static readonly DerObjectIdentifier GostR3411Hmac = new DerObjectIdentifier(GostID + ".10");
-
- public static readonly DerObjectIdentifier GostR28147Cbc = new DerObjectIdentifier(GostID + ".21");
-
- public static readonly DerObjectIdentifier ID_Gost28147_89_CryptoPro_A_ParamSet = new DerObjectIdentifier(GostID + ".31.1");
-
- public static readonly DerObjectIdentifier GostR3410x94 = new DerObjectIdentifier(GostID + ".20");
- public static readonly DerObjectIdentifier GostR3410x2001 = new DerObjectIdentifier(GostID + ".19");
- public static readonly DerObjectIdentifier GostR3411x94WithGostR3410x94 = new DerObjectIdentifier(GostID + ".4");
- public static readonly DerObjectIdentifier GostR3411x94WithGostR3410x2001 = new DerObjectIdentifier(GostID + ".3");
-
- // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) hashes(30) }
- public static readonly DerObjectIdentifier GostR3411x94CryptoProParamSet = new DerObjectIdentifier(GostID + ".30.1");
-
- // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) signs(32) }
- public static readonly DerObjectIdentifier GostR3410x94CryptoProA = new DerObjectIdentifier(GostID + ".32.2");
- public static readonly DerObjectIdentifier GostR3410x94CryptoProB = new DerObjectIdentifier(GostID + ".32.3");
- public static readonly DerObjectIdentifier GostR3410x94CryptoProC = new DerObjectIdentifier(GostID + ".32.4");
- public static readonly DerObjectIdentifier GostR3410x94CryptoProD = new DerObjectIdentifier(GostID + ".32.5");
-
- // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) exchanges(33) }
- public static readonly DerObjectIdentifier GostR3410x94CryptoProXchA = new DerObjectIdentifier(GostID + ".33.1");
- public static readonly DerObjectIdentifier GostR3410x94CryptoProXchB = new DerObjectIdentifier(GostID + ".33.2");
- public static readonly DerObjectIdentifier GostR3410x94CryptoProXchC = new DerObjectIdentifier(GostID + ".33.3");
-
- //{ iso(1) member-body(2)ru(643) rans(2) cryptopro(2) ecc-signs(35) }
- public static readonly DerObjectIdentifier GostR3410x2001CryptoProA = new DerObjectIdentifier(GostID + ".35.1");
- public static readonly DerObjectIdentifier GostR3410x2001CryptoProB = new DerObjectIdentifier(GostID + ".35.2");
- public static readonly DerObjectIdentifier GostR3410x2001CryptoProC = new DerObjectIdentifier(GostID + ".35.3");
-
- // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) ecc-exchanges(36) }
- public static readonly DerObjectIdentifier GostR3410x2001CryptoProXchA = new DerObjectIdentifier(GostID + ".36.0");
- public static readonly DerObjectIdentifier GostR3410x2001CryptoProXchB = new DerObjectIdentifier(GostID + ".36.1");
-
- public static readonly DerObjectIdentifier GostElSgDH3410Default = new DerObjectIdentifier(GostID + ".36.0");
- public static readonly DerObjectIdentifier GostElSgDH3410x1 = new DerObjectIdentifier(GostID + ".36.1");
- }
-}
diff --git a/BCCrypto/src/asn1/cryptopro/ECGOST3410NamedCurves.cs b/BCCrypto/src/asn1/cryptopro/ECGOST3410NamedCurves.cs
deleted file mode 100644
index 32d3103..0000000
--- a/BCCrypto/src/asn1/cryptopro/ECGOST3410NamedCurves.cs
+++ /dev/null
@@ -1,184 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.CryptoPro
-{
- /**
- * table of the available named parameters for GOST 3410-2001.
- */
- public sealed class ECGost3410NamedCurves
- {
- private ECGost3410NamedCurves()
- {
- }
-
- internal static readonly IDictionary objIds = Platform.CreateHashtable();
- internal static readonly IDictionary parameters = Platform.CreateHashtable();
- internal static readonly IDictionary names = Platform.CreateHashtable();
-
- static ECGost3410NamedCurves()
- {
- BigInteger mod_p = new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639319");
- BigInteger mod_q = new BigInteger("115792089237316195423570985008687907853073762908499243225378155805079068850323");
-
- FpCurve curve = new FpCurve(
- mod_p, // p
- new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639316"), // a
- new BigInteger("166"), // b
- mod_q,
- BigInteger.One);
-
- ECDomainParameters ecParams = new ECDomainParameters(
- curve,
- curve.CreatePoint(
- new BigInteger("1"), // x
- new BigInteger("64033881142927202683649881450433473985931760268884941288852745803908878638612")), // y
- mod_q);
-
- parameters[CryptoProObjectIdentifiers.GostR3410x2001CryptoProA] = ecParams;
-
- mod_p = new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639319");
- mod_q = new BigInteger("115792089237316195423570985008687907853073762908499243225378155805079068850323");
-
- curve = new FpCurve(
- mod_p, // p
- new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639316"),
- new BigInteger("166"),
- mod_q,
- BigInteger.One);
-
- ecParams = new ECDomainParameters(
- curve,
- curve.CreatePoint(
- new BigInteger("1"), // x
- new BigInteger("64033881142927202683649881450433473985931760268884941288852745803908878638612")), // y
- mod_q);
-
- parameters[CryptoProObjectIdentifiers.GostR3410x2001CryptoProXchA] = ecParams;
-
- mod_p = new BigInteger("57896044618658097711785492504343953926634992332820282019728792003956564823193"); //p
- mod_q = new BigInteger("57896044618658097711785492504343953927102133160255826820068844496087732066703"); //q
-
- curve = new FpCurve(
- mod_p, // p
- new BigInteger("57896044618658097711785492504343953926634992332820282019728792003956564823190"), // a
- new BigInteger("28091019353058090096996979000309560759124368558014865957655842872397301267595"), // b
- mod_q,
- BigInteger.One);
-
- ecParams = new ECDomainParameters(
- curve,
- curve.CreatePoint(
- new BigInteger("1"), // x
- new BigInteger("28792665814854611296992347458380284135028636778229113005756334730996303888124")), // y
- mod_q); // q
-
- parameters[CryptoProObjectIdentifiers.GostR3410x2001CryptoProB] = ecParams;
-
- mod_p = new BigInteger("70390085352083305199547718019018437841079516630045180471284346843705633502619");
- mod_q = new BigInteger("70390085352083305199547718019018437840920882647164081035322601458352298396601");
-
- curve = new FpCurve(
- mod_p, // p
- new BigInteger("70390085352083305199547718019018437841079516630045180471284346843705633502616"),
- new BigInteger("32858"),
- mod_q,
- BigInteger.One);
-
- ecParams = new ECDomainParameters(
- curve,
- curve.CreatePoint(
- new BigInteger("0"),
- new BigInteger("29818893917731240733471273240314769927240550812383695689146495261604565990247")),
- mod_q);
-
- parameters[CryptoProObjectIdentifiers.GostR3410x2001CryptoProXchB] = ecParams;
-
- mod_p = new BigInteger("70390085352083305199547718019018437841079516630045180471284346843705633502619"); //p
- mod_q = new BigInteger("70390085352083305199547718019018437840920882647164081035322601458352298396601"); //q
- curve = new FpCurve(
- mod_p, // p
- new BigInteger("70390085352083305199547718019018437841079516630045180471284346843705633502616"), // a
- new BigInteger("32858"), // b
- mod_q,
- BigInteger.One);
-
- ecParams = new ECDomainParameters(
- curve,
- curve.CreatePoint(
- new BigInteger("0"), // x
- new BigInteger("29818893917731240733471273240314769927240550812383695689146495261604565990247")), // y
- mod_q); // q
-
- parameters[CryptoProObjectIdentifiers.GostR3410x2001CryptoProC] = ecParams;
-
- objIds["GostR3410-2001-CryptoPro-A"] = CryptoProObjectIdentifiers.GostR3410x2001CryptoProA;
- objIds["GostR3410-2001-CryptoPro-B"] = CryptoProObjectIdentifiers.GostR3410x2001CryptoProB;
- objIds["GostR3410-2001-CryptoPro-C"] = CryptoProObjectIdentifiers.GostR3410x2001CryptoProC;
- objIds["GostR3410-2001-CryptoPro-XchA"] = CryptoProObjectIdentifiers.GostR3410x2001CryptoProXchA;
- objIds["GostR3410-2001-CryptoPro-XchB"] = CryptoProObjectIdentifiers.GostR3410x2001CryptoProXchB;
-
- names[CryptoProObjectIdentifiers.GostR3410x2001CryptoProA] = "GostR3410-2001-CryptoPro-A";
- names[CryptoProObjectIdentifiers.GostR3410x2001CryptoProB] = "GostR3410-2001-CryptoPro-B";
- names[CryptoProObjectIdentifiers.GostR3410x2001CryptoProC] = "GostR3410-2001-CryptoPro-C";
- names[CryptoProObjectIdentifiers.GostR3410x2001CryptoProXchA] = "GostR3410-2001-CryptoPro-XchA";
- names[CryptoProObjectIdentifiers.GostR3410x2001CryptoProXchB] = "GostR3410-2001-CryptoPro-XchB";
- }
-
- /**
- * return the ECDomainParameters object for the given OID, null if it
- * isn't present.
- *
- * @param oid an object identifier representing a named parameters, if present.
- */
- public static ECDomainParameters GetByOid(
- DerObjectIdentifier oid)
- {
- return (ECDomainParameters) parameters[oid];
- }
-
- /**
- * returns an enumeration containing the name strings for curves
- * contained in this structure.
- */
- public static IEnumerable Names
- {
- get { return new EnumerableProxy(names.Values); }
- }
-
- public static ECDomainParameters GetByName(
- string name)
- {
- DerObjectIdentifier oid = (DerObjectIdentifier) objIds[name];
-
- if (oid != null)
- {
- return (ECDomainParameters) parameters[oid];
- }
-
- return null;
- }
-
- /**
- * return the named curve name represented by the given object identifier.
- */
- public static string GetName(
- DerObjectIdentifier oid)
- {
- return (string) names[oid];
- }
-
- public static DerObjectIdentifier GetOid(
- string name)
- {
- return (DerObjectIdentifier) objIds[name];
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cryptopro/ECGOST3410ParamSetParameters.cs b/BCCrypto/src/asn1/cryptopro/ECGOST3410ParamSetParameters.cs
deleted file mode 100644
index 8e568a2..0000000
--- a/BCCrypto/src/asn1/cryptopro/ECGOST3410ParamSetParameters.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.CryptoPro
-{
- public class ECGost3410ParamSetParameters
- : Asn1Encodable
- {
- internal readonly DerInteger p, q, a, b, x, y;
-
- public static ECGost3410ParamSetParameters GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static ECGost3410ParamSetParameters GetInstance(
- object obj)
- {
- if (obj == null || obj is ECGost3410ParamSetParameters)
- {
- return (ECGost3410ParamSetParameters) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new ECGost3410ParamSetParameters((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Invalid GOST3410Parameter: " + Platform.GetTypeName(obj));
- }
-
- public ECGost3410ParamSetParameters(
- BigInteger a,
- BigInteger b,
- BigInteger p,
- BigInteger q,
- int x,
- BigInteger y)
- {
- this.a = new DerInteger(a);
- this.b = new DerInteger(b);
- this.p = new DerInteger(p);
- this.q = new DerInteger(q);
- this.x = new DerInteger(x);
- this.y = new DerInteger(y);
- }
-
- public ECGost3410ParamSetParameters(
- Asn1Sequence seq)
- {
- if (seq.Count != 6)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- this.a = DerInteger.GetInstance(seq[0]);
- this.b = DerInteger.GetInstance(seq[1]);
- this.p = DerInteger.GetInstance(seq[2]);
- this.q = DerInteger.GetInstance(seq[3]);
- this.x = DerInteger.GetInstance(seq[4]);
- this.y = DerInteger.GetInstance(seq[5]);
- }
-
- public BigInteger P
- {
- get { return p.PositiveValue; }
- }
-
- public BigInteger Q
- {
- get { return q.PositiveValue; }
- }
-
- public BigInteger A
- {
- get { return a.PositiveValue; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(a, b, p, q, x, y);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cryptopro/GOST28147Parameters.cs b/BCCrypto/src/asn1/cryptopro/GOST28147Parameters.cs
deleted file mode 100644
index fc0d792..0000000
--- a/BCCrypto/src/asn1/cryptopro/GOST28147Parameters.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.CryptoPro
-{
- public class Gost28147Parameters
- : Asn1Encodable
- {
- private readonly Asn1OctetString iv;
- private readonly DerObjectIdentifier paramSet;
-
- public static Gost28147Parameters GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static Gost28147Parameters GetInstance(
- object obj)
- {
- if (obj == null || obj is Gost28147Parameters)
- {
- return (Gost28147Parameters) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new Gost28147Parameters((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Invalid GOST3410Parameter: " + Platform.GetTypeName(obj));
- }
-
- private Gost28147Parameters(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- this.iv = Asn1OctetString.GetInstance(seq[0]);
- this.paramSet = DerObjectIdentifier.GetInstance(seq[1]);
- }
-
- /**
- *
- * Gost28147-89-Parameters ::=
- * SEQUENCE {
- * iv Gost28147-89-IV,
- * encryptionParamSet OBJECT IDENTIFIER
- * }
- *
- * Gost28147-89-IV ::= OCTET STRING (SIZE (8))
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(iv, paramSet);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cryptopro/GOST3410NamedParameters.cs b/BCCrypto/src/asn1/cryptopro/GOST3410NamedParameters.cs
deleted file mode 100644
index 66dba51..0000000
--- a/BCCrypto/src/asn1/cryptopro/GOST3410NamedParameters.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.CryptoPro
-{
- /**
- * table of the available named parameters for GOST 3410-94.
- */
- public sealed class Gost3410NamedParameters
- {
- private Gost3410NamedParameters()
- {
- }
-
- private static readonly IDictionary objIds = Platform.CreateHashtable();
- private static readonly IDictionary parameters = Platform.CreateHashtable();
-
- private static readonly Gost3410ParamSetParameters cryptoProA = new Gost3410ParamSetParameters(
- 1024,
- new BigInteger("127021248288932417465907042777176443525787653508916535812817507265705031260985098497423188333483401180925999995120988934130659205614996724254121049274349357074920312769561451689224110579311248812610229678534638401693520013288995000362260684222750813532307004517341633685004541062586971416883686778842537820383"),
- new BigInteger("68363196144955700784444165611827252895102170888761442055095051287550314083023"),
- new BigInteger("100997906755055304772081815535925224869841082572053457874823515875577147990529272777244152852699298796483356699682842027972896052747173175480590485607134746852141928680912561502802222185647539190902656116367847270145019066794290930185446216399730872221732889830323194097355403213400972588322876850946740663962")
- // validationAlgorithm {
- // algorithm
- // id-GostR3410-94-bBis,
- // parameters
- // GostR3410-94-ValidationBisParameters: {
- // x0 1376285941,
- // c 3996757427
- // }
- // }
-
- );
-
- private static readonly Gost3410ParamSetParameters cryptoProB = new Gost3410ParamSetParameters(
- 1024,
- new BigInteger("139454871199115825601409655107690713107041707059928031797758001454375765357722984094124368522288239833039114681648076688236921220737322672160740747771700911134550432053804647694904686120113087816240740184800477047157336662926249423571248823968542221753660143391485680840520336859458494803187341288580489525163"),
- new BigInteger("79885141663410976897627118935756323747307951916507639758300472692338873533959"),
- new BigInteger("42941826148615804143873447737955502392672345968607143066798112994089471231420027060385216699563848719957657284814898909770759462613437669456364882730370838934791080835932647976778601915343474400961034231316672578686920482194932878633360203384797092684342247621055760235016132614780652761028509445403338652341")
- // validationAlgorithm {
- // algorithm
- // id-GostR3410-94-bBis,
- // parameters
- // GostR3410-94-ValidationBisParameters: {
- // x0 1536654555,
- // c 1855361757,
- // d 14408629386140014567655
- //4902939282056547857802241461782996702017713059974755104394739915140
- //6115284791024439062735788342744854120601660303926203867703556828005
- //8957203818114895398976594425537561271800850306
- // }
- // }
- //}
- );
-
- private static readonly Gost3410ParamSetParameters cryptoProXchA = new Gost3410ParamSetParameters(
- 1024,
- new BigInteger("142011741597563481196368286022318089743276138395243738762872573441927459393512718973631166078467600360848946623567625795282774719212241929071046134208380636394084512691828894000571524625445295769349356752728956831541775441763139384457191755096847107846595662547942312293338483924514339614727760681880609734239"),
- new BigInteger("91771529896554605945588149018382750217296858393520724172743325725474374979801"),
- new BigInteger("133531813272720673433859519948319001217942375967847486899482359599369642528734712461590403327731821410328012529253871914788598993103310567744136196364803064721377826656898686468463277710150809401182608770201615324990468332931294920912776241137878030224355746606283971659376426832674269780880061631528163475887")
- );
-
- static Gost3410NamedParameters()
- {
- parameters[CryptoProObjectIdentifiers.GostR3410x94CryptoProA] = cryptoProA;
- parameters[CryptoProObjectIdentifiers.GostR3410x94CryptoProB] = cryptoProB;
- //parameters[CryptoProObjectIdentifiers.GostR3410x94CryptoProC] = cryptoProC;
- //parameters[CryptoProObjectIdentifiers.GostR3410x94CryptoProD] = cryptoProD;
- parameters[CryptoProObjectIdentifiers.GostR3410x94CryptoProXchA] = cryptoProXchA;
- //parameters[CryptoProObjectIdentifiers.GostR3410x94CryptoProXchB] = cryptoProXchA;
- //parameters[CryptoProObjectIdentifiers.GostR3410x94CryptoProXchC] = cryptoProXchA;
-
- objIds["GostR3410-94-CryptoPro-A"] = CryptoProObjectIdentifiers.GostR3410x94CryptoProA;
- objIds["GostR3410-94-CryptoPro-B"] = CryptoProObjectIdentifiers.GostR3410x94CryptoProB;
- objIds["GostR3410-94-CryptoPro-XchA"] = CryptoProObjectIdentifiers.GostR3410x94CryptoProXchA;
- }
-
- /**
- * return the GOST3410ParamSetParameters object for the given OID, null if it
- * isn't present.
- *
- * @param oid an object identifier representing a named parameters, if present.
- */
- public static Gost3410ParamSetParameters GetByOid(
- DerObjectIdentifier oid)
- {
- return (Gost3410ParamSetParameters) parameters[oid];
- }
-
- /**
- * returns an enumeration containing the name strings for parameters
- * contained in this structure.
- */
- public static IEnumerable Names
- {
- get { return new EnumerableProxy(objIds.Keys); }
- }
-
- public static Gost3410ParamSetParameters GetByName(
- string name)
- {
- DerObjectIdentifier oid = (DerObjectIdentifier) objIds[name];
-
- if (oid != null)
- {
- return (Gost3410ParamSetParameters) parameters[oid];
- }
-
- return null;
- }
-
- public static DerObjectIdentifier GetOid(
- string name)
- {
- return (DerObjectIdentifier) objIds[name];
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cryptopro/GOST3410ParamSetParameters.cs b/BCCrypto/src/asn1/cryptopro/GOST3410ParamSetParameters.cs
deleted file mode 100644
index b347f8d..0000000
--- a/BCCrypto/src/asn1/cryptopro/GOST3410ParamSetParameters.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.CryptoPro
-{
- public class Gost3410ParamSetParameters
- : Asn1Encodable
- {
- private readonly int keySize;
- private readonly DerInteger p, q, a;
-
- public static Gost3410ParamSetParameters GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static Gost3410ParamSetParameters GetInstance(
- object obj)
- {
- if (obj == null || obj is Gost3410ParamSetParameters)
- {
- return (Gost3410ParamSetParameters) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new Gost3410ParamSetParameters((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Invalid GOST3410Parameter: " + Platform.GetTypeName(obj));
- }
-
- public Gost3410ParamSetParameters(
- int keySize,
- BigInteger p,
- BigInteger q,
- BigInteger a)
- {
- this.keySize = keySize;
- this.p = new DerInteger(p);
- this.q = new DerInteger(q);
- this.a = new DerInteger(a);
- }
-
- private Gost3410ParamSetParameters(
- Asn1Sequence seq)
- {
- if (seq.Count != 4)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- this.keySize = DerInteger.GetInstance(seq[0]).Value.IntValue;
- this.p = DerInteger.GetInstance(seq[1]);
- this.q = DerInteger.GetInstance(seq[2]);
- this.a = DerInteger.GetInstance(seq[3]);
- }
-
- public int KeySize
- {
- get { return keySize; }
- }
-
- public BigInteger P
- {
- get { return p.PositiveValue; }
- }
-
- public BigInteger Q
- {
- get { return q.PositiveValue; }
- }
-
- public BigInteger A
- {
- get { return a.PositiveValue; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(new DerInteger(keySize), p, q, a);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/cryptopro/GOST3410PublicKeyAlgParameters.cs b/BCCrypto/src/asn1/cryptopro/GOST3410PublicKeyAlgParameters.cs
deleted file mode 100644
index 10c45ba..0000000
--- a/BCCrypto/src/asn1/cryptopro/GOST3410PublicKeyAlgParameters.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.CryptoPro
-{
- public class Gost3410PublicKeyAlgParameters
- : Asn1Encodable
- {
- private DerObjectIdentifier publicKeyParamSet;
- private DerObjectIdentifier digestParamSet;
- private DerObjectIdentifier encryptionParamSet;
-
- public static Gost3410PublicKeyAlgParameters GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static Gost3410PublicKeyAlgParameters GetInstance(
- object obj)
- {
- if (obj == null || obj is Gost3410PublicKeyAlgParameters)
- {
- return (Gost3410PublicKeyAlgParameters) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new Gost3410PublicKeyAlgParameters((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Invalid GOST3410Parameter: " + Platform.GetTypeName(obj));
- }
-
- public Gost3410PublicKeyAlgParameters(
- DerObjectIdentifier publicKeyParamSet,
- DerObjectIdentifier digestParamSet)
- : this (publicKeyParamSet, digestParamSet, null)
- {
- }
-
- public Gost3410PublicKeyAlgParameters(
- DerObjectIdentifier publicKeyParamSet,
- DerObjectIdentifier digestParamSet,
- DerObjectIdentifier encryptionParamSet)
- {
- if (publicKeyParamSet == null)
- throw new ArgumentNullException("publicKeyParamSet");
- if (digestParamSet == null)
- throw new ArgumentNullException("digestParamSet");
-
- this.publicKeyParamSet = publicKeyParamSet;
- this.digestParamSet = digestParamSet;
- this.encryptionParamSet = encryptionParamSet;
- }
-
- public Gost3410PublicKeyAlgParameters(
- Asn1Sequence seq)
- {
- this.publicKeyParamSet = (DerObjectIdentifier) seq[0];
- this.digestParamSet = (DerObjectIdentifier) seq[1];
-
- if (seq.Count > 2)
- {
- this.encryptionParamSet = (DerObjectIdentifier) seq[2];
- }
- }
-
- public DerObjectIdentifier PublicKeyParamSet
- {
- get { return publicKeyParamSet; }
- }
-
- public DerObjectIdentifier DigestParamSet
- {
- get { return digestParamSet; }
- }
-
- public DerObjectIdentifier EncryptionParamSet
- {
- get { return encryptionParamSet; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- publicKeyParamSet, digestParamSet);
-
- if (encryptionParamSet != null)
- {
- v.Add(encryptionParamSet);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/eac/EACObjectIdentifiers.cs b/BCCrypto/src/asn1/eac/EACObjectIdentifiers.cs
deleted file mode 100644
index d54ef0e..0000000
--- a/BCCrypto/src/asn1/eac/EACObjectIdentifiers.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Eac
-{
- public abstract class EacObjectIdentifiers
- {
- // bsi-de OBJECT IDENTIFIER ::= {
- // itu-t(0) identified-organization(4) etsi(0)
- // reserved(127) etsi-identified-organization(0) 7
- // }
- public static readonly DerObjectIdentifier bsi_de = new DerObjectIdentifier("0.4.0.127.0.7");
-
- // id-PK OBJECT IDENTIFIER ::= {
- // bsi-de protocols(2) smartcard(2) 1
- // }
- public static readonly DerObjectIdentifier id_PK = new DerObjectIdentifier(bsi_de + ".2.2.1");
-
- public static readonly DerObjectIdentifier id_PK_DH = new DerObjectIdentifier(id_PK + ".1");
- public static readonly DerObjectIdentifier id_PK_ECDH = new DerObjectIdentifier(id_PK + ".2");
-
- // id-CA OBJECT IDENTIFIER ::= {
- // bsi-de protocols(2) smartcard(2) 3
- // }
- public static readonly DerObjectIdentifier id_CA = new DerObjectIdentifier(bsi_de + ".2.2.3");
- public static readonly DerObjectIdentifier id_CA_DH = new DerObjectIdentifier(id_CA + ".1");
- public static readonly DerObjectIdentifier id_CA_DH_3DES_CBC_CBC = new DerObjectIdentifier(id_CA_DH + ".1");
- public static readonly DerObjectIdentifier id_CA_ECDH = new DerObjectIdentifier(id_CA + ".2");
- public static readonly DerObjectIdentifier id_CA_ECDH_3DES_CBC_CBC = new DerObjectIdentifier(id_CA_ECDH + ".1");
-
- //
- // id-TA OBJECT IDENTIFIER ::= {
- // bsi-de protocols(2) smartcard(2) 2
- // }
- public static readonly DerObjectIdentifier id_TA = new DerObjectIdentifier(bsi_de + ".2.2.2");
-
- public static readonly DerObjectIdentifier id_TA_RSA = new DerObjectIdentifier(id_TA + ".1");
- public static readonly DerObjectIdentifier id_TA_RSA_v1_5_SHA_1 = new DerObjectIdentifier(id_TA_RSA + ".1");
- public static readonly DerObjectIdentifier id_TA_RSA_v1_5_SHA_256 = new DerObjectIdentifier(id_TA_RSA + ".2");
- public static readonly DerObjectIdentifier id_TA_RSA_PSS_SHA_1 = new DerObjectIdentifier(id_TA_RSA + ".3");
- public static readonly DerObjectIdentifier id_TA_RSA_PSS_SHA_256 = new DerObjectIdentifier(id_TA_RSA + ".4");
- public static readonly DerObjectIdentifier id_TA_ECDSA = new DerObjectIdentifier(id_TA + ".2");
- public static readonly DerObjectIdentifier id_TA_ECDSA_SHA_1 = new DerObjectIdentifier(id_TA_ECDSA + ".1");
- public static readonly DerObjectIdentifier id_TA_ECDSA_SHA_224 = new DerObjectIdentifier(id_TA_ECDSA + ".2");
- public static readonly DerObjectIdentifier id_TA_ECDSA_SHA_256 = new DerObjectIdentifier(id_TA_ECDSA + ".3");
- public static readonly DerObjectIdentifier id_TA_ECDSA_SHA_384 = new DerObjectIdentifier(id_TA_ECDSA + ".4");
- public static readonly DerObjectIdentifier id_TA_ECDSA_SHA_512 = new DerObjectIdentifier(id_TA_ECDSA + ".5");
- }
-}
diff --git a/BCCrypto/src/asn1/esf/CertificateValues.cs b/BCCrypto/src/asn1/esf/CertificateValues.cs
deleted file mode 100644
index 30a7191..0000000
--- a/BCCrypto/src/asn1/esf/CertificateValues.cs
+++ /dev/null
@@ -1,86 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 3126: 4.3.1 Certificate Values Attribute Definition
- ///
- /// CertificateValues ::= SEQUENCE OF Certificate
- ///
- ///
- public class CertificateValues
- : Asn1Encodable
- {
- private readonly Asn1Sequence certificates;
-
- public static CertificateValues GetInstance(
- object obj)
- {
- if (obj == null || obj is CertificateValues)
- return (CertificateValues) obj;
-
- if (obj is Asn1Sequence)
- return new CertificateValues((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'CertificateValues' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private CertificateValues(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
-
- foreach (Asn1Encodable ae in seq)
- {
- X509CertificateStructure.GetInstance(ae.ToAsn1Object());
- }
-
- this.certificates = seq;
- }
-
- public CertificateValues(
- params X509CertificateStructure[] certificates)
- {
- if (certificates == null)
- throw new ArgumentNullException("certificates");
-
- this.certificates = new DerSequence(certificates);
- }
-
- public CertificateValues(
- IEnumerable certificates)
- {
- if (certificates == null)
- throw new ArgumentNullException("certificates");
- if (!CollectionUtilities.CheckElementsAreOfType(certificates, typeof(X509CertificateStructure)))
- throw new ArgumentException("Must contain only 'X509CertificateStructure' objects", "certificates");
-
- this.certificates = new DerSequence(
- Asn1EncodableVector.FromEnumerable(certificates));
- }
-
- public X509CertificateStructure[] GetCertificates()
- {
- X509CertificateStructure[] result = new X509CertificateStructure[certificates.Count];
- for (int i = 0; i < certificates.Count; ++i)
- {
- result[i] = X509CertificateStructure.GetInstance(certificates[i]);
- }
- return result;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return certificates;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/CommitmentTypeIdentifier.cs b/BCCrypto/src/asn1/esf/CommitmentTypeIdentifier.cs
deleted file mode 100644
index 65cd45b..0000000
--- a/BCCrypto/src/asn1/esf/CommitmentTypeIdentifier.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Pkcs;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- public abstract class CommitmentTypeIdentifier
- {
- public static readonly DerObjectIdentifier ProofOfOrigin = PkcsObjectIdentifiers.IdCtiEtsProofOfOrigin;
- public static readonly DerObjectIdentifier ProofOfReceipt = PkcsObjectIdentifiers.IdCtiEtsProofOfReceipt;
- public static readonly DerObjectIdentifier ProofOfDelivery = PkcsObjectIdentifiers.IdCtiEtsProofOfDelivery;
- public static readonly DerObjectIdentifier ProofOfSender = PkcsObjectIdentifiers.IdCtiEtsProofOfSender;
- public static readonly DerObjectIdentifier ProofOfApproval = PkcsObjectIdentifiers.IdCtiEtsProofOfApproval;
- public static readonly DerObjectIdentifier ProofOfCreation = PkcsObjectIdentifiers.IdCtiEtsProofOfCreation;
- }
-}
diff --git a/BCCrypto/src/asn1/esf/CommitmentTypeIndication.cs b/BCCrypto/src/asn1/esf/CommitmentTypeIndication.cs
deleted file mode 100644
index 196a613..0000000
--- a/BCCrypto/src/asn1/esf/CommitmentTypeIndication.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- public class CommitmentTypeIndication
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier commitmentTypeId;
- private readonly Asn1Sequence commitmentTypeQualifier;
-
- public static CommitmentTypeIndication GetInstance(
- object obj)
- {
- if (obj == null || obj is CommitmentTypeIndication)
- return (CommitmentTypeIndication) obj;
-
- if (obj is Asn1Sequence)
- return new CommitmentTypeIndication((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'CommitmentTypeIndication' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- public CommitmentTypeIndication(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count < 1 || seq.Count > 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.commitmentTypeId = (DerObjectIdentifier) seq[0].ToAsn1Object();
-
- if (seq.Count > 1)
- {
- this.commitmentTypeQualifier = (Asn1Sequence) seq[1].ToAsn1Object();
- }
- }
-
- public CommitmentTypeIndication(
- DerObjectIdentifier commitmentTypeId)
- : this(commitmentTypeId, null)
- {
- }
-
- public CommitmentTypeIndication(
- DerObjectIdentifier commitmentTypeId,
- Asn1Sequence commitmentTypeQualifier)
- {
- if (commitmentTypeId == null)
- throw new ArgumentNullException("commitmentTypeId");
-
- this.commitmentTypeId = commitmentTypeId;
-
- if (commitmentTypeQualifier != null)
- {
- this.commitmentTypeQualifier = commitmentTypeQualifier;
- }
- }
-
- public DerObjectIdentifier CommitmentTypeID
- {
- get { return commitmentTypeId; }
- }
-
- public Asn1Sequence CommitmentTypeQualifier
- {
- get { return commitmentTypeQualifier; }
- }
-
- /**
- *
- * CommitmentTypeIndication ::= SEQUENCE {
- * commitmentTypeId CommitmentTypeIdentifier,
- * commitmentTypeQualifier SEQUENCE SIZE (1..MAX) OF
- * CommitmentTypeQualifier OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(commitmentTypeId);
-
- if (commitmentTypeQualifier != null)
- {
- v.Add(commitmentTypeQualifier);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/CommitmentTypeQualifier.cs b/BCCrypto/src/asn1/esf/CommitmentTypeQualifier.cs
deleted file mode 100644
index 30bf0ed..0000000
--- a/BCCrypto/src/asn1/esf/CommitmentTypeQualifier.cs
+++ /dev/null
@@ -1,119 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- /**
- * Commitment type qualifiers, used in the Commitment-Type-Indication attribute (RFC3126).
- *
- *
- * CommitmentTypeQualifier ::= SEQUENCE {
- * commitmentTypeIdentifier CommitmentTypeIdentifier,
- * qualifier ANY DEFINED BY commitmentTypeIdentifier OPTIONAL }
- *
- */
- public class CommitmentTypeQualifier
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier commitmentTypeIdentifier;
- private readonly Asn1Object qualifier;
-
- /**
- * Creates a new CommitmentTypeQualifier instance.
- *
- * @param commitmentTypeIdentifier a CommitmentTypeIdentifier value
- */
- public CommitmentTypeQualifier(
- DerObjectIdentifier commitmentTypeIdentifier)
- : this(commitmentTypeIdentifier, null)
- {
- }
-
- /**
- * Creates a new CommitmentTypeQualifier instance.
- *
- * @param commitmentTypeIdentifier a CommitmentTypeIdentifier value
- * @param qualifier the qualifier, defined by the above field.
- */
- public CommitmentTypeQualifier(
- DerObjectIdentifier commitmentTypeIdentifier,
- Asn1Encodable qualifier)
- {
- if (commitmentTypeIdentifier == null)
- throw new ArgumentNullException("commitmentTypeIdentifier");
-
- this.commitmentTypeIdentifier = commitmentTypeIdentifier;
-
- if (qualifier != null)
- {
- this.qualifier = qualifier.ToAsn1Object();
- }
- }
-
- /**
- * Creates a new CommitmentTypeQualifier instance.
- *
- * @param as CommitmentTypeQualifier structure
- * encoded as an Asn1Sequence.
- */
- public CommitmentTypeQualifier(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count < 1 || seq.Count > 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- commitmentTypeIdentifier = (DerObjectIdentifier) seq[0].ToAsn1Object();
-
- if (seq.Count > 1)
- {
- qualifier = seq[1].ToAsn1Object();
- }
- }
-
- public static CommitmentTypeQualifier GetInstance(
- object obj)
- {
- if (obj == null || obj is CommitmentTypeQualifier)
- return (CommitmentTypeQualifier) obj;
-
- if (obj is Asn1Sequence)
- return new CommitmentTypeQualifier((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'CommitmentTypeQualifier' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- public DerObjectIdentifier CommitmentTypeIdentifier
- {
- get { return commitmentTypeIdentifier; }
- }
-
- public Asn1Object Qualifier
- {
- get { return qualifier; }
- }
-
- /**
- * Returns a DER-encodable representation of this instance.
- *
- * @return a Asn1Object value
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- commitmentTypeIdentifier);
-
- if (qualifier != null)
- {
- v.Add(qualifier);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/CompleteCertificateRefs.cs b/BCCrypto/src/asn1/esf/CompleteCertificateRefs.cs
deleted file mode 100644
index af93700..0000000
--- a/BCCrypto/src/asn1/esf/CompleteCertificateRefs.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 3126: 4.2.1 Complete Certificate Refs Attribute Definition
- ///
- /// CompleteCertificateRefs ::= SEQUENCE OF OtherCertID
- ///
- ///
- public class CompleteCertificateRefs
- : Asn1Encodable
- {
- private readonly Asn1Sequence otherCertIDs;
-
- public static CompleteCertificateRefs GetInstance(
- object obj)
- {
- if (obj == null || obj is CompleteCertificateRefs)
- return (CompleteCertificateRefs) obj;
-
- if (obj is Asn1Sequence)
- return new CompleteCertificateRefs((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'CompleteCertificateRefs' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private CompleteCertificateRefs(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
-
- foreach (Asn1Encodable ae in seq)
- {
- OtherCertID.GetInstance(ae.ToAsn1Object());
- }
-
- this.otherCertIDs = seq;
- }
-
- public CompleteCertificateRefs(
- params OtherCertID[] otherCertIDs)
- {
- if (otherCertIDs == null)
- throw new ArgumentNullException("otherCertIDs");
-
- this.otherCertIDs = new DerSequence(otherCertIDs);
- }
-
- public CompleteCertificateRefs(
- IEnumerable otherCertIDs)
- {
- if (otherCertIDs == null)
- throw new ArgumentNullException("otherCertIDs");
- if (!CollectionUtilities.CheckElementsAreOfType(otherCertIDs, typeof(OtherCertID)))
- throw new ArgumentException("Must contain only 'OtherCertID' objects", "otherCertIDs");
-
- this.otherCertIDs = new DerSequence(
- Asn1EncodableVector.FromEnumerable(otherCertIDs));
- }
-
- public OtherCertID[] GetOtherCertIDs()
- {
- OtherCertID[] result = new OtherCertID[otherCertIDs.Count];
- for (int i = 0; i < otherCertIDs.Count; ++i)
- {
- result[i] = OtherCertID.GetInstance(otherCertIDs[i].ToAsn1Object());
- }
- return result;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return otherCertIDs;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/CompleteRevocationRefs.cs b/BCCrypto/src/asn1/esf/CompleteRevocationRefs.cs
deleted file mode 100644
index 348e63f..0000000
--- a/BCCrypto/src/asn1/esf/CompleteRevocationRefs.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition
- ///
- /// CompleteRevocationRefs ::= SEQUENCE OF CrlOcspRef
- ///
- ///
- public class CompleteRevocationRefs
- : Asn1Encodable
- {
- private readonly Asn1Sequence crlOcspRefs;
-
- public static CompleteRevocationRefs GetInstance(
- object obj)
- {
- if (obj == null || obj is CompleteRevocationRefs)
- return (CompleteRevocationRefs) obj;
-
- if (obj is Asn1Sequence)
- return new CompleteRevocationRefs((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'CompleteRevocationRefs' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private CompleteRevocationRefs(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
-
- foreach (Asn1Encodable ae in seq)
- {
- CrlOcspRef.GetInstance(ae.ToAsn1Object());
- }
-
- this.crlOcspRefs = seq;
- }
-
- public CompleteRevocationRefs(
- params CrlOcspRef[] crlOcspRefs)
- {
- if (crlOcspRefs == null)
- throw new ArgumentNullException("crlOcspRefs");
-
- this.crlOcspRefs = new DerSequence(crlOcspRefs);
- }
-
- public CompleteRevocationRefs(
- IEnumerable crlOcspRefs)
- {
- if (crlOcspRefs == null)
- throw new ArgumentNullException("crlOcspRefs");
- if (!CollectionUtilities.CheckElementsAreOfType(crlOcspRefs, typeof(CrlOcspRef)))
- throw new ArgumentException("Must contain only 'CrlOcspRef' objects", "crlOcspRefs");
-
- this.crlOcspRefs = new DerSequence(
- Asn1EncodableVector.FromEnumerable(crlOcspRefs));
- }
-
- public CrlOcspRef[] GetCrlOcspRefs()
- {
- CrlOcspRef[] result = new CrlOcspRef[crlOcspRefs.Count];
- for (int i = 0; i < crlOcspRefs.Count; ++i)
- {
- result[i] = CrlOcspRef.GetInstance(crlOcspRefs[i].ToAsn1Object());
- }
- return result;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return crlOcspRefs;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/CrlIdentifier.cs b/BCCrypto/src/asn1/esf/CrlIdentifier.cs
deleted file mode 100644
index 96b50e2..0000000
--- a/BCCrypto/src/asn1/esf/CrlIdentifier.cs
+++ /dev/null
@@ -1,111 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition
- ///
- /// CrlIdentifier ::= SEQUENCE
- /// {
- /// crlissuer Name,
- /// crlIssuedTime UTCTime,
- /// crlNumber INTEGER OPTIONAL
- /// }
- ///
- ///
- public class CrlIdentifier
- : Asn1Encodable
- {
- private readonly X509Name crlIssuer;
- private readonly DerUtcTime crlIssuedTime;
- private readonly DerInteger crlNumber;
-
- public static CrlIdentifier GetInstance(
- object obj)
- {
- if (obj == null || obj is CrlIdentifier)
- return (CrlIdentifier) obj;
-
- if (obj is Asn1Sequence)
- return new CrlIdentifier((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'CrlIdentifier' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private CrlIdentifier(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count < 2 || seq.Count > 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.crlIssuer = X509Name.GetInstance(seq[0]);
- this.crlIssuedTime = DerUtcTime.GetInstance(seq[1]);
-
- if (seq.Count > 2)
- {
- this.crlNumber = DerInteger.GetInstance(seq[2]);
- }
- }
-
- public CrlIdentifier(
- X509Name crlIssuer,
- DateTime crlIssuedTime)
- : this(crlIssuer, crlIssuedTime, null)
- {
- }
-
- public CrlIdentifier(
- X509Name crlIssuer,
- DateTime crlIssuedTime,
- BigInteger crlNumber)
- {
- if (crlIssuer == null)
- throw new ArgumentNullException("crlIssuer");
-
- this.crlIssuer = crlIssuer;
- this.crlIssuedTime = new DerUtcTime(crlIssuedTime);
-
- if (crlNumber != null)
- {
- this.crlNumber = new DerInteger(crlNumber);
- }
- }
-
- public X509Name CrlIssuer
- {
- get { return crlIssuer; }
- }
-
- public DateTime CrlIssuedTime
- {
- get { return crlIssuedTime.ToAdjustedDateTime(); }
- }
-
- public BigInteger CrlNumber
- {
- get { return crlNumber == null ? null : crlNumber.Value; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- crlIssuer.ToAsn1Object(), crlIssuedTime);
-
- if (crlNumber != null)
- {
- v.Add(crlNumber);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/CrlListID.cs b/BCCrypto/src/asn1/esf/CrlListID.cs
deleted file mode 100644
index fbd4fb2..0000000
--- a/BCCrypto/src/asn1/esf/CrlListID.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition
- ///
- /// CRLListID ::= SEQUENCE
- /// {
- /// crls SEQUENCE OF CrlValidatedID
- /// }
- ///
- ///
- public class CrlListID
- : Asn1Encodable
- {
- private readonly Asn1Sequence crls;
-
- public static CrlListID GetInstance(
- object obj)
- {
- if (obj == null || obj is CrlListID)
- return (CrlListID) obj;
-
- if (obj is Asn1Sequence)
- return new CrlListID((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'CrlListID' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private CrlListID(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count != 1)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.crls = (Asn1Sequence) seq[0].ToAsn1Object();
-
- foreach (Asn1Encodable ae in this.crls)
- {
- CrlValidatedID.GetInstance(ae.ToAsn1Object());
- }
- }
-
- public CrlListID(
- params CrlValidatedID[] crls)
- {
- if (crls == null)
- throw new ArgumentNullException("crls");
-
- this.crls = new DerSequence(crls);
- }
-
- public CrlListID(
- IEnumerable crls)
- {
- if (crls == null)
- throw new ArgumentNullException("crls");
- if (!CollectionUtilities.CheckElementsAreOfType(crls, typeof(CrlValidatedID)))
- throw new ArgumentException("Must contain only 'CrlValidatedID' objects", "crls");
-
- this.crls = new DerSequence(
- Asn1EncodableVector.FromEnumerable(crls));
- }
-
- public CrlValidatedID[] GetCrls()
- {
- CrlValidatedID[] result = new CrlValidatedID[crls.Count];
- for (int i = 0; i < crls.Count; ++i)
- {
- result[i] = CrlValidatedID.GetInstance(crls[i].ToAsn1Object());
- }
- return result;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(crls);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/CrlOcspRef.cs b/BCCrypto/src/asn1/esf/CrlOcspRef.cs
deleted file mode 100644
index 6153e0c..0000000
--- a/BCCrypto/src/asn1/esf/CrlOcspRef.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition
- ///
- /// CrlOcspRef ::= SEQUENCE {
- /// crlids [0] CRLListID OPTIONAL,
- /// ocspids [1] OcspListID OPTIONAL,
- /// otherRev [2] OtherRevRefs OPTIONAL
- /// }
- ///
- ///
- public class CrlOcspRef
- : Asn1Encodable
- {
- private readonly CrlListID crlids;
- private readonly OcspListID ocspids;
- private readonly OtherRevRefs otherRev;
-
- public static CrlOcspRef GetInstance(
- object obj)
- {
- if (obj == null || obj is CrlOcspRef)
- return (CrlOcspRef) obj;
-
- if (obj is Asn1Sequence)
- return new CrlOcspRef((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'CrlOcspRef' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private CrlOcspRef(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
-
- foreach (Asn1TaggedObject taggedObj in seq)
- {
- Asn1Object asn1Obj = taggedObj.GetObject();
-
- switch (taggedObj.TagNo)
- {
- case 0:
- this.crlids = CrlListID.GetInstance(asn1Obj);
- break;
- case 1:
- this.ocspids = OcspListID.GetInstance(asn1Obj);
- break;
- case 2:
- this.otherRev = OtherRevRefs.GetInstance(asn1Obj);
- break;
- default:
- throw new ArgumentException("Illegal tag in CrlOcspRef", "seq");
- }
- }
- }
-
- public CrlOcspRef(
- CrlListID crlids,
- OcspListID ocspids,
- OtherRevRefs otherRev)
- {
- this.crlids = crlids;
- this.ocspids = ocspids;
- this.otherRev = otherRev;
- }
-
- public CrlListID CrlIDs
- {
- get { return crlids; }
- }
-
- public OcspListID OcspIDs
- {
- get { return ocspids; }
- }
-
- public OtherRevRefs OtherRev
- {
- get { return otherRev; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (crlids != null)
- {
- v.Add(new DerTaggedObject(true, 0, crlids.ToAsn1Object()));
- }
-
- if (ocspids != null)
- {
- v.Add(new DerTaggedObject(true, 1, ocspids.ToAsn1Object()));
- }
-
- if (otherRev != null)
- {
- v.Add(new DerTaggedObject(true, 2, otherRev.ToAsn1Object()));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/CrlValidatedID.cs b/BCCrypto/src/asn1/esf/CrlValidatedID.cs
deleted file mode 100644
index e8cd17a..0000000
--- a/BCCrypto/src/asn1/esf/CrlValidatedID.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition
- ///
- /// CrlValidatedID ::= SEQUENCE {
- /// crlHash OtherHash,
- /// crlIdentifier CrlIdentifier OPTIONAL}
- ///
- ///
- public class CrlValidatedID
- : Asn1Encodable
- {
- private readonly OtherHash crlHash;
- private readonly CrlIdentifier crlIdentifier;
-
- public static CrlValidatedID GetInstance(
- object obj)
- {
- if (obj == null || obj is CrlValidatedID)
- return (CrlValidatedID) obj;
-
- if (obj is Asn1Sequence)
- return new CrlValidatedID((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'CrlValidatedID' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private CrlValidatedID(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count < 1 || seq.Count > 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.crlHash = OtherHash.GetInstance(seq[0].ToAsn1Object());
-
- if (seq.Count > 1)
- {
- this.crlIdentifier = CrlIdentifier.GetInstance(seq[1].ToAsn1Object());
- }
- }
-
- public CrlValidatedID(
- OtherHash crlHash)
- : this(crlHash, null)
- {
- }
-
- public CrlValidatedID(
- OtherHash crlHash,
- CrlIdentifier crlIdentifier)
- {
- if (crlHash == null)
- throw new ArgumentNullException("crlHash");
-
- this.crlHash = crlHash;
- this.crlIdentifier = crlIdentifier;
- }
-
- public OtherHash CrlHash
- {
- get { return crlHash; }
- }
-
- public CrlIdentifier CrlIdentifier
- {
- get { return crlIdentifier; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(crlHash.ToAsn1Object());
-
- if (crlIdentifier != null)
- {
- v.Add(crlIdentifier.ToAsn1Object());
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/ESFAttributes.cs b/BCCrypto/src/asn1/esf/ESFAttributes.cs
deleted file mode 100644
index 9401ffb..0000000
--- a/BCCrypto/src/asn1/esf/ESFAttributes.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Pkcs;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- public abstract class EsfAttributes
- {
- public static readonly DerObjectIdentifier SigPolicyId = PkcsObjectIdentifiers.IdAAEtsSigPolicyID;
- public static readonly DerObjectIdentifier CommitmentType = PkcsObjectIdentifiers.IdAAEtsCommitmentType;
- public static readonly DerObjectIdentifier SignerLocation = PkcsObjectIdentifiers.IdAAEtsSignerLocation;
- public static readonly DerObjectIdentifier SignerAttr = PkcsObjectIdentifiers.IdAAEtsSignerAttr;
- public static readonly DerObjectIdentifier OtherSigCert = PkcsObjectIdentifiers.IdAAEtsOtherSigCert;
- public static readonly DerObjectIdentifier ContentTimestamp = PkcsObjectIdentifiers.IdAAEtsContentTimestamp;
- public static readonly DerObjectIdentifier CertificateRefs = PkcsObjectIdentifiers.IdAAEtsCertificateRefs;
- public static readonly DerObjectIdentifier RevocationRefs = PkcsObjectIdentifiers.IdAAEtsRevocationRefs;
- public static readonly DerObjectIdentifier CertValues = PkcsObjectIdentifiers.IdAAEtsCertValues;
- public static readonly DerObjectIdentifier RevocationValues = PkcsObjectIdentifiers.IdAAEtsRevocationValues;
- public static readonly DerObjectIdentifier EscTimeStamp = PkcsObjectIdentifiers.IdAAEtsEscTimeStamp;
- public static readonly DerObjectIdentifier CertCrlTimestamp = PkcsObjectIdentifiers.IdAAEtsCertCrlTimestamp;
- public static readonly DerObjectIdentifier ArchiveTimestamp = PkcsObjectIdentifiers.IdAAEtsArchiveTimestamp;
- public static readonly DerObjectIdentifier ArchiveTimestampV2 = new DerObjectIdentifier(PkcsObjectIdentifiers.IdAA + ".48");
- }
-}
diff --git a/BCCrypto/src/asn1/esf/OcspIdentifier.cs b/BCCrypto/src/asn1/esf/OcspIdentifier.cs
deleted file mode 100644
index e65f1cf..0000000
--- a/BCCrypto/src/asn1/esf/OcspIdentifier.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition
- ///
- /// OcspIdentifier ::= SEQUENCE {
- /// ocspResponderID ResponderID,
- /// -- As in OCSP response data
- /// producedAt GeneralizedTime
- /// -- As in OCSP response data
- /// }
- ///
- ///
- public class OcspIdentifier
- : Asn1Encodable
- {
- private readonly ResponderID ocspResponderID;
- private readonly DerGeneralizedTime producedAt;
-
- public static OcspIdentifier GetInstance(
- object obj)
- {
- if (obj == null || obj is OcspIdentifier)
- return (OcspIdentifier) obj;
-
- if (obj is Asn1Sequence)
- return new OcspIdentifier((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'OcspIdentifier' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private OcspIdentifier(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.ocspResponderID = ResponderID.GetInstance(seq[0].ToAsn1Object());
- this.producedAt = (DerGeneralizedTime) seq[1].ToAsn1Object();
- }
-
- public OcspIdentifier(
- ResponderID ocspResponderID,
- DateTime producedAt)
- {
- if (ocspResponderID == null)
- throw new ArgumentNullException();
-
- this.ocspResponderID = ocspResponderID;
- this.producedAt = new DerGeneralizedTime(producedAt);
- }
-
- public ResponderID OcspResponderID
- {
- get { return ocspResponderID; }
- }
-
- public DateTime ProducedAt
- {
- get { return producedAt.ToDateTime(); }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(ocspResponderID, producedAt);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/OcspListID.cs b/BCCrypto/src/asn1/esf/OcspListID.cs
deleted file mode 100644
index 1c8edb1..0000000
--- a/BCCrypto/src/asn1/esf/OcspListID.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition
- ///
- /// OcspListID ::= SEQUENCE {
- /// ocspResponses SEQUENCE OF OcspResponsesID
- /// }
- ///
- ///
- public class OcspListID
- : Asn1Encodable
- {
- private readonly Asn1Sequence ocspResponses;
-
- public static OcspListID GetInstance(
- object obj)
- {
- if (obj == null || obj is OcspListID)
- return (OcspListID) obj;
-
- if (obj is Asn1Sequence)
- return new OcspListID((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'OcspListID' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private OcspListID(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count != 1)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.ocspResponses = (Asn1Sequence) seq[0].ToAsn1Object();
-
- foreach (Asn1Encodable ae in this.ocspResponses)
- {
- OcspResponsesID.GetInstance(ae.ToAsn1Object());
- }
- }
-
- public OcspListID(
- params OcspResponsesID[] ocspResponses)
- {
- if (ocspResponses == null)
- throw new ArgumentNullException("ocspResponses");
-
- this.ocspResponses = new DerSequence(ocspResponses);
- }
-
- public OcspListID(
- IEnumerable ocspResponses)
- {
- if (ocspResponses == null)
- throw new ArgumentNullException("ocspResponses");
- if (!CollectionUtilities.CheckElementsAreOfType(ocspResponses, typeof(OcspResponsesID)))
- throw new ArgumentException("Must contain only 'OcspResponsesID' objects", "ocspResponses");
-
- this.ocspResponses = new DerSequence(
- Asn1EncodableVector.FromEnumerable(ocspResponses));
- }
-
- public OcspResponsesID[] GetOcspResponses()
- {
- OcspResponsesID[] result = new OcspResponsesID[ocspResponses.Count];
- for (int i = 0; i < ocspResponses.Count; ++i)
- {
- result[i] = OcspResponsesID.GetInstance(ocspResponses[i].ToAsn1Object());
- }
- return result;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(ocspResponses);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/OcspResponsesID.cs b/BCCrypto/src/asn1/esf/OcspResponsesID.cs
deleted file mode 100644
index 8718188..0000000
--- a/BCCrypto/src/asn1/esf/OcspResponsesID.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition
- ///
- /// OcspResponsesID ::= SEQUENCE {
- /// ocspIdentifier OcspIdentifier,
- /// ocspRepHash OtherHash OPTIONAL
- /// }
- ///
- ///
- public class OcspResponsesID
- : Asn1Encodable
- {
- private readonly OcspIdentifier ocspIdentifier;
- private readonly OtherHash ocspRepHash;
-
- public static OcspResponsesID GetInstance(
- object obj)
- {
- if (obj == null || obj is OcspResponsesID)
- return (OcspResponsesID) obj;
-
- if (obj is Asn1Sequence)
- return new OcspResponsesID((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'OcspResponsesID' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private OcspResponsesID(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count < 1 || seq.Count > 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.ocspIdentifier = OcspIdentifier.GetInstance(seq[0].ToAsn1Object());
-
- if (seq.Count > 1)
- {
- this.ocspRepHash = OtherHash.GetInstance(seq[1].ToAsn1Object());
- }
- }
-
- public OcspResponsesID(
- OcspIdentifier ocspIdentifier)
- : this(ocspIdentifier, null)
- {
- }
-
- public OcspResponsesID(
- OcspIdentifier ocspIdentifier,
- OtherHash ocspRepHash)
- {
- if (ocspIdentifier == null)
- throw new ArgumentNullException("ocspIdentifier");
-
- this.ocspIdentifier = ocspIdentifier;
- this.ocspRepHash = ocspRepHash;
- }
-
- public OcspIdentifier OcspIdentifier
- {
- get { return ocspIdentifier; }
- }
-
- public OtherHash OcspRepHash
- {
- get { return ocspRepHash; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- ocspIdentifier.ToAsn1Object());
-
- if (ocspRepHash != null)
- {
- v.Add(ocspRepHash.ToAsn1Object());
- }
-
- return new DerSequence(v);
- }
-
- }
-}
diff --git a/BCCrypto/src/asn1/esf/OtherCertID.cs b/BCCrypto/src/asn1/esf/OtherCertID.cs
deleted file mode 100644
index 19d173a..0000000
--- a/BCCrypto/src/asn1/esf/OtherCertID.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- ///
- /// OtherCertID ::= SEQUENCE {
- /// otherCertHash OtherHash,
- /// issuerSerial IssuerSerial OPTIONAL
- /// }
- ///
- ///
- public class OtherCertID
- : Asn1Encodable
- {
- private readonly OtherHash otherCertHash;
- private readonly IssuerSerial issuerSerial;
-
- public static OtherCertID GetInstance(
- object obj)
- {
- if (obj == null || obj is OtherCertID)
- return (OtherCertID) obj;
-
- if (obj is Asn1Sequence)
- return new OtherCertID((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'OtherCertID' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private OtherCertID(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count < 1 || seq.Count > 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.otherCertHash = OtherHash.GetInstance(seq[0].ToAsn1Object());
-
- if (seq.Count > 1)
- {
- this.issuerSerial = IssuerSerial.GetInstance(seq[1].ToAsn1Object());
- }
- }
-
- public OtherCertID(
- OtherHash otherCertHash)
- : this(otherCertHash, null)
- {
- }
-
- public OtherCertID(
- OtherHash otherCertHash,
- IssuerSerial issuerSerial)
- {
- if (otherCertHash == null)
- throw new ArgumentNullException("otherCertHash");
-
- this.otherCertHash = otherCertHash;
- this.issuerSerial = issuerSerial;
- }
-
- public OtherHash OtherCertHash
- {
- get { return otherCertHash; }
- }
-
- public IssuerSerial IssuerSerial
- {
- get { return issuerSerial; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- otherCertHash.ToAsn1Object());
-
- if (issuerSerial != null)
- {
- v.Add(issuerSerial.ToAsn1Object());
- }
-
- return new DerSequence(v);
- }
-
- }
-}
diff --git a/BCCrypto/src/asn1/esf/OtherHash.cs b/BCCrypto/src/asn1/esf/OtherHash.cs
deleted file mode 100644
index 2ee1624..0000000
--- a/BCCrypto/src/asn1/esf/OtherHash.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- ///
- /// OtherHash ::= CHOICE {
- /// sha1Hash OtherHashValue, -- This contains a SHA-1 hash
- /// otherHash OtherHashAlgAndValue
- /// }
- ///
- /// OtherHashValue ::= OCTET STRING
- ///
- ///
- public class OtherHash
- : Asn1Encodable, IAsn1Choice
- {
- private readonly Asn1OctetString sha1Hash;
- private readonly OtherHashAlgAndValue otherHash;
-
- public static OtherHash GetInstance(
- object obj)
- {
- if (obj == null || obj is OtherHash)
- return (OtherHash) obj;
-
- if (obj is Asn1OctetString)
- return new OtherHash((Asn1OctetString) obj);
-
- return new OtherHash(
- OtherHashAlgAndValue.GetInstance(obj));
- }
-
- public OtherHash(
- byte[] sha1Hash)
- {
- if (sha1Hash == null)
- throw new ArgumentNullException("sha1Hash");
-
- this.sha1Hash = new DerOctetString(sha1Hash);
- }
-
- public OtherHash(
- Asn1OctetString sha1Hash)
- {
- if (sha1Hash == null)
- throw new ArgumentNullException("sha1Hash");
-
- this.sha1Hash = sha1Hash;
- }
-
- public OtherHash(
- OtherHashAlgAndValue otherHash)
- {
- if (otherHash == null)
- throw new ArgumentNullException("otherHash");
-
- this.otherHash = otherHash;
- }
-
- public AlgorithmIdentifier HashAlgorithm
- {
- get
- {
- return otherHash == null
- ? new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1)
- : otherHash.HashAlgorithm;
- }
- }
-
- public byte[] GetHashValue()
- {
- return otherHash == null
- ? sha1Hash.GetOctets()
- : otherHash.GetHashValue();
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return otherHash == null
- ? sha1Hash
- : otherHash.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/OtherHashAlgAndValue.cs b/BCCrypto/src/asn1/esf/OtherHashAlgAndValue.cs
deleted file mode 100644
index 00eb24c..0000000
--- a/BCCrypto/src/asn1/esf/OtherHashAlgAndValue.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// Summary description for OtherHashAlgAndValue.
- ///
- ///
- ///
- /// OtherHashAlgAndValue ::= SEQUENCE {
- /// hashAlgorithm AlgorithmIdentifier,
- /// hashValue OtherHashValue
- /// }
- ///
- /// OtherHashValue ::= OCTET STRING
- ///
- ///
- public class OtherHashAlgAndValue
- : Asn1Encodable
- {
- private readonly AlgorithmIdentifier hashAlgorithm;
- private readonly Asn1OctetString hashValue;
-
- public static OtherHashAlgAndValue GetInstance(
- object obj)
- {
- if (obj == null || obj is OtherHashAlgAndValue)
- return (OtherHashAlgAndValue) obj;
-
- if (obj is Asn1Sequence)
- return new OtherHashAlgAndValue((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'OtherHashAlgAndValue' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private OtherHashAlgAndValue(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.hashAlgorithm = AlgorithmIdentifier.GetInstance(seq[0].ToAsn1Object());
- this.hashValue = (Asn1OctetString) seq[1].ToAsn1Object();
- }
-
- public OtherHashAlgAndValue(
- AlgorithmIdentifier hashAlgorithm,
- byte[] hashValue)
- {
- if (hashAlgorithm == null)
- throw new ArgumentNullException("hashAlgorithm");
- if (hashValue == null)
- throw new ArgumentNullException("hashValue");
-
- this.hashAlgorithm = hashAlgorithm;
- this.hashValue = new DerOctetString(hashValue);
- }
-
- public OtherHashAlgAndValue(
- AlgorithmIdentifier hashAlgorithm,
- Asn1OctetString hashValue)
- {
- if (hashAlgorithm == null)
- throw new ArgumentNullException("hashAlgorithm");
- if (hashValue == null)
- throw new ArgumentNullException("hashValue");
-
- this.hashAlgorithm = hashAlgorithm;
- this.hashValue = hashValue;
- }
-
- public AlgorithmIdentifier HashAlgorithm
- {
- get { return hashAlgorithm; }
- }
-
- public byte[] GetHashValue()
- {
- return hashValue.GetOctets();
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(hashAlgorithm, hashValue);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/OtherRevRefs.cs b/BCCrypto/src/asn1/esf/OtherRevRefs.cs
deleted file mode 100644
index 446031e..0000000
--- a/BCCrypto/src/asn1/esf/OtherRevRefs.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition
- ///
- /// OtherRevRefs ::= SEQUENCE
- /// {
- /// otherRevRefType OtherRevRefType,
- /// otherRevRefs ANY DEFINED BY otherRevRefType
- /// }
- ///
- /// OtherRevRefType ::= OBJECT IDENTIFIER
- ///
- ///
- public class OtherRevRefs
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier otherRevRefType;
- private readonly Asn1Object otherRevRefs;
-
- public static OtherRevRefs GetInstance(
- object obj)
- {
- if (obj == null || obj is OtherRevRefs)
- return (OtherRevRefs) obj;
-
- if (obj is Asn1Sequence)
- return new OtherRevRefs((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'OtherRevRefs' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private OtherRevRefs(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.otherRevRefType = (DerObjectIdentifier) seq[0].ToAsn1Object();
- this.otherRevRefs = seq[1].ToAsn1Object();
- }
-
- public OtherRevRefs(
- DerObjectIdentifier otherRevRefType,
- Asn1Encodable otherRevRefs)
- {
- if (otherRevRefType == null)
- throw new ArgumentNullException("otherRevRefType");
- if (otherRevRefs == null)
- throw new ArgumentNullException("otherRevRefs");
-
- this.otherRevRefType = otherRevRefType;
- this.otherRevRefs = otherRevRefs.ToAsn1Object();
- }
-
- public DerObjectIdentifier OtherRevRefType
- {
- get { return otherRevRefType; }
- }
-
- public Asn1Object OtherRevRefsObject
- {
- get { return otherRevRefs; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(otherRevRefType, otherRevRefs);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/OtherRevVals.cs b/BCCrypto/src/asn1/esf/OtherRevVals.cs
deleted file mode 100644
index 7b90456..0000000
--- a/BCCrypto/src/asn1/esf/OtherRevVals.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 3126: 4.3.2 Revocation Values Attribute Definition
- ///
- /// OtherRevVals ::= SEQUENCE
- /// {
- /// otherRevValType OtherRevValType,
- /// otherRevVals ANY DEFINED BY otherRevValType
- /// }
- ///
- /// OtherRevValType ::= OBJECT IDENTIFIER
- ///
- ///
- public class OtherRevVals
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier otherRevValType;
- private readonly Asn1Object otherRevVals;
-
- public static OtherRevVals GetInstance(
- object obj)
- {
- if (obj == null || obj is OtherRevVals)
- return (OtherRevVals) obj;
-
- if (obj is Asn1Sequence)
- return new OtherRevVals((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'OtherRevVals' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private OtherRevVals(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.otherRevValType = (DerObjectIdentifier) seq[0].ToAsn1Object();
- this.otherRevVals = seq[1].ToAsn1Object();
- }
-
- public OtherRevVals(
- DerObjectIdentifier otherRevValType,
- Asn1Encodable otherRevVals)
- {
- if (otherRevValType == null)
- throw new ArgumentNullException("otherRevValType");
- if (otherRevVals == null)
- throw new ArgumentNullException("otherRevVals");
-
- this.otherRevValType = otherRevValType;
- this.otherRevVals = otherRevVals.ToAsn1Object();
- }
-
- public DerObjectIdentifier OtherRevValType
- {
- get { return otherRevValType; }
- }
-
- public Asn1Object OtherRevValsObject
- {
- get { return otherRevVals; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(otherRevValType, otherRevVals);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/OtherSigningCertificate.cs b/BCCrypto/src/asn1/esf/OtherSigningCertificate.cs
deleted file mode 100644
index f7b9f5e..0000000
--- a/BCCrypto/src/asn1/esf/OtherSigningCertificate.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- ///
- /// OtherSigningCertificate ::= SEQUENCE {
- /// certs SEQUENCE OF OtherCertID,
- /// policies SEQUENCE OF PolicyInformation OPTIONAL
- /// }
- ///
- ///
- public class OtherSigningCertificate
- : Asn1Encodable
- {
- private readonly Asn1Sequence certs;
- private readonly Asn1Sequence policies;
-
- public static OtherSigningCertificate GetInstance(
- object obj)
- {
- if (obj == null || obj is OtherSigningCertificate)
- return (OtherSigningCertificate) obj;
-
- if (obj is Asn1Sequence)
- return new OtherSigningCertificate((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'OtherSigningCertificate' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private OtherSigningCertificate(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count < 1 || seq.Count > 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.certs = Asn1Sequence.GetInstance(seq[0].ToAsn1Object());
-
- if (seq.Count > 1)
- {
- this.policies = Asn1Sequence.GetInstance(seq[1].ToAsn1Object());
- }
- }
-
- public OtherSigningCertificate(
- params OtherCertID[] certs)
- : this(certs, null)
- {
- }
-
- public OtherSigningCertificate(
- OtherCertID[] certs,
- params PolicyInformation[] policies)
- {
- if (certs == null)
- throw new ArgumentNullException("certs");
-
- this.certs = new DerSequence(certs);
-
- if (policies != null)
- {
- this.policies = new DerSequence(policies);
- }
- }
-
- public OtherSigningCertificate(
- IEnumerable certs)
- : this(certs, null)
- {
- }
-
- public OtherSigningCertificate(
- IEnumerable certs,
- IEnumerable policies)
- {
- if (certs == null)
- throw new ArgumentNullException("certs");
- if (!CollectionUtilities.CheckElementsAreOfType(certs, typeof(OtherCertID)))
- throw new ArgumentException("Must contain only 'OtherCertID' objects", "certs");
-
- this.certs = new DerSequence(
- Asn1EncodableVector.FromEnumerable(certs));
-
- if (policies != null)
- {
- if (!CollectionUtilities.CheckElementsAreOfType(policies, typeof(PolicyInformation)))
- throw new ArgumentException("Must contain only 'PolicyInformation' objects", "policies");
-
- this.policies = new DerSequence(
- Asn1EncodableVector.FromEnumerable(policies));
- }
- }
-
- public OtherCertID[] GetCerts()
- {
- OtherCertID[] cs = new OtherCertID[certs.Count];
- for (int i = 0; i < certs.Count; ++i)
- {
- cs[i] = OtherCertID.GetInstance(certs[i].ToAsn1Object());
- }
- return cs;
- }
-
- public PolicyInformation[] GetPolicies()
- {
- if (policies == null)
- return null;
-
- PolicyInformation[] ps = new PolicyInformation[policies.Count];
- for (int i = 0; i < policies.Count; ++i)
- {
- ps[i] = PolicyInformation.GetInstance(policies[i].ToAsn1Object());
- }
- return ps;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(certs);
-
- if (policies != null)
- {
- v.Add(policies);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/RevocationValues.cs b/BCCrypto/src/asn1/esf/RevocationValues.cs
deleted file mode 100644
index a7b47b4..0000000
--- a/BCCrypto/src/asn1/esf/RevocationValues.cs
+++ /dev/null
@@ -1,165 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- /// RFC 5126: 6.3.4. revocation-values Attribute Definition
- ///
- /// RevocationValues ::= SEQUENCE {
- /// crlVals [0] SEQUENCE OF CertificateList OPTIONAL,
- /// ocspVals [1] SEQUENCE OF BasicOCSPResponse OPTIONAL,
- /// otherRevVals [2] OtherRevVals OPTIONAL
- /// }
- ///
- ///
- public class RevocationValues
- : Asn1Encodable
- {
- private readonly Asn1Sequence crlVals;
- private readonly Asn1Sequence ocspVals;
- private readonly OtherRevVals otherRevVals;
-
- public static RevocationValues GetInstance(
- object obj)
- {
- if (obj == null || obj is RevocationValues)
- return (RevocationValues) obj;
-
- return new RevocationValues(Asn1Sequence.GetInstance(obj));
- }
-
- private RevocationValues(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count > 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- foreach (Asn1TaggedObject taggedObj in seq)
- {
- Asn1Object asn1Obj = taggedObj.GetObject();
- switch (taggedObj.TagNo)
- {
- case 0:
- Asn1Sequence crlValsSeq = (Asn1Sequence) asn1Obj;
- foreach (Asn1Encodable ae in crlValsSeq)
- {
- CertificateList.GetInstance(ae.ToAsn1Object());
- }
- this.crlVals = crlValsSeq;
- break;
- case 1:
- Asn1Sequence ocspValsSeq = (Asn1Sequence) asn1Obj;
- foreach (Asn1Encodable ae in ocspValsSeq)
- {
- BasicOcspResponse.GetInstance(ae.ToAsn1Object());
- }
- this.ocspVals = ocspValsSeq;
- break;
- case 2:
- this.otherRevVals = OtherRevVals.GetInstance(asn1Obj);
- break;
- default:
- throw new ArgumentException("Illegal tag in RevocationValues", "seq");
- }
- }
- }
-
- public RevocationValues(
- CertificateList[] crlVals,
- BasicOcspResponse[] ocspVals,
- OtherRevVals otherRevVals)
- {
- if (crlVals != null)
- {
- this.crlVals = new DerSequence(crlVals);
- }
-
- if (ocspVals != null)
- {
- this.ocspVals = new DerSequence(ocspVals);
- }
-
- this.otherRevVals = otherRevVals;
- }
-
- public RevocationValues(
- IEnumerable crlVals,
- IEnumerable ocspVals,
- OtherRevVals otherRevVals)
- {
- if (crlVals != null)
- {
- if (!CollectionUtilities.CheckElementsAreOfType(crlVals, typeof(CertificateList)))
- throw new ArgumentException("Must contain only 'CertificateList' objects", "crlVals");
-
- this.crlVals = new DerSequence(
- Asn1EncodableVector.FromEnumerable(crlVals));
- }
-
- if (ocspVals != null)
- {
- if (!CollectionUtilities.CheckElementsAreOfType(ocspVals, typeof(BasicOcspResponse)))
- throw new ArgumentException("Must contain only 'BasicOcspResponse' objects", "ocspVals");
-
- this.ocspVals = new DerSequence(
- Asn1EncodableVector.FromEnumerable(ocspVals));
- }
-
- this.otherRevVals = otherRevVals;
- }
-
- public CertificateList[] GetCrlVals()
- {
- CertificateList[] result = new CertificateList[crlVals.Count];
- for (int i = 0; i < crlVals.Count; ++i)
- {
- result[i] = CertificateList.GetInstance(crlVals[i].ToAsn1Object());
- }
- return result;
- }
-
- public BasicOcspResponse[] GetOcspVals()
- {
- BasicOcspResponse[] result = new BasicOcspResponse[ocspVals.Count];
- for (int i = 0; i < ocspVals.Count; ++i)
- {
- result[i] = BasicOcspResponse.GetInstance(ocspVals[i].ToAsn1Object());
- }
- return result;
- }
-
- public OtherRevVals OtherRevVals
- {
- get { return otherRevVals; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (crlVals != null)
- {
- v.Add(new DerTaggedObject(true, 0, crlVals));
- }
-
- if (ocspVals != null)
- {
- v.Add(new DerTaggedObject(true, 1, ocspVals));
- }
-
- if (otherRevVals != null)
- {
- v.Add(new DerTaggedObject(true, 2, otherRevVals.ToAsn1Object()));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/SigPolicyQualifierInfo.cs b/BCCrypto/src/asn1/esf/SigPolicyQualifierInfo.cs
deleted file mode 100644
index 470c5c8..0000000
--- a/BCCrypto/src/asn1/esf/SigPolicyQualifierInfo.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- ///
- /// SigPolicyQualifierInfo ::= SEQUENCE {
- /// sigPolicyQualifierId SigPolicyQualifierId,
- /// sigQualifier ANY DEFINED BY sigPolicyQualifierId
- /// }
- ///
- /// SigPolicyQualifierId ::= OBJECT IDENTIFIER
- ///
- ///
- public class SigPolicyQualifierInfo
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier sigPolicyQualifierId;
- private readonly Asn1Object sigQualifier;
-
- public static SigPolicyQualifierInfo GetInstance(
- object obj)
- {
- if (obj == null || obj is SigPolicyQualifierInfo)
- return (SigPolicyQualifierInfo) obj;
-
- if (obj is Asn1Sequence)
- return new SigPolicyQualifierInfo((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'SigPolicyQualifierInfo' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private SigPolicyQualifierInfo(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.sigPolicyQualifierId = (DerObjectIdentifier) seq[0].ToAsn1Object();
- this.sigQualifier = seq[1].ToAsn1Object();
- }
-
- public SigPolicyQualifierInfo(
- DerObjectIdentifier sigPolicyQualifierId,
- Asn1Encodable sigQualifier)
- {
- this.sigPolicyQualifierId = sigPolicyQualifierId;
- this.sigQualifier = sigQualifier.ToAsn1Object();
- }
-
- public DerObjectIdentifier SigPolicyQualifierId
- {
- get { return sigPolicyQualifierId; }
- }
-
- public Asn1Object SigQualifier
- {
- get { return sigQualifier; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(sigPolicyQualifierId, sigQualifier);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/SignaturePolicyId.cs b/BCCrypto/src/asn1/esf/SignaturePolicyId.cs
deleted file mode 100644
index 7146bb4..0000000
--- a/BCCrypto/src/asn1/esf/SignaturePolicyId.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- ///
- /// SignaturePolicyId ::= SEQUENCE {
- /// sigPolicyIdentifier SigPolicyId,
- /// sigPolicyHash SigPolicyHash,
- /// sigPolicyQualifiers SEQUENCE SIZE (1..MAX) OF SigPolicyQualifierInfo OPTIONAL
- /// }
- ///
- /// SigPolicyId ::= OBJECT IDENTIFIER
- ///
- /// SigPolicyHash ::= OtherHashAlgAndValue
- ///
- ///
- public class SignaturePolicyId
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier sigPolicyIdentifier;
- private readonly OtherHashAlgAndValue sigPolicyHash;
- private readonly Asn1Sequence sigPolicyQualifiers;
-
- public static SignaturePolicyId GetInstance(
- object obj)
- {
- if (obj == null || obj is SignaturePolicyId)
- return (SignaturePolicyId) obj;
-
- if (obj is Asn1Sequence)
- return new SignaturePolicyId((Asn1Sequence) obj);
-
- throw new ArgumentException(
- "Unknown object in 'SignaturePolicyId' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private SignaturePolicyId(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
- if (seq.Count < 2 || seq.Count > 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.sigPolicyIdentifier = (DerObjectIdentifier) seq[0].ToAsn1Object();
- this.sigPolicyHash = OtherHashAlgAndValue.GetInstance(seq[1].ToAsn1Object());
-
- if (seq.Count > 2)
- {
- this.sigPolicyQualifiers = (Asn1Sequence) seq[2].ToAsn1Object();
- }
- }
-
- public SignaturePolicyId(
- DerObjectIdentifier sigPolicyIdentifier,
- OtherHashAlgAndValue sigPolicyHash)
- : this(sigPolicyIdentifier, sigPolicyHash, null)
- {
- }
-
- public SignaturePolicyId(
- DerObjectIdentifier sigPolicyIdentifier,
- OtherHashAlgAndValue sigPolicyHash,
- params SigPolicyQualifierInfo[] sigPolicyQualifiers)
- {
- if (sigPolicyIdentifier == null)
- throw new ArgumentNullException("sigPolicyIdentifier");
- if (sigPolicyHash == null)
- throw new ArgumentNullException("sigPolicyHash");
-
- this.sigPolicyIdentifier = sigPolicyIdentifier;
- this.sigPolicyHash = sigPolicyHash;
-
- if (sigPolicyQualifiers != null)
- {
- this.sigPolicyQualifiers = new DerSequence(sigPolicyQualifiers);
- }
- }
-
- public SignaturePolicyId(
- DerObjectIdentifier sigPolicyIdentifier,
- OtherHashAlgAndValue sigPolicyHash,
- IEnumerable sigPolicyQualifiers)
- {
- if (sigPolicyIdentifier == null)
- throw new ArgumentNullException("sigPolicyIdentifier");
- if (sigPolicyHash == null)
- throw new ArgumentNullException("sigPolicyHash");
-
- this.sigPolicyIdentifier = sigPolicyIdentifier;
- this.sigPolicyHash = sigPolicyHash;
-
- if (sigPolicyQualifiers != null)
- {
- if (!CollectionUtilities.CheckElementsAreOfType(sigPolicyQualifiers, typeof(SigPolicyQualifierInfo)))
- throw new ArgumentException("Must contain only 'SigPolicyQualifierInfo' objects", "sigPolicyQualifiers");
-
- this.sigPolicyQualifiers = new DerSequence(
- Asn1EncodableVector.FromEnumerable(sigPolicyQualifiers));
- }
- }
-
- public DerObjectIdentifier SigPolicyIdentifier
- {
- get { return sigPolicyIdentifier; }
- }
-
- public OtherHashAlgAndValue SigPolicyHash
- {
- get { return sigPolicyHash; }
- }
-
- public SigPolicyQualifierInfo[] GetSigPolicyQualifiers()
- {
- if (sigPolicyQualifiers == null)
- return null;
-
- SigPolicyQualifierInfo[] infos = new SigPolicyQualifierInfo[sigPolicyQualifiers.Count];
- for (int i = 0; i < sigPolicyQualifiers.Count; ++i)
- {
- infos[i] = SigPolicyQualifierInfo.GetInstance(sigPolicyQualifiers[i]);
- }
- return infos;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- sigPolicyIdentifier, sigPolicyHash.ToAsn1Object());
-
- if (sigPolicyQualifiers != null)
- {
- v.Add(sigPolicyQualifiers.ToAsn1Object());
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/SignaturePolicyIdentifier.cs b/BCCrypto/src/asn1/esf/SignaturePolicyIdentifier.cs
deleted file mode 100644
index 12257f2..0000000
--- a/BCCrypto/src/asn1/esf/SignaturePolicyIdentifier.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- ///
- ///
- /// SignaturePolicyIdentifier ::= CHOICE {
- /// SignaturePolicyId SignaturePolicyId,
- /// SignaturePolicyImplied SignaturePolicyImplied
- /// }
- ///
- /// SignaturePolicyImplied ::= NULL
- ///
- ///
- public class SignaturePolicyIdentifier
- : Asn1Encodable, IAsn1Choice
- {
- private readonly SignaturePolicyId sigPolicy;
-
- public static SignaturePolicyIdentifier GetInstance(
- object obj)
- {
- if (obj == null || obj is SignaturePolicyIdentifier)
- return (SignaturePolicyIdentifier) obj;
-
- if (obj is SignaturePolicyId)
- return new SignaturePolicyIdentifier((SignaturePolicyId) obj);
-
- if (obj is Asn1Null)
- return new SignaturePolicyIdentifier();
-
- throw new ArgumentException(
- "Unknown object in 'SignaturePolicyIdentifier' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- public SignaturePolicyIdentifier()
- {
- this.sigPolicy = null;
- }
-
- public SignaturePolicyIdentifier(
- SignaturePolicyId signaturePolicyId)
- {
- if (signaturePolicyId == null)
- throw new ArgumentNullException("signaturePolicyId");
-
- this.sigPolicy = signaturePolicyId;
- }
-
- public SignaturePolicyId SignaturePolicyId
- {
- get { return sigPolicy; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return sigPolicy == null
- ? DerNull.Instance
- : sigPolicy.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/SignerAttribute.cs b/BCCrypto/src/asn1/esf/SignerAttribute.cs
deleted file mode 100644
index 39bd910..0000000
--- a/BCCrypto/src/asn1/esf/SignerAttribute.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- public class SignerAttribute
- : Asn1Encodable
- {
- private Asn1Sequence claimedAttributes;
- private AttributeCertificate certifiedAttributes;
-
- public static SignerAttribute GetInstance(
- object obj)
- {
- if (obj == null || obj is SignerAttribute)
- return (SignerAttribute) obj;
-
- if (obj is Asn1Sequence)
- return new SignerAttribute(obj);
-
- throw new ArgumentException(
- "Unknown object in 'SignerAttribute' factory: "
- + Platform.GetTypeName(obj),
- "obj");
- }
-
- private SignerAttribute(
- object obj)
- {
- Asn1Sequence seq = (Asn1Sequence) obj;
- DerTaggedObject taggedObject = (DerTaggedObject) seq[0];
- if (taggedObject.TagNo == 0)
- {
- claimedAttributes = Asn1Sequence.GetInstance(taggedObject, true);
- }
- else if (taggedObject.TagNo == 1)
- {
- certifiedAttributes = AttributeCertificate.GetInstance(taggedObject);
- }
- else
- {
- throw new ArgumentException("illegal tag.", "obj");
- }
- }
-
- public SignerAttribute(
- Asn1Sequence claimedAttributes)
- {
- this.claimedAttributes = claimedAttributes;
- }
-
- public SignerAttribute(
- AttributeCertificate certifiedAttributes)
- {
- this.certifiedAttributes = certifiedAttributes;
- }
-
- public virtual Asn1Sequence ClaimedAttributes
- {
- get { return claimedAttributes; }
- }
-
- public virtual AttributeCertificate CertifiedAttributes
- {
- get { return certifiedAttributes; }
- }
-
- /**
- *
- *
- * SignerAttribute ::= SEQUENCE OF CHOICE {
- * claimedAttributes [0] ClaimedAttributes,
- * certifiedAttributes [1] CertifiedAttributes }
- *
- * ClaimedAttributes ::= SEQUENCE OF Attribute
- * CertifiedAttributes ::= AttributeCertificate -- as defined in RFC 3281: see clause 4.1.
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (claimedAttributes != null)
- {
- v.Add(new DerTaggedObject(0, claimedAttributes));
- }
- else
- {
- v.Add(new DerTaggedObject(1, certifiedAttributes));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/esf/SignerLocation.cs b/BCCrypto/src/asn1/esf/SignerLocation.cs
deleted file mode 100644
index d2cef51..0000000
--- a/BCCrypto/src/asn1/esf/SignerLocation.cs
+++ /dev/null
@@ -1,144 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Esf
-{
- /**
- * Signer-Location attribute (RFC3126).
- *
- *
- * SignerLocation ::= SEQUENCE {
- * countryName [0] DirectoryString OPTIONAL,
- * localityName [1] DirectoryString OPTIONAL,
- * postalAddress [2] PostalAddress OPTIONAL }
- *
- * PostalAddress ::= SEQUENCE SIZE(1..6) OF DirectoryString
- *
- */
- public class SignerLocation
- : Asn1Encodable
- {
- // TODO Should these be using DirectoryString?
- private DerUtf8String countryName;
- private DerUtf8String localityName;
- private Asn1Sequence postalAddress;
-
- public SignerLocation(
- Asn1Sequence seq)
- {
- foreach (Asn1TaggedObject obj in seq)
- {
- switch (obj.TagNo)
- {
- case 0:
- this.countryName = DerUtf8String.GetInstance(obj, true);
- break;
- case 1:
- this.localityName = DerUtf8String.GetInstance(obj, true);
- break;
- case 2:
- bool isExplicit = obj.IsExplicit(); // handle erroneous implicitly tagged sequences
- this.postalAddress = Asn1Sequence.GetInstance(obj, isExplicit);
- if (postalAddress != null && postalAddress.Count > 6)
- throw new ArgumentException("postal address must contain less than 6 strings");
- break;
- default:
- throw new ArgumentException("illegal tag");
- }
- }
- }
-
- public SignerLocation(
- DerUtf8String countryName,
- DerUtf8String localityName,
- Asn1Sequence postalAddress)
- {
- if (postalAddress != null && postalAddress.Count > 6)
- {
- throw new ArgumentException("postal address must contain less than 6 strings");
- }
-
- if (countryName != null)
- {
- this.countryName = DerUtf8String.GetInstance(countryName.ToAsn1Object());
- }
-
- if (localityName != null)
- {
- this.localityName = DerUtf8String.GetInstance(localityName.ToAsn1Object());
- }
-
- if (postalAddress != null)
- {
- this.postalAddress = (Asn1Sequence) postalAddress.ToAsn1Object();
- }
- }
-
- public static SignerLocation GetInstance(
- object obj)
- {
- if (obj == null || obj is SignerLocation)
- {
- return (SignerLocation) obj;
- }
-
- return new SignerLocation(Asn1Sequence.GetInstance(obj));
- }
-
- public DerUtf8String CountryName
- {
- get { return countryName; }
- }
-
- public DerUtf8String LocalityName
- {
- get { return localityName; }
- }
-
- public Asn1Sequence PostalAddress
- {
- get { return postalAddress; }
- }
-
- /**
- *
- * SignerLocation ::= SEQUENCE {
- * countryName [0] DirectoryString OPTIONAL,
- * localityName [1] DirectoryString OPTIONAL,
- * postalAddress [2] PostalAddress OPTIONAL }
- *
- * PostalAddress ::= SEQUENCE SIZE(1..6) OF DirectoryString
- *
- * DirectoryString ::= CHOICE {
- * teletexString TeletexString (SIZE (1..MAX)),
- * printableString PrintableString (SIZE (1..MAX)),
- * universalString UniversalString (SIZE (1..MAX)),
- * utf8String UTF8String (SIZE (1.. MAX)),
- * bmpString BMPString (SIZE (1..MAX)) }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (countryName != null)
- {
- v.Add(new DerTaggedObject(true, 0, countryName));
- }
-
- if (localityName != null)
- {
- v.Add(new DerTaggedObject(true, 1, localityName));
- }
-
- if (postalAddress != null)
- {
- v.Add(new DerTaggedObject(true, 2, postalAddress));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ess/ContentHints.cs b/BCCrypto/src/asn1/ess/ContentHints.cs
deleted file mode 100644
index cfd174b..0000000
--- a/BCCrypto/src/asn1/ess/ContentHints.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ess
-{
- public class ContentHints
- : Asn1Encodable
- {
- private readonly DerUtf8String contentDescription;
- private readonly DerObjectIdentifier contentType;
-
- public static ContentHints GetInstance(
- object o)
- {
- if (o == null || o is ContentHints)
- {
- return (ContentHints)o;
- }
-
- if (o is Asn1Sequence)
- {
- return new ContentHints((Asn1Sequence)o);
- }
-
- throw new ArgumentException("unknown object in 'ContentHints' factory : "
- + Platform.GetTypeName(o) + ".");
- }
-
- /**
- * constructor
- */
- private ContentHints(
- Asn1Sequence seq)
- {
- IAsn1Convertible field = seq[0];
- if (field.ToAsn1Object() is DerUtf8String)
- {
- contentDescription = DerUtf8String.GetInstance(field);
- contentType = DerObjectIdentifier.GetInstance(seq[1]);
- }
- else
- {
- contentType = DerObjectIdentifier.GetInstance(seq[0]);
- }
- }
-
- public ContentHints(
- DerObjectIdentifier contentType)
- {
- this.contentType = contentType;
- this.contentDescription = null;
- }
-
- public ContentHints(
- DerObjectIdentifier contentType,
- DerUtf8String contentDescription)
- {
- this.contentType = contentType;
- this.contentDescription = contentDescription;
- }
-
- public DerObjectIdentifier ContentType
- {
- get { return contentType; }
- }
-
- public DerUtf8String ContentDescription
- {
- get { return contentDescription; }
- }
-
- /**
- *
- * ContentHints ::= SEQUENCE {
- * contentDescription UTF8String (SIZE (1..MAX)) OPTIONAL,
- * contentType ContentType }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (contentDescription != null)
- {
- v.Add(contentDescription);
- }
-
- v.Add(contentType);
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ess/ContentIdentifier.cs b/BCCrypto/src/asn1/ess/ContentIdentifier.cs
deleted file mode 100644
index 430185e..0000000
--- a/BCCrypto/src/asn1/ess/ContentIdentifier.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ess
-{
- public class ContentIdentifier
- : Asn1Encodable
- {
- private Asn1OctetString value;
-
- public static ContentIdentifier GetInstance(
- object o)
- {
- if (o == null || o is ContentIdentifier)
- {
- return (ContentIdentifier) o;
- }
-
- if (o is Asn1OctetString)
- {
- return new ContentIdentifier((Asn1OctetString) o);
- }
-
- throw new ArgumentException(
- "unknown object in 'ContentIdentifier' factory : "
- + Platform.GetTypeName(o) + ".");
- }
-
- /**
- * Create from OCTET STRING whose octets represent the identifier.
- */
- public ContentIdentifier(
- Asn1OctetString value)
- {
- this.value = value;
- }
-
- /**
- * Create from byte array representing the identifier.
- */
- public ContentIdentifier(
- byte[] value)
- : this(new DerOctetString(value))
- {
- }
-
- public Asn1OctetString Value
- {
- get { return value; }
- }
-
- /**
- * The definition of ContentIdentifier is
- *
- * ContentIdentifier ::= OCTET STRING
- *
- * id-aa-contentIdentifier OBJECT IDENTIFIER ::= { iso(1)
- * member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9)
- * smime(16) id-aa(2) 7 }
- */
- public override Asn1Object ToAsn1Object()
- {
- return value;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ess/ESSCertID.cs b/BCCrypto/src/asn1/ess/ESSCertID.cs
deleted file mode 100644
index b4465ea..0000000
--- a/BCCrypto/src/asn1/ess/ESSCertID.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ess
-{
- public class EssCertID
- : Asn1Encodable
- {
- private Asn1OctetString certHash;
- private IssuerSerial issuerSerial;
-
- public static EssCertID GetInstance(
- object o)
- {
- if (o == null || o is EssCertID)
- {
- return (EssCertID) o;
- }
-
- if (o is Asn1Sequence)
- {
- return new EssCertID((Asn1Sequence) o);
- }
-
- throw new ArgumentException(
- "unknown object in 'EssCertID' factory : "
- + Platform.GetTypeName(o) + ".");
- }
-
- /**
- * constructor
- */
- public EssCertID(
- Asn1Sequence seq)
- {
- if (seq.Count < 1 || seq.Count > 2)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
-
- this.certHash = Asn1OctetString.GetInstance(seq[0]);
-
- if (seq.Count > 1)
- {
- issuerSerial = IssuerSerial.GetInstance(seq[1]);
- }
- }
-
- public EssCertID(
- byte[] hash)
- {
- certHash = new DerOctetString(hash);
- }
-
- public EssCertID(
- byte[] hash,
- IssuerSerial issuerSerial)
- {
- this.certHash = new DerOctetString(hash);
- this.issuerSerial = issuerSerial;
- }
-
- public byte[] GetCertHash()
- {
- return certHash.GetOctets();
- }
-
- public IssuerSerial IssuerSerial
- {
- get { return issuerSerial; }
- }
-
- /**
- *
- * EssCertID ::= SEQUENCE {
- * certHash Hash,
- * issuerSerial IssuerSerial OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(certHash);
-
- if (issuerSerial != null)
- {
- v.Add(issuerSerial);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ess/ESSCertIDv2.cs b/BCCrypto/src/asn1/ess/ESSCertIDv2.cs
deleted file mode 100644
index 35ce699..0000000
--- a/BCCrypto/src/asn1/ess/ESSCertIDv2.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ess
-{
- public class EssCertIDv2
- : Asn1Encodable
- {
- private readonly AlgorithmIdentifier hashAlgorithm;
- private readonly byte[] certHash;
- private readonly IssuerSerial issuerSerial;
-
- private static readonly AlgorithmIdentifier DefaultAlgID = new AlgorithmIdentifier(
- NistObjectIdentifiers.IdSha256);
-
- public static EssCertIDv2 GetInstance(object obj)
- {
- if (obj == null)
- return null;
- EssCertIDv2 existing = obj as EssCertIDv2;
- if (existing != null)
- return existing;
- return new EssCertIDv2(Asn1Sequence.GetInstance(obj));
- }
-
- private EssCertIDv2(
- Asn1Sequence seq)
- {
- if (seq.Count > 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- int count = 0;
-
- if (seq[0] is Asn1OctetString)
- {
- // Default value
- this.hashAlgorithm = DefaultAlgID;
- }
- else
- {
- this.hashAlgorithm = AlgorithmIdentifier.GetInstance(seq[count++].ToAsn1Object());
- }
-
- this.certHash = Asn1OctetString.GetInstance(seq[count++].ToAsn1Object()).GetOctets();
-
- if (seq.Count > count)
- {
- this.issuerSerial = IssuerSerial.GetInstance(
- Asn1Sequence.GetInstance(seq[count].ToAsn1Object()));
- }
- }
-
- public EssCertIDv2(byte[] certHash)
- : this(null, certHash, null)
- {
- }
-
- public EssCertIDv2(
- AlgorithmIdentifier algId,
- byte[] certHash)
- : this(algId, certHash, null)
- {
- }
-
- public EssCertIDv2(
- byte[] certHash,
- IssuerSerial issuerSerial)
- : this(null, certHash, issuerSerial)
- {
- }
-
- public EssCertIDv2(
- AlgorithmIdentifier algId,
- byte[] certHash,
- IssuerSerial issuerSerial)
- {
- if (algId == null)
- {
- // Default value
- this.hashAlgorithm = DefaultAlgID;
- }
- else
- {
- this.hashAlgorithm = algId;
- }
-
- this.certHash = certHash;
- this.issuerSerial = issuerSerial;
- }
-
- public AlgorithmIdentifier HashAlgorithm
- {
- get { return this.hashAlgorithm; }
- }
-
- public byte[] GetCertHash()
- {
- return Arrays.Clone(certHash);
- }
-
- public IssuerSerial IssuerSerial
- {
- get { return issuerSerial; }
- }
-
- /**
- *
- * EssCertIDv2 ::= SEQUENCE {
- * hashAlgorithm AlgorithmIdentifier
- * DEFAULT {algorithm id-sha256},
- * certHash Hash,
- * issuerSerial IssuerSerial OPTIONAL
- * }
- *
- * Hash ::= OCTET STRING
- *
- * IssuerSerial ::= SEQUENCE {
- * issuer GeneralNames,
- * serialNumber CertificateSerialNumber
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (!hashAlgorithm.Equals(DefaultAlgID))
- {
- v.Add(hashAlgorithm);
- }
-
- v.Add(new DerOctetString(certHash).ToAsn1Object());
-
- if (issuerSerial != null)
- {
- v.Add(issuerSerial);
- }
-
- return new DerSequence(v);
- }
-
- }
-}
diff --git a/BCCrypto/src/asn1/ess/OtherCertID.cs b/BCCrypto/src/asn1/ess/OtherCertID.cs
deleted file mode 100644
index 7794c81..0000000
--- a/BCCrypto/src/asn1/ess/OtherCertID.cs
+++ /dev/null
@@ -1,134 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ess
-{
- [Obsolete("Use version in Asn1.Esf instead")]
- public class OtherCertID
- : Asn1Encodable
- {
- private Asn1Encodable otherCertHash;
- private IssuerSerial issuerSerial;
-
- public static OtherCertID GetInstance(
- object o)
- {
- if (o == null || o is OtherCertID)
- {
- return (OtherCertID) o;
- }
-
- if (o is Asn1Sequence)
- {
- return new OtherCertID((Asn1Sequence) o);
- }
-
- throw new ArgumentException(
- "unknown object in 'OtherCertID' factory : "
- + Platform.GetTypeName(o) + ".");
- }
-
- /**
- * constructor
- */
- public OtherCertID(
- Asn1Sequence seq)
- {
- if (seq.Count < 1 || seq.Count > 2)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
-
- if (seq[0].ToAsn1Object() is Asn1OctetString)
- {
- otherCertHash = Asn1OctetString.GetInstance(seq[0]);
- }
- else
- {
- otherCertHash = DigestInfo.GetInstance(seq[0]);
- }
-
- if (seq.Count > 1)
- {
- issuerSerial = IssuerSerial.GetInstance(Asn1Sequence.GetInstance(seq[1]));
- }
- }
-
- public OtherCertID(
- AlgorithmIdentifier algId,
- byte[] digest)
- {
- this.otherCertHash = new DigestInfo(algId, digest);
- }
-
- public OtherCertID(
- AlgorithmIdentifier algId,
- byte[] digest,
- IssuerSerial issuerSerial)
- {
- this.otherCertHash = new DigestInfo(algId, digest);
- this.issuerSerial = issuerSerial;
- }
-
- public AlgorithmIdentifier AlgorithmHash
- {
- get
- {
- if (otherCertHash.ToAsn1Object() is Asn1OctetString)
- {
- // SHA-1
- return new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1);
- }
-
- return DigestInfo.GetInstance(otherCertHash).AlgorithmID;
- }
- }
-
- public byte[] GetCertHash()
- {
- if (otherCertHash.ToAsn1Object() is Asn1OctetString)
- {
- // SHA-1
- return ((Asn1OctetString) otherCertHash.ToAsn1Object()).GetOctets();
- }
-
- return DigestInfo.GetInstance(otherCertHash).GetDigest();
- }
-
- public IssuerSerial IssuerSerial
- {
- get { return issuerSerial; }
- }
-
- /**
- *
- * OtherCertID ::= SEQUENCE {
- * otherCertHash OtherHash,
- * issuerSerial IssuerSerial OPTIONAL }
- *
- * OtherHash ::= CHOICE {
- * sha1Hash OCTET STRING,
- * otherHash OtherHashAlgAndValue }
- *
- * OtherHashAlgAndValue ::= SEQUENCE {
- * hashAlgorithm AlgorithmIdentifier,
- * hashValue OCTET STRING }
- *
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(otherCertHash);
-
- if (issuerSerial != null)
- {
- v.Add(issuerSerial);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ess/OtherSigningCertificate.cs b/BCCrypto/src/asn1/ess/OtherSigningCertificate.cs
deleted file mode 100644
index 6cef92b..0000000
--- a/BCCrypto/src/asn1/ess/OtherSigningCertificate.cs
+++ /dev/null
@@ -1,110 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ess
-{
- [Obsolete("Use version in Asn1.Esf instead")]
- public class OtherSigningCertificate
- : Asn1Encodable
- {
- private Asn1Sequence certs, policies;
-
- public static OtherSigningCertificate GetInstance(
- object o)
- {
- if (o == null || o is OtherSigningCertificate)
- {
- return (OtherSigningCertificate) o;
- }
-
- if (o is Asn1Sequence)
- {
- return new OtherSigningCertificate((Asn1Sequence) o);
- }
-
- throw new ArgumentException(
- "unknown object in 'OtherSigningCertificate' factory : "
- + Platform.GetTypeName(o) + ".");
- }
-
- /**
- * constructors
- */
- public OtherSigningCertificate(
- Asn1Sequence seq)
- {
- if (seq.Count < 1 || seq.Count > 2)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
-
- this.certs = Asn1Sequence.GetInstance(seq[0]);
-
- if (seq.Count > 1)
- {
- this.policies = Asn1Sequence.GetInstance(seq[1]);
- }
- }
-
- public OtherSigningCertificate(
- OtherCertID otherCertID)
- {
- certs = new DerSequence(otherCertID);
- }
-
- public OtherCertID[] GetCerts()
- {
- OtherCertID[] cs = new OtherCertID[certs.Count];
-
- for (int i = 0; i != certs.Count; ++i)
- {
- cs[i] = OtherCertID.GetInstance(certs[i]);
- }
-
- return cs;
- }
-
- public PolicyInformation[] GetPolicies()
- {
- if (policies == null)
- {
- return null;
- }
-
- PolicyInformation[] ps = new PolicyInformation[policies.Count];
-
- for (int i = 0; i != policies.Count; i++)
- {
- ps[i] = PolicyInformation.GetInstance(policies[i]);
- }
-
- return ps;
- }
-
- /**
- * The definition of OtherSigningCertificate is
- *
- * OtherSigningCertificate ::= SEQUENCE {
- * certs SEQUENCE OF OtherCertID,
- * policies SEQUENCE OF PolicyInformation OPTIONAL
- * }
- *
- * id-aa-ets-otherSigCert OBJECT IDENTIFIER ::= { iso(1)
- * member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9)
- * smime(16) id-aa(2) 19 }
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(certs);
-
- if (policies != null)
- {
- v.Add(policies);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ess/SigningCertificate.cs b/BCCrypto/src/asn1/ess/SigningCertificate.cs
deleted file mode 100644
index 51f67c1..0000000
--- a/BCCrypto/src/asn1/ess/SigningCertificate.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ess
-{
- public class SigningCertificate
- : Asn1Encodable
- {
- private Asn1Sequence certs, policies;
-
- public static SigningCertificate GetInstance(
- object o)
- {
- if (o == null || o is SigningCertificate)
- {
- return (SigningCertificate) o;
- }
-
- if (o is Asn1Sequence)
- {
- return new SigningCertificate((Asn1Sequence) o);
- }
-
- throw new ArgumentException(
- "unknown object in 'SigningCertificate' factory : "
- + Platform.GetTypeName(o) + ".");
- }
-
- /**
- * constructors
- */
- public SigningCertificate(
- Asn1Sequence seq)
- {
- if (seq.Count < 1 || seq.Count > 2)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
-
- this.certs = Asn1Sequence.GetInstance(seq[0]);
-
- if (seq.Count > 1)
- {
- this.policies = Asn1Sequence.GetInstance(seq[1]);
- }
- }
-
- public SigningCertificate(
- EssCertID essCertID)
- {
- certs = new DerSequence(essCertID);
- }
-
- public EssCertID[] GetCerts()
- {
- EssCertID[] cs = new EssCertID[certs.Count];
-
- for (int i = 0; i != certs.Count; i++)
- {
- cs[i] = EssCertID.GetInstance(certs[i]);
- }
-
- return cs;
- }
-
- public PolicyInformation[] GetPolicies()
- {
- if (policies == null)
- {
- return null;
- }
-
- PolicyInformation[] ps = new PolicyInformation[policies.Count];
-
- for (int i = 0; i != policies.Count; i++)
- {
- ps[i] = PolicyInformation.GetInstance(policies[i]);
- }
-
- return ps;
- }
-
- /**
- * The definition of SigningCertificate is
- *
- * SigningCertificate ::= SEQUENCE {
- * certs SEQUENCE OF EssCertID,
- * policies SEQUENCE OF PolicyInformation OPTIONAL
- * }
- *
- * id-aa-signingCertificate OBJECT IDENTIFIER ::= { iso(1)
- * member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9)
- * smime(16) id-aa(2) 12 }
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(certs);
-
- if (policies != null)
- {
- v.Add(policies);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ess/SigningCertificateV2.cs b/BCCrypto/src/asn1/ess/SigningCertificateV2.cs
deleted file mode 100644
index 91eda9e..0000000
--- a/BCCrypto/src/asn1/ess/SigningCertificateV2.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ess
-{
- public class SigningCertificateV2
- : Asn1Encodable
- {
- private readonly Asn1Sequence certs;
- private readonly Asn1Sequence policies;
-
- public static SigningCertificateV2 GetInstance(
- object o)
- {
- if (o == null || o is SigningCertificateV2)
- return (SigningCertificateV2) o;
-
- if (o is Asn1Sequence)
- return new SigningCertificateV2((Asn1Sequence) o);
-
- throw new ArgumentException(
- "unknown object in 'SigningCertificateV2' factory : "
- + Platform.GetTypeName(o) + ".");
- }
-
- private SigningCertificateV2(
- Asn1Sequence seq)
- {
- if (seq.Count < 1 || seq.Count > 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.certs = Asn1Sequence.GetInstance(seq[0].ToAsn1Object());
-
- if (seq.Count > 1)
- {
- this.policies = Asn1Sequence.GetInstance(seq[1].ToAsn1Object());
- }
- }
-
- public SigningCertificateV2(
- EssCertIDv2 cert)
- {
- this.certs = new DerSequence(cert);
- }
-
- public SigningCertificateV2(
- EssCertIDv2[] certs)
- {
- this.certs = new DerSequence(certs);
- }
-
- public SigningCertificateV2(
- EssCertIDv2[] certs,
- PolicyInformation[] policies)
- {
- this.certs = new DerSequence(certs);
-
- if (policies != null)
- {
- this.policies = new DerSequence(policies);
- }
- }
-
- public EssCertIDv2[] GetCerts()
- {
- EssCertIDv2[] certIds = new EssCertIDv2[certs.Count];
- for (int i = 0; i != certs.Count; i++)
- {
- certIds[i] = EssCertIDv2.GetInstance(certs[i]);
- }
- return certIds;
- }
-
- public PolicyInformation[] GetPolicies()
- {
- if (policies == null)
- return null;
-
- PolicyInformation[] policyInformations = new PolicyInformation[policies.Count];
- for (int i = 0; i != policies.Count; i++)
- {
- policyInformations[i] = PolicyInformation.GetInstance(policies[i]);
- }
- return policyInformations;
- }
-
- /**
- * The definition of SigningCertificateV2 is
- *
- * SigningCertificateV2 ::= SEQUENCE {
- * certs SEQUENCE OF EssCertIDv2,
- * policies SEQUENCE OF PolicyInformation OPTIONAL
- * }
- *
- * id-aa-signingCertificateV2 OBJECT IDENTIFIER ::= { iso(1)
- * member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9)
- * smime(16) id-aa(2) 47 }
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(certs);
-
- if (policies != null)
- {
- v.Add(policies);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/gm/GMNamedCurves.cs b/BCCrypto/src/asn1/gm/GMNamedCurves.cs
deleted file mode 100644
index e2ec6d8..0000000
--- a/BCCrypto/src/asn1/gm/GMNamedCurves.cs
+++ /dev/null
@@ -1,157 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Math.EC.Endo;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Asn1.GM
-{
- public sealed class GMNamedCurves
- {
- private GMNamedCurves()
- {
- }
-
- private static ECCurve ConfigureCurve(ECCurve curve)
- {
- return curve;
- }
-
- private static BigInteger FromHex(string hex)
- {
- return new BigInteger(1, Hex.Decode(hex));
- }
-
- /*
- * sm2p256v1
- */
- internal class SM2P256V1Holder
- : X9ECParametersHolder
- {
- private SM2P256V1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new SM2P256V1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger p = FromHex("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF");
- BigInteger a = FromHex("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC");
- BigInteger b = FromHex("28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93");
- byte[] S = null;
- BigInteger n = FromHex("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123");
- BigInteger h = BigInteger.One;
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7"
- + "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * wapip192v1
- */
- internal class WapiP192V1Holder
- : X9ECParametersHolder
- {
- private WapiP192V1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new WapiP192V1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger p = FromHex("BDB6F4FE3E8B1D9E0DA8C0D46F4C318CEFE4AFE3B6B8551F");
- BigInteger a = FromHex("BB8E5E8FBC115E139FE6A814FE48AAA6F0ADA1AA5DF91985");
- BigInteger b = FromHex("1854BEBDC31B21B7AEFC80AB0ECD10D5B1B3308E6DBF11C1");
- byte[] S = null;
- BigInteger n = FromHex("BDB6F4FE3E8B1D9E0DA8C0D40FC962195DFAE76F56564677");
- BigInteger h = BigInteger.One;
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "4AD5F7048DE709AD51236DE6" + "5E4D4B482C836DC6E4106640"
- + "02BB3A02D4AAADACAE24817A" + "4CA3A1B014B5270432DB27D2"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
-
- private static readonly IDictionary objIds = Platform.CreateHashtable();
- private static readonly IDictionary curves = Platform.CreateHashtable();
- private static readonly IDictionary names = Platform.CreateHashtable();
-
- private static void DefineCurve(
- string name,
- DerObjectIdentifier oid,
- X9ECParametersHolder holder)
- {
- objIds.Add(Platform.ToUpperInvariant(name), oid);
- names.Add(oid, name);
- curves.Add(oid, holder);
- }
-
- static GMNamedCurves()
- {
- DefineCurve("wapip192v1", GMObjectIdentifiers.wapip192v1, WapiP192V1Holder.Instance);
- DefineCurve("sm2p256v1", GMObjectIdentifiers.sm2p256v1, SM2P256V1Holder.Instance);
- }
-
- public static X9ECParameters GetByName(
- string name)
- {
- DerObjectIdentifier oid = GetOid(name);
- return oid == null ? null : GetByOid(oid);
- }
-
- /**
- * return the X9ECParameters object for the named curve represented by
- * the passed in object identifier. Null if the curve isn't present.
- *
- * @param oid an object identifier representing a named curve, if present.
- */
- public static X9ECParameters GetByOid(
- DerObjectIdentifier oid)
- {
- X9ECParametersHolder holder = (X9ECParametersHolder)curves[oid];
- return holder == null ? null : holder.Parameters;
- }
-
- /**
- * return the object identifier signified by the passed in name. Null
- * if there is no object identifier associated with name.
- *
- * @return the object identifier associated with name, if present.
- */
- public static DerObjectIdentifier GetOid(
- string name)
- {
- return (DerObjectIdentifier)objIds[Platform.ToUpperInvariant(name)];
- }
-
- /**
- * return the named curve name represented by the given object identifier.
- */
- public static string GetName(
- DerObjectIdentifier oid)
- {
- return (string)names[oid];
- }
-
- /**
- * returns an enumeration containing the name strings for curves
- * contained in this structure.
- */
- public static IEnumerable Names
- {
- get { return new EnumerableProxy(names.Values); }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/gm/GMObjectIdentifiers.cs b/BCCrypto/src/asn1/gm/GMObjectIdentifiers.cs
deleted file mode 100644
index edb3a41..0000000
--- a/BCCrypto/src/asn1/gm/GMObjectIdentifiers.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.GM
-{
- public abstract class GMObjectIdentifiers
- {
- public static readonly DerObjectIdentifier sm_scheme = new DerObjectIdentifier("1.2.156.10197.1");
-
- public static readonly DerObjectIdentifier sm6_ecb = sm_scheme.Branch("101.1");
- public static readonly DerObjectIdentifier sm6_cbc = sm_scheme.Branch("101.2");
- public static readonly DerObjectIdentifier sm6_ofb128 = sm_scheme.Branch("101.3");
- public static readonly DerObjectIdentifier sm6_cfb128 = sm_scheme.Branch("101.4");
-
- public static readonly DerObjectIdentifier sm1_ecb = sm_scheme.Branch("102.1");
- public static readonly DerObjectIdentifier sm1_cbc = sm_scheme.Branch("102.2");
- public static readonly DerObjectIdentifier sm1_ofb128 = sm_scheme.Branch("102.3");
- public static readonly DerObjectIdentifier sm1_cfb128 = sm_scheme.Branch("102.4");
- public static readonly DerObjectIdentifier sm1_cfb1 = sm_scheme.Branch("102.5");
- public static readonly DerObjectIdentifier sm1_cfb8 = sm_scheme.Branch("102.6");
-
- public static readonly DerObjectIdentifier ssf33_ecb = sm_scheme.Branch("103.1");
- public static readonly DerObjectIdentifier ssf33_cbc = sm_scheme.Branch("103.2");
- public static readonly DerObjectIdentifier ssf33_ofb128 = sm_scheme.Branch("103.3");
- public static readonly DerObjectIdentifier ssf33_cfb128 = sm_scheme.Branch("103.4");
- public static readonly DerObjectIdentifier ssf33_cfb1 = sm_scheme.Branch("103.5");
- public static readonly DerObjectIdentifier ssf33_cfb8 = sm_scheme.Branch("103.6");
-
- public static readonly DerObjectIdentifier sms4_ecb = sm_scheme.Branch("104.1");
- public static readonly DerObjectIdentifier sms4_cbc = sm_scheme.Branch("104.2");
- public static readonly DerObjectIdentifier sms4_ofb128 = sm_scheme.Branch("104.3");
- public static readonly DerObjectIdentifier sms4_cfb128 = sm_scheme.Branch("104.4");
- public static readonly DerObjectIdentifier sms4_cfb1 = sm_scheme.Branch("104.5");
- public static readonly DerObjectIdentifier sms4_cfb8 = sm_scheme.Branch("104.6");
- public static readonly DerObjectIdentifier sms4_ctr = sm_scheme.Branch("104.7");
- public static readonly DerObjectIdentifier sms4_gcm = sm_scheme.Branch("104.8");
- public static readonly DerObjectIdentifier sms4_ccm = sm_scheme.Branch("104.9");
- public static readonly DerObjectIdentifier sms4_xts = sm_scheme.Branch("104.10");
- public static readonly DerObjectIdentifier sms4_wrap = sm_scheme.Branch("104.11");
- public static readonly DerObjectIdentifier sms4_wrap_pad = sm_scheme.Branch("104.12");
- public static readonly DerObjectIdentifier sms4_ocb = sm_scheme.Branch("104.100");
-
- public static readonly DerObjectIdentifier sm5 = sm_scheme.Branch("201");
-
- public static readonly DerObjectIdentifier sm2p256v1 = sm_scheme.Branch("301");
- public static readonly DerObjectIdentifier sm2sign = sm_scheme.Branch("301.1");
- public static readonly DerObjectIdentifier sm2exchange = sm_scheme.Branch("301.2");
- public static readonly DerObjectIdentifier sm2encrypt = sm_scheme.Branch("301.3");
-
- public static readonly DerObjectIdentifier wapip192v1 = sm_scheme.Branch("301.101");
-
- public static readonly DerObjectIdentifier sm2encrypt_recommendedParameters = sm2encrypt.Branch("1");
- public static readonly DerObjectIdentifier sm2encrypt_specifiedParameters = sm2encrypt.Branch("2");
- public static readonly DerObjectIdentifier sm2encrypt_with_sm3 = sm2encrypt.Branch("2.1");
- public static readonly DerObjectIdentifier sm2encrypt_with_sha1 = sm2encrypt.Branch("2.2");
- public static readonly DerObjectIdentifier sm2encrypt_with_sha224 = sm2encrypt.Branch("2.3");
- public static readonly DerObjectIdentifier sm2encrypt_with_sha256 = sm2encrypt.Branch("2.4");
- public static readonly DerObjectIdentifier sm2encrypt_with_sha384 = sm2encrypt.Branch("2.5");
- public static readonly DerObjectIdentifier sm2encrypt_with_sha512 = sm2encrypt.Branch("2.6");
- public static readonly DerObjectIdentifier sm2encrypt_with_rmd160 = sm2encrypt.Branch("2.7");
- public static readonly DerObjectIdentifier sm2encrypt_with_whirlpool = sm2encrypt.Branch("2.8");
- public static readonly DerObjectIdentifier sm2encrypt_with_blake2b512 = sm2encrypt.Branch("2.9");
- public static readonly DerObjectIdentifier sm2encrypt_with_blake2s256 = sm2encrypt.Branch("2.10");
- public static readonly DerObjectIdentifier sm2encrypt_with_md5 = sm2encrypt.Branch("2.11");
-
- public static readonly DerObjectIdentifier id_sm9PublicKey = sm_scheme.Branch("302");
- public static readonly DerObjectIdentifier sm9sign = sm_scheme.Branch("302.1");
- public static readonly DerObjectIdentifier sm9keyagreement = sm_scheme.Branch("302.2");
- public static readonly DerObjectIdentifier sm9encrypt = sm_scheme.Branch("302.3");
-
- public static readonly DerObjectIdentifier sm3 = sm_scheme.Branch("401");
-
- public static readonly DerObjectIdentifier hmac_sm3 = sm3.Branch("2");
-
- public static readonly DerObjectIdentifier sm2sign_with_sm3 = sm_scheme.Branch("501");
- public static readonly DerObjectIdentifier sm2sign_with_sha1 = sm_scheme.Branch("502");
- public static readonly DerObjectIdentifier sm2sign_with_sha256 = sm_scheme.Branch("503");
- public static readonly DerObjectIdentifier sm2sign_with_sha512 = sm_scheme.Branch("504");
- public static readonly DerObjectIdentifier sm2sign_with_sha224 = sm_scheme.Branch("505");
- public static readonly DerObjectIdentifier sm2sign_with_sha384 = sm_scheme.Branch("506");
- public static readonly DerObjectIdentifier sm2sign_with_rmd160 = sm_scheme.Branch("507");
- public static readonly DerObjectIdentifier sm2sign_with_whirlpool = sm_scheme.Branch("520");
- public static readonly DerObjectIdentifier sm2sign_with_blake2b512 = sm_scheme.Branch("521");
- public static readonly DerObjectIdentifier sm2sign_with_blake2s256 = sm_scheme.Branch("522");
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/asn1/gnu/GNUObjectIdentifiers.cs b/BCCrypto/src/asn1/gnu/GNUObjectIdentifiers.cs
deleted file mode 100644
index b322ef2..0000000
--- a/BCCrypto/src/asn1/gnu/GNUObjectIdentifiers.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Gnu
-{
- public abstract class GnuObjectIdentifiers
- {
- public static readonly DerObjectIdentifier Gnu = new DerObjectIdentifier("1.3.6.1.4.1.11591.1"); // GNU Radius
- public static readonly DerObjectIdentifier GnuPG = new DerObjectIdentifier("1.3.6.1.4.1.11591.2"); // GnuPG (Ägypten)
- public static readonly DerObjectIdentifier Notation = new DerObjectIdentifier("1.3.6.1.4.1.11591.2.1"); // notation
- public static readonly DerObjectIdentifier PkaAddress = new DerObjectIdentifier("1.3.6.1.4.1.11591.2.1.1"); // pkaAddress
- public static readonly DerObjectIdentifier GnuRadar = new DerObjectIdentifier("1.3.6.1.4.1.11591.3"); // GNU Radar
- public static readonly DerObjectIdentifier DigestAlgorithm = new DerObjectIdentifier("1.3.6.1.4.1.11591.12"); // digestAlgorithm
- public static readonly DerObjectIdentifier Tiger192 = new DerObjectIdentifier("1.3.6.1.4.1.11591.12.2"); // TIGER/192
- public static readonly DerObjectIdentifier EncryptionAlgorithm = new DerObjectIdentifier("1.3.6.1.4.1.11591.13"); // encryptionAlgorithm
- public static readonly DerObjectIdentifier Serpent = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2"); // Serpent
- public static readonly DerObjectIdentifier Serpent128Ecb = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2.1"); // Serpent-128-ECB
- public static readonly DerObjectIdentifier Serpent128Cbc = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2.2"); // Serpent-128-CBC
- public static readonly DerObjectIdentifier Serpent128Ofb = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2.3"); // Serpent-128-OFB
- public static readonly DerObjectIdentifier Serpent128Cfb = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2.4"); // Serpent-128-CFB
- public static readonly DerObjectIdentifier Serpent192Ecb = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2.21"); // Serpent-192-ECB
- public static readonly DerObjectIdentifier Serpent192Cbc = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2.22"); // Serpent-192-CBC
- public static readonly DerObjectIdentifier Serpent192Ofb = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2.23"); // Serpent-192-OFB
- public static readonly DerObjectIdentifier Serpent192Cfb = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2.24"); // Serpent-192-CFB
- public static readonly DerObjectIdentifier Serpent256Ecb = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2.41"); // Serpent-256-ECB
- public static readonly DerObjectIdentifier Serpent256Cbc = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2.42"); // Serpent-256-CBC
- public static readonly DerObjectIdentifier Serpent256Ofb = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2.43"); // Serpent-256-OFB
- public static readonly DerObjectIdentifier Serpent256Cfb = new DerObjectIdentifier("1.3.6.1.4.1.11591.13.2.44"); // Serpent-256-CFB
- public static readonly DerObjectIdentifier Crc = new DerObjectIdentifier("1.3.6.1.4.1.11591.14"); // CRC algorithms
- public static readonly DerObjectIdentifier Crc32 = new DerObjectIdentifier("1.3.6.1.4.1.11591.14.1"); // CRC 32
-
- /** 1.3.6.1.4.1.11591.15 - ellipticCurve */
- public static readonly DerObjectIdentifier EllipticCurve = new DerObjectIdentifier("1.3.6.1.4.1.11591.15");
-
- public static readonly DerObjectIdentifier Ed25519 = EllipticCurve.Branch("1");
- }
-}
diff --git a/BCCrypto/src/asn1/iana/IANAObjectIdentifiers.cs b/BCCrypto/src/asn1/iana/IANAObjectIdentifiers.cs
deleted file mode 100644
index 63343f5..0000000
--- a/BCCrypto/src/asn1/iana/IANAObjectIdentifiers.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-namespace Org.BouncyCastle.Asn1.Iana
-{
- public abstract class IanaObjectIdentifiers
- {
- // id-SHA1 OBJECT IDENTIFIER ::=
- // {iso(1) identified-organization(3) dod(6) internet(1) security(5) mechanisms(5) ipsec(8) isakmpOakley(1)}
- //
-
- public static readonly DerObjectIdentifier IsakmpOakley = new DerObjectIdentifier("1.3.6.1.5.5.8.1");
-
- public static readonly DerObjectIdentifier HmacMD5 = new DerObjectIdentifier(IsakmpOakley + ".1");
- public static readonly DerObjectIdentifier HmacSha1 = new DerObjectIdentifier(IsakmpOakley + ".2");
-
- public static readonly DerObjectIdentifier HmacTiger = new DerObjectIdentifier(IsakmpOakley + ".3");
-
- public static readonly DerObjectIdentifier HmacRipeMD160 = new DerObjectIdentifier(IsakmpOakley + ".4");
- }
-}
diff --git a/BCCrypto/src/asn1/icao/CscaMasterList.cs b/BCCrypto/src/asn1/icao/CscaMasterList.cs
deleted file mode 100644
index 6890d8a..0000000
--- a/BCCrypto/src/asn1/icao/CscaMasterList.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Icao
-{
- /**
- * The CscaMasterList object. This object can be wrapped in a
- * CMSSignedData to be published in LDAP.
- *
- *
- * CscaMasterList ::= SEQUENCE {
- * version CscaMasterListVersion,
- * certList SET OF Certificate }
- *
- * CscaMasterListVersion :: INTEGER {v0(0)}
- *
- */
- public class CscaMasterList
- : Asn1Encodable
- {
- private DerInteger version = new DerInteger(0);
- private X509CertificateStructure[] certList;
-
- public static CscaMasterList GetInstance(
- object obj)
- {
- if (obj is CscaMasterList)
- return (CscaMasterList)obj;
-
- if (obj != null)
- return new CscaMasterList(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- private CscaMasterList(
- Asn1Sequence seq)
- {
- if (seq == null || seq.Count == 0)
- throw new ArgumentException("null or empty sequence passed.");
-
- if (seq.Count != 2)
- throw new ArgumentException("Incorrect sequence size: " + seq.Count);
-
- this.version = DerInteger.GetInstance(seq[0]);
-
- Asn1Set certSet = Asn1Set.GetInstance(seq[1]);
-
- this.certList = new X509CertificateStructure[certSet.Count];
- for (int i = 0; i < certList.Length; i++)
- {
- certList[i] = X509CertificateStructure.GetInstance(certSet[i]);
- }
- }
-
- public CscaMasterList(
- X509CertificateStructure[] certStructs)
- {
- certList = CopyCertList(certStructs);
- }
-
- public virtual int Version
- {
- get { return version.Value.IntValue; }
- }
-
- public X509CertificateStructure[] GetCertStructs()
- {
- return CopyCertList(certList);
- }
-
- private static X509CertificateStructure[] CopyCertList(X509CertificateStructure[] orig)
- {
- return (X509CertificateStructure[])orig.Clone();
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(version, new DerSet(certList));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/icao/DataGroupHash.cs b/BCCrypto/src/asn1/icao/DataGroupHash.cs
deleted file mode 100644
index e0d7eee..0000000
--- a/BCCrypto/src/asn1/icao/DataGroupHash.cs
+++ /dev/null
@@ -1,86 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Icao
-{
- /**
- * The DataGroupHash object.
- *
- * DataGroupHash ::= SEQUENCE {
- * dataGroupNumber DataGroupNumber,
- * dataGroupHashValue OCTET STRING }
- *
- * DataGroupNumber ::= INTEGER {
- * dataGroup1 (1),
- * dataGroup1 (2),
- * dataGroup1 (3),
- * dataGroup1 (4),
- * dataGroup1 (5),
- * dataGroup1 (6),
- * dataGroup1 (7),
- * dataGroup1 (8),
- * dataGroup1 (9),
- * dataGroup1 (10),
- * dataGroup1 (11),
- * dataGroup1 (12),
- * dataGroup1 (13),
- * dataGroup1 (14),
- * dataGroup1 (15),
- * dataGroup1 (16) }
- *
- *
- */
- public class DataGroupHash
- : Asn1Encodable
- {
- private readonly DerInteger dataGroupNumber;
- private readonly Asn1OctetString dataGroupHashValue;
-
- public static DataGroupHash GetInstance(
- object obj)
- {
- if (obj is DataGroupHash)
- return (DataGroupHash)obj;
-
- if (obj != null)
- return new DataGroupHash(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- private DataGroupHash(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- this.dataGroupNumber = DerInteger.GetInstance(seq[0]);
- this.dataGroupHashValue = Asn1OctetString.GetInstance(seq[1]);
- }
-
- public DataGroupHash(
- int dataGroupNumber,
- Asn1OctetString dataGroupHashValue)
- {
- this.dataGroupNumber = new DerInteger(dataGroupNumber);
- this.dataGroupHashValue = dataGroupHashValue;
- }
-
- public int DataGroupNumber
- {
- get { return dataGroupNumber.Value.IntValue; }
- }
-
- public Asn1OctetString DataGroupHashValue
- {
- get { return dataGroupHashValue; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(dataGroupNumber, dataGroupHashValue);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/icao/ICAOObjectIdentifiers.cs b/BCCrypto/src/asn1/icao/ICAOObjectIdentifiers.cs
deleted file mode 100644
index 389d4da..0000000
--- a/BCCrypto/src/asn1/icao/ICAOObjectIdentifiers.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Icao
-{
- public abstract class IcaoObjectIdentifiers
- {
- //
- // base id
- //
- public static readonly DerObjectIdentifier IdIcao = new DerObjectIdentifier("2.23.136");
-
- public static readonly DerObjectIdentifier IdIcaoMrtd = IdIcao.Branch("1");
- public static readonly DerObjectIdentifier IdIcaoMrtdSecurity = IdIcaoMrtd.Branch("1");
-
- // LDS security object, see ICAO Doc 9303-Volume 2-Section IV-A3.2
- public static readonly DerObjectIdentifier IdIcaoLdsSecurityObject = IdIcaoMrtdSecurity.Branch("1");
-
- // CSCA master list, see TR CSCA Countersigning and Master List issuance
- public static readonly DerObjectIdentifier IdIcaoCscaMasterList = IdIcaoMrtdSecurity.Branch("2");
- public static readonly DerObjectIdentifier IdIcaoCscaMasterListSigningKey = IdIcaoMrtdSecurity.Branch("3");
-
- // document type list, see draft TR LDS and PKI Maintenance, par. 3.2.1
- public static readonly DerObjectIdentifier IdIcaoDocumentTypeList = IdIcaoMrtdSecurity.Branch("4");
-
- // Active Authentication protocol, see draft TR LDS and PKI Maintenance,
- // par. 5.2.2
- public static readonly DerObjectIdentifier IdIcaoAAProtocolObject = IdIcaoMrtdSecurity.Branch("5");
-
- // CSCA name change and key reoll-over, see draft TR LDS and PKI
- // Maintenance, par. 3.2.1
- public static readonly DerObjectIdentifier IdIcaoExtensions = IdIcaoMrtdSecurity.Branch("6");
- public static readonly DerObjectIdentifier IdIcaoExtensionsNamechangekeyrollover = IdIcaoExtensions.Branch("1");
- }
-}
diff --git a/BCCrypto/src/asn1/icao/LDSSecurityObject.cs b/BCCrypto/src/asn1/icao/LDSSecurityObject.cs
deleted file mode 100644
index c33ca68..0000000
--- a/BCCrypto/src/asn1/icao/LDSSecurityObject.cs
+++ /dev/null
@@ -1,145 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Asn1.Icao
-{
- /**
- * The LDSSecurityObject object (V1.8).
- *
- * LDSSecurityObject ::= SEQUENCE {
- * version LDSSecurityObjectVersion,
- * hashAlgorithm DigestAlgorithmIdentifier,
- * dataGroupHashValues SEQUENCE SIZE (2..ub-DataGroups) OF DataHashGroup,
- * ldsVersionInfo LDSVersionInfo OPTIONAL
- * -- if present, version MUST be v1 }
- *
- * DigestAlgorithmIdentifier ::= AlgorithmIdentifier,
- *
- * LDSSecurityObjectVersion :: INTEGER {V0(0)}
- *
- */
- public class LdsSecurityObject
- : Asn1Encodable
- {
- public const int UBDataGroups = 16;
-
- private DerInteger version = new DerInteger(0);
- private AlgorithmIdentifier digestAlgorithmIdentifier;
- private DataGroupHash[] datagroupHash;
- private LdsVersionInfo versionInfo;
-
- public static LdsSecurityObject GetInstance(
- object obj)
- {
- if (obj is LdsSecurityObject)
- return (LdsSecurityObject)obj;
-
- if (obj != null)
- return new LdsSecurityObject(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- private LdsSecurityObject(
- Asn1Sequence seq)
- {
- if (seq == null || seq.Count == 0)
- throw new ArgumentException("null or empty sequence passed.");
-
- IEnumerator e = seq.GetEnumerator();
-
- // version
- e.MoveNext();
- version = DerInteger.GetInstance(e.Current);
- // digestAlgorithmIdentifier
- e.MoveNext();
- digestAlgorithmIdentifier = AlgorithmIdentifier.GetInstance(e.Current);
-
- e.MoveNext();
- Asn1Sequence datagroupHashSeq = Asn1Sequence.GetInstance(e.Current);
-
- if (version.Value.Equals(BigInteger.One))
- {
- e.MoveNext();
- versionInfo = LdsVersionInfo.GetInstance(e.Current);
- }
-
- CheckDatagroupHashSeqSize(datagroupHashSeq.Count);
-
- datagroupHash = new DataGroupHash[datagroupHashSeq.Count];
- for (int i= 0; i< datagroupHashSeq.Count; i++)
- {
- datagroupHash[i] = DataGroupHash.GetInstance(datagroupHashSeq[i]);
- }
- }
-
- public LdsSecurityObject(
- AlgorithmIdentifier digestAlgorithmIdentifier,
- DataGroupHash[] datagroupHash)
- {
- this.version = new DerInteger(0);
- this.digestAlgorithmIdentifier = digestAlgorithmIdentifier;
- this.datagroupHash = datagroupHash;
-
- CheckDatagroupHashSeqSize(datagroupHash.Length);
- }
-
-
- public LdsSecurityObject(
- AlgorithmIdentifier digestAlgorithmIdentifier,
- DataGroupHash[] datagroupHash,
- LdsVersionInfo versionInfo)
- {
- this.version = new DerInteger(1);
- this.digestAlgorithmIdentifier = digestAlgorithmIdentifier;
- this.datagroupHash = datagroupHash;
- this.versionInfo = versionInfo;
-
- CheckDatagroupHashSeqSize(datagroupHash.Length);
- }
-
- private void CheckDatagroupHashSeqSize(int size)
- {
- if (size < 2 || size > UBDataGroups)
- throw new ArgumentException("wrong size in DataGroupHashValues : not in (2.."+ UBDataGroups +")");
- }
-
- public BigInteger Version
- {
- get { return version.Value; }
- }
-
- public AlgorithmIdentifier DigestAlgorithmIdentifier
- {
- get { return digestAlgorithmIdentifier; }
- }
-
- public DataGroupHash[] GetDatagroupHash()
- {
- return datagroupHash;
- }
-
- public LdsVersionInfo VersionInfo
- {
- get { return versionInfo; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- DerSequence hashSeq = new DerSequence(datagroupHash);
-
- Asn1EncodableVector v = new Asn1EncodableVector(version, digestAlgorithmIdentifier, hashSeq);
-
- if (versionInfo != null)
- {
- v.Add(versionInfo);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/icao/LDSVersionInfo.cs b/BCCrypto/src/asn1/icao/LDSVersionInfo.cs
deleted file mode 100644
index 2cdcad2..0000000
--- a/BCCrypto/src/asn1/icao/LDSVersionInfo.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Icao
-{
- public class LdsVersionInfo
- : Asn1Encodable
- {
- private DerPrintableString ldsVersion;
- private DerPrintableString unicodeVersion;
-
- public LdsVersionInfo(string ldsVersion, string unicodeVersion)
- {
- this.ldsVersion = new DerPrintableString(ldsVersion);
- this.unicodeVersion = new DerPrintableString(unicodeVersion);
- }
-
- private LdsVersionInfo(Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("sequence wrong size for LDSVersionInfo", "seq");
-
- this.ldsVersion = DerPrintableString.GetInstance(seq[0]);
- this.unicodeVersion = DerPrintableString.GetInstance(seq[1]);
- }
-
- public static LdsVersionInfo GetInstance(object obj)
- {
- if (obj is LdsVersionInfo)
- return (LdsVersionInfo)obj;
-
- if (obj != null)
- return new LdsVersionInfo(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- public virtual string GetLdsVersion()
- {
- return ldsVersion.GetString();
- }
-
- public virtual string GetUnicodeVersion()
- {
- return unicodeVersion.GetString();
- }
-
- /**
- *
- * LDSVersionInfo ::= SEQUENCE {
- * ldsVersion PRINTABLE STRING
- * unicodeVersion PRINTABLE STRING
- * }
- *
- * @return
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(ldsVersion, unicodeVersion);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/isismtt/ISISMTTObjectIdentifiers.cs b/BCCrypto/src/asn1/isismtt/ISISMTTObjectIdentifiers.cs
deleted file mode 100644
index af60b03..0000000
--- a/BCCrypto/src/asn1/isismtt/ISISMTTObjectIdentifiers.cs
+++ /dev/null
@@ -1,177 +0,0 @@
-namespace Org.BouncyCastle.Asn1.IsisMtt
-{
- public abstract class IsisMttObjectIdentifiers
- {
- public static readonly DerObjectIdentifier IdIsisMtt = new DerObjectIdentifier("1.3.36.8");
-
- public static readonly DerObjectIdentifier IdIsisMttCP = new DerObjectIdentifier(IdIsisMtt + ".1");
-
- /**
- * The id-isismtt-cp-accredited OID indicates that the certificate is a
- * qualified certificate according to Directive 1999/93/EC of the European
- * Parliament and of the Council of 13 December 1999 on a Community
- * Framework for Electronic Signatures, which additionally conforms the
- * special requirements of the SigG and has been issued by an accredited CA.
- */
- public static readonly DerObjectIdentifier IdIsisMttCPAccredited = new DerObjectIdentifier(IdIsisMttCP + ".1");
-
- public static readonly DerObjectIdentifier IdIsisMttAT = new DerObjectIdentifier(IdIsisMtt + ".3");
-
- /**
- * Certificate extensionDate of certificate generation
- *
- *
- * DateOfCertGenSyntax ::= GeneralizedTime
- *
- */
- public static readonly DerObjectIdentifier IdIsisMttATDateOfCertGen = new DerObjectIdentifier(IdIsisMttAT + ".1");
-
- /**
- * Attribute to indicate that the certificate holder may sign in the name of
- * a third person. May also be used as extension in a certificate.
- */
- public static readonly DerObjectIdentifier IdIsisMttATProcuration = new DerObjectIdentifier(IdIsisMttAT + ".2");
-
- /**
- * Attribute to indicate admissions to certain professions. May be used as
- * attribute in attribute certificate or as extension in a certificate
- */
- public static readonly DerObjectIdentifier IdIsisMttATAdmission = new DerObjectIdentifier(IdIsisMttAT + ".3");
-
- /**
- * Monetary limit for transactions. The QcEuMonetaryLimit QC statement MUST
- * be used in new certificates in place of the extension/attribute
- * MonetaryLimit since January 1, 2004. For the sake of backward
- * compatibility with certificates already in use, SigG conforming
- * components MUST support MonetaryLimit (as well as QcEuLimitValue).
- */
- public static readonly DerObjectIdentifier IdIsisMttATMonetaryLimit = new DerObjectIdentifier(IdIsisMttAT + ".4");
-
- /**
- * A declaration of majority. May be used as attribute in attribute
- * certificate or as extension in a certificate
- */
- public static readonly DerObjectIdentifier IdIsisMttATDeclarationOfMajority = new DerObjectIdentifier(IdIsisMttAT + ".5");
-
- /**
- *
- * Serial number of the smart card containing the corresponding private key
- *
- *
- * ICCSNSyntax ::= OCTET STRING (SIZE(8..20))
- *
- */
- public static readonly DerObjectIdentifier IdIsisMttATIccsn = new DerObjectIdentifier(IdIsisMttAT + ".6");
-
- /**
- *
- * Reference for a file of a smartcard that stores the public key of this
- * certificate and that is used as �security anchor�.
- *
- *
- * PKReferenceSyntax ::= OCTET STRING (SIZE(20))
- *
- */
- public static readonly DerObjectIdentifier IdIsisMttATPKReference = new DerObjectIdentifier(IdIsisMttAT + ".7");
-
- /**
- * Some other restriction regarding the usage of this certificate. May be
- * used as attribute in attribute certificate or as extension in a
- * certificate.
- *
- *
- * RestrictionSyntax ::= DirectoryString (SIZE(1..1024))
- *
- *
- * @see Org.BouncyCastle.Asn1.IsisMtt.X509.Restriction
- */
- public static readonly DerObjectIdentifier IdIsisMttATRestriction = new DerObjectIdentifier(IdIsisMttAT + ".8");
-
- /**
- *
- * (Single)Request extension: Clients may include this extension in a
- * (single) Request to request the responder to send the certificate in the
- * response message along with the status information. Besides the LDAP
- * service, this extension provides another mechanism for the distribution
- * of certificates, which MAY optionally be provided by certificate
- * repositories.
- *
- *
- * RetrieveIfAllowed ::= BOOLEAN
- *
- */
- public static readonly DerObjectIdentifier IdIsisMttATRetrieveIfAllowed = new DerObjectIdentifier(IdIsisMttAT + ".9");
-
- /**
- * SingleOCSPResponse extension: The certificate requested by the client by
- * inserting the RetrieveIfAllowed extension in the request, will be
- * returned in this extension.
- *
- * @see Org.BouncyCastle.Asn1.IsisMtt.Ocsp.RequestedCertificate
- */
- public static readonly DerObjectIdentifier IdIsisMttATRequestedCertificate = new DerObjectIdentifier(IdIsisMttAT + ".10");
-
- /**
- * Base ObjectIdentifier for naming authorities
- */
- public static readonly DerObjectIdentifier IdIsisMttATNamingAuthorities = new DerObjectIdentifier(IdIsisMttAT + ".11");
-
- /**
- * SingleOCSPResponse extension: Date, when certificate has been published
- * in the directory and status information has become available. Currently,
- * accrediting authorities enforce that SigG-conforming OCSP servers include
- * this extension in the responses.
- *
- *
- * CertInDirSince ::= GeneralizedTime
- *
- */
- public static readonly DerObjectIdentifier IdIsisMttATCertInDirSince = new DerObjectIdentifier(IdIsisMttAT + ".12");
-
- /**
- * Hash of a certificate in OCSP.
- *
- * @see Org.BouncyCastle.Asn1.IsisMtt.Ocsp.CertHash
- */
- public static readonly DerObjectIdentifier IdIsisMttATCertHash = new DerObjectIdentifier(IdIsisMttAT + ".13");
-
- /**
- *
- * NameAtBirth ::= DirectoryString(SIZE(1..64)
- *
- *
- * Used in
- * {@link Org.BouncyCastle.Asn1.X509.SubjectDirectoryAttributes SubjectDirectoryAttributes}
- */
- public static readonly DerObjectIdentifier IdIsisMttATNameAtBirth = new DerObjectIdentifier(IdIsisMttAT + ".14");
-
- /**
- * Some other information of non-restrictive nature regarding the usage of
- * this certificate. May be used as attribute in atribute certificate or as
- * extension in a certificate.
- *
- *
- * AdditionalInformationSyntax ::= DirectoryString (SIZE(1..2048))
- *
- *
- * @see Org.BouncyCastle.Asn1.IsisMtt.X509.AdditionalInformationSyntax
- */
- public static readonly DerObjectIdentifier IdIsisMttATAdditionalInformation = new DerObjectIdentifier(IdIsisMttAT + ".15");
-
- /**
- * Indicates that an attribute certificate exists, which limits the
- * usability of this public key certificate. Whenever verifying a signature
- * with the help of this certificate, the content of the corresponding
- * attribute certificate should be concerned. This extension MUST be
- * included in a PKC, if a corresponding attribute certificate (having the
- * PKC as base certificate) contains some attribute that restricts the
- * usability of the PKC too. Attribute certificates with restricting content
- * MUST always be included in the signed document.
- *
- *
- * LiabilityLimitationFlagSyntax ::= BOOLEAN
- *
- */
- public static readonly DerObjectIdentifier IdIsisMttATLiabilityLimitationFlag = new DerObjectIdentifier("0.2.262.1.10.12.0");
- }
-}
diff --git a/BCCrypto/src/asn1/isismtt/ocsp/CertHash.cs b/BCCrypto/src/asn1/isismtt/ocsp/CertHash.cs
deleted file mode 100644
index 5773e1c..0000000
--- a/BCCrypto/src/asn1/isismtt/ocsp/CertHash.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.IsisMtt.Ocsp
-{
- /**
- * ISIS-MTT PROFILE: The responder may include this extension in a response to
- * send the hash of the requested certificate to the responder. This hash is
- * cryptographically bound to the certificate and serves as evidence that the
- * certificate is known to the responder (i.e. it has been issued and is present
- * in the directory). Hence, this extension is a means to provide a positive
- * statement of availability as described in T8.[8]. As explained in T13.[1],
- * clients may rely on this information to be able to validate signatures after
- * the expiry of the corresponding certificate. Hence, clients MUST support this
- * extension. If a positive statement of availability is to be delivered, this
- * extension syntax and OID MUST be used.
- *
- *
- *
- * CertHash ::= SEQUENCE {
- * hashAlgorithm AlgorithmIdentifier,
- * certificateHash OCTET STRING
- * }
- *
- */
- public class CertHash
- : Asn1Encodable
- {
- private readonly AlgorithmIdentifier hashAlgorithm;
- private readonly byte[] certificateHash;
-
- public static CertHash GetInstance(
- object obj)
- {
- if (obj == null || obj is CertHash)
- {
- return (CertHash) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new CertHash((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from Asn1Sequence.
- *
- * The sequence is of type CertHash:
- *
- *
- * CertHash ::= SEQUENCE {
- * hashAlgorithm AlgorithmIdentifier,
- * certificateHash OCTET STRING
- * }
- *
- *
- * @param seq The ASN.1 sequence.
- */
- private CertHash(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- this.hashAlgorithm = AlgorithmIdentifier.GetInstance(seq[0]);
- this.certificateHash = DerOctetString.GetInstance(seq[1]).GetOctets();
- }
-
- /**
- * Constructor from a given details.
- *
- * @param hashAlgorithm The hash algorithm identifier.
- * @param certificateHash The hash of the whole DER encoding of the certificate.
- */
- public CertHash(
- AlgorithmIdentifier hashAlgorithm,
- byte[] certificateHash)
- {
- if (hashAlgorithm == null)
- throw new ArgumentNullException("hashAlgorithm");
- if (certificateHash == null)
- throw new ArgumentNullException("certificateHash");
-
- this.hashAlgorithm = hashAlgorithm;
- this.certificateHash = (byte[]) certificateHash.Clone();
- }
-
- public AlgorithmIdentifier HashAlgorithm
- {
- get { return hashAlgorithm; }
- }
-
- public byte[] CertificateHash
- {
- get { return (byte[]) certificateHash.Clone(); }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * CertHash ::= SEQUENCE {
- * hashAlgorithm AlgorithmIdentifier,
- * certificateHash OCTET STRING
- * }
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(hashAlgorithm, new DerOctetString(certificateHash));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/isismtt/ocsp/RequestedCertificate.cs b/BCCrypto/src/asn1/isismtt/ocsp/RequestedCertificate.cs
deleted file mode 100644
index 413b3bd..0000000
--- a/BCCrypto/src/asn1/isismtt/ocsp/RequestedCertificate.cs
+++ /dev/null
@@ -1,188 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.IsisMtt.Ocsp
-{
- /**
- * ISIS-MTT-Optional: The certificate requested by the client by inserting the
- * RetrieveIfAllowed extension in the request, will be returned in this
- * extension.
- *
- * ISIS-MTT-SigG: The signature act allows publishing certificates only then,
- * when the certificate owner gives his isExplicit permission. Accordingly, there
- * may be �nondownloadable� certificates, about which the responder must provide
- * status information, but MUST NOT include them in the response. Clients may
- * get therefore the following three kind of answers on a single request
- * including the RetrieveIfAllowed extension:
- *
- * a) the responder supports the extension and is allowed to publish the
- * certificate: RequestedCertificate returned including the requested
- * certificate
- * b) the responder supports the extension but is NOT allowed to publish
- * the certificate: RequestedCertificate returned including an empty OCTET
- * STRING
- * c) the responder does not support the extension: RequestedCertificate is
- * not included in the response
- *
- * Clients requesting RetrieveIfAllowed MUST be able to handle these cases. If
- * any of the OCTET STRING options is used, it MUST contain the DER encoding of
- * the requested certificate.
- *
- *
- * RequestedCertificate ::= CHOICE {
- * Certificate Certificate,
- * publicKeyCertificate [0] EXPLICIT OCTET STRING,
- * attributeCertificate [1] EXPLICIT OCTET STRING
- * }
- *
- */
- public class RequestedCertificate
- : Asn1Encodable, IAsn1Choice
- {
- public enum Choice
- {
- Certificate = -1,
- PublicKeyCertificate = 0,
- AttributeCertificate = 1
- }
-
- private readonly X509CertificateStructure cert;
- private readonly byte[] publicKeyCert;
- private readonly byte[] attributeCert;
-
- public static RequestedCertificate GetInstance(
- object obj)
- {
- if (obj == null || obj is RequestedCertificate)
- {
- return (RequestedCertificate) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new RequestedCertificate(X509CertificateStructure.GetInstance(obj));
- }
-
- if (obj is Asn1TaggedObject)
- {
- return new RequestedCertificate((Asn1TaggedObject) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public static RequestedCertificate GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- if (!isExplicit)
- throw new ArgumentException("choice item must be explicitly tagged");
-
- return GetInstance(obj.GetObject());
- }
-
- private RequestedCertificate(
- Asn1TaggedObject tagged)
- {
- switch ((Choice) tagged.TagNo)
- {
- case Choice.AttributeCertificate:
- this.attributeCert = Asn1OctetString.GetInstance(tagged, true).GetOctets();
- break;
- case Choice.PublicKeyCertificate:
- this.publicKeyCert = Asn1OctetString.GetInstance(tagged, true).GetOctets();
- break;
- default:
- throw new ArgumentException("unknown tag number: " + tagged.TagNo);
- }
- }
-
- /**
- * Constructor from a given details.
- *
- * Only one parameter can be given. All other must be null.
- *
- * @param certificate Given as Certificate
- */
- public RequestedCertificate(
- X509CertificateStructure certificate)
- {
- this.cert = certificate;
- }
-
- public RequestedCertificate(
- Choice type,
- byte[] certificateOctets)
- : this(new DerTaggedObject((int) type, new DerOctetString(certificateOctets)))
- {
- }
-
- public Choice Type
- {
- get
- {
- if (cert != null)
- return Choice.Certificate;
-
- if (publicKeyCert != null)
- return Choice.PublicKeyCertificate;
-
- return Choice.AttributeCertificate;
- }
- }
-
- public byte[] GetCertificateBytes()
- {
- if (cert != null)
- {
- try
- {
- return cert.GetEncoded();
- }
- catch (IOException e)
- {
- throw new InvalidOperationException("can't decode certificate: " + e);
- }
- }
-
- if (publicKeyCert != null)
- return publicKeyCert;
-
- return attributeCert;
- }
-
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * RequestedCertificate ::= CHOICE {
- * Certificate Certificate,
- * publicKeyCertificate [0] EXPLICIT OCTET STRING,
- * attributeCertificate [1] EXPLICIT OCTET STRING
- * }
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- if (publicKeyCert != null)
- {
- return new DerTaggedObject(0, new DerOctetString(publicKeyCert));
- }
-
- if (attributeCert != null)
- {
- return new DerTaggedObject(1, new DerOctetString(attributeCert));
- }
-
- return cert.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/isismtt/x509/AdditionalInformationSyntax.cs b/BCCrypto/src/asn1/isismtt/x509/AdditionalInformationSyntax.cs
deleted file mode 100644
index 53a8e98..0000000
--- a/BCCrypto/src/asn1/isismtt/x509/AdditionalInformationSyntax.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X500;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.IsisMtt.X509
-{
- /**
- * Some other information of non-restrictive nature regarding the usage of this
- * certificate.
- *
- *
- * AdditionalInformationSyntax ::= DirectoryString (SIZE(1..2048))
- *
- */
- public class AdditionalInformationSyntax
- : Asn1Encodable
- {
- private readonly DirectoryString information;
-
- public static AdditionalInformationSyntax GetInstance(
- object obj)
- {
- if (obj is AdditionalInformationSyntax)
- return (AdditionalInformationSyntax) obj;
-
- if (obj is IAsn1String)
- return new AdditionalInformationSyntax(DirectoryString.GetInstance(obj));
-
- throw new ArgumentException("Unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- private AdditionalInformationSyntax(
- DirectoryString information)
- {
- this.information = information;
- }
-
- /**
- * Constructor from a given details.
- *
- * @param information The describtion of the information.
- */
- public AdditionalInformationSyntax(
- string information)
- {
- this.information = new DirectoryString(information);
- }
-
- public virtual DirectoryString Information
- {
- get { return information; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * AdditionalInformationSyntax ::= DirectoryString (SIZE(1..2048))
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- return information.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/isismtt/x509/AdmissionSyntax.cs b/BCCrypto/src/asn1/isismtt/x509/AdmissionSyntax.cs
deleted file mode 100644
index 4b6264a..0000000
--- a/BCCrypto/src/asn1/isismtt/x509/AdmissionSyntax.cs
+++ /dev/null
@@ -1,278 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.IsisMtt.X509
-{
- /**
- * Attribute to indicate admissions to certain professions.
- *
- *
- * AdmissionSyntax ::= SEQUENCE
- * {
- * admissionAuthority GeneralName OPTIONAL,
- * contentsOfAdmissions SEQUENCE OF Admissions
- * }
- *
- * Admissions ::= SEQUENCE
- * {
- * admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
- * namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
- * professionInfos SEQUENCE OF ProfessionInfo
- * }
- *
- * NamingAuthority ::= SEQUENCE
- * {
- * namingAuthorityId OBJECT IDENTIFIER OPTIONAL,
- * namingAuthorityUrl IA5String OPTIONAL,
- * namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL
- * }
- *
- * ProfessionInfo ::= SEQUENCE
- * {
- * namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,
- * professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),
- * professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
- * registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,
- * addProfessionInfo OCTET STRING OPTIONAL
- * }
- *
- *
- *
- * ISIS-MTT PROFILE: The relatively complex structure of AdmissionSyntax
- * supports the following concepts and requirements:
- *
- * External institutions (e.g. professional associations, chambers, unions,
- * administrative bodies, companies, etc.), which are responsible for granting
- * and verifying professional admissions, are indicated by means of the data
- * field admissionAuthority. An admission authority is indicated by a
- * GeneralName object. Here an X.501 directory name (distinguished name) can be
- * indicated in the field directoryName, a URL address can be indicated in the
- * field uniformResourceIdentifier, and an object identifier can be indicated in
- * the field registeredId.
- * The names of authorities which are responsible for the administration of
- * title registers are indicated in the data field namingAuthority. The name of
- * the authority can be identified by an object identifier in the field
- * namingAuthorityId, by means of a text string in the field
- * namingAuthorityText, by means of a URL address in the field
- * namingAuthorityUrl, or by a combination of them. For example, the text string
- * can contain the name of the authority, the country and the name of the title
- * register. The URL-option refers to a web page which contains lists with
- * officially registered professions (text and possibly OID) as well as
- * further information on these professions. Object identifiers for the
- * component namingAuthorityId are grouped under the OID-branch
- * id-isis-at-namingAuthorities and must be applied for.
- * See http://www.teletrust.de/anwend.asp?Id=30200&Sprache=E_&HomePG=0
- * for an application form and http://www.teletrust.de/links.asp?id=30220,11
- * for an overview of registered naming authorities.
- * By means of the data type ProfessionInfo certain professions,
- * specializations, disciplines, fields of activity, etc. are identified. A
- * profession is represented by one or more text strings, resp. profession OIDs
- * in the fields professionItems and professionOIDs and by a registration number
- * in the field registrationNumber. An indication in text form must always be
- * present, whereas the other indications are optional. The component
- * addProfessionInfo may contain additional applicationspecific information in
- * DER-encoded form.
- *
- *
- * By means of different namingAuthority-OIDs or profession OIDs hierarchies of
- * professions, specializations, disciplines, fields of activity, etc. can be
- * expressed. The issuing admission authority should always be indicated (field
- * admissionAuthority), whenever a registration number is presented. Still,
- * information on admissions can be given without indicating an admission or a
- * naming authority by the exclusive use of the component professionItems. In
- * this case the certification authority is responsible for the verification of
- * the admission information.
- *
- *
- *
- * This attribute is single-valued. Still, several admissions can be captured in
- * the sequence structure of the component contentsOfAdmissions of
- * AdmissionSyntax or in the component professionInfos of Admissions. The
- * component admissionAuthority of AdmissionSyntax serves as default value for
- * the component admissionAuthority of Admissions. Within the latter component
- * the default value can be overwritten, in case that another authority is
- * responsible. The component namingAuthority of Admissions serves as a default
- * value for the component namingAuthority of ProfessionInfo. Within the latter
- * component the default value can be overwritten, in case that another naming
- * authority needs to be recorded.
- *
- * The length of the string objects is limited to 128 characters. It is
- * recommended to indicate a namingAuthorityURL in all issued attribute
- * certificates. If a namingAuthorityURL is indicated, the field professionItems
- * of ProfessionInfo should contain only registered titles. If the field
- * professionOIDs exists, it has to contain the OIDs of the professions listed
- * in professionItems in the same order. In general, the field professionInfos
- * should contain only one entry, unless the admissions that are to be listed
- * are logically connected (e.g. they have been issued under the same admission
- * number).
- *
- * @see Org.BouncyCastle.Asn1.IsisMtt.X509.Admissions
- * @see Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo
- * @see Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority
- */
- public class AdmissionSyntax
- : Asn1Encodable
- {
- private readonly GeneralName admissionAuthority;
- private readonly Asn1Sequence contentsOfAdmissions;
-
- public static AdmissionSyntax GetInstance(
- object obj)
- {
- if (obj == null || obj is AdmissionSyntax)
- {
- return (AdmissionSyntax)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new AdmissionSyntax((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from Asn1Sequence.
- *
- * The sequence is of type ProcurationSyntax:
- *
- *
- * AdmissionSyntax ::= SEQUENCE
- * {
- * admissionAuthority GeneralName OPTIONAL,
- * contentsOfAdmissions SEQUENCE OF Admissions
- * }
- *
- * Admissions ::= SEQUENCE
- * {
- * admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
- * namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
- * professionInfos SEQUENCE OF ProfessionInfo
- * }
- *
- * NamingAuthority ::= SEQUENCE
- * {
- * namingAuthorityId OBJECT IDENTIFIER OPTIONAL,
- * namingAuthorityUrl IA5String OPTIONAL,
- * namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL
- * }
- *
- * ProfessionInfo ::= SEQUENCE
- * {
- * namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,
- * professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),
- * professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
- * registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,
- * addProfessionInfo OCTET STRING OPTIONAL
- * }
- *
- *
- * @param seq The ASN.1 sequence.
- */
- private AdmissionSyntax(
- Asn1Sequence seq)
- {
- switch (seq.Count)
- {
- case 1:
- this.contentsOfAdmissions = DerSequence.GetInstance(seq[0]);
- break;
- case 2:
- admissionAuthority = GeneralName.GetInstance(seq[0]);
- contentsOfAdmissions = DerSequence.GetInstance(seq[1]);
- break;
- default:
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
- }
-
- /**
- * Constructor from given details.
- *
- * @param admissionAuthority The admission authority.
- * @param contentsOfAdmissions The admissions.
- */
- public AdmissionSyntax(
- GeneralName admissionAuthority,
- Asn1Sequence contentsOfAdmissions)
- {
- this.admissionAuthority = admissionAuthority;
- this.contentsOfAdmissions = contentsOfAdmissions;
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * AdmissionSyntax ::= SEQUENCE
- * {
- * admissionAuthority GeneralName OPTIONAL,
- * contentsOfAdmissions SEQUENCE OF Admissions
- * }
- *
- * Admissions ::= SEQUENCE
- * {
- * admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
- * namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
- * professionInfos SEQUENCE OF ProfessionInfo
- * }
- *
- * NamingAuthority ::= SEQUENCE
- * {
- * namingAuthorityId OBJECT IDENTIFIER OPTIONAL,
- * namingAuthorityUrl IA5String OPTIONAL,
- * namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL
- * }
- *
- * ProfessionInfo ::= SEQUENCE
- * {
- * namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,
- * professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),
- * professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
- * registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,
- * addProfessionInfo OCTET STRING OPTIONAL
- * }
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector vec = new Asn1EncodableVector();
- if (admissionAuthority != null)
- {
- vec.Add(admissionAuthority);
- }
- vec.Add(contentsOfAdmissions);
- return new DerSequence(vec);
- }
-
- /**
- * @return Returns the admissionAuthority if present, null otherwise.
- */
- public virtual GeneralName AdmissionAuthority
- {
- get { return admissionAuthority; }
- }
-
- /**
- * @return Returns the contentsOfAdmissions.
- */
- public virtual Admissions[] GetContentsOfAdmissions()
- {
- Admissions[] result = new Admissions[contentsOfAdmissions.Count];
-
- for (int i = 0; i < contentsOfAdmissions.Count; ++i)
- {
- result[i] = Admissions.GetInstance(contentsOfAdmissions[i]);
- }
-
- return result;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/isismtt/x509/Admissions.cs b/BCCrypto/src/asn1/isismtt/x509/Admissions.cs
deleted file mode 100644
index e914db0..0000000
--- a/BCCrypto/src/asn1/isismtt/x509/Admissions.cs
+++ /dev/null
@@ -1,187 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.IsisMtt.X509
-{
- /**
- * An Admissions structure.
- *
- *
- * Admissions ::= SEQUENCE
- * {
- * admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
- * namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
- * professionInfos SEQUENCE OF ProfessionInfo
- * }
- *
- *
- *
- * @see Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax
- * @see Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo
- * @see Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority
- */
- public class Admissions
- : Asn1Encodable
- {
- private readonly GeneralName admissionAuthority;
- private readonly NamingAuthority namingAuthority;
- private readonly Asn1Sequence professionInfos;
-
- public static Admissions GetInstance(
- object obj)
- {
- if (obj == null || obj is Admissions)
- {
- return (Admissions) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new Admissions((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from Asn1Sequence.
- *
- * The sequence is of type ProcurationSyntax:
- *
- *
- * Admissions ::= SEQUENCE
- * {
- * admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
- * namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
- * professionInfos SEQUENCE OF ProfessionInfo
- * }
- *
- *
- * @param seq The ASN.1 sequence.
- */
- private Admissions(
- Asn1Sequence seq)
- {
- if (seq.Count > 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- IEnumerator e = seq.GetEnumerator();
-
- e.MoveNext();
- Asn1Encodable o = (Asn1Encodable) e.Current;
- if (o is Asn1TaggedObject)
- {
- switch (((Asn1TaggedObject)o).TagNo)
- {
- case 0:
- admissionAuthority = GeneralName.GetInstance((Asn1TaggedObject)o, true);
- break;
- case 1:
- namingAuthority = NamingAuthority.GetInstance((Asn1TaggedObject)o, true);
- break;
- default:
- throw new ArgumentException("Bad tag number: " + ((Asn1TaggedObject)o).TagNo);
- }
- e.MoveNext();
- o = (Asn1Encodable) e.Current;
- }
- if (o is Asn1TaggedObject)
- {
- switch (((Asn1TaggedObject)o).TagNo)
- {
- case 1:
- namingAuthority = NamingAuthority.GetInstance((Asn1TaggedObject)o, true);
- break;
- default:
- throw new ArgumentException("Bad tag number: " + ((Asn1TaggedObject)o).TagNo);
- }
- e.MoveNext();
- o = (Asn1Encodable) e.Current;
- }
- professionInfos = Asn1Sequence.GetInstance(o);
- if (e.MoveNext())
- {
- throw new ArgumentException("Bad object encountered: " + Platform.GetTypeName(e.Current));
- }
- }
-
- /**
- * Constructor from a given details.
- *
- * Parameter professionInfos is mandatory.
- *
- * @param admissionAuthority The admission authority.
- * @param namingAuthority The naming authority.
- * @param professionInfos The profession infos.
- */
- public Admissions(
- GeneralName admissionAuthority,
- NamingAuthority namingAuthority,
- ProfessionInfo[] professionInfos)
- {
- this.admissionAuthority = admissionAuthority;
- this.namingAuthority = namingAuthority;
- this.professionInfos = new DerSequence(professionInfos);
- }
-
- public virtual GeneralName AdmissionAuthority
- {
- get { return admissionAuthority; }
- }
-
- public virtual NamingAuthority NamingAuthority
- {
- get { return namingAuthority; }
- }
-
- public ProfessionInfo[] GetProfessionInfos()
- {
- ProfessionInfo[] infos = new ProfessionInfo[professionInfos.Count];
- int count = 0;
- foreach (Asn1Encodable ae in professionInfos)
- {
- infos[count++] = ProfessionInfo.GetInstance(ae);
- }
- return infos;
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * Admissions ::= SEQUENCE
- * {
- * admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
- * namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
- * professionInfos SEQUENCE OF ProfessionInfo
- * }
- *
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector vec = new Asn1EncodableVector();
-
- if (admissionAuthority != null)
- {
- vec.Add(new DerTaggedObject(true, 0, admissionAuthority));
- }
-
- if (namingAuthority != null)
- {
- vec.Add(new DerTaggedObject(true, 1, namingAuthority));
- }
-
- vec.Add(professionInfos);
-
- return new DerSequence(vec);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/isismtt/x509/DeclarationOfMajority.cs b/BCCrypto/src/asn1/isismtt/x509/DeclarationOfMajority.cs
deleted file mode 100644
index c4ebb2b..0000000
--- a/BCCrypto/src/asn1/isismtt/x509/DeclarationOfMajority.cs
+++ /dev/null
@@ -1,172 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.IsisMtt.X509
-{
- /**
- * A declaration of majority.
- *
- *
- * DeclarationOfMajoritySyntax ::= CHOICE
- * {
- * notYoungerThan [0] IMPLICIT INTEGER,
- * fullAgeAtCountry [1] IMPLICIT SEQUENCE
- * {
- * fullAge BOOLEAN DEFAULT TRUE,
- * country PrintableString (SIZE(2))
- * }
- * dateOfBirth [2] IMPLICIT GeneralizedTime
- * }
- *
- *
- * fullAgeAtCountry indicates the majority of the owner with respect to the laws
- * of a specific country.
- */
- public class DeclarationOfMajority
- : Asn1Encodable, IAsn1Choice
- {
- public enum Choice
- {
- NotYoungerThan = 0,
- FullAgeAtCountry = 1,
- DateOfBirth = 2
- };
-
- private readonly Asn1TaggedObject declaration;
-
- public DeclarationOfMajority(
- int notYoungerThan)
- {
- declaration = new DerTaggedObject(false, 0, new DerInteger(notYoungerThan));
- }
-
- public DeclarationOfMajority(
- bool fullAge,
- string country)
- {
- if (country.Length > 2)
- throw new ArgumentException("country can only be 2 characters");
-
- DerPrintableString countryString = new DerPrintableString(country, true);
-
- DerSequence seq;
- if (fullAge)
- {
- seq = new DerSequence(countryString);
- }
- else
- {
- seq = new DerSequence(DerBoolean.False, countryString);
- }
-
- this.declaration = new DerTaggedObject(false, 1, seq);
- }
-
- public DeclarationOfMajority(
- DerGeneralizedTime dateOfBirth)
- {
- this.declaration = new DerTaggedObject(false, 2, dateOfBirth);
- }
-
- public static DeclarationOfMajority GetInstance(
- object obj)
- {
- if (obj == null || obj is DeclarationOfMajority)
- {
- return (DeclarationOfMajority) obj;
- }
-
- if (obj is Asn1TaggedObject)
- {
- return new DeclarationOfMajority((Asn1TaggedObject) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- private DeclarationOfMajority(
- Asn1TaggedObject o)
- {
- if (o.TagNo > 2)
- throw new ArgumentException("Bad tag number: " + o.TagNo);
-
- this.declaration = o;
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * DeclarationOfMajoritySyntax ::= CHOICE
- * {
- * notYoungerThan [0] IMPLICIT INTEGER,
- * fullAgeAtCountry [1] IMPLICIT SEQUENCE
- * {
- * fullAge BOOLEAN DEFAULT TRUE,
- * country PrintableString (SIZE(2))
- * }
- * dateOfBirth [2] IMPLICIT GeneralizedTime
- * }
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- return declaration;
- }
-
- public Choice Type
- {
- get { return (Choice) declaration.TagNo; }
- }
-
- /**
- * @return notYoungerThan if that's what we are, -1 otherwise
- */
- public virtual int NotYoungerThan
- {
- get
- {
- switch ((Choice) declaration.TagNo)
- {
- case Choice.NotYoungerThan:
- return DerInteger.GetInstance(declaration, false).Value.IntValue;
- default:
- return -1;
- }
- }
- }
-
- public virtual Asn1Sequence FullAgeAtCountry
- {
- get
- {
- switch ((Choice) declaration.TagNo)
- {
- case Choice.FullAgeAtCountry:
- return Asn1Sequence.GetInstance(declaration, false);
- default:
- return null;
- }
- }
- }
-
- public virtual DerGeneralizedTime DateOfBirth
- {
- get
- {
- switch ((Choice) declaration.TagNo)
- {
- case Choice.DateOfBirth:
- return DerGeneralizedTime.GetInstance(declaration, false);
- default:
- return null;
- }
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/isismtt/x509/MonetaryLimit.cs b/BCCrypto/src/asn1/isismtt/x509/MonetaryLimit.cs
deleted file mode 100644
index b792fff..0000000
--- a/BCCrypto/src/asn1/isismtt/x509/MonetaryLimit.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.IsisMtt.X509
-{
- /**
- * Monetary limit for transactions. The QcEuMonetaryLimit QC statement MUST be
- * used in new certificates in place of the extension/attribute MonetaryLimit
- * since January 1, 2004. For the sake of backward compatibility with
- * certificates already in use, components SHOULD support MonetaryLimit (as well
- * as QcEuLimitValue).
- *
- * Indicates a monetary limit within which the certificate holder is authorized
- * to act. (This value DOES NOT express a limit on the liability of the
- * certification authority).
- *
- *
- * MonetaryLimitSyntax ::= SEQUENCE
- * {
- * currency PrintableString (SIZE(3)),
- * amount INTEGER,
- * exponent INTEGER
- * }
- *
- *
- * currency must be the ISO code.
- *
- * value = amount�10*exponent
- */
- public class MonetaryLimit
- : Asn1Encodable
- {
- private readonly DerPrintableString currency;
- private readonly DerInteger amount;
- private readonly DerInteger exponent;
-
- public static MonetaryLimit GetInstance(
- object obj)
- {
- if (obj == null || obj is MonetaryLimit)
- {
- return (MonetaryLimit) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new MonetaryLimit(Asn1Sequence.GetInstance(obj));
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- private MonetaryLimit(
- Asn1Sequence seq)
- {
- if (seq.Count != 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- currency = DerPrintableString.GetInstance(seq[0]);
- amount = DerInteger.GetInstance(seq[1]);
- exponent = DerInteger.GetInstance(seq[2]);
- }
-
- /**
- * Constructor from a given details.
- *
- *
- * value = amount�10^exponent
- *
- * @param currency The currency. Must be the ISO code.
- * @param amount The amount
- * @param exponent The exponent
- */
- public MonetaryLimit(
- string currency,
- int amount,
- int exponent)
- {
- this.currency = new DerPrintableString(currency, true);
- this.amount = new DerInteger(amount);
- this.exponent = new DerInteger(exponent);
- }
-
- public virtual string Currency
- {
- get { return currency.GetString(); }
- }
-
- public virtual BigInteger Amount
- {
- get { return amount.Value; }
- }
-
- public virtual BigInteger Exponent
- {
- get { return exponent.Value; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * MonetaryLimitSyntax ::= SEQUENCE
- * {
- * currency PrintableString (SIZE(3)),
- * amount INTEGER,
- * exponent INTEGER
- * }
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(currency, amount, exponent);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/isismtt/x509/NamingAuthority.cs b/BCCrypto/src/asn1/isismtt/x509/NamingAuthority.cs
deleted file mode 100644
index 35539f4..0000000
--- a/BCCrypto/src/asn1/isismtt/x509/NamingAuthority.cs
+++ /dev/null
@@ -1,215 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X500;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.IsisMtt.X509
-{
- /**
- * Names of authorities which are responsible for the administration of title
- * registers.
- *
- *
- * NamingAuthority ::= SEQUENCE
- * {
- * namingAuthorityID OBJECT IDENTIFIER OPTIONAL,
- * namingAuthorityUrl IA5String OPTIONAL,
- * namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL
- * }
- *
- * @see Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax
- *
- */
- public class NamingAuthority
- : Asn1Encodable
- {
- /**
- * Profession OIDs should always be defined under the OID branch of the
- * responsible naming authority. At the time of this writing, the work group
- * �Recht, Wirtschaft, Steuern� (�Law, Economy, Taxes�) is registered as the
- * first naming authority under the OID id-isismtt-at-namingAuthorities.
- */
- public static readonly DerObjectIdentifier IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern
- = new DerObjectIdentifier(IsisMttObjectIdentifiers.IdIsisMttATNamingAuthorities + ".1");
-
- private readonly DerObjectIdentifier namingAuthorityID;
- private readonly string namingAuthorityUrl;
- private readonly DirectoryString namingAuthorityText;
-
- public static NamingAuthority GetInstance(
- object obj)
- {
- if (obj == null || obj is NamingAuthority)
- {
- return (NamingAuthority) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new NamingAuthority((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public static NamingAuthority GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- /**
- * Constructor from Asn1Sequence.
- *
- *
- *
- * NamingAuthority ::= SEQUENCE
- * {
- * namingAuthorityID OBJECT IDENTIFIER OPTIONAL,
- * namingAuthorityUrl IA5String OPTIONAL,
- * namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL
- * }
- *
- *
- * @param seq The ASN.1 sequence.
- */
- private NamingAuthority(
- Asn1Sequence seq)
- {
- if (seq.Count > 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- IEnumerator e = seq.GetEnumerator();
-
- if (e.MoveNext())
- {
- Asn1Encodable o = (Asn1Encodable) e.Current;
- if (o is DerObjectIdentifier)
- {
- namingAuthorityID = (DerObjectIdentifier) o;
- }
- else if (o is DerIA5String)
- {
- namingAuthorityUrl = DerIA5String.GetInstance(o).GetString();
- }
- else if (o is IAsn1String)
- {
- namingAuthorityText = DirectoryString.GetInstance(o);
- }
- else
- {
- throw new ArgumentException("Bad object encountered: " + Platform.GetTypeName(o));
- }
- }
-
- if (e.MoveNext())
- {
- Asn1Encodable o = (Asn1Encodable) e.Current;
- if (o is DerIA5String)
- {
- namingAuthorityUrl = DerIA5String.GetInstance(o).GetString();
- }
- else if (o is IAsn1String)
- {
- namingAuthorityText = DirectoryString.GetInstance(o);
- }
- else
- {
- throw new ArgumentException("Bad object encountered: " + Platform.GetTypeName(o));
- }
- }
-
- if (e.MoveNext())
- {
- Asn1Encodable o = (Asn1Encodable) e.Current;
- if (o is IAsn1String)
- {
- namingAuthorityText = DirectoryString.GetInstance(o);
- }
- else
- {
- throw new ArgumentException("Bad object encountered: " + Platform.GetTypeName(o));
- }
- }
- }
-
- /**
- * @return Returns the namingAuthorityID.
- */
- public virtual DerObjectIdentifier NamingAuthorityID
- {
- get { return namingAuthorityID; }
- }
-
- /**
- * @return Returns the namingAuthorityText.
- */
- public virtual DirectoryString NamingAuthorityText
- {
- get { return namingAuthorityText; }
- }
-
- /**
- * @return Returns the namingAuthorityUrl.
- */
- public virtual string NamingAuthorityUrl
- {
- get { return namingAuthorityUrl; }
- }
-
- /**
- * Constructor from given details.
- *
- * All parameters can be combined.
- *
- * @param namingAuthorityID ObjectIdentifier for naming authority.
- * @param namingAuthorityUrl URL for naming authority.
- * @param namingAuthorityText Textual representation of naming authority.
- */
- public NamingAuthority(
- DerObjectIdentifier namingAuthorityID,
- string namingAuthorityUrl,
- DirectoryString namingAuthorityText)
- {
- this.namingAuthorityID = namingAuthorityID;
- this.namingAuthorityUrl = namingAuthorityUrl;
- this.namingAuthorityText = namingAuthorityText;
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * NamingAuthority ::= SEQUENCE
- * {
- * namingAuthorityID OBJECT IDENTIFIER OPTIONAL,
- * namingAuthorityUrl IA5String OPTIONAL,
- * namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL
- * }
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector vec = new Asn1EncodableVector();
- if (namingAuthorityID != null)
- {
- vec.Add(namingAuthorityID);
- }
- if (namingAuthorityUrl != null)
- {
- vec.Add(new DerIA5String(namingAuthorityUrl, true));
- }
- if (namingAuthorityText != null)
- {
- vec.Add(namingAuthorityText);
- }
- return new DerSequence(vec);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/isismtt/x509/ProcurationSyntax.cs b/BCCrypto/src/asn1/isismtt/x509/ProcurationSyntax.cs
deleted file mode 100644
index f423646..0000000
--- a/BCCrypto/src/asn1/isismtt/x509/ProcurationSyntax.cs
+++ /dev/null
@@ -1,233 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X500;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.IsisMtt.X509
-{
- /**
- * Attribute to indicate that the certificate holder may sign in the name of a
- * third person.
- *
- * ISIS-MTT PROFILE: The corresponding ProcurationSyntax contains either the
- * name of the person who is represented (subcomponent thirdPerson) or a
- * reference to his/her base certificate (in the component signingFor,
- * subcomponent certRef), furthermore the optional components country and
- * typeSubstitution to indicate the country whose laws apply, and respectively
- * the type of procuration (e.g. manager, procuration, custody).
- *
- *
- * ISIS-MTT PROFILE: The GeneralName MUST be of type directoryName and MAY only
- * contain: - RFC3039 attributes, except pseudonym (countryName, commonName,
- * surname, givenName, serialNumber, organizationName, organizationalUnitName,
- * stateOrProvincename, localityName, postalAddress) and - SubjectDirectoryName
- * attributes (title, dateOfBirth, placeOfBirth, gender, countryOfCitizenship,
- * countryOfResidence and NameAtBirth).
- *
- *
- * ProcurationSyntax ::= SEQUENCE {
- * country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,
- * typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,
- * signingFor [3] EXPLICIT SigningFor
- * }
- *
- * SigningFor ::= CHOICE
- * {
- * thirdPerson GeneralName,
- * certRef IssuerSerial
- * }
- *
- *
- */
- public class ProcurationSyntax
- : Asn1Encodable
- {
- private readonly string country;
- private readonly DirectoryString typeOfSubstitution;
- private readonly GeneralName thirdPerson;
- private readonly IssuerSerial certRef;
-
- public static ProcurationSyntax GetInstance(
- object obj)
- {
- if (obj == null || obj is ProcurationSyntax)
- {
- return (ProcurationSyntax) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new ProcurationSyntax((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from Asn1Sequence.
- *
- * The sequence is of type ProcurationSyntax:
- *
- *
- * ProcurationSyntax ::= SEQUENCE {
- * country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,
- * typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,
- * signingFor [3] EXPLICIT SigningFor
- * }
- *
- * SigningFor ::= CHOICE
- * {
- * thirdPerson GeneralName,
- * certRef IssuerSerial
- * }
- *
- *
- * @param seq The ASN.1 sequence.
- */
- private ProcurationSyntax(
- Asn1Sequence seq)
- {
- if (seq.Count < 1 || seq.Count > 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- IEnumerator e = seq.GetEnumerator();
-
- while (e.MoveNext())
- {
- Asn1TaggedObject o = Asn1TaggedObject.GetInstance(e.Current);
- switch (o.TagNo)
- {
- case 1:
- country = DerPrintableString.GetInstance(o, true).GetString();
- break;
- case 2:
- typeOfSubstitution = DirectoryString.GetInstance(o, true);
- break;
- case 3:
- Asn1Object signingFor = o.GetObject();
- if (signingFor is Asn1TaggedObject)
- {
- thirdPerson = GeneralName.GetInstance(signingFor);
- }
- else
- {
- certRef = IssuerSerial.GetInstance(signingFor);
- }
- break;
- default:
- throw new ArgumentException("Bad tag number: " + o.TagNo);
- }
- }
- }
-
- /**
- * Constructor from a given details.
- *
- *
- * Either generalName or certRef MUST be
- * null.
- *
- * @param country The country code whose laws apply.
- * @param typeOfSubstitution The type of procuration.
- * @param certRef Reference to certificate of the person who is represented.
- */
- public ProcurationSyntax(
- string country,
- DirectoryString typeOfSubstitution,
- IssuerSerial certRef)
- {
- this.country = country;
- this.typeOfSubstitution = typeOfSubstitution;
- this.thirdPerson = null;
- this.certRef = certRef;
- }
-
- /**
- * Constructor from a given details.
- *
- *
- * Either generalName or certRef MUST be
- * null.
- *
- * @param country The country code whose laws apply.
- * @param typeOfSubstitution The type of procuration.
- * @param thirdPerson The GeneralName of the person who is represented.
- */
- public ProcurationSyntax(
- string country,
- DirectoryString typeOfSubstitution,
- GeneralName thirdPerson)
- {
- this.country = country;
- this.typeOfSubstitution = typeOfSubstitution;
- this.thirdPerson = thirdPerson;
- this.certRef = null;
- }
-
- public virtual string Country
- {
- get { return country; }
- }
-
- public virtual DirectoryString TypeOfSubstitution
- {
- get { return typeOfSubstitution; }
- }
-
- public virtual GeneralName ThirdPerson
- {
- get { return thirdPerson; }
- }
-
- public virtual IssuerSerial CertRef
- {
- get { return certRef; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * ProcurationSyntax ::= SEQUENCE {
- * country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,
- * typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,
- * signingFor [3] EXPLICIT SigningFor
- * }
- *
- * SigningFor ::= CHOICE
- * {
- * thirdPerson GeneralName,
- * certRef IssuerSerial
- * }
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector vec = new Asn1EncodableVector();
- if (country != null)
- {
- vec.Add(new DerTaggedObject(true, 1, new DerPrintableString(country, true)));
- }
- if (typeOfSubstitution != null)
- {
- vec.Add(new DerTaggedObject(true, 2, typeOfSubstitution));
- }
- if (thirdPerson != null)
- {
- vec.Add(new DerTaggedObject(true, 3, thirdPerson));
- }
- else
- {
- vec.Add(new DerTaggedObject(true, 3, certRef));
- }
-
- return new DerSequence(vec);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/isismtt/x509/ProfessionInfo.cs b/BCCrypto/src/asn1/isismtt/x509/ProfessionInfo.cs
deleted file mode 100644
index 671a465..0000000
--- a/BCCrypto/src/asn1/isismtt/x509/ProfessionInfo.cs
+++ /dev/null
@@ -1,387 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X500;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.IsisMtt.X509
-{
- /**
- * Professions, specializations, disciplines, fields of activity, etc.
- *
- *
- * ProfessionInfo ::= SEQUENCE
- * {
- * namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,
- * professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),
- * professionOids SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
- * registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,
- * addProfessionInfo OCTET STRING OPTIONAL
- * }
- *
- *
- * @see Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax
- */
- public class ProfessionInfo
- : Asn1Encodable
- {
- /**
- * Rechtsanw�ltin
- */
- public static readonly DerObjectIdentifier Rechtsanwltin = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".1");
-
- /**
- * Rechtsanwalt
- */
- public static readonly DerObjectIdentifier Rechtsanwalt = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".2");
-
- /**
- * Rechtsbeistand
- */
- public static readonly DerObjectIdentifier Rechtsbeistand = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".3");
-
- /**
- * Steuerberaterin
- */
- public static readonly DerObjectIdentifier Steuerberaterin = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".4");
-
- /**
- * Steuerberater
- */
- public static readonly DerObjectIdentifier Steuerberater = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".5");
-
- /**
- * Steuerbevollm�chtigte
- */
- public static readonly DerObjectIdentifier Steuerbevollmchtigte = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".6");
-
- /**
- * Steuerbevollm�chtigter
- */
- public static readonly DerObjectIdentifier Steuerbevollmchtigter = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".7");
-
- /**
- * Notarin
- */
- public static readonly DerObjectIdentifier Notarin = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".8");
-
- /**
- * Notar
- */
- public static readonly DerObjectIdentifier Notar = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".9");
-
- /**
- * Notarvertreterin
- */
- public static readonly DerObjectIdentifier Notarvertreterin = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".10");
-
- /**
- * Notarvertreter
- */
- public static readonly DerObjectIdentifier Notarvertreter = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".11");
-
- /**
- * Notariatsverwalterin
- */
- public static readonly DerObjectIdentifier Notariatsverwalterin = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".12");
-
- /**
- * Notariatsverwalter
- */
- public static readonly DerObjectIdentifier Notariatsverwalter = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".13");
-
- /**
- * Wirtschaftspr�ferin
- */
- public static readonly DerObjectIdentifier Wirtschaftsprferin = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".14");
-
- /**
- * Wirtschaftspr�fer
- */
- public static readonly DerObjectIdentifier Wirtschaftsprfer = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".15");
-
- /**
- * Vereidigte Buchpr�ferin
- */
- public static readonly DerObjectIdentifier VereidigteBuchprferin = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".16");
-
- /**
- * Vereidigter Buchpr�fer
- */
- public static readonly DerObjectIdentifier VereidigterBuchprfer = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".17");
-
- /**
- * Patentanw�ltin
- */
- public static readonly DerObjectIdentifier Patentanwltin = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".18");
-
- /**
- * Patentanwalt
- */
- public static readonly DerObjectIdentifier Patentanwalt = new DerObjectIdentifier(
- NamingAuthority.IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern + ".19");
-
- private readonly NamingAuthority namingAuthority;
- private readonly Asn1Sequence professionItems;
- private readonly Asn1Sequence professionOids;
- private readonly string registrationNumber;
- private readonly Asn1OctetString addProfessionInfo;
-
- public static ProfessionInfo GetInstance(
- object obj)
- {
- if (obj == null || obj is ProfessionInfo)
- {
- return (ProfessionInfo) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new ProfessionInfo((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from Asn1Sequence.
- *
- *
- *
- * ProfessionInfo ::= SEQUENCE
- * {
- * namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,
- * professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),
- * professionOids SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
- * registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,
- * addProfessionInfo OCTET STRING OPTIONAL
- * }
- *
- *
- * @param seq The ASN.1 sequence.
- */
- private ProfessionInfo(
- Asn1Sequence seq)
- {
- if (seq.Count > 5)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- IEnumerator e = seq.GetEnumerator();
-
- e.MoveNext();
- Asn1Encodable o = (Asn1Encodable) e.Current;
-
- if (o is Asn1TaggedObject)
- {
- Asn1TaggedObject ato = (Asn1TaggedObject) o;
- if (ato.TagNo != 0)
- throw new ArgumentException("Bad tag number: " + ato.TagNo);
-
- namingAuthority = NamingAuthority.GetInstance(ato, true);
- e.MoveNext();
- o = (Asn1Encodable) e.Current;
- }
-
- professionItems = Asn1Sequence.GetInstance(o);
-
- if (e.MoveNext())
- {
- o = (Asn1Encodable) e.Current;
- if (o is Asn1Sequence)
- {
- professionOids = Asn1Sequence.GetInstance(o);
- }
- else if (o is DerPrintableString)
- {
- registrationNumber = DerPrintableString.GetInstance(o).GetString();
- }
- else if (o is Asn1OctetString)
- {
- addProfessionInfo = Asn1OctetString.GetInstance(o);
- }
- else
- {
- throw new ArgumentException("Bad object encountered: " + Platform.GetTypeName(o));
- }
- }
-
- if (e.MoveNext())
- {
- o = (Asn1Encodable) e.Current;
- if (o is DerPrintableString)
- {
- registrationNumber = DerPrintableString.GetInstance(o).GetString();
- }
- else if (o is DerOctetString)
- {
- addProfessionInfo = (DerOctetString) o;
- }
- else
- {
- throw new ArgumentException("Bad object encountered: " + Platform.GetTypeName(o));
- }
- }
-
- if (e.MoveNext())
- {
- o = (Asn1Encodable) e.Current;
- if (o is DerOctetString)
- {
- addProfessionInfo = (DerOctetString) o;
- }
- else
- {
- throw new ArgumentException("Bad object encountered: " + Platform.GetTypeName(o));
- }
- }
- }
-
- /**
- * Constructor from given details.
- *
- * professionItems is mandatory, all other parameters are
- * optional.
- *
- * @param namingAuthority The naming authority.
- * @param professionItems Directory strings of the profession.
- * @param professionOids DERObjectIdentfier objects for the
- * profession.
- * @param registrationNumber Registration number.
- * @param addProfessionInfo Additional infos in encoded form.
- */
- public ProfessionInfo(
- NamingAuthority namingAuthority,
- DirectoryString[] professionItems,
- DerObjectIdentifier[] professionOids,
- string registrationNumber,
- Asn1OctetString addProfessionInfo)
- {
- this.namingAuthority = namingAuthority;
- this.professionItems = new DerSequence(professionItems);
- if (professionOids != null)
- {
- this.professionOids = new DerSequence(professionOids);
- }
- this.registrationNumber = registrationNumber;
- this.addProfessionInfo = addProfessionInfo;
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * ProfessionInfo ::= SEQUENCE
- * {
- * namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,
- * professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),
- * professionOids SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
- * registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,
- * addProfessionInfo OCTET STRING OPTIONAL
- * }
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector vec = new Asn1EncodableVector();
- if (namingAuthority != null)
- {
- vec.Add(new DerTaggedObject(true, 0, namingAuthority));
- }
- vec.Add(professionItems);
- if (professionOids != null)
- {
- vec.Add(professionOids);
- }
- if (registrationNumber != null)
- {
- vec.Add(new DerPrintableString(registrationNumber, true));
- }
- if (addProfessionInfo != null)
- {
- vec.Add(addProfessionInfo);
- }
- return new DerSequence(vec);
- }
-
- /**
- * @return Returns the addProfessionInfo.
- */
- public virtual Asn1OctetString AddProfessionInfo
- {
- get { return addProfessionInfo; }
- }
-
- /**
- * @return Returns the namingAuthority.
- */
- public virtual NamingAuthority NamingAuthority
- {
- get { return namingAuthority; }
- }
-
- /**
- * @return Returns the professionItems.
- */
- public virtual DirectoryString[] GetProfessionItems()
- {
- DirectoryString[] result = new DirectoryString[professionItems.Count];
-
- for (int i = 0; i < professionItems.Count; ++i)
- {
- result[i] = DirectoryString.GetInstance(professionItems[i]);
- }
-
- return result;
- }
-
- /**
- * @return Returns the professionOids.
- */
- public virtual DerObjectIdentifier[] GetProfessionOids()
- {
- if (professionOids == null)
- {
- return new DerObjectIdentifier[0];
- }
-
- DerObjectIdentifier[] result = new DerObjectIdentifier[professionOids.Count];
-
- for (int i = 0; i < professionOids.Count; ++i)
- {
- result[i] = DerObjectIdentifier.GetInstance(professionOids[i]);
- }
-
- return result;
- }
-
- /**
- * @return Returns the registrationNumber.
- */
- public virtual string RegistrationNumber
- {
- get { return registrationNumber; }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/isismtt/x509/Restriction.cs b/BCCrypto/src/asn1/isismtt/x509/Restriction.cs
deleted file mode 100644
index 75df252..0000000
--- a/BCCrypto/src/asn1/isismtt/x509/Restriction.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X500;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.IsisMtt.X509
-{
- /**
- * Some other restriction regarding the usage of this certificate.
- *
- *
- * RestrictionSyntax ::= DirectoryString (SIZE(1..1024))
- *
- */
- public class Restriction
- : Asn1Encodable
- {
- private readonly DirectoryString restriction;
-
- public static Restriction GetInstance(
- object obj)
- {
- if (obj is Restriction)
- return (Restriction) obj;
-
- if (obj is IAsn1String)
- return new Restriction(DirectoryString.GetInstance(obj));
-
- throw new ArgumentException("Unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from DirectoryString.
- *
- * The DirectoryString is of type RestrictionSyntax:
- *
- *
- * RestrictionSyntax ::= DirectoryString (SIZE(1..1024))
- *
- *
- * @param restriction A IAsn1String.
- */
- private Restriction(
- DirectoryString restriction)
- {
- this.restriction = restriction;
- }
-
- /**
- * Constructor from a given details.
- *
- * @param restriction The description of the restriction.
- */
- public Restriction(
- string restriction)
- {
- this.restriction = new DirectoryString(restriction);
- }
-
- public virtual DirectoryString RestrictionString
- {
- get { return restriction; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * RestrictionSyntax ::= DirectoryString (SIZE(1..1024))
- *
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- return restriction.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/kisa/KISAObjectIdentifiers.cs b/BCCrypto/src/asn1/kisa/KISAObjectIdentifiers.cs
deleted file mode 100644
index 05351ec..0000000
--- a/BCCrypto/src/asn1/kisa/KISAObjectIdentifiers.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace Org.BouncyCastle.Asn1.Kisa
-{
- public abstract class KisaObjectIdentifiers
- {
- public static readonly DerObjectIdentifier IdSeedCbc = new DerObjectIdentifier("1.2.410.200004.1.4");
- public static readonly DerObjectIdentifier IdNpkiAppCmsSeedWrap = new DerObjectIdentifier("1.2.410.200004.7.1.1.1");
- }
-}
diff --git a/BCCrypto/src/asn1/microsoft/MicrosoftObjectIdentifiers.cs b/BCCrypto/src/asn1/microsoft/MicrosoftObjectIdentifiers.cs
deleted file mode 100644
index bc48c3f..0000000
--- a/BCCrypto/src/asn1/microsoft/MicrosoftObjectIdentifiers.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Microsoft
-{
- public abstract class MicrosoftObjectIdentifiers
- {
- //
- // Microsoft
- // iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) Microsoft(311)
- //
- public static readonly DerObjectIdentifier Microsoft = new DerObjectIdentifier("1.3.6.1.4.1.311");
- public static readonly DerObjectIdentifier MicrosoftCertTemplateV1 = Microsoft.Branch("20.2");
- public static readonly DerObjectIdentifier MicrosoftCAVersion = Microsoft.Branch("21.1");
- public static readonly DerObjectIdentifier MicrosoftPrevCACertHash = Microsoft.Branch("21.2");
- public static readonly DerObjectIdentifier MicrosoftCrlNextPublish = Microsoft.Branch("21.4");
- public static readonly DerObjectIdentifier MicrosoftCertTemplateV2 = Microsoft.Branch("21.7");
- public static readonly DerObjectIdentifier MicrosoftAppPolicies = Microsoft.Branch("21.10");
- }
-}
diff --git a/BCCrypto/src/asn1/misc/CAST5CBCParameters.cs b/BCCrypto/src/asn1/misc/CAST5CBCParameters.cs
deleted file mode 100644
index 51fd660..0000000
--- a/BCCrypto/src/asn1/misc/CAST5CBCParameters.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Misc
-{
- public class Cast5CbcParameters
- : Asn1Encodable
- {
- private readonly DerInteger keyLength;
- private readonly Asn1OctetString iv;
-
- public static Cast5CbcParameters GetInstance(
- object o)
- {
- if (o is Cast5CbcParameters)
- {
- return (Cast5CbcParameters) o;
- }
-
- if (o is Asn1Sequence)
- {
- return new Cast5CbcParameters((Asn1Sequence) o);
- }
-
- throw new ArgumentException("unknown object in Cast5CbcParameters factory");
- }
-
- public Cast5CbcParameters(
- byte[] iv,
- int keyLength)
- {
- this.iv = new DerOctetString(iv);
- this.keyLength = new DerInteger(keyLength);
- }
-
- private Cast5CbcParameters(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- iv = (Asn1OctetString) seq[0];
- keyLength = (DerInteger) seq[1];
- }
-
- public byte[] GetIV()
- {
- return Arrays.Clone(iv.GetOctets());
- }
-
- public int KeyLength
- {
- get { return keyLength.Value.IntValue; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * cast5CBCParameters ::= Sequence {
- * iv OCTET STRING DEFAULT 0,
- * -- Initialization vector
- * keyLength Integer
- * -- Key length, in bits
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(iv, keyLength);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/misc/IDEACBCPar.cs b/BCCrypto/src/asn1/misc/IDEACBCPar.cs
deleted file mode 100644
index 72a60b9..0000000
--- a/BCCrypto/src/asn1/misc/IDEACBCPar.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Misc
-{
- public class IdeaCbcPar
- : Asn1Encodable
- {
- internal Asn1OctetString iv;
-
- public static IdeaCbcPar GetInstance(
- object o)
- {
- if (o is IdeaCbcPar)
- {
- return (IdeaCbcPar) o;
- }
-
- if (o is Asn1Sequence)
- {
- return new IdeaCbcPar((Asn1Sequence) o);
- }
-
- throw new ArgumentException("unknown object in IDEACBCPar factory");
- }
-
- public IdeaCbcPar(
- byte[] iv)
- {
- this.iv = new DerOctetString(iv);
- }
-
- private IdeaCbcPar(
- Asn1Sequence seq)
- {
- if (seq.Count == 1)
- {
- iv = (Asn1OctetString) seq[0];
- }
- }
-
- public byte[] GetIV()
- {
- return iv == null ? null : iv.GetOctets();
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * IDEA-CBCPar ::= Sequence {
- * iv OCTET STRING OPTIONAL -- exactly 8 octets
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (iv != null)
- {
- v.Add(iv);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/misc/MiscObjectIdentifiers.cs b/BCCrypto/src/asn1/misc/MiscObjectIdentifiers.cs
deleted file mode 100644
index 8128b69..0000000
--- a/BCCrypto/src/asn1/misc/MiscObjectIdentifiers.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-namespace Org.BouncyCastle.Asn1.Misc
-{
- public abstract class MiscObjectIdentifiers
- {
- //
- // Netscape
- // iso/itu(2) joint-assign(16) us(840) uscompany(1) Netscape(113730) cert-extensions(1) }
- //
- public static readonly DerObjectIdentifier Netscape = new DerObjectIdentifier("2.16.840.1.113730.1");
- public static readonly DerObjectIdentifier NetscapeCertType = Netscape.Branch("1");
- public static readonly DerObjectIdentifier NetscapeBaseUrl = Netscape.Branch("2");
- public static readonly DerObjectIdentifier NetscapeRevocationUrl = Netscape.Branch("3");
- public static readonly DerObjectIdentifier NetscapeCARevocationUrl = Netscape.Branch("4");
- public static readonly DerObjectIdentifier NetscapeRenewalUrl = Netscape.Branch("7");
- public static readonly DerObjectIdentifier NetscapeCAPolicyUrl = Netscape.Branch("8");
- public static readonly DerObjectIdentifier NetscapeSslServerName = Netscape.Branch("12");
- public static readonly DerObjectIdentifier NetscapeCertComment = Netscape.Branch("13");
-
- //
- // Verisign
- // iso/itu(2) joint-assign(16) us(840) uscompany(1) verisign(113733) cert-extensions(1) }
- //
- public static readonly DerObjectIdentifier Verisign = new DerObjectIdentifier("2.16.840.1.113733.1");
-
- //
- // CZAG - country, zip, age, and gender
- //
- public static readonly DerObjectIdentifier VerisignCzagExtension = Verisign.Branch("6.3");
-
- public static readonly DerObjectIdentifier VerisignPrivate_6_9 = Verisign.Branch("6.9");
- public static readonly DerObjectIdentifier VerisignOnSiteJurisdictionHash = Verisign.Branch("6.11");
- public static readonly DerObjectIdentifier VerisignBitString_6_13 = Verisign.Branch("6.13");
-
- // D&B D-U-N-S number
- public static readonly DerObjectIdentifier VerisignDnbDunsNumber = Verisign.Branch("6.15");
-
- public static readonly DerObjectIdentifier VerisignIssStrongCrypto = Verisign.Branch("8.1");
-
- //
- // Novell
- // iso/itu(2) country(16) us(840) organization(1) novell(113719)
- //
- public static readonly string Novell = "2.16.840.1.113719";
- public static readonly DerObjectIdentifier NovellSecurityAttribs = new DerObjectIdentifier(Novell + ".1.9.4.1");
-
- //
- // Entrust
- // iso(1) member-body(16) us(840) nortelnetworks(113533) entrust(7)
- //
- public static readonly string Entrust = "1.2.840.113533.7";
- public static readonly DerObjectIdentifier EntrustVersionExtension = new DerObjectIdentifier(Entrust + ".65.0");
-
- //
- // Ascom
- //
- public static readonly DerObjectIdentifier as_sys_sec_alg_ideaCBC = new DerObjectIdentifier("1.3.6.1.4.1.188.7.1.1.2");
-
- //
- // Peter Gutmann's Cryptlib
- //
- public static readonly DerObjectIdentifier cryptlib = new DerObjectIdentifier("1.3.6.1.4.1.3029");
-
- public static readonly DerObjectIdentifier cryptlib_algorithm = cryptlib.Branch("1");
- public static readonly DerObjectIdentifier cryptlib_algorithm_blowfish_ECB = cryptlib_algorithm.Branch("1.1");
- public static readonly DerObjectIdentifier cryptlib_algorithm_blowfish_CBC = cryptlib_algorithm.Branch("1.2");
- public static readonly DerObjectIdentifier cryptlib_algorithm_blowfish_CFB = cryptlib_algorithm.Branch("1.3");
- public static readonly DerObjectIdentifier cryptlib_algorithm_blowfish_OFB = cryptlib_algorithm.Branch("1.4");
-
- //
- // Blake2b
- //
- public static readonly DerObjectIdentifier blake2 = new DerObjectIdentifier("1.3.6.1.4.1.1722.12.2");
-
- public static readonly DerObjectIdentifier id_blake2b160 = blake2.Branch("1.5");
- public static readonly DerObjectIdentifier id_blake2b256 = blake2.Branch("1.8");
- public static readonly DerObjectIdentifier id_blake2b384 = blake2.Branch("1.12");
- public static readonly DerObjectIdentifier id_blake2b512 = blake2.Branch("1.16");
- }
-}
diff --git a/BCCrypto/src/asn1/misc/NetscapeCertType.cs b/BCCrypto/src/asn1/misc/NetscapeCertType.cs
deleted file mode 100644
index d809eae..0000000
--- a/BCCrypto/src/asn1/misc/NetscapeCertType.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Misc
-{
- /**
- * The NetscapeCertType object.
- *
- * NetscapeCertType ::= BIT STRING {
- * SSLClient (0),
- * SSLServer (1),
- * S/MIME (2),
- * Object Signing (3),
- * Reserved (4),
- * SSL CA (5),
- * S/MIME CA (6),
- * Object Signing CA (7) }
- *
- */
- public class NetscapeCertType
- : DerBitString
- {
- public const int SslClient = (1 << 7);
- public const int SslServer = (1 << 6);
- public const int Smime = (1 << 5);
- public const int ObjectSigning = (1 << 4);
- public const int Reserved = (1 << 3);
- public const int SslCA = (1 << 2);
- public const int SmimeCA = (1 << 1);
- public const int ObjectSigningCA = (1 << 0);
-
- /**
- * Basic constructor.
- *
- * @param usage - the bitwise OR of the Key Usage flags giving the
- * allowed uses for the key.
- * e.g. (X509NetscapeCertType.sslCA | X509NetscapeCertType.smimeCA)
- */
- public NetscapeCertType(int usage)
- : base(usage)
- {
- }
-
- public NetscapeCertType(DerBitString usage)
- : base(usage.GetBytes(), usage.PadBits)
- {
- }
-
- public override string ToString()
- {
- byte[] data = GetBytes();
- return "NetscapeCertType: 0x" + (data[0] & 0xff).ToString("X");
- }
- }
-}
diff --git a/BCCrypto/src/asn1/misc/NetscapeRevocationURL.cs b/BCCrypto/src/asn1/misc/NetscapeRevocationURL.cs
deleted file mode 100644
index 6cac031..0000000
--- a/BCCrypto/src/asn1/misc/NetscapeRevocationURL.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Misc
-{
- public class NetscapeRevocationUrl
- : DerIA5String
- {
- public NetscapeRevocationUrl(DerIA5String str)
- : base(str.GetString())
- {
- }
-
- public override string ToString()
- {
- return "NetscapeRevocationUrl: " + this.GetString();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/misc/VerisignCzagExtension.cs b/BCCrypto/src/asn1/misc/VerisignCzagExtension.cs
deleted file mode 100644
index 1c3054b..0000000
--- a/BCCrypto/src/asn1/misc/VerisignCzagExtension.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Misc
-{
- public class VerisignCzagExtension
- : DerIA5String
- {
- public VerisignCzagExtension(DerIA5String str)
- : base(str.GetString())
- {
- }
-
- public override string ToString()
- {
- return "VerisignCzagExtension: " + this.GetString();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/mozilla/PublicKeyAndChallenge.cs b/BCCrypto/src/asn1/mozilla/PublicKeyAndChallenge.cs
deleted file mode 100644
index ff2a119..0000000
--- a/BCCrypto/src/asn1/mozilla/PublicKeyAndChallenge.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Mozilla
-{
- /**
- * This is designed to parse
- * the PublicKeyAndChallenge created by the KEYGEN tag included by
- * Mozilla based browsers.
- *
- * PublicKeyAndChallenge ::= SEQUENCE {
- * spki SubjectPublicKeyInfo,
- * challenge IA5STRING
- * }
- *
- *
- */
- public class PublicKeyAndChallenge
- : Asn1Encodable
- {
- private Asn1Sequence pkacSeq;
- private SubjectPublicKeyInfo spki;
- private DerIA5String challenge;
-
- public static PublicKeyAndChallenge GetInstance(
- object obj)
- {
- if (obj is PublicKeyAndChallenge)
- {
- return (PublicKeyAndChallenge) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new PublicKeyAndChallenge((Asn1Sequence) obj);
- }
-
- throw new ArgumentException(
- "unknown object in 'PublicKeyAndChallenge' factory : "
- + Platform.GetTypeName(obj) + ".");
- }
-
- public PublicKeyAndChallenge(
- Asn1Sequence seq)
- {
- pkacSeq = seq;
- spki = SubjectPublicKeyInfo.GetInstance(seq[0]);
- challenge = DerIA5String.GetInstance(seq[1]);
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return pkacSeq;
- }
-
- public SubjectPublicKeyInfo SubjectPublicKeyInfo
- {
- get { return spki; }
- }
-
- public DerIA5String Challenge
- {
- get { return challenge; }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/nist/NISTNamedCurves.cs b/BCCrypto/src/asn1/nist/NISTNamedCurves.cs
deleted file mode 100644
index f6c1598..0000000
--- a/BCCrypto/src/asn1/nist/NISTNamedCurves.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Sec;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.Nist
-{
- /**
- * Utility class for fetching curves using their NIST names as published in FIPS-PUB 186-3
- */
- public sealed class NistNamedCurves
- {
- private NistNamedCurves()
- {
- }
-
- private static readonly IDictionary objIds = Platform.CreateHashtable();
- private static readonly IDictionary names = Platform.CreateHashtable();
-
- private static void DefineCurveAlias(
- string name,
- DerObjectIdentifier oid)
- {
- objIds.Add(Platform.ToUpperInvariant(name), oid);
- names.Add(oid, name);
- }
-
- static NistNamedCurves()
- {
- DefineCurveAlias("B-163", SecObjectIdentifiers.SecT163r2);
- DefineCurveAlias("B-233", SecObjectIdentifiers.SecT233r1);
- DefineCurveAlias("B-283", SecObjectIdentifiers.SecT283r1);
- DefineCurveAlias("B-409", SecObjectIdentifiers.SecT409r1);
- DefineCurveAlias("B-571", SecObjectIdentifiers.SecT571r1);
-
- DefineCurveAlias("K-163", SecObjectIdentifiers.SecT163k1);
- DefineCurveAlias("K-233", SecObjectIdentifiers.SecT233k1);
- DefineCurveAlias("K-283", SecObjectIdentifiers.SecT283k1);
- DefineCurveAlias("K-409", SecObjectIdentifiers.SecT409k1);
- DefineCurveAlias("K-571", SecObjectIdentifiers.SecT571k1);
-
- DefineCurveAlias("P-192", SecObjectIdentifiers.SecP192r1);
- DefineCurveAlias("P-224", SecObjectIdentifiers.SecP224r1);
- DefineCurveAlias("P-256", SecObjectIdentifiers.SecP256r1);
- DefineCurveAlias("P-384", SecObjectIdentifiers.SecP384r1);
- DefineCurveAlias("P-521", SecObjectIdentifiers.SecP521r1);
- }
-
- public static X9ECParameters GetByName(
- string name)
- {
- DerObjectIdentifier oid = GetOid(name);
- return oid == null ? null : GetByOid(oid);
- }
-
- /**
- * return the X9ECParameters object for the named curve represented by
- * the passed in object identifier. Null if the curve isn't present.
- *
- * @param oid an object identifier representing a named curve, if present.
- */
- public static X9ECParameters GetByOid(
- DerObjectIdentifier oid)
- {
- return SecNamedCurves.GetByOid(oid);
- }
-
- /**
- * return the object identifier signified by the passed in name. Null
- * if there is no object identifier associated with name.
- *
- * @return the object identifier associated with name, if present.
- */
- public static DerObjectIdentifier GetOid(
- string name)
- {
- return (DerObjectIdentifier) objIds[Platform.ToUpperInvariant(name)];
- }
-
- /**
- * return the named curve name represented by the given object identifier.
- */
- public static string GetName(
- DerObjectIdentifier oid)
- {
- return (string) names[oid];
- }
-
- /**
- * returns an enumeration containing the name strings for curves
- * contained in this structure.
- */
- public static IEnumerable Names
- {
- get { return new EnumerableProxy(names.Values); }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/nist/NISTObjectIdentifiers.cs b/BCCrypto/src/asn1/nist/NISTObjectIdentifiers.cs
deleted file mode 100644
index 55b9d8e..0000000
--- a/BCCrypto/src/asn1/nist/NISTObjectIdentifiers.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Nist
-{
- public sealed class NistObjectIdentifiers
- {
- private NistObjectIdentifiers()
- {
- }
-
- //
- // NIST
- // iso/itu(2) joint-assign(16) us(840) organization(1) gov(101) csor(3)
-
- //
- // nistalgorithms(4)
- //
- public static readonly DerObjectIdentifier NistAlgorithm = new DerObjectIdentifier("2.16.840.1.101.3.4");
-
- public static readonly DerObjectIdentifier HashAlgs = NistAlgorithm.Branch("2");
-
- public static readonly DerObjectIdentifier IdSha256 = HashAlgs.Branch("1");
- public static readonly DerObjectIdentifier IdSha384 = HashAlgs.Branch("2");
- public static readonly DerObjectIdentifier IdSha512 = HashAlgs.Branch("3");
- public static readonly DerObjectIdentifier IdSha224 = HashAlgs.Branch("4");
- public static readonly DerObjectIdentifier IdSha512_224 = HashAlgs.Branch("5");
- public static readonly DerObjectIdentifier IdSha512_256 = HashAlgs.Branch("6");
- public static readonly DerObjectIdentifier IdSha3_224 = HashAlgs.Branch("7");
- public static readonly DerObjectIdentifier IdSha3_256 = HashAlgs.Branch("8");
- public static readonly DerObjectIdentifier IdSha3_384 = HashAlgs.Branch("9");
- public static readonly DerObjectIdentifier IdSha3_512 = HashAlgs.Branch("10");
- public static readonly DerObjectIdentifier IdShake128 = HashAlgs.Branch("11");
- public static readonly DerObjectIdentifier IdShake256 = HashAlgs.Branch("12");
-
- public static readonly DerObjectIdentifier Aes = new DerObjectIdentifier(NistAlgorithm + ".1");
-
- public static readonly DerObjectIdentifier IdAes128Ecb = new DerObjectIdentifier(Aes + ".1");
- public static readonly DerObjectIdentifier IdAes128Cbc = new DerObjectIdentifier(Aes + ".2");
- public static readonly DerObjectIdentifier IdAes128Ofb = new DerObjectIdentifier(Aes + ".3");
- public static readonly DerObjectIdentifier IdAes128Cfb = new DerObjectIdentifier(Aes + ".4");
- public static readonly DerObjectIdentifier IdAes128Wrap = new DerObjectIdentifier(Aes + ".5");
- public static readonly DerObjectIdentifier IdAes128Gcm = new DerObjectIdentifier(Aes + ".6");
- public static readonly DerObjectIdentifier IdAes128Ccm = new DerObjectIdentifier(Aes + ".7");
-
- public static readonly DerObjectIdentifier IdAes192Ecb = new DerObjectIdentifier(Aes + ".21");
- public static readonly DerObjectIdentifier IdAes192Cbc = new DerObjectIdentifier(Aes + ".22");
- public static readonly DerObjectIdentifier IdAes192Ofb = new DerObjectIdentifier(Aes + ".23");
- public static readonly DerObjectIdentifier IdAes192Cfb = new DerObjectIdentifier(Aes + ".24");
- public static readonly DerObjectIdentifier IdAes192Wrap = new DerObjectIdentifier(Aes + ".25");
- public static readonly DerObjectIdentifier IdAes192Gcm = new DerObjectIdentifier(Aes + ".26");
- public static readonly DerObjectIdentifier IdAes192Ccm = new DerObjectIdentifier(Aes + ".27");
-
- public static readonly DerObjectIdentifier IdAes256Ecb = new DerObjectIdentifier(Aes + ".41");
- public static readonly DerObjectIdentifier IdAes256Cbc = new DerObjectIdentifier(Aes + ".42");
- public static readonly DerObjectIdentifier IdAes256Ofb = new DerObjectIdentifier(Aes + ".43");
- public static readonly DerObjectIdentifier IdAes256Cfb = new DerObjectIdentifier(Aes + ".44");
- public static readonly DerObjectIdentifier IdAes256Wrap = new DerObjectIdentifier(Aes + ".45");
- public static readonly DerObjectIdentifier IdAes256Gcm = new DerObjectIdentifier(Aes + ".46");
- public static readonly DerObjectIdentifier IdAes256Ccm = new DerObjectIdentifier(Aes + ".47");
-
- //
- // signatures
- //
- public static readonly DerObjectIdentifier IdDsaWithSha2 = new DerObjectIdentifier(NistAlgorithm + ".3");
-
- public static readonly DerObjectIdentifier DsaWithSha224 = new DerObjectIdentifier(IdDsaWithSha2 + ".1");
- public static readonly DerObjectIdentifier DsaWithSha256 = new DerObjectIdentifier(IdDsaWithSha2 + ".2");
- public static readonly DerObjectIdentifier DsaWithSha384 = new DerObjectIdentifier(IdDsaWithSha2 + ".3");
- public static readonly DerObjectIdentifier DsaWithSha512 = new DerObjectIdentifier(IdDsaWithSha2 + ".4");
- }
-}
diff --git a/BCCrypto/src/asn1/ntt/NTTObjectIdentifiers.cs b/BCCrypto/src/asn1/ntt/NTTObjectIdentifiers.cs
deleted file mode 100644
index cd25956..0000000
--- a/BCCrypto/src/asn1/ntt/NTTObjectIdentifiers.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace Org.BouncyCastle.Asn1.Ntt
-{
- /// From RFC 3657
- public abstract class NttObjectIdentifiers
- {
- public static readonly DerObjectIdentifier IdCamellia128Cbc = new DerObjectIdentifier("1.2.392.200011.61.1.1.1.2");
- public static readonly DerObjectIdentifier IdCamellia192Cbc = new DerObjectIdentifier("1.2.392.200011.61.1.1.1.3");
- public static readonly DerObjectIdentifier IdCamellia256Cbc = new DerObjectIdentifier("1.2.392.200011.61.1.1.1.4");
-
- public static readonly DerObjectIdentifier IdCamellia128Wrap = new DerObjectIdentifier("1.2.392.200011.61.1.1.3.2");
- public static readonly DerObjectIdentifier IdCamellia192Wrap = new DerObjectIdentifier("1.2.392.200011.61.1.1.3.3");
- public static readonly DerObjectIdentifier IdCamellia256Wrap = new DerObjectIdentifier("1.2.392.200011.61.1.1.3.4");
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/BasicOCSPResponse.cs b/BCCrypto/src/asn1/ocsp/BasicOCSPResponse.cs
deleted file mode 100644
index e6aa1f8..0000000
--- a/BCCrypto/src/asn1/ocsp/BasicOCSPResponse.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class BasicOcspResponse
- : Asn1Encodable
- {
- private readonly ResponseData tbsResponseData;
- private readonly AlgorithmIdentifier signatureAlgorithm;
- private readonly DerBitString signature;
- private readonly Asn1Sequence certs;
-
- public static BasicOcspResponse GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static BasicOcspResponse GetInstance(
- object obj)
- {
- if (obj == null || obj is BasicOcspResponse)
- {
- return (BasicOcspResponse)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new BasicOcspResponse((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public BasicOcspResponse(
- ResponseData tbsResponseData,
- AlgorithmIdentifier signatureAlgorithm,
- DerBitString signature,
- Asn1Sequence certs)
- {
- this.tbsResponseData = tbsResponseData;
- this.signatureAlgorithm = signatureAlgorithm;
- this.signature = signature;
- this.certs = certs;
- }
-
- private BasicOcspResponse(
- Asn1Sequence seq)
- {
- this.tbsResponseData = ResponseData.GetInstance(seq[0]);
- this.signatureAlgorithm = AlgorithmIdentifier.GetInstance(seq[1]);
- this.signature = (DerBitString)seq[2];
-
- if (seq.Count > 3)
- {
- this.certs = Asn1Sequence.GetInstance((Asn1TaggedObject)seq[3], true);
- }
- }
-
- [Obsolete("Use TbsResponseData property instead")]
- public ResponseData GetTbsResponseData()
- {
- return tbsResponseData;
- }
-
- public ResponseData TbsResponseData
- {
- get { return tbsResponseData; }
- }
-
- [Obsolete("Use SignatureAlgorithm property instead")]
- public AlgorithmIdentifier GetSignatureAlgorithm()
- {
- return signatureAlgorithm;
- }
-
- public AlgorithmIdentifier SignatureAlgorithm
- {
- get { return signatureAlgorithm; }
- }
-
- [Obsolete("Use Signature property instead")]
- public DerBitString GetSignature()
- {
- return signature;
- }
-
- public DerBitString Signature
- {
- get { return signature; }
- }
-
- public byte[] GetSignatureOctets()
- {
- return signature.GetOctets();
- }
-
- [Obsolete("Use Certs property instead")]
- public Asn1Sequence GetCerts()
- {
- return certs;
- }
-
- public Asn1Sequence Certs
- {
- get { return certs; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * BasicOcspResponse ::= Sequence {
- * tbsResponseData ResponseData,
- * signatureAlgorithm AlgorithmIdentifier,
- * signature BIT STRING,
- * certs [0] EXPLICIT Sequence OF Certificate OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- tbsResponseData, signatureAlgorithm, signature);
-
- if (certs != null)
- {
- v.Add(new DerTaggedObject(true, 0, certs));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/CertID.cs b/BCCrypto/src/asn1/ocsp/CertID.cs
deleted file mode 100644
index 523f6b8..0000000
--- a/BCCrypto/src/asn1/ocsp/CertID.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class CertID
- : Asn1Encodable
- {
- private readonly AlgorithmIdentifier hashAlgorithm;
- private readonly Asn1OctetString issuerNameHash;
- private readonly Asn1OctetString issuerKeyHash;
- private readonly DerInteger serialNumber;
-
- public static CertID GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static CertID GetInstance(
- object obj)
- {
- if (obj == null || obj is CertID)
- {
- return (CertID)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new CertID((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public CertID(
- AlgorithmIdentifier hashAlgorithm,
- Asn1OctetString issuerNameHash,
- Asn1OctetString issuerKeyHash,
- DerInteger serialNumber)
- {
- this.hashAlgorithm = hashAlgorithm;
- this.issuerNameHash = issuerNameHash;
- this.issuerKeyHash = issuerKeyHash;
- this.serialNumber = serialNumber;
- }
-
- private CertID(
- Asn1Sequence seq)
- {
- if (seq.Count != 4)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- this.hashAlgorithm = AlgorithmIdentifier.GetInstance(seq[0]);
- this.issuerNameHash = Asn1OctetString.GetInstance(seq[1]);
- this.issuerKeyHash = Asn1OctetString.GetInstance(seq[2]);
- this.serialNumber = DerInteger.GetInstance(seq[3]);
- }
-
- public AlgorithmIdentifier HashAlgorithm
- {
- get { return hashAlgorithm; }
- }
-
- public Asn1OctetString IssuerNameHash
- {
- get { return issuerNameHash; }
- }
-
- public Asn1OctetString IssuerKeyHash
- {
- get { return issuerKeyHash; }
- }
-
- public DerInteger SerialNumber
- {
- get { return serialNumber; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * CertID ::= Sequence {
- * hashAlgorithm AlgorithmIdentifier,
- * issuerNameHash OCTET STRING, -- Hash of Issuer's DN
- * issuerKeyHash OCTET STRING, -- Hash of Issuers public key
- * serialNumber CertificateSerialNumber }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(hashAlgorithm, issuerNameHash, issuerKeyHash, serialNumber);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/CertStatus.cs b/BCCrypto/src/asn1/ocsp/CertStatus.cs
deleted file mode 100644
index 7dd99b8..0000000
--- a/BCCrypto/src/asn1/ocsp/CertStatus.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class CertStatus
- : Asn1Encodable, IAsn1Choice
- {
- private readonly int tagNo;
- private readonly Asn1Encodable value;
-
- /**
- * create a CertStatus object with a tag of zero.
- */
- public CertStatus()
- {
- tagNo = 0;
- value = DerNull.Instance;
- }
-
- public CertStatus(
- RevokedInfo info)
- {
- tagNo = 1;
- value = info;
- }
-
- public CertStatus(
- int tagNo,
- Asn1Encodable value)
- {
- this.tagNo = tagNo;
- this.value = value;
- }
-
- public CertStatus(
- Asn1TaggedObject choice)
- {
- this.tagNo = choice.TagNo;
-
- switch (choice.TagNo)
- {
- case 1:
- value = RevokedInfo.GetInstance(choice, false);
- break;
- case 0:
- case 2:
- value = DerNull.Instance;
- break;
- default:
- throw new ArgumentException("Unknown tag encountered: " + choice.TagNo);
- }
- }
-
- public static CertStatus GetInstance(
- object obj)
- {
- if (obj == null || obj is CertStatus)
- {
- return (CertStatus)obj;
- }
-
- if (obj is Asn1TaggedObject)
- {
- return new CertStatus((Asn1TaggedObject)obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public int TagNo
- {
- get { return tagNo; }
- }
-
- public Asn1Encodable Status
- {
- get { return value; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * CertStatus ::= CHOICE {
- * good [0] IMPLICIT Null,
- * revoked [1] IMPLICIT RevokedInfo,
- * unknown [2] IMPLICIT UnknownInfo }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerTaggedObject(false, tagNo, value);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/CrlID.cs b/BCCrypto/src/asn1/ocsp/CrlID.cs
deleted file mode 100644
index cfb3d6f..0000000
--- a/BCCrypto/src/asn1/ocsp/CrlID.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class CrlID
- : Asn1Encodable
- {
- private readonly DerIA5String crlUrl;
- private readonly DerInteger crlNum;
- private readonly DerGeneralizedTime crlTime;
-
- // TODO Add GetInstance method(s) and amke this private?
- public CrlID(
- Asn1Sequence seq)
- {
- foreach (Asn1TaggedObject o in seq)
- {
- switch (o.TagNo)
- {
- case 0:
- crlUrl = DerIA5String.GetInstance(o, true);
- break;
- case 1:
- crlNum = DerInteger.GetInstance(o, true);
- break;
- case 2:
- crlTime = DerGeneralizedTime.GetInstance(o, true);
- break;
- default:
- throw new ArgumentException("unknown tag number: " + o.TagNo);
- }
- }
- }
-
- public DerIA5String CrlUrl
- {
- get { return crlUrl; }
- }
-
- public DerInteger CrlNum
- {
- get { return crlNum; }
- }
-
- public DerGeneralizedTime CrlTime
- {
- get { return crlTime; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * CrlID ::= Sequence {
- * crlUrl [0] EXPLICIT IA5String OPTIONAL,
- * crlNum [1] EXPLICIT Integer OPTIONAL,
- * crlTime [2] EXPLICIT GeneralizedTime OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (crlUrl != null)
- {
- v.Add(new DerTaggedObject(true, 0, crlUrl));
- }
-
- if (crlNum != null)
- {
- v.Add(new DerTaggedObject(true, 1, crlNum));
- }
-
- if (crlTime != null)
- {
- v.Add(new DerTaggedObject(true, 2, crlTime));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/OCSPObjectIdentifiers.cs b/BCCrypto/src/asn1/ocsp/OCSPObjectIdentifiers.cs
deleted file mode 100644
index a37c855..0000000
--- a/BCCrypto/src/asn1/ocsp/OCSPObjectIdentifiers.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public abstract class OcspObjectIdentifiers
- {
- internal const string PkixOcspId = "1.3.6.1.5.5.7.48.1";
-
- public static readonly DerObjectIdentifier PkixOcsp = new DerObjectIdentifier(PkixOcspId);
- public static readonly DerObjectIdentifier PkixOcspBasic = new DerObjectIdentifier(PkixOcspId + ".1");
-
- //
- // extensions
- //
- public static readonly DerObjectIdentifier PkixOcspNonce = new DerObjectIdentifier(PkixOcsp + ".2");
- public static readonly DerObjectIdentifier PkixOcspCrl = new DerObjectIdentifier(PkixOcsp + ".3");
-
- public static readonly DerObjectIdentifier PkixOcspResponse = new DerObjectIdentifier(PkixOcsp + ".4");
- public static readonly DerObjectIdentifier PkixOcspNocheck = new DerObjectIdentifier(PkixOcsp + ".5");
- public static readonly DerObjectIdentifier PkixOcspArchiveCutoff = new DerObjectIdentifier(PkixOcsp + ".6");
- public static readonly DerObjectIdentifier PkixOcspServiceLocator = new DerObjectIdentifier(PkixOcsp + ".7");
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/OCSPRequest.cs b/BCCrypto/src/asn1/ocsp/OCSPRequest.cs
deleted file mode 100644
index 2407678..0000000
--- a/BCCrypto/src/asn1/ocsp/OCSPRequest.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class OcspRequest
- : Asn1Encodable
- {
- private readonly TbsRequest tbsRequest;
- private readonly Signature optionalSignature;
-
- public static OcspRequest GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static OcspRequest GetInstance(
- object obj)
- {
- if (obj == null || obj is OcspRequest)
- {
- return (OcspRequest)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new OcspRequest((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public OcspRequest(
- TbsRequest tbsRequest,
- Signature optionalSignature)
- {
- if (tbsRequest == null)
- throw new ArgumentNullException("tbsRequest");
-
- this.tbsRequest = tbsRequest;
- this.optionalSignature = optionalSignature;
- }
-
- private OcspRequest(
- Asn1Sequence seq)
- {
- tbsRequest = TbsRequest.GetInstance(seq[0]);
-
- if (seq.Count == 2)
- {
- optionalSignature = Signature.GetInstance(
- (Asn1TaggedObject)seq[1], true);
- }
- }
-
- public TbsRequest TbsRequest
- {
- get { return tbsRequest; }
- }
-
- public Signature OptionalSignature
- {
- get { return optionalSignature; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * OcspRequest ::= Sequence {
- * tbsRequest TBSRequest,
- * optionalSignature [0] EXPLICIT Signature OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(tbsRequest);
-
- if (optionalSignature != null)
- {
- v.Add(new DerTaggedObject(true, 0, optionalSignature));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/OCSPResponse.cs b/BCCrypto/src/asn1/ocsp/OCSPResponse.cs
deleted file mode 100644
index 9477b61..0000000
--- a/BCCrypto/src/asn1/ocsp/OCSPResponse.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class OcspResponse
- : Asn1Encodable
- {
- private readonly OcspResponseStatus responseStatus;
- private readonly ResponseBytes responseBytes;
-
- public static OcspResponse GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static OcspResponse GetInstance(
- object obj)
- {
- if (obj == null || obj is OcspResponse)
- {
- return (OcspResponse)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new OcspResponse((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public OcspResponse(
- OcspResponseStatus responseStatus,
- ResponseBytes responseBytes)
- {
- if (responseStatus == null)
- throw new ArgumentNullException("responseStatus");
-
- this.responseStatus = responseStatus;
- this.responseBytes = responseBytes;
- }
-
- private OcspResponse(
- Asn1Sequence seq)
- {
- responseStatus = new OcspResponseStatus(
- DerEnumerated.GetInstance(seq[0]));
-
- if (seq.Count == 2)
- {
- responseBytes = ResponseBytes.GetInstance(
- (Asn1TaggedObject)seq[1], true);
- }
- }
-
- public OcspResponseStatus ResponseStatus
- {
- get { return responseStatus; }
- }
-
- public ResponseBytes ResponseBytes
- {
- get { return responseBytes; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * OcspResponse ::= Sequence {
- * responseStatus OcspResponseStatus,
- * responseBytes [0] EXPLICIT ResponseBytes OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(responseStatus);
-
- if (responseBytes != null)
- {
- v.Add(new DerTaggedObject(true, 0, responseBytes));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/OCSPResponseStatus.cs b/BCCrypto/src/asn1/ocsp/OCSPResponseStatus.cs
deleted file mode 100644
index 653317e..0000000
--- a/BCCrypto/src/asn1/ocsp/OCSPResponseStatus.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class OcspResponseStatus
- : DerEnumerated
- {
- public const int Successful = 0;
- public const int MalformedRequest = 1;
- public const int InternalError = 2;
- public const int TryLater = 3;
- public const int SignatureRequired = 5;
- public const int Unauthorized = 6;
-
- /**
- * The OcspResponseStatus enumeration.
- *
- * OcspResponseStatus ::= Enumerated {
- * successful (0), --Response has valid confirmations
- * malformedRequest (1), --Illegal confirmation request
- * internalError (2), --Internal error in issuer
- * tryLater (3), --Try again later
- * --(4) is not used
- * sigRequired (5), --Must sign the request
- * unauthorized (6) --Request unauthorized
- * }
- *
- */
- public OcspResponseStatus(int value)
- : base(value)
- {
- }
-
- public OcspResponseStatus(DerEnumerated value)
- : base(value.Value.IntValue)
- {
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/Request.cs b/BCCrypto/src/asn1/ocsp/Request.cs
deleted file mode 100644
index 26e81ba..0000000
--- a/BCCrypto/src/asn1/ocsp/Request.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class Request
- : Asn1Encodable
- {
- private readonly CertID reqCert;
- private readonly X509Extensions singleRequestExtensions;
-
- public static Request GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static Request GetInstance(
- object obj)
- {
- if (obj == null || obj is Request)
- {
- return (Request)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new Request((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public Request(
- CertID reqCert,
- X509Extensions singleRequestExtensions)
- {
- if (reqCert == null)
- throw new ArgumentNullException("reqCert");
-
- this.reqCert = reqCert;
- this.singleRequestExtensions = singleRequestExtensions;
- }
-
- private Request(
- Asn1Sequence seq)
- {
- reqCert = CertID.GetInstance(seq[0]);
-
- if (seq.Count == 2)
- {
- singleRequestExtensions = X509Extensions.GetInstance(
- (Asn1TaggedObject)seq[1], true);
- }
- }
-
- public CertID ReqCert
- {
- get { return reqCert; }
- }
-
- public X509Extensions SingleRequestExtensions
- {
- get { return singleRequestExtensions; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Request ::= Sequence {
- * reqCert CertID,
- * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(reqCert);
-
- if (singleRequestExtensions != null)
- {
- v.Add(new DerTaggedObject(true, 0, singleRequestExtensions));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/ResponderID.cs b/BCCrypto/src/asn1/ocsp/ResponderID.cs
deleted file mode 100644
index 143b173..0000000
--- a/BCCrypto/src/asn1/ocsp/ResponderID.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class ResponderID
- : Asn1Encodable, IAsn1Choice
- {
- private readonly Asn1Encodable id;
-
- public static ResponderID GetInstance(
- object obj)
- {
- if (obj == null || obj is ResponderID)
- {
- return (ResponderID)obj;
- }
-
- if (obj is DerOctetString)
- {
- return new ResponderID((DerOctetString)obj);
- }
-
- if (obj is Asn1TaggedObject)
- {
- Asn1TaggedObject o = (Asn1TaggedObject)obj;
-
- if (o.TagNo == 1)
- {
- return new ResponderID(X509Name.GetInstance(o, true));
- }
-
- return new ResponderID(Asn1OctetString.GetInstance(o, true));
- }
-
- return new ResponderID(X509Name.GetInstance(obj));
- }
-
- public ResponderID(
- Asn1OctetString id)
- {
- if (id == null)
- throw new ArgumentNullException("id");
-
- this.id = id;
- }
-
- public ResponderID(
- X509Name id)
- {
- if (id == null)
- throw new ArgumentNullException("id");
-
- this.id = id;
- }
-
- public static ResponderID GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(obj.GetObject()); // must be explicitly tagged
- }
-
- public virtual byte[] GetKeyHash()
- {
- if (id is Asn1OctetString)
- {
- return ((Asn1OctetString)id).GetOctets();
- }
-
- return null;
- }
-
- public virtual X509Name Name
- {
- get
- {
- if (id is Asn1OctetString)
- {
- return null;
- }
-
- return X509Name.GetInstance(id);
- }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * ResponderID ::= CHOICE {
- * byName [1] Name,
- * byKey [2] KeyHash }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- if (id is Asn1OctetString)
- {
- return new DerTaggedObject(true, 2, id);
- }
-
- return new DerTaggedObject(true, 1, id);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/ResponseBytes.cs b/BCCrypto/src/asn1/ocsp/ResponseBytes.cs
deleted file mode 100644
index d3ea044..0000000
--- a/BCCrypto/src/asn1/ocsp/ResponseBytes.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class ResponseBytes
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier responseType;
- private readonly Asn1OctetString response;
-
- public static ResponseBytes GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static ResponseBytes GetInstance(
- object obj)
- {
- if (obj == null || obj is ResponseBytes)
- {
- return (ResponseBytes)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new ResponseBytes((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public ResponseBytes(
- DerObjectIdentifier responseType,
- Asn1OctetString response)
- {
- if (responseType == null)
- throw new ArgumentNullException("responseType");
- if (response == null)
- throw new ArgumentNullException("response");
-
- this.responseType = responseType;
- this.response = response;
- }
-
- private ResponseBytes(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- this.responseType = DerObjectIdentifier.GetInstance(seq[0]);
- this.response = Asn1OctetString.GetInstance(seq[1]);
- }
-
- public DerObjectIdentifier ResponseType
- {
- get { return responseType; }
- }
-
- public Asn1OctetString Response
- {
- get { return response; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * ResponseBytes ::= Sequence {
- * responseType OBJECT IDENTIFIER,
- * response OCTET STRING }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(responseType, response);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/ResponseData.cs b/BCCrypto/src/asn1/ocsp/ResponseData.cs
deleted file mode 100644
index 70620cb..0000000
--- a/BCCrypto/src/asn1/ocsp/ResponseData.cs
+++ /dev/null
@@ -1,158 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class ResponseData
- : Asn1Encodable
- {
- private static readonly DerInteger V1 = new DerInteger(0);
-
- private readonly bool versionPresent;
- private readonly DerInteger version;
- private readonly ResponderID responderID;
- private readonly DerGeneralizedTime producedAt;
- private readonly Asn1Sequence responses;
- private readonly X509Extensions responseExtensions;
-
- public static ResponseData GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static ResponseData GetInstance(
- object obj)
- {
- if (obj == null || obj is ResponseData)
- {
- return (ResponseData)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new ResponseData((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public ResponseData(
- DerInteger version,
- ResponderID responderID,
- DerGeneralizedTime producedAt,
- Asn1Sequence responses,
- X509Extensions responseExtensions)
- {
- this.version = version;
- this.responderID = responderID;
- this.producedAt = producedAt;
- this.responses = responses;
- this.responseExtensions = responseExtensions;
- }
-
- public ResponseData(
- ResponderID responderID,
- DerGeneralizedTime producedAt,
- Asn1Sequence responses,
- X509Extensions responseExtensions)
- : this(V1, responderID, producedAt, responses, responseExtensions)
- {
- }
-
- private ResponseData(
- Asn1Sequence seq)
- {
- int index = 0;
-
- Asn1Encodable enc = seq[0];
- if (enc is Asn1TaggedObject)
- {
- Asn1TaggedObject o = (Asn1TaggedObject)enc;
-
- if (o.TagNo == 0)
- {
- this.versionPresent = true;
- this.version = DerInteger.GetInstance(o, true);
- index++;
- }
- else
- {
- this.version = V1;
- }
- }
- else
- {
- this.version = V1;
- }
-
- this.responderID = ResponderID.GetInstance(seq[index++]);
- this.producedAt = (DerGeneralizedTime)seq[index++];
- this.responses = (Asn1Sequence)seq[index++];
-
- if (seq.Count > index)
- {
- this.responseExtensions = X509Extensions.GetInstance(
- (Asn1TaggedObject)seq[index], true);
- }
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public ResponderID ResponderID
- {
- get { return responderID; }
- }
-
- public DerGeneralizedTime ProducedAt
- {
- get { return producedAt; }
- }
-
- public Asn1Sequence Responses
- {
- get { return responses; }
- }
-
- public X509Extensions ResponseExtensions
- {
- get { return responseExtensions; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * ResponseData ::= Sequence {
- * version [0] EXPLICIT Version DEFAULT v1,
- * responderID ResponderID,
- * producedAt GeneralizedTime,
- * responses Sequence OF SingleResponse,
- * responseExtensions [1] EXPLICIT Extensions OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (versionPresent || !version.Equals(V1))
- {
- v.Add(new DerTaggedObject(true, 0, version));
- }
-
- v.Add(responderID, producedAt, responses);
-
- if (responseExtensions != null)
- {
- v.Add(new DerTaggedObject(true, 1, responseExtensions));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/RevokedInfo.cs b/BCCrypto/src/asn1/ocsp/RevokedInfo.cs
deleted file mode 100644
index ee9e554..0000000
--- a/BCCrypto/src/asn1/ocsp/RevokedInfo.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class RevokedInfo
- : Asn1Encodable
- {
- private readonly DerGeneralizedTime revocationTime;
- private readonly CrlReason revocationReason;
-
- public static RevokedInfo GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static RevokedInfo GetInstance(
- object obj)
- {
- if (obj == null || obj is RevokedInfo)
- {
- return (RevokedInfo) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new RevokedInfo((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public RevokedInfo(
- DerGeneralizedTime revocationTime)
- : this(revocationTime, null)
- {
- }
-
- public RevokedInfo(
- DerGeneralizedTime revocationTime,
- CrlReason revocationReason)
- {
- if (revocationTime == null)
- throw new ArgumentNullException("revocationTime");
-
- this.revocationTime = revocationTime;
- this.revocationReason = revocationReason;
- }
-
- private RevokedInfo(
- Asn1Sequence seq)
- {
- this.revocationTime = (DerGeneralizedTime) seq[0];
-
- if (seq.Count > 1)
- {
- this.revocationReason = new CrlReason(
- DerEnumerated.GetInstance((Asn1TaggedObject) seq[1], true));
- }
- }
-
- public DerGeneralizedTime RevocationTime
- {
- get { return revocationTime; }
- }
-
- public CrlReason RevocationReason
- {
- get { return revocationReason; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * RevokedInfo ::= Sequence {
- * revocationTime GeneralizedTime,
- * revocationReason [0] EXPLICIT CRLReason OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(revocationTime);
-
- if (revocationReason != null)
- {
- v.Add(new DerTaggedObject(true, 0, revocationReason));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/ServiceLocator.cs b/BCCrypto/src/asn1/ocsp/ServiceLocator.cs
deleted file mode 100644
index 4ba252b..0000000
--- a/BCCrypto/src/asn1/ocsp/ServiceLocator.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class ServiceLocator
- : Asn1Encodable
- {
- private readonly X509Name issuer;
- private readonly Asn1Object locator;
-
- public static ServiceLocator GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static ServiceLocator GetInstance(
- object obj)
- {
- if (obj == null || obj is ServiceLocator)
- {
- return (ServiceLocator) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new ServiceLocator((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public ServiceLocator(
- X509Name issuer)
- : this(issuer, null)
- {
- }
-
- public ServiceLocator(
- X509Name issuer,
- Asn1Object locator)
- {
- if (issuer == null)
- throw new ArgumentNullException("issuer");
-
- this.issuer = issuer;
- this.locator = locator;
- }
-
- private ServiceLocator(
- Asn1Sequence seq)
- {
- this.issuer = X509Name.GetInstance(seq[0]);
-
- if (seq.Count > 1)
- {
- this.locator = seq[1].ToAsn1Object();
- }
- }
-
- public X509Name Issuer
- {
- get { return issuer; }
- }
-
- public Asn1Object Locator
- {
- get { return locator; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * ServiceLocator ::= Sequence {
- * issuer Name,
- * locator AuthorityInfoAccessSyntax OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(issuer);
-
- if (locator != null)
- {
- v.Add(locator);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/Signature.cs b/BCCrypto/src/asn1/ocsp/Signature.cs
deleted file mode 100644
index d6b4ccf..0000000
--- a/BCCrypto/src/asn1/ocsp/Signature.cs
+++ /dev/null
@@ -1,115 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class Signature
- : Asn1Encodable
- {
- internal AlgorithmIdentifier signatureAlgorithm;
- internal DerBitString signatureValue;
- internal Asn1Sequence certs;
-
- public static Signature GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static Signature GetInstance(
- object obj)
- {
- if (obj == null || obj is Signature)
- {
- return (Signature)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new Signature((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public Signature(
- AlgorithmIdentifier signatureAlgorithm,
- DerBitString signatureValue)
- : this(signatureAlgorithm, signatureValue, null)
- {
- }
-
- public Signature(
- AlgorithmIdentifier signatureAlgorithm,
- DerBitString signatureValue,
- Asn1Sequence certs)
- {
- if (signatureAlgorithm == null)
- throw new ArgumentException("signatureAlgorithm");
- if (signatureValue == null)
- throw new ArgumentException("signatureValue");
-
- this.signatureAlgorithm = signatureAlgorithm;
- this.signatureValue = signatureValue;
- this.certs = certs;
- }
-
- private Signature(
- Asn1Sequence seq)
- {
- signatureAlgorithm = AlgorithmIdentifier.GetInstance(seq[0]);
- signatureValue = (DerBitString)seq[1];
-
- if (seq.Count == 3)
- {
- certs = Asn1Sequence.GetInstance(
- (Asn1TaggedObject)seq[2], true);
- }
- }
-
- public AlgorithmIdentifier SignatureAlgorithm
- {
- get { return signatureAlgorithm; }
- }
-
- public DerBitString SignatureValue
- {
- get { return signatureValue; }
- }
-
- public byte[] GetSignatureOctets()
- {
- return signatureValue.GetOctets();
- }
-
- public Asn1Sequence Certs
- {
- get { return certs; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Signature ::= Sequence {
- * signatureAlgorithm AlgorithmIdentifier,
- * signature BIT STRING,
- * certs [0] EXPLICIT Sequence OF Certificate OPTIONAL}
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- signatureAlgorithm, signatureValue);
-
- if (certs != null)
- {
- v.Add(new DerTaggedObject(true, 0, certs));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/SingleResponse.cs b/BCCrypto/src/asn1/ocsp/SingleResponse.cs
deleted file mode 100644
index 544232a..0000000
--- a/BCCrypto/src/asn1/ocsp/SingleResponse.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class SingleResponse
- : Asn1Encodable
- {
- private readonly CertID certID;
- private readonly CertStatus certStatus;
- private readonly DerGeneralizedTime thisUpdate;
- private readonly DerGeneralizedTime nextUpdate;
- private readonly X509Extensions singleExtensions;
-
- public SingleResponse(
- CertID certID,
- CertStatus certStatus,
- DerGeneralizedTime thisUpdate,
- DerGeneralizedTime nextUpdate,
- X509Extensions singleExtensions)
- {
- this.certID = certID;
- this.certStatus = certStatus;
- this.thisUpdate = thisUpdate;
- this.nextUpdate = nextUpdate;
- this.singleExtensions = singleExtensions;
- }
-
- public SingleResponse(
- Asn1Sequence seq)
- {
- this.certID = CertID.GetInstance(seq[0]);
- this.certStatus = CertStatus.GetInstance(seq[1]);
- this.thisUpdate = (DerGeneralizedTime)seq[2];
-
- if (seq.Count > 4)
- {
- this.nextUpdate = DerGeneralizedTime.GetInstance(
- (Asn1TaggedObject) seq[3], true);
- this.singleExtensions = X509Extensions.GetInstance(
- (Asn1TaggedObject) seq[4], true);
- }
- else if (seq.Count > 3)
- {
- Asn1TaggedObject o = (Asn1TaggedObject) seq[3];
-
- if (o.TagNo == 0)
- {
- this.nextUpdate = DerGeneralizedTime.GetInstance(o, true);
- }
- else
- {
- this.singleExtensions = X509Extensions.GetInstance(o, true);
- }
- }
- }
-
- public static SingleResponse GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static SingleResponse GetInstance(
- object obj)
- {
- if (obj == null || obj is SingleResponse)
- {
- return (SingleResponse)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new SingleResponse((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public CertID CertId
- {
- get { return certID; }
- }
-
- public CertStatus CertStatus
- {
- get { return certStatus; }
- }
-
- public DerGeneralizedTime ThisUpdate
- {
- get { return thisUpdate; }
- }
-
- public DerGeneralizedTime NextUpdate
- {
- get { return nextUpdate; }
- }
-
- public X509Extensions SingleExtensions
- {
- get { return singleExtensions; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * SingleResponse ::= Sequence {
- * certID CertID,
- * certStatus CertStatus,
- * thisUpdate GeneralizedTime,
- * nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL,
- * singleExtensions [1] EXPLICIT Extensions OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- certID, certStatus, thisUpdate);
-
- if (nextUpdate != null)
- {
- v.Add(new DerTaggedObject(true, 0, nextUpdate));
- }
-
- if (singleExtensions != null)
- {
- v.Add(new DerTaggedObject(true, 1, singleExtensions));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/ocsp/TBSRequest.cs b/BCCrypto/src/asn1/ocsp/TBSRequest.cs
deleted file mode 100644
index 1ad8649..0000000
--- a/BCCrypto/src/asn1/ocsp/TBSRequest.cs
+++ /dev/null
@@ -1,151 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Ocsp
-{
- public class TbsRequest
- : Asn1Encodable
- {
- private static readonly DerInteger V1 = new DerInteger(0);
-
- private readonly DerInteger version;
- private readonly GeneralName requestorName;
- private readonly Asn1Sequence requestList;
- private readonly X509Extensions requestExtensions;
-
- private bool versionSet;
-
- public static TbsRequest GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static TbsRequest GetInstance(
- object obj)
- {
- if (obj == null || obj is TbsRequest)
- {
- return (TbsRequest)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new TbsRequest((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public TbsRequest(
- GeneralName requestorName,
- Asn1Sequence requestList,
- X509Extensions requestExtensions)
- {
- this.version = V1;
- this.requestorName = requestorName;
- this.requestList = requestList;
- this.requestExtensions = requestExtensions;
- }
-
- private TbsRequest(
- Asn1Sequence seq)
- {
- int index = 0;
-
- Asn1Encodable enc = seq[0];
- if (enc is Asn1TaggedObject)
- {
- Asn1TaggedObject o = (Asn1TaggedObject) enc;
-
- if (o.TagNo == 0)
- {
- versionSet = true;
- version = DerInteger.GetInstance(o, true);
- index++;
- }
- else
- {
- version = V1;
- }
- }
- else
- {
- version = V1;
- }
-
- if (seq[index] is Asn1TaggedObject)
- {
- requestorName = GeneralName.GetInstance((Asn1TaggedObject) seq[index++], true);
- }
-
- requestList = (Asn1Sequence) seq[index++];
-
- if (seq.Count == (index + 1))
- {
- requestExtensions = X509Extensions.GetInstance((Asn1TaggedObject) seq[index], true);
- }
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public GeneralName RequestorName
- {
- get { return requestorName; }
- }
-
- public Asn1Sequence RequestList
- {
- get { return requestList; }
- }
-
- public X509Extensions RequestExtensions
- {
- get { return requestExtensions; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * TBSRequest ::= Sequence {
- * version [0] EXPLICIT Version DEFAULT v1,
- * requestorName [1] EXPLICIT GeneralName OPTIONAL,
- * requestList Sequence OF Request,
- * requestExtensions [2] EXPLICIT Extensions OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- //
- // if default don't include - unless explicitly provided. Not strictly correct
- // but required for some requests
- //
- if (!version.Equals(V1) || versionSet)
- {
- v.Add(new DerTaggedObject(true, 0, version));
- }
-
- if (requestorName != null)
- {
- v.Add(new DerTaggedObject(true, 1, requestorName));
- }
-
- v.Add(requestList);
-
- if (requestExtensions != null)
- {
- v.Add(new DerTaggedObject(true, 2, requestExtensions));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/oiw/ElGamalParameter.cs b/BCCrypto/src/asn1/oiw/ElGamalParameter.cs
deleted file mode 100644
index 3e020f0..0000000
--- a/BCCrypto/src/asn1/oiw/ElGamalParameter.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Asn1.Oiw
-{
- public class ElGamalParameter
- : Asn1Encodable
- {
- internal DerInteger p, g;
-
- public ElGamalParameter(
- BigInteger p,
- BigInteger g)
- {
- this.p = new DerInteger(p);
- this.g = new DerInteger(g);
- }
-
- public ElGamalParameter(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- p = DerInteger.GetInstance(seq[0]);
- g = DerInteger.GetInstance(seq[1]);
- }
-
- public BigInteger P
- {
- get { return p.PositiveValue; }
- }
-
- public BigInteger G
- {
- get { return g.PositiveValue; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(p, g);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/oiw/OIWObjectIdentifiers.cs b/BCCrypto/src/asn1/oiw/OIWObjectIdentifiers.cs
deleted file mode 100644
index 3da2263..0000000
--- a/BCCrypto/src/asn1/oiw/OIWObjectIdentifiers.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-namespace Org.BouncyCastle.Asn1.Oiw
-{
- public abstract class OiwObjectIdentifiers
- {
- public static readonly DerObjectIdentifier MD4WithRsa = new DerObjectIdentifier("1.3.14.3.2.2");
- public static readonly DerObjectIdentifier MD5WithRsa = new DerObjectIdentifier("1.3.14.3.2.3");
- public static readonly DerObjectIdentifier MD4WithRsaEncryption = new DerObjectIdentifier("1.3.14.3.2.4");
-
- public static readonly DerObjectIdentifier DesEcb = new DerObjectIdentifier("1.3.14.3.2.6");
- public static readonly DerObjectIdentifier DesCbc = new DerObjectIdentifier("1.3.14.3.2.7");
- public static readonly DerObjectIdentifier DesOfb = new DerObjectIdentifier("1.3.14.3.2.8");
- public static readonly DerObjectIdentifier DesCfb = new DerObjectIdentifier("1.3.14.3.2.9");
-
- public static readonly DerObjectIdentifier DesEde = new DerObjectIdentifier("1.3.14.3.2.17");
-
- // id-SHA1 OBJECT IDENTIFIER ::=
- // {iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 } //
- public static readonly DerObjectIdentifier IdSha1 = new DerObjectIdentifier("1.3.14.3.2.26");
-
- public static readonly DerObjectIdentifier DsaWithSha1 = new DerObjectIdentifier("1.3.14.3.2.27");
-
- public static readonly DerObjectIdentifier Sha1WithRsa = new DerObjectIdentifier("1.3.14.3.2.29");
-
- // ElGamal Algorithm OBJECT IDENTIFIER ::=
- // {iso(1) identified-organization(3) oiw(14) dirservsig(7) algorithm(2) encryption(1) 1 }
- //
- public static readonly DerObjectIdentifier ElGamalAlgorithm = new DerObjectIdentifier("1.3.14.7.2.1.1");
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/Attribute.cs b/BCCrypto/src/asn1/pkcs/Attribute.cs
deleted file mode 100644
index 1858285..0000000
--- a/BCCrypto/src/asn1/pkcs/Attribute.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class AttributePkcs
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier attrType;
- private readonly Asn1Set attrValues;
-
- /**
- * return an Attribute object from the given object.
- *
- * @param o the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static AttributePkcs GetInstance(
- object obj)
- {
- AttributePkcs attr = obj as AttributePkcs;
- if (obj == null || attr != null)
- {
- return attr;
- }
-
- Asn1Sequence seq = obj as Asn1Sequence;
- if (seq != null)
- {
- return new AttributePkcs(seq);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- private AttributePkcs(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- attrType = DerObjectIdentifier.GetInstance(seq[0]);
- attrValues = Asn1Set.GetInstance(seq[1]);
- }
-
- public AttributePkcs(
- DerObjectIdentifier attrType,
- Asn1Set attrValues)
- {
- this.attrType = attrType;
- this.attrValues = attrValues;
- }
-
- public DerObjectIdentifier AttrType
- {
- get { return attrType; }
- }
-
- public Asn1Set AttrValues
- {
- get { return attrValues; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Attr ::= Sequence {
- * attrType OBJECT IDENTIFIER,
- * attrValues Set OF AttributeValue
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(attrType, attrValues);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/AuthenticatedSafe.cs b/BCCrypto/src/asn1/pkcs/AuthenticatedSafe.cs
deleted file mode 100644
index f3dabb8..0000000
--- a/BCCrypto/src/asn1/pkcs/AuthenticatedSafe.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class AuthenticatedSafe
- : Asn1Encodable
- {
- private readonly ContentInfo[] info;
-
- public AuthenticatedSafe(
- Asn1Sequence seq)
- {
- info = new ContentInfo[seq.Count];
-
- for (int i = 0; i != info.Length; i++)
- {
- info[i] = ContentInfo.GetInstance(seq[i]);
- }
- }
-
- public AuthenticatedSafe(
- ContentInfo[] info)
- {
- this.info = (ContentInfo[]) info.Clone();
- }
-
- public ContentInfo[] GetContentInfo()
- {
- return (ContentInfo[]) info.Clone();
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new BerSequence(info);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/CertBag.cs b/BCCrypto/src/asn1/pkcs/CertBag.cs
deleted file mode 100644
index b6f4c8a..0000000
--- a/BCCrypto/src/asn1/pkcs/CertBag.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class CertBag
- : Asn1Encodable
- {
-// private readonly Asn1Sequence seq;
- private readonly DerObjectIdentifier certID;
- private readonly Asn1Object certValue;
-
- public CertBag(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
-// this.seq = seq;
- this.certID = DerObjectIdentifier.GetInstance(seq[0]);
- this.certValue = DerTaggedObject.GetInstance(seq[1]).GetObject();
- }
-
- public CertBag(
- DerObjectIdentifier certID,
- Asn1Object certValue)
- {
- this.certID = certID;
- this.certValue = certValue;
- }
-
- public DerObjectIdentifier CertID
- {
- get { return certID; }
- }
-
- public Asn1Object CertValue
- {
- get { return certValue; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(certID, new DerTaggedObject(0, certValue));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/CertificationRequest.cs b/BCCrypto/src/asn1/pkcs/CertificationRequest.cs
deleted file mode 100644
index 98caa22..0000000
--- a/BCCrypto/src/asn1/pkcs/CertificationRequest.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- /**
- * Pkcs10 Certfication request object.
- *
- * CertificationRequest ::= Sequence {
- * certificationRequestInfo CertificationRequestInfo,
- * signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
- * signature BIT STRING
- * }
- *
- */
- public class CertificationRequest
- : Asn1Encodable
- {
- protected CertificationRequestInfo reqInfo;
- protected AlgorithmIdentifier sigAlgId;
- protected DerBitString sigBits;
-
- public static CertificationRequest GetInstance(
- object obj)
- {
- if (obj is CertificationRequest)
- return (CertificationRequest)obj;
-
- if (obj != null)
- return new CertificationRequest((Asn1Sequence)obj);
-
- return null;
- }
-
- protected CertificationRequest()
- {
- }
-
- public CertificationRequest(
- CertificationRequestInfo requestInfo,
- AlgorithmIdentifier algorithm,
- DerBitString signature)
- {
- this.reqInfo = requestInfo;
- this.sigAlgId = algorithm;
- this.sigBits = signature;
- }
-
- [Obsolete("Use 'GetInstance' instead")]
- public CertificationRequest(
- Asn1Sequence seq)
- {
- if (seq.Count != 3)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- reqInfo = CertificationRequestInfo.GetInstance(seq[0]);
- sigAlgId = AlgorithmIdentifier.GetInstance(seq[1]);
- sigBits = DerBitString.GetInstance(seq[2]);
- }
-
- public CertificationRequestInfo GetCertificationRequestInfo()
- {
- return reqInfo;
- }
-
- public AlgorithmIdentifier SignatureAlgorithm
- {
- get { return sigAlgId; }
- }
-
- public DerBitString Signature
- {
- get { return sigBits; }
- }
-
- public byte[] GetSignatureOctets()
- {
- return sigBits.GetOctets();
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(reqInfo, sigAlgId, sigBits);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/CertificationRequestInfo.cs b/BCCrypto/src/asn1/pkcs/CertificationRequestInfo.cs
deleted file mode 100644
index 6d98013..0000000
--- a/BCCrypto/src/asn1/pkcs/CertificationRequestInfo.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- /**
- * Pkcs10 CertificationRequestInfo object.
- *
- * CertificationRequestInfo ::= Sequence {
- * version Integer { v1(0) } (v1,...),
- * subject Name,
- * subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
- * attributes [0] Attributes{{ CRIAttributes }}
- * }
- *
- * Attributes { ATTRIBUTE:IOSet } ::= Set OF Attr{{ IOSet }}
- *
- * Attr { ATTRIBUTE:IOSet } ::= Sequence {
- * type ATTRIBUTE.&id({IOSet}),
- * values Set SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{\@type})
- * }
- *
- */
- public class CertificationRequestInfo
- : Asn1Encodable
- {
- internal DerInteger version = new DerInteger(0);
- internal X509Name subject;
- internal SubjectPublicKeyInfo subjectPKInfo;
- internal Asn1Set attributes;
-
- public static CertificationRequestInfo GetInstance(object obj)
- {
- if (obj is CertificationRequestInfo)
- return (CertificationRequestInfo)obj;
- if (obj != null)
- return new CertificationRequestInfo(Asn1Sequence.GetInstance(obj));
- return null;
- }
-
- public CertificationRequestInfo(
- X509Name subject,
- SubjectPublicKeyInfo pkInfo,
- Asn1Set attributes)
- {
- this.subject = subject;
- this.subjectPKInfo = pkInfo;
- this.attributes = attributes;
-
- ValidateAttributes(attributes);
-
- if (subject == null || version == null || subjectPKInfo == null)
- {
- throw new ArgumentException(
- "Not all mandatory fields set in CertificationRequestInfo generator.");
- }
- }
-
- private CertificationRequestInfo(
- Asn1Sequence seq)
- {
- version = (DerInteger) seq[0];
-
- subject = X509Name.GetInstance(seq[1]);
- subjectPKInfo = SubjectPublicKeyInfo.GetInstance(seq[2]);
-
- //
- // some CertificationRequestInfo objects seem to treat this field
- // as optional.
- //
- if (seq.Count > 3)
- {
- DerTaggedObject tagobj = (DerTaggedObject) seq[3];
- attributes = Asn1Set.GetInstance(tagobj, false);
- }
-
- ValidateAttributes(attributes);
-
- if (subject == null || version == null || subjectPKInfo == null)
- {
- throw new ArgumentException(
- "Not all mandatory fields set in CertificationRequestInfo generator.");
- }
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public X509Name Subject
- {
- get { return subject; }
- }
-
- public SubjectPublicKeyInfo SubjectPublicKeyInfo
- {
- get { return subjectPKInfo; }
- }
-
- public Asn1Set Attributes
- {
- get { return attributes; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- version, subject, subjectPKInfo);
-
- if (attributes != null)
- {
- v.Add(new DerTaggedObject(false, 0, attributes));
- }
-
- return new DerSequence(v);
- }
-
- private static void ValidateAttributes(Asn1Set attributes)
- {
- if (attributes == null)
- return;
-
- foreach (Asn1Encodable ae in attributes)
- {
- Asn1Object obj = ae.ToAsn1Object();
- AttributePkcs attr = AttributePkcs.GetInstance(obj);
- if (attr.AttrType.Equals(PkcsObjectIdentifiers.Pkcs9AtChallengePassword))
- {
- if (attr.AttrValues.Count != 1)
- throw new ArgumentException("challengePassword attribute must have one value");
- }
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/ContentInfo.cs b/BCCrypto/src/asn1/pkcs/ContentInfo.cs
deleted file mode 100644
index 526a3c4..0000000
--- a/BCCrypto/src/asn1/pkcs/ContentInfo.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class ContentInfo
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier contentType;
- private readonly Asn1Encodable content;
-
- public static ContentInfo GetInstance(object obj)
- {
- if (obj == null)
- return null;
- ContentInfo existing = obj as ContentInfo;
- if (existing != null)
- return existing;
- return new ContentInfo(Asn1Sequence.GetInstance(obj));
- }
-
- private ContentInfo(
- Asn1Sequence seq)
- {
- contentType = (DerObjectIdentifier) seq[0];
-
- if (seq.Count > 1)
- {
- content = ((Asn1TaggedObject) seq[1]).GetObject();
- }
- }
-
- public ContentInfo(
- DerObjectIdentifier contentType,
- Asn1Encodable content)
- {
- this.contentType = contentType;
- this.content = content;
- }
-
- public DerObjectIdentifier ContentType
- {
- get { return contentType; }
- }
-
- public Asn1Encodable Content
- {
- get { return content; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * ContentInfo ::= Sequence {
- * contentType ContentType,
- * content
- * [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(contentType);
-
- if (content != null)
- {
- v.Add(new BerTaggedObject(0, content));
- }
-
- return new BerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/DHParameter.cs b/BCCrypto/src/asn1/pkcs/DHParameter.cs
deleted file mode 100644
index 25a091a..0000000
--- a/BCCrypto/src/asn1/pkcs/DHParameter.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using Org.BouncyCastle.Asn1;
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class DHParameter
- : Asn1Encodable
- {
- internal DerInteger p, g, l;
-
- public DHParameter(
- BigInteger p,
- BigInteger g,
- int l)
- {
- this.p = new DerInteger(p);
- this.g = new DerInteger(g);
-
- if (l != 0)
- {
- this.l = new DerInteger(l);
- }
- }
-
- public DHParameter(
- Asn1Sequence seq)
- {
- IEnumerator e = seq.GetEnumerator();
-
- e.MoveNext();
- p = (DerInteger)e.Current;
-
- e.MoveNext();
- g = (DerInteger)e.Current;
-
- if (e.MoveNext())
- {
- l = (DerInteger) e.Current;
- }
- }
-
- public BigInteger P
- {
- get { return p.PositiveValue; }
- }
-
- public BigInteger G
- {
- get { return g.PositiveValue; }
- }
-
- public BigInteger L
- {
- get { return l == null ? null : l.PositiveValue; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(p, g);
-
- if (this.l != null)
- {
- v.Add(l);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/EncryptedData.cs b/BCCrypto/src/asn1/pkcs/EncryptedData.cs
deleted file mode 100644
index 7e95eb5..0000000
--- a/BCCrypto/src/asn1/pkcs/EncryptedData.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- /**
- * The EncryptedData object.
- *
- * EncryptedData ::= Sequence {
- * version Version,
- * encryptedContentInfo EncryptedContentInfo
- * }
- *
- *
- * EncryptedContentInfo ::= Sequence {
- * contentType ContentType,
- * contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
- * encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
- * }
- *
- * EncryptedContent ::= OCTET STRING
- *
- */
- public class EncryptedData
- : Asn1Encodable
- {
- private readonly Asn1Sequence data;
-// private readonly DerObjectIdentifier bagId;
-// private readonly Asn1Object bagValue;
-
- public static EncryptedData GetInstance(
- object obj)
- {
- if (obj is EncryptedData)
- {
- return (EncryptedData) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new EncryptedData((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- private EncryptedData(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- int version = ((DerInteger) seq[0]).Value.IntValue;
- if (version != 0)
- {
- throw new ArgumentException("sequence not version 0");
- }
-
- this.data = (Asn1Sequence) seq[1];
- }
-
- public EncryptedData(
- DerObjectIdentifier contentType,
- AlgorithmIdentifier encryptionAlgorithm,
- Asn1Encodable content)
- {
- data = new BerSequence(
- contentType,
- encryptionAlgorithm.ToAsn1Object(),
- new BerTaggedObject(false, 0, content));
- }
-
- public DerObjectIdentifier ContentType
- {
- get { return (DerObjectIdentifier) data[0]; }
- }
-
- public AlgorithmIdentifier EncryptionAlgorithm
- {
- get { return AlgorithmIdentifier.GetInstance(data[1]); }
- }
-
- public Asn1OctetString Content
- {
- get
- {
- if (data.Count == 3)
- {
- DerTaggedObject o = (DerTaggedObject) data[2];
-
- return Asn1OctetString.GetInstance(o, false);
- }
-
- return null;
- }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new BerSequence(new DerInteger(0), data);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/EncryptedPrivateKeyInfo.cs b/BCCrypto/src/asn1/pkcs/EncryptedPrivateKeyInfo.cs
deleted file mode 100644
index 9870270..0000000
--- a/BCCrypto/src/asn1/pkcs/EncryptedPrivateKeyInfo.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class EncryptedPrivateKeyInfo
- : Asn1Encodable
- {
- private readonly AlgorithmIdentifier algId;
- private readonly Asn1OctetString data;
-
- private EncryptedPrivateKeyInfo(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- algId = AlgorithmIdentifier.GetInstance(seq[0]);
- data = Asn1OctetString.GetInstance(seq[1]);
- }
-
- public EncryptedPrivateKeyInfo(
- AlgorithmIdentifier algId,
- byte[] encoding)
- {
- this.algId = algId;
- this.data = new DerOctetString(encoding);
- }
-
- public static EncryptedPrivateKeyInfo GetInstance(
- object obj)
- {
- if (obj is EncryptedPrivateKeyInfo)
- {
- return (EncryptedPrivateKeyInfo) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new EncryptedPrivateKeyInfo((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public AlgorithmIdentifier EncryptionAlgorithm
- {
- get { return algId; }
- }
-
- public byte[] GetEncryptedData()
- {
- return data.GetOctets();
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * EncryptedPrivateKeyInfo ::= Sequence {
- * encryptionAlgorithm AlgorithmIdentifier {{KeyEncryptionAlgorithms}},
- * encryptedData EncryptedData
- * }
- *
- * EncryptedData ::= OCTET STRING
- *
- * KeyEncryptionAlgorithms ALGORITHM-IDENTIFIER ::= {
- * ... -- For local profiles
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(algId, data);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/EncryptionScheme.cs b/BCCrypto/src/asn1/pkcs/EncryptionScheme.cs
deleted file mode 100644
index 7b90ece..0000000
--- a/BCCrypto/src/asn1/pkcs/EncryptionScheme.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class EncryptionScheme
- : AlgorithmIdentifier
- {
- public EncryptionScheme(
- DerObjectIdentifier objectID,
- Asn1Encodable parameters)
- : base(objectID, parameters)
- {
- }
-
- internal EncryptionScheme(
- Asn1Sequence seq)
- : this((DerObjectIdentifier)seq[0], seq[1])
- {
- }
-
- public new static EncryptionScheme GetInstance(object obj)
- {
- if (obj is EncryptionScheme)
- {
- return (EncryptionScheme)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new EncryptionScheme((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public Asn1Object Asn1Object
- {
- get { return Parameters.ToAsn1Object(); }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(Algorithm, Parameters);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/IssuerAndSerialNumber.cs b/BCCrypto/src/asn1/pkcs/IssuerAndSerialNumber.cs
deleted file mode 100644
index da863cb..0000000
--- a/BCCrypto/src/asn1/pkcs/IssuerAndSerialNumber.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class IssuerAndSerialNumber
- : Asn1Encodable
- {
- private readonly X509Name name;
- private readonly DerInteger certSerialNumber;
-
- public static IssuerAndSerialNumber GetInstance(
- object obj)
- {
- if (obj is IssuerAndSerialNumber)
- {
- return (IssuerAndSerialNumber) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new IssuerAndSerialNumber((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- private IssuerAndSerialNumber(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- this.name = X509Name.GetInstance(seq[0]);
- this.certSerialNumber = DerInteger.GetInstance(seq[1]);
- }
-
- public IssuerAndSerialNumber(
- X509Name name,
- BigInteger certSerialNumber)
- {
- this.name = name;
- this.certSerialNumber = new DerInteger(certSerialNumber);
- }
-
- public IssuerAndSerialNumber(
- X509Name name,
- DerInteger certSerialNumber)
- {
- this.name = name;
- this.certSerialNumber = certSerialNumber;
- }
-
- public X509Name Name
- {
- get { return name; }
- }
-
- public DerInteger CertificateSerialNumber
- {
- get { return certSerialNumber; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(name, certSerialNumber);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/KeyDerivationFunc.cs b/BCCrypto/src/asn1/pkcs/KeyDerivationFunc.cs
deleted file mode 100644
index 9fc8985..0000000
--- a/BCCrypto/src/asn1/pkcs/KeyDerivationFunc.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class KeyDerivationFunc
- : AlgorithmIdentifier
- {
- internal KeyDerivationFunc(Asn1Sequence seq)
- : base(seq)
- {
- }
-
- public KeyDerivationFunc(
- DerObjectIdentifier id,
- Asn1Encodable parameters)
- : base(id, parameters)
- {
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/asn1/pkcs/MacData.cs b/BCCrypto/src/asn1/pkcs/MacData.cs
deleted file mode 100644
index c4b7df1..0000000
--- a/BCCrypto/src/asn1/pkcs/MacData.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class MacData
- : Asn1Encodable
- {
- internal DigestInfo digInfo;
- internal byte[] salt;
- internal BigInteger iterationCount;
-
- public static MacData GetInstance(
- object obj)
- {
- if (obj is MacData)
- {
- return (MacData) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new MacData((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- private MacData(
- Asn1Sequence seq)
- {
- this.digInfo = DigestInfo.GetInstance(seq[0]);
- this.salt = ((Asn1OctetString) seq[1]).GetOctets();
-
- if (seq.Count == 3)
- {
- this.iterationCount = ((DerInteger) seq[2]).Value;
- }
- else
- {
- this.iterationCount = BigInteger.One;
- }
- }
-
- public MacData(
- DigestInfo digInfo,
- byte[] salt,
- int iterationCount)
- {
- this.digInfo = digInfo;
- this.salt = (byte[]) salt.Clone();
- this.iterationCount = BigInteger.ValueOf(iterationCount);
- }
-
- public DigestInfo Mac
- {
- get { return digInfo; }
- }
-
- public byte[] GetSalt()
- {
- return (byte[]) salt.Clone();
- }
-
- public BigInteger IterationCount
- {
- get { return iterationCount; }
- }
-
- /**
- *
- * MacData ::= SEQUENCE {
- * mac DigestInfo,
- * macSalt OCTET STRING,
- * iterations INTEGER DEFAULT 1
- * -- Note: The default is for historic reasons and its use is deprecated. A
- * -- higher value, like 1024 is recommended.
- *
- * @return the basic DERObject construction.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(digInfo, new DerOctetString(salt));
-
- if (!iterationCount.Equals(BigInteger.One))
- {
- v.Add(new DerInteger(iterationCount));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/PBEParameter.cs b/BCCrypto/src/asn1/pkcs/PBEParameter.cs
deleted file mode 100644
index 56cea5f..0000000
--- a/BCCrypto/src/asn1/pkcs/PBEParameter.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class PbeParameter
- : Asn1Encodable
- {
- private readonly Asn1OctetString salt;
- private readonly DerInteger iterationCount;
-
- public static PbeParameter GetInstance(object obj)
- {
- if (obj is PbeParameter || obj == null)
- {
- return (PbeParameter) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new PbeParameter((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- private PbeParameter(Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- salt = Asn1OctetString.GetInstance(seq[0]);
- iterationCount = DerInteger.GetInstance(seq[1]);
- }
-
- public PbeParameter(byte[] salt, int iterationCount)
- {
- this.salt = new DerOctetString(salt);
- this.iterationCount = new DerInteger(iterationCount);
- }
-
- public byte[] GetSalt()
- {
- return salt.GetOctets();
- }
-
- public BigInteger IterationCount
- {
- get { return iterationCount.Value; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(salt, iterationCount);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/PBES2Parameters.cs b/BCCrypto/src/asn1/pkcs/PBES2Parameters.cs
deleted file mode 100644
index fc6904e..0000000
--- a/BCCrypto/src/asn1/pkcs/PBES2Parameters.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class PbeS2Parameters
- : Asn1Encodable
- {
- private readonly KeyDerivationFunc func;
- private readonly EncryptionScheme scheme;
-
- public static PbeS2Parameters GetInstance(object obj)
- {
- if (obj == null)
- return null;
- PbeS2Parameters existing = obj as PbeS2Parameters;
- if (existing != null)
- return existing;
- return new PbeS2Parameters(Asn1Sequence.GetInstance(obj));
- }
-
- public PbeS2Parameters(KeyDerivationFunc keyDevFunc, EncryptionScheme encScheme)
- {
- this.func = keyDevFunc;
- this.scheme = encScheme;
- }
-
- [Obsolete("Use GetInstance() instead")]
- public PbeS2Parameters(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- Asn1Sequence funcSeq = (Asn1Sequence)seq[0].ToAsn1Object();
-
- // TODO Not sure if this special case is really necessary/appropriate
- if (funcSeq[0].Equals(PkcsObjectIdentifiers.IdPbkdf2))
- {
- func = new KeyDerivationFunc(PkcsObjectIdentifiers.IdPbkdf2,
- Pbkdf2Params.GetInstance(funcSeq[1]));
- }
- else
- {
- func = new KeyDerivationFunc(funcSeq);
- }
-
- scheme = EncryptionScheme.GetInstance(seq[1].ToAsn1Object());
- }
-
- public KeyDerivationFunc KeyDerivationFunc
- {
- get { return func; }
- }
-
- public EncryptionScheme EncryptionScheme
- {
- get { return scheme; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(func, scheme);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/PBKDF2Params.cs b/BCCrypto/src/asn1/pkcs/PBKDF2Params.cs
deleted file mode 100644
index 279f30d..0000000
--- a/BCCrypto/src/asn1/pkcs/PBKDF2Params.cs
+++ /dev/null
@@ -1,144 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class Pbkdf2Params
- : Asn1Encodable
- {
- private static AlgorithmIdentifier algid_hmacWithSHA1 = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdHmacWithSha1, DerNull.Instance);
-
- private readonly Asn1OctetString octStr;
- private readonly DerInteger iterationCount, keyLength;
- private readonly AlgorithmIdentifier prf;
-
- public static Pbkdf2Params GetInstance(
- object obj)
- {
- if (obj == null || obj is Pbkdf2Params)
- return (Pbkdf2Params)obj;
-
- if (obj is Asn1Sequence)
- return new Pbkdf2Params((Asn1Sequence)obj);
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public Pbkdf2Params(
- Asn1Sequence seq)
- {
- if (seq.Count < 2 || seq.Count > 4)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- this.octStr = (Asn1OctetString)seq[0];
- this.iterationCount = (DerInteger)seq[1];
-
- Asn1Encodable kl = null, d = null;
- if (seq.Count > 3)
- {
- kl = seq[2];
- d = seq[3];
- }
- else if (seq.Count > 2)
- {
- if (seq[2] is DerInteger)
- {
- kl = seq[2];
- }
- else
- {
- d = seq[2];
- }
- }
- if (kl != null)
- {
- keyLength = (DerInteger)kl;
- }
- if (d != null)
- {
- prf = AlgorithmIdentifier.GetInstance(d);
- }
- }
-
- public Pbkdf2Params(
- byte[] salt,
- int iterationCount)
- {
- this.octStr = new DerOctetString(salt);
- this.iterationCount = new DerInteger(iterationCount);
- }
-
- public Pbkdf2Params(
- byte[] salt,
- int iterationCount,
- int keyLength)
- : this(salt, iterationCount)
- {
- this.keyLength = new DerInteger(keyLength);
- }
-
- public Pbkdf2Params(
- byte[] salt,
- int iterationCount,
- int keyLength,
- AlgorithmIdentifier prf)
- : this(salt, iterationCount, keyLength)
- {
- this.prf = prf;
- }
-
- public Pbkdf2Params(
- byte[] salt,
- int iterationCount,
- AlgorithmIdentifier prf)
- : this(salt, iterationCount)
- {
- this.prf = prf;
- }
-
- public byte[] GetSalt()
- {
- return octStr.GetOctets();
- }
-
- public BigInteger IterationCount
- {
- get { return iterationCount.Value; }
- }
-
- public BigInteger KeyLength
- {
- get { return keyLength == null ? null : keyLength.Value; }
- }
-
- public bool IsDefaultPrf
- {
- get { return prf == null || prf.Equals(algid_hmacWithSHA1); }
- }
-
- public AlgorithmIdentifier Prf
- {
- get { return prf != null ? prf : algid_hmacWithSHA1; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- octStr, iterationCount);
-
- if (keyLength != null)
- {
- v.Add(keyLength);
- }
- if (!IsDefaultPrf)
- {
- v.Add(prf);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/PKCS12PBEParams.cs b/BCCrypto/src/asn1/pkcs/PKCS12PBEParams.cs
deleted file mode 100644
index b41c289..0000000
--- a/BCCrypto/src/asn1/pkcs/PKCS12PBEParams.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class Pkcs12PbeParams
- : Asn1Encodable
- {
- private readonly DerInteger iterations;
- private readonly Asn1OctetString iv;
-
- public Pkcs12PbeParams(
- byte[] salt,
- int iterations)
- {
- this.iv = new DerOctetString(salt);
- this.iterations = new DerInteger(iterations);
- }
-
- private Pkcs12PbeParams(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- iv = Asn1OctetString.GetInstance(seq[0]);
- iterations = DerInteger.GetInstance(seq[1]);
- }
-
- public static Pkcs12PbeParams GetInstance(
- object obj)
- {
- if (obj is Pkcs12PbeParams)
- {
- return (Pkcs12PbeParams) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new Pkcs12PbeParams((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public BigInteger Iterations
- {
- get { return iterations.Value; }
- }
-
- public byte[] GetIV()
- {
- return iv.GetOctets();
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(iv, iterations);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/PKCSObjectIdentifiers.cs b/BCCrypto/src/asn1/pkcs/PKCSObjectIdentifiers.cs
deleted file mode 100644
index 1a9a03e..0000000
--- a/BCCrypto/src/asn1/pkcs/PKCSObjectIdentifiers.cs
+++ /dev/null
@@ -1,293 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public abstract class PkcsObjectIdentifiers
- {
- //
- // pkcs-1 OBJECT IDENTIFIER ::= {
- // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 }
- //
- public const string Pkcs1 = "1.2.840.113549.1.1";
- internal static readonly DerObjectIdentifier Pkcs1Oid = new DerObjectIdentifier(Pkcs1);
-
- public static readonly DerObjectIdentifier RsaEncryption = Pkcs1Oid.Branch("1");
- public static readonly DerObjectIdentifier MD2WithRsaEncryption = Pkcs1Oid.Branch("2");
- public static readonly DerObjectIdentifier MD4WithRsaEncryption = Pkcs1Oid.Branch("3");
- public static readonly DerObjectIdentifier MD5WithRsaEncryption = Pkcs1Oid.Branch("4");
- public static readonly DerObjectIdentifier Sha1WithRsaEncryption = Pkcs1Oid.Branch("5");
- public static readonly DerObjectIdentifier SrsaOaepEncryptionSet = Pkcs1Oid.Branch("6");
- public static readonly DerObjectIdentifier IdRsaesOaep = Pkcs1Oid.Branch("7");
- public static readonly DerObjectIdentifier IdMgf1 = Pkcs1Oid.Branch("8");
- public static readonly DerObjectIdentifier IdPSpecified = Pkcs1Oid.Branch("9");
- public static readonly DerObjectIdentifier IdRsassaPss = Pkcs1Oid.Branch("10");
- public static readonly DerObjectIdentifier Sha256WithRsaEncryption = Pkcs1Oid.Branch("11");
- public static readonly DerObjectIdentifier Sha384WithRsaEncryption = Pkcs1Oid.Branch("12");
- public static readonly DerObjectIdentifier Sha512WithRsaEncryption = Pkcs1Oid.Branch("13");
- public static readonly DerObjectIdentifier Sha224WithRsaEncryption = Pkcs1Oid.Branch("14");
- /** PKCS#1: 1.2.840.113549.1.1.15 */
- public static readonly DerObjectIdentifier Sha512_224WithRSAEncryption = Pkcs1Oid.Branch("15");
- /** PKCS#1: 1.2.840.113549.1.1.16 */
- public static readonly DerObjectIdentifier Sha512_256WithRSAEncryption = Pkcs1Oid.Branch("16");
-
- //
- // pkcs-3 OBJECT IDENTIFIER ::= {
- // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 3 }
- //
- public const string Pkcs3 = "1.2.840.113549.1.3";
-
- public static readonly DerObjectIdentifier DhKeyAgreement = new DerObjectIdentifier(Pkcs3 + ".1");
-
- //
- // pkcs-5 OBJECT IDENTIFIER ::= {
- // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 5 }
- //
- public const string Pkcs5 = "1.2.840.113549.1.5";
-
- public static readonly DerObjectIdentifier PbeWithMD2AndDesCbc = new DerObjectIdentifier(Pkcs5 + ".1");
- public static readonly DerObjectIdentifier PbeWithMD2AndRC2Cbc = new DerObjectIdentifier(Pkcs5 + ".4");
- public static readonly DerObjectIdentifier PbeWithMD5AndDesCbc = new DerObjectIdentifier(Pkcs5 + ".3");
- public static readonly DerObjectIdentifier PbeWithMD5AndRC2Cbc = new DerObjectIdentifier(Pkcs5 + ".6");
- public static readonly DerObjectIdentifier PbeWithSha1AndDesCbc = new DerObjectIdentifier(Pkcs5 + ".10");
- public static readonly DerObjectIdentifier PbeWithSha1AndRC2Cbc = new DerObjectIdentifier(Pkcs5 + ".11");
-
- public static readonly DerObjectIdentifier IdPbeS2 = new DerObjectIdentifier(Pkcs5 + ".13");
- public static readonly DerObjectIdentifier IdPbkdf2 = new DerObjectIdentifier(Pkcs5 + ".12");
-
- //
- // encryptionAlgorithm OBJECT IDENTIFIER ::= {
- // iso(1) member-body(2) us(840) rsadsi(113549) 3 }
- //
- public const string EncryptionAlgorithm = "1.2.840.113549.3";
-
- public static readonly DerObjectIdentifier DesEde3Cbc = new DerObjectIdentifier(EncryptionAlgorithm + ".7");
- public static readonly DerObjectIdentifier RC2Cbc = new DerObjectIdentifier(EncryptionAlgorithm + ".2");
-
- //
- // object identifiers for digests
- //
- public const string DigestAlgorithm = "1.2.840.113549.2";
-
- //
- // md2 OBJECT IDENTIFIER ::=
- // {iso(1) member-body(2) US(840) rsadsi(113549) DigestAlgorithm(2) 2}
- //
- public static readonly DerObjectIdentifier MD2 = new DerObjectIdentifier(DigestAlgorithm + ".2");
-
- //
- // md4 OBJECT IDENTIFIER ::=
- // {iso(1) member-body(2) US(840) rsadsi(113549) DigestAlgorithm(2) 4}
- //
- public static readonly DerObjectIdentifier MD4 = new DerObjectIdentifier(DigestAlgorithm + ".4");
-
- //
- // md5 OBJECT IDENTIFIER ::=
- // {iso(1) member-body(2) US(840) rsadsi(113549) DigestAlgorithm(2) 5}
- //
- public static readonly DerObjectIdentifier MD5 = new DerObjectIdentifier(DigestAlgorithm + ".5");
-
- public static readonly DerObjectIdentifier IdHmacWithSha1 = new DerObjectIdentifier(DigestAlgorithm + ".7");
- public static readonly DerObjectIdentifier IdHmacWithSha224 = new DerObjectIdentifier(DigestAlgorithm + ".8");
- public static readonly DerObjectIdentifier IdHmacWithSha256 = new DerObjectIdentifier(DigestAlgorithm + ".9");
- public static readonly DerObjectIdentifier IdHmacWithSha384 = new DerObjectIdentifier(DigestAlgorithm + ".10");
- public static readonly DerObjectIdentifier IdHmacWithSha512 = new DerObjectIdentifier(DigestAlgorithm + ".11");
-
- //
- // pkcs-7 OBJECT IDENTIFIER ::= {
- // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 7 }
- //
- public const string Pkcs7 = "1.2.840.113549.1.7";
-
- public static readonly DerObjectIdentifier Data = new DerObjectIdentifier(Pkcs7 + ".1");
- public static readonly DerObjectIdentifier SignedData = new DerObjectIdentifier(Pkcs7 + ".2");
- public static readonly DerObjectIdentifier EnvelopedData = new DerObjectIdentifier(Pkcs7 + ".3");
- public static readonly DerObjectIdentifier SignedAndEnvelopedData = new DerObjectIdentifier(Pkcs7 + ".4");
- public static readonly DerObjectIdentifier DigestedData = new DerObjectIdentifier(Pkcs7 + ".5");
- public static readonly DerObjectIdentifier EncryptedData = new DerObjectIdentifier(Pkcs7 + ".6");
-
- //
- // pkcs-9 OBJECT IDENTIFIER ::= {
- // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 9 }
- //
- public const string Pkcs9 = "1.2.840.113549.1.9";
-
- public static readonly DerObjectIdentifier Pkcs9AtEmailAddress = new DerObjectIdentifier(Pkcs9 + ".1");
- public static readonly DerObjectIdentifier Pkcs9AtUnstructuredName = new DerObjectIdentifier(Pkcs9 + ".2");
- public static readonly DerObjectIdentifier Pkcs9AtContentType = new DerObjectIdentifier(Pkcs9 + ".3");
- public static readonly DerObjectIdentifier Pkcs9AtMessageDigest = new DerObjectIdentifier(Pkcs9 + ".4");
- public static readonly DerObjectIdentifier Pkcs9AtSigningTime = new DerObjectIdentifier(Pkcs9 + ".5");
- public static readonly DerObjectIdentifier Pkcs9AtCounterSignature = new DerObjectIdentifier(Pkcs9 + ".6");
- public static readonly DerObjectIdentifier Pkcs9AtChallengePassword = new DerObjectIdentifier(Pkcs9 + ".7");
- public static readonly DerObjectIdentifier Pkcs9AtUnstructuredAddress = new DerObjectIdentifier(Pkcs9 + ".8");
- public static readonly DerObjectIdentifier Pkcs9AtExtendedCertificateAttributes = new DerObjectIdentifier(Pkcs9 + ".9");
- public static readonly DerObjectIdentifier Pkcs9AtSigningDescription = new DerObjectIdentifier(Pkcs9 + ".13");
- public static readonly DerObjectIdentifier Pkcs9AtExtensionRequest = new DerObjectIdentifier(Pkcs9 + ".14");
- public static readonly DerObjectIdentifier Pkcs9AtSmimeCapabilities = new DerObjectIdentifier(Pkcs9 + ".15");
- public static readonly DerObjectIdentifier IdSmime = new DerObjectIdentifier(Pkcs9 + ".16");
-
- public static readonly DerObjectIdentifier Pkcs9AtFriendlyName = new DerObjectIdentifier(Pkcs9 + ".20");
- public static readonly DerObjectIdentifier Pkcs9AtLocalKeyID = new DerObjectIdentifier(Pkcs9 + ".21");
-
- [Obsolete("Use X509Certificate instead")]
- public static readonly DerObjectIdentifier X509CertType = new DerObjectIdentifier(Pkcs9 + ".22.1");
-
- public const string CertTypes = Pkcs9 + ".22";
- public static readonly DerObjectIdentifier X509Certificate = new DerObjectIdentifier(CertTypes + ".1");
- public static readonly DerObjectIdentifier SdsiCertificate = new DerObjectIdentifier(CertTypes + ".2");
-
- public const string CrlTypes = Pkcs9 + ".23";
- public static readonly DerObjectIdentifier X509Crl = new DerObjectIdentifier(CrlTypes + ".1");
-
- public static readonly DerObjectIdentifier IdAlg = IdSmime.Branch("3");
-
- public static readonly DerObjectIdentifier IdAlgEsdh = IdAlg.Branch("5");
- public static readonly DerObjectIdentifier IdAlgCms3DesWrap = IdAlg.Branch("6");
- public static readonly DerObjectIdentifier IdAlgCmsRC2Wrap = IdAlg.Branch("7");
- public static readonly DerObjectIdentifier IdAlgPwriKek = IdAlg.Branch("9");
- public static readonly DerObjectIdentifier IdAlgSsdh = IdAlg.Branch("10");
-
- /*
- *
- * -- RSA-KEM Key Transport Algorithm
- *
- * id-rsa-kem OID ::= {
- * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
- * pkcs-9(9) smime(16) alg(3) 14
- * }
- *
- */
- public static readonly DerObjectIdentifier IdRsaKem = IdAlg.Branch("14");
-
- //
- // SMIME capability sub oids.
- //
- public static readonly DerObjectIdentifier PreferSignedData = Pkcs9AtSmimeCapabilities.Branch("1");
- public static readonly DerObjectIdentifier CannotDecryptAny = Pkcs9AtSmimeCapabilities.Branch("2");
- public static readonly DerObjectIdentifier SmimeCapabilitiesVersions = Pkcs9AtSmimeCapabilities.Branch("3");
-
- //
- // other SMIME attributes
- //
- public static readonly DerObjectIdentifier IdAAReceiptRequest = IdSmime.Branch("2.1");
-
- //
- // id-ct OBJECT IDENTIFIER ::= {iso(1) member-body(2) usa(840)
- // rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) ct(1)}
- //
- public const string IdCT = "1.2.840.113549.1.9.16.1";
-
- public static readonly DerObjectIdentifier IdCTAuthData = new DerObjectIdentifier(IdCT + ".2");
- public static readonly DerObjectIdentifier IdCTTstInfo = new DerObjectIdentifier(IdCT + ".4");
- public static readonly DerObjectIdentifier IdCTCompressedData = new DerObjectIdentifier(IdCT + ".9");
- public static readonly DerObjectIdentifier IdCTAuthEnvelopedData = new DerObjectIdentifier(IdCT + ".23");
- public static readonly DerObjectIdentifier IdCTTimestampedData = new DerObjectIdentifier(IdCT + ".31");
-
- //
- // id-cti OBJECT IDENTIFIER ::= {iso(1) member-body(2) usa(840)
- // rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) cti(6)}
- //
- public const string IdCti = "1.2.840.113549.1.9.16.6";
-
- public static readonly DerObjectIdentifier IdCtiEtsProofOfOrigin = new DerObjectIdentifier(IdCti + ".1");
- public static readonly DerObjectIdentifier IdCtiEtsProofOfReceipt = new DerObjectIdentifier(IdCti + ".2");
- public static readonly DerObjectIdentifier IdCtiEtsProofOfDelivery = new DerObjectIdentifier(IdCti + ".3");
- public static readonly DerObjectIdentifier IdCtiEtsProofOfSender = new DerObjectIdentifier(IdCti + ".4");
- public static readonly DerObjectIdentifier IdCtiEtsProofOfApproval = new DerObjectIdentifier(IdCti + ".5");
- public static readonly DerObjectIdentifier IdCtiEtsProofOfCreation = new DerObjectIdentifier(IdCti + ".6");
-
- //
- // id-aa OBJECT IDENTIFIER ::= {iso(1) member-body(2) usa(840)
- // rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) attributes(2)}
- //
- public const string IdAA = "1.2.840.113549.1.9.16.2";
- public static readonly DerObjectIdentifier IdAAOid = new DerObjectIdentifier(IdAA);
-
- public static readonly DerObjectIdentifier IdAAContentHint = new DerObjectIdentifier(IdAA + ".4"); // See RFC 2634
- public static readonly DerObjectIdentifier IdAAMsgSigDigest = new DerObjectIdentifier(IdAA + ".5");
- public static readonly DerObjectIdentifier IdAAContentReference = new DerObjectIdentifier(IdAA + ".10");
-
- /*
- * id-aa-encrypKeyPref OBJECT IDENTIFIER ::= {id-aa 11}
- *
- */
- public static readonly DerObjectIdentifier IdAAEncrypKeyPref = new DerObjectIdentifier(IdAA + ".11");
- public static readonly DerObjectIdentifier IdAASigningCertificate = new DerObjectIdentifier(IdAA + ".12");
- public static readonly DerObjectIdentifier IdAASigningCertificateV2 = new DerObjectIdentifier(IdAA + ".47");
-
- public static readonly DerObjectIdentifier IdAAContentIdentifier = new DerObjectIdentifier(IdAA + ".7"); // See RFC 2634
-
- /*
- * RFC 3126
- */
- public static readonly DerObjectIdentifier IdAASignatureTimeStampToken = new DerObjectIdentifier(IdAA + ".14");
-
- public static readonly DerObjectIdentifier IdAAEtsSigPolicyID = new DerObjectIdentifier(IdAA + ".15");
- public static readonly DerObjectIdentifier IdAAEtsCommitmentType = new DerObjectIdentifier(IdAA + ".16");
- public static readonly DerObjectIdentifier IdAAEtsSignerLocation = new DerObjectIdentifier(IdAA + ".17");
- public static readonly DerObjectIdentifier IdAAEtsSignerAttr = new DerObjectIdentifier(IdAA + ".18");
- public static readonly DerObjectIdentifier IdAAEtsOtherSigCert = new DerObjectIdentifier(IdAA + ".19");
- public static readonly DerObjectIdentifier IdAAEtsContentTimestamp = new DerObjectIdentifier(IdAA + ".20");
- public static readonly DerObjectIdentifier IdAAEtsCertificateRefs = new DerObjectIdentifier(IdAA + ".21");
- public static readonly DerObjectIdentifier IdAAEtsRevocationRefs = new DerObjectIdentifier(IdAA + ".22");
- public static readonly DerObjectIdentifier IdAAEtsCertValues = new DerObjectIdentifier(IdAA + ".23");
- public static readonly DerObjectIdentifier IdAAEtsRevocationValues = new DerObjectIdentifier(IdAA + ".24");
- public static readonly DerObjectIdentifier IdAAEtsEscTimeStamp = new DerObjectIdentifier(IdAA + ".25");
- public static readonly DerObjectIdentifier IdAAEtsCertCrlTimestamp = new DerObjectIdentifier(IdAA + ".26");
- public static readonly DerObjectIdentifier IdAAEtsArchiveTimestamp = new DerObjectIdentifier(IdAA + ".27");
-
- /** PKCS#9: 1.2.840.113549.1.9.16.6.2.37 - RFC 4108 */
- public static readonly DerObjectIdentifier IdAADecryptKeyID = IdAAOid.Branch("37");
-
- /** PKCS#9: 1.2.840.113549.1.9.16.6.2.38 - RFC 4108 */
- public static readonly DerObjectIdentifier IdAAImplCryptoAlgs = IdAAOid.Branch("38");
-
- /** PKCS#9: 1.2.840.113549.1.9.16.2.54 RFC7030 */
- public static readonly DerObjectIdentifier IdAAAsymmDecryptKeyID = IdAAOid.Branch("54");
-
- /** PKCS#9: 1.2.840.113549.1.9.16.2.43 RFC7030 */
- public static readonly DerObjectIdentifier IdAAImplCompressAlgs = IdAAOid.Branch("43");
- /** PKCS#9: 1.2.840.113549.1.9.16.2.40 RFC7030 */
- public static readonly DerObjectIdentifier IdAACommunityIdentifiers = IdAAOid.Branch("40");
-
- [Obsolete("Use 'IdAAEtsSigPolicyID' instead")]
- public static readonly DerObjectIdentifier IdAASigPolicyID = IdAAEtsSigPolicyID;
- [Obsolete("Use 'IdAAEtsCommitmentType' instead")]
- public static readonly DerObjectIdentifier IdAACommitmentType = IdAAEtsCommitmentType;
- [Obsolete("Use 'IdAAEtsSignerLocation' instead")]
- public static readonly DerObjectIdentifier IdAASignerLocation = IdAAEtsSignerLocation;
- [Obsolete("Use 'IdAAEtsOtherSigCert' instead")]
- public static readonly DerObjectIdentifier IdAAOtherSigCert = IdAAEtsOtherSigCert;
-
- //
- // id-spq OBJECT IDENTIFIER ::= {iso(1) member-body(2) usa(840)
- // rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) id-spq(5)}
- //
- public const string IdSpq = "1.2.840.113549.1.9.16.5";
-
- public static readonly DerObjectIdentifier IdSpqEtsUri = new DerObjectIdentifier(IdSpq + ".1");
- public static readonly DerObjectIdentifier IdSpqEtsUNotice = new DerObjectIdentifier(IdSpq + ".2");
-
- //
- // pkcs-12 OBJECT IDENTIFIER ::= {
- // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 12 }
- //
- public const string Pkcs12 = "1.2.840.113549.1.12";
- public const string BagTypes = Pkcs12 + ".10.1";
-
- public static readonly DerObjectIdentifier KeyBag = new DerObjectIdentifier(BagTypes + ".1");
- public static readonly DerObjectIdentifier Pkcs8ShroudedKeyBag = new DerObjectIdentifier(BagTypes + ".2");
- public static readonly DerObjectIdentifier CertBag = new DerObjectIdentifier(BagTypes + ".3");
- public static readonly DerObjectIdentifier CrlBag = new DerObjectIdentifier(BagTypes + ".4");
- public static readonly DerObjectIdentifier SecretBag = new DerObjectIdentifier(BagTypes + ".5");
- public static readonly DerObjectIdentifier SafeContentsBag = new DerObjectIdentifier(BagTypes + ".6");
-
- public const string Pkcs12PbeIds = Pkcs12 + ".1";
-
- public static readonly DerObjectIdentifier PbeWithShaAnd128BitRC4 = new DerObjectIdentifier(Pkcs12PbeIds + ".1");
- public static readonly DerObjectIdentifier PbeWithShaAnd40BitRC4 = new DerObjectIdentifier(Pkcs12PbeIds + ".2");
- public static readonly DerObjectIdentifier PbeWithShaAnd3KeyTripleDesCbc = new DerObjectIdentifier(Pkcs12PbeIds + ".3");
- public static readonly DerObjectIdentifier PbeWithShaAnd2KeyTripleDesCbc = new DerObjectIdentifier(Pkcs12PbeIds + ".4");
- public static readonly DerObjectIdentifier PbeWithShaAnd128BitRC2Cbc = new DerObjectIdentifier(Pkcs12PbeIds + ".5");
- public static readonly DerObjectIdentifier PbewithShaAnd40BitRC2Cbc = new DerObjectIdentifier(Pkcs12PbeIds + ".6");
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/Pfx.cs b/BCCrypto/src/asn1/pkcs/Pfx.cs
deleted file mode 100644
index 9676f64..0000000
--- a/BCCrypto/src/asn1/pkcs/Pfx.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- /**
- * the infamous Pfx from Pkcs12
- */
- public class Pfx
- : Asn1Encodable
- {
- private ContentInfo contentInfo;
- private MacData macData;
-
- public Pfx(
- Asn1Sequence seq)
- {
- BigInteger version = ((DerInteger) seq[0]).Value;
- if (version.IntValue != 3)
- {
- throw new ArgumentException("wrong version for PFX PDU");
- }
-
- contentInfo = ContentInfo.GetInstance(seq[1]);
-
- if (seq.Count == 3)
- {
- macData = MacData.GetInstance(seq[2]);
- }
- }
-
- public Pfx(
- ContentInfo contentInfo,
- MacData macData)
- {
- this.contentInfo = contentInfo;
- this.macData = macData;
- }
-
- public ContentInfo AuthSafe
- {
- get { return contentInfo; }
- }
-
- public MacData MacData
- {
- get { return macData; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- new DerInteger(3), contentInfo);
-
- if (macData != null)
- {
- v.Add(macData);
- }
-
- return new BerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/PrivateKeyInfo.cs b/BCCrypto/src/asn1/pkcs/PrivateKeyInfo.cs
deleted file mode 100644
index c5be7a3..0000000
--- a/BCCrypto/src/asn1/pkcs/PrivateKeyInfo.cs
+++ /dev/null
@@ -1,135 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class PrivateKeyInfo
- : Asn1Encodable
- {
- private readonly Asn1OctetString privKey;
- private readonly AlgorithmIdentifier algID;
- private readonly Asn1Set attributes;
-
- public static PrivateKeyInfo GetInstance(Asn1TaggedObject obj, bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static PrivateKeyInfo GetInstance(
- object obj)
- {
- if (obj == null)
- return null;
- if (obj is PrivateKeyInfo)
- return (PrivateKeyInfo) obj;
- return new PrivateKeyInfo(Asn1Sequence.GetInstance(obj));
- }
-
- public PrivateKeyInfo(AlgorithmIdentifier algID, Asn1Encodable privateKey)
- : this(algID, privateKey, null)
- {
- }
-
- public PrivateKeyInfo(
- AlgorithmIdentifier algID,
- Asn1Encodable privateKey,
- Asn1Set attributes)
- {
- this.algID = algID;
- this.privKey = new DerOctetString(privateKey.GetEncoded(Asn1Encodable.Der));
- this.attributes = attributes;
- }
-
- private PrivateKeyInfo(Asn1Sequence seq)
- {
- IEnumerator e = seq.GetEnumerator();
-
- e.MoveNext();
- BigInteger version = ((DerInteger)e.Current).Value;
- if (version.IntValue != 0)
- {
- throw new ArgumentException("wrong version for private key info: " + version.IntValue);
- }
-
- e.MoveNext();
- algID = AlgorithmIdentifier.GetInstance(e.Current);
- e.MoveNext();
- privKey = Asn1OctetString.GetInstance(e.Current);
-
- if (e.MoveNext())
- {
- attributes = Asn1Set.GetInstance((Asn1TaggedObject)e.Current, false);
- }
- }
-
- public virtual AlgorithmIdentifier PrivateKeyAlgorithm
- {
- get { return algID; }
- }
-
- [Obsolete("Use 'PrivateKeyAlgorithm' property instead")]
- public virtual AlgorithmIdentifier AlgorithmID
- {
- get { return algID; }
- }
-
- public virtual Asn1Object ParsePrivateKey()
- {
- return Asn1Object.FromByteArray(privKey.GetOctets());
- }
-
- [Obsolete("Use 'ParsePrivateKey' instead")]
- public virtual Asn1Object PrivateKey
- {
- get
- {
- try
- {
- return ParsePrivateKey();
- }
- catch (IOException)
- {
- throw new InvalidOperationException("unable to parse private key");
- }
- }
- }
-
- public virtual Asn1Set Attributes
- {
- get { return attributes; }
- }
-
- /**
- * write out an RSA private key with its associated information
- * as described in Pkcs8.
- *
- * PrivateKeyInfo ::= Sequence {
- * version Version,
- * privateKeyAlgorithm AlgorithmIdentifier {{PrivateKeyAlgorithms}},
- * privateKey PrivateKey,
- * attributes [0] IMPLICIT Attributes OPTIONAL
- * }
- * Version ::= Integer {v1(0)} (v1,...)
- *
- * PrivateKey ::= OCTET STRING
- *
- * Attributes ::= Set OF Attr
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(new DerInteger(0), algID, privKey);
-
- if (attributes != null)
- {
- v.Add(new DerTaggedObject(false, 0, attributes));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/RC2CBCParameter.cs b/BCCrypto/src/asn1/pkcs/RC2CBCParameter.cs
deleted file mode 100644
index 880ca74..0000000
--- a/BCCrypto/src/asn1/pkcs/RC2CBCParameter.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class RC2CbcParameter
- : Asn1Encodable
- {
- internal DerInteger version;
- internal Asn1OctetString iv;
-
- public static RC2CbcParameter GetInstance(
- object obj)
- {
- if (obj is Asn1Sequence)
- {
- return new RC2CbcParameter((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public RC2CbcParameter(
- byte[] iv)
- {
- this.iv = new DerOctetString(iv);
- }
-
- public RC2CbcParameter(
- int parameterVersion,
- byte[] iv)
- {
- this.version = new DerInteger(parameterVersion);
- this.iv = new DerOctetString(iv);
- }
-
- private RC2CbcParameter(
- Asn1Sequence seq)
- {
- if (seq.Count == 1)
- {
- iv = (Asn1OctetString)seq[0];
- }
- else
- {
- version = (DerInteger)seq[0];
- iv = (Asn1OctetString)seq[1];
- }
- }
-
- public BigInteger RC2ParameterVersion
- {
- get
- {
- return version == null ? null : version.Value;
- }
- }
-
- public byte[] GetIV()
- {
- return Arrays.Clone(iv.GetOctets());
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (version != null)
- {
- v.Add(version);
- }
-
- v.Add(iv);
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/RSAESOAEPparams.cs b/BCCrypto/src/asn1/pkcs/RSAESOAEPparams.cs
deleted file mode 100644
index 0cf22f8..0000000
--- a/BCCrypto/src/asn1/pkcs/RSAESOAEPparams.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class RsaesOaepParameters
- : Asn1Encodable
- {
- private AlgorithmIdentifier hashAlgorithm;
- private AlgorithmIdentifier maskGenAlgorithm;
- private AlgorithmIdentifier pSourceAlgorithm;
-
- public readonly static AlgorithmIdentifier DefaultHashAlgorithm = new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1, DerNull.Instance);
- public readonly static AlgorithmIdentifier DefaultMaskGenFunction = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, DefaultHashAlgorithm);
- public readonly static AlgorithmIdentifier DefaultPSourceAlgorithm = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdPSpecified, new DerOctetString(new byte[0]));
-
- public static RsaesOaepParameters GetInstance(
- object obj)
- {
- if (obj is RsaesOaepParameters)
- {
- return (RsaesOaepParameters)obj;
- }
- else if (obj is Asn1Sequence)
- {
- return new RsaesOaepParameters((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * The default version
- */
- public RsaesOaepParameters()
- {
- hashAlgorithm = DefaultHashAlgorithm;
- maskGenAlgorithm = DefaultMaskGenFunction;
- pSourceAlgorithm = DefaultPSourceAlgorithm;
- }
-
- public RsaesOaepParameters(
- AlgorithmIdentifier hashAlgorithm,
- AlgorithmIdentifier maskGenAlgorithm,
- AlgorithmIdentifier pSourceAlgorithm)
- {
- this.hashAlgorithm = hashAlgorithm;
- this.maskGenAlgorithm = maskGenAlgorithm;
- this.pSourceAlgorithm = pSourceAlgorithm;
- }
-
- public RsaesOaepParameters(
- Asn1Sequence seq)
- {
- hashAlgorithm = DefaultHashAlgorithm;
- maskGenAlgorithm = DefaultMaskGenFunction;
- pSourceAlgorithm = DefaultPSourceAlgorithm;
-
- for (int i = 0; i != seq.Count; i++)
- {
- Asn1TaggedObject o = (Asn1TaggedObject)seq[i];
-
- switch (o.TagNo)
- {
- case 0:
- hashAlgorithm = AlgorithmIdentifier.GetInstance(o, true);
- break;
- case 1:
- maskGenAlgorithm = AlgorithmIdentifier.GetInstance(o, true);
- break;
- case 2:
- pSourceAlgorithm = AlgorithmIdentifier.GetInstance(o, true);
- break;
- default:
- throw new ArgumentException("unknown tag");
- }
- }
- }
-
- public AlgorithmIdentifier HashAlgorithm
- {
- get { return hashAlgorithm; }
- }
-
- public AlgorithmIdentifier MaskGenAlgorithm
- {
- get { return maskGenAlgorithm; }
- }
-
- public AlgorithmIdentifier PSourceAlgorithm
- {
- get { return pSourceAlgorithm; }
- }
-
- /**
- *
- * RSAES-OAEP-params ::= SEQUENCE {
- * hashAlgorithm [0] OAEP-PSSDigestAlgorithms DEFAULT sha1,
- * maskGenAlgorithm [1] PKCS1MGFAlgorithms DEFAULT mgf1SHA1,
- * pSourceAlgorithm [2] PKCS1PSourceAlgorithms DEFAULT pSpecifiedEmpty
- * }
- *
- * OAEP-PSSDigestAlgorithms ALGORITHM-IDENTIFIER ::= {
- * { OID id-sha1 PARAMETERS NULL }|
- * { OID id-sha256 PARAMETERS NULL }|
- * { OID id-sha384 PARAMETERS NULL }|
- * { OID id-sha512 PARAMETERS NULL },
- * ... -- Allows for future expansion --
- * }
- * PKCS1MGFAlgorithms ALGORITHM-IDENTIFIER ::= {
- * { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms },
- * ... -- Allows for future expansion --
- * }
- * PKCS1PSourceAlgorithms ALGORITHM-IDENTIFIER ::= {
- * { OID id-pSpecified PARAMETERS OCTET STRING },
- * ... -- Allows for future expansion --
- * }
- *
- * @return the asn1 primitive representing the parameters.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (!hashAlgorithm.Equals(DefaultHashAlgorithm))
- {
- v.Add(new DerTaggedObject(true, 0, hashAlgorithm));
- }
-
- if (!maskGenAlgorithm.Equals(DefaultMaskGenFunction))
- {
- v.Add(new DerTaggedObject(true, 1, maskGenAlgorithm));
- }
-
- if (!pSourceAlgorithm.Equals(DefaultPSourceAlgorithm))
- {
- v.Add(new DerTaggedObject(true, 2, pSourceAlgorithm));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/RSAPrivateKeyStructure.cs b/BCCrypto/src/asn1/pkcs/RSAPrivateKeyStructure.cs
deleted file mode 100644
index 7212991..0000000
--- a/BCCrypto/src/asn1/pkcs/RSAPrivateKeyStructure.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class RsaPrivateKeyStructure
- : Asn1Encodable
- {
- private readonly BigInteger modulus;
- private readonly BigInteger publicExponent;
- private readonly BigInteger privateExponent;
- private readonly BigInteger prime1;
- private readonly BigInteger prime2;
- private readonly BigInteger exponent1;
- private readonly BigInteger exponent2;
- private readonly BigInteger coefficient;
-
- public static RsaPrivateKeyStructure GetInstance(Asn1TaggedObject obj, bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- public static RsaPrivateKeyStructure GetInstance(object obj)
- {
- if (obj == null)
- return null;
- if (obj is RsaPrivateKeyStructure)
- return (RsaPrivateKeyStructure)obj;
- return new RsaPrivateKeyStructure(Asn1Sequence.GetInstance(obj));
- }
-
- public RsaPrivateKeyStructure(
- BigInteger modulus,
- BigInteger publicExponent,
- BigInteger privateExponent,
- BigInteger prime1,
- BigInteger prime2,
- BigInteger exponent1,
- BigInteger exponent2,
- BigInteger coefficient)
- {
- this.modulus = modulus;
- this.publicExponent = publicExponent;
- this.privateExponent = privateExponent;
- this.prime1 = prime1;
- this.prime2 = prime2;
- this.exponent1 = exponent1;
- this.exponent2 = exponent2;
- this.coefficient = coefficient;
- }
-
- [Obsolete("Use 'GetInstance' method(s) instead")]
- public RsaPrivateKeyStructure(
- Asn1Sequence seq)
- {
- BigInteger version = ((DerInteger) seq[0]).Value;
- if (version.IntValue != 0)
- throw new ArgumentException("wrong version for RSA private key");
-
- modulus = ((DerInteger) seq[1]).Value;
- publicExponent = ((DerInteger) seq[2]).Value;
- privateExponent = ((DerInteger) seq[3]).Value;
- prime1 = ((DerInteger) seq[4]).Value;
- prime2 = ((DerInteger) seq[5]).Value;
- exponent1 = ((DerInteger) seq[6]).Value;
- exponent2 = ((DerInteger) seq[7]).Value;
- coefficient = ((DerInteger) seq[8]).Value;
- }
-
- public BigInteger Modulus
- {
- get { return modulus; }
- }
-
- public BigInteger PublicExponent
- {
- get { return publicExponent; }
- }
-
- public BigInteger PrivateExponent
- {
- get { return privateExponent; }
- }
-
- public BigInteger Prime1
- {
- get { return prime1; }
- }
-
- public BigInteger Prime2
- {
- get { return prime2; }
- }
-
- public BigInteger Exponent1
- {
- get { return exponent1; }
- }
-
- public BigInteger Exponent2
- {
- get { return exponent2; }
- }
-
- public BigInteger Coefficient
- {
- get { return coefficient; }
- }
-
- /**
- * This outputs the key in Pkcs1v2 format.
- *
- * RsaPrivateKey ::= Sequence {
- * version Version,
- * modulus Integer, -- n
- * publicExponent Integer, -- e
- * privateExponent Integer, -- d
- * prime1 Integer, -- p
- * prime2 Integer, -- q
- * exponent1 Integer, -- d mod (p-1)
- * exponent2 Integer, -- d mod (q-1)
- * coefficient Integer -- (inverse of q) mod p
- * }
- *
- * Version ::= Integer
- *
- * This routine is written to output Pkcs1 version 0, private keys.
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(
- new DerInteger(0), // version
- new DerInteger(Modulus),
- new DerInteger(PublicExponent),
- new DerInteger(PrivateExponent),
- new DerInteger(Prime1),
- new DerInteger(Prime2),
- new DerInteger(Exponent1),
- new DerInteger(Exponent2),
- new DerInteger(Coefficient));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/RSASSAPSSparams.cs b/BCCrypto/src/asn1/pkcs/RSASSAPSSparams.cs
deleted file mode 100644
index 85849c3..0000000
--- a/BCCrypto/src/asn1/pkcs/RSASSAPSSparams.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class RsassaPssParameters
- : Asn1Encodable
- {
- private AlgorithmIdentifier hashAlgorithm;
- private AlgorithmIdentifier maskGenAlgorithm;
- private DerInteger saltLength;
- private DerInteger trailerField;
-
- public readonly static AlgorithmIdentifier DefaultHashAlgorithm = new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1, DerNull.Instance);
- public readonly static AlgorithmIdentifier DefaultMaskGenFunction = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, DefaultHashAlgorithm);
- public readonly static DerInteger DefaultSaltLength = new DerInteger(20);
- public readonly static DerInteger DefaultTrailerField = new DerInteger(1);
-
- public static RsassaPssParameters GetInstance(
- object obj)
- {
- if (obj == null || obj is RsassaPssParameters)
- {
- return (RsassaPssParameters)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new RsassaPssParameters((Asn1Sequence)obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * The default version
- */
- public RsassaPssParameters()
- {
- hashAlgorithm = DefaultHashAlgorithm;
- maskGenAlgorithm = DefaultMaskGenFunction;
- saltLength = DefaultSaltLength;
- trailerField = DefaultTrailerField;
- }
-
- public RsassaPssParameters(
- AlgorithmIdentifier hashAlgorithm,
- AlgorithmIdentifier maskGenAlgorithm,
- DerInteger saltLength,
- DerInteger trailerField)
- {
- this.hashAlgorithm = hashAlgorithm;
- this.maskGenAlgorithm = maskGenAlgorithm;
- this.saltLength = saltLength;
- this.trailerField = trailerField;
- }
-
- public RsassaPssParameters(
- Asn1Sequence seq)
- {
- hashAlgorithm = DefaultHashAlgorithm;
- maskGenAlgorithm = DefaultMaskGenFunction;
- saltLength = DefaultSaltLength;
- trailerField = DefaultTrailerField;
-
- for (int i = 0; i != seq.Count; i++)
- {
- Asn1TaggedObject o = (Asn1TaggedObject)seq[i];
-
- switch (o.TagNo)
- {
- case 0:
- hashAlgorithm = AlgorithmIdentifier.GetInstance(o, true);
- break;
- case 1:
- maskGenAlgorithm = AlgorithmIdentifier.GetInstance(o, true);
- break;
- case 2:
- saltLength = DerInteger.GetInstance(o, true);
- break;
- case 3:
- trailerField = DerInteger.GetInstance(o, true);
- break;
- default:
- throw new ArgumentException("unknown tag");
- }
- }
- }
-
- public AlgorithmIdentifier HashAlgorithm
- {
- get { return hashAlgorithm; }
- }
-
- public AlgorithmIdentifier MaskGenAlgorithm
- {
- get { return maskGenAlgorithm; }
- }
-
- public DerInteger SaltLength
- {
- get { return saltLength; }
- }
-
- public DerInteger TrailerField
- {
- get { return trailerField; }
- }
-
- /**
- *
- * RSASSA-PSS-params ::= SEQUENCE {
- * hashAlgorithm [0] OAEP-PSSDigestAlgorithms DEFAULT sha1,
- * maskGenAlgorithm [1] PKCS1MGFAlgorithms DEFAULT mgf1SHA1,
- * saltLength [2] INTEGER DEFAULT 20,
- * trailerField [3] TrailerField DEFAULT trailerFieldBC
- * }
- *
- * OAEP-PSSDigestAlgorithms ALGORITHM-IDENTIFIER ::= {
- * { OID id-sha1 PARAMETERS NULL }|
- * { OID id-sha256 PARAMETERS NULL }|
- * { OID id-sha384 PARAMETERS NULL }|
- * { OID id-sha512 PARAMETERS NULL },
- * ... -- Allows for future expansion --
- * }
- *
- * PKCS1MGFAlgorithms ALGORITHM-IDENTIFIER ::= {
- * { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms },
- * ... -- Allows for future expansion --
- * }
- *
- * TrailerField ::= INTEGER { trailerFieldBC(1) }
- *
- * @return the asn1 primitive representing the parameters.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (!hashAlgorithm.Equals(DefaultHashAlgorithm))
- {
- v.Add(new DerTaggedObject(true, 0, hashAlgorithm));
- }
-
- if (!maskGenAlgorithm.Equals(DefaultMaskGenFunction))
- {
- v.Add(new DerTaggedObject(true, 1, maskGenAlgorithm));
- }
-
- if (!saltLength.Equals(DefaultSaltLength))
- {
- v.Add(new DerTaggedObject(true, 2, saltLength));
- }
-
- if (!trailerField.Equals(DefaultTrailerField))
- {
- v.Add(new DerTaggedObject(true, 3, trailerField));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/SafeBag.cs b/BCCrypto/src/asn1/pkcs/SafeBag.cs
deleted file mode 100644
index 4b9350b..0000000
--- a/BCCrypto/src/asn1/pkcs/SafeBag.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- public class SafeBag
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier bagID;
- private readonly Asn1Object bagValue;
- private readonly Asn1Set bagAttributes;
-
- public SafeBag(
- DerObjectIdentifier oid,
- Asn1Object obj)
- {
- this.bagID = oid;
- this.bagValue = obj;
- this.bagAttributes = null;
- }
-
- public SafeBag(
- DerObjectIdentifier oid,
- Asn1Object obj,
- Asn1Set bagAttributes)
- {
- this.bagID = oid;
- this.bagValue = obj;
- this.bagAttributes = bagAttributes;
- }
-
- public SafeBag(
- Asn1Sequence seq)
- {
- this.bagID = (DerObjectIdentifier) seq[0];
- this.bagValue = ((DerTaggedObject) seq[1]).GetObject();
- if (seq.Count == 3)
- {
- this.bagAttributes = (Asn1Set) seq[2];
- }
- }
-
- public DerObjectIdentifier BagID
- {
- get { return bagID; }
- }
-
- public Asn1Object BagValue
- {
- get { return bagValue; }
- }
-
- public Asn1Set BagAttributes
- {
- get { return bagAttributes; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- bagID, new DerTaggedObject(0, bagValue));
-
- if (bagAttributes != null)
- {
- v.Add(bagAttributes);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/SignedData.cs b/BCCrypto/src/asn1/pkcs/SignedData.cs
deleted file mode 100644
index 6e72bd0..0000000
--- a/BCCrypto/src/asn1/pkcs/SignedData.cs
+++ /dev/null
@@ -1,157 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- /**
- * a Pkcs#7 signed data object.
- */
- public class SignedData
- : Asn1Encodable
- {
- private readonly DerInteger version;
- private readonly Asn1Set digestAlgorithms;
- private readonly ContentInfo contentInfo;
- private readonly Asn1Set certificates;
- private readonly Asn1Set crls;
- private readonly Asn1Set signerInfos;
-
- public static SignedData GetInstance(object obj)
- {
- if (obj == null)
- return null;
- SignedData existing = obj as SignedData;
- if (existing != null)
- return existing;
- return new SignedData(Asn1Sequence.GetInstance(obj));
- }
-
- public SignedData(
- DerInteger _version,
- Asn1Set _digestAlgorithms,
- ContentInfo _contentInfo,
- Asn1Set _certificates,
- Asn1Set _crls,
- Asn1Set _signerInfos)
- {
- version = _version;
- digestAlgorithms = _digestAlgorithms;
- contentInfo = _contentInfo;
- certificates = _certificates;
- crls = _crls;
- signerInfos = _signerInfos;
- }
-
- private SignedData(
- Asn1Sequence seq)
- {
- IEnumerator e = seq.GetEnumerator();
-
- e.MoveNext();
- version = (DerInteger) e.Current;
-
- e.MoveNext();
- digestAlgorithms = (Asn1Set) e.Current;
-
- e.MoveNext();
- contentInfo = ContentInfo.GetInstance(e.Current);
-
- while (e.MoveNext())
- {
- Asn1Object o = (Asn1Object) e.Current;
-
- //
- // an interesting feature of SignedData is that there appear to be varying implementations...
- // for the moment we ignore anything which doesn't fit.
- //
- if (o is DerTaggedObject)
- {
- DerTaggedObject tagged = (DerTaggedObject) o;
-
- switch (tagged.TagNo)
- {
- case 0:
- certificates = Asn1Set.GetInstance(tagged, false);
- break;
- case 1:
- crls = Asn1Set.GetInstance(tagged, false);
- break;
- default:
- throw new ArgumentException("unknown tag value " + tagged.TagNo);
- }
- }
- else
- {
- signerInfos = (Asn1Set) o;
- }
- }
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public Asn1Set DigestAlgorithms
- {
- get { return digestAlgorithms; }
- }
-
- public ContentInfo ContentInfo
- {
- get { return contentInfo; }
- }
-
- public Asn1Set Certificates
- {
- get { return certificates; }
- }
-
- public Asn1Set Crls
- {
- get { return crls; }
- }
-
- public Asn1Set SignerInfos
- {
- get { return signerInfos; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * SignedData ::= Sequence {
- * version Version,
- * digestAlgorithms DigestAlgorithmIdentifiers,
- * contentInfo ContentInfo,
- * certificates
- * [0] IMPLICIT ExtendedCertificatesAndCertificates
- * OPTIONAL,
- * crls
- * [1] IMPLICIT CertificateRevocationLists OPTIONAL,
- * signerInfos SignerInfos }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- version, digestAlgorithms, contentInfo);
-
- if (certificates != null)
- {
- v.Add(new DerTaggedObject(false, 0, certificates));
- }
-
- if (crls != null)
- {
- v.Add(new DerTaggedObject(false, 1, crls));
- }
-
- v.Add(signerInfos);
-
- return new BerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/pkcs/SignerInfo.cs b/BCCrypto/src/asn1/pkcs/SignerInfo.cs
deleted file mode 100644
index a3dc48b..0000000
--- a/BCCrypto/src/asn1/pkcs/SignerInfo.cs
+++ /dev/null
@@ -1,154 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Pkcs
-{
- /**
- * a Pkcs#7 signer info object.
- */
- public class SignerInfo
- : Asn1Encodable
- {
- private DerInteger version;
- private IssuerAndSerialNumber issuerAndSerialNumber;
- private AlgorithmIdentifier digAlgorithm;
- private Asn1Set authenticatedAttributes;
- private AlgorithmIdentifier digEncryptionAlgorithm;
- private Asn1OctetString encryptedDigest;
- private Asn1Set unauthenticatedAttributes;
-
- public static SignerInfo GetInstance(
- object obj)
- {
- if (obj is SignerInfo)
- {
- return (SignerInfo) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new SignerInfo((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public SignerInfo(
- DerInteger version,
- IssuerAndSerialNumber issuerAndSerialNumber,
- AlgorithmIdentifier digAlgorithm,
- Asn1Set authenticatedAttributes,
- AlgorithmIdentifier digEncryptionAlgorithm,
- Asn1OctetString encryptedDigest,
- Asn1Set unauthenticatedAttributes)
- {
- this.version = version;
- this.issuerAndSerialNumber = issuerAndSerialNumber;
- this.digAlgorithm = digAlgorithm;
- this.authenticatedAttributes = authenticatedAttributes;
- this.digEncryptionAlgorithm = digEncryptionAlgorithm;
- this.encryptedDigest = encryptedDigest;
- this.unauthenticatedAttributes = unauthenticatedAttributes;
- }
-
- public SignerInfo(
- Asn1Sequence seq)
- {
- IEnumerator e = seq.GetEnumerator();
-
- e.MoveNext();
- version = (DerInteger) e.Current;
-
- e.MoveNext();
- issuerAndSerialNumber = IssuerAndSerialNumber.GetInstance(e.Current);
-
- e.MoveNext();
- digAlgorithm = AlgorithmIdentifier.GetInstance(e.Current);
-
- e.MoveNext();
- object obj = e.Current;
-
- if (obj is Asn1TaggedObject)
- {
- authenticatedAttributes = Asn1Set.GetInstance((Asn1TaggedObject) obj, false);
-
- e.MoveNext();
- digEncryptionAlgorithm = AlgorithmIdentifier.GetInstance(e.Current);
- }
- else
- {
- authenticatedAttributes = null;
- digEncryptionAlgorithm = AlgorithmIdentifier.GetInstance(obj);
- }
-
- e.MoveNext();
- encryptedDigest = DerOctetString.GetInstance(e.Current);
-
- if (e.MoveNext())
- {
- unauthenticatedAttributes = Asn1Set.GetInstance((Asn1TaggedObject)e.Current, false);
- }
- else
- {
- unauthenticatedAttributes = null;
- }
- }
-
- public DerInteger Version { get { return version; } }
-
- public IssuerAndSerialNumber IssuerAndSerialNumber { get { return issuerAndSerialNumber; } }
-
- public Asn1Set AuthenticatedAttributes { get { return authenticatedAttributes; } }
-
- public AlgorithmIdentifier DigestAlgorithm { get { return digAlgorithm; } }
-
- public Asn1OctetString EncryptedDigest { get { return encryptedDigest; } }
-
- public AlgorithmIdentifier DigestEncryptionAlgorithm { get { return digEncryptionAlgorithm; } }
-
- public Asn1Set UnauthenticatedAttributes { get { return unauthenticatedAttributes; } }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * SignerInfo ::= Sequence {
- * version Version,
- * issuerAndSerialNumber IssuerAndSerialNumber,
- * digestAlgorithm DigestAlgorithmIdentifier,
- * authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
- * digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
- * encryptedDigest EncryptedDigest,
- * unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
- * }
- *
- * EncryptedDigest ::= OCTET STRING
- *
- * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
- *
- * DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- version, issuerAndSerialNumber, digAlgorithm);
-
- if (authenticatedAttributes != null)
- {
- v.Add(new DerTaggedObject(false, 0, authenticatedAttributes));
- }
-
- v.Add(digEncryptionAlgorithm, encryptedDigest);
-
- if (unauthenticatedAttributes != null)
- {
- v.Add(new DerTaggedObject(false, 1, unauthenticatedAttributes));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/sec/ECPrivateKeyStructure.cs b/BCCrypto/src/asn1/sec/ECPrivateKeyStructure.cs
deleted file mode 100644
index 32e020c..0000000
--- a/BCCrypto/src/asn1/sec/ECPrivateKeyStructure.cs
+++ /dev/null
@@ -1,184 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Sec
-{
- /**
- * the elliptic curve private key object from SEC 1
- */
- public class ECPrivateKeyStructure
- : Asn1Encodable
- {
- private readonly Asn1Sequence seq;
-
- public static ECPrivateKeyStructure GetInstance(object obj)
- {
- if (obj == null)
- return null;
- if (obj is ECPrivateKeyStructure)
- return (ECPrivateKeyStructure)obj;
- return new ECPrivateKeyStructure(Asn1Sequence.GetInstance(obj));
- }
-
- [Obsolete("Use 'GetInstance' instead")]
- public ECPrivateKeyStructure(
- Asn1Sequence seq)
- {
- if (seq == null)
- throw new ArgumentNullException("seq");
-
- this.seq = seq;
- }
-
- [Obsolete("Use constructor which takes 'orderBitLength' instead, to guarantee correct encoding")]
- public ECPrivateKeyStructure(
- BigInteger key)
- {
- if (key == null)
- throw new ArgumentNullException("key");
-
- this.seq = new DerSequence(
- new DerInteger(1),
- new DerOctetString(key.ToByteArrayUnsigned()));
- }
-
- public ECPrivateKeyStructure(
- int orderBitLength,
- BigInteger key)
- {
- if (key == null)
- throw new ArgumentNullException("key");
- if (orderBitLength < key.BitLength)
- throw new ArgumentException("must be >= key bitlength", "orderBitLength");
-
- byte[] bytes = BigIntegers.AsUnsignedByteArray((orderBitLength + 7) / 8, key);
-
- this.seq = new DerSequence(
- new DerInteger(1),
- new DerOctetString(bytes));
- }
-
- [Obsolete("Use constructor which takes 'orderBitLength' instead, to guarantee correct encoding")]
- public ECPrivateKeyStructure(
- BigInteger key,
- Asn1Encodable parameters)
- : this(key, null, parameters)
- {
- }
-
- [Obsolete("Use constructor which takes 'orderBitLength' instead, to guarantee correct encoding")]
- public ECPrivateKeyStructure(
- BigInteger key,
- DerBitString publicKey,
- Asn1Encodable parameters)
- {
- if (key == null)
- throw new ArgumentNullException("key");
-
- Asn1EncodableVector v = new Asn1EncodableVector(
- new DerInteger(1),
- new DerOctetString(key.ToByteArrayUnsigned()));
-
- if (parameters != null)
- {
- v.Add(new DerTaggedObject(true, 0, parameters));
- }
-
- if (publicKey != null)
- {
- v.Add(new DerTaggedObject(true, 1, publicKey));
- }
-
- this.seq = new DerSequence(v);
- }
-
- public ECPrivateKeyStructure(
- int orderBitLength,
- BigInteger key,
- Asn1Encodable parameters)
- : this(orderBitLength, key, null, parameters)
- {
- }
-
- public ECPrivateKeyStructure(
- int orderBitLength,
- BigInteger key,
- DerBitString publicKey,
- Asn1Encodable parameters)
- {
- if (key == null)
- throw new ArgumentNullException("key");
- if (orderBitLength < key.BitLength)
- throw new ArgumentException("must be >= key bitlength", "orderBitLength");
-
- byte[] bytes = BigIntegers.AsUnsignedByteArray((orderBitLength + 7) / 8, key);
-
- Asn1EncodableVector v = new Asn1EncodableVector(
- new DerInteger(1),
- new DerOctetString(bytes));
-
- if (parameters != null)
- {
- v.Add(new DerTaggedObject(true, 0, parameters));
- }
-
- if (publicKey != null)
- {
- v.Add(new DerTaggedObject(true, 1, publicKey));
- }
-
- this.seq = new DerSequence(v);
- }
-
- public virtual BigInteger GetKey()
- {
- Asn1OctetString octs = (Asn1OctetString) seq[1];
-
- return new BigInteger(1, octs.GetOctets());
- }
-
- public virtual DerBitString GetPublicKey()
- {
- return (DerBitString) GetObjectInTag(1);
- }
-
- public virtual Asn1Object GetParameters()
- {
- return GetObjectInTag(0);
- }
-
- private Asn1Object GetObjectInTag(int tagNo)
- {
- foreach (Asn1Encodable ae in seq)
- {
- Asn1Object obj = ae.ToAsn1Object();
-
- if (obj is Asn1TaggedObject)
- {
- Asn1TaggedObject tag = (Asn1TaggedObject) obj;
- if (tag.TagNo == tagNo)
- {
- return tag.GetObject();
- }
- }
- }
-
- return null;
- }
-
- /**
- * ECPrivateKey ::= SEQUENCE {
- * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
- * privateKey OCTET STRING,
- * parameters [0] Parameters OPTIONAL,
- * publicKey [1] BIT STRING OPTIONAL }
- */
- public override Asn1Object ToAsn1Object()
- {
- return seq;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/sec/SECNamedCurves.cs b/BCCrypto/src/asn1/sec/SECNamedCurves.cs
deleted file mode 100644
index b753ac5..0000000
--- a/BCCrypto/src/asn1/sec/SECNamedCurves.cs
+++ /dev/null
@@ -1,1184 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Math.EC.Endo;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Asn1.Sec
-{
- public sealed class SecNamedCurves
- {
- private SecNamedCurves()
- {
- }
-
- private static ECCurve ConfigureCurve(ECCurve curve)
- {
- return curve;
- }
-
- private static ECCurve ConfigureCurveGlv(ECCurve c, GlvTypeBParameters p)
- {
- return c.Configure().SetEndomorphism(new GlvTypeBEndomorphism(c, p)).Create();
- }
-
- private static BigInteger FromHex(string hex)
- {
- return new BigInteger(1, Hex.Decode(hex));
- }
-
- /*
- * secp112r1
- */
- internal class Secp112r1Holder
- : X9ECParametersHolder
- {
- private Secp112r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp112r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = (2^128 - 3) / 76439
- BigInteger p = FromHex("DB7C2ABF62E35E668076BEAD208B");
- BigInteger a = FromHex("DB7C2ABF62E35E668076BEAD2088");
- BigInteger b = FromHex("659EF8BA043916EEDE8911702B22");
- byte[] S = Hex.Decode("00F50B028E4D696E676875615175290472783FB1");
- BigInteger n = FromHex("DB7C2ABF62E35E7628DFAC6561C5");
- BigInteger h = BigInteger.One;
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "09487239995A5EE76B55F9C2F098"
- + "A89CE5AF8724C0A23E0E0FF77500"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp112r2
- */
- internal class Secp112r2Holder
- : X9ECParametersHolder
- {
- private Secp112r2Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp112r2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = (2^128 - 3) / 76439
- BigInteger p = FromHex("DB7C2ABF62E35E668076BEAD208B");
- BigInteger a = FromHex("6127C24C05F38A0AAAF65C0EF02C");
- BigInteger b = FromHex("51DEF1815DB5ED74FCC34C85D709");
- byte[] S = Hex.Decode("002757A1114D696E6768756151755316C05E0BD4");
- BigInteger n = FromHex("36DF0AAFD8B8D7597CA10520D04B");
- BigInteger h = BigInteger.ValueOf(4);
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "4BA30AB5E892B4E1649DD0928643"
- + "ADCD46F5882E3747DEF36E956E97"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp128r1
- */
- internal class Secp128r1Holder
- : X9ECParametersHolder
- {
- private Secp128r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp128r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^128 - 2^97 - 1
- BigInteger p = FromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF");
- BigInteger a = FromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC");
- BigInteger b = FromHex("E87579C11079F43DD824993C2CEE5ED3");
- byte[] S = Hex.Decode("000E0D4D696E6768756151750CC03A4473D03679");
- BigInteger n = FromHex("FFFFFFFE0000000075A30D1B9038A115");
- BigInteger h = BigInteger.One;
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "161FF7528B899B2D0C28607CA52C5B86"
- + "CF5AC8395BAFEB13C02DA292DDED7A83"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp128r2
- */
- internal class Secp128r2Holder
- : X9ECParametersHolder
- {
- private Secp128r2Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp128r2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^128 - 2^97 - 1
- BigInteger p = FromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF");
- BigInteger a = FromHex("D6031998D1B3BBFEBF59CC9BBFF9AEE1");
- BigInteger b = FromHex("5EEEFCA380D02919DC2C6558BB6D8A5D");
- byte[] S = Hex.Decode("004D696E67687561517512D8F03431FCE63B88F4");
- BigInteger n = FromHex("3FFFFFFF7FFFFFFFBE0024720613B5A3");
- BigInteger h = BigInteger.ValueOf(4);
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "7B6AA5D85E572983E6FB32A7CDEBC140"
- + "27B6916A894D3AEE7106FE805FC34B44"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp160k1
- */
- internal class Secp160k1Holder
- : X9ECParametersHolder
- {
- private Secp160k1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp160k1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^160 - 2^32 - 2^14 - 2^12 - 2^9 - 2^8 - 2^7 - 2^3 - 2^2 - 1
- BigInteger p = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73");
- BigInteger a = BigInteger.Zero;
- BigInteger b = BigInteger.ValueOf(7);
- byte[] S = null;
- BigInteger n = FromHex("0100000000000000000001B8FA16DFAB9ACA16B6B3");
- BigInteger h = BigInteger.One;
-
- GlvTypeBParameters glv = new GlvTypeBParameters(
- new BigInteger("9ba48cba5ebcb9b6bd33b92830b2a2e0e192f10a", 16),
- new BigInteger("c39c6c3b3a36d7701b9c71a1f5804ae5d0003f4", 16),
- new BigInteger[]{
- new BigInteger("9162fbe73984472a0a9e", 16),
- new BigInteger("-96341f1138933bc2f505", 16) },
- new BigInteger[]{
- new BigInteger("127971af8721782ecffa3", 16),
- new BigInteger("9162fbe73984472a0a9e", 16) },
- new BigInteger("9162fbe73984472a0a9d0590", 16),
- new BigInteger("96341f1138933bc2f503fd44", 16),
- 176);
-
- ECCurve curve = ConfigureCurveGlv(new FpCurve(p, a, b, n, h), glv);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB"
- + "938CF935318FDCED6BC28286531733C3F03C4FEE"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp160r1
- */
- internal class Secp160r1Holder
- : X9ECParametersHolder
- {
- private Secp160r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp160r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^160 - 2^31 - 1
- BigInteger p = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF");
- BigInteger a = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC");
- BigInteger b = FromHex("1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45");
- byte[] S = Hex.Decode("1053CDE42C14D696E67687561517533BF3F83345");
- BigInteger n = FromHex("0100000000000000000001F4C8F927AED3CA752257");
- BigInteger h = BigInteger.One;
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "4A96B5688EF573284664698968C38BB913CBFC82"
- + "23A628553168947D59DCC912042351377AC5FB32"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp160r2
- */
- internal class Secp160r2Holder
- : X9ECParametersHolder
- {
- private Secp160r2Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp160r2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^160 - 2^32 - 2^14 - 2^12 - 2^9 - 2^8 - 2^7 - 2^3 - 2^2 - 1
- BigInteger p = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73");
- BigInteger a = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70");
- BigInteger b = FromHex("B4E134D3FB59EB8BAB57274904664D5AF50388BA");
- byte[] S = Hex.Decode("B99B99B099B323E02709A4D696E6768756151751");
- BigInteger n = FromHex("0100000000000000000000351EE786A818F3A1A16B");
- BigInteger h = BigInteger.One;
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "52DCB034293A117E1F4FF11B30F7199D3144CE6D"
- + "FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp192k1
- */
- internal class Secp192k1Holder
- : X9ECParametersHolder
- {
- private Secp192k1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp192k1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^192 - 2^32 - 2^12 - 2^8 - 2^7 - 2^6 - 2^3 - 1
- BigInteger p = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37");
- BigInteger a = BigInteger.Zero;
- BigInteger b = BigInteger.ValueOf(3);
- byte[] S = null;
- BigInteger n = FromHex("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D");
- BigInteger h = BigInteger.One;
-
- GlvTypeBParameters glv = new GlvTypeBParameters(
- new BigInteger("bb85691939b869c1d087f601554b96b80cb4f55b35f433c2", 16),
- new BigInteger("3d84f26c12238d7b4f3d516613c1759033b1a5800175d0b1", 16),
- new BigInteger[]{
- new BigInteger("71169be7330b3038edb025f1", 16),
- new BigInteger("-b3fb3400dec5c4adceb8655c", 16) },
- new BigInteger[]{
- new BigInteger("12511cfe811d0f4e6bc688b4d", 16),
- new BigInteger("71169be7330b3038edb025f1", 16) },
- new BigInteger("71169be7330b3038edb025f1d0f9", 16),
- new BigInteger("b3fb3400dec5c4adceb8655d4c94", 16),
- 208);
-
- ECCurve curve = ConfigureCurveGlv(new FpCurve(p, a, b, n, h), glv);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D"
- + "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp192r1
- */
- internal class Secp192r1Holder
- : X9ECParametersHolder
- {
- private Secp192r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp192r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^192 - 2^64 - 1
- BigInteger p = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF");
- BigInteger a = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC");
- BigInteger b = FromHex("64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1");
- byte[] S = Hex.Decode("3045AE6FC8422F64ED579528D38120EAE12196D5");
- BigInteger n = FromHex("FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831");
- BigInteger h = BigInteger.One;
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012"
- + "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp224k1
- */
- internal class Secp224k1Holder
- : X9ECParametersHolder
- {
- private Secp224k1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp224k1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^224 - 2^32 - 2^12 - 2^11 - 2^9 - 2^7 - 2^4 - 2 - 1
- BigInteger p = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D");
- BigInteger a = BigInteger.Zero;
- BigInteger b = BigInteger.ValueOf(5);
- byte[] S = null;
- BigInteger n = FromHex("010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7");
- BigInteger h = BigInteger.One;
-
- GlvTypeBParameters glv = new GlvTypeBParameters(
- new BigInteger("fe0e87005b4e83761908c5131d552a850b3f58b749c37cf5b84d6768", 16),
- new BigInteger("60dcd2104c4cbc0be6eeefc2bdd610739ec34e317f9b33046c9e4788", 16),
- new BigInteger[]{
- new BigInteger("6b8cf07d4ca75c88957d9d670591", 16),
- new BigInteger("-b8adf1378a6eb73409fa6c9c637d", 16) },
- new BigInteger[]{
- new BigInteger("1243ae1b4d71613bc9f780a03690e", 16),
- new BigInteger("6b8cf07d4ca75c88957d9d670591", 16) },
- new BigInteger("6b8cf07d4ca75c88957d9d67059037a4", 16),
- new BigInteger("b8adf1378a6eb73409fa6c9c637ba7f5", 16),
- 240);
-
- ECCurve curve = ConfigureCurveGlv(new FpCurve(p, a, b, n, h), glv);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C"
- + "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp224r1
- */
- internal class Secp224r1Holder
- : X9ECParametersHolder
- {
- private Secp224r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp224r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^224 - 2^96 + 1
- BigInteger p = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001");
- BigInteger a = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE");
- BigInteger b = FromHex("B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4");
- byte[] S = Hex.Decode("BD71344799D5C7FCDC45B59FA3B9AB8F6A948BC5");
- BigInteger n = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D");
- BigInteger h = BigInteger.One;
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21"
- + "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp256k1
- */
- internal class Secp256k1Holder
- : X9ECParametersHolder
- {
- private Secp256k1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp256k1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
- BigInteger p = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F");
- BigInteger a = BigInteger.Zero;
- BigInteger b = BigInteger.ValueOf(7);
- byte[] S = null;
- BigInteger n = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141");
- BigInteger h = BigInteger.One;
-
- GlvTypeBParameters glv = new GlvTypeBParameters(
- new BigInteger("7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee", 16),
- new BigInteger("5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72", 16),
- new BigInteger[]{
- new BigInteger("3086d221a7d46bcde86c90e49284eb15", 16),
- new BigInteger("-e4437ed6010e88286f547fa90abfe4c3", 16) },
- new BigInteger[]{
- new BigInteger("114ca50f7a8e2f3f657c1108d9d44cfd8", 16),
- new BigInteger("3086d221a7d46bcde86c90e49284eb15", 16) },
- new BigInteger("3086d221a7d46bcde86c90e49284eb153dab", 16),
- new BigInteger("e4437ed6010e88286f547fa90abfe4c42212", 16),
- 272);
-
- ECCurve curve = ConfigureCurveGlv(new FpCurve(p, a, b, n, h), glv);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"
- + "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp256r1
- */
- internal class Secp256r1Holder
- : X9ECParametersHolder
- {
- private Secp256r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp256r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^224 (2^32 - 1) + 2^192 + 2^96 - 1
- BigInteger p = FromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF");
- BigInteger a = FromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC");
- BigInteger b = FromHex("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B");
- byte[] S = Hex.Decode("C49D360886E704936A6678E1139D26B7819F7E90");
- BigInteger n = FromHex("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551");
- BigInteger h = BigInteger.One;
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"
- + "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp384r1
- */
- internal class Secp384r1Holder
- : X9ECParametersHolder
- {
- private Secp384r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp384r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^384 - 2^128 - 2^96 + 2^32 - 1
- BigInteger p = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF");
- BigInteger a = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC");
- BigInteger b = FromHex("B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF");
- byte[] S = Hex.Decode("A335926AA319A27A1D00896A6773A4827ACDAC73");
- BigInteger n = FromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973");
- BigInteger h = BigInteger.One;
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7"
- + "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * secp521r1
- */
- internal class Secp521r1Holder
- : X9ECParametersHolder
- {
- private Secp521r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Secp521r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- // p = 2^521 - 1
- BigInteger p = FromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
- BigInteger a = FromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC");
- BigInteger b = FromHex("0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00");
- byte[] S = Hex.Decode("D09E8800291CB85396CC6717393284AAA0DA64BA");
- BigInteger n = FromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409");
- BigInteger h = BigInteger.One;
-
- ECCurve curve = ConfigureCurve(new FpCurve(p, a, b, n, h));
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66"
- + "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect113r1
- */
- internal class Sect113r1Holder
- : X9ECParametersHolder
- {
- private Sect113r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect113r1Holder();
-
- private const int m = 113;
- private const int k = 9;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = FromHex("003088250CA6E7C7FE649CE85820F7");
- BigInteger b = FromHex("00E8BEE4D3E2260744188BE0E9C723");
- byte[] S = Hex.Decode("10E723AB14D696E6768756151756FEBF8FCB49A9");
- BigInteger n = FromHex("0100000000000000D9CCEC8A39E56F");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "009D73616F35F4AB1407D73562C10F"
- + "00A52830277958EE84D1315ED31886"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect113r2
- */
- internal class Sect113r2Holder
- : X9ECParametersHolder
- {
- private Sect113r2Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect113r2Holder();
-
- private const int m = 113;
- private const int k = 9;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = FromHex("00689918DBEC7E5A0DD6DFC0AA55C7");
- BigInteger b = FromHex("0095E9A9EC9B297BD4BF36E059184F");
- byte[] S = Hex.Decode("10C0FB15760860DEF1EEF4D696E676875615175D");
- BigInteger n = FromHex("010000000000000108789B2496AF93");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "01A57A6A7B26CA5EF52FCDB8164797"
- + "00B3ADC94ED1FE674C06E695BABA1D"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect131r1
- */
- internal class Sect131r1Holder
- : X9ECParametersHolder
- {
- private Sect131r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect131r1Holder();
-
- private const int m = 131;
- private const int k1 = 2;
- private const int k2 = 3;
- private const int k3 = 8;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = FromHex("07A11B09A76B562144418FF3FF8C2570B8");
- BigInteger b = FromHex("0217C05610884B63B9C6C7291678F9D341");
- byte[] S = Hex.Decode("4D696E676875615175985BD3ADBADA21B43A97E2");
- BigInteger n = FromHex("0400000000000000023123953A9464B54D");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k1, k2, k3, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "0081BAF91FDF9833C40F9C181343638399"
- + "078C6E7EA38C001F73C8134B1B4EF9E150"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect131r2
- */
- internal class Sect131r2Holder
- : X9ECParametersHolder
- {
- private Sect131r2Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect131r2Holder();
-
- private const int m = 131;
- private const int k1 = 2;
- private const int k2 = 3;
- private const int k3 = 8;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = FromHex("03E5A88919D7CAFCBF415F07C2176573B2");
- BigInteger b = FromHex("04B8266A46C55657AC734CE38F018F2192");
- byte[] S = Hex.Decode("985BD3ADBAD4D696E676875615175A21B43A97E3");
- BigInteger n = FromHex("0400000000000000016954A233049BA98F");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k1, k2, k3, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "0356DCD8F2F95031AD652D23951BB366A8"
- + "0648F06D867940A5366D9E265DE9EB240F"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect163k1
- */
- internal class Sect163k1Holder
- : X9ECParametersHolder
- {
- private Sect163k1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect163k1Holder();
-
- private const int m = 163;
- private const int k1 = 3;
- private const int k2 = 6;
- private const int k3 = 7;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = BigInteger.One;
- BigInteger b = BigInteger.One;
- byte[] S = null;
- BigInteger n = FromHex("04000000000000000000020108A2E0CC0D99F8A5EF");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k1, k2, k3, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8"
- + "0289070FB05D38FF58321F2E800536D538CCDAA3D9"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect163r1
- */
- internal class Sect163r1Holder
- : X9ECParametersHolder
- {
- private Sect163r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect163r1Holder();
-
- private const int m = 163;
- private const int k1 = 3;
- private const int k2 = 6;
- private const int k3 = 7;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = FromHex("07B6882CAAEFA84F9554FF8428BD88E246D2782AE2");
- BigInteger b = FromHex("0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9");
- byte[] S = Hex.Decode("24B7B137C8A14D696E6768756151756FD0DA2E5C");
- BigInteger n = FromHex("03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k1, k2, k3, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "0369979697AB43897789566789567F787A7876A654"
- + "00435EDB42EFAFB2989D51FEFCE3C80988F41FF883"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect163r2
- */
- internal class Sect163r2Holder
- : X9ECParametersHolder
- {
- private Sect163r2Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect163r2Holder();
-
- private const int m = 163;
- private const int k1 = 3;
- private const int k2 = 6;
- private const int k3 = 7;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = BigInteger.One;
- BigInteger b = FromHex("020A601907B8C953CA1481EB10512F78744A3205FD");
- byte[] S = Hex.Decode("85E25BFE5C86226CDB12016F7553F9D0E693A268");
- BigInteger n = FromHex("040000000000000000000292FE77E70C12A4234C33");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k1, k2, k3, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "03F0EBA16286A2D57EA0991168D4994637E8343E36"
- + "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect193r1
- */
- internal class Sect193r1Holder
- : X9ECParametersHolder
- {
- private Sect193r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect193r1Holder();
-
- private const int m = 193;
- private const int k = 15;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = FromHex("0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01");
- BigInteger b = FromHex("00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814");
- byte[] S = Hex.Decode("103FAEC74D696E676875615175777FC5B191EF30");
- BigInteger n = FromHex("01000000000000000000000000C7F34A778F443ACC920EBA49");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1"
- + "0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect193r2
- */
- internal class Sect193r2Holder
- : X9ECParametersHolder
- {
- private Sect193r2Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect193r2Holder();
-
- private const int m = 193;
- private const int k = 15;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = FromHex("0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B");
- BigInteger b = FromHex("00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE");
- byte[] S = Hex.Decode("10B7B4D696E676875615175137C8A16FD0DA2211");
- BigInteger n = FromHex("010000000000000000000000015AAB561B005413CCD4EE99D5");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F"
- + "01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect233k1
- */
- internal class Sect233k1Holder
- : X9ECParametersHolder
- {
- private Sect233k1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect233k1Holder();
-
- private const int m = 233;
- private const int k = 74;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = BigInteger.Zero;
- BigInteger b = BigInteger.One;
- byte[] S = null;
- BigInteger n = FromHex("8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF");
- BigInteger h = BigInteger.ValueOf(4);
-
- ECCurve curve = new F2mCurve(m, k, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126"
- + "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect233r1
- */
- internal class Sect233r1Holder
- : X9ECParametersHolder
- {
- private Sect233r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect233r1Holder();
-
- private const int m = 233;
- private const int k = 74;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = BigInteger.One;
- BigInteger b = FromHex("0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD");
- byte[] S = Hex.Decode("74D59FF07F6B413D0EA14B344B20A2DB049B50C3");
- BigInteger n = FromHex("01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B"
- + "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect239k1
- */
- internal class Sect239k1Holder
- : X9ECParametersHolder
- {
- private Sect239k1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect239k1Holder();
-
- private const int m = 239;
- private const int k = 158;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = BigInteger.Zero;
- BigInteger b = BigInteger.One;
- byte[] S = null;
- BigInteger n = FromHex("2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5");
- BigInteger h = BigInteger.ValueOf(4);
-
- ECCurve curve = new F2mCurve(m, k, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC"
- + "76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect283k1
- */
- internal class Sect283k1Holder
- : X9ECParametersHolder
- {
- private Sect283k1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect283k1Holder();
-
- private const int m = 283;
- private const int k1 = 5;
- private const int k2 = 7;
- private const int k3 = 12;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = BigInteger.Zero;
- BigInteger b = BigInteger.One;
- byte[] S = null;
- BigInteger n = FromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61");
- BigInteger h = BigInteger.ValueOf(4);
-
- ECCurve curve = new F2mCurve(m, k1, k2, k3, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836"
- + "01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect283r1
- */
- internal class Sect283r1Holder
- : X9ECParametersHolder
- {
- private Sect283r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect283r1Holder();
-
- private const int m = 283;
- private const int k1 = 5;
- private const int k2 = 7;
- private const int k3 = 12;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = BigInteger.One;
- BigInteger b = FromHex("027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5");
- byte[] S = Hex.Decode("77E2B07370EB0F832A6DD5B62DFC88CD06BB84BE");
- BigInteger n = FromHex("03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k1, k2, k3, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053"
- + "03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect409k1
- */
- internal class Sect409k1Holder
- : X9ECParametersHolder
- {
- private Sect409k1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect409k1Holder();
-
- private const int m = 409;
- private const int k = 87;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = BigInteger.Zero;
- BigInteger b = BigInteger.One;
- byte[] S = null;
- BigInteger n = FromHex("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF");
- BigInteger h = BigInteger.ValueOf(4);
-
- ECCurve curve = new F2mCurve(m, k, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746"
- + "01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect409r1
- */
- internal class Sect409r1Holder
- : X9ECParametersHolder
- {
- private Sect409r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect409r1Holder();
-
- private const int m = 409;
- private const int k = 87;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = BigInteger.One;
- BigInteger b = FromHex("0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F");
- byte[] S = Hex.Decode("4099B5A457F9D69F79213D094C4BCD4D4262210B");
- BigInteger n = FromHex("010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7"
- + "0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect571k1
- */
- internal class Sect571k1Holder
- : X9ECParametersHolder
- {
- private Sect571k1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect571k1Holder();
-
- private const int m = 571;
- private const int k1 = 2;
- private const int k2 = 5;
- private const int k3 = 10;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = BigInteger.Zero;
- BigInteger b = BigInteger.One;
- byte[] S = null;
- BigInteger n = FromHex("020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001");
- BigInteger h = BigInteger.ValueOf(4);
-
- ECCurve curve = new F2mCurve(m, k1, k2, k3, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972"
- + "0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
- /*
- * sect571r1
- */
- internal class Sect571r1Holder
- : X9ECParametersHolder
- {
- private Sect571r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Sect571r1Holder();
-
- private const int m = 571;
- private const int k1 = 2;
- private const int k2 = 5;
- private const int k3 = 10;
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger a = BigInteger.One;
- BigInteger b = FromHex("02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A");
- byte[] S = Hex.Decode("2AA058F73A0E33AB486B0F610410C53A7F132310");
- BigInteger n = FromHex("03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47");
- BigInteger h = BigInteger.ValueOf(2);
-
- ECCurve curve = new F2mCurve(m, k1, k2, k3, a, b, n, h);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19"
- + "037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B"));
-
- return new X9ECParameters(curve, G, n, h, S);
- }
- }
-
-
- private static readonly IDictionary objIds = Platform.CreateHashtable();
- private static readonly IDictionary curves = Platform.CreateHashtable();
- private static readonly IDictionary names = Platform.CreateHashtable();
-
- private static void DefineCurve(
- string name,
- DerObjectIdentifier oid,
- X9ECParametersHolder holder)
- {
- objIds.Add(Platform.ToUpperInvariant(name), oid);
- names.Add(oid, name);
- curves.Add(oid, holder);
- }
-
- static SecNamedCurves()
- {
- DefineCurve("secp112r1", SecObjectIdentifiers.SecP112r1, Secp112r1Holder.Instance);
- DefineCurve("secp112r2", SecObjectIdentifiers.SecP112r2, Secp112r2Holder.Instance);
- DefineCurve("secp128r1", SecObjectIdentifiers.SecP128r1, Secp128r1Holder.Instance);
- DefineCurve("secp128r2", SecObjectIdentifiers.SecP128r2, Secp128r2Holder.Instance);
- DefineCurve("secp160k1", SecObjectIdentifiers.SecP160k1, Secp160k1Holder.Instance);
- DefineCurve("secp160r1", SecObjectIdentifiers.SecP160r1, Secp160r1Holder.Instance);
- DefineCurve("secp160r2", SecObjectIdentifiers.SecP160r2, Secp160r2Holder.Instance);
- DefineCurve("secp192k1", SecObjectIdentifiers.SecP192k1, Secp192k1Holder.Instance);
- DefineCurve("secp192r1", SecObjectIdentifiers.SecP192r1, Secp192r1Holder.Instance);
- DefineCurve("secp224k1", SecObjectIdentifiers.SecP224k1, Secp224k1Holder.Instance);
- DefineCurve("secp224r1", SecObjectIdentifiers.SecP224r1, Secp224r1Holder.Instance);
- DefineCurve("secp256k1", SecObjectIdentifiers.SecP256k1, Secp256k1Holder.Instance);
- DefineCurve("secp256r1", SecObjectIdentifiers.SecP256r1, Secp256r1Holder.Instance);
- DefineCurve("secp384r1", SecObjectIdentifiers.SecP384r1, Secp384r1Holder.Instance);
- DefineCurve("secp521r1", SecObjectIdentifiers.SecP521r1, Secp521r1Holder.Instance);
-
- DefineCurve("sect113r1", SecObjectIdentifiers.SecT113r1, Sect113r1Holder.Instance);
- DefineCurve("sect113r2", SecObjectIdentifiers.SecT113r2, Sect113r2Holder.Instance);
- DefineCurve("sect131r1", SecObjectIdentifiers.SecT131r1, Sect131r1Holder.Instance);
- DefineCurve("sect131r2", SecObjectIdentifiers.SecT131r2, Sect131r2Holder.Instance);
- DefineCurve("sect163k1", SecObjectIdentifiers.SecT163k1, Sect163k1Holder.Instance);
- DefineCurve("sect163r1", SecObjectIdentifiers.SecT163r1, Sect163r1Holder.Instance);
- DefineCurve("sect163r2", SecObjectIdentifiers.SecT163r2, Sect163r2Holder.Instance);
- DefineCurve("sect193r1", SecObjectIdentifiers.SecT193r1, Sect193r1Holder.Instance);
- DefineCurve("sect193r2", SecObjectIdentifiers.SecT193r2, Sect193r2Holder.Instance);
- DefineCurve("sect233k1", SecObjectIdentifiers.SecT233k1, Sect233k1Holder.Instance);
- DefineCurve("sect233r1", SecObjectIdentifiers.SecT233r1, Sect233r1Holder.Instance);
- DefineCurve("sect239k1", SecObjectIdentifiers.SecT239k1, Sect239k1Holder.Instance);
- DefineCurve("sect283k1", SecObjectIdentifiers.SecT283k1, Sect283k1Holder.Instance);
- DefineCurve("sect283r1", SecObjectIdentifiers.SecT283r1, Sect283r1Holder.Instance);
- DefineCurve("sect409k1", SecObjectIdentifiers.SecT409k1, Sect409k1Holder.Instance);
- DefineCurve("sect409r1", SecObjectIdentifiers.SecT409r1, Sect409r1Holder.Instance);
- DefineCurve("sect571k1", SecObjectIdentifiers.SecT571k1, Sect571k1Holder.Instance);
- DefineCurve("sect571r1", SecObjectIdentifiers.SecT571r1, Sect571r1Holder.Instance);
- }
-
- public static X9ECParameters GetByName(
- string name)
- {
- DerObjectIdentifier oid = GetOid(name);
- return oid == null ? null : GetByOid(oid);
- }
-
- /**
- * return the X9ECParameters object for the named curve represented by
- * the passed in object identifier. Null if the curve isn't present.
- *
- * @param oid an object identifier representing a named curve, if present.
- */
- public static X9ECParameters GetByOid(
- DerObjectIdentifier oid)
- {
- X9ECParametersHolder holder = (X9ECParametersHolder)curves[oid];
- return holder == null ? null : holder.Parameters;
- }
-
- /**
- * return the object identifier signified by the passed in name. Null
- * if there is no object identifier associated with name.
- *
- * @return the object identifier associated with name, if present.
- */
- public static DerObjectIdentifier GetOid(
- string name)
- {
- return (DerObjectIdentifier)objIds[Platform.ToUpperInvariant(name)];
- }
-
- /**
- * return the named curve name represented by the given object identifier.
- */
- public static string GetName(
- DerObjectIdentifier oid)
- {
- return (string)names[oid];
- }
-
- /**
- * returns an enumeration containing the name strings for curves
- * contained in this structure.
- */
- public static IEnumerable Names
- {
- get { return new EnumerableProxy(names.Values); }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/sec/SECObjectIdentifiers.cs b/BCCrypto/src/asn1/sec/SECObjectIdentifiers.cs
deleted file mode 100644
index afc10e1..0000000
--- a/BCCrypto/src/asn1/sec/SECObjectIdentifiers.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X9;
-
-namespace Org.BouncyCastle.Asn1.Sec
-{
- public abstract class SecObjectIdentifiers
- {
- /**
- * EllipticCurve OBJECT IDENTIFIER ::= {
- * iso(1) identified-organization(3) certicom(132) curve(0)
- * }
- */
- public static readonly DerObjectIdentifier EllipticCurve = new DerObjectIdentifier("1.3.132.0");
-
- public static readonly DerObjectIdentifier SecT163k1 = new DerObjectIdentifier(EllipticCurve + ".1");
- public static readonly DerObjectIdentifier SecT163r1 = new DerObjectIdentifier(EllipticCurve + ".2");
- public static readonly DerObjectIdentifier SecT239k1 = new DerObjectIdentifier(EllipticCurve + ".3");
- public static readonly DerObjectIdentifier SecT113r1 = new DerObjectIdentifier(EllipticCurve + ".4");
- public static readonly DerObjectIdentifier SecT113r2 = new DerObjectIdentifier(EllipticCurve + ".5");
- public static readonly DerObjectIdentifier SecP112r1 = new DerObjectIdentifier(EllipticCurve + ".6");
- public static readonly DerObjectIdentifier SecP112r2 = new DerObjectIdentifier(EllipticCurve + ".7");
- public static readonly DerObjectIdentifier SecP160r1 = new DerObjectIdentifier(EllipticCurve + ".8");
- public static readonly DerObjectIdentifier SecP160k1 = new DerObjectIdentifier(EllipticCurve + ".9");
- public static readonly DerObjectIdentifier SecP256k1 = new DerObjectIdentifier(EllipticCurve + ".10");
- public static readonly DerObjectIdentifier SecT163r2 = new DerObjectIdentifier(EllipticCurve + ".15");
- public static readonly DerObjectIdentifier SecT283k1 = new DerObjectIdentifier(EllipticCurve + ".16");
- public static readonly DerObjectIdentifier SecT283r1 = new DerObjectIdentifier(EllipticCurve + ".17");
- public static readonly DerObjectIdentifier SecT131r1 = new DerObjectIdentifier(EllipticCurve + ".22");
- public static readonly DerObjectIdentifier SecT131r2 = new DerObjectIdentifier(EllipticCurve + ".23");
- public static readonly DerObjectIdentifier SecT193r1 = new DerObjectIdentifier(EllipticCurve + ".24");
- public static readonly DerObjectIdentifier SecT193r2 = new DerObjectIdentifier(EllipticCurve + ".25");
- public static readonly DerObjectIdentifier SecT233k1 = new DerObjectIdentifier(EllipticCurve + ".26");
- public static readonly DerObjectIdentifier SecT233r1 = new DerObjectIdentifier(EllipticCurve + ".27");
- public static readonly DerObjectIdentifier SecP128r1 = new DerObjectIdentifier(EllipticCurve + ".28");
- public static readonly DerObjectIdentifier SecP128r2 = new DerObjectIdentifier(EllipticCurve + ".29");
- public static readonly DerObjectIdentifier SecP160r2 = new DerObjectIdentifier(EllipticCurve + ".30");
- public static readonly DerObjectIdentifier SecP192k1 = new DerObjectIdentifier(EllipticCurve + ".31");
- public static readonly DerObjectIdentifier SecP224k1 = new DerObjectIdentifier(EllipticCurve + ".32");
- public static readonly DerObjectIdentifier SecP224r1 = new DerObjectIdentifier(EllipticCurve + ".33");
- public static readonly DerObjectIdentifier SecP384r1 = new DerObjectIdentifier(EllipticCurve + ".34");
- public static readonly DerObjectIdentifier SecP521r1 = new DerObjectIdentifier(EllipticCurve + ".35");
- public static readonly DerObjectIdentifier SecT409k1 = new DerObjectIdentifier(EllipticCurve + ".36");
- public static readonly DerObjectIdentifier SecT409r1 = new DerObjectIdentifier(EllipticCurve + ".37");
- public static readonly DerObjectIdentifier SecT571k1 = new DerObjectIdentifier(EllipticCurve + ".38");
- public static readonly DerObjectIdentifier SecT571r1 = new DerObjectIdentifier(EllipticCurve + ".39");
-
- public static readonly DerObjectIdentifier SecP192r1 = X9ObjectIdentifiers.Prime192v1;
- public static readonly DerObjectIdentifier SecP256r1 = X9ObjectIdentifiers.Prime256v1;
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/asn1/smime/SMIMEAttributes.cs b/BCCrypto/src/asn1/smime/SMIMEAttributes.cs
deleted file mode 100644
index e154e5e..0000000
--- a/BCCrypto/src/asn1/smime/SMIMEAttributes.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Pkcs;
-
-namespace Org.BouncyCastle.Asn1.Smime
-{
- public abstract class SmimeAttributes
- {
- public static readonly DerObjectIdentifier SmimeCapabilities = PkcsObjectIdentifiers.Pkcs9AtSmimeCapabilities;
- public static readonly DerObjectIdentifier EncrypKeyPref = PkcsObjectIdentifiers.IdAAEncrypKeyPref;
- }
-}
diff --git a/BCCrypto/src/asn1/smime/SMIMECapabilities.cs b/BCCrypto/src/asn1/smime/SMIMECapabilities.cs
deleted file mode 100644
index 5bf48f3..0000000
--- a/BCCrypto/src/asn1/smime/SMIMECapabilities.cs
+++ /dev/null
@@ -1,134 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Smime
-{
- /**
- * Handler class for dealing with S/MIME Capabilities
- */
- public class SmimeCapabilities
- : Asn1Encodable
- {
- /**
- * general preferences
- */
- public static readonly DerObjectIdentifier PreferSignedData = PkcsObjectIdentifiers.PreferSignedData;
- public static readonly DerObjectIdentifier CannotDecryptAny = PkcsObjectIdentifiers.CannotDecryptAny;
- public static readonly DerObjectIdentifier SmimeCapabilitesVersions = PkcsObjectIdentifiers.SmimeCapabilitiesVersions;
-
- /**
- * encryption algorithms preferences
- */
- public static readonly DerObjectIdentifier Aes256Cbc = NistObjectIdentifiers.IdAes256Cbc;
- public static readonly DerObjectIdentifier Aes192Cbc = NistObjectIdentifiers.IdAes192Cbc;
- public static readonly DerObjectIdentifier Aes128Cbc = NistObjectIdentifiers.IdAes128Cbc;
- public static readonly DerObjectIdentifier IdeaCbc = new DerObjectIdentifier("1.3.6.1.4.1.188.7.1.1.2");
- public static readonly DerObjectIdentifier Cast5Cbc = new DerObjectIdentifier("1.2.840.113533.7.66.10");
- public static readonly DerObjectIdentifier DesCbc = new DerObjectIdentifier("1.3.14.3.2.7");
- public static readonly DerObjectIdentifier DesEde3Cbc = PkcsObjectIdentifiers.DesEde3Cbc;
- public static readonly DerObjectIdentifier RC2Cbc = PkcsObjectIdentifiers.RC2Cbc;
-
- private Asn1Sequence capabilities;
-
- /**
- * return an Attr object from the given object.
- *
- * @param o the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static SmimeCapabilities GetInstance(
- object obj)
- {
- if (obj == null || obj is SmimeCapabilities)
- {
- return (SmimeCapabilities) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new SmimeCapabilities((Asn1Sequence) obj);
- }
-
- if (obj is AttributeX509)
- {
- return new SmimeCapabilities(
- (Asn1Sequence)(((AttributeX509) obj).AttrValues[0]));
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public SmimeCapabilities(
- Asn1Sequence seq)
- {
- capabilities = seq;
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- [Obsolete("Use 'GetCapabilitiesForOid' instead")]
- public ArrayList GetCapabilities(
- DerObjectIdentifier capability)
- {
- ArrayList list = new ArrayList();
- DoGetCapabilitiesForOid(capability, list);
- return list;
- }
-#endif
-
- /**
- * returns an ArrayList with 0 or more objects of all the capabilities
- * matching the passed in capability Oid. If the Oid passed is null the
- * entire set is returned.
- */
- public IList GetCapabilitiesForOid(
- DerObjectIdentifier capability)
- {
- IList list = Platform.CreateArrayList();
- DoGetCapabilitiesForOid(capability, list);
- return list;
- }
-
- private void DoGetCapabilitiesForOid(DerObjectIdentifier capability, IList list)
- {
- if (capability == null)
- {
- foreach (object o in capabilities)
- {
- SmimeCapability cap = SmimeCapability.GetInstance(o);
-
- list.Add(cap);
- }
- }
- else
- {
- foreach (object o in capabilities)
- {
- SmimeCapability cap = SmimeCapability.GetInstance(o);
-
- if (capability.Equals(cap.CapabilityID))
- {
- list.Add(cap);
- }
- }
- }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * SMIMECapabilities ::= Sequence OF SMIMECapability
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return capabilities;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/smime/SMIMECapabilitiesAttribute.cs b/BCCrypto/src/asn1/smime/SMIMECapabilitiesAttribute.cs
deleted file mode 100644
index 310c478..0000000
--- a/BCCrypto/src/asn1/smime/SMIMECapabilitiesAttribute.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Smime
-{
- public class SmimeCapabilitiesAttribute
- : AttributeX509
- {
- public SmimeCapabilitiesAttribute(
- SmimeCapabilityVector capabilities)
- : base(SmimeAttributes.SmimeCapabilities,
- new DerSet(new DerSequence(capabilities.ToAsn1EncodableVector())))
- {
- }
- }
-}
diff --git a/BCCrypto/src/asn1/smime/SMIMECapability.cs b/BCCrypto/src/asn1/smime/SMIMECapability.cs
deleted file mode 100644
index 5709cb8..0000000
--- a/BCCrypto/src/asn1/smime/SMIMECapability.cs
+++ /dev/null
@@ -1,101 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Pkcs;
-
-namespace Org.BouncyCastle.Asn1.Smime
-{
- public class SmimeCapability
- : Asn1Encodable
- {
- /**
- * general preferences
- */
- public static readonly DerObjectIdentifier PreferSignedData = PkcsObjectIdentifiers.PreferSignedData;
- public static readonly DerObjectIdentifier CannotDecryptAny = PkcsObjectIdentifiers.CannotDecryptAny;
- public static readonly DerObjectIdentifier SmimeCapabilitiesVersions = PkcsObjectIdentifiers.SmimeCapabilitiesVersions;
-
- /**
- * encryption algorithms preferences
- */
- public static readonly DerObjectIdentifier DesCbc = new DerObjectIdentifier("1.3.14.3.2.7");
- public static readonly DerObjectIdentifier DesEde3Cbc = PkcsObjectIdentifiers.DesEde3Cbc;
- public static readonly DerObjectIdentifier RC2Cbc = PkcsObjectIdentifiers.RC2Cbc;
-
- private DerObjectIdentifier capabilityID;
- private Asn1Object parameters;
-
- public SmimeCapability(
- Asn1Sequence seq)
- {
- capabilityID = (DerObjectIdentifier) seq[0].ToAsn1Object();
-
- if (seq.Count > 1)
- {
- parameters = seq[1].ToAsn1Object();
- }
- }
-
- public SmimeCapability(
- DerObjectIdentifier capabilityID,
- Asn1Encodable parameters)
- {
- if (capabilityID == null)
- throw new ArgumentNullException("capabilityID");
-
- this.capabilityID = capabilityID;
-
- if (parameters != null)
- {
- this.parameters = parameters.ToAsn1Object();
- }
- }
-
- public static SmimeCapability GetInstance(
- object obj)
- {
- if (obj == null || obj is SmimeCapability)
- {
- return (SmimeCapability) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new SmimeCapability((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Invalid SmimeCapability");
- }
-
- public DerObjectIdentifier CapabilityID
- {
- get { return capabilityID; }
- }
-
- public Asn1Object Parameters
- {
- get { return parameters; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * SMIMECapability ::= Sequence {
- * capabilityID OBJECT IDENTIFIER,
- * parameters ANY DEFINED BY capabilityID OPTIONAL
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(capabilityID);
-
- if (parameters != null)
- {
- v.Add(parameters);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/smime/SMIMECapabilityVector.cs b/BCCrypto/src/asn1/smime/SMIMECapabilityVector.cs
deleted file mode 100644
index 842825b..0000000
--- a/BCCrypto/src/asn1/smime/SMIMECapabilityVector.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.Smime
-{
- /**
- * Handler for creating a vector S/MIME Capabilities
- */
- public class SmimeCapabilityVector
- {
- private readonly Asn1EncodableVector capabilities = new Asn1EncodableVector();
-
- public void AddCapability(
- DerObjectIdentifier capability)
- {
- capabilities.Add(new DerSequence(capability));
- }
-
- public void AddCapability(
- DerObjectIdentifier capability,
- int value)
- {
- capabilities.Add(new DerSequence(capability, new DerInteger(value)));
- }
-
- public void AddCapability(
- DerObjectIdentifier capability,
- Asn1Encodable parameters)
- {
- capabilities.Add(new DerSequence(capability, parameters));
- }
-
- public Asn1EncodableVector ToAsn1EncodableVector()
- {
- return capabilities;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/smime/SMIMEEncryptionKeyPreferenceAttribute.cs b/BCCrypto/src/asn1/smime/SMIMEEncryptionKeyPreferenceAttribute.cs
deleted file mode 100644
index 19c5fd7..0000000
--- a/BCCrypto/src/asn1/smime/SMIMEEncryptionKeyPreferenceAttribute.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Asn1.Smime
-{
- /**
- * The SmimeEncryptionKeyPreference object.
- *
- * SmimeEncryptionKeyPreference ::= CHOICE {
- * issuerAndSerialNumber [0] IssuerAndSerialNumber,
- * receipentKeyId [1] RecipientKeyIdentifier,
- * subjectAltKeyIdentifier [2] SubjectKeyIdentifier
- * }
- *
- */
- public class SmimeEncryptionKeyPreferenceAttribute
- : AttributeX509
- {
- public SmimeEncryptionKeyPreferenceAttribute(
- IssuerAndSerialNumber issAndSer)
- : base(SmimeAttributes.EncrypKeyPref,
- new DerSet(new DerTaggedObject(false, 0, issAndSer)))
- {
- }
-
- public SmimeEncryptionKeyPreferenceAttribute(
- RecipientKeyIdentifier rKeyID)
- : base(SmimeAttributes.EncrypKeyPref,
- new DerSet(new DerTaggedObject(false, 1, rKeyID)))
- {
- }
-
- /**
- * @param sKeyId the subjectKeyIdentifier value (normally the X.509 one)
- */
- public SmimeEncryptionKeyPreferenceAttribute(
- Asn1OctetString sKeyID)
- : base(SmimeAttributes.EncrypKeyPref,
- new DerSet(new DerTaggedObject(false, 2, sKeyID)))
- {
- }
- }
-}
diff --git a/BCCrypto/src/asn1/teletrust/TeleTrusTNamedCurves.cs b/BCCrypto/src/asn1/teletrust/TeleTrusTNamedCurves.cs
deleted file mode 100644
index 9a82db3..0000000
--- a/BCCrypto/src/asn1/teletrust/TeleTrusTNamedCurves.cs
+++ /dev/null
@@ -1,470 +0,0 @@
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Asn1.TeleTrust
-{
- /**
- * elliptic curves defined in "ECC Brainpool Standard Curves and Curve Generation"
- * http://www.ecc-brainpool.org/download/draft_pkix_additional_ecc_dp.txt
- */
- public class TeleTrusTNamedCurves
- {
- private static ECCurve ConfigureCurve(ECCurve curve)
- {
- return curve;
- }
-
- internal class BrainpoolP160r1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP160r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP160r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("E95E4A5F737059DC60DF5991D45029409E60FC09", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- new BigInteger("E95E4A5F737059DC60DFC7AD95B3D8139515620F", 16), // q
- new BigInteger("340E7BE2A280EB74E2BE61BADA745D97E8F7C300", 16), // a
- new BigInteger("1E589A8595423412134FAA2DBDEC95C8D8675E58", 16), // b
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("04BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC31667CB477A1A8EC338F94741669C976316DA6321")), // G
- n, h);
- }
- }
-
- internal class BrainpoolP160t1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP160t1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP160t1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("E95E4A5F737059DC60DF5991D45029409E60FC09", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- // new BigInteger("24DBFF5DEC9B986BBFE5295A29BFBAE45E0F5D0B", 16), // Z
- new BigInteger("E95E4A5F737059DC60DFC7AD95B3D8139515620F", 16), // q
- new BigInteger("E95E4A5F737059DC60DFC7AD95B3D8139515620C", 16), // a'
- new BigInteger("7A556B6DAE535B7B51ED2C4D7DAA7A0B5C55F380", 16), // b'
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("04B199B13B9B34EFC1397E64BAEB05ACC265FF2378ADD6718B7C7C1961F0991B842443772152C9E0AD")), // G
- n, h);
- }
- }
-
- internal class BrainpoolP192r1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP192r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP192r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- new BigInteger("C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297", 16), // q
- new BigInteger("6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF", 16), // a
- new BigInteger("469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9", 16), // b
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("04C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD614B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F")), // G
- n, h);
- }
- }
-
- internal class BrainpoolP192t1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP192t1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP192t1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- //new BigInteger("1B6F5CC8DB4DC7AF19458A9CB80DC2295E5EB9C3732104CB") //Z
- new BigInteger("C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297", 16), // q
- new BigInteger("C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86294", 16), // a'
- new BigInteger("13D56FFAEC78681E68F9DEB43B35BEC2FB68542E27897B79", 16), // b'
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("043AE9E58C82F63C30282E1FE7BBF43FA72C446AF6F4618129097E2C5667C2223A902AB5CA449D0084B7E5B3DE7CCC01C9")), // G'
- n, h);
- }
- }
-
- internal class BrainpoolP224r1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP224r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP224r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- new BigInteger("D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF", 16), // q
- new BigInteger("68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43", 16), // a
- new BigInteger("2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B", 16), // b
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("040D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD")), // G
- n, h);
- }
- }
-
- internal class BrainpoolP224t1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP224t1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP224t1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- //new BigInteger("2DF271E14427A346910CF7A2E6CFA7B3F484E5C2CCE1C8B730E28B3F") //Z
- new BigInteger("D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF", 16), // q
- new BigInteger("D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FC", 16), // a'
- new BigInteger("4B337D934104CD7BEF271BF60CED1ED20DA14C08B3BB64F18A60888D", 16), // b'
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("046AB1E344CE25FF3896424E7FFE14762ECB49F8928AC0C76029B4D5800374E9F5143E568CD23F3F4D7C0D4B1E41C8CC0D1C6ABD5F1A46DB4C")), // G'
- n, h);
- }
- }
-
- internal class BrainpoolP256r1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP256r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP256r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- new BigInteger("A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", 16), // q
- new BigInteger("7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", 16), // a
- new BigInteger("26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", 16), // b
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997")), // G
- n, h);
- }
- }
-
- internal class BrainpoolP256t1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP256t1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP256t1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- //new BigInteger("3E2D4BD9597B58639AE7AA669CAB9837CF5CF20A2C852D10F655668DFC150EF0") //Z
- new BigInteger("A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", 16), // q
- new BigInteger("A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5374", 16), // a'
- new BigInteger("662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04", 16), // b'
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("04A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F42D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE")), // G'
- n, h);
- }
- }
-
- internal class BrainpoolP320r1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP320r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP320r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- new BigInteger("D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27", 16), // q
- new BigInteger("3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4", 16), // a
- new BigInteger("520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6", 16), // b
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("0443BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E2061114FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1")), // G
- n, h);
- }
- }
-
- internal class BrainpoolP320t1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP320t1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP320t1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- //new BigInteger("15F75CAF668077F7E85B42EB01F0A81FF56ECD6191D55CB82B7D861458A18FEFC3E5AB7496F3C7B1") //Z
- new BigInteger("D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27", 16), // q
- new BigInteger("D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E24", 16), // a'
- new BigInteger("A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547CEB5B4FEF422340353", 16), // b'
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("04925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136FFF3357F624A21BED5263BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE71B1B9BC0455FB0D2C3")), // G'
- n, h);
- }
- }
-
- internal class BrainpoolP384r1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP384r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP384r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- new BigInteger("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53", 16), // q
- new BigInteger("7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826", 16), // a
- new BigInteger("4A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11", 16), // b
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("041D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315")), // G
- n, h);
- }
- }
-
- internal class BrainpoolP384t1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP384t1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP384t1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- //new BigInteger("41DFE8DD399331F7166A66076734A89CD0D2BCDB7D068E44E1F378F41ECBAE97D2D63DBC87BCCDDCCC5DA39E8589291C") //Z
- new BigInteger("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53", 16), // q
- new BigInteger("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC50", 16), // a'
- new BigInteger("7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B88805CED70355A33B471EE", 16), // b'
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("0418DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946A5F54D8D0AA2F418808CC25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC2B2912675BF5B9E582928")), // G'
- n, h);
- }
- }
-
- internal class BrainpoolP512r1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP512r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP512r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- new BigInteger("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3", 16), // q
- new BigInteger("7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA", 16), // a
- new BigInteger("3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723", 16), // b
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("0481AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F8227DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892")), // G
- n, h);
- }
- }
-
- internal class BrainpoolP512t1Holder
- : X9ECParametersHolder
- {
- private BrainpoolP512t1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new BrainpoolP512t1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069", 16);
- BigInteger h = new BigInteger("01", 16);
-
- ECCurve curve = ConfigureCurve(new FpCurve(
- //new BigInteger("12EE58E6764838B69782136F0F2D3BA06E27695716054092E60A80BEDB212B64E585D90BCE13761F85C3F1D2A64E3BE8FEA2220F01EBA5EEB0F35DBD29D922AB") //Z
- new BigInteger("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3", 16), // q
- new BigInteger("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F0", 16), // a'
- new BigInteger("7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E", 16), // b'
- n, h));
-
- return new X9ECParameters(
- curve,
- new X9ECPoint(curve, Hex.Decode("04640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332")), // G'
- n, h);
- }
- }
-
-
- private static readonly IDictionary objIds = Platform.CreateHashtable();
- private static readonly IDictionary curves = Platform.CreateHashtable();
- private static readonly IDictionary names = Platform.CreateHashtable();
-
- private static void DefineCurve(
- string name,
- DerObjectIdentifier oid,
- X9ECParametersHolder holder)
- {
- objIds.Add(Platform.ToUpperInvariant(name), oid);
- names.Add(oid, name);
- curves.Add(oid, holder);
- }
-
- static TeleTrusTNamedCurves()
- {
- DefineCurve("brainpoolP160r1", TeleTrusTObjectIdentifiers.BrainpoolP160R1, BrainpoolP160r1Holder.Instance);
- DefineCurve("brainpoolP160t1", TeleTrusTObjectIdentifiers.BrainpoolP160T1, BrainpoolP160t1Holder.Instance);
- DefineCurve("brainpoolP192r1", TeleTrusTObjectIdentifiers.BrainpoolP192R1, BrainpoolP192r1Holder.Instance);
- DefineCurve("brainpoolP192t1", TeleTrusTObjectIdentifiers.BrainpoolP192T1, BrainpoolP192t1Holder.Instance);
- DefineCurve("brainpoolP224r1", TeleTrusTObjectIdentifiers.BrainpoolP224R1, BrainpoolP224r1Holder.Instance);
- DefineCurve("brainpoolP224t1", TeleTrusTObjectIdentifiers.BrainpoolP224T1, BrainpoolP224t1Holder.Instance);
- DefineCurve("brainpoolP256r1", TeleTrusTObjectIdentifiers.BrainpoolP256R1, BrainpoolP256r1Holder.Instance);
- DefineCurve("brainpoolP256t1", TeleTrusTObjectIdentifiers.BrainpoolP256T1, BrainpoolP256t1Holder.Instance);
- DefineCurve("brainpoolP320r1", TeleTrusTObjectIdentifiers.BrainpoolP320R1, BrainpoolP320r1Holder.Instance);
- DefineCurve("brainpoolP320t1", TeleTrusTObjectIdentifiers.BrainpoolP320T1, BrainpoolP320t1Holder.Instance);
- DefineCurve("brainpoolP384r1", TeleTrusTObjectIdentifiers.BrainpoolP384R1, BrainpoolP384r1Holder.Instance);
- DefineCurve("brainpoolP384t1", TeleTrusTObjectIdentifiers.BrainpoolP384T1, BrainpoolP384t1Holder.Instance);
- DefineCurve("brainpoolP512r1", TeleTrusTObjectIdentifiers.BrainpoolP512R1, BrainpoolP512r1Holder.Instance);
- DefineCurve("brainpoolP512t1", TeleTrusTObjectIdentifiers.BrainpoolP512T1, BrainpoolP512t1Holder.Instance);
- }
-
- public static X9ECParameters GetByName(
- string name)
- {
- DerObjectIdentifier oid = GetOid(name);
- return oid == null ? null : GetByOid(oid);
- }
-
- /**
- * return the X9ECParameters object for the named curve represented by
- * the passed in object identifier. Null if the curve isn't present.
- *
- * @param oid an object identifier representing a named curve, if present.
- */
- public static X9ECParameters GetByOid(
- DerObjectIdentifier oid)
- {
- X9ECParametersHolder holder = (X9ECParametersHolder)curves[oid];
- return holder == null ? null : holder.Parameters;
- }
-
- /**
- * return the object identifier signified by the passed in name. Null
- * if there is no object identifier associated with name.
- *
- * @return the object identifier associated with name, if present.
- */
- public static DerObjectIdentifier GetOid(
- string name)
- {
- return (DerObjectIdentifier)objIds[Platform.ToUpperInvariant(name)];
- }
-
- /**
- * return the named curve name represented by the given object identifier.
- */
- public static string GetName(
- DerObjectIdentifier oid)
- {
- return (string)names[oid];
- }
-
- /**
- * returns an enumeration containing the name strings for curves
- * contained in this structure.
- */
- public static IEnumerable Names
- {
- get { return new EnumerableProxy(names.Values); }
- }
-
- public static DerObjectIdentifier GetOid(
- short curvesize,
- bool twisted)
- {
- return GetOid("brainpoolP" + curvesize + (twisted ? "t" : "r") + "1");
- }
- }
-}
diff --git a/BCCrypto/src/asn1/teletrust/TeleTrusTObjectIdentifiers.cs b/BCCrypto/src/asn1/teletrust/TeleTrusTObjectIdentifiers.cs
deleted file mode 100644
index 56e7084..0000000
--- a/BCCrypto/src/asn1/teletrust/TeleTrusTObjectIdentifiers.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-namespace Org.BouncyCastle.Asn1.TeleTrust
-{
- public sealed class TeleTrusTObjectIdentifiers
- {
- private TeleTrusTObjectIdentifiers()
- {
- }
-
- public static readonly DerObjectIdentifier TeleTrusTAlgorithm = new DerObjectIdentifier("1.3.36.3");
-
- public static readonly DerObjectIdentifier RipeMD160 = new DerObjectIdentifier(TeleTrusTAlgorithm + ".2.1");
- public static readonly DerObjectIdentifier RipeMD128 = new DerObjectIdentifier(TeleTrusTAlgorithm + ".2.2");
- public static readonly DerObjectIdentifier RipeMD256 = new DerObjectIdentifier(TeleTrusTAlgorithm + ".2.3");
-
- public static readonly DerObjectIdentifier TeleTrusTRsaSignatureAlgorithm = new DerObjectIdentifier(TeleTrusTAlgorithm + ".3.1");
-
- public static readonly DerObjectIdentifier RsaSignatureWithRipeMD160 = new DerObjectIdentifier(TeleTrusTRsaSignatureAlgorithm + ".2");
- public static readonly DerObjectIdentifier RsaSignatureWithRipeMD128 = new DerObjectIdentifier(TeleTrusTRsaSignatureAlgorithm + ".3");
- public static readonly DerObjectIdentifier RsaSignatureWithRipeMD256 = new DerObjectIdentifier(TeleTrusTRsaSignatureAlgorithm + ".4");
-
- public static readonly DerObjectIdentifier ECSign = new DerObjectIdentifier(TeleTrusTAlgorithm + ".3.2");
-
- public static readonly DerObjectIdentifier ECSignWithSha1 = new DerObjectIdentifier(ECSign + ".1");
- public static readonly DerObjectIdentifier ECSignWithRipeMD160 = new DerObjectIdentifier(ECSign + ".2");
-
- public static readonly DerObjectIdentifier EccBrainpool = new DerObjectIdentifier(TeleTrusTAlgorithm + ".3.2.8");
- public static readonly DerObjectIdentifier EllipticCurve = new DerObjectIdentifier(EccBrainpool + ".1");
- public static readonly DerObjectIdentifier VersionOne = new DerObjectIdentifier(EllipticCurve + ".1");
-
- public static readonly DerObjectIdentifier BrainpoolP160R1 = new DerObjectIdentifier(VersionOne + ".1");
- public static readonly DerObjectIdentifier BrainpoolP160T1 = new DerObjectIdentifier(VersionOne + ".2");
- public static readonly DerObjectIdentifier BrainpoolP192R1 = new DerObjectIdentifier(VersionOne + ".3");
- public static readonly DerObjectIdentifier BrainpoolP192T1 = new DerObjectIdentifier(VersionOne + ".4");
- public static readonly DerObjectIdentifier BrainpoolP224R1 = new DerObjectIdentifier(VersionOne + ".5");
- public static readonly DerObjectIdentifier BrainpoolP224T1 = new DerObjectIdentifier(VersionOne + ".6");
- public static readonly DerObjectIdentifier BrainpoolP256R1 = new DerObjectIdentifier(VersionOne + ".7");
- public static readonly DerObjectIdentifier BrainpoolP256T1 = new DerObjectIdentifier(VersionOne + ".8");
- public static readonly DerObjectIdentifier BrainpoolP320R1 = new DerObjectIdentifier(VersionOne + ".9");
- public static readonly DerObjectIdentifier BrainpoolP320T1 = new DerObjectIdentifier(VersionOne + ".10");
- public static readonly DerObjectIdentifier BrainpoolP384R1 = new DerObjectIdentifier(VersionOne + ".11");
- public static readonly DerObjectIdentifier BrainpoolP384T1 = new DerObjectIdentifier(VersionOne + ".12");
- public static readonly DerObjectIdentifier BrainpoolP512R1 = new DerObjectIdentifier(VersionOne + ".13");
- public static readonly DerObjectIdentifier BrainpoolP512T1 = new DerObjectIdentifier(VersionOne + ".14");
- }
-}
diff --git a/BCCrypto/src/asn1/tsp/Accuracy.cs b/BCCrypto/src/asn1/tsp/Accuracy.cs
deleted file mode 100644
index 9f2c7e8..0000000
--- a/BCCrypto/src/asn1/tsp/Accuracy.cs
+++ /dev/null
@@ -1,151 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Tsp
-{
- public class Accuracy
- : Asn1Encodable
- {
- private readonly DerInteger seconds;
- private readonly DerInteger millis;
- private readonly DerInteger micros;
-
- // constants
- protected const int MinMillis = 1;
- protected const int MaxMillis = 999;
- protected const int MinMicros = 1;
- protected const int MaxMicros = 999;
-
- public Accuracy(
- DerInteger seconds,
- DerInteger millis,
- DerInteger micros)
- {
- //Verifications
- if (millis != null
- && (millis.Value.IntValue < MinMillis
- || millis.Value.IntValue > MaxMillis))
- {
- throw new ArgumentException(
- "Invalid millis field : not in (1..999)");
- }
-
- if (micros != null
- && (micros.Value.IntValue < MinMicros
- || micros.Value.IntValue > MaxMicros))
- {
- throw new ArgumentException(
- "Invalid micros field : not in (1..999)");
- }
-
- this.seconds = seconds;
- this.millis = millis;
- this.micros = micros;
- }
-
- private Accuracy(
- Asn1Sequence seq)
- {
- for (int i = 0; i < seq.Count; ++i)
- {
- // seconds
- if (seq[i] is DerInteger)
- {
- seconds = (DerInteger) seq[i];
- }
- else if (seq[i] is DerTaggedObject)
- {
- DerTaggedObject extra = (DerTaggedObject) seq[i];
-
- switch (extra.TagNo)
- {
- case 0:
- millis = DerInteger.GetInstance(extra, false);
- if (millis.Value.IntValue < MinMillis
- || millis.Value.IntValue > MaxMillis)
- {
- throw new ArgumentException(
- "Invalid millis field : not in (1..999).");
- }
- break;
- case 1:
- micros = DerInteger.GetInstance(extra, false);
- if (micros.Value.IntValue < MinMicros
- || micros.Value.IntValue > MaxMicros)
- {
- throw new ArgumentException(
- "Invalid micros field : not in (1..999).");
- }
- break;
- default:
- throw new ArgumentException("Invalig tag number");
- }
- }
- }
- }
-
- public static Accuracy GetInstance(
- object o)
- {
- if (o == null || o is Accuracy)
- {
- return (Accuracy) o;
- }
-
- if (o is Asn1Sequence)
- {
- return new Accuracy((Asn1Sequence) o);
- }
-
- throw new ArgumentException(
- "Unknown object in 'Accuracy' factory: " + Platform.GetTypeName(o));
- }
-
- public DerInteger Seconds
- {
- get { return seconds; }
- }
-
- public DerInteger Millis
- {
- get { return millis; }
- }
-
- public DerInteger Micros
- {
- get { return micros; }
- }
-
- /**
- *
- * Accuracy ::= SEQUENCE {
- * seconds INTEGER OPTIONAL,
- * millis [0] INTEGER (1..999) OPTIONAL,
- * micros [1] INTEGER (1..999) OPTIONAL
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (seconds != null)
- {
- v.Add(seconds);
- }
-
- if (millis != null)
- {
- v.Add(new DerTaggedObject(false, 0, millis));
- }
-
- if (micros != null)
- {
- v.Add(new DerTaggedObject(false, 1, micros));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/tsp/MessageImprint.cs b/BCCrypto/src/asn1/tsp/MessageImprint.cs
deleted file mode 100644
index 44ef7d1..0000000
--- a/BCCrypto/src/asn1/tsp/MessageImprint.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Tsp
-{
- public class MessageImprint
- : Asn1Encodable
- {
- private readonly AlgorithmIdentifier hashAlgorithm;
- private readonly byte[] hashedMessage;
-
- /**
- * @param o
- * @return a MessageImprint object.
- */
- public static MessageImprint GetInstance(
- object o)
- {
- if (o == null || o is MessageImprint)
- {
- return (MessageImprint) o;
- }
-
- if (o is Asn1Sequence)
- {
- return new MessageImprint((Asn1Sequence) o);
- }
-
- throw new ArgumentException(
- "Unknown object in 'MessageImprint' factory: " + Platform.GetTypeName(o));
- }
-
- private MessageImprint(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- this.hashAlgorithm = AlgorithmIdentifier.GetInstance(seq[0]);
- this.hashedMessage = Asn1OctetString.GetInstance(seq[1]).GetOctets();
- }
-
- public MessageImprint(
- AlgorithmIdentifier hashAlgorithm,
- byte[] hashedMessage)
- {
- this.hashAlgorithm = hashAlgorithm;
- this.hashedMessage = hashedMessage;
- }
-
- public AlgorithmIdentifier HashAlgorithm
- {
- get { return hashAlgorithm; }
- }
-
- public byte[] GetHashedMessage()
- {
- return hashedMessage;
- }
-
- /**
- *
- * MessageImprint ::= SEQUENCE {
- * hashAlgorithm AlgorithmIdentifier,
- * hashedMessage OCTET STRING }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(hashAlgorithm, new DerOctetString(hashedMessage));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/tsp/TSTInfo.cs b/BCCrypto/src/asn1/tsp/TSTInfo.cs
deleted file mode 100644
index 89f3e8b..0000000
--- a/BCCrypto/src/asn1/tsp/TSTInfo.cs
+++ /dev/null
@@ -1,250 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Tsp
-{
- public class TstInfo
- : Asn1Encodable
- {
- private readonly DerInteger version;
- private readonly DerObjectIdentifier tsaPolicyId;
- private readonly MessageImprint messageImprint;
- private readonly DerInteger serialNumber;
- private readonly DerGeneralizedTime genTime;
- private readonly Accuracy accuracy;
- private readonly DerBoolean ordering;
- private readonly DerInteger nonce;
- private readonly GeneralName tsa;
- private readonly X509Extensions extensions;
-
- public static TstInfo GetInstance(
- object o)
- {
- if (o == null || o is TstInfo)
- {
- return (TstInfo) o;
- }
-
- if (o is Asn1Sequence)
- {
- return new TstInfo((Asn1Sequence) o);
- }
-
- if (o is Asn1OctetString)
- {
- try
- {
- byte[] octets = ((Asn1OctetString)o).GetOctets();
- return GetInstance(Asn1Object.FromByteArray(octets));
- }
- catch (IOException)
- {
- throw new ArgumentException(
- "Bad object format in 'TstInfo' factory.");
- }
- }
-
- throw new ArgumentException(
- "Unknown object in 'TstInfo' factory: " + Platform.GetTypeName(o));
- }
-
- private TstInfo(
- Asn1Sequence seq)
- {
- IEnumerator e = seq.GetEnumerator();
-
- // version
- e.MoveNext();
- version = DerInteger.GetInstance(e.Current);
-
- // tsaPolicy
- e.MoveNext();
- tsaPolicyId = DerObjectIdentifier.GetInstance(e.Current);
-
- // messageImprint
- e.MoveNext();
- messageImprint = MessageImprint.GetInstance(e.Current);
-
- // serialNumber
- e.MoveNext();
- serialNumber = DerInteger.GetInstance(e.Current);
-
- // genTime
- e.MoveNext();
- genTime = DerGeneralizedTime.GetInstance(e.Current);
-
- // default for ordering
- ordering = DerBoolean.False;
-
- while (e.MoveNext())
- {
- Asn1Object o = (Asn1Object) e.Current;
-
- if (o is Asn1TaggedObject)
- {
- DerTaggedObject tagged = (DerTaggedObject) o;
-
- switch (tagged.TagNo)
- {
- case 0:
- tsa = GeneralName.GetInstance(tagged, true);
- break;
- case 1:
- extensions = X509Extensions.GetInstance(tagged, false);
- break;
- default:
- throw new ArgumentException("Unknown tag value " + tagged.TagNo);
- }
- }
-
- if (o is DerSequence)
- {
- accuracy = Accuracy.GetInstance(o);
- }
-
- if (o is DerBoolean)
- {
- ordering = DerBoolean.GetInstance(o);
- }
-
- if (o is DerInteger)
- {
- nonce = DerInteger.GetInstance(o);
- }
- }
- }
-
- public TstInfo(
- DerObjectIdentifier tsaPolicyId,
- MessageImprint messageImprint,
- DerInteger serialNumber,
- DerGeneralizedTime genTime,
- Accuracy accuracy,
- DerBoolean ordering,
- DerInteger nonce,
- GeneralName tsa,
- X509Extensions extensions)
- {
- this.version = new DerInteger(1);
- this.tsaPolicyId = tsaPolicyId;
- this.messageImprint = messageImprint;
- this.serialNumber = serialNumber;
- this.genTime = genTime;
- this.accuracy = accuracy;
- this.ordering = ordering;
- this.nonce = nonce;
- this.tsa = tsa;
- this.extensions = extensions;
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public MessageImprint MessageImprint
- {
- get { return messageImprint; }
- }
-
- public DerObjectIdentifier Policy
- {
- get { return tsaPolicyId; }
- }
-
- public DerInteger SerialNumber
- {
- get { return serialNumber; }
- }
-
- public Accuracy Accuracy
- {
- get { return accuracy; }
- }
-
- public DerGeneralizedTime GenTime
- {
- get { return genTime; }
- }
-
- public DerBoolean Ordering
- {
- get { return ordering; }
- }
-
- public DerInteger Nonce
- {
- get { return nonce; }
- }
-
- public GeneralName Tsa
- {
- get { return tsa; }
- }
-
- public X509Extensions Extensions
- {
- get { return extensions; }
- }
-
- /**
- *
- *
- * TstInfo ::= SEQUENCE {
- * version INTEGER { v1(1) },
- * policy TSAPolicyId,
- * messageImprint MessageImprint,
- * -- MUST have the same value as the similar field in
- * -- TimeStampReq
- * serialNumber INTEGER,
- * -- Time-Stamping users MUST be ready to accommodate integers
- * -- up to 160 bits.
- * genTime GeneralizedTime,
- * accuracy Accuracy OPTIONAL,
- * ordering BOOLEAN DEFAULT FALSE,
- * nonce INTEGER OPTIONAL,
- * -- MUST be present if the similar field was present
- * -- in TimeStampReq. In that case it MUST have the same value.
- * tsa [0] GeneralName OPTIONAL,
- * extensions [1] IMPLICIT Extensions OPTIONAL }
- *
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- version, tsaPolicyId, messageImprint, serialNumber, genTime);
-
- if (accuracy != null)
- {
- v.Add(accuracy);
- }
-
- if (ordering != null && ordering.IsTrue)
- {
- v.Add(ordering);
- }
-
- if (nonce != null)
- {
- v.Add(nonce);
- }
-
- if (tsa != null)
- {
- v.Add(new DerTaggedObject(true, 0, tsa));
- }
-
- if (extensions != null)
- {
- v.Add(new DerTaggedObject(false, 1, extensions));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/tsp/TimeStampReq.cs b/BCCrypto/src/asn1/tsp/TimeStampReq.cs
deleted file mode 100644
index 5b05f33..0000000
--- a/BCCrypto/src/asn1/tsp/TimeStampReq.cs
+++ /dev/null
@@ -1,165 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Tsp
-{
- public class TimeStampReq
- : Asn1Encodable
- {
- private readonly DerInteger version;
- private readonly MessageImprint messageImprint;
- private readonly DerObjectIdentifier tsaPolicy;
- private readonly DerInteger nonce;
- private readonly DerBoolean certReq;
- private readonly X509Extensions extensions;
-
- public static TimeStampReq GetInstance(
- object o)
- {
- if (o == null || o is TimeStampReq)
- {
- return (TimeStampReq) o;
- }
-
- if (o is Asn1Sequence)
- {
- return new TimeStampReq((Asn1Sequence) o);
- }
-
- throw new ArgumentException(
- "Unknown object in 'TimeStampReq' factory: " + Platform.GetTypeName(o));
- }
-
- private TimeStampReq(
- Asn1Sequence seq)
- {
- int nbObjects = seq.Count;
- int seqStart = 0;
-
- // version
- version = DerInteger.GetInstance(seq[seqStart++]);
-
- // messageImprint
- messageImprint = MessageImprint.GetInstance(seq[seqStart++]);
-
- for (int opt = seqStart; opt < nbObjects; opt++)
- {
- // tsaPolicy
- if (seq[opt] is DerObjectIdentifier)
- {
- tsaPolicy = DerObjectIdentifier.GetInstance(seq[opt]);
- }
- // nonce
- else if (seq[opt] is DerInteger)
- {
- nonce = DerInteger.GetInstance(seq[opt]);
- }
- // certReq
- else if (seq[opt] is DerBoolean)
- {
- certReq = DerBoolean.GetInstance(seq[opt]);
- }
- // extensions
- else if (seq[opt] is Asn1TaggedObject)
- {
- Asn1TaggedObject tagged = (Asn1TaggedObject) seq[opt];
- if (tagged.TagNo == 0)
- {
- extensions = X509Extensions.GetInstance(tagged, false);
- }
- }
- }
- }
-
- public TimeStampReq(
- MessageImprint messageImprint,
- DerObjectIdentifier tsaPolicy,
- DerInteger nonce,
- DerBoolean certReq,
- X509Extensions extensions)
- {
- // default
- this.version = new DerInteger(1);
-
- this.messageImprint = messageImprint;
- this.tsaPolicy = tsaPolicy;
- this.nonce = nonce;
- this.certReq = certReq;
- this.extensions = extensions;
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public MessageImprint MessageImprint
- {
- get { return messageImprint; }
- }
-
- public DerObjectIdentifier ReqPolicy
- {
- get { return tsaPolicy; }
- }
-
- public DerInteger Nonce
- {
- get { return nonce; }
- }
-
- public DerBoolean CertReq
- {
- get { return certReq; }
- }
-
- public X509Extensions Extensions
- {
- get { return extensions; }
- }
-
- /**
- *
- * TimeStampReq ::= SEQUENCE {
- * version INTEGER { v1(1) },
- * messageImprint MessageImprint,
- * --a hash algorithm OID and the hash value of the data to be
- * --time-stamped
- * reqPolicy TSAPolicyId OPTIONAL,
- * nonce INTEGER OPTIONAL,
- * certReq BOOLEAN DEFAULT FALSE,
- * extensions [0] IMPLICIT Extensions OPTIONAL
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- version, messageImprint);
-
- if (tsaPolicy != null)
- {
- v.Add(tsaPolicy);
- }
-
- if (nonce != null)
- {
- v.Add(nonce);
- }
-
- if (certReq != null && certReq.IsTrue)
- {
- v.Add(certReq);
- }
-
- if (extensions != null)
- {
- v.Add(new DerTaggedObject(false, 0, extensions));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/tsp/TimeStampResp.cs b/BCCrypto/src/asn1/tsp/TimeStampResp.cs
deleted file mode 100644
index b910260..0000000
--- a/BCCrypto/src/asn1/tsp/TimeStampResp.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Cmp;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Tsp
-{
- public class TimeStampResp
- : Asn1Encodable
- {
- private readonly PkiStatusInfo pkiStatusInfo;
- private readonly ContentInfo timeStampToken;
-
- public static TimeStampResp GetInstance(
- object o)
- {
- if (o == null || o is TimeStampResp)
- {
- return (TimeStampResp) o;
- }
-
- if (o is Asn1Sequence)
- {
- return new TimeStampResp((Asn1Sequence) o);
- }
-
- throw new ArgumentException(
- "Unknown object in 'TimeStampResp' factory: " + Platform.GetTypeName(o));
- }
-
- private TimeStampResp(
- Asn1Sequence seq)
- {
- this.pkiStatusInfo = PkiStatusInfo.GetInstance(seq[0]);
-
- if (seq.Count > 1)
- {
- this.timeStampToken = ContentInfo.GetInstance(seq[1]);
- }
- }
-
- public TimeStampResp(
- PkiStatusInfo pkiStatusInfo,
- ContentInfo timeStampToken)
- {
- this.pkiStatusInfo = pkiStatusInfo;
- this.timeStampToken = timeStampToken;
- }
-
- public PkiStatusInfo Status
- {
- get { return pkiStatusInfo; }
- }
-
- public ContentInfo TimeStampToken
- {
- get { return timeStampToken; }
- }
-
- /**
- *
- * TimeStampResp ::= SEQUENCE {
- * status PkiStatusInfo,
- * timeStampToken TimeStampToken OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(pkiStatusInfo);
-
- if (timeStampToken != null)
- {
- v.Add(timeStampToken);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/util/Asn1Dump.cs b/BCCrypto/src/asn1/util/Asn1Dump.cs
deleted file mode 100644
index 6a21ee2..0000000
--- a/BCCrypto/src/asn1/util/Asn1Dump.cs
+++ /dev/null
@@ -1,381 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Asn1.Utilities
-{
- public sealed class Asn1Dump
- {
- private static readonly string NewLine = Platform.NewLine;
-
- private Asn1Dump()
- {
- }
-
- private const string Tab = " ";
- private const int SampleSize = 32;
-
- /**
- * dump a Der object as a formatted string with indentation
- *
- * @param obj the Asn1Object to be dumped out.
- */
- private static void AsString(
- string indent,
- bool verbose,
- Asn1Object obj,
- StringBuilder buf)
- {
- if (obj is Asn1Sequence)
- {
- string tab = indent + Tab;
- buf.Append(indent);
- if (obj is BerSequence)
- {
- buf.Append("BER Sequence");
- }
- else if (obj is DerSequence)
- {
- buf.Append("DER Sequence");
- }
- else
- {
- buf.Append("Sequence");
- }
-
- buf.Append(NewLine);
-
- foreach (Asn1Encodable o in ((Asn1Sequence)obj))
- {
- if (o == null || o is Asn1Null)
- {
- buf.Append(tab);
- buf.Append("NULL");
- buf.Append(NewLine);
- }
- else
- {
- AsString(tab, verbose, o.ToAsn1Object(), buf);
- }
- }
- }
- else if (obj is DerTaggedObject)
- {
- string tab = indent + Tab;
- buf.Append(indent);
- if (obj is BerTaggedObject)
- {
- buf.Append("BER Tagged [");
- }
- else
- {
- buf.Append("Tagged [");
- }
-
- DerTaggedObject o = (DerTaggedObject)obj;
-
- buf.Append(((int)o.TagNo).ToString());
- buf.Append(']');
-
- if (!o.IsExplicit())
- {
- buf.Append(" IMPLICIT ");
- }
-
- buf.Append(NewLine);
-
- if (o.IsEmpty())
- {
- buf.Append(tab);
- buf.Append("EMPTY");
- buf.Append(NewLine);
- }
- else
- {
- AsString(tab, verbose, o.GetObject(), buf);
- }
- }
- else if (obj is BerSet)
- {
- string tab = indent + Tab;
-
- buf.Append(indent);
- buf.Append("BER Set");
- buf.Append(NewLine);
-
- foreach (Asn1Encodable o in ((Asn1Set)obj))
- {
- if (o == null)
- {
- buf.Append(tab);
- buf.Append("NULL");
- buf.Append(NewLine);
- }
- else
- {
- AsString(tab, verbose, o.ToAsn1Object(), buf);
- }
- }
- }
- else if (obj is DerSet)
- {
- string tab = indent + Tab;
-
- buf.Append(indent);
- buf.Append("DER Set");
- buf.Append(NewLine);
-
- foreach (Asn1Encodable o in ((Asn1Set)obj))
- {
- if (o == null)
- {
- buf.Append(tab);
- buf.Append("NULL");
- buf.Append(NewLine);
- }
- else
- {
- AsString(tab, verbose, o.ToAsn1Object(), buf);
- }
- }
- }
- else if (obj is DerObjectIdentifier)
- {
- buf.Append(indent + "ObjectIdentifier(" + ((DerObjectIdentifier)obj).Id + ")" + NewLine);
- }
- else if (obj is DerBoolean)
- {
- buf.Append(indent + "Boolean(" + ((DerBoolean)obj).IsTrue + ")" + NewLine);
- }
- else if (obj is DerInteger)
- {
- buf.Append(indent + "Integer(" + ((DerInteger)obj).Value + ")" + NewLine);
- }
- else if (obj is BerOctetString)
- {
- byte[] octets = ((Asn1OctetString)obj).GetOctets();
- string extra = verbose ? dumpBinaryDataAsString(indent, octets) : "";
- buf.Append(indent + "BER Octet String" + "[" + octets.Length + "] " + extra + NewLine);
- }
- else if (obj is DerOctetString)
- {
- byte[] octets = ((Asn1OctetString)obj).GetOctets();
- string extra = verbose ? dumpBinaryDataAsString(indent, octets) : "";
- buf.Append(indent + "DER Octet String" + "[" + octets.Length + "] " + extra + NewLine);
- }
- else if (obj is DerBitString)
- {
- DerBitString bt = (DerBitString)obj;
- byte[] bytes = bt.GetBytes();
- string extra = verbose ? dumpBinaryDataAsString(indent, bytes) : "";
- buf.Append(indent + "DER Bit String" + "[" + bytes.Length + ", " + bt.PadBits + "] " + extra + NewLine);
- }
- else if (obj is DerIA5String)
- {
- buf.Append(indent + "IA5String(" + ((DerIA5String)obj).GetString() + ") " + NewLine);
- }
- else if (obj is DerUtf8String)
- {
- buf.Append(indent + "UTF8String(" + ((DerUtf8String)obj).GetString() + ") " + NewLine);
- }
- else if (obj is DerPrintableString)
- {
- buf.Append(indent + "PrintableString(" + ((DerPrintableString)obj).GetString() + ") " + NewLine);
- }
- else if (obj is DerVisibleString)
- {
- buf.Append(indent + "VisibleString(" + ((DerVisibleString)obj).GetString() + ") " + NewLine);
- }
- else if (obj is DerBmpString)
- {
- buf.Append(indent + "BMPString(" + ((DerBmpString)obj).GetString() + ") " + NewLine);
- }
- else if (obj is DerT61String)
- {
- buf.Append(indent + "T61String(" + ((DerT61String)obj).GetString() + ") " + NewLine);
- }
- else if (obj is DerGraphicString)
- {
- buf.Append(indent + "GraphicString(" + ((DerGraphicString)obj).GetString() + ") " + NewLine);
- }
- else if (obj is DerVideotexString)
- {
- buf.Append(indent + "VideotexString(" + ((DerVideotexString)obj).GetString() + ") " + NewLine);
- }
- else if (obj is DerUtcTime)
- {
- buf.Append(indent + "UTCTime(" + ((DerUtcTime)obj).TimeString + ") " + NewLine);
- }
- else if (obj is DerGeneralizedTime)
- {
- buf.Append(indent + "GeneralizedTime(" + ((DerGeneralizedTime)obj).GetTime() + ") " + NewLine);
- }
- else if (obj is BerApplicationSpecific)
- {
- buf.Append(outputApplicationSpecific("BER", indent, verbose, (BerApplicationSpecific)obj));
- }
- else if (obj is DerApplicationSpecific)
- {
- buf.Append(outputApplicationSpecific("DER", indent, verbose, (DerApplicationSpecific)obj));
- }
- else if (obj is DerEnumerated)
- {
- DerEnumerated en = (DerEnumerated)obj;
- buf.Append(indent + "DER Enumerated(" + en.Value + ")" + NewLine);
- }
- else if (obj is DerExternal)
- {
- DerExternal ext = (DerExternal)obj;
- buf.Append(indent + "External " + NewLine);
- string tab = indent + Tab;
-
- if (ext.DirectReference != null)
- {
- buf.Append(tab + "Direct Reference: " + ext.DirectReference.Id + NewLine);
- }
- if (ext.IndirectReference != null)
- {
- buf.Append(tab + "Indirect Reference: " + ext.IndirectReference.ToString() + NewLine);
- }
- if (ext.DataValueDescriptor != null)
- {
- AsString(tab, verbose, ext.DataValueDescriptor, buf);
- }
- buf.Append(tab + "Encoding: " + ext.Encoding + NewLine);
- AsString(tab, verbose, ext.ExternalContent, buf);
- }
- else
- {
- buf.Append(indent + obj.ToString() + NewLine);
- }
- }
-
- private static string outputApplicationSpecific(
- string type,
- string indent,
- bool verbose,
- DerApplicationSpecific app)
- {
- StringBuilder buf = new StringBuilder();
-
- if (app.IsConstructed())
- {
- try
- {
- Asn1Sequence s = Asn1Sequence.GetInstance(app.GetObject(Asn1Tags.Sequence));
- buf.Append(indent + type + " ApplicationSpecific[" + app.ApplicationTag + "]" + NewLine);
- foreach (Asn1Encodable ae in s)
- {
- AsString(indent + Tab, verbose, ae.ToAsn1Object(), buf);
- }
- }
- catch (IOException e)
- {
- buf.Append(e);
- }
- return buf.ToString();
- }
-
- return indent + type + " ApplicationSpecific[" + app.ApplicationTag + "] ("
- + Hex.ToHexString(app.GetContents()) + ")" + NewLine;
- }
-
- [Obsolete("Use version accepting Asn1Encodable")]
- public static string DumpAsString(
- object obj)
- {
- if (obj is Asn1Encodable)
- {
- StringBuilder buf = new StringBuilder();
- AsString("", false, ((Asn1Encodable)obj).ToAsn1Object(), buf);
- return buf.ToString();
- }
-
- return "unknown object type " + obj.ToString();
- }
-
- /**
- * dump out a DER object as a formatted string, in non-verbose mode
- *
- * @param obj the Asn1Encodable to be dumped out.
- * @return the resulting string.
- */
- public static string DumpAsString(
- Asn1Encodable obj)
- {
- return DumpAsString(obj, false);
- }
-
- /**
- * Dump out the object as a string
- *
- * @param obj the Asn1Encodable to be dumped out.
- * @param verbose if true, dump out the contents of octet and bit strings.
- * @return the resulting string.
- */
- public static string DumpAsString(
- Asn1Encodable obj,
- bool verbose)
- {
- StringBuilder buf = new StringBuilder();
- AsString("", verbose, obj.ToAsn1Object(), buf);
- return buf.ToString();
- }
-
- private static string dumpBinaryDataAsString(string indent, byte[] bytes)
- {
- indent += Tab;
-
- StringBuilder buf = new StringBuilder(NewLine);
-
- for (int i = 0; i < bytes.Length; i += SampleSize)
- {
- if (bytes.Length - i > SampleSize)
- {
- buf.Append(indent);
- buf.Append(Hex.ToHexString(bytes, i, SampleSize));
- buf.Append(Tab);
- buf.Append(calculateAscString(bytes, i, SampleSize));
- buf.Append(NewLine);
- }
- else
- {
- buf.Append(indent);
- buf.Append(Hex.ToHexString(bytes, i, bytes.Length - i));
- for (int j = bytes.Length - i; j != SampleSize; j++)
- {
- buf.Append(" ");
- }
- buf.Append(Tab);
- buf.Append(calculateAscString(bytes, i, bytes.Length - i));
- buf.Append(NewLine);
- }
- }
-
- return buf.ToString();
- }
-
- private static string calculateAscString(
- byte[] bytes,
- int off,
- int len)
- {
- StringBuilder buf = new StringBuilder();
-
- for (int i = off; i != off + len; i++)
- {
- char c = (char)bytes[i];
- if (c >= ' ' && c <= '~')
- {
- buf.Append(c);
- }
- }
-
- return buf.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/util/Dump.cs b/BCCrypto/src/asn1/util/Dump.cs
deleted file mode 100644
index e313fe8..0000000
--- a/BCCrypto/src/asn1/util/Dump.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-#if !PORTABLE
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Utilities
-{
- public sealed class Dump
- {
- private Dump()
- {
- }
-
- public static void Main(string[] args)
- {
- FileStream fIn = File.OpenRead(args[0]);
- Asn1InputStream bIn = new Asn1InputStream(fIn);
-
- Asn1Object obj;
- while ((obj = bIn.ReadObject()) != null)
- {
- Console.WriteLine(Asn1Dump.DumpAsString(obj));
- }
-
- Platform.Dispose(bIn);
- }
- }
-}
-#endif
diff --git a/BCCrypto/src/asn1/util/FilterStream.cs b/BCCrypto/src/asn1/util/FilterStream.cs
deleted file mode 100644
index 0c38c5b..0000000
--- a/BCCrypto/src/asn1/util/FilterStream.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.Utilities
-{
- [Obsolete("Use Org.BouncyCastle.Utilities.IO.FilterStream")]
- public class FilterStream : Stream
- {
- [Obsolete("Use Org.BouncyCastle.Utilities.IO.FilterStream")]
- public FilterStream(Stream s)
- {
- this.s = s;
- }
- public override bool CanRead
- {
- get { return s.CanRead; }
- }
- public override bool CanSeek
- {
- get { return s.CanSeek; }
- }
- public override bool CanWrite
- {
- get { return s.CanWrite; }
- }
- public override long Length
- {
- get { return s.Length; }
- }
- public override long Position
- {
- get { return s.Position; }
- set { s.Position = value; }
- }
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Platform.Dispose(s);
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Platform.Dispose(s);
- base.Close();
- }
-#endif
- public override void Flush()
- {
- s.Flush();
- }
- public override long Seek(long offset, SeekOrigin origin)
- {
- return s.Seek(offset, origin);
- }
- public override void SetLength(long value)
- {
- s.SetLength(value);
- }
- public override int Read(byte[] buffer, int offset, int count)
- {
- return s.Read(buffer, offset, count);
- }
- public override int ReadByte()
- {
- return s.ReadByte();
- }
- public override void Write(byte[] buffer, int offset, int count)
- {
- s.Write(buffer, offset, count);
- }
- public override void WriteByte(byte value)
- {
- s.WriteByte(value);
- }
- protected readonly Stream s;
- }
-}
diff --git a/BCCrypto/src/asn1/x500/DirectoryString.cs b/BCCrypto/src/asn1/x500/DirectoryString.cs
deleted file mode 100644
index d907c64..0000000
--- a/BCCrypto/src/asn1/x500/DirectoryString.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X500
-{
- public class DirectoryString
- : Asn1Encodable, IAsn1Choice, IAsn1String
- {
- private readonly DerStringBase str;
-
- public static DirectoryString GetInstance(
- object obj)
- {
- if (obj is DirectoryString)
- {
- return (DirectoryString) obj;
- }
-
- if (obj is DerStringBase)
- {
- if (obj is DerT61String
- || obj is DerPrintableString
- || obj is DerUniversalString
- || obj is DerUtf8String
- || obj is DerBmpString)
- {
- return new DirectoryString((DerStringBase) obj);
- }
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public static DirectoryString GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- if (!isExplicit)
- throw new ArgumentException("choice item must be explicitly tagged");
-
- return GetInstance(obj.GetObject());
- }
-
- private DirectoryString(
- DerStringBase str)
- {
- this.str = str;
- }
-
- public DirectoryString(
- string str)
- {
- this.str = new DerUtf8String(str);
- }
-
- public string GetString()
- {
- return str.GetString();
- }
-
- /**
- *
- * DirectoryString ::= CHOICE {
- * teletexString TeletexString (SIZE (1..MAX)),
- * printableString PrintableString (SIZE (1..MAX)),
- * universalString UniversalString (SIZE (1..MAX)),
- * utf8String UTF8String (SIZE (1..MAX)),
- * bmpString BMPString (SIZE (1..MAX)) }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return str.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/AccessDescription.cs b/BCCrypto/src/asn1/x509/AccessDescription.cs
deleted file mode 100644
index 47374be..0000000
--- a/BCCrypto/src/asn1/x509/AccessDescription.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The AccessDescription object.
- *
- * AccessDescription ::= SEQUENCE {
- * accessMethod OBJECT IDENTIFIER,
- * accessLocation GeneralName }
- *
- */
- public class AccessDescription
- : Asn1Encodable
- {
- public readonly static DerObjectIdentifier IdADCAIssuers = new DerObjectIdentifier("1.3.6.1.5.5.7.48.2");
- public readonly static DerObjectIdentifier IdADOcsp = new DerObjectIdentifier("1.3.6.1.5.5.7.48.1");
-
- private readonly DerObjectIdentifier accessMethod;
- private readonly GeneralName accessLocation;
-
- public static AccessDescription GetInstance(
- object obj)
- {
- if (obj is AccessDescription)
- return (AccessDescription) obj;
-
- if (obj is Asn1Sequence)
- return new AccessDescription((Asn1Sequence) obj);
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- private AccessDescription(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("wrong number of elements in sequence");
-
- accessMethod = DerObjectIdentifier.GetInstance(seq[0]);
- accessLocation = GeneralName.GetInstance(seq[1]);
- }
-
- /**
- * create an AccessDescription with the oid and location provided.
- */
- public AccessDescription(
- DerObjectIdentifier oid,
- GeneralName location)
- {
- accessMethod = oid;
- accessLocation = location;
- }
-
- /**
- *
- * @return the access method.
- */
- public DerObjectIdentifier AccessMethod
- {
- get { return accessMethod; }
- }
-
- /**
- *
- * @return the access location
- */
- public GeneralName AccessLocation
- {
- get { return accessLocation; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(accessMethod, accessLocation);
- }
-
- public override string ToString()
- {
- return "AccessDescription: Oid(" + this.accessMethod.Id + ")";
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/AlgorithmIdentifier.cs b/BCCrypto/src/asn1/x509/AlgorithmIdentifier.cs
deleted file mode 100644
index 00e7ad8..0000000
--- a/BCCrypto/src/asn1/x509/AlgorithmIdentifier.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class AlgorithmIdentifier
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier algorithm;
- private readonly Asn1Encodable parameters;
-
- public static AlgorithmIdentifier GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static AlgorithmIdentifier GetInstance(
- object obj)
- {
- if (obj == null)
- return null;
- if (obj is AlgorithmIdentifier)
- return (AlgorithmIdentifier)obj;
- return new AlgorithmIdentifier(Asn1Sequence.GetInstance(obj));
- }
-
- public AlgorithmIdentifier(
- DerObjectIdentifier algorithm)
- {
- this.algorithm = algorithm;
- }
-
- [Obsolete("Use version taking a DerObjectIdentifier")]
- public AlgorithmIdentifier(
- string algorithm)
- {
- this.algorithm = new DerObjectIdentifier(algorithm);
- }
-
- public AlgorithmIdentifier(
- DerObjectIdentifier algorithm,
- Asn1Encodable parameters)
- {
- this.algorithm = algorithm;
- this.parameters = parameters;
- }
-
- internal AlgorithmIdentifier(
- Asn1Sequence seq)
- {
- if (seq.Count < 1 || seq.Count > 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- this.algorithm = DerObjectIdentifier.GetInstance(seq[0]);
- this.parameters = seq.Count < 2 ? null : seq[1];
- }
-
- ///
- /// Return the OID in the Algorithm entry of this identifier.
- ///
- public virtual DerObjectIdentifier Algorithm
- {
- get { return algorithm; }
- }
-
- [Obsolete("Use 'Algorithm' property instead")]
- public virtual DerObjectIdentifier ObjectID
- {
- get { return algorithm; }
- }
-
- ///
- /// Return the parameters structure in the Parameters entry of this identifier.
- ///
- public virtual Asn1Encodable Parameters
- {
- get { return parameters; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * AlgorithmIdentifier ::= Sequence {
- * algorithm OBJECT IDENTIFIER,
- * parameters ANY DEFINED BY algorithm OPTIONAL }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(algorithm);
- v.AddOptional(parameters);
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/AttCertIssuer.cs b/BCCrypto/src/asn1/x509/AttCertIssuer.cs
deleted file mode 100644
index 407c4ae..0000000
--- a/BCCrypto/src/asn1/x509/AttCertIssuer.cs
+++ /dev/null
@@ -1,86 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class AttCertIssuer
- : Asn1Encodable, IAsn1Choice
- {
- internal readonly Asn1Encodable obj;
- internal readonly Asn1Object choiceObj;
-
- public static AttCertIssuer GetInstance(
- object obj)
- {
- if (obj is AttCertIssuer)
- {
- return (AttCertIssuer)obj;
- }
- else if (obj is V2Form)
- {
- return new AttCertIssuer(V2Form.GetInstance(obj));
- }
- else if (obj is GeneralNames)
- {
- return new AttCertIssuer((GeneralNames)obj);
- }
- else if (obj is Asn1TaggedObject)
- {
- return new AttCertIssuer(V2Form.GetInstance((Asn1TaggedObject)obj, false));
- }
- else if (obj is Asn1Sequence)
- {
- return new AttCertIssuer(GeneralNames.GetInstance(obj));
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public static AttCertIssuer GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(obj.GetObject()); // must be explictly tagged
- }
-
- ///
- /// Don't use this one if you are trying to be RFC 3281 compliant.
- /// Use it for v1 attribute certificates only.
- ///
- /// Our GeneralNames structure
- public AttCertIssuer(
- GeneralNames names)
- {
- obj = names;
- choiceObj = obj.ToAsn1Object();
- }
-
- public AttCertIssuer(
- V2Form v2Form)
- {
- obj = v2Form;
- choiceObj = new DerTaggedObject(false, 0, obj);
- }
-
- public Asn1Encodable Issuer
- {
- get { return obj; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * AttCertIssuer ::= CHOICE {
- * v1Form GeneralNames, -- MUST NOT be used in this
- * -- profile
- * v2Form [0] V2Form -- v2 only
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return choiceObj;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/AttCertValidityPeriod.cs b/BCCrypto/src/asn1/x509/AttCertValidityPeriod.cs
deleted file mode 100644
index d31e074..0000000
--- a/BCCrypto/src/asn1/x509/AttCertValidityPeriod.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class AttCertValidityPeriod
- : Asn1Encodable
- {
- private readonly DerGeneralizedTime notBeforeTime;
- private readonly DerGeneralizedTime notAfterTime;
-
- public static AttCertValidityPeriod GetInstance(
- object obj)
- {
- if (obj is AttCertValidityPeriod || obj == null)
- {
- return (AttCertValidityPeriod) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new AttCertValidityPeriod((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public static AttCertValidityPeriod GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- private AttCertValidityPeriod(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- notBeforeTime = DerGeneralizedTime.GetInstance(seq[0]);
- notAfterTime = DerGeneralizedTime.GetInstance(seq[1]);
- }
-
- public AttCertValidityPeriod(
- DerGeneralizedTime notBeforeTime,
- DerGeneralizedTime notAfterTime)
- {
- this.notBeforeTime = notBeforeTime;
- this.notAfterTime = notAfterTime;
- }
-
- public DerGeneralizedTime NotBeforeTime
- {
- get { return notBeforeTime; }
- }
-
- public DerGeneralizedTime NotAfterTime
- {
- get { return notAfterTime; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * AttCertValidityPeriod ::= Sequence {
- * notBeforeTime GeneralizedTime,
- * notAfterTime GeneralizedTime
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(notBeforeTime, notAfterTime);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/Attribute.cs b/BCCrypto/src/asn1/x509/Attribute.cs
deleted file mode 100644
index da59b42..0000000
--- a/BCCrypto/src/asn1/x509/Attribute.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class AttributeX509
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier attrType;
- private readonly Asn1Set attrValues;
-
- /**
- * return an Attr object from the given object.
- *
- * @param o the object we want converted.
- * @exception ArgumentException if the object cannot be converted.
- */
- public static AttributeX509 GetInstance(
- object obj)
- {
- if (obj == null || obj is AttributeX509)
- {
- return (AttributeX509) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new AttributeX509((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- private AttributeX509(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- attrType = DerObjectIdentifier.GetInstance(seq[0]);
- attrValues = Asn1Set.GetInstance(seq[1]);
- }
-
- public AttributeX509(
- DerObjectIdentifier attrType,
- Asn1Set attrValues)
- {
- this.attrType = attrType;
- this.attrValues = attrValues;
- }
-
- public DerObjectIdentifier AttrType
- {
- get { return attrType; }
- }
-
- public Asn1Encodable[] GetAttributeValues()
- {
- return attrValues.ToArray();
- }
-
- public Asn1Set AttrValues
- {
- get { return attrValues; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Attr ::= Sequence {
- * attrType OBJECT IDENTIFIER,
- * attrValues Set OF AttributeValue
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(attrType, attrValues);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/AttributeCertificate.cs b/BCCrypto/src/asn1/x509/AttributeCertificate.cs
deleted file mode 100644
index 41893b6..0000000
--- a/BCCrypto/src/asn1/x509/AttributeCertificate.cs
+++ /dev/null
@@ -1,86 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class AttributeCertificate
- : Asn1Encodable
- {
- private readonly AttributeCertificateInfo acinfo;
- private readonly AlgorithmIdentifier signatureAlgorithm;
- private readonly DerBitString signatureValue;
-
- /**
- * @param obj
- * @return
- */
- public static AttributeCertificate GetInstance(
- object obj)
- {
- if (obj is AttributeCertificate)
- return (AttributeCertificate) obj;
-
- if (obj != null)
- return new AttributeCertificate(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- public AttributeCertificate(
- AttributeCertificateInfo acinfo,
- AlgorithmIdentifier signatureAlgorithm,
- DerBitString signatureValue)
- {
- this.acinfo = acinfo;
- this.signatureAlgorithm = signatureAlgorithm;
- this.signatureValue = signatureValue;
- }
-
- private AttributeCertificate(
- Asn1Sequence seq)
- {
- if (seq.Count != 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- this.acinfo = AttributeCertificateInfo.GetInstance(seq[0]);
- this.signatureAlgorithm = AlgorithmIdentifier.GetInstance(seq[1]);
- this.signatureValue = DerBitString.GetInstance(seq[2]);
- }
-
- public AttributeCertificateInfo ACInfo
- {
- get { return acinfo; }
- }
-
- public AlgorithmIdentifier SignatureAlgorithm
- {
- get { return signatureAlgorithm; }
- }
-
- public DerBitString SignatureValue
- {
- get { return signatureValue; }
- }
-
- public byte[] GetSignatureOctets()
- {
- return signatureValue.GetOctets();
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * AttributeCertificate ::= Sequence {
- * acinfo AttributeCertificateInfo,
- * signatureAlgorithm AlgorithmIdentifier,
- * signatureValue BIT STRING
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(acinfo, signatureAlgorithm, signatureValue);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/AttributeCertificateInfo.cs b/BCCrypto/src/asn1/x509/AttributeCertificateInfo.cs
deleted file mode 100644
index 526f8e6..0000000
--- a/BCCrypto/src/asn1/x509/AttributeCertificateInfo.cs
+++ /dev/null
@@ -1,156 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class AttributeCertificateInfo
- : Asn1Encodable
- {
- internal readonly DerInteger version;
- internal readonly Holder holder;
- internal readonly AttCertIssuer issuer;
- internal readonly AlgorithmIdentifier signature;
- internal readonly DerInteger serialNumber;
- internal readonly AttCertValidityPeriod attrCertValidityPeriod;
- internal readonly Asn1Sequence attributes;
- internal readonly DerBitString issuerUniqueID;
- internal readonly X509Extensions extensions;
-
- public static AttributeCertificateInfo GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- public static AttributeCertificateInfo GetInstance(
- object obj)
- {
- if (obj is AttributeCertificateInfo)
- {
- return (AttributeCertificateInfo) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new AttributeCertificateInfo((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- private AttributeCertificateInfo(
- Asn1Sequence seq)
- {
- if (seq.Count < 7 || seq.Count > 9)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
-
- this.version = DerInteger.GetInstance(seq[0]);
- this.holder = Holder.GetInstance(seq[1]);
- this.issuer = AttCertIssuer.GetInstance(seq[2]);
- this.signature = AlgorithmIdentifier.GetInstance(seq[3]);
- this.serialNumber = DerInteger.GetInstance(seq[4]);
- this.attrCertValidityPeriod = AttCertValidityPeriod.GetInstance(seq[5]);
- this.attributes = Asn1Sequence.GetInstance(seq[6]);
-
- for (int i = 7; i < seq.Count; i++)
- {
- Asn1Encodable obj = (Asn1Encodable) seq[i];
-
- if (obj is DerBitString)
- {
- this.issuerUniqueID = DerBitString.GetInstance(seq[i]);
- }
- else if (obj is Asn1Sequence || obj is X509Extensions)
- {
- this.extensions = X509Extensions.GetInstance(seq[i]);
- }
- }
- }
-
- public DerInteger Version
- {
- get { return version; }
- }
-
- public Holder Holder
- {
- get { return holder; }
- }
-
- public AttCertIssuer Issuer
- {
- get { return issuer; }
- }
-
- public AlgorithmIdentifier Signature
- {
- get { return signature; }
- }
-
- public DerInteger SerialNumber
- {
- get { return serialNumber; }
- }
-
- public AttCertValidityPeriod AttrCertValidityPeriod
- {
- get { return attrCertValidityPeriod; }
- }
-
- public Asn1Sequence Attributes
- {
- get { return attributes; }
- }
-
- public DerBitString IssuerUniqueID
- {
- get { return issuerUniqueID; }
- }
-
- public X509Extensions Extensions
- {
- get { return extensions; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * AttributeCertificateInfo ::= Sequence {
- * version AttCertVersion -- version is v2,
- * holder Holder,
- * issuer AttCertIssuer,
- * signature AlgorithmIdentifier,
- * serialNumber CertificateSerialNumber,
- * attrCertValidityPeriod AttCertValidityPeriod,
- * attributes Sequence OF Attr,
- * issuerUniqueID UniqueIdentifier OPTIONAL,
- * extensions Extensions OPTIONAL
- * }
- *
- * AttCertVersion ::= Integer { v2(1) }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- version, holder, issuer, signature, serialNumber,
- attrCertValidityPeriod, attributes);
-
- if (issuerUniqueID != null)
- {
- v.Add(issuerUniqueID);
- }
-
- if (extensions != null)
- {
- v.Add(extensions);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/AttributeTable.cs b/BCCrypto/src/asn1/x509/AttributeTable.cs
deleted file mode 100644
index 33faad6..0000000
--- a/BCCrypto/src/asn1/x509/AttributeTable.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class AttributeTable
- {
- private readonly IDictionary attributes;
-
- public AttributeTable(
- IDictionary attrs)
- {
- this.attributes = Platform.CreateHashtable(attrs);
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- [Obsolete]
- public AttributeTable(
- Hashtable attrs)
- {
- this.attributes = Platform.CreateHashtable(attrs);
- }
-#endif
-
- public AttributeTable(
- Asn1EncodableVector v)
- {
- this.attributes = Platform.CreateHashtable(v.Count);
-
- for (int i = 0; i != v.Count; i++)
- {
- AttributeX509 a = AttributeX509.GetInstance(v[i]);
-
- attributes.Add(a.AttrType, a);
- }
- }
-
- public AttributeTable(
- Asn1Set s)
- {
- this.attributes = Platform.CreateHashtable(s.Count);
-
- for (int i = 0; i != s.Count; i++)
- {
- AttributeX509 a = AttributeX509.GetInstance(s[i]);
-
- attributes.Add(a.AttrType, a);
- }
- }
-
- public AttributeX509 Get(
- DerObjectIdentifier oid)
- {
- return (AttributeX509) attributes[oid];
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- [Obsolete("Use 'ToDictionary' instead")]
- public Hashtable ToHashtable()
- {
- return new Hashtable(attributes);
- }
-#endif
-
- public IDictionary ToDictionary()
- {
- return Platform.CreateHashtable(attributes);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/AuthorityInformationAccess.cs b/BCCrypto/src/asn1/x509/AuthorityInformationAccess.cs
deleted file mode 100644
index 9329e2b..0000000
--- a/BCCrypto/src/asn1/x509/AuthorityInformationAccess.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-using System.Collections;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The AuthorityInformationAccess object.
- *
- * id-pe-authorityInfoAccess OBJECT IDENTIFIER ::= { id-pe 1 }
- *
- * AuthorityInfoAccessSyntax ::=
- * Sequence SIZE (1..MAX) OF AccessDescription
- * AccessDescription ::= Sequence {
- * accessMethod OBJECT IDENTIFIER,
- * accessLocation GeneralName }
- *
- * id-ad OBJECT IDENTIFIER ::= { id-pkix 48 }
- * id-ad-caIssuers OBJECT IDENTIFIER ::= { id-ad 2 }
- * id-ad-ocsp OBJECT IDENTIFIER ::= { id-ad 1 }
- *
- */
- public class AuthorityInformationAccess
- : Asn1Encodable
- {
- private readonly AccessDescription[] descriptions;
-
- public static AuthorityInformationAccess GetInstance(object obj)
- {
- if (obj is AuthorityInformationAccess)
- return (AuthorityInformationAccess)obj;
- if (obj == null)
- return null;
- return new AuthorityInformationAccess(Asn1Sequence.GetInstance(obj));
- }
-
- private AuthorityInformationAccess(
- Asn1Sequence seq)
- {
- if (seq.Count < 1)
- throw new ArgumentException("sequence may not be empty");
-
- this.descriptions = new AccessDescription[seq.Count];
-
- for (int i = 0; i < seq.Count; ++i)
- {
- descriptions[i] = AccessDescription.GetInstance(seq[i]);
- }
- }
-
- public AuthorityInformationAccess(
- AccessDescription description)
- {
- this.descriptions = new AccessDescription[]{ description };
- }
-
- /**
- * create an AuthorityInformationAccess with the oid and location provided.
- */
- public AuthorityInformationAccess(DerObjectIdentifier oid, GeneralName location)
- : this(new AccessDescription(oid, location))
- {
- }
-
- public AccessDescription[] GetAccessDescriptions()
- {
- return (AccessDescription[])descriptions.Clone();
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(descriptions);
- }
-
- public override string ToString()
- {
- //return "AuthorityInformationAccess: Oid(" + this.descriptions[0].AccessMethod.Id + ")";
-
- StringBuilder buf = new StringBuilder();
- string sep = Platform.NewLine;
-
- buf.Append("AuthorityInformationAccess:");
- buf.Append(sep);
-
- foreach (AccessDescription description in descriptions)
- {
- buf.Append(" ");
- buf.Append(description);
- buf.Append(sep);
- }
-
- return buf.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/AuthorityKeyIdentifier.cs b/BCCrypto/src/asn1/x509/AuthorityKeyIdentifier.cs
deleted file mode 100644
index d5a9048..0000000
--- a/BCCrypto/src/asn1/x509/AuthorityKeyIdentifier.cs
+++ /dev/null
@@ -1,211 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The AuthorityKeyIdentifier object.
- *
- * id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 }
- *
- * AuthorityKeyIdentifier ::= Sequence {
- * keyIdentifier [0] IMPLICIT KeyIdentifier OPTIONAL,
- * authorityCertIssuer [1] IMPLICIT GeneralNames OPTIONAL,
- * authorityCertSerialNumber [2] IMPLICIT CertificateSerialNumber OPTIONAL }
- *
- * KeyIdentifier ::= OCTET STRING
- *
- *
- */
- public class AuthorityKeyIdentifier
- : Asn1Encodable
- {
- internal readonly Asn1OctetString keyidentifier;
- internal readonly GeneralNames certissuer;
- internal readonly DerInteger certserno;
-
- public static AuthorityKeyIdentifier GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static AuthorityKeyIdentifier GetInstance(
- object obj)
- {
- if (obj is AuthorityKeyIdentifier)
- {
- return (AuthorityKeyIdentifier) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new AuthorityKeyIdentifier((Asn1Sequence) obj);
- }
-
- if (obj is X509Extension)
- {
- return GetInstance(X509Extension.ConvertValueToObject((X509Extension) obj));
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- protected internal AuthorityKeyIdentifier(
- Asn1Sequence seq)
- {
- foreach (Asn1TaggedObject o in seq)
- {
- switch (o.TagNo)
- {
- case 0:
- this.keyidentifier = Asn1OctetString.GetInstance(o, false);
- break;
- case 1:
- this.certissuer = GeneralNames.GetInstance(o, false);
- break;
- case 2:
- this.certserno = DerInteger.GetInstance(o, false);
- break;
- default:
- throw new ArgumentException("illegal tag");
- }
- }
- }
-
- /**
- *
- * Calulates the keyidentifier using a SHA1 hash over the BIT STRING
- * from SubjectPublicKeyInfo as defined in RFC2459.
- *
- * Example of making a AuthorityKeyIdentifier:
- *
- * SubjectPublicKeyInfo apki = new SubjectPublicKeyInfo((ASN1Sequence)new ASN1InputStream(
- * publicKey.getEncoded()).readObject());
- * AuthorityKeyIdentifier aki = new AuthorityKeyIdentifier(apki);
- *
- *
- **/
- public AuthorityKeyIdentifier(
- SubjectPublicKeyInfo spki)
- {
- IDigest digest = new Sha1Digest();
- byte[] resBuf = new byte[digest.GetDigestSize()];
-
- byte[] bytes = spki.PublicKeyData.GetBytes();
- digest.BlockUpdate(bytes, 0, bytes.Length);
- digest.DoFinal(resBuf, 0);
- this.keyidentifier = new DerOctetString(resBuf);
- }
-
- /**
- * create an AuthorityKeyIdentifier with the GeneralNames tag and
- * the serial number provided as well.
- */
- public AuthorityKeyIdentifier(
- SubjectPublicKeyInfo spki,
- GeneralNames name,
- BigInteger serialNumber)
- {
- IDigest digest = new Sha1Digest();
- byte[] resBuf = new byte[digest.GetDigestSize()];
-
- byte[] bytes = spki.PublicKeyData.GetBytes();
- digest.BlockUpdate(bytes, 0, bytes.Length);
- digest.DoFinal(resBuf, 0);
-
- this.keyidentifier = new DerOctetString(resBuf);
- this.certissuer = name;
- this.certserno = new DerInteger(serialNumber);
- }
-
- /**
- * create an AuthorityKeyIdentifier with the GeneralNames tag and
- * the serial number provided.
- */
- public AuthorityKeyIdentifier(
- GeneralNames name,
- BigInteger serialNumber)
- {
- this.keyidentifier = null;
- this.certissuer = GeneralNames.GetInstance(name.ToAsn1Object());
- this.certserno = new DerInteger(serialNumber);
- }
-
- /**
- * create an AuthorityKeyIdentifier with a precomputed key identifier
- */
- public AuthorityKeyIdentifier(
- byte[] keyIdentifier)
- {
- this.keyidentifier = new DerOctetString(keyIdentifier);
- this.certissuer = null;
- this.certserno = null;
- }
-
- /**
- * create an AuthorityKeyIdentifier with a precomupted key identifier
- * and the GeneralNames tag and the serial number provided as well.
- */
- public AuthorityKeyIdentifier(
- byte[] keyIdentifier,
- GeneralNames name,
- BigInteger serialNumber)
- {
- this.keyidentifier = new DerOctetString(keyIdentifier);
- this.certissuer = GeneralNames.GetInstance(name.ToAsn1Object());
- this.certserno = new DerInteger(serialNumber);
- }
-
- public byte[] GetKeyIdentifier()
- {
- return keyidentifier == null ? null : keyidentifier.GetOctets();
- }
-
- public GeneralNames AuthorityCertIssuer
- {
- get { return certissuer; }
- }
-
- public BigInteger AuthorityCertSerialNumber
- {
- get { return certserno == null ? null : certserno.Value; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (keyidentifier != null)
- {
- v.Add(new DerTaggedObject(false, 0, keyidentifier));
- }
-
- if (certissuer != null)
- {
- v.Add(new DerTaggedObject(false, 1, certissuer));
- }
-
- if (certserno != null)
- {
- v.Add(new DerTaggedObject(false, 2, certserno));
- }
-
- return new DerSequence(v);
- }
-
- public override string ToString()
- {
- return ("AuthorityKeyIdentifier: KeyID(" + this.keyidentifier.GetOctets() + ")");
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/BasicConstraints.cs b/BCCrypto/src/asn1/x509/BasicConstraints.cs
deleted file mode 100644
index 098801f..0000000
--- a/BCCrypto/src/asn1/x509/BasicConstraints.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class BasicConstraints
- : Asn1Encodable
- {
- private readonly DerBoolean cA;
- private readonly DerInteger pathLenConstraint;
-
- public static BasicConstraints GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static BasicConstraints GetInstance(
- object obj)
- {
- if (obj == null || obj is BasicConstraints)
- {
- return (BasicConstraints) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new BasicConstraints((Asn1Sequence) obj);
- }
-
- if (obj is X509Extension)
- {
- return GetInstance(X509Extension.ConvertValueToObject((X509Extension) obj));
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- private BasicConstraints(
- Asn1Sequence seq)
- {
- if (seq.Count > 0)
- {
- if (seq[0] is DerBoolean)
- {
- this.cA = DerBoolean.GetInstance(seq[0]);
- }
- else
- {
- this.pathLenConstraint = DerInteger.GetInstance(seq[0]);
- }
-
- if (seq.Count > 1)
- {
- if (this.cA == null)
- throw new ArgumentException("wrong sequence in constructor", "seq");
-
- this.pathLenConstraint = DerInteger.GetInstance(seq[1]);
- }
- }
- }
-
- public BasicConstraints(
- bool cA)
- {
- if (cA)
- {
- this.cA = DerBoolean.True;
- }
- }
-
- /**
- * create a cA=true object for the given path length constraint.
- *
- * @param pathLenConstraint
- */
- public BasicConstraints(
- int pathLenConstraint)
- {
- this.cA = DerBoolean.True;
- this.pathLenConstraint = new DerInteger(pathLenConstraint);
- }
-
- public bool IsCA()
- {
- return cA != null && cA.IsTrue;
- }
-
- public BigInteger PathLenConstraint
- {
- get { return pathLenConstraint == null ? null : pathLenConstraint.Value; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * BasicConstraints := Sequence {
- * cA Boolean DEFAULT FALSE,
- * pathLenConstraint Integer (0..MAX) OPTIONAL
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (cA != null)
- {
- v.Add(cA);
- }
-
- if (pathLenConstraint != null) // yes some people actually do this when cA is false...
- {
- v.Add(pathLenConstraint);
- }
-
- return new DerSequence(v);
- }
-
- public override string ToString()
- {
- if (pathLenConstraint == null)
- {
- return "BasicConstraints: isCa(" + this.IsCA() + ")";
- }
-
- return "BasicConstraints: isCa(" + this.IsCA() + "), pathLenConstraint = " + pathLenConstraint.Value;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/CRLDistPoint.cs b/BCCrypto/src/asn1/x509/CRLDistPoint.cs
deleted file mode 100644
index 56ba79c..0000000
--- a/BCCrypto/src/asn1/x509/CRLDistPoint.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class CrlDistPoint
- : Asn1Encodable
- {
- internal readonly Asn1Sequence seq;
-
- public static CrlDistPoint GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static CrlDistPoint GetInstance(
- object obj)
- {
- if (obj is CrlDistPoint || obj == null)
- {
- return (CrlDistPoint) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new CrlDistPoint((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- private CrlDistPoint(
- Asn1Sequence seq)
- {
- this.seq = seq;
- }
-
- public CrlDistPoint(
- DistributionPoint[] points)
- {
- seq = new DerSequence(points);
- }
-
- /**
- * Return the distribution points making up the sequence.
- *
- * @return DistributionPoint[]
- */
- public DistributionPoint[] GetDistributionPoints()
- {
- DistributionPoint[] dp = new DistributionPoint[seq.Count];
-
- for (int i = 0; i != seq.Count; ++i)
- {
- dp[i] = DistributionPoint.GetInstance(seq[i]);
- }
-
- return dp;
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * CrlDistPoint ::= Sequence SIZE {1..MAX} OF DistributionPoint
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return seq;
- }
-
- public override string ToString()
- {
- StringBuilder buf = new StringBuilder();
- string sep = Platform.NewLine;
-
- buf.Append("CRLDistPoint:");
- buf.Append(sep);
- DistributionPoint[] dp = GetDistributionPoints();
- for (int i = 0; i != dp.Length; i++)
- {
- buf.Append(" ");
- buf.Append(dp[i]);
- buf.Append(sep);
- }
- return buf.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/CRLNumber.cs b/BCCrypto/src/asn1/x509/CRLNumber.cs
deleted file mode 100644
index d744416..0000000
--- a/BCCrypto/src/asn1/x509/CRLNumber.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The CRLNumber object.
- *
- * CRLNumber::= Integer(0..MAX)
- *
- */
- public class CrlNumber
- : DerInteger
- {
- public CrlNumber(
- BigInteger number)
- : base(number)
- {
- }
-
- public BigInteger Number
- {
- get { return PositiveValue; }
- }
-
- public override string ToString()
- {
- return "CRLNumber: " + Number;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/CRLReason.cs b/BCCrypto/src/asn1/x509/CRLReason.cs
deleted file mode 100644
index e8eb53a..0000000
--- a/BCCrypto/src/asn1/x509/CRLReason.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The CRLReason enumeration.
- *
- * CRLReason ::= Enumerated {
- * unspecified (0),
- * keyCompromise (1),
- * cACompromise (2),
- * affiliationChanged (3),
- * superseded (4),
- * cessationOfOperation (5),
- * certificateHold (6),
- * removeFromCRL (8),
- * privilegeWithdrawn (9),
- * aACompromise (10)
- * }
- *
- */
- public class CrlReason
- : DerEnumerated
- {
- public const int Unspecified = 0;
- public const int KeyCompromise = 1;
- public const int CACompromise = 2;
- public const int AffiliationChanged = 3;
- public const int Superseded = 4;
- public const int CessationOfOperation = 5;
- public const int CertificateHold = 6;
- // 7 -> Unknown
- public const int RemoveFromCrl = 8;
- public const int PrivilegeWithdrawn = 9;
- public const int AACompromise = 10;
-
- private static readonly string[] ReasonString = new string[]
- {
- "Unspecified", "KeyCompromise", "CACompromise", "AffiliationChanged",
- "Superseded", "CessationOfOperation", "CertificateHold", "Unknown",
- "RemoveFromCrl", "PrivilegeWithdrawn", "AACompromise"
- };
-
- public CrlReason(
- int reason)
- : base(reason)
- {
- }
-
- public CrlReason(
- DerEnumerated reason)
- : base(reason.Value.IntValue)
- {
- }
-
- public override string ToString()
- {
- int reason = Value.IntValue;
- string str = (reason < 0 || reason > 10) ? "Invalid" : ReasonString[reason];
- return "CrlReason: " + str;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/CertPolicyId.cs b/BCCrypto/src/asn1/x509/CertPolicyId.cs
deleted file mode 100644
index 11cebcd..0000000
--- a/BCCrypto/src/asn1/x509/CertPolicyId.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * CertPolicyId, used in the CertificatePolicies and PolicyMappings
- * X509V3 Extensions.
- *
- *
- * CertPolicyId ::= OBJECT IDENTIFIER
- *
- */
- public class CertPolicyID
- : DerObjectIdentifier
- {
- public CertPolicyID(
- string id)
- : base(id)
- {
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/CertificateList.cs b/BCCrypto/src/asn1/x509/CertificateList.cs
deleted file mode 100644
index 567cf13..0000000
--- a/BCCrypto/src/asn1/x509/CertificateList.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * PKIX RFC-2459
- *
- * The X.509 v2 CRL syntax is as follows. For signature calculation,
- * the data that is to be signed is ASN.1 Der encoded.
- *
- *
- * CertificateList ::= Sequence {
- * tbsCertList TbsCertList,
- * signatureAlgorithm AlgorithmIdentifier,
- * signatureValue BIT STRING }
- *
- */
- public class CertificateList
- : Asn1Encodable
- {
- private readonly TbsCertificateList tbsCertList;
- private readonly AlgorithmIdentifier sigAlgID;
- private readonly DerBitString sig;
-
- public static CertificateList GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static CertificateList GetInstance(
- object obj)
- {
- if (obj is CertificateList)
- return (CertificateList) obj;
-
- if (obj != null)
- return new CertificateList(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- private CertificateList(
- Asn1Sequence seq)
- {
- if (seq.Count != 3)
- throw new ArgumentException("sequence wrong size for CertificateList", "seq");
-
- tbsCertList = TbsCertificateList.GetInstance(seq[0]);
- sigAlgID = AlgorithmIdentifier.GetInstance(seq[1]);
- sig = DerBitString.GetInstance(seq[2]);
- }
-
- public TbsCertificateList TbsCertList
- {
- get { return tbsCertList; }
- }
-
- public CrlEntry[] GetRevokedCertificates()
- {
- return tbsCertList.GetRevokedCertificates();
- }
-
- public IEnumerable GetRevokedCertificateEnumeration()
- {
- return tbsCertList.GetRevokedCertificateEnumeration();
- }
-
- public AlgorithmIdentifier SignatureAlgorithm
- {
- get { return sigAlgID; }
- }
-
- public DerBitString Signature
- {
- get { return sig; }
- }
-
- public byte[] GetSignatureOctets()
- {
- return sig.GetOctets();
- }
-
- public int Version
- {
- get { return tbsCertList.Version; }
- }
-
- public X509Name Issuer
- {
- get { return tbsCertList.Issuer; }
- }
-
- public Time ThisUpdate
- {
- get { return tbsCertList.ThisUpdate; }
- }
-
- public Time NextUpdate
- {
- get { return tbsCertList.NextUpdate; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(tbsCertList, sigAlgID, sig);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/CertificatePair.cs b/BCCrypto/src/asn1/x509/CertificatePair.cs
deleted file mode 100644
index da92360..0000000
--- a/BCCrypto/src/asn1/x509/CertificatePair.cs
+++ /dev/null
@@ -1,162 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * This class helps to support crossCerfificatePairs in a LDAP directory
- * according RFC 2587
- *
- *
- * crossCertificatePairATTRIBUTE::={
- * WITH SYNTAX CertificatePair
- * EQUALITY MATCHING RULE certificatePairExactMatch
- * ID joint-iso-ccitt(2) ds(5) attributeType(4) crossCertificatePair(40)}
- *
- *
- * The forward elements of the crossCertificatePair attribute of a
- * CA's directory entry shall be used to store all, except self-issued
- * certificates issued to this CA. Optionally, the reverse elements of the
- * crossCertificatePair attribute, of a CA's directory entry may contain a
- * subset of certificates issued by this CA to other CAs. When both the forward
- * and the reverse elements are present in a single attribute value, issuer name
- * in one certificate shall match the subject name in the other and vice versa,
- * and the subject public key in one certificate shall be capable of verifying
- * the digital signature on the other certificate and vice versa.
- *
- * When a reverse element is present, the forward element value and the reverse
- * element value need not be stored in the same attribute value; in other words,
- * they can be stored in either a single attribute value or two attribute
- * values.
- *
- *
- * CertificatePair ::= SEQUENCE {
- * forward [0] Certificate OPTIONAL,
- * reverse [1] Certificate OPTIONAL,
- * -- at least one of the pair shall be present -- }
- *
- */
- public class CertificatePair
- : Asn1Encodable
- {
- private X509CertificateStructure forward, reverse;
-
- public static CertificatePair GetInstance(
- object obj)
- {
- if (obj == null || obj is CertificatePair)
- {
- return (CertificatePair) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new CertificatePair((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from Asn1Sequence.
- *
- * The sequence is of type CertificatePair:
- *
- *
- * CertificatePair ::= SEQUENCE {
- * forward [0] Certificate OPTIONAL,
- * reverse [1] Certificate OPTIONAL,
- * -- at least one of the pair shall be present -- }
- *
- *
- * @param seq The ASN.1 sequence.
- */
- private CertificatePair(
- Asn1Sequence seq)
- {
- if (seq.Count != 1 && seq.Count != 2)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
- }
-
- foreach (object obj in seq)
- {
- Asn1TaggedObject o = Asn1TaggedObject.GetInstance(obj);
- if (o.TagNo == 0)
- {
- forward = X509CertificateStructure.GetInstance(o, true);
- }
- else if (o.TagNo == 1)
- {
- reverse = X509CertificateStructure.GetInstance(o, true);
- }
- else
- {
- throw new ArgumentException("Bad tag number: " + o.TagNo);
- }
- }
- }
-
- /**
- * Constructor from a given details.
- *
- * @param forward Certificates issued to this CA.
- * @param reverse Certificates issued by this CA to other CAs.
- */
- public CertificatePair(
- X509CertificateStructure forward,
- X509CertificateStructure reverse)
- {
- this.forward = forward;
- this.reverse = reverse;
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * CertificatePair ::= SEQUENCE {
- * forward [0] Certificate OPTIONAL,
- * reverse [1] Certificate OPTIONAL,
- * -- at least one of the pair shall be present -- }
- *
- *
- * @return a DERObject
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector vec = new Asn1EncodableVector();
-
- if (forward != null)
- {
- vec.Add(new DerTaggedObject(0, forward));
- }
-
- if (reverse != null)
- {
- vec.Add(new DerTaggedObject(1, reverse));
- }
-
- return new DerSequence(vec);
- }
-
- /**
- * @return Returns the forward.
- */
- public X509CertificateStructure Forward
- {
- get { return forward; }
- }
-
- /**
- * @return Returns the reverse.
- */
- public X509CertificateStructure Reverse
- {
- get { return reverse; }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/CertificatePolicies.cs b/BCCrypto/src/asn1/x509/CertificatePolicies.cs
deleted file mode 100644
index a83565b..0000000
--- a/BCCrypto/src/asn1/x509/CertificatePolicies.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-using System;
-using System.Text;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class CertificatePolicies
- : Asn1Encodable
- {
- private readonly PolicyInformation[] policyInformation;
-
- public static CertificatePolicies GetInstance(object obj)
- {
- if (obj == null || obj is CertificatePolicies)
- return (CertificatePolicies)obj;
-
- return new CertificatePolicies(Asn1Sequence.GetInstance(obj));
- }
-
- public static CertificatePolicies GetInstance(Asn1TaggedObject obj, bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- /**
- * Construct a CertificatePolicies object containing one PolicyInformation.
- *
- * @param name the name to be contained.
- */
- public CertificatePolicies(PolicyInformation name)
- {
- this.policyInformation = new PolicyInformation[] { name };
- }
-
- public CertificatePolicies(PolicyInformation[] policyInformation)
- {
- this.policyInformation = policyInformation;
- }
-
- private CertificatePolicies(Asn1Sequence seq)
- {
- this.policyInformation = new PolicyInformation[seq.Count];
-
- for (int i = 0; i < seq.Count; ++i)
- {
- policyInformation[i] = PolicyInformation.GetInstance(seq[i]);
- }
- }
-
- public virtual PolicyInformation[] GetPolicyInformation()
- {
- return (PolicyInformation[])policyInformation.Clone();
- }
-
- /**
- * Produce an object suitable for an ASN1OutputStream.
- *
- * CertificatePolicies ::= SEQUENCE SIZE {1..MAX} OF PolicyInformation
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(policyInformation);
- }
-
- public override string ToString()
- {
- StringBuilder sb = new StringBuilder("CertificatePolicies:");
- if (policyInformation != null && policyInformation.Length > 0)
- {
- sb.Append(' ');
- sb.Append(policyInformation[0]);
- for (int i = 1; i < policyInformation.Length; ++i)
- {
- sb.Append(", ");
- sb.Append(policyInformation[i]);
- }
- }
- return sb.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/DSAParameter.cs b/BCCrypto/src/asn1/x509/DSAParameter.cs
deleted file mode 100644
index 2eb6502..0000000
--- a/BCCrypto/src/asn1/x509/DSAParameter.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class DsaParameter
- : Asn1Encodable
- {
- internal readonly DerInteger p, q, g;
-
- public static DsaParameter GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static DsaParameter GetInstance(
- object obj)
- {
- if(obj == null || obj is DsaParameter)
- {
- return (DsaParameter) obj;
- }
-
- if(obj is Asn1Sequence)
- {
- return new DsaParameter((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Invalid DsaParameter: " + Platform.GetTypeName(obj));
- }
-
- public DsaParameter(
- BigInteger p,
- BigInteger q,
- BigInteger g)
- {
- this.p = new DerInteger(p);
- this.q = new DerInteger(q);
- this.g = new DerInteger(g);
- }
-
- private DsaParameter(
- Asn1Sequence seq)
- {
- if (seq.Count != 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.p = DerInteger.GetInstance(seq[0]);
- this.q = DerInteger.GetInstance(seq[1]);
- this.g = DerInteger.GetInstance(seq[2]);
- }
-
- public BigInteger P
- {
- get { return p.PositiveValue; }
- }
-
- public BigInteger Q
- {
- get { return q.PositiveValue; }
- }
-
- public BigInteger G
- {
- get { return g.PositiveValue; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(p, q, g);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/DigestInfo.cs b/BCCrypto/src/asn1/x509/DigestInfo.cs
deleted file mode 100644
index 3ac535e..0000000
--- a/BCCrypto/src/asn1/x509/DigestInfo.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The DigestInfo object.
- *
- * DigestInfo::=Sequence{
- * digestAlgorithm AlgorithmIdentifier,
- * digest OCTET STRING }
- *
- */
- public class DigestInfo
- : Asn1Encodable
- {
- private readonly byte[] digest;
- private readonly AlgorithmIdentifier algID;
-
- public static DigestInfo GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static DigestInfo GetInstance(
- object obj)
- {
- if (obj is DigestInfo)
- {
- return (DigestInfo) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new DigestInfo((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public DigestInfo(
- AlgorithmIdentifier algID,
- byte[] digest)
- {
- this.digest = digest;
- this.algID = algID;
- }
-
- private DigestInfo(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Wrong number of elements in sequence", "seq");
-
- algID = AlgorithmIdentifier.GetInstance(seq[0]);
- digest = Asn1OctetString.GetInstance(seq[1]).GetOctets();
- }
-
- public AlgorithmIdentifier AlgorithmID
- {
- get { return algID; }
- }
-
- public byte[] GetDigest()
- {
- return digest;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(algID, new DerOctetString(digest));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/DisplayText.cs b/BCCrypto/src/asn1/x509/DisplayText.cs
deleted file mode 100644
index 39b3c98..0000000
--- a/BCCrypto/src/asn1/x509/DisplayText.cs
+++ /dev/null
@@ -1,174 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * DisplayText class, used in
- * CertificatePolicies X509 V3 extensions (in policy qualifiers).
- *
- * It stores a string in a chosen encoding.
- *
- * DisplayText ::= CHOICE {
- * ia5String IA5String (SIZE (1..200)),
- * visibleString VisibleString (SIZE (1..200)),
- * bmpString BMPString (SIZE (1..200)),
- * utf8String UTF8String (SIZE (1..200)) }
- *
- * @see PolicyQualifierInfo
- * @see PolicyInformation
- */
- public class DisplayText
- : Asn1Encodable, IAsn1Choice
- {
- /**
- * Constant corresponding to ia5String encoding.
- *
- */
- public const int ContentTypeIA5String = 0;
- /**
- * Constant corresponding to bmpString encoding.
- *
- */
- public const int ContentTypeBmpString = 1;
- /**
- * Constant corresponding to utf8String encoding.
- *
- */
- public const int ContentTypeUtf8String = 2;
- /**
- * Constant corresponding to visibleString encoding.
- *
- */
- public const int ContentTypeVisibleString = 3;
- /**
- * Describe constant DisplayTextMaximumSize here.
- *
- */
- public const int DisplayTextMaximumSize = 200;
-
- internal readonly int contentType;
- internal readonly IAsn1String contents;
-
- /**
- * Creates a new DisplayText instance.
- *
- * @param type the desired encoding type for the text.
- * @param text the text to store. Strings longer than 200
- * characters are truncated.
- */
- public DisplayText(
- int type,
- string text)
- {
- if (text.Length > DisplayTextMaximumSize)
- {
- // RFC3280 limits these strings to 200 chars
- // truncate the string
- text = text.Substring(0, DisplayTextMaximumSize);
- }
-
- contentType = type;
- switch (type)
- {
- case ContentTypeIA5String:
- contents = (IAsn1String)new DerIA5String (text);
- break;
- case ContentTypeUtf8String:
- contents = (IAsn1String)new DerUtf8String(text);
- break;
- case ContentTypeVisibleString:
- contents = (IAsn1String)new DerVisibleString(text);
- break;
- case ContentTypeBmpString:
- contents = (IAsn1String)new DerBmpString(text);
- break;
- default:
- contents = (IAsn1String)new DerUtf8String(text);
- break;
- }
- }
-
-// /**
-// * return true if the passed in string can be represented without
-// * loss as a PrintableString, false otherwise.
-// */
-// private bool CanBePrintable(
-// string str)
-// {
-// for (int i = str.Length - 1; i >= 0; i--)
-// {
-// if (str[i] > 0x007f)
-// {
-// return false;
-// }
-// }
-//
-// return true;
-// }
-
- /**
- * Creates a new DisplayText instance.
- *
- * @param text the text to encapsulate. Strings longer than 200
- * characters are truncated.
- */
- public DisplayText(
- string text)
- {
- // by default use UTF8String
- if (text.Length > DisplayTextMaximumSize)
- {
- text = text.Substring(0, DisplayTextMaximumSize);
- }
-
- contentType = ContentTypeUtf8String;
- contents = new DerUtf8String(text);
- }
-
- /**
- * Creates a new DisplayText instance.
- * Useful when reading back a DisplayText class
- * from it's Asn1Encodable form.
- *
- * @param contents an Asn1Encodable instance.
- */
- public DisplayText(
- IAsn1String contents)
- {
- this.contents = contents;
- }
-
- public static DisplayText GetInstance(
- object obj)
- {
- if (obj is IAsn1String)
- {
- return new DisplayText((IAsn1String) obj);
- }
-
- if (obj is DisplayText)
- {
- return (DisplayText) obj;
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return (Asn1Object) contents;
- }
-
- /**
- * Returns the stored string object.
- *
- * @return the stored text as a string.
- */
- public string GetString()
- {
- return contents.GetString();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/DistributionPoint.cs b/BCCrypto/src/asn1/x509/DistributionPoint.cs
deleted file mode 100644
index 40814c7..0000000
--- a/BCCrypto/src/asn1/x509/DistributionPoint.cs
+++ /dev/null
@@ -1,161 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The DistributionPoint object.
- *
- * DistributionPoint ::= Sequence {
- * distributionPoint [0] DistributionPointName OPTIONAL,
- * reasons [1] ReasonFlags OPTIONAL,
- * cRLIssuer [2] GeneralNames OPTIONAL
- * }
- *
- */
- public class DistributionPoint
- : Asn1Encodable
- {
- internal readonly DistributionPointName distributionPoint;
- internal readonly ReasonFlags reasons;
- internal readonly GeneralNames cRLIssuer;
-
- public static DistributionPoint GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static DistributionPoint GetInstance(
- object obj)
- {
- if(obj == null || obj is DistributionPoint)
- {
- return (DistributionPoint) obj;
- }
-
- if(obj is Asn1Sequence)
- {
- return new DistributionPoint((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Invalid DistributionPoint: " + Platform.GetTypeName(obj));
- }
-
- private DistributionPoint(
- Asn1Sequence seq)
- {
- for (int i = 0; i != seq.Count; i++)
- {
- Asn1TaggedObject t = Asn1TaggedObject.GetInstance(seq[i]);
-
- switch (t.TagNo)
- {
- case 0:
- distributionPoint = DistributionPointName.GetInstance(t, true);
- break;
- case 1:
- reasons = new ReasonFlags(DerBitString.GetInstance(t, false));
- break;
- case 2:
- cRLIssuer = GeneralNames.GetInstance(t, false);
- break;
- }
- }
- }
-
- public DistributionPoint(
- DistributionPointName distributionPointName,
- ReasonFlags reasons,
- GeneralNames crlIssuer)
- {
- this.distributionPoint = distributionPointName;
- this.reasons = reasons;
- this.cRLIssuer = crlIssuer;
- }
-
- public DistributionPointName DistributionPointName
- {
- get { return distributionPoint; }
- }
-
- public ReasonFlags Reasons
- {
- get { return reasons; }
- }
-
- public GeneralNames CrlIssuer
- {
- get { return cRLIssuer; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (distributionPoint != null)
- {
- //
- // as this is a CHOICE it must be explicitly tagged
- //
- v.Add(new DerTaggedObject(0, distributionPoint));
- }
-
- if (reasons != null)
- {
- v.Add(new DerTaggedObject(false, 1, reasons));
- }
-
- if (cRLIssuer != null)
- {
- v.Add(new DerTaggedObject(false, 2, cRLIssuer));
- }
-
- return new DerSequence(v);
- }
-
- public override string ToString()
- {
- string sep = Platform.NewLine;
- StringBuilder buf = new StringBuilder();
- buf.Append("DistributionPoint: [");
- buf.Append(sep);
- if (distributionPoint != null)
- {
- appendObject(buf, sep, "distributionPoint", distributionPoint.ToString());
- }
- if (reasons != null)
- {
- appendObject(buf, sep, "reasons", reasons.ToString());
- }
- if (cRLIssuer != null)
- {
- appendObject(buf, sep, "cRLIssuer", cRLIssuer.ToString());
- }
- buf.Append("]");
- buf.Append(sep);
- return buf.ToString();
- }
-
- private void appendObject(
- StringBuilder buf,
- string sep,
- string name,
- string val)
- {
- string indent = " ";
-
- buf.Append(indent);
- buf.Append(name);
- buf.Append(":");
- buf.Append(sep);
- buf.Append(indent);
- buf.Append(indent);
- buf.Append(val);
- buf.Append(sep);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/DistributionPointName.cs b/BCCrypto/src/asn1/x509/DistributionPointName.cs
deleted file mode 100644
index 43fdaf5..0000000
--- a/BCCrypto/src/asn1/x509/DistributionPointName.cs
+++ /dev/null
@@ -1,130 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The DistributionPointName object.
- *
- * DistributionPointName ::= CHOICE {
- * fullName [0] GeneralNames,
- * nameRelativeToCRLIssuer [1] RDN
- * }
- *
- */
- public class DistributionPointName
- : Asn1Encodable, IAsn1Choice
- {
- internal readonly Asn1Encodable name;
- internal readonly int type;
-
- public const int FullName = 0;
- public const int NameRelativeToCrlIssuer = 1;
-
- public static DistributionPointName GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1TaggedObject.GetInstance(obj, true));
- }
-
- public static DistributionPointName GetInstance(
- object obj)
- {
- if (obj == null || obj is DistributionPointName)
- {
- return (DistributionPointName) obj;
- }
-
- if (obj is Asn1TaggedObject)
- {
- return new DistributionPointName((Asn1TaggedObject) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public DistributionPointName(
- int type,
- Asn1Encodable name)
- {
- this.type = type;
- this.name = name;
- }
-
- public DistributionPointName(
- GeneralNames name)
- : this(FullName, name)
- {
- }
-
- public int PointType
- {
- get { return type; }
- }
-
- public Asn1Encodable Name
- {
- get { return name; }
- }
-
- public DistributionPointName(
- Asn1TaggedObject obj)
- {
- this.type = obj.TagNo;
-
- if (type == FullName)
- {
- this.name = GeneralNames.GetInstance(obj, false);
- }
- else
- {
- this.name = Asn1Set.GetInstance(obj, false);
- }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerTaggedObject(false, type, name);
- }
-
- public override string ToString()
- {
- string sep = Platform.NewLine;
- StringBuilder buf = new StringBuilder();
- buf.Append("DistributionPointName: [");
- buf.Append(sep);
- if (type == FullName)
- {
- appendObject(buf, sep, "fullName", name.ToString());
- }
- else
- {
- appendObject(buf, sep, "nameRelativeToCRLIssuer", name.ToString());
- }
- buf.Append("]");
- buf.Append(sep);
- return buf.ToString();
- }
-
- private void appendObject(
- StringBuilder buf,
- string sep,
- string name,
- string val)
- {
- string indent = " ";
-
- buf.Append(indent);
- buf.Append(name);
- buf.Append(":");
- buf.Append(sep);
- buf.Append(indent);
- buf.Append(indent);
- buf.Append(val);
- buf.Append(sep);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/ExtendedKeyUsage.cs b/BCCrypto/src/asn1/x509/ExtendedKeyUsage.cs
deleted file mode 100644
index 8f7e6a3..0000000
--- a/BCCrypto/src/asn1/x509/ExtendedKeyUsage.cs
+++ /dev/null
@@ -1,132 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The extendedKeyUsage object.
- *
- * extendedKeyUsage ::= Sequence SIZE (1..MAX) OF KeyPurposeId
- *
- */
- public class ExtendedKeyUsage
- : Asn1Encodable
- {
- internal readonly IDictionary usageTable = Platform.CreateHashtable();
- internal readonly Asn1Sequence seq;
-
- public static ExtendedKeyUsage GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static ExtendedKeyUsage GetInstance(
- object obj)
- {
- if (obj is ExtendedKeyUsage)
- {
- return (ExtendedKeyUsage) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new ExtendedKeyUsage((Asn1Sequence) obj);
- }
-
- if (obj is X509Extension)
- {
- return GetInstance(X509Extension.ConvertValueToObject((X509Extension) obj));
- }
-
- throw new ArgumentException("Invalid ExtendedKeyUsage: " + Platform.GetTypeName(obj));
- }
-
- private ExtendedKeyUsage(
- Asn1Sequence seq)
- {
- this.seq = seq;
-
- foreach (object o in seq)
- {
- if (!(o is DerObjectIdentifier))
- throw new ArgumentException("Only DerObjectIdentifier instances allowed in ExtendedKeyUsage.");
-
- this.usageTable[o] = o;
- }
- }
-
- public ExtendedKeyUsage(
- params KeyPurposeID[] usages)
- {
- this.seq = new DerSequence(usages);
-
- foreach (KeyPurposeID usage in usages)
- {
- this.usageTable[usage] = usage;
- }
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- [Obsolete]
- public ExtendedKeyUsage(
- ArrayList usages)
- : this((IEnumerable)usages)
- {
- }
-#endif
-
- public ExtendedKeyUsage(
- IEnumerable usages)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- foreach (object usage in usages)
- {
- Asn1Encodable o = KeyPurposeID.GetInstance(usage);
-
- v.Add(o);
- this.usageTable[o] = o;
- }
-
- this.seq = new DerSequence(v);
- }
-
- public bool HasKeyPurposeId(
- KeyPurposeID keyPurposeId)
- {
- return usageTable.Contains(keyPurposeId);
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- [Obsolete("Use 'GetAllUsages'")]
- public ArrayList GetUsages()
- {
- return new ArrayList(usageTable.Values);
- }
-#endif
-
- /**
- * Returns all extended key usages.
- * The returned ArrayList contains DerObjectIdentifier instances.
- * @return An ArrayList with all key purposes.
- */
- public IList GetAllUsages()
- {
- return Platform.CreateArrayList(usageTable.Values);
- }
-
- public int Count
- {
- get { return usageTable.Count; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return seq;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/GeneralName.cs b/BCCrypto/src/asn1/x509/GeneralName.cs
deleted file mode 100644
index b8794ea..0000000
--- a/BCCrypto/src/asn1/x509/GeneralName.cs
+++ /dev/null
@@ -1,419 +0,0 @@
-using System;
-using System.Collections;
-using System.Globalization;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-using NetUtils = Org.BouncyCastle.Utilities.Net;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The GeneralName object.
- *
- * GeneralName ::= CHOICE {
- * otherName [0] OtherName,
- * rfc822Name [1] IA5String,
- * dNSName [2] IA5String,
- * x400Address [3] ORAddress,
- * directoryName [4] Name,
- * ediPartyName [5] EDIPartyName,
- * uniformResourceIdentifier [6] IA5String,
- * iPAddress [7] OCTET STRING,
- * registeredID [8] OBJECT IDENTIFIER}
- *
- * OtherName ::= Sequence {
- * type-id OBJECT IDENTIFIER,
- * value [0] EXPLICIT ANY DEFINED BY type-id }
- *
- * EDIPartyName ::= Sequence {
- * nameAssigner [0] DirectoryString OPTIONAL,
- * partyName [1] DirectoryString }
- *
- */
- public class GeneralName
- : Asn1Encodable, IAsn1Choice
- {
- public const int OtherName = 0;
- public const int Rfc822Name = 1;
- public const int DnsName = 2;
- public const int X400Address = 3;
- public const int DirectoryName = 4;
- public const int EdiPartyName = 5;
- public const int UniformResourceIdentifier = 6;
- public const int IPAddress = 7;
- public const int RegisteredID = 8;
-
- internal readonly Asn1Encodable obj;
- internal readonly int tag;
-
- public GeneralName(
- X509Name directoryName)
- {
- this.obj = directoryName;
- this.tag = 4;
- }
-
- /**
- * When the subjectAltName extension contains an Internet mail address,
- * the address MUST be included as an rfc822Name. The format of an
- * rfc822Name is an "addr-spec" as defined in RFC 822 [RFC 822].
- *
- * When the subjectAltName extension contains a domain name service
- * label, the domain name MUST be stored in the dNSName (an IA5String).
- * The name MUST be in the "preferred name syntax," as specified by RFC
- * 1034 [RFC 1034].
- *
- * When the subjectAltName extension contains a URI, the name MUST be
- * stored in the uniformResourceIdentifier (an IA5String). The name MUST
- * be a non-relative URL, and MUST follow the URL syntax and encoding
- * rules specified in [RFC 1738]. The name must include both a scheme
- * (e.g., "http" or "ftp") and a scheme-specific-part. The scheme-
- * specific-part must include a fully qualified domain name or IP
- * address as the host.
- *
- * When the subjectAltName extension contains a iPAddress, the address
- * MUST be stored in the octet string in "network byte order," as
- * specified in RFC 791 [RFC 791]. The least significant bit (LSB) of
- * each octet is the LSB of the corresponding byte in the network
- * address. For IP Version 4, as specified in RFC 791, the octet string
- * MUST contain exactly four octets. For IP Version 6, as specified in
- * RFC 1883, the octet string MUST contain exactly sixteen octets [RFC
- * 1883].
- */
- public GeneralName(
- Asn1Object name,
- int tag)
- {
- this.obj = name;
- this.tag = tag;
- }
-
- public GeneralName(
- int tag,
- Asn1Encodable name)
- {
- this.obj = name;
- this.tag = tag;
- }
-
- /**
- * Create a GeneralName for the given tag from the passed in string.
- *
- * This constructor can handle:
- *
- * rfc822Name
- * iPAddress
- * directoryName
- * dNSName
- * uniformResourceIdentifier
- * registeredID
- *
- * For x400Address, otherName and ediPartyName there is no common string
- * format defined.
- *
- * Note: A directory name can be encoded in different ways into a byte
- * representation. Be aware of this if the byte representation is used for
- * comparing results.
- *
- *
- * @param tag tag number
- * @param name string representation of name
- * @throws ArgumentException if the string encoding is not correct or
- * not supported.
- */
- public GeneralName(
- int tag,
- string name)
- {
- this.tag = tag;
-
- if (tag == Rfc822Name || tag == DnsName || tag == UniformResourceIdentifier)
- {
- this.obj = new DerIA5String(name);
- }
- else if (tag == RegisteredID)
- {
- this.obj = new DerObjectIdentifier(name);
- }
- else if (tag == DirectoryName)
- {
- this.obj = new X509Name(name);
- }
- else if (tag == IPAddress)
- {
- byte[] enc = toGeneralNameEncoding(name);
- if (enc == null)
- throw new ArgumentException("IP Address is invalid", "name");
-
- this.obj = new DerOctetString(enc);
- }
- else
- {
- throw new ArgumentException("can't process string for tag: " + tag, "tag");
- }
- }
-
- public static GeneralName GetInstance(
- object obj)
- {
- if (obj == null || obj is GeneralName)
- {
- return (GeneralName) obj;
- }
-
- if (obj is Asn1TaggedObject)
- {
- Asn1TaggedObject tagObj = (Asn1TaggedObject) obj;
- int tag = tagObj.TagNo;
-
- switch (tag)
- {
- case OtherName:
- return new GeneralName(tag, Asn1Sequence.GetInstance(tagObj, false));
- case Rfc822Name:
- return new GeneralName(tag, DerIA5String.GetInstance(tagObj, false));
- case DnsName:
- return new GeneralName(tag, DerIA5String.GetInstance(tagObj, false));
- case X400Address:
- throw new ArgumentException("unknown tag: " + tag);
- case DirectoryName:
- return new GeneralName(tag, X509Name.GetInstance(tagObj, true));
- case EdiPartyName:
- return new GeneralName(tag, Asn1Sequence.GetInstance(tagObj, false));
- case UniformResourceIdentifier:
- return new GeneralName(tag, DerIA5String.GetInstance(tagObj, false));
- case IPAddress:
- return new GeneralName(tag, Asn1OctetString.GetInstance(tagObj, false));
- case RegisteredID:
- return new GeneralName(tag, DerObjectIdentifier.GetInstance(tagObj, false));
- }
- }
-
- if (obj is byte[])
- {
- try
- {
- return GetInstance(Asn1Object.FromByteArray((byte[])obj));
- }
- catch (IOException)
- {
- throw new ArgumentException("unable to parse encoded general name");
- }
- }
-
- throw new ArgumentException("unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- public static GeneralName GetInstance(
- Asn1TaggedObject tagObj,
- bool explicitly)
- {
- return GetInstance(Asn1TaggedObject.GetInstance(tagObj, true));
- }
-
- public int TagNo
- {
- get { return tag; }
- }
-
- public Asn1Encodable Name
- {
- get { return obj; }
- }
-
- public override string ToString()
- {
- StringBuilder buf = new StringBuilder();
- buf.Append(tag);
- buf.Append(": ");
-
- switch (tag)
- {
- case Rfc822Name:
- case DnsName:
- case UniformResourceIdentifier:
- buf.Append(DerIA5String.GetInstance(obj).GetString());
- break;
- case DirectoryName:
- buf.Append(X509Name.GetInstance(obj).ToString());
- break;
- default:
- buf.Append(obj.ToString());
- break;
- }
-
- return buf.ToString();
- }
-
- private byte[] toGeneralNameEncoding(
- string ip)
- {
- if (NetUtils.IPAddress.IsValidIPv6WithNetmask(ip) || NetUtils.IPAddress.IsValidIPv6(ip))
- {
- int slashIndex = ip.IndexOf('/');
-
- if (slashIndex < 0)
- {
- byte[] addr = new byte[16];
- int[] parsedIp = parseIPv6(ip);
- copyInts(parsedIp, addr, 0);
-
- return addr;
- }
- else
- {
- byte[] addr = new byte[32];
- int[] parsedIp = parseIPv6(ip.Substring(0, slashIndex));
- copyInts(parsedIp, addr, 0);
- string mask = ip.Substring(slashIndex + 1);
- if (mask.IndexOf(':') > 0)
- {
- parsedIp = parseIPv6(mask);
- }
- else
- {
- parsedIp = parseMask(mask);
- }
- copyInts(parsedIp, addr, 16);
-
- return addr;
- }
- }
- else if (NetUtils.IPAddress.IsValidIPv4WithNetmask(ip) || NetUtils.IPAddress.IsValidIPv4(ip))
- {
- int slashIndex = ip.IndexOf('/');
-
- if (slashIndex < 0)
- {
- byte[] addr = new byte[4];
-
- parseIPv4(ip, addr, 0);
-
- return addr;
- }
- else
- {
- byte[] addr = new byte[8];
-
- parseIPv4(ip.Substring(0, slashIndex), addr, 0);
-
- string mask = ip.Substring(slashIndex + 1);
- if (mask.IndexOf('.') > 0)
- {
- parseIPv4(mask, addr, 4);
- }
- else
- {
- parseIPv4Mask(mask, addr, 4);
- }
-
- return addr;
- }
- }
-
- return null;
- }
-
- private void parseIPv4Mask(string mask, byte[] addr, int offset)
- {
- int maskVal = Int32.Parse(mask);
-
- for (int i = 0; i != maskVal; i++)
- {
- addr[(i / 8) + offset] |= (byte)(1 << (i % 8));
- }
- }
-
- private void parseIPv4(string ip, byte[] addr, int offset)
- {
- foreach (string token in ip.Split('.', '/'))
- {
- addr[offset++] = (byte)Int32.Parse(token);
- }
- }
-
- private int[] parseMask(string mask)
- {
- int[] res = new int[8];
- int maskVal = Int32.Parse(mask);
-
- for (int i = 0; i != maskVal; i++)
- {
- res[i / 16] |= 1 << (i % 16);
- }
- return res;
- }
-
- private void copyInts(int[] parsedIp, byte[] addr, int offSet)
- {
- for (int i = 0; i != parsedIp.Length; i++)
- {
- addr[(i * 2) + offSet] = (byte)(parsedIp[i] >> 8);
- addr[(i * 2 + 1) + offSet] = (byte)parsedIp[i];
- }
- }
-
- private int[] parseIPv6(string ip)
- {
- if (Platform.StartsWith(ip, "::"))
- {
- ip = ip.Substring(1);
- }
- else if (Platform.EndsWith(ip, "::"))
- {
- ip = ip.Substring(0, ip.Length - 1);
- }
-
- IEnumerator sEnum = ip.Split(':').GetEnumerator();
-
- int index = 0;
- int[] val = new int[8];
-
- int doubleColon = -1;
-
- while (sEnum.MoveNext())
- {
- string e = (string) sEnum.Current;
-
- if (e.Length == 0)
- {
- doubleColon = index;
- val[index++] = 0;
- }
- else
- {
- if (e.IndexOf('.') < 0)
- {
- val[index++] = Int32.Parse(e, NumberStyles.AllowHexSpecifier);
- }
- else
- {
- string[] tokens = e.Split('.');
-
- val[index++] = (Int32.Parse(tokens[0]) << 8) | Int32.Parse(tokens[1]);
- val[index++] = (Int32.Parse(tokens[2]) << 8) | Int32.Parse(tokens[3]);
- }
- }
- }
-
- if (index != val.Length)
- {
- Array.Copy(val, doubleColon, val, val.Length - (index - doubleColon), index - doubleColon);
- for (int i = doubleColon; i != val.Length - (index - doubleColon); i++)
- {
- val[i] = 0;
- }
- }
-
- return val;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- // Explicitly tagged if DirectoryName
- return new DerTaggedObject(tag == DirectoryName, tag, obj);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/GeneralNames.cs b/BCCrypto/src/asn1/x509/GeneralNames.cs
deleted file mode 100644
index fcd2ecb..0000000
--- a/BCCrypto/src/asn1/x509/GeneralNames.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class GeneralNames
- : Asn1Encodable
- {
- private readonly GeneralName[] names;
-
- public static GeneralNames GetInstance(
- object obj)
- {
- if (obj == null || obj is GeneralNames)
- {
- return (GeneralNames) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new GeneralNames((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public static GeneralNames GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- /// Construct a GeneralNames object containing one GeneralName.
- /// The name to be contained.
- public GeneralNames(
- GeneralName name)
- {
- names = new GeneralName[]{ name };
- }
-
- public GeneralNames(
- GeneralName[] names)
- {
- this.names = (GeneralName[])names.Clone();
- }
-
- private GeneralNames(
- Asn1Sequence seq)
- {
- this.names = new GeneralName[seq.Count];
-
- for (int i = 0; i != seq.Count; i++)
- {
- names[i] = GeneralName.GetInstance(seq[i]);
- }
- }
-
- public GeneralName[] GetNames()
- {
- return (GeneralName[]) names.Clone();
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * GeneralNames ::= Sequence SIZE {1..MAX} OF GeneralName
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(names);
- }
-
- public override string ToString()
- {
- StringBuilder buf = new StringBuilder();
- string sep = Platform.NewLine;
-
- buf.Append("GeneralNames:");
- buf.Append(sep);
-
- foreach (GeneralName name in names)
- {
- buf.Append(" ");
- buf.Append(name);
- buf.Append(sep);
- }
-
- return buf.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/GeneralSubtree.cs b/BCCrypto/src/asn1/x509/GeneralSubtree.cs
deleted file mode 100644
index e918a02..0000000
--- a/BCCrypto/src/asn1/x509/GeneralSubtree.cs
+++ /dev/null
@@ -1,189 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * Class for containing a restriction object subtrees in NameConstraints. See
- * RFC 3280.
- *
- *
- *
- * GeneralSubtree ::= SEQUENCE
- * {
- * baseName GeneralName,
- * minimum [0] BaseDistance DEFAULT 0,
- * maximum [1] BaseDistance OPTIONAL
- * }
- *
- *
- * @see org.bouncycastle.asn1.x509.NameConstraints
- *
- */
- public class GeneralSubtree
- : Asn1Encodable
- {
- private readonly GeneralName baseName;
- private readonly DerInteger minimum;
- private readonly DerInteger maximum;
-
- private GeneralSubtree(
- Asn1Sequence seq)
- {
- baseName = GeneralName.GetInstance(seq[0]);
-
- switch (seq.Count)
- {
- case 1:
- break;
- case 2:
- {
- Asn1TaggedObject o = Asn1TaggedObject.GetInstance(seq[1]);
- switch (o.TagNo)
- {
- case 0:
- minimum = DerInteger.GetInstance(o, false);
- break;
- case 1:
- maximum = DerInteger.GetInstance(o, false);
- break;
- default:
- throw new ArgumentException("Bad tag number: " + o.TagNo);
- }
- break;
- }
- case 3:
- {
- {
- Asn1TaggedObject oMin = Asn1TaggedObject.GetInstance(seq[1]);
- if (oMin.TagNo != 0)
- throw new ArgumentException("Bad tag number for 'minimum': " + oMin.TagNo);
- minimum = DerInteger.GetInstance(oMin, false);
- }
-
- {
- Asn1TaggedObject oMax = Asn1TaggedObject.GetInstance(seq[2]);
- if (oMax.TagNo != 1)
- throw new ArgumentException("Bad tag number for 'maximum': " + oMax.TagNo);
- maximum = DerInteger.GetInstance(oMax, false);
- }
-
- break;
- }
- default:
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
- }
-
- /**
- * Constructor from a given details.
- *
- * According RFC 3280, the minimum and maximum fields are not used with any
- * name forms, thus minimum MUST be zero, and maximum MUST be absent.
- *
- * If minimum is null, zero is assumed, if
- * maximum is null, maximum is absent.
- *
- * @param baseName
- * A restriction.
- * @param minimum
- * Minimum
- *
- * @param maximum
- * Maximum
- */
- public GeneralSubtree(
- GeneralName baseName,
- BigInteger minimum,
- BigInteger maximum)
- {
- this.baseName = baseName;
- if (minimum != null)
- {
- this.minimum = new DerInteger(minimum);
- }
- if (maximum != null)
- {
- this.maximum = new DerInteger(maximum);
- }
- }
-
- public GeneralSubtree(
- GeneralName baseName)
- : this(baseName, null, null)
- {
- }
-
- public static GeneralSubtree GetInstance(
- Asn1TaggedObject o,
- bool isExplicit)
- {
- return new GeneralSubtree(Asn1Sequence.GetInstance(o, isExplicit));
- }
-
- public static GeneralSubtree GetInstance(
- object obj)
- {
- if (obj == null)
- {
- return null;
- }
-
- if (obj is GeneralSubtree)
- {
- return (GeneralSubtree) obj;
- }
-
- return new GeneralSubtree(Asn1Sequence.GetInstance(obj));
- }
-
- public GeneralName Base
- {
- get { return baseName; }
- }
-
- public BigInteger Minimum
- {
- get { return minimum == null ? BigInteger.Zero : minimum.Value; }
- }
-
- public BigInteger Maximum
- {
- get { return maximum == null ? null : maximum.Value; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * GeneralSubtree ::= SEQUENCE
- * {
- * baseName GeneralName,
- * minimum [0] BaseDistance DEFAULT 0,
- * maximum [1] BaseDistance OPTIONAL
- * }
- *
- *
- * @return a DERObject
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(baseName);
-
- if (minimum != null && minimum.Value.SignValue != 0)
- {
- v.Add(new DerTaggedObject(false, 0, minimum));
- }
-
- if (maximum != null)
- {
- v.Add(new DerTaggedObject(false, 1, maximum));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/Holder.cs b/BCCrypto/src/asn1/x509/Holder.cs
deleted file mode 100644
index 6e5315b..0000000
--- a/BCCrypto/src/asn1/x509/Holder.cs
+++ /dev/null
@@ -1,259 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The Holder object.
- *
- * For an v2 attribute certificate this is:
- *
- *
- * Holder ::= SEQUENCE {
- * baseCertificateID [0] IssuerSerial OPTIONAL,
- * -- the issuer and serial number of
- * -- the holder's Public Key Certificate
- * entityName [1] GeneralNames OPTIONAL,
- * -- the name of the claimant or role
- * objectDigestInfo [2] ObjectDigestInfo OPTIONAL
- * -- used to directly authenticate the holder,
- * -- for example, an executable
- * }
- *
- *
- *
- * For an v1 attribute certificate this is:
- *
- *
- * subject CHOICE {
- * baseCertificateID [0] IssuerSerial,
- * -- associated with a Public Key Certificate
- * subjectName [1] GeneralNames },
- * -- associated with a name
- *
- *
- */
- public class Holder
- : Asn1Encodable
- {
- internal readonly IssuerSerial baseCertificateID;
- internal readonly GeneralNames entityName;
- internal readonly ObjectDigestInfo objectDigestInfo;
- private readonly int version;
-
- public static Holder GetInstance(
- object obj)
- {
- if (obj is Holder)
- {
- return (Holder) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new Holder((Asn1Sequence) obj);
- }
-
- if (obj is Asn1TaggedObject)
- {
- return new Holder((Asn1TaggedObject) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor for a holder for an v1 attribute certificate.
- *
- * @param tagObj The ASN.1 tagged holder object.
- */
- public Holder(
- Asn1TaggedObject tagObj)
- {
- switch (tagObj.TagNo)
- {
- case 0:
- baseCertificateID = IssuerSerial.GetInstance(tagObj, false);
- break;
- case 1:
- entityName = GeneralNames.GetInstance(tagObj, false);
- break;
- default:
- throw new ArgumentException("unknown tag in Holder");
- }
-
- this.version = 0;
- }
-
- /**
- * Constructor for a holder for an v2 attribute certificate. *
- *
- * @param seq The ASN.1 sequence.
- */
- private Holder(
- Asn1Sequence seq)
- {
- if (seq.Count > 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- for (int i = 0; i != seq.Count; i++)
- {
- Asn1TaggedObject tObj = Asn1TaggedObject.GetInstance(seq[i]);
-
- switch (tObj.TagNo)
- {
- case 0:
- baseCertificateID = IssuerSerial.GetInstance(tObj, false);
- break;
- case 1:
- entityName = GeneralNames.GetInstance(tObj, false);
- break;
- case 2:
- objectDigestInfo = ObjectDigestInfo.GetInstance(tObj, false);
- break;
- default:
- throw new ArgumentException("unknown tag in Holder");
- }
- }
-
- this.version = 1;
- }
-
- public Holder(
- IssuerSerial baseCertificateID)
- : this(baseCertificateID, 1)
- {
- }
-
- /**
- * Constructs a holder from a IssuerSerial.
- * @param baseCertificateID The IssuerSerial.
- * @param version The version of the attribute certificate.
- */
- public Holder(
- IssuerSerial baseCertificateID,
- int version)
- {
- this.baseCertificateID = baseCertificateID;
- this.version = version;
- }
-
- /**
- * Returns 1 for v2 attribute certificates or 0 for v1 attribute
- * certificates.
- * @return The version of the attribute certificate.
- */
- public int Version
- {
- get { return version; }
- }
-
- /**
- * Constructs a holder with an entityName for v2 attribute certificates or
- * with a subjectName for v1 attribute certificates.
- *
- * @param entityName The entity or subject name.
- */
- public Holder(
- GeneralNames entityName)
- : this(entityName, 1)
- {
- }
-
- /**
- * Constructs a holder with an entityName for v2 attribute certificates or
- * with a subjectName for v1 attribute certificates.
- *
- * @param entityName The entity or subject name.
- * @param version The version of the attribute certificate.
- */
- public Holder(
- GeneralNames entityName,
- int version)
- {
- this.entityName = entityName;
- this.version = version;
- }
-
- /**
- * Constructs a holder from an object digest info.
- *
- * @param objectDigestInfo The object digest info object.
- */
- public Holder(
- ObjectDigestInfo objectDigestInfo)
- {
- this.objectDigestInfo = objectDigestInfo;
- this.version = 1;
- }
-
- public IssuerSerial BaseCertificateID
- {
- get { return baseCertificateID; }
- }
-
- /**
- * Returns the entityName for an v2 attribute certificate or the subjectName
- * for an v1 attribute certificate.
- *
- * @return The entityname or subjectname.
- */
- public GeneralNames EntityName
- {
- get { return entityName; }
- }
-
- public ObjectDigestInfo ObjectDigestInfo
- {
- get { return objectDigestInfo; }
- }
-
- /**
- * The Holder object.
- *
- * Holder ::= Sequence {
- * baseCertificateID [0] IssuerSerial OPTIONAL,
- * -- the issuer and serial number of
- * -- the holder's Public Key Certificate
- * entityName [1] GeneralNames OPTIONAL,
- * -- the name of the claimant or role
- * objectDigestInfo [2] ObjectDigestInfo OPTIONAL
- * -- used to directly authenticate the holder,
- * -- for example, an executable
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- if (version == 1)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (baseCertificateID != null)
- {
- v.Add(new DerTaggedObject(false, 0, baseCertificateID));
- }
-
- if (entityName != null)
- {
- v.Add(new DerTaggedObject(false, 1, entityName));
- }
-
- if (objectDigestInfo != null)
- {
- v.Add(new DerTaggedObject(false, 2, objectDigestInfo));
- }
-
- return new DerSequence(v);
- }
-
- if (entityName != null)
- {
- return new DerTaggedObject(false, 1, entityName);
- }
-
- return new DerTaggedObject(false, 0, baseCertificateID);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/IetfAttrSyntax.cs b/BCCrypto/src/asn1/x509/IetfAttrSyntax.cs
deleted file mode 100644
index e719865..0000000
--- a/BCCrypto/src/asn1/x509/IetfAttrSyntax.cs
+++ /dev/null
@@ -1,161 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * Implementation of IetfAttrSyntax as specified by RFC3281.
- */
- public class IetfAttrSyntax
- : Asn1Encodable
- {
- public const int ValueOctets = 1;
- public const int ValueOid = 2;
- public const int ValueUtf8 = 3;
-
- internal readonly GeneralNames policyAuthority;
- internal readonly Asn1EncodableVector values = new Asn1EncodableVector();
-
- internal int valueChoice = -1;
-
- /**
- *
- */
- public IetfAttrSyntax(
- Asn1Sequence seq)
- {
- int i = 0;
-
- if (seq[0] is Asn1TaggedObject)
- {
- policyAuthority = GeneralNames.GetInstance(((Asn1TaggedObject)seq[0]), false);
- i++;
- }
- else if (seq.Count == 2)
- { // VOMS fix
- policyAuthority = GeneralNames.GetInstance(seq[0]);
- i++;
- }
-
- if (!(seq[i] is Asn1Sequence))
- {
- throw new ArgumentException("Non-IetfAttrSyntax encoding");
- }
-
- seq = (Asn1Sequence) seq[i];
-
- foreach (Asn1Object obj in seq)
- {
- int type;
-
- if (obj is DerObjectIdentifier)
- {
- type = ValueOid;
- }
- else if (obj is DerUtf8String)
- {
- type = ValueUtf8;
- }
- else if (obj is DerOctetString)
- {
- type = ValueOctets;
- }
- else
- {
- throw new ArgumentException("Bad value type encoding IetfAttrSyntax");
- }
-
- if (valueChoice < 0)
- {
- valueChoice = type;
- }
-
- if (type != valueChoice)
- {
- throw new ArgumentException("Mix of value types in IetfAttrSyntax");
- }
-
- values.Add(obj);
- }
- }
-
- public GeneralNames PolicyAuthority
- {
- get { return policyAuthority; }
- }
-
- public int ValueType
- {
- get { return valueChoice; }
- }
-
- public object[] GetValues()
- {
- if (this.ValueType == ValueOctets)
- {
- Asn1OctetString[] tmp = new Asn1OctetString[values.Count];
-
- for (int i = 0; i != tmp.Length; i++)
- {
- tmp[i] = (Asn1OctetString) values[i];
- }
-
- return tmp;
- }
-
- if (this.ValueType == ValueOid)
- {
- DerObjectIdentifier[] tmp = new DerObjectIdentifier[values.Count];
-
- for (int i = 0; i != tmp.Length; i++)
- {
- tmp[i] = (DerObjectIdentifier) values[i];
- }
-
- return tmp;
- }
-
- {
- DerUtf8String[] tmp = new DerUtf8String[values.Count];
-
- for (int i = 0; i != tmp.Length; i++)
- {
- tmp[i] = (DerUtf8String) values[i];
- }
-
- return tmp;
- }
- }
-
- /**
- *
- *
- *
- * IetfAttrSyntax ::= Sequence {
- * policyAuthority [0] GeneralNames OPTIONAL,
- * values Sequence OF CHOICE {
- * octets OCTET STRING,
- * oid OBJECT IDENTIFIER,
- * string UTF8String
- * }
- * }
- *
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (policyAuthority != null)
- {
- v.Add(new DerTaggedObject(0, policyAuthority));
- }
-
- v.Add(new DerSequence(values));
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/IssuerSerial.cs b/BCCrypto/src/asn1/x509/IssuerSerial.cs
deleted file mode 100644
index 1e47e02..0000000
--- a/BCCrypto/src/asn1/x509/IssuerSerial.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class IssuerSerial
- : Asn1Encodable
- {
- internal readonly GeneralNames issuer;
- internal readonly DerInteger serial;
- internal readonly DerBitString issuerUid;
-
- public static IssuerSerial GetInstance(
- object obj)
- {
- if (obj == null || obj is IssuerSerial)
- {
- return (IssuerSerial) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new IssuerSerial((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public static IssuerSerial GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- private IssuerSerial(
- Asn1Sequence seq)
- {
- if (seq.Count != 2 && seq.Count != 3)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
-
- issuer = GeneralNames.GetInstance(seq[0]);
- serial = DerInteger.GetInstance(seq[1]);
-
- if (seq.Count == 3)
- {
- issuerUid = DerBitString.GetInstance(seq[2]);
- }
- }
-
- public IssuerSerial(
- GeneralNames issuer,
- DerInteger serial)
- {
- this.issuer = issuer;
- this.serial = serial;
- }
-
- public GeneralNames Issuer
- {
- get { return issuer; }
- }
-
- public DerInteger Serial
- {
- get { return serial; }
- }
-
- public DerBitString IssuerUid
- {
- get { return issuerUid; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * IssuerSerial ::= Sequence {
- * issuer GeneralNames,
- * serial CertificateSerialNumber,
- * issuerUid UniqueIdentifier OPTIONAL
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- issuer, serial);
-
- if (issuerUid != null)
- {
- v.Add(issuerUid);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/IssuingDistributionPoint.cs b/BCCrypto/src/asn1/x509/IssuingDistributionPoint.cs
deleted file mode 100644
index 8e9362b..0000000
--- a/BCCrypto/src/asn1/x509/IssuingDistributionPoint.cs
+++ /dev/null
@@ -1,247 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- *
- * IssuingDistributionPoint ::= SEQUENCE {
- * distributionPoint [0] DistributionPointName OPTIONAL,
- * onlyContainsUserCerts [1] BOOLEAN DEFAULT FALSE,
- * onlyContainsCACerts [2] BOOLEAN DEFAULT FALSE,
- * onlySomeReasons [3] ReasonFlags OPTIONAL,
- * indirectCRL [4] BOOLEAN DEFAULT FALSE,
- * onlyContainsAttributeCerts [5] BOOLEAN DEFAULT FALSE }
- *
- */
- public class IssuingDistributionPoint
- : Asn1Encodable
- {
- private readonly DistributionPointName _distributionPoint;
- private readonly bool _onlyContainsUserCerts;
- private readonly bool _onlyContainsCACerts;
- private readonly ReasonFlags _onlySomeReasons;
- private readonly bool _indirectCRL;
- private readonly bool _onlyContainsAttributeCerts;
-
- private readonly Asn1Sequence seq;
-
- public static IssuingDistributionPoint GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static IssuingDistributionPoint GetInstance(
- object obj)
- {
- if (obj == null || obj is IssuingDistributionPoint)
- {
- return (IssuingDistributionPoint) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new IssuingDistributionPoint((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from given details.
- *
- * @param distributionPoint
- * May contain an URI as pointer to most current CRL.
- * @param onlyContainsUserCerts Covers revocation information for end certificates.
- * @param onlyContainsCACerts Covers revocation information for CA certificates.
- *
- * @param onlySomeReasons
- * Which revocation reasons does this point cover.
- * @param indirectCRL
- * If true then the CRL contains revocation
- * information about certificates ssued by other CAs.
- * @param onlyContainsAttributeCerts Covers revocation information for attribute certificates.
- */
- public IssuingDistributionPoint(
- DistributionPointName distributionPoint,
- bool onlyContainsUserCerts,
- bool onlyContainsCACerts,
- ReasonFlags onlySomeReasons,
- bool indirectCRL,
- bool onlyContainsAttributeCerts)
- {
- this._distributionPoint = distributionPoint;
- this._indirectCRL = indirectCRL;
- this._onlyContainsAttributeCerts = onlyContainsAttributeCerts;
- this._onlyContainsCACerts = onlyContainsCACerts;
- this._onlyContainsUserCerts = onlyContainsUserCerts;
- this._onlySomeReasons = onlySomeReasons;
-
- Asn1EncodableVector vec = new Asn1EncodableVector();
- if (distributionPoint != null)
- { // CHOICE item so explicitly tagged
- vec.Add(new DerTaggedObject(true, 0, distributionPoint));
- }
- if (onlyContainsUserCerts)
- {
- vec.Add(new DerTaggedObject(false, 1, DerBoolean.True));
- }
- if (onlyContainsCACerts)
- {
- vec.Add(new DerTaggedObject(false, 2, DerBoolean.True));
- }
- if (onlySomeReasons != null)
- {
- vec.Add(new DerTaggedObject(false, 3, onlySomeReasons));
- }
- if (indirectCRL)
- {
- vec.Add(new DerTaggedObject(false, 4, DerBoolean.True));
- }
- if (onlyContainsAttributeCerts)
- {
- vec.Add(new DerTaggedObject(false, 5, DerBoolean.True));
- }
-
- seq = new DerSequence(vec);
- }
-
- /**
- * Constructor from Asn1Sequence
- */
- private IssuingDistributionPoint(
- Asn1Sequence seq)
- {
- this.seq = seq;
-
- for (int i = 0; i != seq.Count; i++)
- {
- Asn1TaggedObject o = Asn1TaggedObject.GetInstance(seq[i]);
-
- switch (o.TagNo)
- {
- case 0:
- // CHOICE so explicit
- _distributionPoint = DistributionPointName.GetInstance(o, true);
- break;
- case 1:
- _onlyContainsUserCerts = DerBoolean.GetInstance(o, false).IsTrue;
- break;
- case 2:
- _onlyContainsCACerts = DerBoolean.GetInstance(o, false).IsTrue;
- break;
- case 3:
- _onlySomeReasons = new ReasonFlags(ReasonFlags.GetInstance(o, false));
- break;
- case 4:
- _indirectCRL = DerBoolean.GetInstance(o, false).IsTrue;
- break;
- case 5:
- _onlyContainsAttributeCerts = DerBoolean.GetInstance(o, false).IsTrue;
- break;
- default:
- throw new ArgumentException("unknown tag in IssuingDistributionPoint");
- }
- }
- }
-
- public bool OnlyContainsUserCerts
- {
- get { return _onlyContainsUserCerts; }
- }
-
- public bool OnlyContainsCACerts
- {
- get { return _onlyContainsCACerts; }
- }
-
- public bool IsIndirectCrl
- {
- get { return _indirectCRL; }
- }
-
- public bool OnlyContainsAttributeCerts
- {
- get { return _onlyContainsAttributeCerts; }
- }
-
- /**
- * @return Returns the distributionPoint.
- */
- public DistributionPointName DistributionPoint
- {
- get { return _distributionPoint; }
- }
-
- /**
- * @return Returns the onlySomeReasons.
- */
- public ReasonFlags OnlySomeReasons
- {
- get { return _onlySomeReasons; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return seq;
- }
-
- public override string ToString()
- {
- string sep = Platform.NewLine;
- StringBuilder buf = new StringBuilder();
-
- buf.Append("IssuingDistributionPoint: [");
- buf.Append(sep);
- if (_distributionPoint != null)
- {
- appendObject(buf, sep, "distributionPoint", _distributionPoint.ToString());
- }
- if (_onlyContainsUserCerts)
- {
- appendObject(buf, sep, "onlyContainsUserCerts", _onlyContainsUserCerts.ToString());
- }
- if (_onlyContainsCACerts)
- {
- appendObject(buf, sep, "onlyContainsCACerts", _onlyContainsCACerts.ToString());
- }
- if (_onlySomeReasons != null)
- {
- appendObject(buf, sep, "onlySomeReasons", _onlySomeReasons.ToString());
- }
- if (_onlyContainsAttributeCerts)
- {
- appendObject(buf, sep, "onlyContainsAttributeCerts", _onlyContainsAttributeCerts.ToString());
- }
- if (_indirectCRL)
- {
- appendObject(buf, sep, "indirectCRL", _indirectCRL.ToString());
- }
- buf.Append("]");
- buf.Append(sep);
- return buf.ToString();
- }
-
- private void appendObject(
- StringBuilder buf,
- string sep,
- string name,
- string val)
- {
- string indent = " ";
-
- buf.Append(indent);
- buf.Append(name);
- buf.Append(":");
- buf.Append(sep);
- buf.Append(indent);
- buf.Append(indent);
- buf.Append(val);
- buf.Append(sep);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/KeyPurposeId.cs b/BCCrypto/src/asn1/x509/KeyPurposeId.cs
deleted file mode 100644
index 1a564b9..0000000
--- a/BCCrypto/src/asn1/x509/KeyPurposeId.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The KeyPurposeID object.
- *
- * KeyPurposeID ::= OBJECT IDENTIFIER
- *
- */
- public sealed class KeyPurposeID
- : DerObjectIdentifier
- {
- private const string IdKP = "1.3.6.1.5.5.7.3";
-
- private KeyPurposeID(
- string id)
- : base(id)
- {
- }
-
- public static readonly KeyPurposeID AnyExtendedKeyUsage = new KeyPurposeID(X509Extensions.ExtendedKeyUsage.Id + ".0");
- public static readonly KeyPurposeID IdKPServerAuth = new KeyPurposeID(IdKP + ".1");
- public static readonly KeyPurposeID IdKPClientAuth = new KeyPurposeID(IdKP + ".2");
- public static readonly KeyPurposeID IdKPCodeSigning = new KeyPurposeID(IdKP + ".3");
- public static readonly KeyPurposeID IdKPEmailProtection = new KeyPurposeID(IdKP + ".4");
- public static readonly KeyPurposeID IdKPIpsecEndSystem = new KeyPurposeID(IdKP + ".5");
- public static readonly KeyPurposeID IdKPIpsecTunnel = new KeyPurposeID(IdKP + ".6");
- public static readonly KeyPurposeID IdKPIpsecUser = new KeyPurposeID(IdKP + ".7");
- public static readonly KeyPurposeID IdKPTimeStamping = new KeyPurposeID(IdKP + ".8");
- public static readonly KeyPurposeID IdKPOcspSigning = new KeyPurposeID(IdKP + ".9");
-
- //
- // microsoft key purpose ids
- //
- public static readonly KeyPurposeID IdKPSmartCardLogon = new KeyPurposeID("1.3.6.1.4.1.311.20.2.2");
-
- public static readonly KeyPurposeID IdKPMacAddress = new KeyPurposeID("1.3.6.1.1.1.1.22");
- }
-}
diff --git a/BCCrypto/src/asn1/x509/KeyUsage.cs b/BCCrypto/src/asn1/x509/KeyUsage.cs
deleted file mode 100644
index aeaffb7..0000000
--- a/BCCrypto/src/asn1/x509/KeyUsage.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The KeyUsage object.
- *
- * id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 }
- *
- * KeyUsage ::= BIT STRING {
- * digitalSignature (0),
- * nonRepudiation (1),
- * keyEncipherment (2),
- * dataEncipherment (3),
- * keyAgreement (4),
- * keyCertSign (5),
- * cRLSign (6),
- * encipherOnly (7),
- * decipherOnly (8) }
- *
- */
- public class KeyUsage
- : DerBitString
- {
- public const int DigitalSignature = (1 << 7);
- public const int NonRepudiation = (1 << 6);
- public const int KeyEncipherment = (1 << 5);
- public const int DataEncipherment = (1 << 4);
- public const int KeyAgreement = (1 << 3);
- public const int KeyCertSign = (1 << 2);
- public const int CrlSign = (1 << 1);
- public const int EncipherOnly = (1 << 0);
- public const int DecipherOnly = (1 << 15);
-
- public static new KeyUsage GetInstance(
- object obj)
- {
- if (obj is KeyUsage)
- {
- return (KeyUsage)obj;
- }
-
- if (obj is X509Extension)
- {
- return GetInstance(X509Extension.ConvertValueToObject((X509Extension) obj));
- }
-
- return new KeyUsage(DerBitString.GetInstance(obj));
- }
-
- /**
- * Basic constructor.
- *
- * @param usage - the bitwise OR of the Key Usage flags giving the
- * allowed uses for the key.
- * e.g. (KeyUsage.keyEncipherment | KeyUsage.dataEncipherment)
- */
- public KeyUsage(int usage)
- : base(usage)
- {
- }
-
- private KeyUsage(
- DerBitString usage)
- : base(usage.GetBytes(), usage.PadBits)
- {
- }
-
- public override string ToString()
- {
- byte[] data = GetBytes();
- if (data.Length == 1)
- {
- return "KeyUsage: 0x" + (data[0] & 0xff).ToString("X");
- }
-
- return "KeyUsage: 0x" + ((data[1] & 0xff) << 8 | (data[0] & 0xff)).ToString("X");
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/NameConstraints.cs b/BCCrypto/src/asn1/x509/NameConstraints.cs
deleted file mode 100644
index 0c5fea8..0000000
--- a/BCCrypto/src/asn1/x509/NameConstraints.cs
+++ /dev/null
@@ -1,120 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class NameConstraints
- : Asn1Encodable
- {
- private Asn1Sequence permitted, excluded;
-
- public static NameConstraints GetInstance(
- object obj)
- {
- if (obj == null || obj is NameConstraints)
- {
- return (NameConstraints) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new NameConstraints((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public NameConstraints(
- Asn1Sequence seq)
- {
- foreach (Asn1TaggedObject o in seq)
- {
- switch (o.TagNo)
- {
- case 0:
- permitted = Asn1Sequence.GetInstance(o, false);
- break;
- case 1:
- excluded = Asn1Sequence.GetInstance(o, false);
- break;
- }
- }
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- public NameConstraints(
- ArrayList permitted,
- ArrayList excluded)
- : this((IList)permitted, (IList)excluded)
- {
- }
-#endif
-
- /**
- * Constructor from a given details.
- *
- * permitted and excluded are Vectors of GeneralSubtree objects.
- *
- * @param permitted Permitted subtrees
- * @param excluded Excluded subtrees
- */
- public NameConstraints(
- IList permitted,
- IList excluded)
- {
- if (permitted != null)
- {
- this.permitted = CreateSequence(permitted);
- }
-
- if (excluded != null)
- {
- this.excluded = CreateSequence(excluded);
- }
- }
-
- private DerSequence CreateSequence(
- IList subtrees)
- {
- GeneralSubtree[] gsts = new GeneralSubtree[subtrees.Count];
- for (int i = 0; i < subtrees.Count; ++i)
- {
- gsts[i] = (GeneralSubtree)subtrees[i];
- }
- return new DerSequence(gsts);
- }
-
- public Asn1Sequence PermittedSubtrees
- {
- get { return permitted; }
- }
-
- public Asn1Sequence ExcludedSubtrees
- {
- get { return excluded; }
- }
-
- /*
- * NameConstraints ::= SEQUENCE { permittedSubtrees [0] GeneralSubtrees
- * OPTIONAL, excludedSubtrees [1] GeneralSubtrees OPTIONAL }
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (permitted != null)
- {
- v.Add(new DerTaggedObject(false, 0, permitted));
- }
-
- if (excluded != null)
- {
- v.Add(new DerTaggedObject(false, 1, excluded));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/NoticeReference.cs b/BCCrypto/src/asn1/x509/NoticeReference.cs
deleted file mode 100644
index f0d3a7b..0000000
--- a/BCCrypto/src/asn1/x509/NoticeReference.cs
+++ /dev/null
@@ -1,143 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * NoticeReference class, used in
- * CertificatePolicies X509 V3 extensions
- * (in policy qualifiers).
- *
- *
- * NoticeReference ::= Sequence {
- * organization DisplayText,
- * noticeNumbers Sequence OF Integer }
- *
- *
- *
- * @see PolicyQualifierInfo
- * @see PolicyInformation
- */
- public class NoticeReference
- : Asn1Encodable
- {
- private readonly DisplayText organization;
- private readonly Asn1Sequence noticeNumbers;
-
- private static Asn1EncodableVector ConvertVector(IList numbers)
- {
- Asn1EncodableVector av = new Asn1EncodableVector();
-
- foreach (object o in numbers)
- {
- DerInteger di;
-
- if (o is BigInteger)
- {
- di = new DerInteger((BigInteger)o);
- }
- else if (o is int)
- {
- di = new DerInteger((int)o);
- }
- else
- {
- throw new ArgumentException();
- }
-
- av.Add(di);
- }
- return av;
- }
-
- /**
- * Creates a new NoticeReference instance.
- *
- * @param organization a String value
- * @param numbers a Vector value
- */
- public NoticeReference(string organization, IList numbers)
- : this(organization, ConvertVector(numbers))
- {
- }
-
- /**
- * Creates a new NoticeReference instance.
- *
- * @param organization a String value
- * @param noticeNumbers an ASN1EncodableVector value
- */
- public NoticeReference(string organization, Asn1EncodableVector noticeNumbers)
- : this(new DisplayText(organization), noticeNumbers)
- {
- }
-
- /**
- * Creates a new NoticeReference instance.
- *
- * @param organization displayText
- * @param noticeNumbers an ASN1EncodableVector value
- */
- public NoticeReference(DisplayText organization, Asn1EncodableVector noticeNumbers)
- {
- this.organization = organization;
- this.noticeNumbers = new DerSequence(noticeNumbers);
- }
-
- /**
- * Creates a new NoticeReference instance.
- * Useful for reconstructing a NoticeReference
- * instance from its encodable/encoded form.
- *
- * @param as an Asn1Sequence value obtained from either
- * calling @{link ToAsn1Object()} for a NoticeReference
- * instance or from parsing it from a Der-encoded stream.
- */
- private NoticeReference(Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- organization = DisplayText.GetInstance(seq[0]);
- noticeNumbers = Asn1Sequence.GetInstance(seq[1]);
- }
-
- public static NoticeReference GetInstance(object obj)
- {
- if (obj is NoticeReference)
- return (NoticeReference)obj;
- if (obj == null)
- return null;
- return new NoticeReference(Asn1Sequence.GetInstance(obj));
- }
-
- public virtual DisplayText Organization
- {
- get { return organization; }
- }
-
- public virtual DerInteger[] GetNoticeNumbers()
- {
- DerInteger[] tmp = new DerInteger[noticeNumbers.Count];
-
- for (int i = 0; i != noticeNumbers.Count; ++i)
- {
- tmp[i] = DerInteger.GetInstance(noticeNumbers[i]);
- }
-
- return tmp;
- }
-
- /**
- * Describe ToAsn1Object method here.
- *
- * @return a Asn1Object value
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(organization, noticeNumbers);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/ObjectDigestInfo.cs b/BCCrypto/src/asn1/x509/ObjectDigestInfo.cs
deleted file mode 100644
index 9cd9a5f..0000000
--- a/BCCrypto/src/asn1/x509/ObjectDigestInfo.cs
+++ /dev/null
@@ -1,179 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * ObjectDigestInfo ASN.1 structure used in v2 attribute certificates.
- *
- *
- *
- * ObjectDigestInfo ::= SEQUENCE {
- * digestedObjectType ENUMERATED {
- * publicKey (0),
- * publicKeyCert (1),
- * otherObjectTypes (2) },
- * -- otherObjectTypes MUST NOT
- * -- be used in this profile
- * otherObjectTypeID OBJECT IDENTIFIER OPTIONAL,
- * digestAlgorithm AlgorithmIdentifier,
- * objectDigest BIT STRING
- * }
- *
- *
- *
- */
- public class ObjectDigestInfo
- : Asn1Encodable
- {
- /**
- * The public key is hashed.
- */
- public const int PublicKey = 0;
-
- /**
- * The public key certificate is hashed.
- */
- public const int PublicKeyCert = 1;
-
- /**
- * An other object is hashed.
- */
- public const int OtherObjectDigest = 2;
-
- internal readonly DerEnumerated digestedObjectType;
- internal readonly DerObjectIdentifier otherObjectTypeID;
- internal readonly AlgorithmIdentifier digestAlgorithm;
- internal readonly DerBitString objectDigest;
-
- public static ObjectDigestInfo GetInstance(
- object obj)
- {
- if (obj == null || obj is ObjectDigestInfo)
- {
- return (ObjectDigestInfo) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new ObjectDigestInfo((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public static ObjectDigestInfo GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- /**
- * Constructor from given details.
- *
- * If digestedObjectType is not {@link #publicKeyCert} or
- * {@link #publicKey} otherObjectTypeID must be given,
- * otherwise it is ignored.
- *
- * @param digestedObjectType The digest object type.
- * @param otherObjectTypeID The object type ID for
- * otherObjectDigest.
- * @param digestAlgorithm The algorithm identifier for the hash.
- * @param objectDigest The hash value.
- */
- public ObjectDigestInfo(
- int digestedObjectType,
- string otherObjectTypeID,
- AlgorithmIdentifier digestAlgorithm,
- byte[] objectDigest)
- {
- this.digestedObjectType = new DerEnumerated(digestedObjectType);
-
- if (digestedObjectType == OtherObjectDigest)
- {
- this.otherObjectTypeID = new DerObjectIdentifier(otherObjectTypeID);
- }
-
- this.digestAlgorithm = digestAlgorithm;
-
- this.objectDigest = new DerBitString(objectDigest);
- }
-
- private ObjectDigestInfo(
- Asn1Sequence seq)
- {
- if (seq.Count > 4 || seq.Count < 3)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
-
- digestedObjectType = DerEnumerated.GetInstance(seq[0]);
-
- int offset = 0;
-
- if (seq.Count == 4)
- {
- otherObjectTypeID = DerObjectIdentifier.GetInstance(seq[1]);
- offset++;
- }
-
- digestAlgorithm = AlgorithmIdentifier.GetInstance(seq[1 + offset]);
- objectDigest = DerBitString.GetInstance(seq[2 + offset]);
- }
-
- public DerEnumerated DigestedObjectType
- {
- get { return digestedObjectType; }
- }
-
- public DerObjectIdentifier OtherObjectTypeID
- {
- get { return otherObjectTypeID; }
- }
-
- public AlgorithmIdentifier DigestAlgorithm
- {
- get { return digestAlgorithm; }
- }
-
- public DerBitString ObjectDigest
- {
- get { return objectDigest; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- *
- *
- * ObjectDigestInfo ::= SEQUENCE {
- * digestedObjectType ENUMERATED {
- * publicKey (0),
- * publicKeyCert (1),
- * otherObjectTypes (2) },
- * -- otherObjectTypes MUST NOT
- * -- be used in this profile
- * otherObjectTypeID OBJECT IDENTIFIER OPTIONAL,
- * digestAlgorithm AlgorithmIdentifier,
- * objectDigest BIT STRING
- * }
- *
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(digestedObjectType);
-
- if (otherObjectTypeID != null)
- {
- v.Add(otherObjectTypeID);
- }
-
- v.Add(digestAlgorithm, objectDigest);
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/PolicyInformation.cs b/BCCrypto/src/asn1/x509/PolicyInformation.cs
deleted file mode 100644
index 29d2450..0000000
--- a/BCCrypto/src/asn1/x509/PolicyInformation.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class PolicyInformation
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier policyIdentifier;
- private readonly Asn1Sequence policyQualifiers;
-
- private PolicyInformation(
- Asn1Sequence seq)
- {
- if (seq.Count < 1 || seq.Count > 2)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
-
- policyIdentifier = DerObjectIdentifier.GetInstance(seq[0]);
-
- if (seq.Count > 1)
- {
- policyQualifiers = Asn1Sequence.GetInstance(seq[1]);
- }
- }
-
- public PolicyInformation(
- DerObjectIdentifier policyIdentifier)
- {
- this.policyIdentifier = policyIdentifier;
- }
-
- public PolicyInformation(
- DerObjectIdentifier policyIdentifier,
- Asn1Sequence policyQualifiers)
- {
- this.policyIdentifier = policyIdentifier;
- this.policyQualifiers = policyQualifiers;
- }
-
- public static PolicyInformation GetInstance(
- object obj)
- {
- if (obj == null || obj is PolicyInformation)
- {
- return (PolicyInformation) obj;
- }
-
- return new PolicyInformation(Asn1Sequence.GetInstance(obj));
- }
-
- public DerObjectIdentifier PolicyIdentifier
- {
- get { return policyIdentifier; }
- }
-
- public Asn1Sequence PolicyQualifiers
- {
- get { return policyQualifiers; }
- }
-
- /*
- * PolicyInformation ::= Sequence {
- * policyIdentifier CertPolicyId,
- * policyQualifiers Sequence SIZE (1..MAX) OF
- * PolicyQualifierInfo OPTIONAL }
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(policyIdentifier);
-
- if (policyQualifiers != null)
- {
- v.Add(policyQualifiers);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/PolicyMappings.cs b/BCCrypto/src/asn1/x509/PolicyMappings.cs
deleted file mode 100644
index 928ad13..0000000
--- a/BCCrypto/src/asn1/x509/PolicyMappings.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using System.Collections;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * PolicyMappings V3 extension, described in RFC3280.
- *
- * PolicyMappings ::= Sequence SIZE (1..MAX) OF Sequence {
- * issuerDomainPolicy CertPolicyId,
- * subjectDomainPolicy CertPolicyId }
- *
- *
- * @see RFC 3280, section 4.2.1.6
- */
- public class PolicyMappings
- : Asn1Encodable
- {
- private readonly Asn1Sequence seq;
-
- /**
- * Creates a new PolicyMappings instance.
- *
- * @param seq an Asn1Sequence constructed as specified
- * in RFC 3280
- */
- public PolicyMappings(
- Asn1Sequence seq)
- {
- this.seq = seq;
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- public PolicyMappings(
- Hashtable mappings)
- : this((IDictionary)mappings)
- {
- }
-#endif
-
- /**
- * Creates a new PolicyMappings instance.
- *
- * @param mappings a HashMap value that maps
- * string oids
- * to other string oids.
- */
- public PolicyMappings(
- IDictionary mappings)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- foreach (string idp in mappings.Keys)
- {
- string sdp = (string) mappings[idp];
-
- v.Add(
- new DerSequence(
- new DerObjectIdentifier(idp),
- new DerObjectIdentifier(sdp)));
- }
-
- seq = new DerSequence(v);
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return seq;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/PolicyQualifierId.cs b/BCCrypto/src/asn1/x509/PolicyQualifierId.cs
deleted file mode 100644
index c858f08..0000000
--- a/BCCrypto/src/asn1/x509/PolicyQualifierId.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * PolicyQualifierId, used in the CertificatePolicies
- * X509V3 extension.
- *
- *
- * id-qt OBJECT IDENTIFIER ::= { id-pkix 2 }
- * id-qt-cps OBJECT IDENTIFIER ::= { id-qt 1 }
- * id-qt-unotice OBJECT IDENTIFIER ::= { id-qt 2 }
- * PolicyQualifierId ::=
- * OBJECT IDENTIFIER ( id-qt-cps | id-qt-unotice )
- *
- */
- public sealed class PolicyQualifierID : DerObjectIdentifier
- {
- private const string IdQt = "1.3.6.1.5.5.7.2";
-
- private PolicyQualifierID(
- string id)
- : base(id)
- {
- }
-
- public static readonly PolicyQualifierID IdQtCps = new PolicyQualifierID(IdQt + ".1");
- public static readonly PolicyQualifierID IdQtUnotice = new PolicyQualifierID(IdQt + ".2");
- }
-}
diff --git a/BCCrypto/src/asn1/x509/PolicyQualifierInfo.cs b/BCCrypto/src/asn1/x509/PolicyQualifierInfo.cs
deleted file mode 100644
index 3cf6d7e..0000000
--- a/BCCrypto/src/asn1/x509/PolicyQualifierInfo.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * Policy qualifiers, used in the X509V3 CertificatePolicies
- * extension.
- *
- *
- * PolicyQualifierInfo ::= Sequence {
- * policyQualifierId PolicyQualifierId,
- * qualifier ANY DEFINED BY policyQualifierId }
- *
- */
- public class PolicyQualifierInfo
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier policyQualifierId;
- private readonly Asn1Encodable qualifier;
-
- /**
- * Creates a new PolicyQualifierInfo instance.
- *
- * @param policyQualifierId a PolicyQualifierId value
- * @param qualifier the qualifier, defined by the above field.
- */
- public PolicyQualifierInfo(
- DerObjectIdentifier policyQualifierId,
- Asn1Encodable qualifier)
- {
- this.policyQualifierId = policyQualifierId;
- this.qualifier = qualifier;
- }
-
- /**
- * Creates a new PolicyQualifierInfo containing a
- * cPSuri qualifier.
- *
- * @param cps the CPS (certification practice statement) uri as a
- * string.
- */
- public PolicyQualifierInfo(
- string cps)
- {
- policyQualifierId = PolicyQualifierID.IdQtCps;
- qualifier = new DerIA5String(cps);
- }
-
- /**
- * Creates a new PolicyQualifierInfo instance.
- *
- * @param as PolicyQualifierInfo X509 structure
- * encoded as an Asn1Sequence.
- */
- private PolicyQualifierInfo(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- policyQualifierId = DerObjectIdentifier.GetInstance(seq[0]);
- qualifier = seq[1];
- }
-
- public static PolicyQualifierInfo GetInstance(
- object obj)
- {
- if (obj is PolicyQualifierInfo)
- return (PolicyQualifierInfo)obj;
- if (obj == null)
- return null;
- return new PolicyQualifierInfo(Asn1Sequence.GetInstance(obj));
- }
-
- public virtual DerObjectIdentifier PolicyQualifierId
- {
- get { return policyQualifierId; }
- }
-
- public virtual Asn1Encodable Qualifier
- {
- get { return qualifier; }
- }
-
- /**
- * Returns a Der-encodable representation of this instance.
- *
- * @return a Asn1Object value
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(policyQualifierId, qualifier);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/PrivateKeyUsagePeriod.cs b/BCCrypto/src/asn1/x509/PrivateKeyUsagePeriod.cs
deleted file mode 100644
index a3d7a36..0000000
--- a/BCCrypto/src/asn1/x509/PrivateKeyUsagePeriod.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- ///
- ///
- /// PrivateKeyUsagePeriod ::= SEQUENCE
- /// {
- /// notBefore [0] GeneralizedTime OPTIONAL,
- /// notAfter [1] GeneralizedTime OPTIONAL }
- ///
- ///
- public class PrivateKeyUsagePeriod
- : Asn1Encodable
- {
- public static PrivateKeyUsagePeriod GetInstance(
- object obj)
- {
- if (obj is PrivateKeyUsagePeriod)
- {
- return (PrivateKeyUsagePeriod) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new PrivateKeyUsagePeriod((Asn1Sequence) obj);
- }
-
- if (obj is X509Extension)
- {
- return GetInstance(X509Extension.ConvertValueToObject((X509Extension) obj));
- }
-
- throw new ArgumentException("unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- private DerGeneralizedTime _notBefore, _notAfter;
-
- private PrivateKeyUsagePeriod(
- Asn1Sequence seq)
- {
- foreach (Asn1TaggedObject tObj in seq)
- {
- if (tObj.TagNo == 0)
- {
- _notBefore = DerGeneralizedTime.GetInstance(tObj, false);
- }
- else if (tObj.TagNo == 1)
- {
- _notAfter = DerGeneralizedTime.GetInstance(tObj, false);
- }
- }
- }
-
- public DerGeneralizedTime NotBefore
- {
- get { return _notBefore; }
- }
-
- public DerGeneralizedTime NotAfter
- {
- get { return _notAfter; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (_notBefore != null)
- {
- v.Add(new DerTaggedObject(false, 0, _notBefore));
- }
-
- if (_notAfter != null)
- {
- v.Add(new DerTaggedObject(false, 1, _notAfter));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/RSAPublicKeyStructure.cs b/BCCrypto/src/asn1/x509/RSAPublicKeyStructure.cs
deleted file mode 100644
index 20fdd96..0000000
--- a/BCCrypto/src/asn1/x509/RSAPublicKeyStructure.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class RsaPublicKeyStructure
- : Asn1Encodable
- {
- private BigInteger modulus;
- private BigInteger publicExponent;
-
- public static RsaPublicKeyStructure GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static RsaPublicKeyStructure GetInstance(
- object obj)
- {
- if (obj == null || obj is RsaPublicKeyStructure)
- {
- return (RsaPublicKeyStructure) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new RsaPublicKeyStructure((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("Invalid RsaPublicKeyStructure: " + Platform.GetTypeName(obj));
- }
-
- public RsaPublicKeyStructure(
- BigInteger modulus,
- BigInteger publicExponent)
- {
- if (modulus == null)
- throw new ArgumentNullException("modulus");
- if (publicExponent == null)
- throw new ArgumentNullException("publicExponent");
- if (modulus.SignValue <= 0)
- throw new ArgumentException("Not a valid RSA modulus", "modulus");
- if (publicExponent.SignValue <= 0)
- throw new ArgumentException("Not a valid RSA public exponent", "publicExponent");
-
- this.modulus = modulus;
- this.publicExponent = publicExponent;
- }
-
- private RsaPublicKeyStructure(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- // Note: we are accepting technically incorrect (i.e. negative) values here
- modulus = DerInteger.GetInstance(seq[0]).PositiveValue;
- publicExponent = DerInteger.GetInstance(seq[1]).PositiveValue;
- }
-
- public BigInteger Modulus
- {
- get { return modulus; }
- }
-
- public BigInteger PublicExponent
- {
- get { return publicExponent; }
- }
-
- /**
- * This outputs the key in Pkcs1v2 format.
- *
- * RSAPublicKey ::= Sequence {
- * modulus Integer, -- n
- * publicExponent Integer, -- e
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(
- new DerInteger(Modulus),
- new DerInteger(PublicExponent));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/ReasonFlags.cs b/BCCrypto/src/asn1/x509/ReasonFlags.cs
deleted file mode 100644
index ad45e84..0000000
--- a/BCCrypto/src/asn1/x509/ReasonFlags.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The ReasonFlags object.
- *
- * ReasonFlags ::= BIT STRING {
- * unused(0),
- * keyCompromise(1),
- * cACompromise(2),
- * affiliationChanged(3),
- * superseded(4),
- * cessationOfOperation(5),
- * certficateHold(6)
- * }
- *
- */
- public class ReasonFlags
- : DerBitString
- {
- public const int Unused = (1 << 7);
- public const int KeyCompromise = (1 << 6);
- public const int CACompromise = (1 << 5);
- public const int AffiliationChanged = (1 << 4);
- public const int Superseded = (1 << 3);
- public const int CessationOfOperation = (1 << 2);
- public const int CertificateHold = (1 << 1);
- public const int PrivilegeWithdrawn = (1 << 0);
- public const int AACompromise = (1 << 15);
-
- /**
- * @param reasons - the bitwise OR of the Key Reason flags giving the
- * allowed uses for the key.
- */
- public ReasonFlags(int reasons)
- : base(reasons)
- {
- }
-
- public ReasonFlags(
- DerBitString reasons)
- : base(reasons.GetBytes(), reasons.PadBits)
- {
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/RoleSyntax.cs b/BCCrypto/src/asn1/x509/RoleSyntax.cs
deleted file mode 100644
index 48c3c6c..0000000
--- a/BCCrypto/src/asn1/x509/RoleSyntax.cs
+++ /dev/null
@@ -1,230 +0,0 @@
-using System;
-using System.Text;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * Implementation of the RoleSyntax object as specified by the RFC3281.
- *
- *
- * RoleSyntax ::= SEQUENCE {
- * roleAuthority [0] GeneralNames OPTIONAL,
- * roleName [1] GeneralName
- * }
- *
- */
- public class RoleSyntax
- : Asn1Encodable
- {
- private readonly GeneralNames roleAuthority;
- private readonly GeneralName roleName;
-
- /**
- * RoleSyntax factory method.
- * @param obj the object used to construct an instance of
- * RoleSyntax. It must be an instance of RoleSyntax
- * or Asn1Sequence.
- * @return the instance of RoleSyntax built from the
- * supplied object.
- * @throws java.lang.ArgumentException if the object passed
- * to the factory is not an instance of RoleSyntax or
- * Asn1Sequence.
- */
- public static RoleSyntax GetInstance(
- object obj)
- {
- if (obj is RoleSyntax)
- return (RoleSyntax)obj;
-
- if (obj != null)
- return new RoleSyntax(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- /**
- * Constructor.
- * @param roleAuthority the role authority of this RoleSyntax.
- * @param roleName the role name of this RoleSyntax.
- */
- public RoleSyntax(
- GeneralNames roleAuthority,
- GeneralName roleName)
- {
- if (roleName == null
- || roleName.TagNo != GeneralName.UniformResourceIdentifier
- || ((IAsn1String) roleName.Name).GetString().Equals(""))
- {
- throw new ArgumentException("the role name MUST be non empty and MUST " +
- "use the URI option of GeneralName");
- }
-
- this.roleAuthority = roleAuthority;
- this.roleName = roleName;
- }
-
- /**
- * Constructor. Invoking this constructor is the same as invoking
- * new RoleSyntax(null, roleName).
- * @param roleName the role name of this RoleSyntax.
- */
- public RoleSyntax(
- GeneralName roleName)
- : this(null, roleName)
- {
- }
-
- /**
- * Utility constructor. Takes a string argument representing
- * the role name, builds a GeneralName to hold the role name
- * and calls the constructor that takes a GeneralName.
- * @param roleName
- */
- public RoleSyntax(
- string roleName)
- : this(new GeneralName(GeneralName.UniformResourceIdentifier,
- (roleName == null)? "": roleName))
- {
- }
-
- /**
- * Constructor that builds an instance of RoleSyntax by
- * extracting the encoded elements from the Asn1Sequence
- * object supplied.
- * @param seq an instance of Asn1Sequence that holds
- * the encoded elements used to build this RoleSyntax.
- */
- private RoleSyntax(
- Asn1Sequence seq)
- {
- if (seq.Count < 1 || seq.Count > 2)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
-
- for (int i = 0; i != seq.Count; i++)
- {
- Asn1TaggedObject taggedObject = Asn1TaggedObject.GetInstance(seq[i]);
- switch (taggedObject.TagNo)
- {
- case 0:
- roleAuthority = GeneralNames.GetInstance(taggedObject, false);
- break;
- case 1:
- roleName = GeneralName.GetInstance(taggedObject, true);
- break;
- default:
- throw new ArgumentException("Unknown tag in RoleSyntax");
- }
- }
- }
-
- /**
- * Gets the role authority of this RoleSyntax.
- * @return an instance of GeneralNames holding the
- * role authority of this RoleSyntax.
- */
- public GeneralNames RoleAuthority
- {
- get { return this.roleAuthority; }
- }
-
- /**
- * Gets the role name of this RoleSyntax.
- * @return an instance of GeneralName holding the
- * role name of this RoleSyntax.
- */
- public GeneralName RoleName
- {
- get { return this.roleName; }
- }
-
- /**
- * Gets the role name as a java.lang.string object.
- * @return the role name of this RoleSyntax represented as a
- * string object.
- */
- public string GetRoleNameAsString()
- {
- return ((IAsn1String) this.roleName.Name).GetString();
- }
-
- /**
- * Gets the role authority as a string[] object.
- * @return the role authority of this RoleSyntax represented as a
- * string[] array.
- */
- public string[] GetRoleAuthorityAsString()
- {
- if (roleAuthority == null)
- {
- return new string[0];
- }
-
- GeneralName[] names = roleAuthority.GetNames();
- string[] namesString = new string[names.Length];
- for(int i = 0; i < names.Length; i++)
- {
- Asn1Encodable asn1Value = names[i].Name;
- if (asn1Value is IAsn1String)
- {
- namesString[i] = ((IAsn1String) asn1Value).GetString();
- }
- else
- {
- namesString[i] = asn1Value.ToString();
- }
- }
-
- return namesString;
- }
-
- /**
- * Implementation of the method ToAsn1Object as
- * required by the superclass ASN1Encodable.
- *
- *
- * RoleSyntax ::= SEQUENCE {
- * roleAuthority [0] GeneralNames OPTIONAL,
- * roleName [1] GeneralName
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (this.roleAuthority != null)
- {
- v.Add(new DerTaggedObject(false, 0, roleAuthority));
- }
-
- v.Add(new DerTaggedObject(true, 1, roleName));
-
- return new DerSequence(v);
- }
-
- public override string ToString()
- {
- StringBuilder buff = new StringBuilder("Name: " + this.GetRoleNameAsString() +
- " - Auth: ");
-
- if (this.roleAuthority == null || roleAuthority.GetNames().Length == 0)
- {
- buff.Append("N/A");
- }
- else
- {
- string[] names = this.GetRoleAuthorityAsString();
- buff.Append('[').Append(names[0]);
- for(int i = 1; i < names.Length; i++)
- {
- buff.Append(", ").Append(names[i]);
- }
- buff.Append(']');
- }
-
- return buff.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/SubjectDirectoryAttributes.cs b/BCCrypto/src/asn1/x509/SubjectDirectoryAttributes.cs
deleted file mode 100644
index 77923e0..0000000
--- a/BCCrypto/src/asn1/x509/SubjectDirectoryAttributes.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * This extension may contain further X.500 attributes of the subject. See also
- * RFC 3039.
- *
- *
- * SubjectDirectoryAttributes ::= Attributes
- * Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute
- * Attribute ::= SEQUENCE
- * {
- * type AttributeType
- * values SET OF AttributeValue
- * }
- *
- * AttributeType ::= OBJECT IDENTIFIER
- * AttributeValue ::= ANY DEFINED BY AttributeType
- *
- *
- * @see org.bouncycastle.asn1.x509.X509Name for AttributeType ObjectIdentifiers.
- */
- public class SubjectDirectoryAttributes
- : Asn1Encodable
- {
- private readonly IList attributes;
-
- public static SubjectDirectoryAttributes GetInstance(
- object obj)
- {
- if (obj == null || obj is SubjectDirectoryAttributes)
- {
- return (SubjectDirectoryAttributes) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new SubjectDirectoryAttributes((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from Asn1Sequence.
- *
- * The sequence is of type SubjectDirectoryAttributes:
- *
- *
- * SubjectDirectoryAttributes ::= Attributes
- * Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute
- * Attribute ::= SEQUENCE
- * {
- * type AttributeType
- * values SET OF AttributeValue
- * }
- *
- * AttributeType ::= OBJECT IDENTIFIER
- * AttributeValue ::= ANY DEFINED BY AttributeType
- *
- *
- * @param seq
- * The ASN.1 sequence.
- */
- private SubjectDirectoryAttributes(
- Asn1Sequence seq)
- {
- this.attributes = Platform.CreateArrayList();
- foreach (object o in seq)
- {
- Asn1Sequence s = Asn1Sequence.GetInstance(o);
- attributes.Add(AttributeX509.GetInstance(s));
- }
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- [Obsolete]
- public SubjectDirectoryAttributes(
- ArrayList attributes)
- : this((IList)attributes)
- {
- }
-#endif
-
- /**
- * Constructor from an ArrayList of attributes.
- *
- * The ArrayList consists of attributes of type {@link Attribute Attribute}
- *
- * @param attributes The attributes.
- *
- */
- public SubjectDirectoryAttributes(
- IList attributes)
- {
- this.attributes = Platform.CreateArrayList(attributes);
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * SubjectDirectoryAttributes ::= Attributes
- * Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute
- * Attribute ::= SEQUENCE
- * {
- * type AttributeType
- * values SET OF AttributeValue
- * }
- *
- * AttributeType ::= OBJECT IDENTIFIER
- * AttributeValue ::= ANY DEFINED BY AttributeType
- *
- *
- * @return a DERObject
- */
- public override Asn1Object ToAsn1Object()
- {
- AttributeX509[] v = new AttributeX509[attributes.Count];
- for (int i = 0; i < attributes.Count; ++i)
- {
- v[i] = (AttributeX509)attributes[i];
- }
- return new DerSequence(v);
- }
-
- /**
- * @return Returns the attributes.
- */
- public IEnumerable Attributes
- {
- get { return new EnumerableProxy(attributes); }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/SubjectKeyIdentifier.cs b/BCCrypto/src/asn1/x509/SubjectKeyIdentifier.cs
deleted file mode 100644
index f2e6cc0..0000000
--- a/BCCrypto/src/asn1/x509/SubjectKeyIdentifier.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The SubjectKeyIdentifier object.
- *
- * SubjectKeyIdentifier::= OCTET STRING
- *
- */
- public class SubjectKeyIdentifier
- : Asn1Encodable
- {
- private readonly byte[] keyIdentifier;
-
- public static SubjectKeyIdentifier GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1OctetString.GetInstance(obj, explicitly));
- }
-
- public static SubjectKeyIdentifier GetInstance(
- object obj)
- {
- if (obj is SubjectKeyIdentifier)
- {
- return (SubjectKeyIdentifier) obj;
- }
-
- if (obj is SubjectPublicKeyInfo)
- {
- return new SubjectKeyIdentifier((SubjectPublicKeyInfo) obj);
- }
-
- if (obj is Asn1OctetString)
- {
- return new SubjectKeyIdentifier((Asn1OctetString) obj);
- }
-
- if (obj is X509Extension)
- {
- return GetInstance(X509Extension.ConvertValueToObject((X509Extension) obj));
- }
-
- throw new ArgumentException("Invalid SubjectKeyIdentifier: " + Platform.GetTypeName(obj));
- }
-
- public SubjectKeyIdentifier(
- byte[] keyID)
- {
- if (keyID == null)
- throw new ArgumentNullException("keyID");
-
- this.keyIdentifier = keyID;
- }
-
- public SubjectKeyIdentifier(
- Asn1OctetString keyID)
- {
- this.keyIdentifier = keyID.GetOctets();
- }
-
- /**
- * Calculates the keyIdentifier using a SHA1 hash over the BIT STRING
- * from SubjectPublicKeyInfo as defined in RFC3280.
- *
- * @param spki the subject public key info.
- */
- public SubjectKeyIdentifier(
- SubjectPublicKeyInfo spki)
- {
- this.keyIdentifier = GetDigest(spki);
- }
-
- public byte[] GetKeyIdentifier()
- {
- return keyIdentifier;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerOctetString(keyIdentifier);
- }
-
- /**
- * Return a RFC 3280 type 1 key identifier. As in:
- *
- * (1) The keyIdentifier is composed of the 160-bit SHA-1 hash of the
- * value of the BIT STRING subjectPublicKey (excluding the tag,
- * length, and number of unused bits).
- *
- * @param keyInfo the key info object containing the subjectPublicKey field.
- * @return the key identifier.
- */
- public static SubjectKeyIdentifier CreateSha1KeyIdentifier(
- SubjectPublicKeyInfo keyInfo)
- {
- return new SubjectKeyIdentifier(keyInfo);
- }
-
- /**
- * Return a RFC 3280 type 2 key identifier. As in:
- *
- * (2) The keyIdentifier is composed of a four bit type field with
- * the value 0100 followed by the least significant 60 bits of the
- * SHA-1 hash of the value of the BIT STRING subjectPublicKey.
- *
- * @param keyInfo the key info object containing the subjectPublicKey field.
- * @return the key identifier.
- */
- public static SubjectKeyIdentifier CreateTruncatedSha1KeyIdentifier(
- SubjectPublicKeyInfo keyInfo)
- {
- byte[] dig = GetDigest(keyInfo);
- byte[] id = new byte[8];
-
- Array.Copy(dig, dig.Length - 8, id, 0, id.Length);
-
- id[0] &= 0x0f;
- id[0] |= 0x40;
-
- return new SubjectKeyIdentifier(id);
- }
-
- private static byte[] GetDigest(
- SubjectPublicKeyInfo spki)
- {
- IDigest digest = new Sha1Digest();
- byte[] resBuf = new byte[digest.GetDigestSize()];
-
- byte[] bytes = spki.PublicKeyData.GetBytes();
- digest.BlockUpdate(bytes, 0, bytes.Length);
- digest.DoFinal(resBuf, 0);
- return resBuf;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/SubjectPublicKeyInfo.cs b/BCCrypto/src/asn1/x509/SubjectPublicKeyInfo.cs
deleted file mode 100644
index 477329b..0000000
--- a/BCCrypto/src/asn1/x509/SubjectPublicKeyInfo.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The object that contains the public key stored in a certficate.
- *
- * The GetEncoded() method in the public keys in the JCE produces a DER
- * encoded one of these.
- */
- public class SubjectPublicKeyInfo
- : Asn1Encodable
- {
- private readonly AlgorithmIdentifier algID;
- private readonly DerBitString keyData;
-
- public static SubjectPublicKeyInfo GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static SubjectPublicKeyInfo GetInstance(
- object obj)
- {
- if (obj is SubjectPublicKeyInfo)
- return (SubjectPublicKeyInfo) obj;
-
- if (obj != null)
- return new SubjectPublicKeyInfo(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- public SubjectPublicKeyInfo(
- AlgorithmIdentifier algID,
- Asn1Encodable publicKey)
- {
- this.keyData = new DerBitString(publicKey);
- this.algID = algID;
- }
-
- public SubjectPublicKeyInfo(
- AlgorithmIdentifier algID,
- byte[] publicKey)
- {
- this.keyData = new DerBitString(publicKey);
- this.algID = algID;
- }
-
- private SubjectPublicKeyInfo(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.algID = AlgorithmIdentifier.GetInstance(seq[0]);
- this.keyData = DerBitString.GetInstance(seq[1]);
- }
-
- public AlgorithmIdentifier AlgorithmID
- {
- get { return algID; }
- }
-
- /**
- * for when the public key is an encoded object - if the bitstring
- * can't be decoded this routine raises an IOException.
- *
- * @exception IOException - if the bit string doesn't represent a Der
- * encoded object.
- */
- public Asn1Object GetPublicKey()
- {
- return Asn1Object.FromByteArray(keyData.GetOctets());
- }
-
- /**
- * for when the public key is raw bits...
- */
- public DerBitString PublicKeyData
- {
- get { return keyData; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * SubjectPublicKeyInfo ::= Sequence {
- * algorithm AlgorithmIdentifier,
- * publicKey BIT STRING }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(algID, keyData);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/TBSCertList.cs b/BCCrypto/src/asn1/x509/TBSCertList.cs
deleted file mode 100644
index 5767a7f..0000000
--- a/BCCrypto/src/asn1/x509/TBSCertList.cs
+++ /dev/null
@@ -1,275 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class CrlEntry
- : Asn1Encodable
- {
- internal Asn1Sequence seq;
- internal DerInteger userCertificate;
- internal Time revocationDate;
- internal X509Extensions crlEntryExtensions;
-
- public CrlEntry(
- Asn1Sequence seq)
- {
- if (seq.Count < 2 || seq.Count > 3)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
-
- this.seq = seq;
-
- userCertificate = DerInteger.GetInstance(seq[0]);
- revocationDate = Time.GetInstance(seq[1]);
- }
-
- public DerInteger UserCertificate
- {
- get { return userCertificate; }
- }
-
- public Time RevocationDate
- {
- get { return revocationDate; }
- }
-
- public X509Extensions Extensions
- {
- get
- {
- if (crlEntryExtensions == null && seq.Count == 3)
- {
- crlEntryExtensions = X509Extensions.GetInstance(seq[2]);
- }
-
- return crlEntryExtensions;
- }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return seq;
- }
- }
-
- /**
- * PKIX RFC-2459 - TbsCertList object.
- *
- * TbsCertList ::= Sequence {
- * version Version OPTIONAL,
- * -- if present, shall be v2
- * signature AlgorithmIdentifier,
- * issuer Name,
- * thisUpdate Time,
- * nextUpdate Time OPTIONAL,
- * revokedCertificates Sequence OF Sequence {
- * userCertificate CertificateSerialNumber,
- * revocationDate Time,
- * crlEntryExtensions Extensions OPTIONAL
- * -- if present, shall be v2
- * } OPTIONAL,
- * crlExtensions [0] EXPLICIT Extensions OPTIONAL
- * -- if present, shall be v2
- * }
- *
- */
- public class TbsCertificateList
- : Asn1Encodable
- {
- private class RevokedCertificatesEnumeration
- : IEnumerable
- {
- private readonly IEnumerable en;
-
- internal RevokedCertificatesEnumeration(
- IEnumerable en)
- {
- this.en = en;
- }
-
- public IEnumerator GetEnumerator()
- {
- return new RevokedCertificatesEnumerator(en.GetEnumerator());
- }
-
- private class RevokedCertificatesEnumerator
- : IEnumerator
- {
- private readonly IEnumerator e;
-
- internal RevokedCertificatesEnumerator(
- IEnumerator e)
- {
- this.e = e;
- }
-
- public bool MoveNext()
- {
- return e.MoveNext();
- }
-
- public void Reset()
- {
- e.Reset();
- }
-
- public object Current
- {
- get { return new CrlEntry(Asn1Sequence.GetInstance(e.Current)); }
- }
- }
- }
-
- internal Asn1Sequence seq;
- internal DerInteger version;
- internal AlgorithmIdentifier signature;
- internal X509Name issuer;
- internal Time thisUpdate;
- internal Time nextUpdate;
- internal Asn1Sequence revokedCertificates;
- internal X509Extensions crlExtensions;
-
- public static TbsCertificateList GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static TbsCertificateList GetInstance(
- object obj)
- {
- TbsCertificateList list = obj as TbsCertificateList;
-
- if (obj == null || list != null)
- {
- return list;
- }
-
- if (obj is Asn1Sequence)
- {
- return new TbsCertificateList((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- internal TbsCertificateList(
- Asn1Sequence seq)
- {
- if (seq.Count < 3 || seq.Count > 7)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
-
- int seqPos = 0;
-
- this.seq = seq;
-
- if (seq[seqPos] is DerInteger)
- {
- version = DerInteger.GetInstance(seq[seqPos++]);
- }
- else
- {
- version = new DerInteger(0);
- }
-
- signature = AlgorithmIdentifier.GetInstance(seq[seqPos++]);
- issuer = X509Name.GetInstance(seq[seqPos++]);
- thisUpdate = Time.GetInstance(seq[seqPos++]);
-
- if (seqPos < seq.Count
- && (seq[seqPos] is DerUtcTime
- || seq[seqPos] is DerGeneralizedTime
- || seq[seqPos] is Time))
- {
- nextUpdate = Time.GetInstance(seq[seqPos++]);
- }
-
- if (seqPos < seq.Count
- && !(seq[seqPos] is DerTaggedObject))
- {
- revokedCertificates = Asn1Sequence.GetInstance(seq[seqPos++]);
- }
-
- if (seqPos < seq.Count
- && seq[seqPos] is DerTaggedObject)
- {
- crlExtensions = X509Extensions.GetInstance(seq[seqPos]);
- }
- }
-
- public int Version
- {
- get { return version.Value.IntValue + 1; }
- }
-
- public DerInteger VersionNumber
- {
- get { return version; }
- }
-
- public AlgorithmIdentifier Signature
- {
- get { return signature; }
- }
-
- public X509Name Issuer
- {
- get { return issuer; }
- }
-
- public Time ThisUpdate
- {
- get { return thisUpdate; }
- }
-
- public Time NextUpdate
- {
- get { return nextUpdate; }
- }
-
- public CrlEntry[] GetRevokedCertificates()
- {
- if (revokedCertificates == null)
- {
- return new CrlEntry[0];
- }
-
- CrlEntry[] entries = new CrlEntry[revokedCertificates.Count];
-
- for (int i = 0; i < entries.Length; i++)
- {
- entries[i] = new CrlEntry(Asn1Sequence.GetInstance(revokedCertificates[i]));
- }
-
- return entries;
- }
-
- public IEnumerable GetRevokedCertificateEnumeration()
- {
- if (revokedCertificates == null)
- {
- return EmptyEnumerable.Instance;
- }
-
- return new RevokedCertificatesEnumeration(revokedCertificates);
- }
-
- public X509Extensions Extensions
- {
- get { return crlExtensions; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return seq;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/TBSCertificateStructure.cs b/BCCrypto/src/asn1/x509/TBSCertificateStructure.cs
deleted file mode 100644
index fc7c39b..0000000
--- a/BCCrypto/src/asn1/x509/TBSCertificateStructure.cs
+++ /dev/null
@@ -1,185 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Pkcs;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The TbsCertificate object.
- *
- * TbsCertificate ::= Sequence {
- * version [ 0 ] Version DEFAULT v1(0),
- * serialNumber CertificateSerialNumber,
- * signature AlgorithmIdentifier,
- * issuer Name,
- * validity Validity,
- * subject Name,
- * subjectPublicKeyInfo SubjectPublicKeyInfo,
- * issuerUniqueID [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
- * subjectUniqueID [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
- * extensions [ 3 ] Extensions OPTIONAL
- * }
- *
- *
- * Note: issuerUniqueID and subjectUniqueID are both deprecated by the IETF. This class
- * will parse them, but you really shouldn't be creating new ones.
- */
- public class TbsCertificateStructure
- : Asn1Encodable
- {
- internal Asn1Sequence seq;
- internal DerInteger version;
- internal DerInteger serialNumber;
- internal AlgorithmIdentifier signature;
- internal X509Name issuer;
- internal Time startDate, endDate;
- internal X509Name subject;
- internal SubjectPublicKeyInfo subjectPublicKeyInfo;
- internal DerBitString issuerUniqueID;
- internal DerBitString subjectUniqueID;
- internal X509Extensions extensions;
-
- public static TbsCertificateStructure GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static TbsCertificateStructure GetInstance(
- object obj)
- {
- if (obj is TbsCertificateStructure)
- return (TbsCertificateStructure) obj;
-
- if (obj != null)
- return new TbsCertificateStructure(Asn1Sequence.GetInstance(obj));
-
- return null;
- }
-
- internal TbsCertificateStructure(
- Asn1Sequence seq)
- {
- int seqStart = 0;
-
- this.seq = seq;
-
- //
- // some certficates don't include a version number - we assume v1
- //
- if (seq[0] is DerTaggedObject)
- {
- version = DerInteger.GetInstance((Asn1TaggedObject)seq[0], true);
- }
- else
- {
- seqStart = -1; // field 0 is missing!
- version = new DerInteger(0);
- }
-
- serialNumber = DerInteger.GetInstance(seq[seqStart + 1]);
-
- signature = AlgorithmIdentifier.GetInstance(seq[seqStart + 2]);
- issuer = X509Name.GetInstance(seq[seqStart + 3]);
-
- //
- // before and after dates
- //
- Asn1Sequence dates = (Asn1Sequence)seq[seqStart + 4];
-
- startDate = Time.GetInstance(dates[0]);
- endDate = Time.GetInstance(dates[1]);
-
- subject = X509Name.GetInstance(seq[seqStart + 5]);
-
- //
- // public key info.
- //
- subjectPublicKeyInfo = SubjectPublicKeyInfo.GetInstance(seq[seqStart + 6]);
-
- for (int extras = seq.Count - (seqStart + 6) - 1; extras > 0; extras--)
- {
- DerTaggedObject extra = (DerTaggedObject) seq[seqStart + 6 + extras];
-
- switch (extra.TagNo)
- {
- case 1:
- issuerUniqueID = DerBitString.GetInstance(extra, false);
- break;
- case 2:
- subjectUniqueID = DerBitString.GetInstance(extra, false);
- break;
- case 3:
- extensions = X509Extensions.GetInstance(extra);
- break;
- }
- }
- }
-
- public int Version
- {
- get { return version.Value.IntValue + 1; }
- }
-
- public DerInteger VersionNumber
- {
- get { return version; }
- }
-
- public DerInteger SerialNumber
- {
- get { return serialNumber; }
- }
-
- public AlgorithmIdentifier Signature
- {
- get { return signature; }
- }
-
- public X509Name Issuer
- {
- get { return issuer; }
- }
-
- public Time StartDate
- {
- get { return startDate; }
- }
-
- public Time EndDate
- {
- get { return endDate; }
- }
-
- public X509Name Subject
- {
- get { return subject; }
- }
-
- public SubjectPublicKeyInfo SubjectPublicKeyInfo
- {
- get { return subjectPublicKeyInfo; }
- }
-
- public DerBitString IssuerUniqueID
- {
- get { return issuerUniqueID; }
- }
-
- public DerBitString SubjectUniqueID
- {
- get { return subjectUniqueID; }
- }
-
- public X509Extensions Extensions
- {
- get { return extensions; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return seq;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/Target.cs b/BCCrypto/src/asn1/x509/Target.cs
deleted file mode 100644
index 7c4f9db..0000000
--- a/BCCrypto/src/asn1/x509/Target.cs
+++ /dev/null
@@ -1,141 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * Target structure used in target information extension for attribute
- * certificates from RFC 3281.
- *
- *
- * Target ::= CHOICE {
- * targetName [0] GeneralName,
- * targetGroup [1] GeneralName,
- * targetCert [2] TargetCert
- * }
- *
- *
- *
- * The targetCert field is currently not supported and must not be used
- * according to RFC 3281.
- */
- public class Target
- : Asn1Encodable, IAsn1Choice
- {
- public enum Choice
- {
- Name = 0,
- Group = 1
- };
-
- private readonly GeneralName targetName;
- private readonly GeneralName targetGroup;
-
- /**
- * Creates an instance of a Target from the given object.
- *
- * obj can be a Target or a {@link Asn1TaggedObject}
- *
- * @param obj The object.
- * @return A Target instance.
- * @throws ArgumentException if the given object cannot be
- * interpreted as Target.
- */
- public static Target GetInstance(
- object obj)
- {
- if (obj is Target)
- {
- return (Target) obj;
- }
-
- if (obj is Asn1TaggedObject)
- {
- return new Target((Asn1TaggedObject) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from Asn1TaggedObject.
- *
- * @param tagObj The tagged object.
- * @throws ArgumentException if the encoding is wrong.
- */
- private Target(
- Asn1TaggedObject tagObj)
- {
- switch ((Choice) tagObj.TagNo)
- {
- case Choice.Name: // GeneralName is already a choice so explicit
- targetName = GeneralName.GetInstance(tagObj, true);
- break;
- case Choice.Group:
- targetGroup = GeneralName.GetInstance(tagObj, true);
- break;
- default:
- throw new ArgumentException("unknown tag: " + tagObj.TagNo);
- }
- }
-
- /**
- * Constructor from given details.
- *
- * Exactly one of the parameters must be not null.
- *
- * @param type the choice type to apply to the name.
- * @param name the general name.
- * @throws ArgumentException if type is invalid.
- */
- public Target(
- Choice type,
- GeneralName name)
- : this(new DerTaggedObject((int) type, name))
- {
- }
-
- /**
- * @return Returns the targetGroup.
- */
- public virtual GeneralName TargetGroup
- {
- get { return targetGroup; }
- }
-
- /**
- * @return Returns the targetName.
- */
- public virtual GeneralName TargetName
- {
- get { return targetName; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * Target ::= CHOICE {
- * targetName [0] GeneralName,
- * targetGroup [1] GeneralName,
- * targetCert [2] TargetCert
- * }
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- // GeneralName is a choice already so most be explicitly tagged
- if (targetName != null)
- {
- return new DerTaggedObject(true, 0, targetName);
- }
-
- return new DerTaggedObject(true, 1, targetGroup);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/TargetInformation.cs b/BCCrypto/src/asn1/x509/TargetInformation.cs
deleted file mode 100644
index 2bf2189..0000000
--- a/BCCrypto/src/asn1/x509/TargetInformation.cs
+++ /dev/null
@@ -1,125 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * Target information extension for attributes certificates according to RFC
- * 3281.
- *
- *
- * SEQUENCE OF Targets
- *
- *
- */
- public class TargetInformation
- : Asn1Encodable
- {
- private readonly Asn1Sequence targets;
-
- /**
- * Creates an instance of a TargetInformation from the given object.
- *
- * obj can be a TargetInformation or a {@link Asn1Sequence}
- *
- * @param obj The object.
- * @return A TargetInformation instance.
- * @throws ArgumentException if the given object cannot be interpreted as TargetInformation.
- */
- public static TargetInformation GetInstance(
- object obj)
- {
- if (obj is TargetInformation)
- {
- return (TargetInformation) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new TargetInformation((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from a Asn1Sequence.
- *
- * @param seq The Asn1Sequence.
- * @throws ArgumentException if the sequence does not contain
- * correctly encoded Targets elements.
- */
- private TargetInformation(
- Asn1Sequence targets)
- {
- this.targets = targets;
- }
-
- /**
- * Returns the targets in this target information extension.
- *
- * The ArrayList is cloned before it is returned.
- *
- * @return Returns the targets.
- */
- public virtual Targets[] GetTargetsObjects()
- {
- Targets[] result = new Targets[targets.Count];
-
- for (int i = 0; i < targets.Count; ++i)
- {
- result[i] = Targets.GetInstance(targets[i]);
- }
-
- return result;
- }
-
- /**
- * Constructs a target information from a single targets element.
- * According to RFC 3281 only one targets element must be produced.
- *
- * @param targets A Targets instance.
- */
- public TargetInformation(
- Targets targets)
- {
- this.targets = new DerSequence(targets);
- }
-
- /**
- * According to RFC 3281 only one targets element must be produced. If
- * multiple targets are given they must be merged in
- * into one targets element.
- *
- * @param targets An array with {@link Targets}.
- */
- public TargetInformation(
- Target[] targets)
- : this(new Targets(targets))
- {
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * SEQUENCE OF Targets
- *
- *
- *
- * According to RFC 3281 only one targets element must be produced. If
- * multiple targets are given in the constructor they are merged into one
- * targets element. If this was produced from a
- * {@link Org.BouncyCastle.Asn1.Asn1Sequence} the encoding is kept.
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- return targets;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/Targets.cs b/BCCrypto/src/asn1/x509/Targets.cs
deleted file mode 100644
index 0387e1f..0000000
--- a/BCCrypto/src/asn1/x509/Targets.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * Targets structure used in target information extension for attribute
- * certificates from RFC 3281.
- *
- *
- * Targets ::= SEQUENCE OF Target
- *
- * Target ::= CHOICE {
- * targetName [0] GeneralName,
- * targetGroup [1] GeneralName,
- * targetCert [2] TargetCert
- * }
- *
- * TargetCert ::= SEQUENCE {
- * targetCertificate IssuerSerial,
- * targetName GeneralName OPTIONAL,
- * certDigestInfo ObjectDigestInfo OPTIONAL
- * }
- *
- *
- * @see org.bouncycastle.asn1.x509.Target
- * @see org.bouncycastle.asn1.x509.TargetInformation
- */
- public class Targets
- : Asn1Encodable
- {
- private readonly Asn1Sequence targets;
-
- /**
- * Creates an instance of a Targets from the given object.
- *
- * obj can be a Targets or a {@link Asn1Sequence}
- *
- * @param obj The object.
- * @return A Targets instance.
- * @throws ArgumentException if the given object cannot be interpreted as Target.
- */
- public static Targets GetInstance(
- object obj)
- {
- if (obj is Targets)
- {
- return (Targets) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new Targets((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from Asn1Sequence.
- *
- * @param targets The ASN.1 SEQUENCE.
- * @throws ArgumentException if the contents of the sequence are
- * invalid.
- */
- private Targets(
- Asn1Sequence targets)
- {
- this.targets = targets;
- }
-
- /**
- * Constructor from given targets.
- *
- * The ArrayList is copied.
- *
- * @param targets An ArrayList of {@link Target}s.
- * @see Target
- * @throws ArgumentException if the ArrayList contains not only Targets.
- */
- public Targets(
- Target[] targets)
- {
- this.targets = new DerSequence(targets);
- }
-
- /**
- * Returns the targets in an ArrayList.
- *
- * The ArrayList is cloned before it is returned.
- *
- * @return Returns the targets.
- */
- public virtual Target[] GetTargets()
- {
- Target[] result = new Target[targets.Count];
-
- for (int i = 0; i < targets.Count; ++i)
- {
- result[i] = Target.GetInstance(targets[i]);
- }
-
- return result;
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * Targets ::= SEQUENCE OF Target
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- return targets;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/Time.cs b/BCCrypto/src/asn1/x509/Time.cs
deleted file mode 100644
index fa3936d..0000000
--- a/BCCrypto/src/asn1/x509/Time.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-using System;
-using System.Globalization;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class Time
- : Asn1Encodable, IAsn1Choice
- {
- private readonly Asn1Object time;
-
- public static Time GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(obj.GetObject());
- }
-
- public Time(
- Asn1Object time)
- {
- if (time == null)
- throw new ArgumentNullException("time");
- if (!(time is DerUtcTime) && !(time is DerGeneralizedTime))
- throw new ArgumentException("unknown object passed to Time");
-
- this.time = time;
- }
-
- /**
- * creates a time object from a given date - if the date is between 1950
- * and 2049 a UTCTime object is Generated, otherwise a GeneralizedTime
- * is used.
- */
- public Time(
- DateTime date)
- {
-#if PORTABLE
- string d = date.ToUniversalTime().ToString("yyyyMMddHHmmss", CultureInfo.InvariantCulture) + "Z";
-#else
- string d = date.ToString("yyyyMMddHHmmss", CultureInfo.InvariantCulture) + "Z";
-#endif
-
- int year = int.Parse(d.Substring(0, 4));
-
- if (year < 1950 || year > 2049)
- {
- time = new DerGeneralizedTime(d);
- }
- else
- {
- time = new DerUtcTime(d.Substring(2));
- }
- }
-
- public static Time GetInstance(
- object obj)
- {
- if (obj == null || obj is Time)
- return (Time)obj;
- if (obj is DerUtcTime)
- return new Time((DerUtcTime)obj);
- if (obj is DerGeneralizedTime)
- return new Time((DerGeneralizedTime)obj);
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- public string GetTime()
- {
- if (time is DerUtcTime)
- {
- return ((DerUtcTime) time).AdjustedTimeString;
- }
-
- return ((DerGeneralizedTime) time).GetTime();
- }
-
- ///
- /// Return our time as DateTime.
- ///
- /// A date time.
- public DateTime ToDateTime()
- {
- try
- {
- if (time is DerUtcTime)
- {
- return ((DerUtcTime)time).ToAdjustedDateTime();
- }
- else
- {
- return ((DerGeneralizedTime)time).ToDateTime();
- }
- }
- catch (FormatException e)
- {
- // this should never happen
- throw new InvalidOperationException("invalid date string: " + e.Message);
- }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Time ::= CHOICE {
- * utcTime UTCTime,
- * generalTime GeneralizedTime }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return time;
- }
-
- public override string ToString()
- {
- return GetTime();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/UserNotice.cs b/BCCrypto/src/asn1/x509/UserNotice.cs
deleted file mode 100644
index f409164..0000000
--- a/BCCrypto/src/asn1/x509/UserNotice.cs
+++ /dev/null
@@ -1,130 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * UserNotice class, used in
- * CertificatePolicies X509 extensions (in policy
- * qualifiers).
- *
- * UserNotice ::= Sequence {
- * noticeRef NoticeReference OPTIONAL,
- * explicitText DisplayText OPTIONAL}
- *
- *
- *
- * @see PolicyQualifierId
- * @see PolicyInformation
- */
- public class UserNotice
- : Asn1Encodable
- {
- private readonly NoticeReference noticeRef;
- private readonly DisplayText explicitText;
-
- /**
- * Creates a new UserNotice instance.
- *
- * @param noticeRef a NoticeReference value
- * @param explicitText a DisplayText value
- */
- public UserNotice(
- NoticeReference noticeRef,
- DisplayText explicitText)
- {
- this.noticeRef = noticeRef;
- this.explicitText = explicitText;
- }
-
- /**
- * Creates a new UserNotice instance.
- *
- * @param noticeRef a NoticeReference value
- * @param str the explicitText field as a string.
- */
- public UserNotice(
- NoticeReference noticeRef,
- string str)
- : this(noticeRef, new DisplayText(str))
- {
- }
-
- /**
- * Creates a new UserNotice instance.
- * Useful from reconstructing a UserNotice instance
- * from its encodable/encoded form.
- *
- * @param as an ASN1Sequence value obtained from either
- * calling @{link toASN1Object()} for a UserNotice
- * instance or from parsing it from a DER-encoded stream.
- */
- [Obsolete("Use GetInstance() instead")]
- public UserNotice(
- Asn1Sequence seq)
- {
- if (seq.Count == 2)
- {
- noticeRef = NoticeReference.GetInstance(seq[0]);
- explicitText = DisplayText.GetInstance(seq[1]);
- }
- else if (seq.Count == 1)
- {
- if (seq[0].ToAsn1Object() is Asn1Sequence)
- {
- noticeRef = NoticeReference.GetInstance(seq[0]);
- explicitText = null;
- }
- else
- {
- noticeRef = null;
- explicitText = DisplayText.GetInstance(seq[0]);
- }
- }
- else if (seq.Count == 0)
- {
- noticeRef = null; // neither field set!
- explicitText = null;
- }
- else
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
- }
-
- public static UserNotice GetInstance(object obj)
- {
- if (obj is UserNotice)
- return (UserNotice)obj;
- if (obj == null)
- return null;
- return new UserNotice(Asn1Sequence.GetInstance(obj));
- }
-
- public virtual NoticeReference NoticeRef
- {
- get { return noticeRef; }
- }
-
- public virtual DisplayText ExplicitText
- {
- get { return explicitText; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector av = new Asn1EncodableVector();
-
- if (noticeRef != null)
- {
- av.Add(noticeRef);
- }
-
- if (explicitText != null)
- {
- av.Add(explicitText);
- }
-
- return new DerSequence(av);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/V1TBSCertificateGenerator.cs b/BCCrypto/src/asn1/x509/V1TBSCertificateGenerator.cs
deleted file mode 100644
index 20b525a..0000000
--- a/BCCrypto/src/asn1/x509/V1TBSCertificateGenerator.cs
+++ /dev/null
@@ -1,108 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * Generator for Version 1 TbsCertificateStructures.
- *
- * TbsCertificate ::= Sequence {
- * version [ 0 ] Version DEFAULT v1(0),
- * serialNumber CertificateSerialNumber,
- * signature AlgorithmIdentifier,
- * issuer Name,
- * validity Validity,
- * subject Name,
- * subjectPublicKeyInfo SubjectPublicKeyInfo,
- * }
- *
- *
- */
- public class V1TbsCertificateGenerator
- {
- internal DerTaggedObject version = new DerTaggedObject(0, new DerInteger(0));
- internal DerInteger serialNumber;
- internal AlgorithmIdentifier signature;
- internal X509Name issuer;
- internal Time startDate, endDate;
- internal X509Name subject;
- internal SubjectPublicKeyInfo subjectPublicKeyInfo;
-
- public V1TbsCertificateGenerator()
- {
- }
-
- public void SetSerialNumber(
- DerInteger serialNumber)
- {
- this.serialNumber = serialNumber;
- }
-
- public void SetSignature(
- AlgorithmIdentifier signature)
- {
- this.signature = signature;
- }
-
- public void SetIssuer(
- X509Name issuer)
- {
- this.issuer = issuer;
- }
-
- public void SetStartDate(
- Time startDate)
- {
- this.startDate = startDate;
- }
-
- public void SetStartDate(
- DerUtcTime startDate)
- {
- this.startDate = new Time(startDate);
- }
-
- public void SetEndDate(
- Time endDate)
- {
- this.endDate = endDate;
- }
-
- public void SetEndDate(
- DerUtcTime endDate)
- {
- this.endDate = new Time(endDate);
- }
-
- public void SetSubject(
- X509Name subject)
- {
- this.subject = subject;
- }
-
- public void SetSubjectPublicKeyInfo(
- SubjectPublicKeyInfo pubKeyInfo)
- {
- this.subjectPublicKeyInfo = pubKeyInfo;
- }
-
- public TbsCertificateStructure GenerateTbsCertificate()
- {
- if ((serialNumber == null) || (signature == null)
- || (issuer == null) || (startDate == null) || (endDate == null)
- || (subject == null) || (subjectPublicKeyInfo == null))
- {
- throw new InvalidOperationException("not all mandatory fields set in V1 TBScertificate generator");
- }
-
- return new TbsCertificateStructure(
- new DerSequence(
- //version, - not required as default value
- serialNumber,
- signature,
- issuer,
- new DerSequence(startDate, endDate), // before and after dates
- subject,
- subjectPublicKeyInfo));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/V2AttributeCertificateInfoGenerator.cs b/BCCrypto/src/asn1/x509/V2AttributeCertificateInfoGenerator.cs
deleted file mode 100644
index 02580b5..0000000
--- a/BCCrypto/src/asn1/x509/V2AttributeCertificateInfoGenerator.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * Generator for Version 2 AttributeCertificateInfo
- *
- * AttributeCertificateInfo ::= Sequence {
- * version AttCertVersion -- version is v2,
- * holder Holder,
- * issuer AttCertIssuer,
- * signature AlgorithmIdentifier,
- * serialNumber CertificateSerialNumber,
- * attrCertValidityPeriod AttCertValidityPeriod,
- * attributes Sequence OF Attr,
- * issuerUniqueID UniqueIdentifier OPTIONAL,
- * extensions Extensions OPTIONAL
- * }
- *
- *
- */
- public class V2AttributeCertificateInfoGenerator
- {
- internal DerInteger version;
- internal Holder holder;
- internal AttCertIssuer issuer;
- internal AlgorithmIdentifier signature;
- internal DerInteger serialNumber;
-// internal AttCertValidityPeriod attrCertValidityPeriod;
- internal Asn1EncodableVector attributes;
- internal DerBitString issuerUniqueID;
- internal X509Extensions extensions;
- internal DerGeneralizedTime startDate, endDate;
-
- public V2AttributeCertificateInfoGenerator()
- {
- this.version = new DerInteger(1);
- attributes = new Asn1EncodableVector();
- }
-
- public void SetHolder(
- Holder holder)
- {
- this.holder = holder;
- }
-
- public void AddAttribute(
- string oid,
- Asn1Encodable value)
- {
- attributes.Add(new AttributeX509(new DerObjectIdentifier(oid), new DerSet(value)));
- }
-
- /**
- * @param attribute
- */
- public void AddAttribute(AttributeX509 attribute)
- {
- attributes.Add(attribute);
- }
-
- public void SetSerialNumber(
- DerInteger serialNumber)
- {
- this.serialNumber = serialNumber;
- }
-
- public void SetSignature(
- AlgorithmIdentifier signature)
- {
- this.signature = signature;
- }
-
- public void SetIssuer(
- AttCertIssuer issuer)
- {
- this.issuer = issuer;
- }
-
- public void SetStartDate(
- DerGeneralizedTime startDate)
- {
- this.startDate = startDate;
- }
-
- public void SetEndDate(
- DerGeneralizedTime endDate)
- {
- this.endDate = endDate;
- }
-
- public void SetIssuerUniqueID(
- DerBitString issuerUniqueID)
- {
- this.issuerUniqueID = issuerUniqueID;
- }
-
- public void SetExtensions(
- X509Extensions extensions)
- {
- this.extensions = extensions;
- }
-
- public AttributeCertificateInfo GenerateAttributeCertificateInfo()
- {
- if ((serialNumber == null) || (signature == null)
- || (issuer == null) || (startDate == null) || (endDate == null)
- || (holder == null) || (attributes == null))
- {
- throw new InvalidOperationException("not all mandatory fields set in V2 AttributeCertificateInfo generator");
- }
-
- Asn1EncodableVector v = new Asn1EncodableVector(
- version, holder, issuer, signature, serialNumber);
-
- //
- // before and after dates => AttCertValidityPeriod
- //
- v.Add(new AttCertValidityPeriod(startDate, endDate));
-
- // Attributes
- v.Add(new DerSequence(attributes));
-
- if (issuerUniqueID != null)
- {
- v.Add(issuerUniqueID);
- }
-
- if (extensions != null)
- {
- v.Add(extensions);
- }
-
- return AttributeCertificateInfo.GetInstance(new DerSequence(v));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/V2Form.cs b/BCCrypto/src/asn1/x509/V2Form.cs
deleted file mode 100644
index 2c6e54a..0000000
--- a/BCCrypto/src/asn1/x509/V2Form.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class V2Form
- : Asn1Encodable
- {
- internal GeneralNames issuerName;
- internal IssuerSerial baseCertificateID;
- internal ObjectDigestInfo objectDigestInfo;
-
- public static V2Form GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static V2Form GetInstance(object obj)
- {
- if (obj is V2Form)
- return (V2Form)obj;
- if (obj != null)
- return new V2Form(Asn1Sequence.GetInstance(obj));
- return null;
- }
-
- public V2Form(GeneralNames issuerName)
- : this(issuerName, null, null)
- {
- }
-
- public V2Form(GeneralNames issuerName, IssuerSerial baseCertificateID)
- : this(issuerName, baseCertificateID, null)
- {
- }
-
- public V2Form(GeneralNames issuerName, ObjectDigestInfo objectDigestInfo)
- : this(issuerName, null, objectDigestInfo)
- {
- }
-
- public V2Form(
- GeneralNames issuerName,
- IssuerSerial baseCertificateID,
- ObjectDigestInfo objectDigestInfo)
- {
- this.issuerName = issuerName;
- this.baseCertificateID = baseCertificateID;
- this.objectDigestInfo = objectDigestInfo;
- }
-
- private V2Form(
- Asn1Sequence seq)
- {
- if (seq.Count > 3)
- {
- throw new ArgumentException("Bad sequence size: " + seq.Count);
- }
-
- int index = 0;
-
- if (!(seq[0] is Asn1TaggedObject))
- {
- index++;
- this.issuerName = GeneralNames.GetInstance(seq[0]);
- }
-
- for (int i = index; i != seq.Count; i++)
- {
- Asn1TaggedObject o = Asn1TaggedObject.GetInstance(seq[i]);
- if (o.TagNo == 0)
- {
- baseCertificateID = IssuerSerial.GetInstance(o, false);
- }
- else if (o.TagNo == 1)
- {
- objectDigestInfo = ObjectDigestInfo.GetInstance(o, false);
- }
- else
- {
- throw new ArgumentException("Bad tag number: " + o.TagNo);
- }
- }
- }
-
- public GeneralNames IssuerName
- {
- get { return issuerName; }
- }
-
- public IssuerSerial BaseCertificateID
- {
- get { return baseCertificateID; }
- }
-
- public ObjectDigestInfo ObjectDigestInfo
- {
- get { return objectDigestInfo; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * V2Form ::= Sequence {
- * issuerName GeneralNames OPTIONAL,
- * baseCertificateID [0] IssuerSerial OPTIONAL,
- * objectDigestInfo [1] ObjectDigestInfo OPTIONAL
- * -- issuerName MUST be present in this profile
- * -- baseCertificateID and objectDigestInfo MUST NOT
- * -- be present in this profile
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (issuerName != null)
- {
- v.Add(issuerName);
- }
-
- if (baseCertificateID != null)
- {
- v.Add(new DerTaggedObject(false, 0, baseCertificateID));
- }
-
- if (objectDigestInfo != null)
- {
- v.Add(new DerTaggedObject(false, 1, objectDigestInfo));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/V2TBSCertListGenerator.cs b/BCCrypto/src/asn1/x509/V2TBSCertListGenerator.cs
deleted file mode 100644
index 2c92918..0000000
--- a/BCCrypto/src/asn1/x509/V2TBSCertListGenerator.cs
+++ /dev/null
@@ -1,201 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * Generator for Version 2 TbsCertList structures.
- *
- * TbsCertList ::= Sequence {
- * version Version OPTIONAL,
- * -- if present, shall be v2
- * signature AlgorithmIdentifier,
- * issuer Name,
- * thisUpdate Time,
- * nextUpdate Time OPTIONAL,
- * revokedCertificates Sequence OF Sequence {
- * userCertificate CertificateSerialNumber,
- * revocationDate Time,
- * crlEntryExtensions Extensions OPTIONAL
- * -- if present, shall be v2
- * } OPTIONAL,
- * crlExtensions [0] EXPLICIT Extensions OPTIONAL
- * -- if present, shall be v2
- * }
- *
- *
- * Note: This class may be subject to change
- */
- public class V2TbsCertListGenerator
- {
- private DerInteger version = new DerInteger(1);
- private AlgorithmIdentifier signature;
- private X509Name issuer;
- private Time thisUpdate, nextUpdate;
- private X509Extensions extensions;
- private IList crlEntries;
-
- public V2TbsCertListGenerator()
- {
- }
-
- public void SetSignature(
- AlgorithmIdentifier signature)
- {
- this.signature = signature;
- }
-
- public void SetIssuer(
- X509Name issuer)
- {
- this.issuer = issuer;
- }
-
- public void SetThisUpdate(
- DerUtcTime thisUpdate)
- {
- this.thisUpdate = new Time(thisUpdate);
- }
-
- public void SetNextUpdate(
- DerUtcTime nextUpdate)
- {
- this.nextUpdate = (nextUpdate != null)
- ? new Time(nextUpdate)
- : null;
- }
-
- public void SetThisUpdate(
- Time thisUpdate)
- {
- this.thisUpdate = thisUpdate;
- }
-
- public void SetNextUpdate(
- Time nextUpdate)
- {
- this.nextUpdate = nextUpdate;
- }
-
- public void AddCrlEntry(
- Asn1Sequence crlEntry)
- {
- if (crlEntries == null)
- {
- crlEntries = Platform.CreateArrayList();
- }
-
- crlEntries.Add(crlEntry);
- }
-
- public void AddCrlEntry(DerInteger userCertificate, DerUtcTime revocationDate, int reason)
- {
- AddCrlEntry(userCertificate, new Time(revocationDate), reason);
- }
-
- public void AddCrlEntry(DerInteger userCertificate, Time revocationDate, int reason)
- {
- AddCrlEntry(userCertificate, revocationDate, reason, null);
- }
-
- public void AddCrlEntry(DerInteger userCertificate, Time revocationDate, int reason,
- DerGeneralizedTime invalidityDate)
- {
- IList extOids = Platform.CreateArrayList();
- IList extValues = Platform.CreateArrayList();
-
- if (reason != 0)
- {
- CrlReason crlReason = new CrlReason(reason);
-
- try
- {
- extOids.Add(X509Extensions.ReasonCode);
- extValues.Add(new X509Extension(false, new DerOctetString(crlReason.GetEncoded())));
- }
- catch (IOException e)
- {
- throw new ArgumentException("error encoding reason: " + e);
- }
- }
-
- if (invalidityDate != null)
- {
- try
- {
- extOids.Add(X509Extensions.InvalidityDate);
- extValues.Add(new X509Extension(false, new DerOctetString(invalidityDate.GetEncoded())));
- }
- catch (IOException e)
- {
- throw new ArgumentException("error encoding invalidityDate: " + e);
- }
- }
-
- if (extOids.Count != 0)
- {
- AddCrlEntry(userCertificate, revocationDate, new X509Extensions(extOids, extValues));
- }
- else
- {
- AddCrlEntry(userCertificate, revocationDate, null);
- }
- }
-
- public void AddCrlEntry(DerInteger userCertificate, Time revocationDate, X509Extensions extensions)
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- userCertificate, revocationDate);
-
- if (extensions != null)
- {
- v.Add(extensions);
- }
-
- AddCrlEntry(new DerSequence(v));
- }
-
- public void SetExtensions(
- X509Extensions extensions)
- {
- this.extensions = extensions;
- }
-
- public TbsCertificateList GenerateTbsCertList()
- {
- if ((signature == null) || (issuer == null) || (thisUpdate == null))
- {
- throw new InvalidOperationException("Not all mandatory fields set in V2 TbsCertList generator.");
- }
-
- Asn1EncodableVector v = new Asn1EncodableVector(
- version, signature, issuer, thisUpdate);
-
- if (nextUpdate != null)
- {
- v.Add(nextUpdate);
- }
-
- // Add CRLEntries if they exist
- if (crlEntries != null)
- {
- Asn1Sequence[] certs = new Asn1Sequence[crlEntries.Count];
- for (int i = 0; i < crlEntries.Count; ++i)
- {
- certs[i] = (Asn1Sequence)crlEntries[i];
- }
- v.Add(new DerSequence(certs));
- }
-
- if (extensions != null)
- {
- v.Add(new DerTaggedObject(0, extensions));
- }
-
- return new TbsCertificateList(new DerSequence(v));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/V3TBSCertificateGenerator.cs b/BCCrypto/src/asn1/x509/V3TBSCertificateGenerator.cs
deleted file mode 100644
index beb469a..0000000
--- a/BCCrypto/src/asn1/x509/V3TBSCertificateGenerator.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * Generator for Version 3 TbsCertificateStructures.
- *
- * TbsCertificate ::= Sequence {
- * version [ 0 ] Version DEFAULT v1(0),
- * serialNumber CertificateSerialNumber,
- * signature AlgorithmIdentifier,
- * issuer Name,
- * validity Validity,
- * subject Name,
- * subjectPublicKeyInfo SubjectPublicKeyInfo,
- * issuerUniqueID [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
- * subjectUniqueID [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
- * extensions [ 3 ] Extensions OPTIONAL
- * }
- *
- *
- */
- public class V3TbsCertificateGenerator
- {
- internal DerTaggedObject version = new DerTaggedObject(0, new DerInteger(2));
- internal DerInteger serialNumber;
- internal AlgorithmIdentifier signature;
- internal X509Name issuer;
- internal Time startDate, endDate;
- internal X509Name subject;
- internal SubjectPublicKeyInfo subjectPublicKeyInfo;
- internal X509Extensions extensions;
-
- private bool altNamePresentAndCritical;
- private DerBitString issuerUniqueID;
- private DerBitString subjectUniqueID;
-
- public V3TbsCertificateGenerator()
- {
- }
-
- public void SetSerialNumber(
- DerInteger serialNumber)
- {
- this.serialNumber = serialNumber;
- }
-
- public void SetSignature(
- AlgorithmIdentifier signature)
- {
- this.signature = signature;
- }
-
- public void SetIssuer(
- X509Name issuer)
- {
- this.issuer = issuer;
- }
-
- public void SetStartDate(
- DerUtcTime startDate)
- {
- this.startDate = new Time(startDate);
- }
-
- public void SetStartDate(
- Time startDate)
- {
- this.startDate = startDate;
- }
-
- public void SetEndDate(
- DerUtcTime endDate)
- {
- this.endDate = new Time(endDate);
- }
-
- public void SetEndDate(
- Time endDate)
- {
- this.endDate = endDate;
- }
-
- public void SetSubject(
- X509Name subject)
- {
- this.subject = subject;
- }
-
- public void SetIssuerUniqueID(
- DerBitString uniqueID)
- {
- this.issuerUniqueID = uniqueID;
- }
-
- public void SetSubjectUniqueID(
- DerBitString uniqueID)
- {
- this.subjectUniqueID = uniqueID;
- }
-
- public void SetSubjectPublicKeyInfo(
- SubjectPublicKeyInfo pubKeyInfo)
- {
- this.subjectPublicKeyInfo = pubKeyInfo;
- }
-
- public void SetExtensions(
- X509Extensions extensions)
- {
- this.extensions = extensions;
-
- if (extensions != null)
- {
- X509Extension altName = extensions.GetExtension(X509Extensions.SubjectAlternativeName);
-
- if (altName != null && altName.IsCritical)
- {
- altNamePresentAndCritical = true;
- }
- }
- }
-
- public TbsCertificateStructure GenerateTbsCertificate()
- {
- if ((serialNumber == null) || (signature == null)
- || (issuer == null) || (startDate == null) || (endDate == null)
- || (subject == null && !altNamePresentAndCritical)
- || (subjectPublicKeyInfo == null))
- {
- throw new InvalidOperationException("not all mandatory fields set in V3 TBScertificate generator");
- }
-
- DerSequence validity = new DerSequence(startDate, endDate); // before and after dates
-
- Asn1EncodableVector v = new Asn1EncodableVector(
- version, serialNumber, signature, issuer, validity);
-
- if (subject != null)
- {
- v.Add(subject);
- }
- else
- {
- v.Add(DerSequence.Empty);
- }
-
- v.Add(subjectPublicKeyInfo);
-
- if (issuerUniqueID != null)
- {
- v.Add(new DerTaggedObject(false, 1, issuerUniqueID));
- }
-
- if (subjectUniqueID != null)
- {
- v.Add(new DerTaggedObject(false, 2, subjectUniqueID));
- }
-
- if (extensions != null)
- {
- v.Add(new DerTaggedObject(3, extensions));
- }
-
- return new TbsCertificateStructure(new DerSequence(v));
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/X509Attributes.cs b/BCCrypto/src/asn1/x509/X509Attributes.cs
deleted file mode 100644
index 291329a..0000000
--- a/BCCrypto/src/asn1/x509/X509Attributes.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class X509Attributes
- {
- public static readonly DerObjectIdentifier RoleSyntax = new DerObjectIdentifier("2.5.4.72");
- }
-}
diff --git a/BCCrypto/src/asn1/x509/X509CertificateStructure.cs b/BCCrypto/src/asn1/x509/X509CertificateStructure.cs
deleted file mode 100644
index 6e7c85d..0000000
--- a/BCCrypto/src/asn1/x509/X509CertificateStructure.cs
+++ /dev/null
@@ -1,132 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Pkcs;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * an X509Certificate structure.
- *
- * Certificate ::= Sequence {
- * tbsCertificate TbsCertificate,
- * signatureAlgorithm AlgorithmIdentifier,
- * signature BIT STRING
- * }
- *
- */
- public class X509CertificateStructure
- : Asn1Encodable
- {
- private readonly TbsCertificateStructure tbsCert;
- private readonly AlgorithmIdentifier sigAlgID;
- private readonly DerBitString sig;
-
- public static X509CertificateStructure GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static X509CertificateStructure GetInstance(
- object obj)
- {
- if (obj is X509CertificateStructure)
- return (X509CertificateStructure)obj;
- if (obj == null)
- return null;
- return new X509CertificateStructure(Asn1Sequence.GetInstance(obj));
- }
-
- public X509CertificateStructure(
- TbsCertificateStructure tbsCert,
- AlgorithmIdentifier sigAlgID,
- DerBitString sig)
- {
- if (tbsCert == null)
- throw new ArgumentNullException("tbsCert");
- if (sigAlgID == null)
- throw new ArgumentNullException("sigAlgID");
- if (sig == null)
- throw new ArgumentNullException("sig");
-
- this.tbsCert = tbsCert;
- this.sigAlgID = sigAlgID;
- this.sig = sig;
- }
-
- private X509CertificateStructure(
- Asn1Sequence seq)
- {
- if (seq.Count != 3)
- throw new ArgumentException("sequence wrong size for a certificate", "seq");
-
- //
- // correct x509 certficate
- //
- tbsCert = TbsCertificateStructure.GetInstance(seq[0]);
- sigAlgID = AlgorithmIdentifier.GetInstance(seq[1]);
- sig = DerBitString.GetInstance(seq[2]);
- }
-
- public TbsCertificateStructure TbsCertificate
- {
- get { return tbsCert; }
- }
-
- public int Version
- {
- get { return tbsCert.Version; }
- }
-
- public DerInteger SerialNumber
- {
- get { return tbsCert.SerialNumber; }
- }
-
- public X509Name Issuer
- {
- get { return tbsCert.Issuer; }
- }
-
- public Time StartDate
- {
- get { return tbsCert.StartDate; }
- }
-
- public Time EndDate
- {
- get { return tbsCert.EndDate; }
- }
-
- public X509Name Subject
- {
- get { return tbsCert.Subject; }
- }
-
- public SubjectPublicKeyInfo SubjectPublicKeyInfo
- {
- get { return tbsCert.SubjectPublicKeyInfo; }
- }
-
- public AlgorithmIdentifier SignatureAlgorithm
- {
- get { return sigAlgID; }
- }
-
- public DerBitString Signature
- {
- get { return sig; }
- }
-
- public byte[] GetSignatureOctets()
- {
- return sig.GetOctets();
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(tbsCert, sigAlgID, sig);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/X509DefaultEntryConverter.cs b/BCCrypto/src/asn1/x509/X509DefaultEntryConverter.cs
deleted file mode 100644
index 7282ead..0000000
--- a/BCCrypto/src/asn1/x509/X509DefaultEntryConverter.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * The default converter for X509 DN entries when going from their
- * string value to ASN.1 strings.
- */
- public class X509DefaultEntryConverter
- : X509NameEntryConverter
- {
- /**
- * Apply default conversion for the given value depending on the oid
- * and the character range of the value.
- *
- * @param oid the object identifier for the DN entry
- * @param value the value associated with it
- * @return the ASN.1 equivalent for the string value.
- */
- public override Asn1Object GetConvertedValue(
- DerObjectIdentifier oid,
- string value)
- {
- if (value.Length != 0 && value[0] == '#')
- {
- try
- {
- return ConvertHexEncoded(value, 1);
- }
- catch (IOException)
- {
- throw new Exception("can't recode value for oid " + oid.Id);
- }
- }
-
- if (value.Length != 0 && value[0] == '\\')
- {
- value = value.Substring(1);
- }
-
- if (oid.Equals(X509Name.EmailAddress) || oid.Equals(X509Name.DC))
- {
- return new DerIA5String(value);
- }
-
- if (oid.Equals(X509Name.DateOfBirth)) // accept time string as well as # (for compatibility)
- {
- return new DerGeneralizedTime(value);
- }
-
- if (oid.Equals(X509Name.C)
- || oid.Equals(X509Name.SerialNumber)
- || oid.Equals(X509Name.DnQualifier)
- || oid.Equals(X509Name.TelephoneNumber))
- {
- return new DerPrintableString(value);
- }
-
- return new DerUtf8String(value);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/X509Extension.cs b/BCCrypto/src/asn1/x509/X509Extension.cs
deleted file mode 100644
index 430ce44..0000000
--- a/BCCrypto/src/asn1/x509/X509Extension.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * an object for the elements in the X.509 V3 extension block.
- */
- public class X509Extension
- {
- internal bool critical;
- internal Asn1OctetString value;
-
- public X509Extension(
- DerBoolean critical,
- Asn1OctetString value)
- {
- if (critical == null)
- {
- throw new ArgumentNullException("critical");
- }
-
- this.critical = critical.IsTrue;
- this.value = value;
- }
-
- public X509Extension(
- bool critical,
- Asn1OctetString value)
- {
- this.critical = critical;
- this.value = value;
- }
-
- public bool IsCritical { get { return critical; } }
-
- public Asn1OctetString Value { get { return value; } }
-
- public Asn1Encodable GetParsedValue()
- {
- return ConvertValueToObject(this);
- }
-
- public override int GetHashCode()
- {
- int vh = this.Value.GetHashCode();
-
- return IsCritical ? vh : ~vh;
- }
-
- public override bool Equals(
- object obj)
- {
- X509Extension other = obj as X509Extension;
- if (other == null)
- {
- return false;
- }
-
- return Value.Equals(other.Value) && IsCritical == other.IsCritical;
- }
-
- /// Convert the value of the passed in extension to an object.
- /// The extension to parse.
- /// The object the value string contains.
- /// If conversion is not possible.
- public static Asn1Object ConvertValueToObject(
- X509Extension ext)
- {
- try
- {
- return Asn1Object.FromByteArray(ext.Value.GetOctets());
- }
- catch (Exception e)
- {
- throw new ArgumentException("can't convert extension", e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/X509Extensions.cs b/BCCrypto/src/asn1/x509/X509Extensions.cs
deleted file mode 100644
index 049d728..0000000
--- a/BCCrypto/src/asn1/x509/X509Extensions.cs
+++ /dev/null
@@ -1,456 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- public class X509Extensions
- : Asn1Encodable
- {
- /**
- * Subject Directory Attributes
- */
- public static readonly DerObjectIdentifier SubjectDirectoryAttributes = new DerObjectIdentifier("2.5.29.9");
-
- /**
- * Subject Key Identifier
- */
- public static readonly DerObjectIdentifier SubjectKeyIdentifier = new DerObjectIdentifier("2.5.29.14");
-
- /**
- * Key Usage
- */
- public static readonly DerObjectIdentifier KeyUsage = new DerObjectIdentifier("2.5.29.15");
-
- /**
- * Private Key Usage Period
- */
- public static readonly DerObjectIdentifier PrivateKeyUsagePeriod = new DerObjectIdentifier("2.5.29.16");
-
- /**
- * Subject Alternative Name
- */
- public static readonly DerObjectIdentifier SubjectAlternativeName = new DerObjectIdentifier("2.5.29.17");
-
- /**
- * Issuer Alternative Name
- */
- public static readonly DerObjectIdentifier IssuerAlternativeName = new DerObjectIdentifier("2.5.29.18");
-
- /**
- * Basic Constraints
- */
- public static readonly DerObjectIdentifier BasicConstraints = new DerObjectIdentifier("2.5.29.19");
-
- /**
- * CRL Number
- */
- public static readonly DerObjectIdentifier CrlNumber = new DerObjectIdentifier("2.5.29.20");
-
- /**
- * Reason code
- */
- public static readonly DerObjectIdentifier ReasonCode = new DerObjectIdentifier("2.5.29.21");
-
- /**
- * Hold Instruction Code
- */
- public static readonly DerObjectIdentifier InstructionCode = new DerObjectIdentifier("2.5.29.23");
-
- /**
- * Invalidity Date
- */
- public static readonly DerObjectIdentifier InvalidityDate = new DerObjectIdentifier("2.5.29.24");
-
- /**
- * Delta CRL indicator
- */
- public static readonly DerObjectIdentifier DeltaCrlIndicator = new DerObjectIdentifier("2.5.29.27");
-
- /**
- * Issuing Distribution Point
- */
- public static readonly DerObjectIdentifier IssuingDistributionPoint = new DerObjectIdentifier("2.5.29.28");
-
- /**
- * Certificate Issuer
- */
- public static readonly DerObjectIdentifier CertificateIssuer = new DerObjectIdentifier("2.5.29.29");
-
- /**
- * Name Constraints
- */
- public static readonly DerObjectIdentifier NameConstraints = new DerObjectIdentifier("2.5.29.30");
-
- /**
- * CRL Distribution Points
- */
- public static readonly DerObjectIdentifier CrlDistributionPoints = new DerObjectIdentifier("2.5.29.31");
-
- /**
- * Certificate Policies
- */
- public static readonly DerObjectIdentifier CertificatePolicies = new DerObjectIdentifier("2.5.29.32");
-
- /**
- * Policy Mappings
- */
- public static readonly DerObjectIdentifier PolicyMappings = new DerObjectIdentifier("2.5.29.33");
-
- /**
- * Authority Key Identifier
- */
- public static readonly DerObjectIdentifier AuthorityKeyIdentifier = new DerObjectIdentifier("2.5.29.35");
-
- /**
- * Policy Constraints
- */
- public static readonly DerObjectIdentifier PolicyConstraints = new DerObjectIdentifier("2.5.29.36");
-
- /**
- * Extended Key Usage
- */
- public static readonly DerObjectIdentifier ExtendedKeyUsage = new DerObjectIdentifier("2.5.29.37");
-
- /**
- * Freshest CRL
- */
- public static readonly DerObjectIdentifier FreshestCrl = new DerObjectIdentifier("2.5.29.46");
-
- /**
- * Inhibit Any Policy
- */
- public static readonly DerObjectIdentifier InhibitAnyPolicy = new DerObjectIdentifier("2.5.29.54");
-
- /**
- * Authority Info Access
- */
- public static readonly DerObjectIdentifier AuthorityInfoAccess = new DerObjectIdentifier("1.3.6.1.5.5.7.1.1");
-
- /**
- * Subject Info Access
- */
- public static readonly DerObjectIdentifier SubjectInfoAccess = new DerObjectIdentifier("1.3.6.1.5.5.7.1.11");
-
- /**
- * Logo Type
- */
- public static readonly DerObjectIdentifier LogoType = new DerObjectIdentifier("1.3.6.1.5.5.7.1.12");
-
- /**
- * BiometricInfo
- */
- public static readonly DerObjectIdentifier BiometricInfo = new DerObjectIdentifier("1.3.6.1.5.5.7.1.2");
-
- /**
- * QCStatements
- */
- public static readonly DerObjectIdentifier QCStatements = new DerObjectIdentifier("1.3.6.1.5.5.7.1.3");
-
- /**
- * Audit identity extension in attribute certificates.
- */
- public static readonly DerObjectIdentifier AuditIdentity = new DerObjectIdentifier("1.3.6.1.5.5.7.1.4");
-
- /**
- * NoRevAvail extension in attribute certificates.
- */
- public static readonly DerObjectIdentifier NoRevAvail = new DerObjectIdentifier("2.5.29.56");
-
- /**
- * TargetInformation extension in attribute certificates.
- */
- public static readonly DerObjectIdentifier TargetInformation = new DerObjectIdentifier("2.5.29.55");
-
- /**
- * Expired Certificates on CRL extension
- */
- public static readonly DerObjectIdentifier ExpiredCertsOnCrl = new DerObjectIdentifier("2.5.29.60");
-
- private readonly IDictionary extensions = Platform.CreateHashtable();
- private readonly IList ordering;
-
- public static X509Extensions GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static X509Extensions GetInstance(
- object obj)
- {
- if (obj == null || obj is X509Extensions)
- {
- return (X509Extensions) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new X509Extensions((Asn1Sequence) obj);
- }
-
- if (obj is Asn1TaggedObject)
- {
- return GetInstance(((Asn1TaggedObject) obj).GetObject());
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from Asn1Sequence.
- *
- * the extensions are a list of constructed sequences, either with (Oid, OctetString) or (Oid, Boolean, OctetString)
- */
- private X509Extensions(
- Asn1Sequence seq)
- {
- this.ordering = Platform.CreateArrayList();
-
- foreach (Asn1Encodable ae in seq)
- {
- Asn1Sequence s = Asn1Sequence.GetInstance(ae.ToAsn1Object());
-
- if (s.Count < 2 || s.Count > 3)
- throw new ArgumentException("Bad sequence size: " + s.Count);
-
- DerObjectIdentifier oid = DerObjectIdentifier.GetInstance(s[0].ToAsn1Object());
-
- bool isCritical = s.Count == 3
- && DerBoolean.GetInstance(s[1].ToAsn1Object()).IsTrue;
-
- Asn1OctetString octets = Asn1OctetString.GetInstance(s[s.Count - 1].ToAsn1Object());
-
- extensions.Add(oid, new X509Extension(isCritical, octets));
- ordering.Add(oid);
- }
- }
-
- /**
- * constructor from a table of extensions.
- *
- * it's is assumed the table contains Oid/string pairs.
- */
- public X509Extensions(
- IDictionary extensions)
- : this(null, extensions)
- {
- }
-
- /**
- * Constructor from a table of extensions with ordering.
- *
- * It's is assumed the table contains Oid/string pairs.
- */
- public X509Extensions(
- IList ordering,
- IDictionary extensions)
- {
- if (ordering == null)
- {
- this.ordering = Platform.CreateArrayList(extensions.Keys);
- }
- else
- {
- this.ordering = Platform.CreateArrayList(ordering);
- }
-
- foreach (DerObjectIdentifier oid in this.ordering)
- {
- this.extensions.Add(oid, (X509Extension)extensions[oid]);
- }
- }
-
- /**
- * Constructor from two vectors
- *
- * @param objectIDs an ArrayList of the object identifiers.
- * @param values an ArrayList of the extension values.
- */
- public X509Extensions(
- IList oids,
- IList values)
- {
- this.ordering = Platform.CreateArrayList(oids);
-
- int count = 0;
- foreach (DerObjectIdentifier oid in this.ordering)
- {
- this.extensions.Add(oid, (X509Extension)values[count++]);
- }
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- /**
- * constructor from a table of extensions.
- *
- * it's is assumed the table contains Oid/string pairs.
- */
- [Obsolete]
- public X509Extensions(
- Hashtable extensions)
- : this(null, extensions)
- {
- }
-
- /**
- * Constructor from a table of extensions with ordering.
- *
- * It's is assumed the table contains Oid/string pairs.
- */
- [Obsolete]
- public X509Extensions(
- ArrayList ordering,
- Hashtable extensions)
- {
- if (ordering == null)
- {
- this.ordering = Platform.CreateArrayList(extensions.Keys);
- }
- else
- {
- this.ordering = Platform.CreateArrayList(ordering);
- }
-
- foreach (DerObjectIdentifier oid in this.ordering)
- {
- this.extensions.Add(oid, (X509Extension) extensions[oid]);
- }
- }
-
- /**
- * Constructor from two vectors
- *
- * @param objectIDs an ArrayList of the object identifiers.
- * @param values an ArrayList of the extension values.
- */
- [Obsolete]
- public X509Extensions(
- ArrayList oids,
- ArrayList values)
- {
- this.ordering = Platform.CreateArrayList(oids);
-
- int count = 0;
- foreach (DerObjectIdentifier oid in this.ordering)
- {
- this.extensions.Add(oid, (X509Extension) values[count++]);
- }
- }
-#endif
-
- [Obsolete("Use ExtensionOids IEnumerable property")]
- public IEnumerator Oids()
- {
- return ExtensionOids.GetEnumerator();
- }
-
- /**
- * return an Enumeration of the extension field's object ids.
- */
- public IEnumerable ExtensionOids
- {
- get { return new EnumerableProxy(ordering); }
- }
-
- /**
- * return the extension represented by the object identifier
- * passed in.
- *
- * @return the extension if it's present, null otherwise.
- */
- public X509Extension GetExtension(
- DerObjectIdentifier oid)
- {
- return (X509Extension) extensions[oid];
- }
-
- /**
- *
- * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
- *
- * Extension ::= SEQUENCE {
- * extnId EXTENSION.&id ({ExtensionSet}),
- * critical BOOLEAN DEFAULT FALSE,
- * extnValue OCTET STRING }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector vec = new Asn1EncodableVector();
-
- foreach (DerObjectIdentifier oid in ordering)
- {
- X509Extension ext = (X509Extension) extensions[oid];
- Asn1EncodableVector v = new Asn1EncodableVector(oid);
-
- if (ext.IsCritical)
- {
- v.Add(DerBoolean.True);
- }
-
- v.Add(ext.Value);
-
- vec.Add(new DerSequence(v));
- }
-
- return new DerSequence(vec);
- }
-
- public bool Equivalent(
- X509Extensions other)
- {
- if (extensions.Count != other.extensions.Count)
- return false;
-
- foreach (DerObjectIdentifier oid in extensions.Keys)
- {
- if (!extensions[oid].Equals(other.extensions[oid]))
- return false;
- }
-
- return true;
- }
-
- public DerObjectIdentifier[] GetExtensionOids()
- {
- return ToOidArray(ordering);
- }
-
- public DerObjectIdentifier[] GetNonCriticalExtensionOids()
- {
- return GetExtensionOids(false);
- }
-
- public DerObjectIdentifier[] GetCriticalExtensionOids()
- {
- return GetExtensionOids(true);
- }
-
- private DerObjectIdentifier[] GetExtensionOids(bool isCritical)
- {
- IList oids = Platform.CreateArrayList();
-
- foreach (DerObjectIdentifier oid in this.ordering)
- {
- X509Extension ext = (X509Extension)extensions[oid];
- if (ext.IsCritical == isCritical)
- {
- oids.Add(oid);
- }
- }
-
- return ToOidArray(oids);
- }
-
- private static DerObjectIdentifier[] ToOidArray(IList oids)
- {
- DerObjectIdentifier[] oidArray = new DerObjectIdentifier[oids.Count];
- oids.CopyTo(oidArray, 0);
- return oidArray;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/X509ExtensionsGenerator.cs b/BCCrypto/src/asn1/x509/X509ExtensionsGenerator.cs
deleted file mode 100644
index d6f567b..0000000
--- a/BCCrypto/src/asn1/x509/X509ExtensionsGenerator.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /// Generator for X.509 extensions
- public class X509ExtensionsGenerator
- {
- private IDictionary extensions = Platform.CreateHashtable();
- private IList extOrdering = Platform.CreateArrayList();
-
- /// Reset the generator
- public void Reset()
- {
- extensions = Platform.CreateHashtable();
- extOrdering = Platform.CreateArrayList();
- }
-
- ///
- /// Add an extension with the given oid and the passed in value to be included
- /// in the OCTET STRING associated with the extension.
- ///
- /// OID for the extension.
- /// True if critical, false otherwise.
- /// The ASN.1 object to be included in the extension.
- public void AddExtension(
- DerObjectIdentifier oid,
- bool critical,
- Asn1Encodable extValue)
- {
- byte[] encoded;
- try
- {
- encoded = extValue.GetDerEncoded();
- }
- catch (Exception e)
- {
- throw new ArgumentException("error encoding value: " + e);
- }
-
- this.AddExtension(oid, critical, encoded);
- }
-
- ///
- /// Add an extension with the given oid and the passed in byte array to be wrapped
- /// in the OCTET STRING associated with the extension.
- ///
- /// OID for the extension.
- /// True if critical, false otherwise.
- /// The byte array to be wrapped.
- public void AddExtension(
- DerObjectIdentifier oid,
- bool critical,
- byte[] extValue)
- {
- if (extensions.Contains(oid))
- {
- throw new ArgumentException("extension " + oid + " already added");
- }
-
- extOrdering.Add(oid);
- extensions.Add(oid, new X509Extension(critical, new DerOctetString(extValue)));
- }
-
- /// Return true if there are no extension present in this generator.
- /// True if empty, false otherwise
- public bool IsEmpty
- {
- get { return extOrdering.Count < 1; }
- }
-
- /// Generate an X509Extensions object based on the current state of the generator.
- /// An X509Extensions object
- public X509Extensions Generate()
- {
- return new X509Extensions(extOrdering, extensions);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/X509Name.cs b/BCCrypto/src/asn1/x509/X509Name.cs
deleted file mode 100644
index 01a7ec0..0000000
--- a/BCCrypto/src/asn1/x509/X509Name.cs
+++ /dev/null
@@ -1,1077 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-#if SILVERLIGHT || PORTABLE
-using System.Collections.Generic;
-#endif
-
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- *
- * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
- *
- * RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue
- *
- * AttributeTypeAndValue ::= SEQUENCE {
- * type OBJECT IDENTIFIER,
- * value ANY }
- *
- */
- public class X509Name
- : Asn1Encodable
- {
- /**
- * country code - StringType(SIZE(2))
- */
- public static readonly DerObjectIdentifier C = new DerObjectIdentifier("2.5.4.6");
-
- /**
- * organization - StringType(SIZE(1..64))
- */
- public static readonly DerObjectIdentifier O = new DerObjectIdentifier("2.5.4.10");
-
- /**
- * organizational unit name - StringType(SIZE(1..64))
- */
- public static readonly DerObjectIdentifier OU = new DerObjectIdentifier("2.5.4.11");
-
- /**
- * Title
- */
- public static readonly DerObjectIdentifier T = new DerObjectIdentifier("2.5.4.12");
-
- /**
- * common name - StringType(SIZE(1..64))
- */
- public static readonly DerObjectIdentifier CN = new DerObjectIdentifier("2.5.4.3");
-
- /**
- * street - StringType(SIZE(1..64))
- */
- public static readonly DerObjectIdentifier Street = new DerObjectIdentifier("2.5.4.9");
-
- /**
- * device serial number name - StringType(SIZE(1..64))
- */
- public static readonly DerObjectIdentifier SerialNumber = new DerObjectIdentifier("2.5.4.5");
-
- /**
- * locality name - StringType(SIZE(1..64))
- */
- public static readonly DerObjectIdentifier L = new DerObjectIdentifier("2.5.4.7");
-
- /**
- * state, or province name - StringType(SIZE(1..64))
- */
- public static readonly DerObjectIdentifier ST = new DerObjectIdentifier("2.5.4.8");
-
- /**
- * Naming attributes of type X520name
- */
- public static readonly DerObjectIdentifier Surname = new DerObjectIdentifier("2.5.4.4");
- public static readonly DerObjectIdentifier GivenName = new DerObjectIdentifier("2.5.4.42");
- public static readonly DerObjectIdentifier Initials = new DerObjectIdentifier("2.5.4.43");
- public static readonly DerObjectIdentifier Generation = new DerObjectIdentifier("2.5.4.44");
- public static readonly DerObjectIdentifier UniqueIdentifier = new DerObjectIdentifier("2.5.4.45");
-
- /**
- * businessCategory - DirectoryString(SIZE(1..128)
- */
- public static readonly DerObjectIdentifier BusinessCategory = new DerObjectIdentifier(
- "2.5.4.15");
-
- /**
- * postalCode - DirectoryString(SIZE(1..40)
- */
- public static readonly DerObjectIdentifier PostalCode = new DerObjectIdentifier(
- "2.5.4.17");
-
- /**
- * dnQualifier - DirectoryString(SIZE(1..64)
- */
- public static readonly DerObjectIdentifier DnQualifier = new DerObjectIdentifier(
- "2.5.4.46");
-
- /**
- * RFC 3039 Pseudonym - DirectoryString(SIZE(1..64)
- */
- public static readonly DerObjectIdentifier Pseudonym = new DerObjectIdentifier(
- "2.5.4.65");
-
- /**
- * RFC 3039 DateOfBirth - GeneralizedTime - YYYYMMDD000000Z
- */
- public static readonly DerObjectIdentifier DateOfBirth = new DerObjectIdentifier(
- "1.3.6.1.5.5.7.9.1");
-
- /**
- * RFC 3039 PlaceOfBirth - DirectoryString(SIZE(1..128)
- */
- public static readonly DerObjectIdentifier PlaceOfBirth = new DerObjectIdentifier(
- "1.3.6.1.5.5.7.9.2");
-
- /**
- * RFC 3039 DateOfBirth - PrintableString (SIZE(1)) -- "M", "F", "m" or "f"
- */
- public static readonly DerObjectIdentifier Gender = new DerObjectIdentifier(
- "1.3.6.1.5.5.7.9.3");
-
- /**
- * RFC 3039 CountryOfCitizenship - PrintableString (SIZE (2)) -- ISO 3166
- * codes only
- */
- public static readonly DerObjectIdentifier CountryOfCitizenship = new DerObjectIdentifier(
- "1.3.6.1.5.5.7.9.4");
-
- /**
- * RFC 3039 CountryOfCitizenship - PrintableString (SIZE (2)) -- ISO 3166
- * codes only
- */
- public static readonly DerObjectIdentifier CountryOfResidence = new DerObjectIdentifier(
- "1.3.6.1.5.5.7.9.5");
-
- /**
- * ISIS-MTT NameAtBirth - DirectoryString(SIZE(1..64)
- */
- public static readonly DerObjectIdentifier NameAtBirth = new DerObjectIdentifier("1.3.36.8.3.14");
-
- /**
- * RFC 3039 PostalAddress - SEQUENCE SIZE (1..6) OF
- * DirectoryString(SIZE(1..30))
- */
- public static readonly DerObjectIdentifier PostalAddress = new DerObjectIdentifier("2.5.4.16");
-
- /**
- * RFC 2256 dmdName
- */
- public static readonly DerObjectIdentifier DmdName = new DerObjectIdentifier("2.5.4.54");
-
- /**
- * id-at-telephoneNumber
- */
- public static readonly DerObjectIdentifier TelephoneNumber = X509ObjectIdentifiers.id_at_telephoneNumber;
-
- /**
- * id-at-name
- */
- public static readonly DerObjectIdentifier Name = X509ObjectIdentifiers.id_at_name;
-
- /**
- * Email address (RSA PKCS#9 extension) - IA5String.
- * Note: if you're trying to be ultra orthodox, don't use this! It shouldn't be in here.
- */
- public static readonly DerObjectIdentifier EmailAddress = PkcsObjectIdentifiers.Pkcs9AtEmailAddress;
-
- /**
- * more from PKCS#9
- */
- public static readonly DerObjectIdentifier UnstructuredName = PkcsObjectIdentifiers.Pkcs9AtUnstructuredName;
- public static readonly DerObjectIdentifier UnstructuredAddress = PkcsObjectIdentifiers.Pkcs9AtUnstructuredAddress;
-
- /**
- * email address in Verisign certificates
- */
- public static readonly DerObjectIdentifier E = EmailAddress;
-
- /*
- * others...
- */
- public static readonly DerObjectIdentifier DC = new DerObjectIdentifier("0.9.2342.19200300.100.1.25");
-
- /**
- * LDAP User id.
- */
- public static readonly DerObjectIdentifier UID = new DerObjectIdentifier("0.9.2342.19200300.100.1.1");
-
- /**
- * determines whether or not strings should be processed and printed
- * from back to front.
- */
-// public static bool DefaultReverse = false;
- public static bool DefaultReverse
- {
- get { return defaultReverse[0]; }
- set { defaultReverse[0] = value; }
- }
-
- private static readonly bool[] defaultReverse = { false };
-
-#if SILVERLIGHT || PORTABLE
- /**
- * default look up table translating OID values into their common symbols following
- * the convention in RFC 2253 with a few extras
- */
- public static readonly IDictionary DefaultSymbols = Platform.CreateHashtable();
-
- /**
- * look up table translating OID values into their common symbols following the convention in RFC 2253
- */
- public static readonly IDictionary RFC2253Symbols = Platform.CreateHashtable();
-
- /**
- * look up table translating OID values into their common symbols following the convention in RFC 1779
- *
- */
- public static readonly IDictionary RFC1779Symbols = Platform.CreateHashtable();
-
- /**
- * look up table translating common symbols into their OIDS.
- */
- public static readonly IDictionary DefaultLookup = Platform.CreateHashtable();
-#else
- /**
- * default look up table translating OID values into their common symbols following
- * the convention in RFC 2253 with a few extras
- */
- public static readonly Hashtable DefaultSymbols = new Hashtable();
-
- /**
- * look up table translating OID values into their common symbols following the convention in RFC 2253
- */
- public static readonly Hashtable RFC2253Symbols = new Hashtable();
-
- /**
- * look up table translating OID values into their common symbols following the convention in RFC 1779
- *
- */
- public static readonly Hashtable RFC1779Symbols = new Hashtable();
-
- /**
- * look up table translating common symbols into their OIDS.
- */
- public static readonly Hashtable DefaultLookup = new Hashtable();
-#endif
-
- static X509Name()
- {
- DefaultSymbols.Add(C, "C");
- DefaultSymbols.Add(O, "O");
- DefaultSymbols.Add(T, "T");
- DefaultSymbols.Add(OU, "OU");
- DefaultSymbols.Add(CN, "CN");
- DefaultSymbols.Add(L, "L");
- DefaultSymbols.Add(ST, "ST");
- DefaultSymbols.Add(SerialNumber, "SERIALNUMBER");
- DefaultSymbols.Add(EmailAddress, "E");
- DefaultSymbols.Add(DC, "DC");
- DefaultSymbols.Add(UID, "UID");
- DefaultSymbols.Add(Street, "STREET");
- DefaultSymbols.Add(Surname, "SURNAME");
- DefaultSymbols.Add(GivenName, "GIVENNAME");
- DefaultSymbols.Add(Initials, "INITIALS");
- DefaultSymbols.Add(Generation, "GENERATION");
- DefaultSymbols.Add(UnstructuredAddress, "unstructuredAddress");
- DefaultSymbols.Add(UnstructuredName, "unstructuredName");
- DefaultSymbols.Add(UniqueIdentifier, "UniqueIdentifier");
- DefaultSymbols.Add(DnQualifier, "DN");
- DefaultSymbols.Add(Pseudonym, "Pseudonym");
- DefaultSymbols.Add(PostalAddress, "PostalAddress");
- DefaultSymbols.Add(NameAtBirth, "NameAtBirth");
- DefaultSymbols.Add(CountryOfCitizenship, "CountryOfCitizenship");
- DefaultSymbols.Add(CountryOfResidence, "CountryOfResidence");
- DefaultSymbols.Add(Gender, "Gender");
- DefaultSymbols.Add(PlaceOfBirth, "PlaceOfBirth");
- DefaultSymbols.Add(DateOfBirth, "DateOfBirth");
- DefaultSymbols.Add(PostalCode, "PostalCode");
- DefaultSymbols.Add(BusinessCategory, "BusinessCategory");
- DefaultSymbols.Add(TelephoneNumber, "TelephoneNumber");
-
- RFC2253Symbols.Add(C, "C");
- RFC2253Symbols.Add(O, "O");
- RFC2253Symbols.Add(OU, "OU");
- RFC2253Symbols.Add(CN, "CN");
- RFC2253Symbols.Add(L, "L");
- RFC2253Symbols.Add(ST, "ST");
- RFC2253Symbols.Add(Street, "STREET");
- RFC2253Symbols.Add(DC, "DC");
- RFC2253Symbols.Add(UID, "UID");
-
- RFC1779Symbols.Add(C, "C");
- RFC1779Symbols.Add(O, "O");
- RFC1779Symbols.Add(OU, "OU");
- RFC1779Symbols.Add(CN, "CN");
- RFC1779Symbols.Add(L, "L");
- RFC1779Symbols.Add(ST, "ST");
- RFC1779Symbols.Add(Street, "STREET");
-
- DefaultLookup.Add("c", C);
- DefaultLookup.Add("o", O);
- DefaultLookup.Add("t", T);
- DefaultLookup.Add("ou", OU);
- DefaultLookup.Add("cn", CN);
- DefaultLookup.Add("l", L);
- DefaultLookup.Add("st", ST);
- DefaultLookup.Add("serialnumber", SerialNumber);
- DefaultLookup.Add("street", Street);
- DefaultLookup.Add("emailaddress", E);
- DefaultLookup.Add("dc", DC);
- DefaultLookup.Add("e", E);
- DefaultLookup.Add("uid", UID);
- DefaultLookup.Add("surname", Surname);
- DefaultLookup.Add("givenname", GivenName);
- DefaultLookup.Add("initials", Initials);
- DefaultLookup.Add("generation", Generation);
- DefaultLookup.Add("unstructuredaddress", UnstructuredAddress);
- DefaultLookup.Add("unstructuredname", UnstructuredName);
- DefaultLookup.Add("uniqueidentifier", UniqueIdentifier);
- DefaultLookup.Add("dn", DnQualifier);
- DefaultLookup.Add("pseudonym", Pseudonym);
- DefaultLookup.Add("postaladdress", PostalAddress);
- DefaultLookup.Add("nameofbirth", NameAtBirth);
- DefaultLookup.Add("countryofcitizenship", CountryOfCitizenship);
- DefaultLookup.Add("countryofresidence", CountryOfResidence);
- DefaultLookup.Add("gender", Gender);
- DefaultLookup.Add("placeofbirth", PlaceOfBirth);
- DefaultLookup.Add("dateofbirth", DateOfBirth);
- DefaultLookup.Add("postalcode", PostalCode);
- DefaultLookup.Add("businesscategory", BusinessCategory);
- DefaultLookup.Add("telephonenumber", TelephoneNumber);
- }
-
- private readonly IList ordering = Platform.CreateArrayList();
- private readonly X509NameEntryConverter converter;
-
- private IList values = Platform.CreateArrayList();
- private IList added = Platform.CreateArrayList();
- private Asn1Sequence seq;
-
- /**
- * Return a X509Name based on the passed in tagged object.
- *
- * @param obj tag object holding name.
- * @param explicitly true if explicitly tagged false otherwise.
- * @return the X509Name
- */
- public static X509Name GetInstance(
- Asn1TaggedObject obj,
- bool explicitly)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
- }
-
- public static X509Name GetInstance(
- object obj)
- {
- if (obj == null || obj is X509Name)
- return (X509Name)obj;
-
- if (obj != null)
- return new X509Name(Asn1Sequence.GetInstance(obj));
-
- throw new ArgumentException("null object in factory", "obj");
- }
-
- protected X509Name()
- {
- }
-
- /**
- * Constructor from Asn1Sequence
- *
- * the principal will be a list of constructed sets, each containing an (OID, string) pair.
- */
- protected X509Name(
- Asn1Sequence seq)
- {
- this.seq = seq;
-
- foreach (Asn1Encodable asn1Obj in seq)
- {
- Asn1Set asn1Set = Asn1Set.GetInstance(asn1Obj.ToAsn1Object());
-
- for (int i = 0; i < asn1Set.Count; i++)
- {
- Asn1Sequence s = Asn1Sequence.GetInstance(asn1Set[i].ToAsn1Object());
-
- if (s.Count != 2)
- throw new ArgumentException("badly sized pair");
-
- ordering.Add(DerObjectIdentifier.GetInstance(s[0].ToAsn1Object()));
-
- Asn1Object derValue = s[1].ToAsn1Object();
- if (derValue is IAsn1String && !(derValue is DerUniversalString))
- {
- string v = ((IAsn1String)derValue).GetString();
- if (Platform.StartsWith(v, "#"))
- {
- v = "\\" + v;
- }
-
- values.Add(v);
- }
- else
- {
- values.Add("#" + Hex.ToHexString(derValue.GetEncoded()));
- }
-
- added.Add(i != 0);
- }
- }
- }
-
- /**
- * Constructor from a table of attributes with ordering.
- *
- * it's is assumed the table contains OID/string pairs, and the contents
- * of the table are copied into an internal table as part of the
- * construction process. The ordering ArrayList should contain the OIDs
- * in the order they are meant to be encoded or printed in ToString.
- */
- public X509Name(
- IList ordering,
- IDictionary attributes)
- : this(ordering, attributes, new X509DefaultEntryConverter())
- {
- }
-
- /**
- * Constructor from a table of attributes with ordering.
- *
- * it's is assumed the table contains OID/string pairs, and the contents
- * of the table are copied into an internal table as part of the
- * construction process. The ordering ArrayList should contain the OIDs
- * in the order they are meant to be encoded or printed in ToString.
- *
- * The passed in converter will be used to convert the strings into their
- * ASN.1 counterparts.
- */
- public X509Name(
- IList ordering,
- IDictionary attributes,
- X509NameEntryConverter converter)
- {
- this.converter = converter;
-
- foreach (DerObjectIdentifier oid in ordering)
- {
- object attribute = attributes[oid];
- if (attribute == null)
- {
- throw new ArgumentException("No attribute for object id - " + oid + " - passed to distinguished name");
- }
-
- this.ordering.Add(oid);
- this.added.Add(false);
- this.values.Add(attribute); // copy the hash table
- }
- }
-
- /**
- * Takes two vectors one of the oids and the other of the values.
- */
- public X509Name(
- IList oids,
- IList values)
- : this(oids, values, new X509DefaultEntryConverter())
- {
- }
-
- /**
- * Takes two vectors one of the oids and the other of the values.
- *
- * The passed in converter will be used to convert the strings into their
- * ASN.1 counterparts.
- */
- public X509Name(
- IList oids,
- IList values,
- X509NameEntryConverter converter)
- {
- this.converter = converter;
-
- if (oids.Count != values.Count)
- {
- throw new ArgumentException("'oids' must be same length as 'values'.");
- }
-
- for (int i = 0; i < oids.Count; i++)
- {
- this.ordering.Add(oids[i]);
- this.values.Add(values[i]);
- this.added.Add(false);
- }
- }
-
- /**
- * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
- * some such, converting it into an ordered set of name attributes.
- */
- public X509Name(
- string dirName)
- : this(DefaultReverse, (IDictionary)DefaultLookup, dirName)
- {
- }
-
- /**
- * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
- * some such, converting it into an ordered set of name attributes with each
- * string value being converted to its associated ASN.1 type using the passed
- * in converter.
- */
- public X509Name(
- string dirName,
- X509NameEntryConverter converter)
- : this(DefaultReverse, DefaultLookup, dirName, converter)
- {
- }
-
- /**
- * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
- * some such, converting it into an ordered set of name attributes. If reverse
- * is true, create the encoded version of the sequence starting from the
- * last element in the string.
- */
- public X509Name(
- bool reverse,
- string dirName)
- : this(reverse, (IDictionary)DefaultLookup, dirName)
- {
- }
-
- /**
- * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
- * some such, converting it into an ordered set of name attributes with each
- * string value being converted to its associated ASN.1 type using the passed
- * in converter. If reverse is true the ASN.1 sequence representing the DN will
- * be built by starting at the end of the string, rather than the start.
- */
- public X509Name(
- bool reverse,
- string dirName,
- X509NameEntryConverter converter)
- : this(reverse, DefaultLookup, dirName, converter)
- {
- }
-
- /**
- * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
- * some such, converting it into an ordered set of name attributes. lookUp
- * should provide a table of lookups, indexed by lowercase only strings and
- * yielding a DerObjectIdentifier, other than that OID. and numeric oids
- * will be processed automatically.
- *
- * If reverse is true, create the encoded version of the sequence
- * starting from the last element in the string.
- * @param reverse true if we should start scanning from the end (RFC 2553).
- * @param lookUp table of names and their oids.
- * @param dirName the X.500 string to be parsed.
- */
- public X509Name(
- bool reverse,
- IDictionary lookUp,
- string dirName)
- : this(reverse, lookUp, dirName, new X509DefaultEntryConverter())
- {
- }
-
- private DerObjectIdentifier DecodeOid(
- string name,
- IDictionary lookUp)
- {
- if (Platform.StartsWith(Platform.ToUpperInvariant(name), "OID."))
- {
- return new DerObjectIdentifier(name.Substring(4));
- }
- else if (name[0] >= '0' && name[0] <= '9')
- {
- return new DerObjectIdentifier(name);
- }
-
- DerObjectIdentifier oid = (DerObjectIdentifier)lookUp[Platform.ToLowerInvariant(name)];
- if (oid == null)
- {
- throw new ArgumentException("Unknown object id - " + name + " - passed to distinguished name");
- }
-
- return oid;
- }
-
- /**
- * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
- * some such, converting it into an ordered set of name attributes. lookUp
- * should provide a table of lookups, indexed by lowercase only strings and
- * yielding a DerObjectIdentifier, other than that OID. and numeric oids
- * will be processed automatically. The passed in converter is used to convert the
- * string values to the right of each equals sign to their ASN.1 counterparts.
- *
- * @param reverse true if we should start scanning from the end, false otherwise.
- * @param lookUp table of names and oids.
- * @param dirName the string dirName
- * @param converter the converter to convert string values into their ASN.1 equivalents
- */
- public X509Name(
- bool reverse,
- IDictionary lookUp,
- string dirName,
- X509NameEntryConverter converter)
- {
- this.converter = converter;
- X509NameTokenizer nTok = new X509NameTokenizer(dirName);
-
- while (nTok.HasMoreTokens())
- {
- string token = nTok.NextToken();
- int index = token.IndexOf('=');
-
- if (index == -1)
- {
- throw new ArgumentException("badly formated directory string");
- }
-
- string name = token.Substring(0, index);
- string value = token.Substring(index + 1);
- DerObjectIdentifier oid = DecodeOid(name, lookUp);
-
- if (value.IndexOf('+') > 0)
- {
- X509NameTokenizer vTok = new X509NameTokenizer(value, '+');
- string v = vTok.NextToken();
-
- this.ordering.Add(oid);
- this.values.Add(v);
- this.added.Add(false);
-
- while (vTok.HasMoreTokens())
- {
- string sv = vTok.NextToken();
- int ndx = sv.IndexOf('=');
-
- string nm = sv.Substring(0, ndx);
- string vl = sv.Substring(ndx + 1);
- this.ordering.Add(DecodeOid(nm, lookUp));
- this.values.Add(vl);
- this.added.Add(true);
- }
- }
- else
- {
- this.ordering.Add(oid);
- this.values.Add(value);
- this.added.Add(false);
- }
- }
-
- if (reverse)
- {
-// this.ordering.Reverse();
-// this.values.Reverse();
-// this.added.Reverse();
- IList o = Platform.CreateArrayList();
- IList v = Platform.CreateArrayList();
- IList a = Platform.CreateArrayList();
- int count = 1;
-
- for (int i = 0; i < this.ordering.Count; i++)
- {
- if (!((bool) this.added[i]))
- {
- count = 0;
- }
-
- int index = count++;
-
- o.Insert(index, this.ordering[i]);
- v.Insert(index, this.values[i]);
- a.Insert(index, this.added[i]);
- }
-
- this.ordering = o;
- this.values = v;
- this.added = a;
- }
- }
-
- /**
- * return an IList of the oids in the name, in the order they were found.
- */
- public IList GetOidList()
- {
- return Platform.CreateArrayList(ordering);
- }
-
- /**
- * return an IList of the values found in the name, in the order they
- * were found.
- */
- public IList GetValueList()
- {
- return GetValueList(null);
- }
-
- /**
- * return an IList of the values found in the name, in the order they
- * were found, with the DN label corresponding to passed in oid.
- */
- public IList GetValueList(DerObjectIdentifier oid)
- {
- IList v = Platform.CreateArrayList();
- for (int i = 0; i != values.Count; i++)
- {
- if (null == oid || oid.Equals(ordering[i]))
- {
- string val = (string)values[i];
-
- if (Platform.StartsWith(val, "\\#"))
- {
- val = val.Substring(1);
- }
-
- v.Add(val);
- }
- }
- return v;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- if (seq == null)
- {
- Asn1EncodableVector vec = new Asn1EncodableVector();
- Asn1EncodableVector sVec = new Asn1EncodableVector();
- DerObjectIdentifier lstOid = null;
-
- for (int i = 0; i != ordering.Count; i++)
- {
- DerObjectIdentifier oid = (DerObjectIdentifier)ordering[i];
- string str = (string)values[i];
-
- if (lstOid == null
- || ((bool)this.added[i]))
- {
- }
- else
- {
- vec.Add(new DerSet(sVec));
- sVec = new Asn1EncodableVector();
- }
-
- sVec.Add(
- new DerSequence(
- oid,
- converter.GetConvertedValue(oid, str)));
-
- lstOid = oid;
- }
-
- vec.Add(new DerSet(sVec));
-
- seq = new DerSequence(vec);
- }
-
- return seq;
- }
-
- /// The X509Name object to test equivalency against.
- /// If true, the order of elements must be the same,
- /// as well as the values associated with each element.
- public bool Equivalent(
- X509Name other,
- bool inOrder)
- {
- if (!inOrder)
- return this.Equivalent(other);
-
- if (other == null)
- return false;
-
- if (other == this)
- return true;
-
- int orderingSize = ordering.Count;
-
- if (orderingSize != other.ordering.Count)
- return false;
-
- for (int i = 0; i < orderingSize; i++)
- {
- DerObjectIdentifier oid = (DerObjectIdentifier) ordering[i];
- DerObjectIdentifier oOid = (DerObjectIdentifier) other.ordering[i];
-
- if (!oid.Equals(oOid))
- return false;
-
- string val = (string) values[i];
- string oVal = (string) other.values[i];
-
- if (!equivalentStrings(val, oVal))
- return false;
- }
-
- return true;
- }
-
- /**
- * test for equivalence - note: case is ignored.
- */
- public bool Equivalent(
- X509Name other)
- {
- if (other == null)
- return false;
-
- if (other == this)
- return true;
-
- int orderingSize = ordering.Count;
-
- if (orderingSize != other.ordering.Count)
- {
- return false;
- }
-
- bool[] indexes = new bool[orderingSize];
- int start, end, delta;
-
- if (ordering[0].Equals(other.ordering[0])) // guess forward
- {
- start = 0;
- end = orderingSize;
- delta = 1;
- }
- else // guess reversed - most common problem
- {
- start = orderingSize - 1;
- end = -1;
- delta = -1;
- }
-
- for (int i = start; i != end; i += delta)
- {
- bool found = false;
- DerObjectIdentifier oid = (DerObjectIdentifier)ordering[i];
- string value = (string)values[i];
-
- for (int j = 0; j < orderingSize; j++)
- {
- if (indexes[j])
- {
- continue;
- }
-
- DerObjectIdentifier oOid = (DerObjectIdentifier)other.ordering[j];
-
- if (oid.Equals(oOid))
- {
- string oValue = (string)other.values[j];
-
- if (equivalentStrings(value, oValue))
- {
- indexes[j] = true;
- found = true;
- break;
- }
- }
- }
-
- if (!found)
- {
- return false;
- }
- }
-
- return true;
- }
-
- private static bool equivalentStrings(
- string s1,
- string s2)
- {
- string v1 = canonicalize(s1);
- string v2 = canonicalize(s2);
-
- if (!v1.Equals(v2))
- {
- v1 = stripInternalSpaces(v1);
- v2 = stripInternalSpaces(v2);
-
- if (!v1.Equals(v2))
- {
- return false;
- }
- }
-
- return true;
- }
-
- private static string canonicalize(
- string s)
- {
- string v = Platform.ToLowerInvariant(s).Trim();
-
- if (Platform.StartsWith(v, "#"))
- {
- Asn1Object obj = decodeObject(v);
-
- if (obj is IAsn1String)
- {
- v = Platform.ToLowerInvariant(((IAsn1String)obj).GetString()).Trim();
- }
- }
-
- return v;
- }
-
- private static Asn1Object decodeObject(
- string v)
- {
- try
- {
- return Asn1Object.FromByteArray(Hex.Decode(v.Substring(1)));
- }
- catch (IOException e)
- {
- throw new InvalidOperationException("unknown encoding in name: " + e.Message, e);
- }
- }
-
- private static string stripInternalSpaces(
- string str)
- {
- StringBuilder res = new StringBuilder();
-
- if (str.Length != 0)
- {
- char c1 = str[0];
-
- res.Append(c1);
-
- for (int k = 1; k < str.Length; k++)
- {
- char c2 = str[k];
- if (!(c1 == ' ' && c2 == ' '))
- {
- res.Append(c2);
- }
- c1 = c2;
- }
- }
-
- return res.ToString();
- }
-
- private void AppendValue(
- StringBuilder buf,
- IDictionary oidSymbols,
- DerObjectIdentifier oid,
- string val)
- {
- string sym = (string)oidSymbols[oid];
-
- if (sym != null)
- {
- buf.Append(sym);
- }
- else
- {
- buf.Append(oid.Id);
- }
-
- buf.Append('=');
-
- int index = buf.Length;
-
- buf.Append(val);
-
- int end = buf.Length;
-
- if (Platform.StartsWith(val, "\\#"))
- {
- index += 2;
- }
-
- while (index != end)
- {
- if ((buf[index] == ',')
- || (buf[index] == '"')
- || (buf[index] == '\\')
- || (buf[index] == '+')
- || (buf[index] == '=')
- || (buf[index] == '<')
- || (buf[index] == '>')
- || (buf[index] == ';'))
- {
- buf.Insert(index++, "\\");
- end++;
- }
-
- index++;
- }
- }
-
- /**
- * convert the structure to a string - if reverse is true the
- * oids and values are listed out starting with the last element
- * in the sequence (ala RFC 2253), otherwise the string will begin
- * with the first element of the structure. If no string definition
- * for the oid is found in oidSymbols the string value of the oid is
- * added. Two standard symbol tables are provided DefaultSymbols, and
- * RFC2253Symbols as part of this class.
- *
- * @param reverse if true start at the end of the sequence and work back.
- * @param oidSymbols look up table strings for oids.
- */
- public string ToString(
- bool reverse,
- IDictionary oidSymbols)
- {
-#if SILVERLIGHT || PORTABLE
- List components = new List();
-#else
- ArrayList components = new ArrayList();
-#endif
-
- StringBuilder ava = null;
-
- for (int i = 0; i < ordering.Count; i++)
- {
- if ((bool) added[i])
- {
- ava.Append('+');
- AppendValue(ava, oidSymbols,
- (DerObjectIdentifier)ordering[i],
- (string)values[i]);
- }
- else
- {
- ava = new StringBuilder();
- AppendValue(ava, oidSymbols,
- (DerObjectIdentifier)ordering[i],
- (string)values[i]);
- components.Add(ava);
- }
- }
-
- if (reverse)
- {
- components.Reverse();
- }
-
- StringBuilder buf = new StringBuilder();
-
- if (components.Count > 0)
- {
- buf.Append(components[0].ToString());
-
- for (int i = 1; i < components.Count; ++i)
- {
- buf.Append(',');
- buf.Append(components[i].ToString());
- }
- }
-
- return buf.ToString();
- }
-
- public override string ToString()
- {
- return ToString(DefaultReverse, (IDictionary)DefaultSymbols);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/X509NameEntryConverter.cs b/BCCrypto/src/asn1/x509/X509NameEntryConverter.cs
deleted file mode 100644
index 5872656..0000000
--- a/BCCrypto/src/asn1/x509/X509NameEntryConverter.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-using System;
-using System.Globalization;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * It turns out that the number of standard ways the fields in a DN should be
- * encoded into their ASN.1 counterparts is rapidly approaching the
- * number of machines on the internet. By default the X509Name class
- * will produce UTF8Strings in line with the current recommendations (RFC 3280).
- *
- * An example of an encoder look like below:
- *
- * public class X509DirEntryConverter
- * : X509NameEntryConverter
- * {
- * public Asn1Object GetConvertedValue(
- * DerObjectIdentifier oid,
- * string value)
- * {
- * if (str.Length() != 0 && str.charAt(0) == '#')
- * {
- * return ConvertHexEncoded(str, 1);
- * }
- * if (oid.Equals(EmailAddress))
- * {
- * return new DerIA5String(str);
- * }
- * else if (CanBePrintable(str))
- * {
- * return new DerPrintableString(str);
- * }
- * else if (CanBeUTF8(str))
- * {
- * return new DerUtf8String(str);
- * }
- * else
- * {
- * return new DerBmpString(str);
- * }
- * }
- * }
- *
- *
- */
- public abstract class X509NameEntryConverter
- {
- /**
- * Convert an inline encoded hex string rendition of an ASN.1
- * object back into its corresponding ASN.1 object.
- *
- * @param str the hex encoded object
- * @param off the index at which the encoding starts
- * @return the decoded object
- */
- protected Asn1Object ConvertHexEncoded(
- string hexString,
- int offset)
- {
- string str = hexString.Substring(offset);
-
- return Asn1Object.FromByteArray(Hex.Decode(str));
- }
-
- /**
- * return true if the passed in string can be represented without
- * loss as a PrintableString, false otherwise.
- */
- protected bool CanBePrintable(
- string str)
- {
- return DerPrintableString.IsPrintableString(str);
- }
-
- /**
- * Convert the passed in string value into the appropriate ASN.1
- * encoded object.
- *
- * @param oid the oid associated with the value in the DN.
- * @param value the value of the particular DN component.
- * @return the ASN.1 equivalent for the value.
- */
- public abstract Asn1Object GetConvertedValue(DerObjectIdentifier oid, string value);
- }
-}
diff --git a/BCCrypto/src/asn1/x509/X509NameTokenizer.cs b/BCCrypto/src/asn1/x509/X509NameTokenizer.cs
deleted file mode 100644
index ab55295..0000000
--- a/BCCrypto/src/asn1/x509/X509NameTokenizer.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System.Text;
-
-namespace Org.BouncyCastle.Asn1.X509
-{
- /**
- * class for breaking up an X500 Name into it's component tokens, ala
- * java.util.StringTokenizer. We need this class as some of the
- * lightweight Java environment don't support classes like
- * StringTokenizer.
- */
- public class X509NameTokenizer
- {
- private string value;
- private int index;
- private char separator;
- private StringBuilder buffer = new StringBuilder();
-
- public X509NameTokenizer(
- string oid)
- : this(oid, ',')
- {
- }
-
- public X509NameTokenizer(
- string oid,
- char separator)
- {
- this.value = oid;
- this.index = -1;
- this.separator = separator;
- }
-
- public bool HasMoreTokens()
- {
- return index != value.Length;
- }
-
- public string NextToken()
- {
- if (index == value.Length)
- {
- return null;
- }
-
- int end = index + 1;
- bool quoted = false;
- bool escaped = false;
-
- buffer.Remove(0, buffer.Length);
-
- while (end != value.Length)
- {
- char c = value[end];
-
- if (c == '"')
- {
- if (!escaped)
- {
- quoted = !quoted;
- }
- else
- {
- buffer.Append(c);
- escaped = false;
- }
- }
- else
- {
- if (escaped || quoted)
- {
- if (c == '#' && buffer[buffer.Length - 1] == '=')
- {
- buffer.Append('\\');
- }
- else if (c == '+' && separator != '+')
- {
- buffer.Append('\\');
- }
- buffer.Append(c);
- escaped = false;
- }
- else if (c == '\\')
- {
- escaped = true;
- }
- else if (c == separator)
- {
- break;
- }
- else
- {
- buffer.Append(c);
- }
- }
-
- end++;
- }
-
- index = end;
-
- return buffer.ToString().Trim();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/X509ObjectIdentifiers.cs b/BCCrypto/src/asn1/x509/X509ObjectIdentifiers.cs
deleted file mode 100644
index f00e314..0000000
--- a/BCCrypto/src/asn1/x509/X509ObjectIdentifiers.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-namespace Org.BouncyCastle.Asn1.X509
-{
- public abstract class X509ObjectIdentifiers
- {
- //
- // base id
- //
- internal const string ID = "2.5.4";
-
- public static readonly DerObjectIdentifier CommonName = new DerObjectIdentifier(ID + ".3");
- public static readonly DerObjectIdentifier CountryName = new DerObjectIdentifier(ID + ".6");
- public static readonly DerObjectIdentifier LocalityName = new DerObjectIdentifier(ID + ".7");
- public static readonly DerObjectIdentifier StateOrProvinceName = new DerObjectIdentifier(ID + ".8");
- public static readonly DerObjectIdentifier Organization = new DerObjectIdentifier(ID + ".10");
- public static readonly DerObjectIdentifier OrganizationalUnitName = new DerObjectIdentifier(ID + ".11");
-
- public static readonly DerObjectIdentifier id_at_telephoneNumber = new DerObjectIdentifier(ID + ".20");
- public static readonly DerObjectIdentifier id_at_name = new DerObjectIdentifier(ID + ".41");
-
- // id-SHA1 OBJECT IDENTIFIER ::=
- // {iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 } //
- public static readonly DerObjectIdentifier IdSha1 = new DerObjectIdentifier("1.3.14.3.2.26");
-
- //
- // ripemd160 OBJECT IDENTIFIER ::=
- // {iso(1) identified-organization(3) TeleTrust(36) algorithm(3) hashAlgorithm(2) RipeMD-160(1)}
- //
- public static readonly DerObjectIdentifier RipeMD160 = new DerObjectIdentifier("1.3.36.3.2.1");
-
- //
- // ripemd160WithRSAEncryption OBJECT IDENTIFIER ::=
- // {iso(1) identified-organization(3) TeleTrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) rsaSignatureWithripemd160(2) }
- //
- public static readonly DerObjectIdentifier RipeMD160WithRsaEncryption = new DerObjectIdentifier("1.3.36.3.3.1.2");
-
- public static readonly DerObjectIdentifier IdEARsa = new DerObjectIdentifier("2.5.8.1.1");
-
- // id-pkix
- public static readonly DerObjectIdentifier IdPkix = new DerObjectIdentifier("1.3.6.1.5.5.7");
-
- //
- // private internet extensions
- //
- public static readonly DerObjectIdentifier IdPE = new DerObjectIdentifier(IdPkix + ".1");
-
- //
- // authority information access
- //
- public static readonly DerObjectIdentifier IdAD = new DerObjectIdentifier(IdPkix + ".48");
- public static readonly DerObjectIdentifier IdADCAIssuers = new DerObjectIdentifier(IdAD + ".2");
- public static readonly DerObjectIdentifier IdADOcsp = new DerObjectIdentifier(IdAD + ".1");
-
- //
- // OID for ocsp and crl uri in AuthorityInformationAccess extension
- //
- public static readonly DerObjectIdentifier OcspAccessMethod = IdADOcsp;
- public static readonly DerObjectIdentifier CrlAccessMethod = IdADCAIssuers;
- }
-}
diff --git a/BCCrypto/src/asn1/x509/qualified/BiometricData.cs b/BCCrypto/src/asn1/x509/qualified/BiometricData.cs
deleted file mode 100644
index bb70c34..0000000
--- a/BCCrypto/src/asn1/x509/qualified/BiometricData.cs
+++ /dev/null
@@ -1,110 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509.Qualified
-{
- /**
- * The BiometricData object.
- *
- * BiometricData ::= SEQUENCE {
- * typeOfBiometricData TypeOfBiometricData,
- * hashAlgorithm AlgorithmIdentifier,
- * biometricDataHash OCTET STRING,
- * sourceDataUri IA5String OPTIONAL }
- *
- */
- public class BiometricData
- : Asn1Encodable
- {
- private readonly TypeOfBiometricData typeOfBiometricData;
- private readonly AlgorithmIdentifier hashAlgorithm;
- private readonly Asn1OctetString biometricDataHash;
- private readonly DerIA5String sourceDataUri;
-
- public static BiometricData GetInstance(
- object obj)
- {
- if (obj == null || obj is BiometricData)
- {
- return (BiometricData)obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new BiometricData(Asn1Sequence.GetInstance(obj));
- }
-
- throw new ArgumentException("unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- private BiometricData(
- Asn1Sequence seq)
- {
- typeOfBiometricData = TypeOfBiometricData.GetInstance(seq[0]);
- hashAlgorithm = AlgorithmIdentifier.GetInstance(seq[1]);
- biometricDataHash = Asn1OctetString.GetInstance(seq[2]);
-
- if (seq.Count > 3)
- {
- sourceDataUri = DerIA5String.GetInstance(seq[3]);
- }
- }
-
- public BiometricData(
- TypeOfBiometricData typeOfBiometricData,
- AlgorithmIdentifier hashAlgorithm,
- Asn1OctetString biometricDataHash,
- DerIA5String sourceDataUri)
- {
- this.typeOfBiometricData = typeOfBiometricData;
- this.hashAlgorithm = hashAlgorithm;
- this.biometricDataHash = biometricDataHash;
- this.sourceDataUri = sourceDataUri;
- }
-
- public BiometricData(
- TypeOfBiometricData typeOfBiometricData,
- AlgorithmIdentifier hashAlgorithm,
- Asn1OctetString biometricDataHash)
- {
- this.typeOfBiometricData = typeOfBiometricData;
- this.hashAlgorithm = hashAlgorithm;
- this.biometricDataHash = biometricDataHash;
- this.sourceDataUri = null;
- }
-
- public TypeOfBiometricData TypeOfBiometricData
- {
- get { return typeOfBiometricData; }
- }
-
- public AlgorithmIdentifier HashAlgorithm
- {
- get { return hashAlgorithm; }
- }
-
- public Asn1OctetString BiometricDataHash
- {
- get { return biometricDataHash; }
- }
-
- public DerIA5String SourceDataUri
- {
- get { return sourceDataUri; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector seq = new Asn1EncodableVector(
- typeOfBiometricData, hashAlgorithm, biometricDataHash);
-
- if (sourceDataUri != null)
- {
- seq.Add(sourceDataUri);
- }
-
- return new DerSequence(seq);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/qualified/ETSIQCObjectIdentifiers.cs b/BCCrypto/src/asn1/x509/qualified/ETSIQCObjectIdentifiers.cs
deleted file mode 100644
index 86a4eee..0000000
--- a/BCCrypto/src/asn1/x509/qualified/ETSIQCObjectIdentifiers.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.X509.Qualified
-{
- public abstract class EtsiQCObjectIdentifiers
- {
- //
- // base id
- //
- public static readonly DerObjectIdentifier IdEtsiQcs = new DerObjectIdentifier("0.4.0.1862.1");
-
- public static readonly DerObjectIdentifier IdEtsiQcsQcCompliance = new DerObjectIdentifier(IdEtsiQcs+".1");
- public static readonly DerObjectIdentifier IdEtsiQcsLimitValue = new DerObjectIdentifier(IdEtsiQcs+".2");
- public static readonly DerObjectIdentifier IdEtsiQcsRetentionPeriod = new DerObjectIdentifier(IdEtsiQcs+".3");
- public static readonly DerObjectIdentifier IdEtsiQcsQcSscd = new DerObjectIdentifier(IdEtsiQcs+".4");
- }
-}
diff --git a/BCCrypto/src/asn1/x509/qualified/Iso4217CurrencyCode.cs b/BCCrypto/src/asn1/x509/qualified/Iso4217CurrencyCode.cs
deleted file mode 100644
index 9ec88f5..0000000
--- a/BCCrypto/src/asn1/x509/qualified/Iso4217CurrencyCode.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509.Qualified
-{
- /**
- * The Iso4217CurrencyCode object.
- *
- * Iso4217CurrencyCode ::= CHOICE {
- * alphabetic PrintableString (SIZE 3), --Recommended
- * numeric INTEGER (1..999) }
- * -- Alphabetic or numeric currency code as defined in ISO 4217
- * -- It is recommended that the Alphabetic form is used
- *
- */
- public class Iso4217CurrencyCode
- : Asn1Encodable, IAsn1Choice
- {
- internal const int AlphabeticMaxSize = 3;
- internal const int NumericMinSize = 1;
- internal const int NumericMaxSize = 999;
-
- internal Asn1Encodable obj;
-// internal int numeric;
-
- public static Iso4217CurrencyCode GetInstance(
- object obj)
- {
- if (obj == null || obj is Iso4217CurrencyCode)
- {
- return (Iso4217CurrencyCode) obj;
- }
-
- if (obj is DerInteger)
- {
- DerInteger numericobj = DerInteger.GetInstance(obj);
- int numeric = numericobj.Value.IntValue;
- return new Iso4217CurrencyCode(numeric);
- }
-
- if (obj is DerPrintableString)
- {
- DerPrintableString alphabetic = DerPrintableString.GetInstance(obj);
- return new Iso4217CurrencyCode(alphabetic.GetString());
- }
-
- throw new ArgumentException("unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- public Iso4217CurrencyCode(
- int numeric)
- {
- if (numeric > NumericMaxSize || numeric < NumericMinSize)
- {
- throw new ArgumentException("wrong size in numeric code : not in (" + NumericMinSize + ".." + NumericMaxSize + ")");
- }
-
- obj = new DerInteger(numeric);
- }
-
- public Iso4217CurrencyCode(
- string alphabetic)
- {
- if (alphabetic.Length > AlphabeticMaxSize)
- {
- throw new ArgumentException("wrong size in alphabetic code : max size is " + AlphabeticMaxSize);
- }
-
- obj = new DerPrintableString(alphabetic);
- }
-
- public bool IsAlphabetic { get { return obj is DerPrintableString; } }
-
- public string Alphabetic { get { return ((DerPrintableString) obj).GetString(); } }
-
- public int Numeric { get { return ((DerInteger)obj).Value.IntValue; } }
-
- public override Asn1Object ToAsn1Object()
- {
- return obj.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/qualified/MonetaryValue.cs b/BCCrypto/src/asn1/x509/qualified/MonetaryValue.cs
deleted file mode 100644
index d703de9..0000000
--- a/BCCrypto/src/asn1/x509/qualified/MonetaryValue.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509.Qualified
-{
- /**
- * The MonetaryValue object.
- *
- * MonetaryValue ::= SEQUENCE {
- * currency Iso4217CurrencyCode,
- * amount INTEGER,
- * exponent INTEGER }
- * -- value = amount * 10^exponent
- *
- */
- public class MonetaryValue
- : Asn1Encodable
- {
- internal Iso4217CurrencyCode currency;
- internal DerInteger amount;
- internal DerInteger exponent;
-
- public static MonetaryValue GetInstance(
- object obj)
- {
- if (obj == null || obj is MonetaryValue)
- {
- return (MonetaryValue) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new MonetaryValue(Asn1Sequence.GetInstance(obj));
- }
-
- throw new ArgumentException("unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- private MonetaryValue(
- Asn1Sequence seq)
- {
- if (seq.Count != 3)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- currency = Iso4217CurrencyCode.GetInstance(seq[0]);
- amount = DerInteger.GetInstance(seq[1]);
- exponent = DerInteger.GetInstance(seq[2]);
- }
-
- public MonetaryValue(
- Iso4217CurrencyCode currency,
- int amount,
- int exponent)
- {
- this.currency = currency;
- this.amount = new DerInteger(amount);
- this.exponent = new DerInteger(exponent);
- }
-
- public Iso4217CurrencyCode Currency
- {
- get { return currency; }
- }
-
- public BigInteger Amount
- {
- get { return amount.Value; }
- }
-
- public BigInteger Exponent
- {
- get { return exponent.Value; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(currency, amount, exponent);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/qualified/QCStatement.cs b/BCCrypto/src/asn1/x509/qualified/QCStatement.cs
deleted file mode 100644
index a8e214c..0000000
--- a/BCCrypto/src/asn1/x509/qualified/QCStatement.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509.Qualified
-{
- /**
- * The QCStatement object.
- *
- * QCStatement ::= SEQUENCE {
- * statementId OBJECT IDENTIFIER,
- * statementInfo ANY DEFINED BY statementId OPTIONAL}
- *
- */
- public class QCStatement
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier qcStatementId;
- private readonly Asn1Encodable qcStatementInfo;
-
- public static QCStatement GetInstance(
- object obj)
- {
- if (obj == null || obj is QCStatement)
- {
- return (QCStatement) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new QCStatement(Asn1Sequence.GetInstance(obj));
- }
-
- throw new ArgumentException("unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- private QCStatement(
- Asn1Sequence seq)
- {
- qcStatementId = DerObjectIdentifier.GetInstance(seq[0]);
-
- if (seq.Count > 1)
- {
- qcStatementInfo = seq[1];
- }
- }
-
- public QCStatement(
- DerObjectIdentifier qcStatementId)
- {
- this.qcStatementId = qcStatementId;
- }
-
- public QCStatement(
- DerObjectIdentifier qcStatementId,
- Asn1Encodable qcStatementInfo)
- {
- this.qcStatementId = qcStatementId;
- this.qcStatementInfo = qcStatementInfo;
- }
-
- public DerObjectIdentifier StatementId
- {
- get { return qcStatementId; }
- }
-
- public Asn1Encodable StatementInfo
- {
- get { return qcStatementInfo; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector seq = new Asn1EncodableVector(qcStatementId);
-
- if (qcStatementInfo != null)
- {
- seq.Add(qcStatementInfo);
- }
-
- return new DerSequence(seq);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/qualified/RFC3739QCObjectIdentifiers.cs b/BCCrypto/src/asn1/x509/qualified/RFC3739QCObjectIdentifiers.cs
deleted file mode 100644
index 8ebd69e..0000000
--- a/BCCrypto/src/asn1/x509/qualified/RFC3739QCObjectIdentifiers.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.X509.Qualified
-{
- public sealed class Rfc3739QCObjectIdentifiers
- {
- private Rfc3739QCObjectIdentifiers()
- {
- }
-
- //
- // base id
- //
- public static readonly DerObjectIdentifier IdQcs = new DerObjectIdentifier("1.3.6.1.5.5.7.11");
-
- public static readonly DerObjectIdentifier IdQcsPkixQCSyntaxV1 = new DerObjectIdentifier(IdQcs+".1");
- public static readonly DerObjectIdentifier IdQcsPkixQCSyntaxV2 = new DerObjectIdentifier(IdQcs+".2");
- }
-}
diff --git a/BCCrypto/src/asn1/x509/qualified/SemanticsInformation.cs b/BCCrypto/src/asn1/x509/qualified/SemanticsInformation.cs
deleted file mode 100644
index 5fe5f93..0000000
--- a/BCCrypto/src/asn1/x509/qualified/SemanticsInformation.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509.Qualified
-{
- /**
- * The SemanticsInformation object.
- *
- * SemanticsInformation ::= SEQUENCE {
- * semanticsIdentifier OBJECT IDENTIFIER OPTIONAL,
- * nameRegistrationAuthorities NameRegistrationAuthorities
- * OPTIONAL }
- * (WITH COMPONENTS {..., semanticsIdentifier PRESENT}|
- * WITH COMPONENTS {..., nameRegistrationAuthorities PRESENT})
- *
- * NameRegistrationAuthorities ::= SEQUENCE SIZE (1..MAX) OF
- * GeneralName
- *
- */
- public class SemanticsInformation
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier semanticsIdentifier;
- private readonly GeneralName[] nameRegistrationAuthorities;
-
- public static SemanticsInformation GetInstance(
- object obj)
- {
- if (obj == null || obj is SemanticsInformation)
- {
- return (SemanticsInformation) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new SemanticsInformation(Asn1Sequence.GetInstance(obj));
- }
-
- throw new ArgumentException("unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- public SemanticsInformation(
- Asn1Sequence seq)
- {
- if (seq.Count < 1)
- {
- throw new ArgumentException("no objects in SemanticsInformation");
- }
-
- IEnumerator e = seq.GetEnumerator();
- e.MoveNext();
- object obj = e.Current;
- if (obj is DerObjectIdentifier)
- {
- semanticsIdentifier = DerObjectIdentifier.GetInstance(obj);
- if (e.MoveNext())
- {
- obj = e.Current;
- }
- else
- {
- obj = null;
- }
- }
-
- if (obj != null)
- {
- Asn1Sequence generalNameSeq = Asn1Sequence.GetInstance(obj );
- nameRegistrationAuthorities = new GeneralName[generalNameSeq.Count];
- for (int i= 0; i < generalNameSeq.Count; i++)
- {
- nameRegistrationAuthorities[i] = GeneralName.GetInstance(generalNameSeq[i]);
- }
- }
- }
-
- public SemanticsInformation(
- DerObjectIdentifier semanticsIdentifier,
- GeneralName[] generalNames)
- {
- this.semanticsIdentifier = semanticsIdentifier;
- this.nameRegistrationAuthorities = generalNames;
- }
-
- public SemanticsInformation(
- DerObjectIdentifier semanticsIdentifier)
- {
- this.semanticsIdentifier = semanticsIdentifier;
- }
-
- public SemanticsInformation(
- GeneralName[] generalNames)
- {
- this.nameRegistrationAuthorities = generalNames;
- }
-
- public DerObjectIdentifier SemanticsIdentifier { get { return semanticsIdentifier; } }
-
- public GeneralName[] GetNameRegistrationAuthorities()
- {
- return nameRegistrationAuthorities;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector seq = new Asn1EncodableVector();
-
- if (this.semanticsIdentifier != null)
- {
- seq.Add(semanticsIdentifier);
- }
-
- if (this.nameRegistrationAuthorities != null)
- {
- seq.Add(new DerSequence(nameRegistrationAuthorities));
- }
-
- return new DerSequence(seq);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/qualified/TypeOfBiometricData.cs b/BCCrypto/src/asn1/x509/qualified/TypeOfBiometricData.cs
deleted file mode 100644
index 17b7841..0000000
--- a/BCCrypto/src/asn1/x509/qualified/TypeOfBiometricData.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509.Qualified
-{
- /**
- * The TypeOfBiometricData object.
- *
- * TypeOfBiometricData ::= CHOICE {
- * predefinedBiometricType PredefinedBiometricType,
- * biometricDataOid OBJECT IDENTIFIER }
- *
- * PredefinedBiometricType ::= INTEGER {
- * picture(0),handwritten-signature(1)}
- * (picture|handwritten-signature)
- *
- */
- public class TypeOfBiometricData
- : Asn1Encodable, IAsn1Choice
- {
- public const int Picture = 0;
- public const int HandwrittenSignature = 1;
-
- internal Asn1Encodable obj;
-
- public static TypeOfBiometricData GetInstance(
- object obj)
- {
- if (obj == null || obj is TypeOfBiometricData)
- {
- return (TypeOfBiometricData) obj;
- }
-
- if (obj is DerInteger)
- {
- DerInteger predefinedBiometricTypeObj = DerInteger.GetInstance(obj);
- int predefinedBiometricType = predefinedBiometricTypeObj.Value.IntValue;
-
- return new TypeOfBiometricData(predefinedBiometricType);
- }
-
- if (obj is DerObjectIdentifier)
- {
- DerObjectIdentifier BiometricDataOid = DerObjectIdentifier.GetInstance(obj);
- return new TypeOfBiometricData(BiometricDataOid);
- }
-
- throw new ArgumentException("unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj");
- }
-
- public TypeOfBiometricData(
- int predefinedBiometricType)
- {
- if (predefinedBiometricType == Picture || predefinedBiometricType == HandwrittenSignature)
- {
- obj = new DerInteger(predefinedBiometricType);
- }
- else
- {
- throw new ArgumentException("unknow PredefinedBiometricType : " + predefinedBiometricType);
- }
- }
-
- public TypeOfBiometricData(
- DerObjectIdentifier biometricDataOid)
- {
- obj = biometricDataOid;
- }
-
- public bool IsPredefined
- {
- get { return obj is DerInteger; }
- }
-
- public int PredefinedBiometricType
- {
- get { return ((DerInteger) obj).Value.IntValue; }
- }
-
- public DerObjectIdentifier BiometricDataOid
- {
- get { return (DerObjectIdentifier) obj; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return obj.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/sigi/NameOrPseudonym.cs b/BCCrypto/src/asn1/x509/sigi/NameOrPseudonym.cs
deleted file mode 100644
index 2402e38..0000000
--- a/BCCrypto/src/asn1/x509/sigi/NameOrPseudonym.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X500;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509.SigI
-{
- /**
- * Structure for a name or pseudonym.
- *
- *
- * NameOrPseudonym ::= CHOICE {
- * surAndGivenName SEQUENCE {
- * surName DirectoryString,
- * givenName SEQUENCE OF DirectoryString
- * },
- * pseudonym DirectoryString
- * }
- *
- *
- * @see org.bouncycastle.asn1.x509.sigi.PersonalData
- *
- */
- public class NameOrPseudonym
- : Asn1Encodable, IAsn1Choice
- {
- private readonly DirectoryString pseudonym;
- private readonly DirectoryString surname;
- private readonly Asn1Sequence givenName;
-
- public static NameOrPseudonym GetInstance(
- object obj)
- {
- if (obj == null || obj is NameOrPseudonym)
- {
- return (NameOrPseudonym)obj;
- }
-
- if (obj is IAsn1String)
- {
- return new NameOrPseudonym(DirectoryString.GetInstance(obj));
- }
-
- if (obj is Asn1Sequence)
- {
- return new NameOrPseudonym((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from DERString.
- *
- * The sequence is of type NameOrPseudonym:
- *
- *
- * NameOrPseudonym ::= CHOICE {
- * surAndGivenName SEQUENCE {
- * surName DirectoryString,
- * givenName SEQUENCE OF DirectoryString
- * },
- * pseudonym DirectoryString
- * }
- *
- * @param pseudonym pseudonym value to use.
- */
- public NameOrPseudonym(
- DirectoryString pseudonym)
- {
- this.pseudonym = pseudonym;
- }
-
- /**
- * Constructor from Asn1Sequence.
- *
- * The sequence is of type NameOrPseudonym:
- *
- *
- * NameOrPseudonym ::= CHOICE {
- * surAndGivenName SEQUENCE {
- * surName DirectoryString,
- * givenName SEQUENCE OF DirectoryString
- * },
- * pseudonym DirectoryString
- * }
- *
- *
- * @param seq The ASN.1 sequence.
- */
- private NameOrPseudonym(
- Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- if (!(seq[0] is IAsn1String))
- throw new ArgumentException("Bad object encountered: " + Platform.GetTypeName(seq[0]));
-
- surname = DirectoryString.GetInstance(seq[0]);
- givenName = Asn1Sequence.GetInstance(seq[1]);
- }
-
- /**
- * Constructor from a given details.
- *
- * @param pseudonym The pseudonym.
- */
- public NameOrPseudonym(
- string pseudonym)
- : this(new DirectoryString(pseudonym))
- {
- }
-
- /**
- * Constructor from a given details.
- *
- * @param surname The surname.
- * @param givenName A sequence of directory strings making up the givenName
- */
- public NameOrPseudonym(
- DirectoryString surname,
- Asn1Sequence givenName)
- {
- this.surname = surname;
- this.givenName = givenName;
- }
-
- public DirectoryString Pseudonym
- {
- get { return pseudonym; }
- }
-
- public DirectoryString Surname
- {
- get { return surname; }
- }
-
- public DirectoryString[] GetGivenName()
- {
- DirectoryString[] items = new DirectoryString[givenName.Count];
- int count = 0;
- foreach (object o in givenName)
- {
- items[count++] = DirectoryString.GetInstance(o);
- }
- return items;
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * NameOrPseudonym ::= CHOICE {
- * surAndGivenName SEQUENCE {
- * surName DirectoryString,
- * givenName SEQUENCE OF DirectoryString
- * },
- * pseudonym DirectoryString
- * }
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- if (pseudonym != null)
- {
- return pseudonym.ToAsn1Object();
- }
-
- return new DerSequence(surname, givenName);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/sigi/PersonalData.cs b/BCCrypto/src/asn1/x509/sigi/PersonalData.cs
deleted file mode 100644
index dba345c..0000000
--- a/BCCrypto/src/asn1/x509/sigi/PersonalData.cs
+++ /dev/null
@@ -1,211 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X500;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X509.SigI
-{
- /**
- * Contains personal data for the otherName field in the subjectAltNames
- * extension.
- *
- *
- * PersonalData ::= SEQUENCE {
- * nameOrPseudonym NameOrPseudonym,
- * nameDistinguisher [0] INTEGER OPTIONAL,
- * dateOfBirth [1] GeneralizedTime OPTIONAL,
- * placeOfBirth [2] DirectoryString OPTIONAL,
- * gender [3] PrintableString OPTIONAL,
- * postalAddress [4] DirectoryString OPTIONAL
- * }
- *
- *
- * @see org.bouncycastle.asn1.x509.sigi.NameOrPseudonym
- * @see org.bouncycastle.asn1.x509.sigi.SigIObjectIdentifiers
- */
- public class PersonalData
- : Asn1Encodable
- {
- private readonly NameOrPseudonym nameOrPseudonym;
- private readonly BigInteger nameDistinguisher;
- private readonly DerGeneralizedTime dateOfBirth;
- private readonly DirectoryString placeOfBirth;
- private readonly string gender;
- private readonly DirectoryString postalAddress;
-
- public static PersonalData GetInstance(
- object obj)
- {
- if (obj == null || obj is PersonalData)
- {
- return (PersonalData) obj;
- }
-
- if (obj is Asn1Sequence)
- {
- return new PersonalData((Asn1Sequence) obj);
- }
-
- throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
- }
-
- /**
- * Constructor from Asn1Sequence.
- *
- * The sequence is of type NameOrPseudonym:
- *
- *
- * PersonalData ::= SEQUENCE {
- * nameOrPseudonym NameOrPseudonym,
- * nameDistinguisher [0] INTEGER OPTIONAL,
- * dateOfBirth [1] GeneralizedTime OPTIONAL,
- * placeOfBirth [2] DirectoryString OPTIONAL,
- * gender [3] PrintableString OPTIONAL,
- * postalAddress [4] DirectoryString OPTIONAL
- * }
- *
- *
- * @param seq The ASN.1 sequence.
- */
- private PersonalData(
- Asn1Sequence seq)
- {
- if (seq.Count < 1)
- throw new ArgumentException("Bad sequence size: " + seq.Count);
-
- IEnumerator e = seq.GetEnumerator();
- e.MoveNext();
-
- nameOrPseudonym = NameOrPseudonym.GetInstance(e.Current);
-
- while (e.MoveNext())
- {
- Asn1TaggedObject o = Asn1TaggedObject.GetInstance(e.Current);
- int tag = o.TagNo;
- switch (tag)
- {
- case 0:
- nameDistinguisher = DerInteger.GetInstance(o, false).Value;
- break;
- case 1:
- dateOfBirth = DerGeneralizedTime.GetInstance(o, false);
- break;
- case 2:
- placeOfBirth = DirectoryString.GetInstance(o, true);
- break;
- case 3:
- gender = DerPrintableString.GetInstance(o, false).GetString();
- break;
- case 4:
- postalAddress = DirectoryString.GetInstance(o, true);
- break;
- default:
- throw new ArgumentException("Bad tag number: " + o.TagNo);
- }
- }
- }
-
- /**
- * Constructor from a given details.
- *
- * @param nameOrPseudonym Name or pseudonym.
- * @param nameDistinguisher Name distinguisher.
- * @param dateOfBirth Date of birth.
- * @param placeOfBirth Place of birth.
- * @param gender Gender.
- * @param postalAddress Postal Address.
- */
- public PersonalData(
- NameOrPseudonym nameOrPseudonym,
- BigInteger nameDistinguisher,
- DerGeneralizedTime dateOfBirth,
- DirectoryString placeOfBirth,
- string gender,
- DirectoryString postalAddress)
- {
- this.nameOrPseudonym = nameOrPseudonym;
- this.dateOfBirth = dateOfBirth;
- this.gender = gender;
- this.nameDistinguisher = nameDistinguisher;
- this.postalAddress = postalAddress;
- this.placeOfBirth = placeOfBirth;
- }
-
- public NameOrPseudonym NameOrPseudonym
- {
- get { return nameOrPseudonym; }
- }
-
- public BigInteger NameDistinguisher
- {
- get { return nameDistinguisher; }
- }
-
- public DerGeneralizedTime DateOfBirth
- {
- get { return dateOfBirth; }
- }
-
- public DirectoryString PlaceOfBirth
- {
- get { return placeOfBirth; }
- }
-
- public string Gender
- {
- get { return gender; }
- }
-
- public DirectoryString PostalAddress
- {
- get { return postalAddress; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Returns:
- *
- *
- * PersonalData ::= SEQUENCE {
- * nameOrPseudonym NameOrPseudonym,
- * nameDistinguisher [0] INTEGER OPTIONAL,
- * dateOfBirth [1] GeneralizedTime OPTIONAL,
- * placeOfBirth [2] DirectoryString OPTIONAL,
- * gender [3] PrintableString OPTIONAL,
- * postalAddress [4] DirectoryString OPTIONAL
- * }
- *
- *
- * @return an Asn1Object
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector vec = new Asn1EncodableVector();
- vec.Add(nameOrPseudonym);
- if (nameDistinguisher != null)
- {
- vec.Add(new DerTaggedObject(false, 0, new DerInteger(nameDistinguisher)));
- }
- if (dateOfBirth != null)
- {
- vec.Add(new DerTaggedObject(false, 1, dateOfBirth));
- }
- if (placeOfBirth != null)
- {
- vec.Add(new DerTaggedObject(true, 2, placeOfBirth));
- }
- if (gender != null)
- {
- vec.Add(new DerTaggedObject(false, 3, new DerPrintableString(gender, true)));
- }
- if (postalAddress != null)
- {
- vec.Add(new DerTaggedObject(true, 4, postalAddress));
- }
- return new DerSequence(vec);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x509/sigi/SigIObjectIdentifiers.cs b/BCCrypto/src/asn1/x509/sigi/SigIObjectIdentifiers.cs
deleted file mode 100644
index 682311a..0000000
--- a/BCCrypto/src/asn1/x509/sigi/SigIObjectIdentifiers.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.X509.SigI
-{
- /**
- * Object Identifiers of SigI specifciation (German Signature Law
- * Interoperability specification).
- */
- public sealed class SigIObjectIdentifiers
- {
- private SigIObjectIdentifiers()
- {
- }
-
- public readonly static DerObjectIdentifier IdSigI = new DerObjectIdentifier("1.3.36.8");
-
- /**
- * Key purpose IDs for German SigI (Signature Interoperability
- * Specification)
- */
- public readonly static DerObjectIdentifier IdSigIKP = new DerObjectIdentifier(IdSigI + ".2");
-
- /**
- * Certificate policy IDs for German SigI (Signature Interoperability
- * Specification)
- */
- public readonly static DerObjectIdentifier IdSigICP = new DerObjectIdentifier(IdSigI + ".1");
-
- /**
- * Other Name IDs for German SigI (Signature Interoperability Specification)
- */
- public readonly static DerObjectIdentifier IdSigION = new DerObjectIdentifier(IdSigI + ".4");
-
- /**
- * To be used for for the generation of directory service certificates.
- */
- public static readonly DerObjectIdentifier IdSigIKPDirectoryService = new DerObjectIdentifier(IdSigIKP + ".1");
-
- /**
- * ID for PersonalData
- */
- public static readonly DerObjectIdentifier IdSigIONPersonalData = new DerObjectIdentifier(IdSigION + ".1");
-
- /**
- * Certificate is conform to german signature law.
- */
- public static readonly DerObjectIdentifier IdSigICPSigConform = new DerObjectIdentifier(IdSigICP + ".1");
- }
-}
diff --git a/BCCrypto/src/asn1/x9/DHDomainParameters.cs b/BCCrypto/src/asn1/x9/DHDomainParameters.cs
deleted file mode 100644
index b8c1ac0..0000000
--- a/BCCrypto/src/asn1/x9/DHDomainParameters.cs
+++ /dev/null
@@ -1,118 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- public class DHDomainParameters
- : Asn1Encodable
- {
- private readonly DerInteger p, g, q, j;
- private readonly DHValidationParms validationParms;
-
- public static DHDomainParameters GetInstance(Asn1TaggedObject obj, bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- public static DHDomainParameters GetInstance(object obj)
- {
- if (obj == null || obj is DHDomainParameters)
- return (DHDomainParameters)obj;
-
- if (obj is Asn1Sequence)
- return new DHDomainParameters((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid DHDomainParameters: " + Platform.GetTypeName(obj), "obj");
- }
-
- public DHDomainParameters(DerInteger p, DerInteger g, DerInteger q, DerInteger j,
- DHValidationParms validationParms)
- {
- if (p == null)
- throw new ArgumentNullException("p");
- if (g == null)
- throw new ArgumentNullException("g");
- if (q == null)
- throw new ArgumentNullException("q");
-
- this.p = p;
- this.g = g;
- this.q = q;
- this.j = j;
- this.validationParms = validationParms;
- }
-
- private DHDomainParameters(Asn1Sequence seq)
- {
- if (seq.Count < 3 || seq.Count > 5)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- IEnumerator e = seq.GetEnumerator();
- this.p = DerInteger.GetInstance(GetNext(e));
- this.g = DerInteger.GetInstance(GetNext(e));
- this.q = DerInteger.GetInstance(GetNext(e));
-
- Asn1Encodable next = GetNext(e);
-
- if (next != null && next is DerInteger)
- {
- this.j = DerInteger.GetInstance(next);
- next = GetNext(e);
- }
-
- if (next != null)
- {
- this.validationParms = DHValidationParms.GetInstance(next.ToAsn1Object());
- }
- }
-
- private static Asn1Encodable GetNext(IEnumerator e)
- {
- return e.MoveNext() ? (Asn1Encodable)e.Current : null;
- }
-
- public DerInteger P
- {
- get { return this.p; }
- }
-
- public DerInteger G
- {
- get { return this.g; }
- }
-
- public DerInteger Q
- {
- get { return this.q; }
- }
-
- public DerInteger J
- {
- get { return this.j; }
- }
-
- public DHValidationParms ValidationParms
- {
- get { return this.validationParms; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(p, g, q);
-
- if (this.j != null)
- {
- v.Add(this.j);
- }
-
- if (this.validationParms != null)
- {
- v.Add(this.validationParms);
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/DHPublicKey.cs b/BCCrypto/src/asn1/x9/DHPublicKey.cs
deleted file mode 100644
index 74a14a2..0000000
--- a/BCCrypto/src/asn1/x9/DHPublicKey.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- public class DHPublicKey
- : Asn1Encodable
- {
- private readonly DerInteger y;
-
- public static DHPublicKey GetInstance(Asn1TaggedObject obj, bool isExplicit)
- {
- return GetInstance(DerInteger.GetInstance(obj, isExplicit));
- }
-
- public static DHPublicKey GetInstance(object obj)
- {
- if (obj == null || obj is DHPublicKey)
- return (DHPublicKey)obj;
-
- if (obj is DerInteger)
- return new DHPublicKey((DerInteger)obj);
-
- throw new ArgumentException("Invalid DHPublicKey: " + Platform.GetTypeName(obj), "obj");
- }
-
- public DHPublicKey(DerInteger y)
- {
- if (y == null)
- throw new ArgumentNullException("y");
-
- this.y = y;
- }
-
- public DerInteger Y
- {
- get { return this.y; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return this.y;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/DHValidationParms.cs b/BCCrypto/src/asn1/x9/DHValidationParms.cs
deleted file mode 100644
index c63c502..0000000
--- a/BCCrypto/src/asn1/x9/DHValidationParms.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- public class DHValidationParms
- : Asn1Encodable
- {
- private readonly DerBitString seed;
- private readonly DerInteger pgenCounter;
-
- public static DHValidationParms GetInstance(Asn1TaggedObject obj, bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
-
- public static DHValidationParms GetInstance(object obj)
- {
- if (obj == null || obj is DHDomainParameters)
- return (DHValidationParms)obj;
-
- if (obj is Asn1Sequence)
- return new DHValidationParms((Asn1Sequence)obj);
-
- throw new ArgumentException("Invalid DHValidationParms: " + Platform.GetTypeName(obj), "obj");
- }
-
- public DHValidationParms(DerBitString seed, DerInteger pgenCounter)
- {
- if (seed == null)
- throw new ArgumentNullException("seed");
- if (pgenCounter == null)
- throw new ArgumentNullException("pgenCounter");
-
- this.seed = seed;
- this.pgenCounter = pgenCounter;
- }
-
- private DHValidationParms(Asn1Sequence seq)
- {
- if (seq.Count != 2)
- throw new ArgumentException("Bad sequence size: " + seq.Count, "seq");
-
- this.seed = DerBitString.GetInstance(seq[0]);
- this.pgenCounter = DerInteger.GetInstance(seq[1]);
- }
-
- public DerBitString Seed
- {
- get { return this.seed; }
- }
-
- public DerInteger PgenCounter
- {
- get { return this.pgenCounter; }
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(seed, pgenCounter);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/ECNamedCurveTable.cs b/BCCrypto/src/asn1/x9/ECNamedCurveTable.cs
deleted file mode 100644
index 317ef17..0000000
--- a/BCCrypto/src/asn1/x9/ECNamedCurveTable.cs
+++ /dev/null
@@ -1,162 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.Anssi;
-using Org.BouncyCastle.Asn1.GM;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Sec;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- /**
- * A general class that reads all X9.62 style EC curve tables.
- */
- public class ECNamedCurveTable
- {
- /**
- * return a X9ECParameters object representing the passed in named
- * curve. The routine returns null if the curve is not present.
- *
- * @param name the name of the curve requested
- * @return an X9ECParameters object or null if the curve is not available.
- */
- public static X9ECParameters GetByName(string name)
- {
- X9ECParameters ecP = X962NamedCurves.GetByName(name);
- if (ecP == null)
- {
- ecP = SecNamedCurves.GetByName(name);
- }
- if (ecP == null)
- {
- ecP = NistNamedCurves.GetByName(name);
- }
- if (ecP == null)
- {
- ecP = TeleTrusTNamedCurves.GetByName(name);
- }
- if (ecP == null)
- {
- ecP = AnssiNamedCurves.GetByName(name);
- }
- if (ecP == null)
- {
- ecP = GMNamedCurves.GetByName(name);
- }
- return ecP;
- }
-
- public static string GetName(DerObjectIdentifier oid)
- {
- string name = X962NamedCurves.GetName(oid);
- if (name == null)
- {
- name = SecNamedCurves.GetName(oid);
- }
- if (name == null)
- {
- name = NistNamedCurves.GetName(oid);
- }
- if (name == null)
- {
- name = TeleTrusTNamedCurves.GetName(oid);
- }
- if (name == null)
- {
- name = AnssiNamedCurves.GetName(oid);
- }
- if (name == null)
- {
- name = GMNamedCurves.GetName(oid);
- }
- return name;
- }
-
- /**
- * return the object identifier signified by the passed in name. Null
- * if there is no object identifier associated with name.
- *
- * @return the object identifier associated with name, if present.
- */
- public static DerObjectIdentifier GetOid(string name)
- {
- DerObjectIdentifier oid = X962NamedCurves.GetOid(name);
- if (oid == null)
- {
- oid = SecNamedCurves.GetOid(name);
- }
- if (oid == null)
- {
- oid = NistNamedCurves.GetOid(name);
- }
- if (oid == null)
- {
- oid = TeleTrusTNamedCurves.GetOid(name);
- }
- if (oid == null)
- {
- oid = AnssiNamedCurves.GetOid(name);
- }
- if (oid == null)
- {
- oid = GMNamedCurves.GetOid(name);
- }
- return oid;
- }
-
- /**
- * return a X9ECParameters object representing the passed in named
- * curve.
- *
- * @param oid the object id of the curve requested
- * @return an X9ECParameters object or null if the curve is not available.
- */
- public static X9ECParameters GetByOid(DerObjectIdentifier oid)
- {
- X9ECParameters ecP = X962NamedCurves.GetByOid(oid);
- if (ecP == null)
- {
- ecP = SecNamedCurves.GetByOid(oid);
- }
-
- // NOTE: All the NIST curves are currently from SEC, so no point in redundant OID lookup
-
- if (ecP == null)
- {
- ecP = TeleTrusTNamedCurves.GetByOid(oid);
- }
- if (ecP == null)
- {
- ecP = AnssiNamedCurves.GetByOid(oid);
- }
- if (ecP == null)
- {
- ecP = GMNamedCurves.GetByOid(oid);
- }
- return ecP;
- }
-
- /**
- * return an enumeration of the names of the available curves.
- *
- * @return an enumeration of the names of the available curves.
- */
- public static IEnumerable Names
- {
- get
- {
- IList v = Platform.CreateArrayList();
- CollectionUtilities.AddRange(v, X962NamedCurves.Names);
- CollectionUtilities.AddRange(v, SecNamedCurves.Names);
- CollectionUtilities.AddRange(v, NistNamedCurves.Names);
- CollectionUtilities.AddRange(v, TeleTrusTNamedCurves.Names);
- CollectionUtilities.AddRange(v, AnssiNamedCurves.Names);
- CollectionUtilities.AddRange(v, GMNamedCurves.Names);
- return v;
- }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/KeySpecificInfo.cs b/BCCrypto/src/asn1/x9/KeySpecificInfo.cs
deleted file mode 100644
index 4629864..0000000
--- a/BCCrypto/src/asn1/x9/KeySpecificInfo.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System.Collections;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- /**
- * ASN.1 def for Diffie-Hellman key exchange KeySpecificInfo structure. See
- * RFC 2631, or X9.42, for further details.
- */
- public class KeySpecificInfo
- : Asn1Encodable
- {
- private DerObjectIdentifier algorithm;
- private Asn1OctetString counter;
-
- public KeySpecificInfo(
- DerObjectIdentifier algorithm,
- Asn1OctetString counter)
- {
- this.algorithm = algorithm;
- this.counter = counter;
- }
-
- public KeySpecificInfo(
- Asn1Sequence seq)
- {
- IEnumerator e = seq.GetEnumerator();
-
- e.MoveNext();
- algorithm = (DerObjectIdentifier)e.Current;
- e.MoveNext();
- counter = (Asn1OctetString)e.Current;
- }
-
- public DerObjectIdentifier Algorithm
- {
- get { return algorithm; }
- }
-
- public Asn1OctetString Counter
- {
- get { return counter; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * KeySpecificInfo ::= Sequence {
- * algorithm OBJECT IDENTIFIER,
- * counter OCTET STRING SIZE (4..4)
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(algorithm, counter);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/OtherInfo.cs b/BCCrypto/src/asn1/x9/OtherInfo.cs
deleted file mode 100644
index 21863bd..0000000
--- a/BCCrypto/src/asn1/x9/OtherInfo.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-using System.Collections;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- /**
- * ANS.1 def for Diffie-Hellman key exchange OtherInfo structure. See
- * RFC 2631, or X9.42, for further details.
- */
- public class OtherInfo
- : Asn1Encodable
- {
- private KeySpecificInfo keyInfo;
- private Asn1OctetString partyAInfo;
- private Asn1OctetString suppPubInfo;
-
- public OtherInfo(
- KeySpecificInfo keyInfo,
- Asn1OctetString partyAInfo,
- Asn1OctetString suppPubInfo)
- {
- this.keyInfo = keyInfo;
- this.partyAInfo = partyAInfo;
- this.suppPubInfo = suppPubInfo;
- }
-
- public OtherInfo(
- Asn1Sequence seq)
- {
- IEnumerator e = seq.GetEnumerator();
-
- e.MoveNext();
- keyInfo = new KeySpecificInfo((Asn1Sequence) e.Current);
-
- while (e.MoveNext())
- {
- DerTaggedObject o = (DerTaggedObject) e.Current;
-
- if (o.TagNo == 0)
- {
- partyAInfo = (Asn1OctetString) o.GetObject();
- }
- else if ((int) o.TagNo == 2)
- {
- suppPubInfo = (Asn1OctetString) o.GetObject();
- }
- }
- }
-
- public KeySpecificInfo KeyInfo
- {
- get { return keyInfo; }
- }
-
- public Asn1OctetString PartyAInfo
- {
- get { return partyAInfo; }
- }
-
- public Asn1OctetString SuppPubInfo
- {
- get { return suppPubInfo; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * OtherInfo ::= Sequence {
- * keyInfo KeySpecificInfo,
- * partyAInfo [0] OCTET STRING OPTIONAL,
- * suppPubInfo [2] OCTET STRING
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(keyInfo);
-
- if (partyAInfo != null)
- {
- v.Add(new DerTaggedObject(0, partyAInfo));
- }
-
- v.Add(new DerTaggedObject(2, suppPubInfo));
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/X962NamedCurves.cs b/BCCrypto/src/asn1/x9/X962NamedCurves.cs
deleted file mode 100644
index 14f7f81..0000000
--- a/BCCrypto/src/asn1/x9/X962NamedCurves.cs
+++ /dev/null
@@ -1,751 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- /**
- * table of the current named curves defined in X.962 EC-DSA.
- */
- public sealed class X962NamedCurves
- {
- private X962NamedCurves()
- {
- }
-
- internal class Prime192v1Holder
- : X9ECParametersHolder
- {
- private Prime192v1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Prime192v1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("ffffffffffffffffffffffff99def836146bc9b1b4d22831", 16);
- BigInteger h = BigInteger.One;
-
- ECCurve cFp192v1 = new FpCurve(
- new BigInteger("6277101735386680763835789423207666416083908700390324961279"),
- new BigInteger("fffffffffffffffffffffffffffffffefffffffffffffffc", 16),
- new BigInteger("64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1", 16),
- n, h);
-
- return new X9ECParameters(
- cFp192v1,
- new X9ECPoint(cFp192v1,
- Hex.Decode("03188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012")),
- n, h,
- Hex.Decode("3045AE6FC8422f64ED579528D38120EAE12196D5"));
- }
- }
-
- internal class Prime192v2Holder
- : X9ECParametersHolder
- {
- private Prime192v2Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Prime192v2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("fffffffffffffffffffffffe5fb1a724dc80418648d8dd31", 16);
- BigInteger h = BigInteger.One;
-
- ECCurve cFp192v2 = new FpCurve(
- new BigInteger("6277101735386680763835789423207666416083908700390324961279"),
- new BigInteger("fffffffffffffffffffffffffffffffefffffffffffffffc", 16),
- new BigInteger("cc22d6dfb95c6b25e49c0d6364a4e5980c393aa21668d953", 16),
- n, h);
-
- return new X9ECParameters(
- cFp192v2,
- new X9ECPoint(cFp192v2,
- Hex.Decode("03eea2bae7e1497842f2de7769cfe9c989c072ad696f48034a")),
- n, h,
- Hex.Decode("31a92ee2029fd10d901b113e990710f0d21ac6b6"));
- }
- }
-
- internal class Prime192v3Holder
- : X9ECParametersHolder
- {
- private Prime192v3Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Prime192v3Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("ffffffffffffffffffffffff7a62d031c83f4294f640ec13", 16);
- BigInteger h = BigInteger.One;
-
- ECCurve cFp192v3 = new FpCurve(
- new BigInteger("6277101735386680763835789423207666416083908700390324961279"),
- new BigInteger("fffffffffffffffffffffffffffffffefffffffffffffffc", 16),
- new BigInteger("22123dc2395a05caa7423daeccc94760a7d462256bd56916", 16),
- n, h);
-
- return new X9ECParameters(
- cFp192v3,
- new X9ECPoint(cFp192v3,
- Hex.Decode("027d29778100c65a1da1783716588dce2b8b4aee8e228f1896")),
- n, h,
- Hex.Decode("c469684435deb378c4b65ca9591e2a5763059a2e"));
- }
- }
-
- internal class Prime239v1Holder
- : X9ECParametersHolder
- {
- private Prime239v1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Prime239v1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("7fffffffffffffffffffffff7fffff9e5e9a9f5d9071fbd1522688909d0b", 16);
- BigInteger h = BigInteger.One;
-
- ECCurve cFp239v1 = new FpCurve(
- new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"),
- new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16),
- new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a", 16),
- n, h);
-
- return new X9ECParameters(
- cFp239v1,
- new X9ECPoint(cFp239v1,
- Hex.Decode("020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf")),
- n, h,
- Hex.Decode("e43bb460f0b80cc0c0b075798e948060f8321b7d"));
- }
- }
-
- internal class Prime239v2Holder
- : X9ECParametersHolder
- {
- private Prime239v2Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Prime239v2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("7fffffffffffffffffffffff800000cfa7e8594377d414c03821bc582063", 16);
- BigInteger h = BigInteger.One;
-
- ECCurve cFp239v2 = new FpCurve(
- new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"),
- new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16),
- new BigInteger("617fab6832576cbbfed50d99f0249c3fee58b94ba0038c7ae84c8c832f2c", 16),
- n, h);
-
- return new X9ECParameters(
- cFp239v2,
- new X9ECPoint(cFp239v2,
- Hex.Decode("0238af09d98727705120c921bb5e9e26296a3cdcf2f35757a0eafd87b830e7")),
- n, h,
- Hex.Decode("e8b4011604095303ca3b8099982be09fcb9ae616"));
- }
- }
-
- internal class Prime239v3Holder
- : X9ECParametersHolder
- {
- private Prime239v3Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Prime239v3Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("7fffffffffffffffffffffff7fffff975deb41b3a6057c3c432146526551", 16);
- BigInteger h = BigInteger.One;
-
- ECCurve cFp239v3 = new FpCurve(
- new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"),
- new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16),
- new BigInteger("255705fa2a306654b1f4cb03d6a750a30c250102d4988717d9ba15ab6d3e", 16),
- n, h);
-
- return new X9ECParameters(
- cFp239v3,
- new X9ECPoint(cFp239v3,
- Hex.Decode("036768ae8e18bb92cfcf005c949aa2c6d94853d0e660bbf854b1c9505fe95a")),
- n, h,
- Hex.Decode("7d7374168ffe3471b60a857686a19475d3bfa2ff"));
- }
- }
-
- internal class Prime256v1Holder
- : X9ECParametersHolder
- {
- private Prime256v1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new Prime256v1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", 16);
- BigInteger h = BigInteger.One;
-
- ECCurve cFp256v1 = new FpCurve(
- new BigInteger("115792089210356248762697446949407573530086143415290314195533631308867097853951"),
- new BigInteger("ffffffff00000001000000000000000000000000fffffffffffffffffffffffc", 16),
- new BigInteger("5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", 16),
- n, h);
-
- return new X9ECParameters(
- cFp256v1,
- new X9ECPoint(cFp256v1,
- Hex.Decode("036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296")),
- n, h,
- Hex.Decode("c49d360886e704936a6678e1139d26b7819f7e90"));
- }
- }
-
- /*
- * F2m Curves
- */
- internal class C2pnb163v1Holder
- : X9ECParametersHolder
- {
- private C2pnb163v1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2pnb163v1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("0400000000000000000001E60FC8821CC74DAEAFC1", 16);
- BigInteger h = BigInteger.Two;
-
- ECCurve c2m163v1 = new F2mCurve(
- 163,
- 1, 2, 8,
- new BigInteger("072546B5435234A422E0789675F432C89435DE5242", 16),
- new BigInteger("00C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9", 16),
- n, h);
-
- return new X9ECParameters(
- c2m163v1,
- new X9ECPoint(c2m163v1,
- Hex.Decode("0307AF69989546103D79329FCC3D74880F33BBE803CB")),
- n, h,
- Hex.Decode("D2C0FB15760860DEF1EEF4D696E6768756151754"));
- }
- }
-
- internal class C2pnb163v2Holder
- : X9ECParametersHolder
- {
- private C2pnb163v2Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2pnb163v2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("03FFFFFFFFFFFFFFFFFFFDF64DE1151ADBB78F10A7", 16);
- BigInteger h = BigInteger.Two;
-
- ECCurve c2m163v2 = new F2mCurve(
- 163,
- 1, 2, 8,
- new BigInteger("0108B39E77C4B108BED981ED0E890E117C511CF072", 16),
- new BigInteger("0667ACEB38AF4E488C407433FFAE4F1C811638DF20", 16),
- n, h);
-
- return new X9ECParameters(
- c2m163v2,
- new X9ECPoint(c2m163v2,
- Hex.Decode("030024266E4EB5106D0A964D92C4860E2671DB9B6CC5")),
- n, h,
- null);
- }
- }
-
- internal class C2pnb163v3Holder
- : X9ECParametersHolder
- {
- private C2pnb163v3Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2pnb163v3Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("03FFFFFFFFFFFFFFFFFFFE1AEE140F110AFF961309", 16);
- BigInteger h = BigInteger.Two;
-
- ECCurve c2m163v3 = new F2mCurve(
- 163,
- 1, 2, 8,
- new BigInteger("07A526C63D3E25A256A007699F5447E32AE456B50E", 16),
- new BigInteger("03F7061798EB99E238FD6F1BF95B48FEEB4854252B", 16),
- n, h);
-
- return new X9ECParameters(
- c2m163v3,
- new X9ECPoint(c2m163v3, Hex.Decode("0202F9F87B7C574D0BDECF8A22E6524775F98CDEBDCB")),
- n, h,
- null);
- }
- }
-
- internal class C2pnb176w1Holder
- : X9ECParametersHolder
- {
- private C2pnb176w1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2pnb176w1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("010092537397ECA4F6145799D62B0A19CE06FE26AD", 16);
- BigInteger h = BigInteger.ValueOf(0xFF6E);
-
- ECCurve c2m176w1 = new F2mCurve(
- 176,
- 1, 2, 43,
- new BigInteger("00E4E6DB2995065C407D9D39B8D0967B96704BA8E9C90B", 16),
- new BigInteger("005DDA470ABE6414DE8EC133AE28E9BBD7FCEC0AE0FFF2", 16),
- n, h);
-
- return new X9ECParameters(
- c2m176w1,
- new X9ECPoint(c2m176w1,
- Hex.Decode("038D16C2866798B600F9F08BB4A8E860F3298CE04A5798")),
- n, h,
- null);
- }
- }
-
- internal class C2tnb191v1Holder
- : X9ECParametersHolder
- {
- private C2tnb191v1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2tnb191v1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("40000000000000000000000004A20E90C39067C893BBB9A5", 16);
- BigInteger h = BigInteger.Two;
-
- ECCurve c2m191v1 = new F2mCurve(
- 191,
- 9,
- new BigInteger("2866537B676752636A68F56554E12640276B649EF7526267", 16),
- new BigInteger("2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185EC", 16),
- n, h);
-
- return new X9ECParameters(
- c2m191v1,
- new X9ECPoint(c2m191v1,
- Hex.Decode("0236B3DAF8A23206F9C4F299D7B21A9C369137F2C84AE1AA0D")),
- n, h,
- Hex.Decode("4E13CA542744D696E67687561517552F279A8C84"));
- }
- }
-
- internal class C2tnb191v2Holder
- : X9ECParametersHolder
- {
- private C2tnb191v2Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2tnb191v2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("20000000000000000000000050508CB89F652824E06B8173", 16);
- BigInteger h = BigInteger.ValueOf(4);
-
- ECCurve c2m191v2 = new F2mCurve(
- 191,
- 9,
- new BigInteger("401028774D7777C7B7666D1366EA432071274F89FF01E718", 16),
- new BigInteger("0620048D28BCBD03B6249C99182B7C8CD19700C362C46A01", 16),
- n, h);
-
- return new X9ECParameters(
- c2m191v2,
- new X9ECPoint(c2m191v2,
- Hex.Decode("023809B2B7CC1B28CC5A87926AAD83FD28789E81E2C9E3BF10")),
- n, h,
- null);
- }
- }
-
- internal class C2tnb191v3Holder
- : X9ECParametersHolder
- {
- private C2tnb191v3Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2tnb191v3Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("155555555555555555555555610C0B196812BFB6288A3EA3", 16);
- BigInteger h = BigInteger.ValueOf(6);
-
- ECCurve c2m191v3 = new F2mCurve(
- 191,
- 9,
- new BigInteger("6C01074756099122221056911C77D77E77A777E7E7E77FCB", 16),
- new BigInteger("71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E8", 16),
- n, h);
-
- return new X9ECParameters(
- c2m191v3,
- new X9ECPoint(c2m191v3,
- Hex.Decode("03375D4CE24FDE434489DE8746E71786015009E66E38A926DD")),
- n, h,
- null);
- }
- }
-
- internal class C2pnb208w1Holder
- : X9ECParametersHolder
- {
- private C2pnb208w1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2pnb208w1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("0101BAF95C9723C57B6C21DA2EFF2D5ED588BDD5717E212F9D", 16);
- BigInteger h = BigInteger.ValueOf(0xFE48);
-
- ECCurve c2m208w1 = new F2mCurve(
- 208,
- 1, 2, 83,
- new BigInteger("0", 16),
- new BigInteger("00C8619ED45A62E6212E1160349E2BFA844439FAFC2A3FD1638F9E", 16),
- n, h);
-
- return new X9ECParameters(
- c2m208w1,
- new X9ECPoint(c2m208w1,
- Hex.Decode("0289FDFBE4ABE193DF9559ECF07AC0CE78554E2784EB8C1ED1A57A")),
- n, h,
- null);
- }
- }
-
- internal class C2tnb239v1Holder
- : X9ECParametersHolder
- {
- private C2tnb239v1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2tnb239v1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("2000000000000000000000000000000F4D42FFE1492A4993F1CAD666E447", 16);
- BigInteger h = BigInteger.ValueOf(4);
-
- ECCurve c2m239v1 = new F2mCurve(
- 239,
- 36,
- new BigInteger("32010857077C5431123A46B808906756F543423E8D27877578125778AC76", 16),
- new BigInteger("790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16", 16),
- n, h);
-
- return new X9ECParameters(
- c2m239v1,
- new X9ECPoint(c2m239v1,
- Hex.Decode("0257927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D")),
- n, h,
- null);
- }
- }
-
- internal class C2tnb239v2Holder
- : X9ECParametersHolder
- {
- private C2tnb239v2Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2tnb239v2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("1555555555555555555555555555553C6F2885259C31E3FCDF154624522D", 16);
- BigInteger h = BigInteger.ValueOf(6);
-
- ECCurve c2m239v2 = new F2mCurve(
- 239,
- 36,
- new BigInteger("4230017757A767FAE42398569B746325D45313AF0766266479B75654E65F", 16),
- new BigInteger("5037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B", 16),
- n, h);
-
- return new X9ECParameters(
- c2m239v2,
- new X9ECPoint(c2m239v2,
- Hex.Decode("0228F9D04E900069C8DC47A08534FE76D2B900B7D7EF31F5709F200C4CA205")),
- n, h,
- null);
- }
- }
-
- internal class C2tnb239v3Holder
- : X9ECParametersHolder
- {
- private C2tnb239v3Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2tnb239v3Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC4912D2D9DF903EF9888B8A0E4CFF", 16);
- BigInteger h = BigInteger.ValueOf(10);
-
- ECCurve c2m239v3 = new F2mCurve(
- 239,
- 36,
- new BigInteger("01238774666A67766D6676F778E676B66999176666E687666D8766C66A9F", 16),
- new BigInteger("6A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D40", 16),
- n, h);
-
- return new X9ECParameters(
- c2m239v3,
- new X9ECPoint(c2m239v3,
- Hex.Decode("0370F6E9D04D289C4E89913CE3530BFDE903977D42B146D539BF1BDE4E9C92")),
- n, h,
- null);
- }
- }
-
- internal class C2pnb272w1Holder
- : X9ECParametersHolder
- {
- private C2pnb272w1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2pnb272w1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("0100FAF51354E0E39E4892DF6E319C72C8161603FA45AA7B998A167B8F1E629521", 16);
- BigInteger h = BigInteger.ValueOf(0xFF06);
-
- ECCurve c2m272w1 = new F2mCurve(
- 272,
- 1, 3, 56,
- new BigInteger("0091A091F03B5FBA4AB2CCF49C4EDD220FB028712D42BE752B2C40094DBACDB586FB20", 16),
- new BigInteger("7167EFC92BB2E3CE7C8AAAFF34E12A9C557003D7C73A6FAF003F99F6CC8482E540F7", 16),
- n, h);
-
- return new X9ECParameters(
- c2m272w1,
- new X9ECPoint(c2m272w1,
- Hex.Decode("026108BABB2CEEBCF787058A056CBE0CFE622D7723A289E08A07AE13EF0D10D171DD8D")),
- n, h,
- null);
- }
- }
-
- internal class C2pnb304w1Holder
- : X9ECParametersHolder
- {
- private C2pnb304w1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2pnb304w1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("0101D556572AABAC800101D556572AABAC8001022D5C91DD173F8FB561DA6899164443051D", 16);
- BigInteger h = BigInteger.ValueOf(0xFE2E);
-
- ECCurve c2m304w1 = new F2mCurve(
- 304,
- 1, 2, 11,
- new BigInteger("00FD0D693149A118F651E6DCE6802085377E5F882D1B510B44160074C1288078365A0396C8E681", 16),
- new BigInteger("00BDDB97E555A50A908E43B01C798EA5DAA6788F1EA2794EFCF57166B8C14039601E55827340BE", 16),
- n, h);
-
- return new X9ECParameters(
- c2m304w1,
- new X9ECPoint(c2m304w1,
- Hex.Decode("02197B07845E9BE2D96ADB0F5F3C7F2CFFBD7A3EB8B6FEC35C7FD67F26DDF6285A644F740A2614")),
- n, h,
- null);
- }
- }
-
- internal class C2tnb359v1Holder
- : X9ECParametersHolder
- {
- private C2tnb359v1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2tnb359v1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("01AF286BCA1AF286BCA1AF286BCA1AF286BCA1AF286BC9FB8F6B85C556892C20A7EB964FE7719E74F490758D3B", 16);
- BigInteger h = BigInteger.ValueOf(0x4C);
-
- ECCurve c2m359v1 = new F2mCurve(
- 359,
- 68,
- new BigInteger("5667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223A5E05656FB549016A96656A557", 16),
- new BigInteger("2472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC345626089687742B6329E70680231988", 16),
- n, h);
-
- return new X9ECParameters(
- c2m359v1,
- new X9ECPoint(c2m359v1,
- Hex.Decode("033C258EF3047767E7EDE0F1FDAA79DAEE3841366A132E163ACED4ED2401DF9C6BDCDE98E8E707C07A2239B1B097")),
- n, h,
- null);
- }
- }
-
- internal class C2pnb368w1Holder
- : X9ECParametersHolder
- {
- private C2pnb368w1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2pnb368w1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("010090512DA9AF72B08349D98A5DD4C7B0532ECA51CE03E2D10F3B7AC579BD87E909AE40A6F131E9CFCE5BD967", 16);
- BigInteger h = BigInteger.ValueOf(0xFF70);
-
- ECCurve c2m368w1 = new F2mCurve(
- 368,
- 1, 2, 85,
- new BigInteger("00E0D2EE25095206F5E2A4F9ED229F1F256E79A0E2B455970D8D0D865BD94778C576D62F0AB7519CCD2A1A906AE30D", 16),
- new BigInteger("00FC1217D4320A90452C760A58EDCD30C8DD069B3C34453837A34ED50CB54917E1C2112D84D164F444F8F74786046A", 16),
- n, h);
-
- return new X9ECParameters(
- c2m368w1,
- new X9ECPoint(c2m368w1,
- Hex.Decode("021085E2755381DCCCE3C1557AFA10C2F0C0C2825646C5B34A394CBCFA8BC16B22E7E789E927BE216F02E1FB136A5F")),
- n, h,
- null);
- }
- }
-
- internal class C2tnb431r1Holder
- : X9ECParametersHolder
- {
- private C2tnb431r1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new C2tnb431r1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- BigInteger n = new BigInteger("0340340340340340340340340340340340340340340340340340340323C313FAB50589703B5EC68D3587FEC60D161CC149C1AD4A91", 16);
- BigInteger h = BigInteger.ValueOf(0x2760);
-
- ECCurve c2m431r1 = new F2mCurve(
- 431,
- 120,
- new BigInteger("1A827EF00DD6FC0E234CAF046C6A5D8A85395B236CC4AD2CF32A0CADBDC9DDF620B0EB9906D0957F6C6FEACD615468DF104DE296CD8F", 16),
- new BigInteger("10D9B4A3D9047D8B154359ABFB1B7F5485B04CEB868237DDC9DEDA982A679A5A919B626D4E50A8DD731B107A9962381FB5D807BF2618", 16),
- n, h);
-
- return new X9ECParameters(
- c2m431r1,
- new X9ECPoint(c2m431r1,
- Hex.Decode("02120FC05D3C67A99DE161D2F4092622FECA701BE4F50F4758714E8A87BBF2A658EF8C21E7C5EFE965361F6C2999C0C247B0DBD70CE6B7")),
- n, h,
- null);
- }
- }
-
- private static readonly IDictionary objIds = Platform.CreateHashtable();
- private static readonly IDictionary curves = Platform.CreateHashtable();
- private static readonly IDictionary names = Platform.CreateHashtable();
-
- private static void DefineCurve(
- string name,
- DerObjectIdentifier oid,
- X9ECParametersHolder holder)
- {
- objIds.Add(Platform.ToUpperInvariant(name), oid);
- names.Add(oid, name);
- curves.Add(oid, holder);
- }
-
- static X962NamedCurves()
- {
- DefineCurve("prime192v1", X9ObjectIdentifiers.Prime192v1, Prime192v1Holder.Instance);
- DefineCurve("prime192v2", X9ObjectIdentifiers.Prime192v2, Prime192v2Holder.Instance);
- DefineCurve("prime192v3", X9ObjectIdentifiers.Prime192v3, Prime192v3Holder.Instance);
- DefineCurve("prime239v1", X9ObjectIdentifiers.Prime239v1, Prime239v1Holder.Instance);
- DefineCurve("prime239v2", X9ObjectIdentifiers.Prime239v2, Prime239v2Holder.Instance);
- DefineCurve("prime239v3", X9ObjectIdentifiers.Prime239v3, Prime239v3Holder.Instance);
- DefineCurve("prime256v1", X9ObjectIdentifiers.Prime256v1, Prime256v1Holder.Instance);
- DefineCurve("c2pnb163v1", X9ObjectIdentifiers.C2Pnb163v1, C2pnb163v1Holder.Instance);
- DefineCurve("c2pnb163v2", X9ObjectIdentifiers.C2Pnb163v2, C2pnb163v2Holder.Instance);
- DefineCurve("c2pnb163v3", X9ObjectIdentifiers.C2Pnb163v3, C2pnb163v3Holder.Instance);
- DefineCurve("c2pnb176w1", X9ObjectIdentifiers.C2Pnb176w1, C2pnb176w1Holder.Instance);
- DefineCurve("c2tnb191v1", X9ObjectIdentifiers.C2Tnb191v1, C2tnb191v1Holder.Instance);
- DefineCurve("c2tnb191v2", X9ObjectIdentifiers.C2Tnb191v2, C2tnb191v2Holder.Instance);
- DefineCurve("c2tnb191v3", X9ObjectIdentifiers.C2Tnb191v3, C2tnb191v3Holder.Instance);
- DefineCurve("c2pnb208w1", X9ObjectIdentifiers.C2Pnb208w1, C2pnb208w1Holder.Instance);
- DefineCurve("c2tnb239v1", X9ObjectIdentifiers.C2Tnb239v1, C2tnb239v1Holder.Instance);
- DefineCurve("c2tnb239v2", X9ObjectIdentifiers.C2Tnb239v2, C2tnb239v2Holder.Instance);
- DefineCurve("c2tnb239v3", X9ObjectIdentifiers.C2Tnb239v3, C2tnb239v3Holder.Instance);
- DefineCurve("c2pnb272w1", X9ObjectIdentifiers.C2Pnb272w1, C2pnb272w1Holder.Instance);
- DefineCurve("c2pnb304w1", X9ObjectIdentifiers.C2Pnb304w1, C2pnb304w1Holder.Instance);
- DefineCurve("c2tnb359v1", X9ObjectIdentifiers.C2Tnb359v1, C2tnb359v1Holder.Instance);
- DefineCurve("c2pnb368w1", X9ObjectIdentifiers.C2Pnb368w1, C2pnb368w1Holder.Instance);
- DefineCurve("c2tnb431r1", X9ObjectIdentifiers.C2Tnb431r1, C2tnb431r1Holder.Instance);
- }
-
- public static X9ECParameters GetByName(
- string name)
- {
- DerObjectIdentifier oid = GetOid(name);
- return oid == null ? null : GetByOid(oid);
- }
-
- /**
- * return the X9ECParameters object for the named curve represented by
- * the passed in object identifier. Null if the curve isn't present.
- *
- * @param oid an object identifier representing a named curve, if present.
- */
- public static X9ECParameters GetByOid(
- DerObjectIdentifier oid)
- {
- X9ECParametersHolder holder = (X9ECParametersHolder)curves[oid];
- return holder == null ? null : holder.Parameters;
- }
-
- /**
- * return the object identifier signified by the passed in name. Null
- * if there is no object identifier associated with name.
- *
- * @return the object identifier associated with name, if present.
- */
- public static DerObjectIdentifier GetOid(
- string name)
- {
- return (DerObjectIdentifier)objIds[Platform.ToUpperInvariant(name)];
- }
-
- /**
- * return the named curve name represented by the given object identifier.
- */
- public static string GetName(
- DerObjectIdentifier oid)
- {
- return (string)names[oid];
- }
-
- /**
- * returns an enumeration containing the name strings for curves
- * contained in this structure.
- */
- public static IEnumerable Names
- {
- get { return new EnumerableProxy(names.Values); }
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/X962Parameters.cs b/BCCrypto/src/asn1/x9/X962Parameters.cs
deleted file mode 100644
index 04a5c9c..0000000
--- a/BCCrypto/src/asn1/x9/X962Parameters.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- public class X962Parameters
- : Asn1Encodable, IAsn1Choice
- {
- private readonly Asn1Object _params;
-
- public static X962Parameters GetInstance(
- object obj)
- {
- if (obj == null || obj is X962Parameters)
- {
- return (X962Parameters)obj;
- }
-
- if (obj is Asn1Object)
- {
- return new X962Parameters((Asn1Object)obj);
- }
-
- if (obj is byte[])
- {
- try
- {
- return new X962Parameters(Asn1Object.FromByteArray((byte[])obj));
- }
- catch (Exception e)
- {
- throw new ArgumentException("unable to parse encoded data: " + e.Message, e);
- }
- }
-
- throw new ArgumentException("unknown object in getInstance()");
- }
-
- public X962Parameters(
- X9ECParameters ecParameters)
- {
- this._params = ecParameters.ToAsn1Object();
- }
-
- public X962Parameters(
- DerObjectIdentifier namedCurve)
- {
- this._params = namedCurve;
- }
-
- public X962Parameters(
- Asn1Object obj)
- {
- this._params = obj;
- }
-
- public bool IsNamedCurve
- {
- get { return (_params is DerObjectIdentifier); }
- }
-
- public bool IsImplicitlyCA
- {
- get { return (_params is Asn1Null); }
- }
-
- public Asn1Object Parameters
- {
- get { return _params; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Parameters ::= CHOICE {
- * ecParameters ECParameters,
- * namedCurve CURVES.&id({CurveNames}),
- * implicitlyCA Null
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return _params;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/X9Curve.cs b/BCCrypto/src/asn1/x9/X9Curve.cs
deleted file mode 100644
index f05a946..0000000
--- a/BCCrypto/src/asn1/x9/X9Curve.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- /**
- * ASN.1 def for Elliptic-Curve Curve structure. See
- * X9.62, for further details.
- */
- public class X9Curve
- : Asn1Encodable
- {
- private readonly ECCurve curve;
- private readonly byte[] seed;
- private readonly DerObjectIdentifier fieldIdentifier;
-
- public X9Curve(
- ECCurve curve)
- : this(curve, null)
- {
- }
-
- public X9Curve(
- ECCurve curve,
- byte[] seed)
- {
- if (curve == null)
- throw new ArgumentNullException("curve");
-
- this.curve = curve;
- this.seed = Arrays.Clone(seed);
-
- if (ECAlgorithms.IsFpCurve(curve))
- {
- this.fieldIdentifier = X9ObjectIdentifiers.PrimeField;
- }
- else if (ECAlgorithms.IsF2mCurve(curve))
- {
- this.fieldIdentifier = X9ObjectIdentifiers.CharacteristicTwoField;
- }
- else
- {
- throw new ArgumentException("This type of ECCurve is not implemented");
- }
- }
-
- public X9Curve(
- X9FieldID fieldID,
- Asn1Sequence seq)
- {
- if (fieldID == null)
- throw new ArgumentNullException("fieldID");
- if (seq == null)
- throw new ArgumentNullException("seq");
-
- this.fieldIdentifier = fieldID.Identifier;
-
- if (fieldIdentifier.Equals(X9ObjectIdentifiers.PrimeField))
- {
- BigInteger q = ((DerInteger) fieldID.Parameters).Value;
- X9FieldElement x9A = new X9FieldElement(q, (Asn1OctetString) seq[0]);
- X9FieldElement x9B = new X9FieldElement(q, (Asn1OctetString) seq[1]);
- curve = new FpCurve(q, x9A.Value.ToBigInteger(), x9B.Value.ToBigInteger());
- }
- else
- {
- if (fieldIdentifier.Equals(X9ObjectIdentifiers.CharacteristicTwoField))
- {
- // Characteristic two field
- DerSequence parameters = (DerSequence)fieldID.Parameters;
- int m = ((DerInteger)parameters[0]).Value.IntValue;
- DerObjectIdentifier representation
- = (DerObjectIdentifier)parameters[1];
-
- int k1 = 0;
- int k2 = 0;
- int k3 = 0;
- if (representation.Equals(X9ObjectIdentifiers.TPBasis))
- {
- // Trinomial basis representation
- k1 = ((DerInteger)parameters[2]).Value.IntValue;
- }
- else
- {
- // Pentanomial basis representation
- DerSequence pentanomial = (DerSequence) parameters[2];
- k1 = ((DerInteger) pentanomial[0]).Value.IntValue;
- k2 = ((DerInteger) pentanomial[1]).Value.IntValue;
- k3 = ((DerInteger) pentanomial[2]).Value.IntValue;
- }
- X9FieldElement x9A = new X9FieldElement(m, k1, k2, k3, (Asn1OctetString)seq[0]);
- X9FieldElement x9B = new X9FieldElement(m, k1, k2, k3, (Asn1OctetString)seq[1]);
- // TODO Is it possible to get the order (n) and cofactor(h) too?
- curve = new F2mCurve(m, k1, k2, k3, x9A.Value.ToBigInteger(), x9B.Value.ToBigInteger());
- }
- }
-
- if (seq.Count == 3)
- {
- seed = ((DerBitString) seq[2]).GetBytes();
- }
- }
-
- public ECCurve Curve
- {
- get { return curve; }
- }
-
- public byte[] GetSeed()
- {
- return Arrays.Clone(seed);
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * Curve ::= Sequence {
- * a FieldElement,
- * b FieldElement,
- * seed BIT STRING OPTIONAL
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- if (fieldIdentifier.Equals(X9ObjectIdentifiers.PrimeField)
- || fieldIdentifier.Equals(X9ObjectIdentifiers.CharacteristicTwoField))
- {
- v.Add(new X9FieldElement(curve.A).ToAsn1Object());
- v.Add(new X9FieldElement(curve.B).ToAsn1Object());
- }
-
- if (seed != null)
- {
- v.Add(new DerBitString(seed));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/X9ECParameters.cs b/BCCrypto/src/asn1/x9/X9ECParameters.cs
deleted file mode 100644
index 0fa3437..0000000
--- a/BCCrypto/src/asn1/x9/X9ECParameters.cs
+++ /dev/null
@@ -1,233 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Math.Field;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- /**
- * ASN.1 def for Elliptic-Curve ECParameters structure. See
- * X9.62, for further details.
- */
- public class X9ECParameters
- : Asn1Encodable
- {
- private X9FieldID fieldID;
- private ECCurve curve;
- private X9ECPoint g;
- private BigInteger n;
- private BigInteger h;
- private byte[] seed;
-
- public static X9ECParameters GetInstance(Object obj)
- {
- if (obj is X9ECParameters)
- {
- return (X9ECParameters)obj;
- }
-
- if (obj != null)
- {
- return new X9ECParameters(Asn1Sequence.GetInstance(obj));
- }
-
- return null;
- }
-
- public X9ECParameters(
- Asn1Sequence seq)
- {
- if (!(seq[0] is DerInteger)
- || !((DerInteger) seq[0]).Value.Equals(BigInteger.One))
- {
- throw new ArgumentException("bad version in X9ECParameters");
- }
-
- X9Curve x9c = new X9Curve(
- X9FieldID.GetInstance(seq[1]),
- Asn1Sequence.GetInstance(seq[2]));
-
- this.curve = x9c.Curve;
- object p = seq[3];
-
- if (p is X9ECPoint)
- {
- this.g = ((X9ECPoint)p);
- }
- else
- {
- this.g = new X9ECPoint(curve, (Asn1OctetString)p);
- }
-
- this.n = ((DerInteger)seq[4]).Value;
- this.seed = x9c.GetSeed();
-
- if (seq.Count == 6)
- {
- this.h = ((DerInteger)seq[5]).Value;
- }
- }
-
- public X9ECParameters(
- ECCurve curve,
- ECPoint g,
- BigInteger n)
- : this(curve, g, n, null, null)
- {
- }
-
- public X9ECParameters(
- ECCurve curve,
- X9ECPoint g,
- BigInteger n,
- BigInteger h)
- : this(curve, g, n, h, null)
- {
- }
-
- public X9ECParameters(
- ECCurve curve,
- ECPoint g,
- BigInteger n,
- BigInteger h)
- : this(curve, g, n, h, null)
- {
- }
-
- public X9ECParameters(
- ECCurve curve,
- ECPoint g,
- BigInteger n,
- BigInteger h,
- byte[] seed)
- : this(curve, new X9ECPoint(g), n, h, seed)
- {
- }
-
- public X9ECParameters(
- ECCurve curve,
- X9ECPoint g,
- BigInteger n,
- BigInteger h,
- byte[] seed)
- {
- this.curve = curve;
- this.g = g;
- this.n = n;
- this.h = h;
- this.seed = seed;
-
- if (ECAlgorithms.IsFpCurve(curve))
- {
- this.fieldID = new X9FieldID(curve.Field.Characteristic);
- }
- else if (ECAlgorithms.IsF2mCurve(curve))
- {
- IPolynomialExtensionField field = (IPolynomialExtensionField)curve.Field;
- int[] exponents = field.MinimalPolynomial.GetExponentsPresent();
- if (exponents.Length == 3)
- {
- this.fieldID = new X9FieldID(exponents[2], exponents[1]);
- }
- else if (exponents.Length == 5)
- {
- this.fieldID = new X9FieldID(exponents[4], exponents[1], exponents[2], exponents[3]);
- }
- else
- {
- throw new ArgumentException("Only trinomial and pentomial curves are supported");
- }
- }
- else
- {
- throw new ArgumentException("'curve' is of an unsupported type");
- }
- }
-
- public ECCurve Curve
- {
- get { return curve; }
- }
-
- public ECPoint G
- {
- get { return g.Point; }
- }
-
- public BigInteger N
- {
- get { return n; }
- }
-
- public BigInteger H
- {
- get { return h; }
- }
-
- public byte[] GetSeed()
- {
- return seed;
- }
-
- /**
- * Return the ASN.1 entry representing the Curve.
- *
- * @return the X9Curve for the curve in these parameters.
- */
- public X9Curve CurveEntry
- {
- get { return new X9Curve(curve, seed); }
- }
-
- /**
- * Return the ASN.1 entry representing the FieldID.
- *
- * @return the X9FieldID for the FieldID in these parameters.
- */
- public X9FieldID FieldIDEntry
- {
- get { return fieldID; }
- }
-
- /**
- * Return the ASN.1 entry representing the base point G.
- *
- * @return the X9ECPoint for the base point in these parameters.
- */
- public X9ECPoint BaseEntry
- {
- get { return g; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * ECParameters ::= Sequence {
- * version Integer { ecpVer1(1) } (ecpVer1),
- * fieldID FieldID {{FieldTypes}},
- * curve X9Curve,
- * base X9ECPoint,
- * order Integer,
- * cofactor Integer OPTIONAL
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- new DerInteger(BigInteger.One),
- fieldID,
- new X9Curve(curve, seed),
- g,
- new DerInteger(n));
-
- if (h != null)
- {
- v.Add(new DerInteger(h));
- }
-
- return new DerSequence(v);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/X9ECParametersHolder.cs b/BCCrypto/src/asn1/x9/X9ECParametersHolder.cs
deleted file mode 100644
index e802b73..0000000
--- a/BCCrypto/src/asn1/x9/X9ECParametersHolder.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-namespace Org.BouncyCastle.Asn1.X9
-{
- public abstract class X9ECParametersHolder
- {
- private X9ECParameters parameters;
-
- public X9ECParameters Parameters
- {
- get
- {
- lock (this)
- {
- if (parameters == null)
- {
- parameters = CreateParameters();
- }
-
- return parameters;
- }
- }
- }
-
- protected abstract X9ECParameters CreateParameters();
- }
-}
diff --git a/BCCrypto/src/asn1/x9/X9ECPoint.cs b/BCCrypto/src/asn1/x9/X9ECPoint.cs
deleted file mode 100644
index 7ef4f13..0000000
--- a/BCCrypto/src/asn1/x9/X9ECPoint.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using Org.BouncyCastle.Math.EC;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- /**
- * class for describing an ECPoint as a Der object.
- */
- public class X9ECPoint
- : Asn1Encodable
- {
- private readonly Asn1OctetString encoding;
-
- private ECCurve c;
- private ECPoint p;
-
- public X9ECPoint(ECPoint p)
- : this(p, false)
- {
- }
-
- public X9ECPoint(ECPoint p, bool compressed)
- {
- this.p = p.Normalize();
- this.encoding = new DerOctetString(p.GetEncoded(compressed));
- }
-
- public X9ECPoint(ECCurve c, byte[] encoding)
- {
- this.c = c;
- this.encoding = new DerOctetString(Arrays.Clone(encoding));
- }
-
- public X9ECPoint(ECCurve c, Asn1OctetString s)
- : this(c, s.GetOctets())
- {
- }
-
- public byte[] GetPointEncoding()
- {
- return Arrays.Clone(encoding.GetOctets());
- }
-
- public ECPoint Point
- {
- get
- {
- if (p == null)
- {
- p = c.DecodePoint(encoding.GetOctets()).Normalize();
- }
-
- return p;
- }
- }
-
- public bool IsPointCompressed
- {
- get
- {
- byte[] octets = encoding.GetOctets();
- return octets != null && octets.Length > 0 && (octets[0] == 2 || octets[0] == 3);
- }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * ECPoint ::= OCTET STRING
- *
- *
- * Octet string produced using ECPoint.GetEncoded().
- */
- public override Asn1Object ToAsn1Object()
- {
- return encoding;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/X9FieldElement.cs b/BCCrypto/src/asn1/x9/X9FieldElement.cs
deleted file mode 100644
index 94bd96b..0000000
--- a/BCCrypto/src/asn1/x9/X9FieldElement.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- /**
- * Class for processing an ECFieldElement as a DER object.
- */
- public class X9FieldElement
- : Asn1Encodable
- {
- private ECFieldElement f;
-
- public X9FieldElement(
- ECFieldElement f)
- {
- this.f = f;
- }
-
- public X9FieldElement(
- BigInteger p,
- Asn1OctetString s)
- : this(new FpFieldElement(p, new BigInteger(1, s.GetOctets())))
- {
- }
-
- public X9FieldElement(
- int m,
- int k1,
- int k2,
- int k3,
- Asn1OctetString s)
- : this(new F2mFieldElement(m, k1, k2, k3, new BigInteger(1, s.GetOctets())))
- {
- }
-
- public ECFieldElement Value
- {
- get { return f; }
- }
-
- /**
- * Produce an object suitable for an Asn1OutputStream.
- *
- * FieldElement ::= OCTET STRING
- *
- *
- *
- * if q is an odd prime then the field element is
- * processed as an Integer and converted to an octet string
- * according to x 9.62 4.3.1.
- * if q is 2m then the bit string
- * contained in the field element is converted into an octet
- * string with the same ordering padded at the front if necessary.
- *
- *
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- int byteCount = X9IntegerConverter.GetByteLength(f);
- byte[] paddedBigInteger = X9IntegerConverter.IntegerToBytes(f.ToBigInteger(), byteCount);
-
- return new DerOctetString(paddedBigInteger);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/X9FieldID.cs b/BCCrypto/src/asn1/x9/X9FieldID.cs
deleted file mode 100644
index 08d7d71..0000000
--- a/BCCrypto/src/asn1/x9/X9FieldID.cs
+++ /dev/null
@@ -1,132 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- /**
- * ASN.1 def for Elliptic-Curve Field ID structure. See
- * X9.62, for further details.
- */
- public class X9FieldID
- : Asn1Encodable
- {
- private readonly DerObjectIdentifier id;
- private readonly Asn1Object parameters;
-
- /**
- * Constructor for elliptic curves over prime fields
- * F2 .
- * @param primeP The prime p defining the prime field.
- */
- public X9FieldID(
- BigInteger primeP)
- {
- this.id = X9ObjectIdentifiers.PrimeField;
- this.parameters = new DerInteger(primeP);
- }
-
- /**
- * Constructor for elliptic curves over binary fields
- * F2m .
- * @param m The exponent m of
- * F2m .
- * @param k1 The integer k1 where xm +
- * xk1 + 1
- * represents the reduction polynomial f(z).
- */
- public X9FieldID(int m, int k1)
- : this(m, k1, 0, 0)
- {
- }
-
- /**
- * Constructor for elliptic curves over binary fields
- * F2m .
- * @param m The exponent m of
- * F2m .
- * @param k1 The integer k1 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- * @param k2 The integer k2 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- * @param k3 The integer k3 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z)..
- */
- public X9FieldID(
- int m,
- int k1,
- int k2,
- int k3)
- {
- this.id = X9ObjectIdentifiers.CharacteristicTwoField;
-
- Asn1EncodableVector fieldIdParams = new Asn1EncodableVector(new DerInteger(m));
-
- if (k2 == 0)
- {
- if (k3 != 0)
- throw new ArgumentException("inconsistent k values");
-
- fieldIdParams.Add(
- X9ObjectIdentifiers.TPBasis,
- new DerInteger(k1));
- }
- else
- {
- if (k2 <= k1 || k3 <= k2)
- throw new ArgumentException("inconsistent k values");
-
- fieldIdParams.Add(
- X9ObjectIdentifiers.PPBasis,
- new DerSequence(
- new DerInteger(k1),
- new DerInteger(k2),
- new DerInteger(k3)));
- }
-
- this.parameters = new DerSequence(fieldIdParams);
- }
-
- private X9FieldID(Asn1Sequence seq)
- {
- this.id = DerObjectIdentifier.GetInstance(seq[0]);
- this.parameters = seq[1].ToAsn1Object();
- }
-
- public static X9FieldID GetInstance(object obj)
- {
- if (obj is X9FieldID)
- return (X9FieldID)obj;
- if (obj == null)
- return null;
- return new X9FieldID(Asn1Sequence.GetInstance(obj));
- }
-
- public DerObjectIdentifier Identifier
- {
- get { return id; }
- }
-
- public Asn1Object Parameters
- {
- get { return parameters; }
- }
-
- /**
- * Produce a Der encoding of the following structure.
- *
- * FieldID ::= Sequence {
- * fieldType FIELD-ID.&id({IOSet}),
- * parameters FIELD-ID.&Type({IOSet}{@fieldType})
- * }
- *
- */
- public override Asn1Object ToAsn1Object()
- {
- return new DerSequence(id, parameters);
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/X9IntegerConverter.cs b/BCCrypto/src/asn1/x9/X9IntegerConverter.cs
deleted file mode 100644
index e8f4571..0000000
--- a/BCCrypto/src/asn1/x9/X9IntegerConverter.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- public abstract class X9IntegerConverter
- {
- public static int GetByteLength(ECFieldElement fe)
- {
- return (fe.FieldSize + 7) / 8;
- }
-
- public static int GetByteLength(ECCurve c)
- {
- return (c.FieldSize + 7) / 8;
- }
-
- public static byte[] IntegerToBytes(BigInteger s, int qLength)
- {
- byte[] bytes = s.ToByteArrayUnsigned();
-
- if (qLength < bytes.Length)
- {
- byte[] tmp = new byte[qLength];
- Array.Copy(bytes, bytes.Length - tmp.Length, tmp, 0, tmp.Length);
- return tmp;
- }
- else if (qLength > bytes.Length)
- {
- byte[] tmp = new byte[qLength];
- Array.Copy(bytes, 0, tmp, tmp.Length - bytes.Length, bytes.Length);
- return tmp;
- }
-
- return bytes;
- }
- }
-}
diff --git a/BCCrypto/src/asn1/x9/X9ObjectIdentifiers.cs b/BCCrypto/src/asn1/x9/X9ObjectIdentifiers.cs
deleted file mode 100644
index 9d7ecae..0000000
--- a/BCCrypto/src/asn1/x9/X9ObjectIdentifiers.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.X9
-{
- public abstract class X9ObjectIdentifiers
- {
- //
- // X9.62
- //
- // ansi-X9-62 OBJECT IDENTIFIER ::= { iso(1) member-body(2)
- // us(840) ansi-x962(10045) }
- //
-
- internal const string AnsiX962 = "1.2.840.10045";
-
- public static readonly DerObjectIdentifier ansi_X9_62 = new DerObjectIdentifier(AnsiX962);
-
- public static readonly DerObjectIdentifier IdFieldType = ansi_X9_62.Branch("1");
-
- public static readonly DerObjectIdentifier PrimeField = IdFieldType.Branch("1");
- public static readonly DerObjectIdentifier CharacteristicTwoField = IdFieldType.Branch("2");
-
- public static readonly DerObjectIdentifier GNBasis = CharacteristicTwoField.Branch("3.1");
- public static readonly DerObjectIdentifier TPBasis = CharacteristicTwoField.Branch("3.2");
- public static readonly DerObjectIdentifier PPBasis = CharacteristicTwoField.Branch("3.3");
-
- [Obsolete("Use 'id_ecSigType' instead")]
- public const string IdECSigType = AnsiX962 + ".4";
- public static readonly DerObjectIdentifier id_ecSigType = ansi_X9_62.Branch("4");
-
- public static readonly DerObjectIdentifier ECDsaWithSha1 = id_ecSigType.Branch("1");
-
- [Obsolete("Use 'id_publicKeyType' instead")]
- public const string IdPublicKeyType = AnsiX962 + ".2";
- public static readonly DerObjectIdentifier id_publicKeyType = ansi_X9_62.Branch("2");
-
- public static readonly DerObjectIdentifier IdECPublicKey = id_publicKeyType.Branch("1");
-
- public static readonly DerObjectIdentifier ECDsaWithSha2 = id_ecSigType.Branch("3");
-
- public static readonly DerObjectIdentifier ECDsaWithSha224 = ECDsaWithSha2.Branch("1");
- public static readonly DerObjectIdentifier ECDsaWithSha256 = ECDsaWithSha2.Branch("2");
- public static readonly DerObjectIdentifier ECDsaWithSha384 = ECDsaWithSha2.Branch("3");
- public static readonly DerObjectIdentifier ECDsaWithSha512 = ECDsaWithSha2.Branch("4");
-
-
- //
- // named curves
- //
- public static readonly DerObjectIdentifier EllipticCurve = ansi_X9_62.Branch("3");
-
- //
- // Two Curves
- //
- public static readonly DerObjectIdentifier CTwoCurve = EllipticCurve.Branch("0");
-
- public static readonly DerObjectIdentifier C2Pnb163v1 = CTwoCurve.Branch("1");
- public static readonly DerObjectIdentifier C2Pnb163v2 = CTwoCurve.Branch("2");
- public static readonly DerObjectIdentifier C2Pnb163v3 = CTwoCurve.Branch("3");
- public static readonly DerObjectIdentifier C2Pnb176w1 = CTwoCurve.Branch("4");
- public static readonly DerObjectIdentifier C2Tnb191v1 = CTwoCurve.Branch("5");
- public static readonly DerObjectIdentifier C2Tnb191v2 = CTwoCurve.Branch("6");
- public static readonly DerObjectIdentifier C2Tnb191v3 = CTwoCurve.Branch("7");
- public static readonly DerObjectIdentifier C2Onb191v4 = CTwoCurve.Branch("8");
- public static readonly DerObjectIdentifier C2Onb191v5 = CTwoCurve.Branch("9");
- public static readonly DerObjectIdentifier C2Pnb208w1 = CTwoCurve.Branch("10");
- public static readonly DerObjectIdentifier C2Tnb239v1 = CTwoCurve.Branch("11");
- public static readonly DerObjectIdentifier C2Tnb239v2 = CTwoCurve.Branch("12");
- public static readonly DerObjectIdentifier C2Tnb239v3 = CTwoCurve.Branch("13");
- public static readonly DerObjectIdentifier C2Onb239v4 = CTwoCurve.Branch("14");
- public static readonly DerObjectIdentifier C2Onb239v5 = CTwoCurve.Branch("15");
- public static readonly DerObjectIdentifier C2Pnb272w1 = CTwoCurve.Branch("16");
- public static readonly DerObjectIdentifier C2Pnb304w1 = CTwoCurve.Branch("17");
- public static readonly DerObjectIdentifier C2Tnb359v1 = CTwoCurve.Branch("18");
- public static readonly DerObjectIdentifier C2Pnb368w1 = CTwoCurve.Branch("19");
- public static readonly DerObjectIdentifier C2Tnb431r1 = CTwoCurve.Branch("20");
-
- //
- // Prime
- //
- public static readonly DerObjectIdentifier PrimeCurve = EllipticCurve.Branch("1");
-
- public static readonly DerObjectIdentifier Prime192v1 = PrimeCurve.Branch("1");
- public static readonly DerObjectIdentifier Prime192v2 = PrimeCurve.Branch("2");
- public static readonly DerObjectIdentifier Prime192v3 = PrimeCurve.Branch("3");
- public static readonly DerObjectIdentifier Prime239v1 = PrimeCurve.Branch("4");
- public static readonly DerObjectIdentifier Prime239v2 = PrimeCurve.Branch("5");
- public static readonly DerObjectIdentifier Prime239v3 = PrimeCurve.Branch("6");
- public static readonly DerObjectIdentifier Prime256v1 = PrimeCurve.Branch("7");
-
- //
- // DSA
- //
- // dsapublicnumber OBJECT IDENTIFIER ::= { iso(1) member-body(2)
- // us(840) ansi-x957(10040) number-type(4) 1 }
- public static readonly DerObjectIdentifier IdDsa = new DerObjectIdentifier("1.2.840.10040.4.1");
-
- /**
- * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { iso(1) member-body(2)
- * us(840) x9-57 (10040) x9cm(4) 3 }
- */
- public static readonly DerObjectIdentifier IdDsaWithSha1 = new DerObjectIdentifier("1.2.840.10040.4.3");
-
- /**
- * X9.63
- */
- public static readonly DerObjectIdentifier X9x63Scheme = new DerObjectIdentifier("1.3.133.16.840.63.0");
- public static readonly DerObjectIdentifier DHSinglePassStdDHSha1KdfScheme = X9x63Scheme.Branch("2");
- public static readonly DerObjectIdentifier DHSinglePassCofactorDHSha1KdfScheme = X9x63Scheme.Branch("3");
- public static readonly DerObjectIdentifier MqvSinglePassSha1KdfScheme = X9x63Scheme.Branch("16");
-
- /**
- * X9.42
- */
-
- public static readonly DerObjectIdentifier ansi_x9_42 = new DerObjectIdentifier("1.2.840.10046");
-
- //
- // Diffie-Hellman
- //
- // dhpublicnumber OBJECT IDENTIFIER ::= { iso(1) member-body(2)
- // us(840) ansi-x942(10046) number-type(2) 1 }
- //
- public static readonly DerObjectIdentifier DHPublicNumber = ansi_x9_42.Branch("2.1");
-
- public static readonly DerObjectIdentifier X9x42Schemes = ansi_x9_42.Branch("2.3");
-
- public static readonly DerObjectIdentifier DHStatic = X9x42Schemes.Branch("1");
- public static readonly DerObjectIdentifier DHEphem = X9x42Schemes.Branch("2");
- public static readonly DerObjectIdentifier DHOneFlow = X9x42Schemes.Branch("3");
- public static readonly DerObjectIdentifier DHHybrid1 = X9x42Schemes.Branch("4");
- public static readonly DerObjectIdentifier DHHybrid2 = X9x42Schemes.Branch("5");
- public static readonly DerObjectIdentifier DHHybridOneFlow = X9x42Schemes.Branch("6");
- public static readonly DerObjectIdentifier Mqv2 = X9x42Schemes.Branch("7");
- public static readonly DerObjectIdentifier Mqv1 = X9x42Schemes.Branch("8");
- }
-}
diff --git a/BCCrypto/src/bcpg/ArmoredInputStream.cs b/BCCrypto/src/bcpg/ArmoredInputStream.cs
deleted file mode 100644
index d5d9f7f..0000000
--- a/BCCrypto/src/bcpg/ArmoredInputStream.cs
+++ /dev/null
@@ -1,524 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /**
- * reader for Base64 armored objects - read the headers and then start returning
- * bytes when the data is reached. An IOException is thrown if the CRC check
- * fails.
- */
- public class ArmoredInputStream
- : BaseInputStream
- {
- /*
- * set up the decoding table.
- */
- private readonly static byte[] decodingTable;
- static ArmoredInputStream()
- {
- decodingTable = new byte[128];
- for (int i = 'A'; i <= 'Z'; i++)
- {
- decodingTable[i] = (byte)(i - 'A');
- }
- for (int i = 'a'; i <= 'z'; i++)
- {
- decodingTable[i] = (byte)(i - 'a' + 26);
- }
- for (int i = '0'; i <= '9'; i++)
- {
- decodingTable[i] = (byte)(i - '0' + 52);
- }
- decodingTable['+'] = 62;
- decodingTable['/'] = 63;
- }
-
- /**
- * decode the base 64 encoded input data.
- *
- * @return the offset the data starts in out.
- */
- private int Decode(
- int in0,
- int in1,
- int in2,
- int in3,
- int[] result)
- {
- if (in3 < 0)
- {
- throw new EndOfStreamException("unexpected end of file in armored stream.");
- }
-
- int b1, b2, b3, b4;
- if (in2 == '=')
- {
- b1 = decodingTable[in0] &0xff;
- b2 = decodingTable[in1] & 0xff;
- result[2] = ((b1 << 2) | (b2 >> 4)) & 0xff;
- return 2;
- }
- else if (in3 == '=')
- {
- b1 = decodingTable[in0];
- b2 = decodingTable[in1];
- b3 = decodingTable[in2];
- result[1] = ((b1 << 2) | (b2 >> 4)) & 0xff;
- result[2] = ((b2 << 4) | (b3 >> 2)) & 0xff;
- return 1;
- }
- else
- {
- b1 = decodingTable[in0];
- b2 = decodingTable[in1];
- b3 = decodingTable[in2];
- b4 = decodingTable[in3];
- result[0] = ((b1 << 2) | (b2 >> 4)) & 0xff;
- result[1] = ((b2 << 4) | (b3 >> 2)) & 0xff;
- result[2] = ((b3 << 6) | b4) & 0xff;
- return 0;
- }
- }
-
- Stream input;
- bool start = true;
- int[] outBuf = new int[3];
- int bufPtr = 3;
- Crc24 crc = new Crc24();
- bool crcFound = false;
- bool hasHeaders = true;
- string header = null;
- bool newLineFound = false;
- bool clearText = false;
- bool restart = false;
- IList headerList= Platform.CreateArrayList();
- int lastC = 0;
- bool isEndOfStream;
-
- /**
- * Create a stream for reading a PGP armoured message, parsing up to a header
- * and then reading the data that follows.
- *
- * @param input
- */
- public ArmoredInputStream(
- Stream input)
- : this(input, true)
- {
- }
-
- /**
- * Create an armoured input stream which will assume the data starts
- * straight away, or parse for headers first depending on the value of
- * hasHeaders.
- *
- * @param input
- * @param hasHeaders true if headers are to be looked for, false otherwise.
- */
- public ArmoredInputStream(
- Stream input,
- bool hasHeaders)
- {
- this.input = input;
- this.hasHeaders = hasHeaders;
-
- if (hasHeaders)
- {
- ParseHeaders();
- }
-
- start = false;
- }
-
- private bool ParseHeaders()
- {
- header = null;
-
- int c;
- int last = 0;
- bool headerFound = false;
-
- headerList = Platform.CreateArrayList();
-
- //
- // if restart we already have a header
- //
- if (restart)
- {
- headerFound = true;
- }
- else
- {
- while ((c = input.ReadByte()) >= 0)
- {
- if (c == '-' && (last == 0 || last == '\n' || last == '\r'))
- {
- headerFound = true;
- break;
- }
-
- last = c;
- }
- }
-
- if (headerFound)
- {
- StringBuilder Buffer = new StringBuilder("-");
- bool eolReached = false;
- bool crLf = false;
-
- if (restart) // we've had to look ahead two '-'
- {
- Buffer.Append('-');
- }
-
- while ((c = input.ReadByte()) >= 0)
- {
- if (last == '\r' && c == '\n')
- {
- crLf = true;
- }
- if (eolReached && (last != '\r' && c == '\n'))
- {
- break;
- }
- if (eolReached && c == '\r')
- {
- break;
- }
- if (c == '\r' || (last != '\r' && c == '\n'))
- {
- string line = Buffer.ToString();
- if (line.Trim().Length < 1)
- break;
- headerList.Add(line);
- Buffer.Length = 0;
- }
-
- if (c != '\n' && c != '\r')
- {
- Buffer.Append((char)c);
- eolReached = false;
- }
- else
- {
- if (c == '\r' || (last != '\r' && c == '\n'))
- {
- eolReached = true;
- }
- }
-
- last = c;
- }
-
- if (crLf)
- {
- input.ReadByte(); // skip last \n
- }
- }
-
- if (headerList.Count > 0)
- {
- header = (string) headerList[0];
- }
-
- clearText = "-----BEGIN PGP SIGNED MESSAGE-----".Equals(header);
- newLineFound = true;
-
- return headerFound;
- }
-
- /**
- * @return true if we are inside the clear text section of a PGP
- * signed message.
- */
- public bool IsClearText()
- {
- return clearText;
- }
-
- /**
- * @return true if the stream is actually at end of file.
- */
- public bool IsEndOfStream()
- {
- return isEndOfStream;
- }
-
- /**
- * Return the armor header line (if there is one)
- * @return the armor header line, null if none present.
- */
- public string GetArmorHeaderLine()
- {
- return header;
- }
-
- /**
- * Return the armor headers (the lines after the armor header line),
- * @return an array of armor headers, null if there aren't any.
- */
- public string[] GetArmorHeaders()
- {
- if (headerList.Count <= 1)
- {
- return null;
- }
-
- string[] hdrs = new string[headerList.Count - 1];
- for (int i = 0; i != hdrs.Length; i++)
- {
- hdrs[i] = (string) headerList[i + 1];
- }
-
- return hdrs;
- }
-
- private int ReadIgnoreSpace()
- {
- int c;
- do
- {
- c = input.ReadByte();
- }
- while (c == ' ' || c == '\t');
-
- return c;
- }
-
- private int ReadIgnoreWhitespace()
- {
- int c;
- do
- {
- c = input.ReadByte();
- }
- while (c == ' ' || c == '\t' || c == '\r' || c == '\n');
-
- return c;
- }
-
- private int ReadByteClearText()
- {
- int c = input.ReadByte();
-
- if (c == '\r' || (c == '\n' && lastC != '\r'))
- {
- newLineFound = true;
- }
- else if (newLineFound && c == '-')
- {
- c = input.ReadByte();
- if (c == '-') // a header, not dash escaped
- {
- clearText = false;
- start = true;
- restart = true;
- }
- else // a space - must be a dash escape
- {
- c = input.ReadByte();
- }
- newLineFound = false;
- }
- else
- {
- if (c != '\n' && lastC != '\r')
- {
- newLineFound = false;
- }
- }
-
- lastC = c;
-
- if (c < 0)
- {
- isEndOfStream = true;
- }
-
- return c;
- }
-
- private int ReadClearText(byte[] buffer, int offset, int count)
- {
- int pos = offset;
- try
- {
- int end = offset + count;
- while (pos < end)
- {
- int c = ReadByteClearText();
- if (c == -1)
- {
- break;
- }
- buffer[pos++] = (byte) c;
- }
- }
- catch (IOException ioe)
- {
- if (pos == offset) throw ioe;
- }
-
- return pos - offset;
- }
-
- private int DoReadByte()
- {
- if (bufPtr > 2 || crcFound)
- {
- int c = ReadIgnoreSpace();
- if (c == '\n' || c == '\r')
- {
- c = ReadIgnoreWhitespace();
- if (c == '=') // crc reached
- {
- bufPtr = Decode(ReadIgnoreSpace(), ReadIgnoreSpace(), ReadIgnoreSpace(), ReadIgnoreSpace(), outBuf);
-
- if (bufPtr != 0)
- {
- throw new IOException("no crc found in armored message.");
- }
-
- crcFound = true;
-
- int i = ((outBuf[0] & 0xff) << 16)
- | ((outBuf[1] & 0xff) << 8)
- | (outBuf[2] & 0xff);
-
- if (i != crc.Value)
- {
- throw new IOException("crc check failed in armored message.");
- }
-
- return ReadByte();
- }
-
- if (c == '-') // end of record reached
- {
- while ((c = input.ReadByte()) >= 0)
- {
- if (c == '\n' || c == '\r')
- {
- break;
- }
- }
-
- if (!crcFound)
- {
- throw new IOException("crc check not found.");
- }
-
- crcFound = false;
- start = true;
- bufPtr = 3;
-
- if (c < 0)
- {
- isEndOfStream = true;
- }
-
- return -1;
- }
- }
-
- if (c < 0)
- {
- isEndOfStream = true;
- return -1;
- }
-
- bufPtr = Decode(c, ReadIgnoreSpace(), ReadIgnoreSpace(), ReadIgnoreSpace(), outBuf);
- }
-
- return outBuf[bufPtr++];
- }
-
- public override int ReadByte()
- {
- if (start)
- {
- if (hasHeaders)
- {
- ParseHeaders();
- }
-
- crc.Reset();
- start = false;
- }
-
- if (clearText)
- {
- return ReadByteClearText();
- }
-
- int c = DoReadByte();
-
- crc.Update(c);
-
- return c;
- }
-
- public override int Read(byte[] buffer, int offset, int count)
- {
- if (start && count > 0)
- {
- if (hasHeaders)
- {
- ParseHeaders();
- }
- start = false;
- }
-
- if (clearText)
- {
- return ReadClearText(buffer, offset, count);
- }
-
- int pos = offset;
- try
- {
- int end = offset + count;
- while (pos < end)
- {
- int c = DoReadByte();
- crc.Update(c);
- if (c == -1)
- {
- break;
- }
- buffer[pos++] = (byte) c;
- }
- }
- catch (IOException ioe)
- {
- if (pos == offset) throw ioe;
- }
-
- return pos - offset;
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Platform.Dispose(input);
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Platform.Dispose(input);
- base.Close();
- }
-#endif
- }
-}
diff --git a/BCCrypto/src/bcpg/ArmoredOutputStream.cs b/BCCrypto/src/bcpg/ArmoredOutputStream.cs
deleted file mode 100644
index 7a5066e..0000000
--- a/BCCrypto/src/bcpg/ArmoredOutputStream.cs
+++ /dev/null
@@ -1,375 +0,0 @@
-using System;
-using System.Collections;
-using System.Diagnostics;
-using System.IO;
-using System.Reflection;
-using System.Text;
-
-#if PORTABLE
-using System.Linq;
-#endif
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /**
- * Basic output stream.
- */
- public class ArmoredOutputStream
- : BaseOutputStream
- {
- public static readonly string HeaderVersion = "Version";
-
- private static readonly byte[] encodingTable =
- {
- (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G',
- (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N',
- (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U',
- (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z',
- (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g',
- (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n',
- (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u',
- (byte)'v',
- (byte)'w', (byte)'x', (byte)'y', (byte)'z',
- (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6',
- (byte)'7', (byte)'8', (byte)'9',
- (byte)'+', (byte)'/'
- };
-
- /**
- * encode the input data producing a base 64 encoded byte array.
- */
- private static void Encode(
- Stream outStream,
- int[] data,
- int len)
- {
- Debug.Assert(len > 0);
- Debug.Assert(len < 4);
-
- byte[] bs = new byte[4];
- int d1 = data[0];
- bs[0] = encodingTable[(d1 >> 2) & 0x3f];
-
- switch (len)
- {
- case 1:
- {
- bs[1] = encodingTable[(d1 << 4) & 0x3f];
- bs[2] = (byte)'=';
- bs[3] = (byte)'=';
- break;
- }
- case 2:
- {
- int d2 = data[1];
- bs[1] = encodingTable[((d1 << 4) | (d2 >> 4)) & 0x3f];
- bs[2] = encodingTable[(d2 << 2) & 0x3f];
- bs[3] = (byte)'=';
- break;
- }
- case 3:
- {
- int d2 = data[1];
- int d3 = data[2];
- bs[1] = encodingTable[((d1 << 4) | (d2 >> 4)) & 0x3f];
- bs[2] = encodingTable[((d2 << 2) | (d3 >> 6)) & 0x3f];
- bs[3] = encodingTable[d3 & 0x3f];
- break;
- }
- }
-
- outStream.Write(bs, 0, bs.Length);
- }
-
- private readonly Stream outStream;
- private int[] buf = new int[3];
- private int bufPtr = 0;
- private Crc24 crc = new Crc24();
- private int chunkCount = 0;
- private int lastb;
-
- private bool start = true;
- private bool clearText = false;
- private bool newLine = false;
-
- private string type;
-
- private static readonly string nl = Platform.NewLine;
- private static readonly string headerStart = "-----BEGIN PGP ";
- private static readonly string headerTail = "-----";
- private static readonly string footerStart = "-----END PGP ";
- private static readonly string footerTail = "-----";
-
- private static readonly string Version = "BCPG C# v" + AssemblyInfo.Version;
-
- private readonly IDictionary headers;
-
- public ArmoredOutputStream(Stream outStream)
- {
- this.outStream = outStream;
- this.headers = Platform.CreateHashtable(1);
- this.headers.Add(HeaderVersion, Version);
- }
-
- public ArmoredOutputStream(Stream outStream, IDictionary headers)
- {
- this.outStream = outStream;
- this.headers = Platform.CreateHashtable(headers);
- if (!this.headers.Contains(HeaderVersion))
- {
- this.headers.Add(HeaderVersion, Version);
- }
- }
-
- /**
- * Set an additional header entry. A null value will clear the entry for name.
- *
- * @param name the name of the header entry.
- * @param v the value of the header entry.
- */
- public void SetHeader(string name, string v)
- {
- if (v == null)
- {
- headers.Remove(name);
- }
- else
- {
- headers[name] = v;
- }
- }
-
- /**
- * Reset the headers to only contain a Version string (if one is present).
- */
- public void ResetHeaders()
- {
- string version = (string)headers[HeaderVersion];
-
- headers.Clear();
-
- if (version != null)
- {
- headers[HeaderVersion] = Version;
- }
- }
-
- /**
- * Start a clear text signed message.
- * @param hashAlgorithm
- */
- public void BeginClearText(
- HashAlgorithmTag hashAlgorithm)
- {
- string hash;
-
- switch (hashAlgorithm)
- {
- case HashAlgorithmTag.Sha1:
- hash = "SHA1";
- break;
- case HashAlgorithmTag.Sha256:
- hash = "SHA256";
- break;
- case HashAlgorithmTag.Sha384:
- hash = "SHA384";
- break;
- case HashAlgorithmTag.Sha512:
- hash = "SHA512";
- break;
- case HashAlgorithmTag.MD2:
- hash = "MD2";
- break;
- case HashAlgorithmTag.MD5:
- hash = "MD5";
- break;
- case HashAlgorithmTag.RipeMD160:
- hash = "RIPEMD160";
- break;
- default:
- throw new IOException("unknown hash algorithm tag in beginClearText: " + hashAlgorithm);
- }
-
- DoWrite("-----BEGIN PGP SIGNED MESSAGE-----" + nl);
- DoWrite("Hash: " + hash + nl + nl);
-
- clearText = true;
- newLine = true;
- lastb = 0;
- }
-
- public void EndClearText()
- {
- clearText = false;
- }
-
- public override void WriteByte(
- byte b)
- {
- if (clearText)
- {
- outStream.WriteByte(b);
-
- if (newLine)
- {
- if (!(b == '\n' && lastb == '\r'))
- {
- newLine = false;
- }
- if (b == '-')
- {
- outStream.WriteByte((byte)' ');
- outStream.WriteByte((byte)'-'); // dash escape
- }
- }
- if (b == '\r' || (b == '\n' && lastb != '\r'))
- {
- newLine = true;
- }
- lastb = b;
- return;
- }
-
- if (start)
- {
- bool newPacket = (b & 0x40) != 0;
-
- int tag;
- if (newPacket)
- {
- tag = b & 0x3f;
- }
- else
- {
- tag = (b & 0x3f) >> 2;
- }
-
- switch ((PacketTag)tag)
- {
- case PacketTag.PublicKey:
- type = "PUBLIC KEY BLOCK";
- break;
- case PacketTag.SecretKey:
- type = "PRIVATE KEY BLOCK";
- break;
- case PacketTag.Signature:
- type = "SIGNATURE";
- break;
- default:
- type = "MESSAGE";
- break;
- }
-
- DoWrite(headerStart + type + headerTail + nl);
- if (headers.Contains(HeaderVersion))
- {
- WriteHeaderEntry(HeaderVersion, (string)headers[HeaderVersion]);
- }
-
- foreach (DictionaryEntry de in headers)
- {
- string k = (string)de.Key;
- if (k != HeaderVersion)
- {
- string v = (string)de.Value;
- WriteHeaderEntry(k, v);
- }
- }
-
- DoWrite(nl);
-
- start = false;
- }
-
- if (bufPtr == 3)
- {
- Encode(outStream, buf, bufPtr);
- bufPtr = 0;
- if ((++chunkCount & 0xf) == 0)
- {
- DoWrite(nl);
- }
- }
-
- crc.Update(b);
- buf[bufPtr++] = b & 0xff;
- }
-
- /**
- * Note : Close() does not close the underlying stream. So it is possible to write
- * multiple objects using armoring to a single stream.
- */
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- if (type == null)
- return;
-
- DoClose();
-
- type = null;
- start = true;
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- if (type == null)
- return;
-
- DoClose();
-
- type = null;
- start = true;
-
- base.Close();
- }
-#endif
-
- private void DoClose()
- {
- if (bufPtr > 0)
- {
- Encode(outStream, buf, bufPtr);
- }
-
- DoWrite(nl + '=');
-
- int crcV = crc.Value;
-
- buf[0] = ((crcV >> 16) & 0xff);
- buf[1] = ((crcV >> 8) & 0xff);
- buf[2] = (crcV & 0xff);
-
- Encode(outStream, buf, 3);
-
- DoWrite(nl);
- DoWrite(footerStart);
- DoWrite(type);
- DoWrite(footerTail);
- DoWrite(nl);
-
- outStream.Flush();
- }
-
- private void WriteHeaderEntry(
- string name,
- string v)
- {
- DoWrite(name + ": " + v + nl);
- }
-
- private void DoWrite(
- string s)
- {
- byte[] bs = Strings.ToAsciiByteArray(s);
- outStream.Write(bs, 0, bs.Length);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/BcpgInputStream.cs b/BCCrypto/src/bcpg/BcpgInputStream.cs
deleted file mode 100644
index f9627fd..0000000
--- a/BCCrypto/src/bcpg/BcpgInputStream.cs
+++ /dev/null
@@ -1,363 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Reader for PGP objects.
- public class BcpgInputStream
- : BaseInputStream
- {
- private Stream m_in;
- private bool next = false;
- private int nextB;
-
- internal static BcpgInputStream Wrap(
- Stream inStr)
- {
- if (inStr is BcpgInputStream)
- {
- return (BcpgInputStream) inStr;
- }
-
- return new BcpgInputStream(inStr);
- }
-
- private BcpgInputStream(
- Stream inputStream)
- {
- this.m_in = inputStream;
- }
-
- public override int ReadByte()
- {
- if (next)
- {
- next = false;
- return nextB;
- }
-
- return m_in.ReadByte();
- }
-
- public override int Read(
- byte[] buffer,
- int offset,
- int count)
- {
- // Strangely, when count == 0, we should still attempt to read a byte
-// if (count == 0)
-// return 0;
-
- if (!next)
- return m_in.Read(buffer, offset, count);
-
- // We have next byte waiting, so return it
-
- if (nextB < 0)
- return 0; // EndOfStream
-
- if (buffer == null)
- throw new ArgumentNullException("buffer");
-
- buffer[offset] = (byte) nextB;
- next = false;
-
- return 1;
- }
-
- public byte[] ReadAll()
- {
- return Streams.ReadAll(this);
- }
-
- public void ReadFully(
- byte[] buffer,
- int off,
- int len)
- {
- if (Streams.ReadFully(this, buffer, off, len) < len)
- throw new EndOfStreamException();
- }
-
- public void ReadFully(
- byte[] buffer)
- {
- ReadFully(buffer, 0, buffer.Length);
- }
-
- /// Returns the next packet tag in the stream.
- public PacketTag NextPacketTag()
- {
- if (!next)
- {
- try
- {
- nextB = m_in.ReadByte();
- }
- catch (EndOfStreamException)
- {
- nextB = -1;
- }
-
- next = true;
- }
-
- if (nextB < 0)
- return (PacketTag)nextB;
-
- int maskB = nextB & 0x3f;
- if ((nextB & 0x40) == 0) // old
- {
- maskB >>= 2;
- }
- return (PacketTag)maskB;
- }
-
- public Packet ReadPacket()
- {
- int hdr = this.ReadByte();
-
- if (hdr < 0)
- {
- return null;
- }
-
- if ((hdr & 0x80) == 0)
- {
- throw new IOException("invalid header encountered");
- }
-
- bool newPacket = (hdr & 0x40) != 0;
- PacketTag tag = 0;
- int bodyLen = 0;
- bool partial = false;
-
- if (newPacket)
- {
- tag = (PacketTag)(hdr & 0x3f);
-
- int l = this.ReadByte();
-
- if (l < 192)
- {
- bodyLen = l;
- }
- else if (l <= 223)
- {
- int b = m_in.ReadByte();
- bodyLen = ((l - 192) << 8) + (b) + 192;
- }
- else if (l == 255)
- {
- bodyLen = (m_in.ReadByte() << 24) | (m_in.ReadByte() << 16)
- | (m_in.ReadByte() << 8) | m_in.ReadByte();
- }
- else
- {
- partial = true;
- bodyLen = 1 << (l & 0x1f);
- }
- }
- else
- {
- int lengthType = hdr & 0x3;
-
- tag = (PacketTag)((hdr & 0x3f) >> 2);
-
- switch (lengthType)
- {
- case 0:
- bodyLen = this.ReadByte();
- break;
- case 1:
- bodyLen = (this.ReadByte() << 8) | this.ReadByte();
- break;
- case 2:
- bodyLen = (this.ReadByte() << 24) | (this.ReadByte() << 16)
- | (this.ReadByte() << 8) | this.ReadByte();
- break;
- case 3:
- partial = true;
- break;
- default:
- throw new IOException("unknown length type encountered");
- }
- }
-
- BcpgInputStream objStream;
- if (bodyLen == 0 && partial)
- {
- objStream = this;
- }
- else
- {
- PartialInputStream pis = new PartialInputStream(this, partial, bodyLen);
- objStream = new BcpgInputStream(pis);
- }
-
- switch (tag)
- {
- case PacketTag.Reserved:
- return new InputStreamPacket(objStream);
- case PacketTag.PublicKeyEncryptedSession:
- return new PublicKeyEncSessionPacket(objStream);
- case PacketTag.Signature:
- return new SignaturePacket(objStream);
- case PacketTag.SymmetricKeyEncryptedSessionKey:
- return new SymmetricKeyEncSessionPacket(objStream);
- case PacketTag.OnePassSignature:
- return new OnePassSignaturePacket(objStream);
- case PacketTag.SecretKey:
- return new SecretKeyPacket(objStream);
- case PacketTag.PublicKey:
- return new PublicKeyPacket(objStream);
- case PacketTag.SecretSubkey:
- return new SecretSubkeyPacket(objStream);
- case PacketTag.CompressedData:
- return new CompressedDataPacket(objStream);
- case PacketTag.SymmetricKeyEncrypted:
- return new SymmetricEncDataPacket(objStream);
- case PacketTag.Marker:
- return new MarkerPacket(objStream);
- case PacketTag.LiteralData:
- return new LiteralDataPacket(objStream);
- case PacketTag.Trust:
- return new TrustPacket(objStream);
- case PacketTag.UserId:
- return new UserIdPacket(objStream);
- case PacketTag.UserAttribute:
- return new UserAttributePacket(objStream);
- case PacketTag.PublicSubkey:
- return new PublicSubkeyPacket(objStream);
- case PacketTag.SymmetricEncryptedIntegrityProtected:
- return new SymmetricEncIntegrityPacket(objStream);
- case PacketTag.ModificationDetectionCode:
- return new ModDetectionCodePacket(objStream);
- case PacketTag.Experimental1:
- case PacketTag.Experimental2:
- case PacketTag.Experimental3:
- case PacketTag.Experimental4:
- return new ExperimentalPacket(tag, objStream);
- default:
- throw new IOException("unknown packet type encountered: " + tag);
- }
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Platform.Dispose(m_in);
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Platform.Dispose(m_in);
- base.Close();
- }
-#endif
-
- ///
- /// A stream that overlays our input stream, allowing the user to only read a segment of it.
- /// NB: dataLength will be negative if the segment length is in the upper range above 2**31.
- ///
- private class PartialInputStream
- : BaseInputStream
- {
- private BcpgInputStream m_in;
- private bool partial;
- private int dataLength;
-
- internal PartialInputStream(
- BcpgInputStream bcpgIn,
- bool partial,
- int dataLength)
- {
- this.m_in = bcpgIn;
- this.partial = partial;
- this.dataLength = dataLength;
- }
-
- public override int ReadByte()
- {
- do
- {
- if (dataLength != 0)
- {
- int ch = m_in.ReadByte();
- if (ch < 0)
- {
- throw new EndOfStreamException("Premature end of stream in PartialInputStream");
- }
- dataLength--;
- return ch;
- }
- }
- while (partial && ReadPartialDataLength() >= 0);
-
- return -1;
- }
-
- public override int Read(byte[] buffer, int offset, int count)
- {
- do
- {
- if (dataLength != 0)
- {
- int readLen = (dataLength > count || dataLength < 0) ? count : dataLength;
- int len = m_in.Read(buffer, offset, readLen);
- if (len < 1)
- {
- throw new EndOfStreamException("Premature end of stream in PartialInputStream");
- }
- dataLength -= len;
- return len;
- }
- }
- while (partial && ReadPartialDataLength() >= 0);
-
- return 0;
- }
-
- private int ReadPartialDataLength()
- {
- int l = m_in.ReadByte();
-
- if (l < 0)
- {
- return -1;
- }
-
- partial = false;
-
- if (l < 192)
- {
- dataLength = l;
- }
- else if (l <= 223)
- {
- dataLength = ((l - 192) << 8) + (m_in.ReadByte()) + 192;
- }
- else if (l == 255)
- {
- dataLength = (m_in.ReadByte() << 24) | (m_in.ReadByte() << 16)
- | (m_in.ReadByte() << 8) | m_in.ReadByte();
- }
- else
- {
- partial = true;
- dataLength = 1 << (l & 0x1f);
- }
-
- return 0;
- }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/BcpgObject.cs b/BCCrypto/src/bcpg/BcpgObject.cs
deleted file mode 100644
index 4807ad4..0000000
--- a/BCCrypto/src/bcpg/BcpgObject.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Base class for a PGP object.
- public abstract class BcpgObject
- {
- public virtual byte[] GetEncoded()
- {
- MemoryStream bOut = new MemoryStream();
- BcpgOutputStream pOut = new BcpgOutputStream(bOut);
-
- pOut.WriteObject(this);
-
- return bOut.ToArray();
- }
-
- public abstract void Encode(BcpgOutputStream bcpgOut);
- }
-}
-
diff --git a/BCCrypto/src/bcpg/BcpgOutputStream.cs b/BCCrypto/src/bcpg/BcpgOutputStream.cs
deleted file mode 100644
index 7ab661e..0000000
--- a/BCCrypto/src/bcpg/BcpgOutputStream.cs
+++ /dev/null
@@ -1,404 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic output stream.
- public class BcpgOutputStream
- : BaseOutputStream
- {
- internal static BcpgOutputStream Wrap(
- Stream outStr)
- {
- if (outStr is BcpgOutputStream)
- {
- return (BcpgOutputStream) outStr;
- }
-
- return new BcpgOutputStream(outStr);
- }
-
- private Stream outStr;
- private byte[] partialBuffer;
- private int partialBufferLength;
- private int partialPower;
- private int partialOffset;
- private const int BufferSizePower = 16; // 2^16 size buffer on long files
-
- /// Create a stream representing a general packet.
- /// Output stream to write to.
- public BcpgOutputStream(
- Stream outStr)
- {
- if (outStr == null)
- throw new ArgumentNullException("outStr");
-
- this.outStr = outStr;
- }
-
- /// Create a stream representing an old style partial object.
- /// Output stream to write to.
- /// The packet tag for the object.
- public BcpgOutputStream(
- Stream outStr,
- PacketTag tag)
- {
- if (outStr == null)
- throw new ArgumentNullException("outStr");
-
- this.outStr = outStr;
- this.WriteHeader(tag, true, true, 0);
- }
-
- /// Create a stream representing a general packet.
- /// Output stream to write to.
- /// Packet tag.
- /// Size of chunks making up the packet.
- /// If true, the header is written out in old format.
- public BcpgOutputStream(
- Stream outStr,
- PacketTag tag,
- long length,
- bool oldFormat)
- {
- if (outStr == null)
- throw new ArgumentNullException("outStr");
-
- this.outStr = outStr;
-
- if (length > 0xFFFFFFFFL)
- {
- this.WriteHeader(tag, false, true, 0);
- this.partialBufferLength = 1 << BufferSizePower;
- this.partialBuffer = new byte[partialBufferLength];
- this.partialPower = BufferSizePower;
- this.partialOffset = 0;
- }
- else
- {
- this.WriteHeader(tag, oldFormat, false, length);
- }
- }
-
- /// Create a new style partial input stream buffered into chunks.
- /// Output stream to write to.
- /// Packet tag.
- /// Size of chunks making up the packet.
- public BcpgOutputStream(
- Stream outStr,
- PacketTag tag,
- long length)
- {
- if (outStr == null)
- throw new ArgumentNullException("outStr");
-
- this.outStr = outStr;
- this.WriteHeader(tag, false, false, length);
- }
-
- /// Create a new style partial input stream buffered into chunks.
- /// Output stream to write to.
- /// Packet tag.
- /// Buffer to use for collecting chunks.
- public BcpgOutputStream(
- Stream outStr,
- PacketTag tag,
- byte[] buffer)
- {
- if (outStr == null)
- throw new ArgumentNullException("outStr");
-
- this.outStr = outStr;
- this.WriteHeader(tag, false, true, 0);
-
- this.partialBuffer = buffer;
-
- uint length = (uint) partialBuffer.Length;
- for (partialPower = 0; length != 1; partialPower++)
- {
- length >>= 1;
- }
-
- if (partialPower > 30)
- {
- throw new IOException("Buffer cannot be greater than 2^30 in length.");
- }
- this.partialBufferLength = 1 << partialPower;
- this.partialOffset = 0;
- }
-
- private void WriteNewPacketLength(
- long bodyLen)
- {
- if (bodyLen < 192)
- {
- outStr.WriteByte((byte)bodyLen);
- }
- else if (bodyLen <= 8383)
- {
- bodyLen -= 192;
-
- outStr.WriteByte((byte)(((bodyLen >> 8) & 0xff) + 192));
- outStr.WriteByte((byte)bodyLen);
- }
- else
- {
- outStr.WriteByte(0xff);
- outStr.WriteByte((byte)(bodyLen >> 24));
- outStr.WriteByte((byte)(bodyLen >> 16));
- outStr.WriteByte((byte)(bodyLen >> 8));
- outStr.WriteByte((byte)bodyLen);
- }
- }
-
- private void WriteHeader(
- PacketTag tag,
- bool oldPackets,
- bool partial,
- long bodyLen)
- {
- int hdr = 0x80;
-
- if (partialBuffer != null)
- {
- PartialFlush(true);
- partialBuffer = null;
- }
-
- if (oldPackets)
- {
- hdr |= ((int) tag) << 2;
-
- if (partial)
- {
- this.WriteByte((byte)(hdr | 0x03));
- }
- else
- {
- if (bodyLen <= 0xff)
- {
- this.WriteByte((byte) hdr);
- this.WriteByte((byte)bodyLen);
- }
- else if (bodyLen <= 0xffff)
- {
- this.WriteByte((byte)(hdr | 0x01));
- this.WriteByte((byte)(bodyLen >> 8));
- this.WriteByte((byte)(bodyLen));
- }
- else
- {
- this.WriteByte((byte)(hdr | 0x02));
- this.WriteByte((byte)(bodyLen >> 24));
- this.WriteByte((byte)(bodyLen >> 16));
- this.WriteByte((byte)(bodyLen >> 8));
- this.WriteByte((byte)bodyLen);
- }
- }
- }
- else
- {
- hdr |= 0x40 | (int) tag;
- this.WriteByte((byte) hdr);
-
- if (partial)
- {
- partialOffset = 0;
- }
- else
- {
- this.WriteNewPacketLength(bodyLen);
- }
- }
- }
-
- private void PartialFlush(
- bool isLast)
- {
- if (isLast)
- {
- WriteNewPacketLength(partialOffset);
- outStr.Write(partialBuffer, 0, partialOffset);
- }
- else
- {
- outStr.WriteByte((byte)(0xE0 | partialPower));
- outStr.Write(partialBuffer, 0, partialBufferLength);
- }
-
- partialOffset = 0;
- }
-
- private void WritePartial(
- byte b)
- {
- if (partialOffset == partialBufferLength)
- {
- PartialFlush(false);
- }
-
- partialBuffer[partialOffset++] = b;
- }
-
- private void WritePartial(
- byte[] buffer,
- int off,
- int len)
- {
- if (partialOffset == partialBufferLength)
- {
- PartialFlush(false);
- }
-
- if (len <= (partialBufferLength - partialOffset))
- {
- Array.Copy(buffer, off, partialBuffer, partialOffset, len);
- partialOffset += len;
- }
- else
- {
- int diff = partialBufferLength - partialOffset;
- Array.Copy(buffer, off, partialBuffer, partialOffset, diff);
- off += diff;
- len -= diff;
- PartialFlush(false);
- while (len > partialBufferLength)
- {
- Array.Copy(buffer, off, partialBuffer, 0, partialBufferLength);
- off += partialBufferLength;
- len -= partialBufferLength;
- PartialFlush(false);
- }
- Array.Copy(buffer, off, partialBuffer, 0, len);
- partialOffset += len;
- }
- }
- public override void WriteByte(
- byte value)
- {
- if (partialBuffer != null)
- {
- WritePartial(value);
- }
- else
- {
- outStr.WriteByte(value);
- }
- }
- public override void Write(
- byte[] buffer,
- int offset,
- int count)
- {
- if (partialBuffer != null)
- {
- WritePartial(buffer, offset, count);
- }
- else
- {
- outStr.Write(buffer, offset, count);
- }
- }
-
- // Additional helper methods to write primitive types
- internal virtual void WriteShort(
- short n)
- {
- this.Write(
- (byte)(n >> 8),
- (byte)n);
- }
- internal virtual void WriteInt(
- int n)
- {
- this.Write(
- (byte)(n >> 24),
- (byte)(n >> 16),
- (byte)(n >> 8),
- (byte)n);
- }
- internal virtual void WriteLong(
- long n)
- {
- this.Write(
- (byte)(n >> 56),
- (byte)(n >> 48),
- (byte)(n >> 40),
- (byte)(n >> 32),
- (byte)(n >> 24),
- (byte)(n >> 16),
- (byte)(n >> 8),
- (byte)n);
- }
-
- public void WritePacket(
- ContainedPacket p)
- {
- p.Encode(this);
- }
-
- internal void WritePacket(
- PacketTag tag,
- byte[] body,
- bool oldFormat)
- {
- this.WriteHeader(tag, oldFormat, false, body.Length);
- this.Write(body);
- }
-
- public void WriteObject(
- BcpgObject bcpgObject)
- {
- bcpgObject.Encode(this);
- }
-
- public void WriteObjects(
- params BcpgObject[] v)
- {
- foreach (BcpgObject o in v)
- {
- o.Encode(this);
- }
- }
-
- /// Flush the underlying stream.
- public override void Flush()
- {
- outStr.Flush();
- }
-
- /// Finish writing out the current packet without closing the underlying stream.
- public void Finish()
- {
- if (partialBuffer != null)
- {
- PartialFlush(true);
- partialBuffer = null;
- }
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- this.Finish();
- outStr.Flush();
- Platform.Dispose(outStr);
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- this.Finish();
- outStr.Flush();
- Platform.Dispose(outStr);
- base.Close();
- }
-#endif
- }
-}
diff --git a/BCCrypto/src/bcpg/CompressedDataPacket.cs b/BCCrypto/src/bcpg/CompressedDataPacket.cs
deleted file mode 100644
index 2432825..0000000
--- a/BCCrypto/src/bcpg/CompressedDataPacket.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Generic compressed data object.
- public class CompressedDataPacket
- : InputStreamPacket
- {
- private readonly CompressionAlgorithmTag algorithm;
-
- internal CompressedDataPacket(
- BcpgInputStream bcpgIn)
- : base(bcpgIn)
- {
- this.algorithm = (CompressionAlgorithmTag) bcpgIn.ReadByte();
- }
-
- /// The algorithm tag value.
- public CompressionAlgorithmTag Algorithm
- {
- get { return algorithm; }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/CompressionAlgorithmTags.cs b/BCCrypto/src/bcpg/CompressionAlgorithmTags.cs
deleted file mode 100644
index 0e45229..0000000
--- a/BCCrypto/src/bcpg/CompressionAlgorithmTags.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic tags for compression algorithms.
- public enum CompressionAlgorithmTag
- {
- Uncompressed = 0, // Uncompressed
- Zip = 1, // ZIP (RFC 1951)
- ZLib = 2, // ZLIB (RFC 1950)
- BZip2 = 3, // BZ2
- }
-}
diff --git a/BCCrypto/src/bcpg/ContainedPacket.cs b/BCCrypto/src/bcpg/ContainedPacket.cs
deleted file mode 100644
index e8f387c..0000000
--- a/BCCrypto/src/bcpg/ContainedPacket.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic type for a PGP packet.
- public abstract class ContainedPacket
- : Packet
- {
- public byte[] GetEncoded()
- {
- MemoryStream bOut = new MemoryStream();
- BcpgOutputStream pOut = new BcpgOutputStream(bOut);
-
- pOut.WritePacket(this);
-
- return bOut.ToArray();
- }
-
- public abstract void Encode(BcpgOutputStream bcpgOut);
- }
-}
diff --git a/BCCrypto/src/bcpg/Crc24.cs b/BCCrypto/src/bcpg/Crc24.cs
deleted file mode 100644
index 97846f4..0000000
--- a/BCCrypto/src/bcpg/Crc24.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg
-{
- public class Crc24
- {
- private const int Crc24Init = 0x0b704ce;
- private const int Crc24Poly = 0x1864cfb;
-
- private int crc = Crc24Init;
-
- public Crc24()
- {
- }
-
- public void Update(
- int b)
- {
- crc ^= b << 16;
- for (int i = 0; i < 8; i++)
- {
- crc <<= 1;
- if ((crc & 0x1000000) != 0)
- {
- crc ^= Crc24Poly;
- }
- }
- }
-
- [Obsolete("Use 'Value' property instead")]
- public int GetValue()
- {
- return crc;
- }
-
- public int Value
- {
- get { return crc; }
- }
-
- public void Reset()
- {
- crc = Crc24Init;
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/DsaPublicBcpgKey.cs b/BCCrypto/src/bcpg/DsaPublicBcpgKey.cs
deleted file mode 100644
index 11294cc..0000000
--- a/BCCrypto/src/bcpg/DsaPublicBcpgKey.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Base class for a DSA public key.
- public class DsaPublicBcpgKey
- : BcpgObject, IBcpgKey
- {
- private readonly MPInteger p, q, g, y;
-
- /// The stream to read the packet from.
- public DsaPublicBcpgKey(
- BcpgInputStream bcpgIn)
- {
- this.p = new MPInteger(bcpgIn);
- this.q = new MPInteger(bcpgIn);
- this.g = new MPInteger(bcpgIn);
- this.y = new MPInteger(bcpgIn);
- }
-
- public DsaPublicBcpgKey(
- BigInteger p,
- BigInteger q,
- BigInteger g,
- BigInteger y)
- {
- this.p = new MPInteger(p);
- this.q = new MPInteger(q);
- this.g = new MPInteger(g);
- this.y = new MPInteger(y);
- }
-
- /// The format, as a string, always "PGP".
- public string Format
- {
- get { return "PGP"; }
- }
-
- /// Return the standard PGP encoding of the key.
- public override byte[] GetEncoded()
- {
- try
- {
- return base.GetEncoded();
- }
- catch (Exception)
- {
- return null;
- }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WriteObjects(p, q, g, y);
- }
-
- public BigInteger G
- {
- get { return g.Value; }
- }
-
- public BigInteger P
- {
- get { return p.Value; }
- }
-
- public BigInteger Q
- {
- get { return q.Value; }
- }
-
- public BigInteger Y
- {
- get { return y.Value; }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/DsaSecretBcpgKey.cs b/BCCrypto/src/bcpg/DsaSecretBcpgKey.cs
deleted file mode 100644
index 41835d4..0000000
--- a/BCCrypto/src/bcpg/DsaSecretBcpgKey.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Base class for a DSA secret key.
- public class DsaSecretBcpgKey
- : BcpgObject, IBcpgKey
- {
- internal MPInteger x;
-
- /**
- * @param in
- */
- public DsaSecretBcpgKey(
- BcpgInputStream bcpgIn)
- {
- this.x = new MPInteger(bcpgIn);
- }
-
- public DsaSecretBcpgKey(
- BigInteger x)
- {
- this.x = new MPInteger(x);
- }
-
- /// The format, as a string, always "PGP".
- public string Format
- {
- get { return "PGP"; }
- }
-
- /// Return the standard PGP encoding of the key.
- public override byte[] GetEncoded()
- {
- try
- {
- return base.GetEncoded();
- }
- catch (Exception)
- {
- return null;
- }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WriteObject(x);
- }
-
- /**
- * @return x
- */
- public BigInteger X
- {
- get { return x.Value; }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/ECDHPublicBCPGKey.cs b/BCCrypto/src/bcpg/ECDHPublicBCPGKey.cs
deleted file mode 100644
index dc225e3..0000000
--- a/BCCrypto/src/bcpg/ECDHPublicBCPGKey.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math.EC;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Base class for an ECDH Public Key.
- public class ECDHPublicBcpgKey
- : ECPublicBcpgKey
- {
- private byte reserved;
- private HashAlgorithmTag hashFunctionId;
- private SymmetricKeyAlgorithmTag symAlgorithmId;
-
- /// The stream to read the packet from.
- public ECDHPublicBcpgKey(
- BcpgInputStream bcpgIn)
- : base(bcpgIn)
- {
- int length = bcpgIn.ReadByte();
- byte[] kdfParameters = new byte[length];
- if (kdfParameters.Length != 3)
- throw new InvalidOperationException("kdf parameters size of 3 expected.");
-
- bcpgIn.ReadFully(kdfParameters);
-
- reserved = kdfParameters[0];
- hashFunctionId = (HashAlgorithmTag)kdfParameters[1];
- symAlgorithmId = (SymmetricKeyAlgorithmTag)kdfParameters[2];
-
- VerifyHashAlgorithm();
- VerifySymmetricKeyAlgorithm();
- }
-
- public ECDHPublicBcpgKey(
- DerObjectIdentifier oid,
- ECPoint point,
- HashAlgorithmTag hashAlgorithm,
- SymmetricKeyAlgorithmTag symmetricKeyAlgorithm)
- : base(oid, point)
- {
- reserved = 1;
- hashFunctionId = hashAlgorithm;
- symAlgorithmId = symmetricKeyAlgorithm;
-
- VerifyHashAlgorithm();
- VerifySymmetricKeyAlgorithm();
- }
-
- public virtual byte Reserved
- {
- get { return reserved; }
- }
-
- public virtual HashAlgorithmTag HashAlgorithm
- {
- get { return hashFunctionId; }
- }
-
- public virtual SymmetricKeyAlgorithmTag SymmetricKeyAlgorithm
- {
- get { return symAlgorithmId; }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- base.Encode(bcpgOut);
- bcpgOut.WriteByte(0x3);
- bcpgOut.WriteByte(reserved);
- bcpgOut.WriteByte((byte)hashFunctionId);
- bcpgOut.WriteByte((byte)symAlgorithmId);
- }
-
- private void VerifyHashAlgorithm()
- {
- switch ((HashAlgorithmTag)hashFunctionId)
- {
- case HashAlgorithmTag.Sha256:
- case HashAlgorithmTag.Sha384:
- case HashAlgorithmTag.Sha512:
- break;
- default:
- throw new InvalidOperationException("Hash algorithm must be SHA-256 or stronger.");
- }
- }
-
- private void VerifySymmetricKeyAlgorithm()
- {
- switch ((SymmetricKeyAlgorithmTag)symAlgorithmId)
- {
- case SymmetricKeyAlgorithmTag.Aes128:
- case SymmetricKeyAlgorithmTag.Aes192:
- case SymmetricKeyAlgorithmTag.Aes256:
- break;
- default:
- throw new InvalidOperationException("Symmetric key algorithm must be AES-128 or stronger.");
- }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/ECDsaPublicBCPGKey.cs b/BCCrypto/src/bcpg/ECDsaPublicBCPGKey.cs
deleted file mode 100644
index 5f0c8ac..0000000
--- a/BCCrypto/src/bcpg/ECDsaPublicBCPGKey.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Base class for an ECDSA Public Key.
- public class ECDsaPublicBcpgKey
- : ECPublicBcpgKey
- {
- /// The stream to read the packet from.
- protected internal ECDsaPublicBcpgKey(
- BcpgInputStream bcpgIn)
- : base(bcpgIn)
- {
- }
-
- public ECDsaPublicBcpgKey(
- DerObjectIdentifier oid,
- ECPoint point)
- : base(oid, point)
- {
- }
-
- public ECDsaPublicBcpgKey(
- DerObjectIdentifier oid,
- BigInteger encodedPoint)
- : base(oid, encodedPoint)
- {
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/ECPublicBCPGKey.cs b/BCCrypto/src/bcpg/ECPublicBCPGKey.cs
deleted file mode 100644
index f328f9d..0000000
--- a/BCCrypto/src/bcpg/ECPublicBCPGKey.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Base class for an EC Public Key.
- public abstract class ECPublicBcpgKey
- : BcpgObject, IBcpgKey
- {
- internal DerObjectIdentifier oid;
- internal BigInteger point;
-
- /// The stream to read the packet from.
- protected ECPublicBcpgKey(
- BcpgInputStream bcpgIn)
- {
- this.oid = DerObjectIdentifier.GetInstance(Asn1Object.FromByteArray(ReadBytesOfEncodedLength(bcpgIn)));
- this.point = new MPInteger(bcpgIn).Value;
- }
-
- protected ECPublicBcpgKey(
- DerObjectIdentifier oid,
- ECPoint point)
- {
- this.point = new BigInteger(1, point.GetEncoded());
- this.oid = oid;
- }
-
- protected ECPublicBcpgKey(
- DerObjectIdentifier oid,
- BigInteger encodedPoint)
- {
- this.point = encodedPoint;
- this.oid = oid;
- }
-
- /// The format, as a string, always "PGP".
- public string Format
- {
- get { return "PGP"; }
- }
-
- /// Return the standard PGP encoding of the key.
- public override byte[] GetEncoded()
- {
- try
- {
- return base.GetEncoded();
- }
- catch (IOException)
- {
- return null;
- }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- byte[] oid = this.oid.GetEncoded();
- bcpgOut.Write(oid, 1, oid.Length - 1);
-
- MPInteger point = new MPInteger(this.point);
- bcpgOut.WriteObject(point);
- }
-
- public virtual BigInteger EncodedPoint
- {
- get { return point; }
- }
-
- public virtual DerObjectIdentifier CurveOid
- {
- get { return oid; }
- }
-
- protected static byte[] ReadBytesOfEncodedLength(
- BcpgInputStream bcpgIn)
- {
- int length = bcpgIn.ReadByte();
- if (length == 0 || length == 0xFF)
- {
- throw new IOException("future extensions not yet implemented.");
- }
-
- byte[] buffer = new byte[length + 2];
- bcpgIn.ReadFully(buffer, 2, buffer.Length - 2);
- buffer[0] = (byte)0x06;
- buffer[1] = (byte)length;
-
- return buffer;
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/ECSecretBCPGKey.cs b/BCCrypto/src/bcpg/ECSecretBCPGKey.cs
deleted file mode 100644
index 22e0a34..0000000
--- a/BCCrypto/src/bcpg/ECSecretBCPGKey.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Base class for an EC Secret Key.
- public class ECSecretBcpgKey
- : BcpgObject, IBcpgKey
- {
- internal MPInteger x;
-
- public ECSecretBcpgKey(
- BcpgInputStream bcpgIn)
- {
- this.x = new MPInteger(bcpgIn);
- }
-
- public ECSecretBcpgKey(
- BigInteger x)
- {
- this.x = new MPInteger(x);
- }
-
- /// The format, as a string, always "PGP".
- public string Format
- {
- get { return "PGP"; }
- }
-
- /// Return the standard PGP encoding of the key.
- public override byte[] GetEncoded()
- {
- try
- {
- return base.GetEncoded();
- }
- catch (Exception)
- {
- return null;
- }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WriteObject(x);
- }
-
- public virtual BigInteger X
- {
- get { return x.Value; }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/ElGamalPublicBcpgKey.cs b/BCCrypto/src/bcpg/ElGamalPublicBcpgKey.cs
deleted file mode 100644
index 808e427..0000000
--- a/BCCrypto/src/bcpg/ElGamalPublicBcpgKey.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Base class for an ElGamal public key.
- public class ElGamalPublicBcpgKey
- : BcpgObject, IBcpgKey
- {
- internal MPInteger p, g, y;
-
- public ElGamalPublicBcpgKey(
- BcpgInputStream bcpgIn)
- {
- this.p = new MPInteger(bcpgIn);
- this.g = new MPInteger(bcpgIn);
- this.y = new MPInteger(bcpgIn);
- }
-
- public ElGamalPublicBcpgKey(
- BigInteger p,
- BigInteger g,
- BigInteger y)
- {
- this.p = new MPInteger(p);
- this.g = new MPInteger(g);
- this.y = new MPInteger(y);
- }
-
- /// The format, as a string, always "PGP".
- public string Format
- {
- get { return "PGP"; }
- }
-
- /// Return the standard PGP encoding of the key.
- public override byte[] GetEncoded()
- {
- try
- {
- return base.GetEncoded();
- }
- catch (Exception)
- {
- return null;
- }
- }
-
- public BigInteger P
- {
- get { return p.Value; }
- }
-
- public BigInteger G
- {
- get { return g.Value; }
- }
-
- public BigInteger Y
- {
- get { return y.Value; }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WriteObjects(p, g, y);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/ElGamalSecretBcpgKey.cs b/BCCrypto/src/bcpg/ElGamalSecretBcpgKey.cs
deleted file mode 100644
index 2d95b29..0000000
--- a/BCCrypto/src/bcpg/ElGamalSecretBcpgKey.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Base class for an ElGamal secret key.
- public class ElGamalSecretBcpgKey
- : BcpgObject, IBcpgKey
- {
- internal MPInteger x;
-
- /**
- * @param in
- */
- public ElGamalSecretBcpgKey(
- BcpgInputStream bcpgIn)
- {
- this.x = new MPInteger(bcpgIn);
- }
-
- /**
- * @param x
- */
- public ElGamalSecretBcpgKey(
- BigInteger x)
- {
- this.x = new MPInteger(x);
- }
-
- /// The format, as a string, always "PGP".
- public string Format
- {
- get { return "PGP"; }
- }
-
- public BigInteger X
- {
- get { return x.Value; }
- }
-
- /// Return the standard PGP encoding of the key.
- public override byte[] GetEncoded()
- {
- try
- {
- return base.GetEncoded();
- }
- catch (Exception)
- {
- return null;
- }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WriteObject(x);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/ExperimentalPacket.cs b/BCCrypto/src/bcpg/ExperimentalPacket.cs
deleted file mode 100644
index 36a254b..0000000
--- a/BCCrypto/src/bcpg/ExperimentalPacket.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic packet for an experimental packet.
- public class ExperimentalPacket
- : ContainedPacket //, PublicKeyAlgorithmTag
- {
- private readonly PacketTag tag;
- private readonly byte[] contents;
-
- internal ExperimentalPacket(
- PacketTag tag,
- BcpgInputStream bcpgIn)
- {
- this.tag = tag;
-
- this.contents = bcpgIn.ReadAll();
- }
-
- public PacketTag Tag
- {
- get { return tag; }
- }
-
- public byte[] GetContents()
- {
- return (byte[]) contents.Clone();
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WritePacket(tag, contents, true);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/HashAlgorithmTags.cs b/BCCrypto/src/bcpg/HashAlgorithmTags.cs
deleted file mode 100644
index 96c0091..0000000
--- a/BCCrypto/src/bcpg/HashAlgorithmTags.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic tags for hash algorithms.
- public enum HashAlgorithmTag
- {
- MD5 = 1, // MD5
- Sha1 = 2, // SHA-1
- RipeMD160 = 3, // RIPE-MD/160
- DoubleSha = 4, // Reserved for double-width SHA (experimental)
- MD2 = 5, // MD2
- Tiger192 = 6, // Reserved for TIGER/192
- Haval5pass160 = 7, // Reserved for HAVAL (5 pass, 160-bit)
-
- Sha256 = 8, // SHA-256
- Sha384 = 9, // SHA-384
- Sha512 = 10, // SHA-512
- Sha224 = 11, // SHA-224
- }
-}
diff --git a/BCCrypto/src/bcpg/IBcpgKey.cs b/BCCrypto/src/bcpg/IBcpgKey.cs
deleted file mode 100644
index 2754617..0000000
--- a/BCCrypto/src/bcpg/IBcpgKey.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Base interface for a PGP key.
- public interface IBcpgKey
- {
- ///
- /// The base format for this key - in the case of the symmetric keys it will generally
- /// be raw indicating that the key is just a straight byte representation, for an asymmetric
- /// key the format will be PGP, indicating the key is a string of MPIs encoded in PGP format.
- ///
- /// "RAW" or "PGP".
- string Format { get; }
- }
-}
diff --git a/BCCrypto/src/bcpg/InputStreamPacket.cs b/BCCrypto/src/bcpg/InputStreamPacket.cs
deleted file mode 100644
index c45efab..0000000
--- a/BCCrypto/src/bcpg/InputStreamPacket.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-namespace Org.BouncyCastle.Bcpg
-{
- public class InputStreamPacket
- : Packet
- {
- private readonly BcpgInputStream bcpgIn;
-
- public InputStreamPacket(
- BcpgInputStream bcpgIn)
- {
- this.bcpgIn = bcpgIn;
- }
-
- /// Note: you can only read from this once...
- public BcpgInputStream GetInputStream()
- {
- return bcpgIn;
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/LiteralDataPacket.cs b/BCCrypto/src/bcpg/LiteralDataPacket.cs
deleted file mode 100644
index 63a2c6d..0000000
--- a/BCCrypto/src/bcpg/LiteralDataPacket.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Generic literal data packet.
- public class LiteralDataPacket
- : InputStreamPacket
- {
- private int format;
- private byte[] fileName;
- private long modDate;
-
- internal LiteralDataPacket(
- BcpgInputStream bcpgIn)
- : base(bcpgIn)
- {
- format = bcpgIn.ReadByte();
- int len = bcpgIn.ReadByte();
-
- fileName = new byte[len];
- for (int i = 0; i != len; ++i)
- {
- fileName[i] = (byte)bcpgIn.ReadByte();
- }
-
- modDate = (((uint)bcpgIn.ReadByte() << 24)
- | ((uint)bcpgIn.ReadByte() << 16)
- | ((uint)bcpgIn.ReadByte() << 8)
- | (uint)bcpgIn.ReadByte()) * 1000L;
- }
-
- /// The format tag value.
- public int Format
- {
- get { return format; }
- }
-
- /// The modification time of the file in milli-seconds (since Jan 1, 1970 UTC)
- public long ModificationTime
- {
- get { return modDate; }
- }
-
- public string FileName
- {
- get { return Strings.FromUtf8ByteArray(fileName); }
- }
-
- public byte[] GetRawFileName()
- {
- return Arrays.Clone(fileName);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/MPInteger.cs b/BCCrypto/src/bcpg/MPInteger.cs
deleted file mode 100644
index 4414072..0000000
--- a/BCCrypto/src/bcpg/MPInteger.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// A multiple precision integer
- public class MPInteger
- : BcpgObject
- {
- private readonly BigInteger val;
-
- public MPInteger(
- BcpgInputStream bcpgIn)
- {
- if (bcpgIn == null)
- throw new ArgumentNullException("bcpgIn");
-
- int length = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
- byte[] bytes = new byte[(length + 7) / 8];
-
- bcpgIn.ReadFully(bytes);
-
- this.val = new BigInteger(1, bytes);
- }
-
- public MPInteger(
- BigInteger val)
- {
- if (val == null)
- throw new ArgumentNullException("val");
- if (val.SignValue < 0)
- throw new ArgumentException("Values must be positive", "val");
-
- this.val = val;
- }
-
- public BigInteger Value
- {
- get { return val; }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WriteShort((short) val.BitLength);
- bcpgOut.Write(val.ToByteArrayUnsigned());
- }
-
- internal static void Encode(
- BcpgOutputStream bcpgOut,
- BigInteger val)
- {
- bcpgOut.WriteShort((short) val.BitLength);
- bcpgOut.Write(val.ToByteArrayUnsigned());
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/MarkerPacket.cs b/BCCrypto/src/bcpg/MarkerPacket.cs
deleted file mode 100644
index 4dc4b5a..0000000
--- a/BCCrypto/src/bcpg/MarkerPacket.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic type for a marker packet.
- public class MarkerPacket
- : ContainedPacket
- {
- // "PGP"
- byte[] marker = { (byte)0x50, (byte)0x47, (byte)0x50 };
-
- public MarkerPacket(
- BcpgInputStream bcpgIn)
- {
- bcpgIn.ReadFully(marker);
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WritePacket(PacketTag.Marker, marker, true);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/ModDetectionCodePacket.cs b/BCCrypto/src/bcpg/ModDetectionCodePacket.cs
deleted file mode 100644
index 6bb2364..0000000
--- a/BCCrypto/src/bcpg/ModDetectionCodePacket.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic packet for a modification detection code packet.
- public class ModDetectionCodePacket
- : ContainedPacket
- {
- private readonly byte[] digest;
-
- internal ModDetectionCodePacket(
- BcpgInputStream bcpgIn)
- {
- if (bcpgIn == null)
- throw new ArgumentNullException("bcpgIn");
-
- this.digest = new byte[20];
- bcpgIn.ReadFully(this.digest);
- }
-
- public ModDetectionCodePacket(
- byte[] digest)
- {
- if (digest == null)
- throw new ArgumentNullException("digest");
-
- this.digest = (byte[]) digest.Clone();
- }
-
- public byte[] GetDigest()
- {
- return (byte[]) digest.Clone();
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WritePacket(PacketTag.ModificationDetectionCode, digest, false);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/OnePassSignaturePacket.cs b/BCCrypto/src/bcpg/OnePassSignaturePacket.cs
deleted file mode 100644
index b67df0a..0000000
--- a/BCCrypto/src/bcpg/OnePassSignaturePacket.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Generic signature object
- public class OnePassSignaturePacket
- : ContainedPacket
- {
- private int version;
- private int sigType;
- private HashAlgorithmTag hashAlgorithm;
- private PublicKeyAlgorithmTag keyAlgorithm;
- private long keyId;
- private int nested;
-
- internal OnePassSignaturePacket(
- BcpgInputStream bcpgIn)
- {
- version = bcpgIn.ReadByte();
- sigType = bcpgIn.ReadByte();
- hashAlgorithm = (HashAlgorithmTag) bcpgIn.ReadByte();
- keyAlgorithm = (PublicKeyAlgorithmTag) bcpgIn.ReadByte();
-
- keyId |= (long)bcpgIn.ReadByte() << 56;
- keyId |= (long)bcpgIn.ReadByte() << 48;
- keyId |= (long)bcpgIn.ReadByte() << 40;
- keyId |= (long)bcpgIn.ReadByte() << 32;
- keyId |= (long)bcpgIn.ReadByte() << 24;
- keyId |= (long)bcpgIn.ReadByte() << 16;
- keyId |= (long)bcpgIn.ReadByte() << 8;
- keyId |= (uint)bcpgIn.ReadByte();
-
- nested = bcpgIn.ReadByte();
- }
-
- public OnePassSignaturePacket(
- int sigType,
- HashAlgorithmTag hashAlgorithm,
- PublicKeyAlgorithmTag keyAlgorithm,
- long keyId,
- bool isNested)
- {
- this.version = 3;
- this.sigType = sigType;
- this.hashAlgorithm = hashAlgorithm;
- this.keyAlgorithm = keyAlgorithm;
- this.keyId = keyId;
- this.nested = (isNested) ? 0 : 1;
- }
-
- public int SignatureType
- {
- get { return sigType; }
- }
-
- /// The encryption algorithm tag.
- public PublicKeyAlgorithmTag KeyAlgorithm
- {
- get { return keyAlgorithm; }
- }
-
- /// The hash algorithm tag.
- public HashAlgorithmTag HashAlgorithm
- {
- get { return hashAlgorithm; }
- }
-
- public long KeyId
- {
- get { return keyId; }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- MemoryStream bOut = new MemoryStream();
- BcpgOutputStream pOut = new BcpgOutputStream(bOut);
-
- pOut.Write(
- (byte) version,
- (byte) sigType,
- (byte) hashAlgorithm,
- (byte) keyAlgorithm);
-
- pOut.WriteLong(keyId);
-
- pOut.WriteByte((byte) nested);
-
- bcpgOut.WritePacket(PacketTag.OnePassSignature, bOut.ToArray(), true);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/OutputStreamPacket.cs b/BCCrypto/src/bcpg/OutputStreamPacket.cs
deleted file mode 100644
index aa8316d..0000000
--- a/BCCrypto/src/bcpg/OutputStreamPacket.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- public abstract class OutputStreamPacket
- {
- private readonly BcpgOutputStream bcpgOut;
-
- internal OutputStreamPacket(
- BcpgOutputStream bcpgOut)
- {
- if (bcpgOut == null)
- throw new ArgumentNullException("bcpgOut");
-
- this.bcpgOut = bcpgOut;
- }
-
- public abstract BcpgOutputStream Open();
-
- public abstract void Close();
- }
-}
-
diff --git a/BCCrypto/src/bcpg/Packet.cs b/BCCrypto/src/bcpg/Packet.cs
deleted file mode 100644
index 83f6d1f..0000000
--- a/BCCrypto/src/bcpg/Packet.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace Org.BouncyCastle.Bcpg
-{
- public class Packet
- //: PacketTag
- {
- }
-}
diff --git a/BCCrypto/src/bcpg/PacketTags.cs b/BCCrypto/src/bcpg/PacketTags.cs
deleted file mode 100644
index 5a53d4e..0000000
--- a/BCCrypto/src/bcpg/PacketTags.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic PGP packet tag types.
- public enum PacketTag
- {
- Reserved = 0, // Reserved - a packet tag must not have this value
- PublicKeyEncryptedSession = 1, // Public-Key Encrypted Session Key Packet
- Signature = 2, // Signature Packet
- SymmetricKeyEncryptedSessionKey = 3, // Symmetric-Key Encrypted Session Key Packet
- OnePassSignature = 4, // One-Pass Signature Packet
- SecretKey = 5, // Secret Key Packet
- PublicKey = 6, // Public Key Packet
- SecretSubkey = 7, // Secret Subkey Packet
- CompressedData = 8, // Compressed Data Packet
- SymmetricKeyEncrypted = 9, // Symmetrically Encrypted Data Packet
- Marker = 10, // Marker Packet
- LiteralData = 11, // Literal Data Packet
- Trust = 12, // Trust Packet
- UserId = 13, // User ID Packet
- PublicSubkey = 14, // Public Subkey Packet
- UserAttribute = 17, // User attribute
- SymmetricEncryptedIntegrityProtected = 18, // Symmetric encrypted, integrity protected
- ModificationDetectionCode = 19, // Modification detection code
-
- Experimental1 = 60, // Private or Experimental Values
- Experimental2 = 61,
- Experimental3 = 62,
- Experimental4 = 63
- }
-}
diff --git a/BCCrypto/src/bcpg/PublicKeyAlgorithmTags.cs b/BCCrypto/src/bcpg/PublicKeyAlgorithmTags.cs
deleted file mode 100644
index 9e30b54..0000000
--- a/BCCrypto/src/bcpg/PublicKeyAlgorithmTags.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Public Key Algorithm tag numbers.
- public enum PublicKeyAlgorithmTag
- {
- RsaGeneral = 1, // RSA (Encrypt or Sign)
- RsaEncrypt = 2, // RSA Encrypt-Only
- RsaSign = 3, // RSA Sign-Only
- ElGamalEncrypt = 16, // Elgamal (Encrypt-Only), see [ELGAMAL]
- Dsa = 17, // DSA (Digital Signature Standard)
- [Obsolete("Use 'ECDH' instead")]
- EC = 18, // Reserved for Elliptic Curve
- ECDH = 18, // Reserved for Elliptic Curve (actual algorithm name)
- ECDsa = 19, // Reserved for ECDSA
- ElGamalGeneral = 20, // Elgamal (Encrypt or Sign)
- DiffieHellman = 21, // Reserved for Diffie-Hellman (X9.42, as defined for IETF-S/MIME)
-
- Experimental_1 = 100,
- Experimental_2 = 101,
- Experimental_3 = 102,
- Experimental_4 = 103,
- Experimental_5 = 104,
- Experimental_6 = 105,
- Experimental_7 = 106,
- Experimental_8 = 107,
- Experimental_9 = 108,
- Experimental_10 = 109,
- Experimental_11 = 110,
- }
-}
diff --git a/BCCrypto/src/bcpg/PublicKeyEncSessionPacket.cs b/BCCrypto/src/bcpg/PublicKeyEncSessionPacket.cs
deleted file mode 100644
index 831b5a1..0000000
--- a/BCCrypto/src/bcpg/PublicKeyEncSessionPacket.cs
+++ /dev/null
@@ -1,115 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic packet for a PGP public key.
- public class PublicKeyEncSessionPacket
- : ContainedPacket //, PublicKeyAlgorithmTag
- {
- private int version;
- private long keyId;
- private PublicKeyAlgorithmTag algorithm;
- private byte[][] data;
-
- internal PublicKeyEncSessionPacket(
- BcpgInputStream bcpgIn)
- {
- version = bcpgIn.ReadByte();
-
- keyId |= (long)bcpgIn.ReadByte() << 56;
- keyId |= (long)bcpgIn.ReadByte() << 48;
- keyId |= (long)bcpgIn.ReadByte() << 40;
- keyId |= (long)bcpgIn.ReadByte() << 32;
- keyId |= (long)bcpgIn.ReadByte() << 24;
- keyId |= (long)bcpgIn.ReadByte() << 16;
- keyId |= (long)bcpgIn.ReadByte() << 8;
- keyId |= (uint)bcpgIn.ReadByte();
-
- algorithm = (PublicKeyAlgorithmTag) bcpgIn.ReadByte();
-
- switch ((PublicKeyAlgorithmTag) algorithm)
- {
- case PublicKeyAlgorithmTag.RsaEncrypt:
- case PublicKeyAlgorithmTag.RsaGeneral:
- data = new byte[][]{ new MPInteger(bcpgIn).GetEncoded() };
- break;
- case PublicKeyAlgorithmTag.ElGamalEncrypt:
- case PublicKeyAlgorithmTag.ElGamalGeneral:
- MPInteger p = new MPInteger(bcpgIn);
- MPInteger g = new MPInteger(bcpgIn);
- data = new byte[][]{
- p.GetEncoded(),
- g.GetEncoded(),
- };
- break;
- case PublicKeyAlgorithmTag.ECDH:
- data = new byte[][]{ Streams.ReadAll(bcpgIn) };
- break;
- default:
- throw new IOException("unknown PGP public key algorithm encountered");
- }
- }
-
- public PublicKeyEncSessionPacket(
- long keyId,
- PublicKeyAlgorithmTag algorithm,
- byte[][] data)
- {
- this.version = 3;
- this.keyId = keyId;
- this.algorithm = algorithm;
- this.data = new byte[data.Length][];
- for (int i = 0; i < data.Length; ++i)
- {
- this.data[i] = Arrays.Clone(data[i]);
- }
- }
-
- public int Version
- {
- get { return version; }
- }
-
- public long KeyId
- {
- get { return keyId; }
- }
-
- public PublicKeyAlgorithmTag Algorithm
- {
- get { return algorithm; }
- }
-
- public byte[][] GetEncSessionKey()
- {
- return data;
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- MemoryStream bOut = new MemoryStream();
- BcpgOutputStream pOut = new BcpgOutputStream(bOut);
-
- pOut.WriteByte((byte) version);
-
- pOut.WriteLong(keyId);
-
- pOut.WriteByte((byte)algorithm);
-
- for (int i = 0; i < data.Length; ++i)
- {
- pOut.Write(data[i]);
- }
-
- Platform.Dispose(pOut);
-
- bcpgOut.WritePacket(PacketTag.PublicKeyEncryptedSession , bOut.ToArray(), true);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/PublicKeyPacket.cs b/BCCrypto/src/bcpg/PublicKeyPacket.cs
deleted file mode 100644
index bbed941..0000000
--- a/BCCrypto/src/bcpg/PublicKeyPacket.cs
+++ /dev/null
@@ -1,121 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic packet for a PGP public key.
- public class PublicKeyPacket
- : ContainedPacket //, PublicKeyAlgorithmTag
- {
- private int version;
- private long time;
- private int validDays;
- private PublicKeyAlgorithmTag algorithm;
- private IBcpgKey key;
-
- internal PublicKeyPacket(
- BcpgInputStream bcpgIn)
- {
- version = bcpgIn.ReadByte();
-
- time = ((uint)bcpgIn.ReadByte() << 24) | ((uint)bcpgIn.ReadByte() << 16)
- | ((uint)bcpgIn.ReadByte() << 8) | (uint)bcpgIn.ReadByte();
-
- if (version <= 3)
- {
- validDays = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
- }
-
- algorithm = (PublicKeyAlgorithmTag) bcpgIn.ReadByte();
-
- switch ((PublicKeyAlgorithmTag) algorithm)
- {
- case PublicKeyAlgorithmTag.RsaEncrypt:
- case PublicKeyAlgorithmTag.RsaGeneral:
- case PublicKeyAlgorithmTag.RsaSign:
- key = new RsaPublicBcpgKey(bcpgIn);
- break;
- case PublicKeyAlgorithmTag.Dsa:
- key = new DsaPublicBcpgKey(bcpgIn);
- break;
- case PublicKeyAlgorithmTag.ElGamalEncrypt:
- case PublicKeyAlgorithmTag.ElGamalGeneral:
- key = new ElGamalPublicBcpgKey(bcpgIn);
- break;
- case PublicKeyAlgorithmTag.ECDH:
- key = new ECDHPublicBcpgKey(bcpgIn);
- break;
- case PublicKeyAlgorithmTag.ECDsa:
- key = new ECDsaPublicBcpgKey(bcpgIn);
- break;
- default:
- throw new IOException("unknown PGP public key algorithm encountered");
- }
- }
-
- /// Construct a version 4 public key packet.
- public PublicKeyPacket(
- PublicKeyAlgorithmTag algorithm,
- DateTime time,
- IBcpgKey key)
- {
- this.version = 4;
- this.time = DateTimeUtilities.DateTimeToUnixMs(time) / 1000L;
- this.algorithm = algorithm;
- this.key = key;
- }
-
- public virtual int Version
- {
- get { return version; }
- }
-
- public virtual PublicKeyAlgorithmTag Algorithm
- {
- get { return algorithm; }
- }
-
- public virtual int ValidDays
- {
- get { return validDays; }
- }
-
- public virtual DateTime GetTime()
- {
- return DateTimeUtilities.UnixMsToDateTime(time * 1000L);
- }
-
- public virtual IBcpgKey Key
- {
- get { return key; }
- }
-
- public virtual byte[] GetEncodedContents()
- {
- MemoryStream bOut = new MemoryStream();
- BcpgOutputStream pOut = new BcpgOutputStream(bOut);
-
- pOut.WriteByte((byte) version);
- pOut.WriteInt((int) time);
-
- if (version <= 3)
- {
- pOut.WriteShort((short) validDays);
- }
-
- pOut.WriteByte((byte) algorithm);
-
- pOut.WriteObject((BcpgObject)key);
-
- return bOut.ToArray();
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WritePacket(PacketTag.PublicKey, GetEncodedContents(), true);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/PublicSubkeyPacket.cs b/BCCrypto/src/bcpg/PublicSubkeyPacket.cs
deleted file mode 100644
index 6e1aeda..0000000
--- a/BCCrypto/src/bcpg/PublicSubkeyPacket.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System;
-using System.IO;
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic packet for a PGP public subkey
- public class PublicSubkeyPacket
- : PublicKeyPacket
- {
- internal PublicSubkeyPacket(
- BcpgInputStream bcpgIn)
- : base(bcpgIn)
- {
- }
-
- /// Construct a version 4 public subkey packet.
- public PublicSubkeyPacket(
- PublicKeyAlgorithmTag algorithm,
- DateTime time,
- IBcpgKey key)
- : base(algorithm, time, key)
- {
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WritePacket(PacketTag.PublicSubkey, GetEncodedContents(), true);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/RsaPublicBcpgKey.cs b/BCCrypto/src/bcpg/RsaPublicBcpgKey.cs
deleted file mode 100644
index fd2313c..0000000
--- a/BCCrypto/src/bcpg/RsaPublicBcpgKey.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Base class for an RSA public key.
- public class RsaPublicBcpgKey
- : BcpgObject, IBcpgKey
- {
- private readonly MPInteger n, e;
-
- /// Construct an RSA public key from the passed in stream.
- public RsaPublicBcpgKey(
- BcpgInputStream bcpgIn)
- {
- this.n = new MPInteger(bcpgIn);
- this.e = new MPInteger(bcpgIn);
- }
-
- /// The modulus.
- /// The public exponent.
- public RsaPublicBcpgKey(
- BigInteger n,
- BigInteger e)
- {
- this.n = new MPInteger(n);
- this.e = new MPInteger(e);
- }
-
- public BigInteger PublicExponent
- {
- get { return e.Value; }
- }
-
- public BigInteger Modulus
- {
- get { return n.Value; }
- }
-
- /// The format, as a string, always "PGP".
- public string Format
- {
- get { return "PGP"; }
- }
-
- /// Return the standard PGP encoding of the key.
- public override byte[] GetEncoded()
- {
- try
- {
- return base.GetEncoded();
- }
- catch (Exception)
- {
- return null;
- }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WriteObjects(n, e);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/RsaSecretBcpgKey.cs b/BCCrypto/src/bcpg/RsaSecretBcpgKey.cs
deleted file mode 100644
index 5c04d9f..0000000
--- a/BCCrypto/src/bcpg/RsaSecretBcpgKey.cs
+++ /dev/null
@@ -1,114 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Base class for an RSA secret (or priate) key.
- public class RsaSecretBcpgKey
- : BcpgObject, IBcpgKey
- {
- private readonly MPInteger d, p, q, u;
- private readonly BigInteger expP, expQ, crt;
-
- public RsaSecretBcpgKey(
- BcpgInputStream bcpgIn)
- {
- this.d = new MPInteger(bcpgIn);
- this.p = new MPInteger(bcpgIn);
- this.q = new MPInteger(bcpgIn);
- this.u = new MPInteger(bcpgIn);
-
- this.expP = d.Value.Remainder(p.Value.Subtract(BigInteger.One));
- this.expQ = d.Value.Remainder(q.Value.Subtract(BigInteger.One));
- this.crt = q.Value.ModInverse(p.Value);
- }
-
- public RsaSecretBcpgKey(
- BigInteger d,
- BigInteger p,
- BigInteger q)
- {
- // PGP requires (p < q)
- int cmp = p.CompareTo(q);
- if (cmp >= 0)
- {
- if (cmp == 0)
- throw new ArgumentException("p and q cannot be equal");
-
- BigInteger tmp = p;
- p = q;
- q = tmp;
- }
-
- this.d = new MPInteger(d);
- this.p = new MPInteger(p);
- this.q = new MPInteger(q);
- this.u = new MPInteger(p.ModInverse(q));
-
- this.expP = d.Remainder(p.Subtract(BigInteger.One));
- this.expQ = d.Remainder(q.Subtract(BigInteger.One));
- this.crt = q.ModInverse(p);
- }
-
- public BigInteger Modulus
- {
- get { return p.Value.Multiply(q.Value); }
- }
-
- public BigInteger PrivateExponent
- {
- get { return d.Value; }
- }
-
- public BigInteger PrimeP
- {
- get { return p.Value; }
- }
-
- public BigInteger PrimeQ
- {
- get { return q.Value; }
- }
-
- public BigInteger PrimeExponentP
- {
- get { return expP; }
- }
-
- public BigInteger PrimeExponentQ
- {
- get { return expQ; }
- }
-
- public BigInteger CrtCoefficient
- {
- get { return crt; }
- }
-
- /// The format, as a string, always "PGP".
- public string Format
- {
- get { return "PGP"; }
- }
-
- /// Return the standard PGP encoding of the key.
- public override byte[] GetEncoded()
- {
- try
- {
- return base.GetEncoded();
- }
- catch (Exception)
- {
- return null;
- }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WriteObjects(d, p, q, u);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/S2k.cs b/BCCrypto/src/bcpg/S2k.cs
deleted file mode 100644
index 33fd792..0000000
--- a/BCCrypto/src/bcpg/S2k.cs
+++ /dev/null
@@ -1,149 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// The string to key specifier class.
- public class S2k
- : BcpgObject
- {
- private const int ExpBias = 6;
-
- public const int Simple = 0;
- public const int Salted = 1;
- public const int SaltedAndIterated = 3;
- public const int GnuDummyS2K = 101;
- public const int GnuProtectionModeNoPrivateKey = 1;
- public const int GnuProtectionModeDivertToCard = 2;
-
- internal int type;
- internal HashAlgorithmTag algorithm;
- internal byte[] iv;
- internal int itCount = -1;
- internal int protectionMode = -1;
-
- internal S2k(
- Stream inStr)
- {
- type = inStr.ReadByte();
- algorithm = (HashAlgorithmTag) inStr.ReadByte();
-
- //
- // if this happens we have a dummy-S2k packet.
- //
- if (type != GnuDummyS2K)
- {
- if (type != 0)
- {
- iv = new byte[8];
- if (Streams.ReadFully(inStr, iv, 0, iv.Length) < iv.Length)
- throw new EndOfStreamException();
-
- if (type == 3)
- {
- itCount = inStr.ReadByte();
- }
- }
- }
- else
- {
- inStr.ReadByte(); // G
- inStr.ReadByte(); // N
- inStr.ReadByte(); // U
- protectionMode = inStr.ReadByte(); // protection mode
- }
- }
-
- public S2k(
- HashAlgorithmTag algorithm)
- {
- this.type = 0;
- this.algorithm = algorithm;
- }
-
- public S2k(
- HashAlgorithmTag algorithm,
- byte[] iv)
- {
- this.type = 1;
- this.algorithm = algorithm;
- this.iv = iv;
- }
-
- public S2k(
- HashAlgorithmTag algorithm,
- byte[] iv,
- int itCount)
- {
- this.type = 3;
- this.algorithm = algorithm;
- this.iv = iv;
- this.itCount = itCount;
- }
-
- public virtual int Type
- {
- get { return type; }
- }
-
- /// The hash algorithm.
- public virtual HashAlgorithmTag HashAlgorithm
- {
- get { return algorithm; }
- }
-
- /// The IV for the key generation algorithm.
- public virtual byte[] GetIV()
- {
- return Arrays.Clone(iv);
- }
-
- [Obsolete("Use 'IterationCount' property instead")]
- public long GetIterationCount()
- {
- return IterationCount;
- }
-
- /// The iteration count
- public virtual long IterationCount
- {
- get { return (16 + (itCount & 15)) << ((itCount >> 4) + ExpBias); }
- }
-
- /// The protection mode - only if GnuDummyS2K
- public virtual int ProtectionMode
- {
- get { return protectionMode; }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WriteByte((byte) type);
- bcpgOut.WriteByte((byte) algorithm);
-
- if (type != GnuDummyS2K)
- {
- if (type != 0)
- {
- bcpgOut.Write(iv);
- }
-
- if (type == 3)
- {
- bcpgOut.WriteByte((byte) itCount);
- }
- }
- else
- {
- bcpgOut.WriteByte((byte) 'G');
- bcpgOut.WriteByte((byte) 'N');
- bcpgOut.WriteByte((byte) 'U');
- bcpgOut.WriteByte((byte) protectionMode);
- }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/SecretKeyPacket.cs b/BCCrypto/src/bcpg/SecretKeyPacket.cs
deleted file mode 100644
index d9ceab4..0000000
--- a/BCCrypto/src/bcpg/SecretKeyPacket.cs
+++ /dev/null
@@ -1,170 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic packet for a PGP secret key.
- public class SecretKeyPacket
- : ContainedPacket //, PublicKeyAlgorithmTag
- {
- public const int UsageNone = 0x00;
- public const int UsageChecksum = 0xff;
- public const int UsageSha1 = 0xfe;
-
- private PublicKeyPacket pubKeyPacket;
- private readonly byte[] secKeyData;
- private int s2kUsage;
- private SymmetricKeyAlgorithmTag encAlgorithm;
- private S2k s2k;
- private byte[] iv;
-
- internal SecretKeyPacket(
- BcpgInputStream bcpgIn)
- {
- if (this is SecretSubkeyPacket)
- {
- pubKeyPacket = new PublicSubkeyPacket(bcpgIn);
- }
- else
- {
- pubKeyPacket = new PublicKeyPacket(bcpgIn);
- }
-
- s2kUsage = bcpgIn.ReadByte();
-
- if (s2kUsage == UsageChecksum || s2kUsage == UsageSha1)
- {
- encAlgorithm = (SymmetricKeyAlgorithmTag) bcpgIn.ReadByte();
- s2k = new S2k(bcpgIn);
- }
- else
- {
- encAlgorithm = (SymmetricKeyAlgorithmTag) s2kUsage;
- }
-
- if (!(s2k != null && s2k.Type == S2k.GnuDummyS2K && s2k.ProtectionMode == 0x01))
- {
- if (s2kUsage != 0)
- {
- if (((int) encAlgorithm) < 7)
- {
- iv = new byte[8];
- }
- else
- {
- iv = new byte[16];
- }
- bcpgIn.ReadFully(iv);
- }
- }
-
- secKeyData = bcpgIn.ReadAll();
- }
-
- public SecretKeyPacket(
- PublicKeyPacket pubKeyPacket,
- SymmetricKeyAlgorithmTag encAlgorithm,
- S2k s2k,
- byte[] iv,
- byte[] secKeyData)
- {
- this.pubKeyPacket = pubKeyPacket;
- this.encAlgorithm = encAlgorithm;
-
- if (encAlgorithm != SymmetricKeyAlgorithmTag.Null)
- {
- this.s2kUsage = UsageChecksum;
- }
- else
- {
- this.s2kUsage = UsageNone;
- }
-
- this.s2k = s2k;
- this.iv = Arrays.Clone(iv);
- this.secKeyData = secKeyData;
- }
-
- public SecretKeyPacket(
- PublicKeyPacket pubKeyPacket,
- SymmetricKeyAlgorithmTag encAlgorithm,
- int s2kUsage,
- S2k s2k,
- byte[] iv,
- byte[] secKeyData)
- {
- this.pubKeyPacket = pubKeyPacket;
- this.encAlgorithm = encAlgorithm;
- this.s2kUsage = s2kUsage;
- this.s2k = s2k;
- this.iv = Arrays.Clone(iv);
- this.secKeyData = secKeyData;
- }
-
- public SymmetricKeyAlgorithmTag EncAlgorithm
- {
- get { return encAlgorithm; }
- }
-
- public int S2kUsage
- {
- get { return s2kUsage; }
- }
-
- public byte[] GetIV()
- {
- return Arrays.Clone(iv);
- }
-
- public S2k S2k
- {
- get { return s2k; }
- }
-
- public PublicKeyPacket PublicKeyPacket
- {
- get { return pubKeyPacket; }
- }
-
- public byte[] GetSecretKeyData()
- {
- return secKeyData;
- }
-
- public byte[] GetEncodedContents()
- {
- MemoryStream bOut = new MemoryStream();
- BcpgOutputStream pOut = new BcpgOutputStream(bOut);
-
- pOut.Write(pubKeyPacket.GetEncodedContents());
-
- pOut.WriteByte((byte) s2kUsage);
-
- if (s2kUsage == UsageChecksum || s2kUsage == UsageSha1)
- {
- pOut.WriteByte((byte) encAlgorithm);
- pOut.WriteObject(s2k);
- }
-
- if (iv != null)
- {
- pOut.Write(iv);
- }
-
- if (secKeyData != null && secKeyData.Length > 0)
- {
- pOut.Write(secKeyData);
- }
-
- return bOut.ToArray();
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WritePacket(PacketTag.SecretKey, GetEncodedContents(), true);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/SecretSubkeyPacket.cs b/BCCrypto/src/bcpg/SecretSubkeyPacket.cs
deleted file mode 100644
index 8f17469..0000000
--- a/BCCrypto/src/bcpg/SecretSubkeyPacket.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic packet for a PGP secret key.
- public class SecretSubkeyPacket
- : SecretKeyPacket
- {
- internal SecretSubkeyPacket(
- BcpgInputStream bcpgIn)
- : base(bcpgIn)
- {
- }
-
- public SecretSubkeyPacket(
- PublicKeyPacket pubKeyPacket,
- SymmetricKeyAlgorithmTag encAlgorithm,
- S2k s2k,
- byte[] iv,
- byte[] secKeyData)
- : base(pubKeyPacket, encAlgorithm, s2k, iv, secKeyData)
- {
- }
-
- public SecretSubkeyPacket(
- PublicKeyPacket pubKeyPacket,
- SymmetricKeyAlgorithmTag encAlgorithm,
- int s2kUsage,
- S2k s2k,
- byte[] iv,
- byte[] secKeyData)
- : base(pubKeyPacket, encAlgorithm, s2kUsage, s2k, iv, secKeyData)
- {
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WritePacket(PacketTag.SecretSubkey, GetEncodedContents(), true);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/SignaturePacket.cs b/BCCrypto/src/bcpg/SignaturePacket.cs
deleted file mode 100644
index 5b91c15..0000000
--- a/BCCrypto/src/bcpg/SignaturePacket.cs
+++ /dev/null
@@ -1,477 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Bcpg.Sig;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Generic signature packet.
- public class SignaturePacket
- : ContainedPacket //, PublicKeyAlgorithmTag
- {
- private int version;
- private int signatureType;
- private long creationTime;
- private long keyId;
- private PublicKeyAlgorithmTag keyAlgorithm;
- private HashAlgorithmTag hashAlgorithm;
- private MPInteger[] signature;
- private byte[] fingerprint;
- private SignatureSubpacket[] hashedData;
- private SignatureSubpacket[] unhashedData;
- private byte[] signatureEncoding;
-
- internal SignaturePacket(
- BcpgInputStream bcpgIn)
- {
- version = bcpgIn.ReadByte();
-
- if (version == 3 || version == 2)
- {
-// int l =
- bcpgIn.ReadByte();
-
- signatureType = bcpgIn.ReadByte();
- creationTime = (((long)bcpgIn.ReadByte() << 24) | ((long)bcpgIn.ReadByte() << 16)
- | ((long)bcpgIn.ReadByte() << 8) | (uint)bcpgIn.ReadByte()) * 1000L;
-
- keyId |= (long)bcpgIn.ReadByte() << 56;
- keyId |= (long)bcpgIn.ReadByte() << 48;
- keyId |= (long)bcpgIn.ReadByte() << 40;
- keyId |= (long)bcpgIn.ReadByte() << 32;
- keyId |= (long)bcpgIn.ReadByte() << 24;
- keyId |= (long)bcpgIn.ReadByte() << 16;
- keyId |= (long)bcpgIn.ReadByte() << 8;
- keyId |= (uint)bcpgIn.ReadByte();
-
- keyAlgorithm = (PublicKeyAlgorithmTag) bcpgIn.ReadByte();
- hashAlgorithm = (HashAlgorithmTag) bcpgIn.ReadByte();
- }
- else if (version == 4)
- {
- signatureType = bcpgIn.ReadByte();
- keyAlgorithm = (PublicKeyAlgorithmTag) bcpgIn.ReadByte();
- hashAlgorithm = (HashAlgorithmTag) bcpgIn.ReadByte();
-
- int hashedLength = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
- byte[] hashed = new byte[hashedLength];
-
- bcpgIn.ReadFully(hashed);
-
- //
- // read the signature sub packet data.
- //
- SignatureSubpacketsParser sIn = new SignatureSubpacketsParser(
- new MemoryStream(hashed, false));
-
- IList v = Platform.CreateArrayList();
- SignatureSubpacket sub;
- while ((sub = sIn.ReadPacket()) != null)
- {
- v.Add(sub);
- }
-
- hashedData = new SignatureSubpacket[v.Count];
-
- for (int i = 0; i != hashedData.Length; i++)
- {
- SignatureSubpacket p = (SignatureSubpacket)v[i];
- if (p is IssuerKeyId)
- {
- keyId = ((IssuerKeyId)p).KeyId;
- }
- else if (p is SignatureCreationTime)
- {
- creationTime = DateTimeUtilities.DateTimeToUnixMs(
- ((SignatureCreationTime)p).GetTime());
- }
-
- hashedData[i] = p;
- }
-
- int unhashedLength = (bcpgIn.ReadByte() << 8) | bcpgIn.ReadByte();
- byte[] unhashed = new byte[unhashedLength];
-
- bcpgIn.ReadFully(unhashed);
-
- sIn = new SignatureSubpacketsParser(new MemoryStream(unhashed, false));
-
- v.Clear();
-
- while ((sub = sIn.ReadPacket()) != null)
- {
- v.Add(sub);
- }
-
- unhashedData = new SignatureSubpacket[v.Count];
-
- for (int i = 0; i != unhashedData.Length; i++)
- {
- SignatureSubpacket p = (SignatureSubpacket)v[i];
- if (p is IssuerKeyId)
- {
- keyId = ((IssuerKeyId)p).KeyId;
- }
-
- unhashedData[i] = p;
- }
- }
- else
- {
- throw new Exception("unsupported version: " + version);
- }
-
- fingerprint = new byte[2];
- bcpgIn.ReadFully(fingerprint);
-
- switch (keyAlgorithm)
- {
- case PublicKeyAlgorithmTag.RsaGeneral:
- case PublicKeyAlgorithmTag.RsaSign:
- MPInteger v = new MPInteger(bcpgIn);
- signature = new MPInteger[]{ v };
- break;
- case PublicKeyAlgorithmTag.Dsa:
- MPInteger r = new MPInteger(bcpgIn);
- MPInteger s = new MPInteger(bcpgIn);
- signature = new MPInteger[]{ r, s };
- break;
- case PublicKeyAlgorithmTag.ElGamalEncrypt: // yep, this really does happen sometimes.
- case PublicKeyAlgorithmTag.ElGamalGeneral:
- MPInteger p = new MPInteger(bcpgIn);
- MPInteger g = new MPInteger(bcpgIn);
- MPInteger y = new MPInteger(bcpgIn);
- signature = new MPInteger[]{ p, g, y };
- break;
- case PublicKeyAlgorithmTag.ECDsa:
- MPInteger ecR = new MPInteger(bcpgIn);
- MPInteger ecS = new MPInteger(bcpgIn);
- signature = new MPInteger[]{ ecR, ecS };
- break;
- default:
- if (keyAlgorithm >= PublicKeyAlgorithmTag.Experimental_1 && keyAlgorithm <= PublicKeyAlgorithmTag.Experimental_11)
- {
- signature = null;
- MemoryStream bOut = new MemoryStream();
- int ch;
- while ((ch = bcpgIn.ReadByte()) >= 0)
- {
- bOut.WriteByte((byte) ch);
- }
- signatureEncoding = bOut.ToArray();
- }
- else
- {
- throw new IOException("unknown signature key algorithm: " + keyAlgorithm);
- }
- break;
- }
- }
-
- /**
- * Generate a version 4 signature packet.
- *
- * @param signatureType
- * @param keyAlgorithm
- * @param hashAlgorithm
- * @param hashedData
- * @param unhashedData
- * @param fingerprint
- * @param signature
- */
- public SignaturePacket(
- int signatureType,
- long keyId,
- PublicKeyAlgorithmTag keyAlgorithm,
- HashAlgorithmTag hashAlgorithm,
- SignatureSubpacket[] hashedData,
- SignatureSubpacket[] unhashedData,
- byte[] fingerprint,
- MPInteger[] signature)
- : this(4, signatureType, keyId, keyAlgorithm, hashAlgorithm, hashedData, unhashedData, fingerprint, signature)
- {
- }
-
- /**
- * Generate a version 2/3 signature packet.
- *
- * @param signatureType
- * @param keyAlgorithm
- * @param hashAlgorithm
- * @param fingerprint
- * @param signature
- */
- public SignaturePacket(
- int version,
- int signatureType,
- long keyId,
- PublicKeyAlgorithmTag keyAlgorithm,
- HashAlgorithmTag hashAlgorithm,
- long creationTime,
- byte[] fingerprint,
- MPInteger[] signature)
- : this(version, signatureType, keyId, keyAlgorithm, hashAlgorithm, null, null, fingerprint, signature)
- {
- this.creationTime = creationTime;
- }
-
- public SignaturePacket(
- int version,
- int signatureType,
- long keyId,
- PublicKeyAlgorithmTag keyAlgorithm,
- HashAlgorithmTag hashAlgorithm,
- SignatureSubpacket[] hashedData,
- SignatureSubpacket[] unhashedData,
- byte[] fingerprint,
- MPInteger[] signature)
- {
- this.version = version;
- this.signatureType = signatureType;
- this.keyId = keyId;
- this.keyAlgorithm = keyAlgorithm;
- this.hashAlgorithm = hashAlgorithm;
- this.hashedData = hashedData;
- this.unhashedData = unhashedData;
- this.fingerprint = fingerprint;
- this.signature = signature;
-
- if (hashedData != null)
- {
- setCreationTime();
- }
- }
-
- public int Version
- {
- get { return version; }
- }
-
- public int SignatureType
- {
- get { return signatureType; }
- }
-
- /**
- * return the keyId
- * @return the keyId that created the signature.
- */
- public long KeyId
- {
- get { return keyId; }
- }
-
- /**
- * return the signature trailer that must be included with the data
- * to reconstruct the signature
- *
- * @return byte[]
- */
- public byte[] GetSignatureTrailer()
- {
- byte[] trailer = null;
-
- if (version == 3)
- {
- trailer = new byte[5];
-
- long time = creationTime / 1000L;
-
- trailer[0] = (byte)signatureType;
- trailer[1] = (byte)(time >> 24);
- trailer[2] = (byte)(time >> 16);
- trailer[3] = (byte)(time >> 8);
- trailer[4] = (byte)(time);
- }
- else
- {
- MemoryStream sOut = new MemoryStream();
-
- sOut.WriteByte((byte)this.Version);
- sOut.WriteByte((byte)this.SignatureType);
- sOut.WriteByte((byte)this.KeyAlgorithm);
- sOut.WriteByte((byte)this.HashAlgorithm);
-
- MemoryStream hOut = new MemoryStream();
- SignatureSubpacket[] hashed = this.GetHashedSubPackets();
-
- for (int i = 0; i != hashed.Length; i++)
- {
- hashed[i].Encode(hOut);
- }
-
- byte[] data = hOut.ToArray();
-
- sOut.WriteByte((byte)(data.Length >> 8));
- sOut.WriteByte((byte)data.Length);
- sOut.Write(data, 0, data.Length);
-
- byte[] hData = sOut.ToArray();
-
- sOut.WriteByte((byte)this.Version);
- sOut.WriteByte((byte)0xff);
- sOut.WriteByte((byte)(hData.Length>> 24));
- sOut.WriteByte((byte)(hData.Length >> 16));
- sOut.WriteByte((byte)(hData.Length >> 8));
- sOut.WriteByte((byte)(hData.Length));
-
- trailer = sOut.ToArray();
- }
-
- return trailer;
- }
-
- public PublicKeyAlgorithmTag KeyAlgorithm
- {
- get { return keyAlgorithm; }
- }
-
- public HashAlgorithmTag HashAlgorithm
- {
- get { return hashAlgorithm; }
- }
-
- /**
- * return the signature as a set of integers - note this is normalised to be the
- * ASN.1 encoding of what appears in the signature packet.
- */
- public MPInteger[] GetSignature()
- {
- return signature;
- }
-
- /**
- * Return the byte encoding of the signature section.
- * @return uninterpreted signature bytes.
- */
- public byte[] GetSignatureBytes()
- {
- if (signatureEncoding != null)
- {
- return (byte[]) signatureEncoding.Clone();
- }
-
- MemoryStream bOut = new MemoryStream();
- BcpgOutputStream bcOut = new BcpgOutputStream(bOut);
-
- foreach (MPInteger sigObj in signature)
- {
- try
- {
- bcOut.WriteObject(sigObj);
- }
- catch (IOException e)
- {
- throw new Exception("internal error: " + e);
- }
- }
-
- return bOut.ToArray();
- }
-
- public SignatureSubpacket[] GetHashedSubPackets()
- {
- return hashedData;
- }
-
- public SignatureSubpacket[] GetUnhashedSubPackets()
- {
- return unhashedData;
- }
-
- /// Return the creation time in milliseconds since 1 Jan., 1970 UTC.
- public long CreationTime
- {
- get { return creationTime; }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- MemoryStream bOut = new MemoryStream();
- BcpgOutputStream pOut = new BcpgOutputStream(bOut);
-
- pOut.WriteByte((byte) version);
-
- if (version == 3 || version == 2)
- {
- pOut.Write(
- 5, // the length of the next block
- (byte) signatureType);
-
- pOut.WriteInt((int)(creationTime / 1000L));
-
- pOut.WriteLong(keyId);
-
- pOut.Write(
- (byte) keyAlgorithm,
- (byte) hashAlgorithm);
- }
- else if (version == 4)
- {
- pOut.Write(
- (byte) signatureType,
- (byte) keyAlgorithm,
- (byte) hashAlgorithm);
-
- EncodeLengthAndData(pOut, GetEncodedSubpackets(hashedData));
-
- EncodeLengthAndData(pOut, GetEncodedSubpackets(unhashedData));
- }
- else
- {
- throw new IOException("unknown version: " + version);
- }
-
- pOut.Write(fingerprint);
-
- if (signature != null)
- {
- pOut.WriteObjects(signature);
- }
- else
- {
- pOut.Write(signatureEncoding);
- }
-
- bcpgOut.WritePacket(PacketTag.Signature, bOut.ToArray(), true);
- }
-
- private static void EncodeLengthAndData(
- BcpgOutputStream pOut,
- byte[] data)
- {
- pOut.WriteShort((short) data.Length);
- pOut.Write(data);
- }
-
- private static byte[] GetEncodedSubpackets(
- SignatureSubpacket[] ps)
- {
- MemoryStream sOut = new MemoryStream();
-
- foreach (SignatureSubpacket p in ps)
- {
- p.Encode(sOut);
- }
-
- return sOut.ToArray();
- }
-
- private void setCreationTime()
- {
- foreach (SignatureSubpacket p in hashedData)
- {
- if (p is SignatureCreationTime)
- {
- creationTime = DateTimeUtilities.DateTimeToUnixMs(
- ((SignatureCreationTime)p).GetTime());
- break;
- }
- }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/SignatureSubpacket.cs b/BCCrypto/src/bcpg/SignatureSubpacket.cs
deleted file mode 100644
index d993155..0000000
--- a/BCCrypto/src/bcpg/SignatureSubpacket.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic type for a PGP Signature sub-packet.
- public class SignatureSubpacket
- {
- private readonly SignatureSubpacketTag type;
- private readonly bool critical;
- private readonly bool isLongLength;
- internal byte[] data;
-
- protected internal SignatureSubpacket(
- SignatureSubpacketTag type,
- bool critical,
- bool isLongLength,
- byte[] data)
- {
- this.type = type;
- this.critical = critical;
- this.isLongLength = isLongLength;
- this.data = data;
- }
-
- public SignatureSubpacketTag SubpacketType
- {
- get { return type; }
- }
-
- public bool IsCritical()
- {
- return critical;
- }
-
- public bool IsLongLength()
- {
- return isLongLength;
- }
-
- /// Return the generic data making up the packet.
- public byte[] GetData()
- {
- return (byte[]) data.Clone();
- }
-
- public void Encode(
- Stream os)
- {
- int bodyLen = data.Length + 1;
-
- if (isLongLength)
- {
- os.WriteByte(0xff);
- os.WriteByte((byte)(bodyLen >> 24));
- os.WriteByte((byte)(bodyLen >> 16));
- os.WriteByte((byte)(bodyLen >> 8));
- os.WriteByte((byte)bodyLen);
- }
- else
- {
- if (bodyLen < 192)
- {
- os.WriteByte((byte)bodyLen);
- }
- else if (bodyLen <= 8383)
- {
- bodyLen -= 192;
-
- os.WriteByte((byte)(((bodyLen >> 8) & 0xff) + 192));
- os.WriteByte((byte)bodyLen);
- }
- else
- {
- os.WriteByte(0xff);
- os.WriteByte((byte)(bodyLen >> 24));
- os.WriteByte((byte)(bodyLen >> 16));
- os.WriteByte((byte)(bodyLen >> 8));
- os.WriteByte((byte)bodyLen);
- }
- }
-
- if (critical)
- {
- os.WriteByte((byte)(0x80 | (int) type));
- }
- else
- {
- os.WriteByte((byte) type);
- }
-
- os.Write(data, 0, data.Length);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/SignatureSubpacketTags.cs b/BCCrypto/src/bcpg/SignatureSubpacketTags.cs
deleted file mode 100644
index 1a8e254..0000000
--- a/BCCrypto/src/bcpg/SignatureSubpacketTags.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-namespace Org.BouncyCastle.Bcpg
-{
- /**
- * Basic PGP signature sub-packet tag types.
- */
- public enum SignatureSubpacketTag
- {
- CreationTime = 2, // signature creation time
- ExpireTime = 3, // signature expiration time
- Exportable = 4, // exportable certification
- TrustSig = 5, // trust signature
- RegExp = 6, // regular expression
- Revocable = 7, // revocable
- KeyExpireTime = 9, // key expiration time
- Placeholder = 10, // placeholder for backward compatibility
- PreferredSymmetricAlgorithms = 11, // preferred symmetric algorithms
- RevocationKey = 12, // revocation key
- IssuerKeyId = 16, // issuer key ID
- NotationData = 20, // notation data
- PreferredHashAlgorithms = 21, // preferred hash algorithms
- PreferredCompressionAlgorithms = 22, // preferred compression algorithms
- KeyServerPreferences = 23, // key server preferences
- PreferredKeyServer = 24, // preferred key server
- PrimaryUserId = 25, // primary user id
- PolicyUrl = 26, // policy URL
- KeyFlags = 27, // key flags
- SignerUserId = 28, // signer's user id
- RevocationReason = 29, // reason for revocation
- Features = 30, // features
- SignatureTarget = 31, // signature target
- EmbeddedSignature = 32 // embedded signature
- }
-}
diff --git a/BCCrypto/src/bcpg/SignatureSubpacketsReader.cs b/BCCrypto/src/bcpg/SignatureSubpacketsReader.cs
deleted file mode 100644
index 80bedb0..0000000
--- a/BCCrypto/src/bcpg/SignatureSubpacketsReader.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Bcpg.Sig;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /**
- * reader for signature sub-packets
- */
- public class SignatureSubpacketsParser
- {
- private readonly Stream input;
-
- public SignatureSubpacketsParser(
- Stream input)
- {
- this.input = input;
- }
-
- public SignatureSubpacket ReadPacket()
- {
- int l = input.ReadByte();
- if (l < 0)
- return null;
-
- int bodyLen = 0;
- bool isLongLength = false;
-
- if (l < 192)
- {
- bodyLen = l;
- }
- else if (l <= 223)
- {
- bodyLen = ((l - 192) << 8) + (input.ReadByte()) + 192;
- }
- else if (l == 255)
- {
- isLongLength = true;
- bodyLen = (input.ReadByte() << 24) | (input.ReadByte() << 16)
- | (input.ReadByte() << 8) | input.ReadByte();
- }
- else
- {
- throw new IOException("unexpected length header");
- }
-
- int tag = input.ReadByte();
- if (tag < 0)
- throw new EndOfStreamException("unexpected EOF reading signature sub packet");
-
- byte[] data = new byte[bodyLen - 1];
-
- //
- // this may seem a bit strange but it turns out some applications miscode the length
- // in fixed length fields, so we check the length we do get, only throwing an exception if
- // we really cannot continue
- //
- int bytesRead = Streams.ReadFully(input, data);
-
- bool isCritical = ((tag & 0x80) != 0);
- SignatureSubpacketTag type = (SignatureSubpacketTag)(tag & 0x7f);
-
- if (bytesRead != data.Length)
- {
- switch (type)
- {
- case SignatureSubpacketTag.CreationTime:
- data = CheckData(data, 4, bytesRead, "Signature Creation Time");
- break;
- case SignatureSubpacketTag.IssuerKeyId:
- data = CheckData(data, 8, bytesRead, "Issuer");
- break;
- case SignatureSubpacketTag.KeyExpireTime:
- data = CheckData(data, 4, bytesRead, "Signature Key Expiration Time");
- break;
- case SignatureSubpacketTag.ExpireTime:
- data = CheckData(data, 4, bytesRead, "Signature Expiration Time");
- break;
- default:
- throw new EndOfStreamException("truncated subpacket data.");
- }
- }
-
- switch (type)
- {
- case SignatureSubpacketTag.CreationTime:
- return new SignatureCreationTime(isCritical, isLongLength, data);
- case SignatureSubpacketTag.KeyExpireTime:
- return new KeyExpirationTime(isCritical, isLongLength, data);
- case SignatureSubpacketTag.ExpireTime:
- return new SignatureExpirationTime(isCritical, isLongLength, data);
- case SignatureSubpacketTag.Revocable:
- return new Revocable(isCritical, isLongLength, data);
- case SignatureSubpacketTag.Exportable:
- return new Exportable(isCritical, isLongLength, data);
- case SignatureSubpacketTag.IssuerKeyId:
- return new IssuerKeyId(isCritical, isLongLength, data);
- case SignatureSubpacketTag.TrustSig:
- return new TrustSignature(isCritical, isLongLength, data);
- case SignatureSubpacketTag.PreferredCompressionAlgorithms:
- case SignatureSubpacketTag.PreferredHashAlgorithms:
- case SignatureSubpacketTag.PreferredSymmetricAlgorithms:
- return new PreferredAlgorithms(type, isCritical, isLongLength, data);
- case SignatureSubpacketTag.KeyFlags:
- return new KeyFlags(isCritical, isLongLength, data);
- case SignatureSubpacketTag.PrimaryUserId:
- return new PrimaryUserId(isCritical, isLongLength, data);
- case SignatureSubpacketTag.SignerUserId:
- return new SignerUserId(isCritical, isLongLength, data);
- case SignatureSubpacketTag.NotationData:
- return new NotationData(isCritical, isLongLength, data);
- }
- return new SignatureSubpacket(type, isCritical, isLongLength, data);
- }
-
- private byte[] CheckData(byte[] data, int expected, int bytesRead, string name)
- {
- if (bytesRead != expected)
- throw new EndOfStreamException("truncated " + name + " subpacket data.");
-
- return Arrays.CopyOfRange(data, 0, expected);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/SymmetricEncDataPacket.cs b/BCCrypto/src/bcpg/SymmetricEncDataPacket.cs
deleted file mode 100644
index 17ee55b..0000000
--- a/BCCrypto/src/bcpg/SymmetricEncDataPacket.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic type for a symmetric key encrypted packet.
- public class SymmetricEncDataPacket
- : InputStreamPacket
- {
- public SymmetricEncDataPacket(
- BcpgInputStream bcpgIn)
- : base(bcpgIn)
- {
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/SymmetricEncIntegrityPacket.cs b/BCCrypto/src/bcpg/SymmetricEncIntegrityPacket.cs
deleted file mode 100644
index a9b6d06..0000000
--- a/BCCrypto/src/bcpg/SymmetricEncIntegrityPacket.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- public class SymmetricEncIntegrityPacket
- : InputStreamPacket
- {
- internal readonly int version;
-
- internal SymmetricEncIntegrityPacket(
- BcpgInputStream bcpgIn)
- : base(bcpgIn)
- {
- version = bcpgIn.ReadByte();
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/SymmetricKeyAlgorithmTags.cs b/BCCrypto/src/bcpg/SymmetricKeyAlgorithmTags.cs
deleted file mode 100644
index e05a486..0000000
--- a/BCCrypto/src/bcpg/SymmetricKeyAlgorithmTags.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-namespace Org.BouncyCastle.Bcpg
-{
- /**
- * Basic tags for symmetric key algorithms
- */
- public enum SymmetricKeyAlgorithmTag
- {
- Null = 0, // Plaintext or unencrypted data
- Idea = 1, // IDEA [IDEA]
- TripleDes = 2, // Triple-DES (DES-EDE, as per spec -168 bit key derived from 192)
- Cast5 = 3, // Cast5 (128 bit key, as per RFC 2144)
- Blowfish = 4, // Blowfish (128 bit key, 16 rounds) [Blowfish]
- Safer = 5, // Safer-SK128 (13 rounds) [Safer]
- Des = 6, // Reserved for DES/SK
- Aes128 = 7, // Reserved for AES with 128-bit key
- Aes192 = 8, // Reserved for AES with 192-bit key
- Aes256 = 9, // Reserved for AES with 256-bit key
- Twofish = 10, // Reserved for Twofish
- Camellia128 = 11, // Reserved for AES with 128-bit key
- Camellia192 = 12, // Reserved for AES with 192-bit key
- Camellia256 = 13 // Reserved for AES with 256-bit key
- }
-}
diff --git a/BCCrypto/src/bcpg/SymmetricKeyEncSessionPacket.cs b/BCCrypto/src/bcpg/SymmetricKeyEncSessionPacket.cs
deleted file mode 100644
index 0381fa3..0000000
--- a/BCCrypto/src/bcpg/SymmetricKeyEncSessionPacket.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /**
- * Basic type for a symmetric encrypted session key packet
- */
- public class SymmetricKeyEncSessionPacket
- : ContainedPacket
- {
- private int version;
- private SymmetricKeyAlgorithmTag encAlgorithm;
- private S2k s2k;
- private readonly byte[] secKeyData;
-
- public SymmetricKeyEncSessionPacket(
- BcpgInputStream bcpgIn)
- {
- version = bcpgIn.ReadByte();
- encAlgorithm = (SymmetricKeyAlgorithmTag) bcpgIn.ReadByte();
-
- s2k = new S2k(bcpgIn);
-
- secKeyData = bcpgIn.ReadAll();
- }
-
- public SymmetricKeyEncSessionPacket(
- SymmetricKeyAlgorithmTag encAlgorithm,
- S2k s2k,
- byte[] secKeyData)
- {
- this.version = 4;
- this.encAlgorithm = encAlgorithm;
- this.s2k = s2k;
- this.secKeyData = secKeyData;
- }
-
- /**
- * @return int
- */
- public SymmetricKeyAlgorithmTag EncAlgorithm
- {
- get { return encAlgorithm; }
- }
-
- /**
- * @return S2k
- */
- public S2k S2k
- {
- get { return s2k; }
- }
-
- /**
- * @return byte[]
- */
- public byte[] GetSecKeyData()
- {
- return secKeyData;
- }
-
- /**
- * @return int
- */
- public int Version
- {
- get { return version; }
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- MemoryStream bOut = new MemoryStream();
- BcpgOutputStream pOut = new BcpgOutputStream(bOut);
-
- pOut.Write(
- (byte) version,
- (byte) encAlgorithm);
-
- pOut.WriteObject(s2k);
-
- if (secKeyData != null && secKeyData.Length > 0)
- {
- pOut.Write(secKeyData);
- }
-
- bcpgOut.WritePacket(PacketTag.SymmetricKeyEncryptedSessionKey, bOut.ToArray(), true);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/TrustPacket.cs b/BCCrypto/src/bcpg/TrustPacket.cs
deleted file mode 100644
index 6f1969c..0000000
--- a/BCCrypto/src/bcpg/TrustPacket.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /// Basic type for a trust packet.
- public class TrustPacket
- : ContainedPacket
- {
- private readonly byte[] levelAndTrustAmount;
-
- public TrustPacket(
- BcpgInputStream bcpgIn)
- {
- MemoryStream bOut = new MemoryStream();
-
- int ch;
- while ((ch = bcpgIn.ReadByte()) >= 0)
- {
- bOut.WriteByte((byte) ch);
- }
-
- levelAndTrustAmount = bOut.ToArray();
- }
-
- public TrustPacket(
- int trustCode)
- {
- this.levelAndTrustAmount = new byte[]{ (byte) trustCode };
- }
-
- public byte[] GetLevelAndTrustAmount()
- {
- return (byte[]) levelAndTrustAmount.Clone();
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WritePacket(PacketTag.Trust, levelAndTrustAmount, true);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/UserAttributePacket.cs b/BCCrypto/src/bcpg/UserAttributePacket.cs
deleted file mode 100644
index 20e3598..0000000
--- a/BCCrypto/src/bcpg/UserAttributePacket.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /**
- * Basic type for a user attribute packet.
- */
- public class UserAttributePacket
- : ContainedPacket
- {
- private readonly UserAttributeSubpacket[] subpackets;
-
- public UserAttributePacket(
- BcpgInputStream bcpgIn)
- {
- UserAttributeSubpacketsParser sIn = new UserAttributeSubpacketsParser(bcpgIn);
- UserAttributeSubpacket sub;
-
- IList v = Platform.CreateArrayList();
- while ((sub = sIn.ReadPacket()) != null)
- {
- v.Add(sub);
- }
-
- subpackets = new UserAttributeSubpacket[v.Count];
-
- for (int i = 0; i != subpackets.Length; i++)
- {
- subpackets[i] = (UserAttributeSubpacket)v[i];
- }
- }
-
- public UserAttributePacket(
- UserAttributeSubpacket[] subpackets)
- {
- this.subpackets = subpackets;
- }
-
- public UserAttributeSubpacket[] GetSubpackets()
- {
- return subpackets;
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- MemoryStream bOut = new MemoryStream();
-
- for (int i = 0; i != subpackets.Length; i++)
- {
- subpackets[i].Encode(bOut);
- }
-
- bcpgOut.WritePacket(PacketTag.UserAttribute, bOut.ToArray(), false);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/UserAttributeSubpacket.cs b/BCCrypto/src/bcpg/UserAttributeSubpacket.cs
deleted file mode 100644
index 05f60ac..0000000
--- a/BCCrypto/src/bcpg/UserAttributeSubpacket.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /**
- * Basic type for a user attribute sub-packet.
- */
- public class UserAttributeSubpacket
- {
- internal readonly UserAttributeSubpacketTag type;
- private readonly bool longLength; // we preserve this as not everyone encodes length properly.
- protected readonly byte[] data;
-
- protected internal UserAttributeSubpacket(UserAttributeSubpacketTag type, byte[] data)
- : this(type, false, data)
- {
- }
-
- protected internal UserAttributeSubpacket(UserAttributeSubpacketTag type, bool forceLongLength, byte[] data)
- {
- this.type = type;
- this.longLength = forceLongLength;
- this.data = data;
- }
-
- public virtual UserAttributeSubpacketTag SubpacketType
- {
- get { return type; }
- }
-
- /**
- * return the generic data making up the packet.
- */
- public virtual byte[] GetData()
- {
- return data;
- }
-
- public virtual void Encode(Stream os)
- {
- int bodyLen = data.Length + 1;
-
- if (bodyLen < 192 && !longLength)
- {
- os.WriteByte((byte)bodyLen);
- }
- else if (bodyLen <= 8383 && !longLength)
- {
- bodyLen -= 192;
-
- os.WriteByte((byte)(((bodyLen >> 8) & 0xff) + 192));
- os.WriteByte((byte)bodyLen);
- }
- else
- {
- os.WriteByte(0xff);
- os.WriteByte((byte)(bodyLen >> 24));
- os.WriteByte((byte)(bodyLen >> 16));
- os.WriteByte((byte)(bodyLen >> 8));
- os.WriteByte((byte)bodyLen);
- }
-
- os.WriteByte((byte) type);
- os.Write(data, 0, data.Length);
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- UserAttributeSubpacket other = obj as UserAttributeSubpacket;
-
- if (other == null)
- return false;
-
- return type == other.type
- && Arrays.AreEqual(data, other.data);
- }
-
- public override int GetHashCode()
- {
- return type.GetHashCode() ^ Arrays.GetHashCode(data);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/UserAttributeSubpacketTags.cs b/BCCrypto/src/bcpg/UserAttributeSubpacketTags.cs
deleted file mode 100644
index 7a9cd1d..0000000
--- a/BCCrypto/src/bcpg/UserAttributeSubpacketTags.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace Org.BouncyCastle.Bcpg
-{
- /**
- * Basic PGP user attribute sub-packet tag types.
- */
- public enum UserAttributeSubpacketTag
- {
- ImageAttribute = 1
- }
-}
diff --git a/BCCrypto/src/bcpg/UserAttributeSubpacketsReader.cs b/BCCrypto/src/bcpg/UserAttributeSubpacketsReader.cs
deleted file mode 100644
index f0cc1b8..0000000
--- a/BCCrypto/src/bcpg/UserAttributeSubpacketsReader.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using System;
-using System.IO;
-using Org.BouncyCastle.Bcpg.Attr;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /**
- * reader for user attribute sub-packets
- */
- public class UserAttributeSubpacketsParser
- {
- private readonly Stream input;
-
- public UserAttributeSubpacketsParser(
- Stream input)
- {
- this.input = input;
- }
-
- public virtual UserAttributeSubpacket ReadPacket()
- {
- int l = input.ReadByte();
- if (l < 0)
- return null;
-
- int bodyLen = 0;
- bool longLength = false;
- if (l < 192)
- {
- bodyLen = l;
- }
- else if (l <= 223)
- {
- bodyLen = ((l - 192) << 8) + (input.ReadByte()) + 192;
- }
- else if (l == 255)
- {
- bodyLen = (input.ReadByte() << 24) | (input.ReadByte() << 16)
- | (input.ReadByte() << 8) | input.ReadByte();
- longLength = true;
- }
- else
- {
- throw new IOException("unrecognised length reading user attribute sub packet");
- }
-
- int tag = input.ReadByte();
- if (tag < 0)
- throw new EndOfStreamException("unexpected EOF reading user attribute sub packet");
-
- byte[] data = new byte[bodyLen - 1];
- if (Streams.ReadFully(input, data) < data.Length)
- throw new EndOfStreamException();
-
- UserAttributeSubpacketTag type = (UserAttributeSubpacketTag) tag;
- switch (type)
- {
- case UserAttributeSubpacketTag.ImageAttribute:
- return new ImageAttrib(longLength, data);
- }
- return new UserAttributeSubpacket(type, longLength, data);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/UserIdPacket.cs b/BCCrypto/src/bcpg/UserIdPacket.cs
deleted file mode 100644
index a175e74..0000000
--- a/BCCrypto/src/bcpg/UserIdPacket.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-using System.Text;
-
-namespace Org.BouncyCastle.Bcpg
-{
- /**
- * Basic type for a user ID packet.
- */
- public class UserIdPacket
- : ContainedPacket
- {
- private readonly byte[] idData;
-
- public UserIdPacket(
- BcpgInputStream bcpgIn)
- {
- this.idData = bcpgIn.ReadAll();
- }
-
- public UserIdPacket(
- string id)
- {
- this.idData = Encoding.UTF8.GetBytes(id);
- }
-
- public string GetId()
- {
- return Encoding.UTF8.GetString(idData, 0, idData.Length);
- }
-
- public override void Encode(
- BcpgOutputStream bcpgOut)
- {
- bcpgOut.WritePacket(PacketTag.UserId, idData, true);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/attr/ImageAttrib.cs b/BCCrypto/src/bcpg/attr/ImageAttrib.cs
deleted file mode 100644
index 2d0fef8..0000000
--- a/BCCrypto/src/bcpg/attr/ImageAttrib.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Bcpg.Attr
-{
- /// Basic type for a image attribute packet.
- public class ImageAttrib
- : UserAttributeSubpacket
- {
- public enum Format : byte
- {
- Jpeg = 1
- }
-
- private static readonly byte[] Zeroes = new byte[12];
-
- private int hdrLength;
- private int _version;
- private int _encoding;
- private byte[] imageData;
-
- public ImageAttrib(byte[] data)
- : this(false, data)
- {
- }
-
- public ImageAttrib(bool forceLongLength, byte[] data)
- : base(UserAttributeSubpacketTag.ImageAttribute, forceLongLength, data)
- {
- hdrLength = ((data[1] & 0xff) << 8) | (data[0] & 0xff);
- _version = data[2] & 0xff;
- _encoding = data[3] & 0xff;
-
- imageData = new byte[data.Length - hdrLength];
- Array.Copy(data, hdrLength, imageData, 0, imageData.Length);
- }
-
- public ImageAttrib(
- Format imageType,
- byte[] imageData)
- : this(ToByteArray(imageType, imageData))
- {
- }
-
- private static byte[] ToByteArray(
- Format imageType,
- byte[] imageData)
- {
- MemoryStream bOut = new MemoryStream();
- bOut.WriteByte(0x10); bOut.WriteByte(0x00); bOut.WriteByte(0x01);
- bOut.WriteByte((byte) imageType);
- bOut.Write(Zeroes, 0, Zeroes.Length);
- bOut.Write(imageData, 0, imageData.Length);
- return bOut.ToArray();
- }
-
- public virtual int Version
- {
- get { return _version; }
- }
-
- public virtual int Encoding
- {
- get { return _encoding; }
- }
-
- public virtual byte[] GetImageData()
- {
- return imageData;
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/EmbeddedSignature.cs b/BCCrypto/src/bcpg/sig/EmbeddedSignature.cs
deleted file mode 100644
index fffdaef..0000000
--- a/BCCrypto/src/bcpg/sig/EmbeddedSignature.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * Packet embedded signature
- */
- public class EmbeddedSignature
- : SignatureSubpacket
- {
- public EmbeddedSignature(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.EmbeddedSignature, critical, isLongLength, data)
- {
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/Exportable.cs b/BCCrypto/src/bcpg/sig/Exportable.cs
deleted file mode 100644
index 4d03034..0000000
--- a/BCCrypto/src/bcpg/sig/Exportable.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * packet giving signature creation time.
- */
- public class Exportable
- : SignatureSubpacket
- {
- private static byte[] BooleanToByteArray(bool val)
- {
- byte[] data = new byte[1];
-
- if (val)
- {
- data[0] = 1;
- return data;
- }
- else
- {
- return data;
- }
- }
-
- public Exportable(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.Exportable, critical, isLongLength, data)
- {
- }
-
- public Exportable(
- bool critical,
- bool isExportable)
- : base(SignatureSubpacketTag.Exportable, critical, false, BooleanToByteArray(isExportable))
- {
- }
-
- public bool IsExportable()
- {
- return data[0] != 0;
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/Features.cs b/BCCrypto/src/bcpg/sig/Features.cs
deleted file mode 100644
index 2958423..0000000
--- a/BCCrypto/src/bcpg/sig/Features.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * packet giving signature expiration time.
- */
- public class Features
- : SignatureSubpacket
- {
- /** Identifier for the modification detection feature */
- public static readonly byte FEATURE_MODIFICATION_DETECTION = 1;
-
- private static byte[] FeatureToByteArray(byte feature)
- {
- return new byte[]{ feature };
- }
-
- public Features(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.Features, critical, isLongLength, data)
- {
- }
-
- public Features(bool critical, byte feature)
- : base(SignatureSubpacketTag.Features, critical, false, FeatureToByteArray(feature))
- {
- }
-
- /**
- * Returns if modification detection is supported.
- */
- public bool SupportsModificationDetection
- {
- get { return SupportsFeature(FEATURE_MODIFICATION_DETECTION); }
- }
-
- /**
- * Returns if a particular feature is supported.
- */
- public bool SupportsFeature(byte feature)
- {
- return Array.IndexOf(data, feature) >= 0;
- }
-
- /**
- * Sets support for a particular feature.
- */
- private void SetSupportsFeature(byte feature, bool support)
- {
- if (feature == 0)
- throw new ArgumentException("cannot be 0", "feature");
-
- int i = Array.IndexOf(data, feature);
- if ((i >= 0) == support)
- return;
-
- if (support)
- {
- data = Arrays.Append(data, feature);
- }
- else
- {
- byte[] temp = new byte[data.Length - 1];
- Array.Copy(data, 0, temp, 0, i);
- Array.Copy(data, i + 1, temp, i, temp.Length - i);
- data = temp;
- }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/IssuerKeyId.cs b/BCCrypto/src/bcpg/sig/IssuerKeyId.cs
deleted file mode 100644
index 627ea3e..0000000
--- a/BCCrypto/src/bcpg/sig/IssuerKeyId.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-using System;
-
-
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * packet giving signature creation time.
- */
- public class IssuerKeyId
- : SignatureSubpacket
- {
- protected static byte[] KeyIdToBytes(
- long keyId)
- {
- byte[] data = new byte[8];
-
- data[0] = (byte)(keyId >> 56);
- data[1] = (byte)(keyId >> 48);
- data[2] = (byte)(keyId >> 40);
- data[3] = (byte)(keyId >> 32);
- data[4] = (byte)(keyId >> 24);
- data[5] = (byte)(keyId >> 16);
- data[6] = (byte)(keyId >> 8);
- data[7] = (byte)keyId;
-
- return data;
- }
-
- public IssuerKeyId(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.IssuerKeyId, critical, isLongLength, data)
- {
- }
-
- public IssuerKeyId(
- bool critical,
- long keyId)
- : base(SignatureSubpacketTag.IssuerKeyId, critical, false, KeyIdToBytes(keyId))
- {
- }
-
- public long KeyId
- {
- get
- {
- long keyId = ((long)(data[0] & 0xff) << 56)
- | ((long)(data[1] & 0xff) << 48)
- | ((long)(data[2] & 0xff) << 40)
- | ((long)(data[3] & 0xff) << 32)
- | ((long)(data[4] & 0xff) << 24)
- | ((long)(data[5] & 0xff) << 16)
- | ((long)(data[6] & 0xff) << 8)
- | ((long)data[7] & 0xff);
-
- return keyId;
- }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/KeyExpirationTime.cs b/BCCrypto/src/bcpg/sig/KeyExpirationTime.cs
deleted file mode 100644
index dfd3e76..0000000
--- a/BCCrypto/src/bcpg/sig/KeyExpirationTime.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * packet giving time after creation at which the key expires.
- */
- public class KeyExpirationTime
- : SignatureSubpacket
- {
- protected static byte[] TimeToBytes(
- long t)
- {
- byte[] data = new byte[4];
-
- data[0] = (byte)(t >> 24);
- data[1] = (byte)(t >> 16);
- data[2] = (byte)(t >> 8);
- data[3] = (byte)t;
-
- return data;
- }
-
- public KeyExpirationTime(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.KeyExpireTime, critical, isLongLength, data)
- {
- }
-
- public KeyExpirationTime(
- bool critical,
- long seconds)
- : base(SignatureSubpacketTag.KeyExpireTime, critical, false, TimeToBytes(seconds))
- {
- }
-
- /**
- * Return the number of seconds after creation time a key is valid for.
- *
- * @return second count for key validity.
- */
- public long Time
- {
- get
- {
- long time = ((long)(data[0] & 0xff) << 24) | ((long)(data[1] & 0xff) << 16)
- | ((long)(data[2] & 0xff) << 8) | ((long)data[3] & 0xff);
-
- return time;
- }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/KeyFlags.cs b/BCCrypto/src/bcpg/sig/KeyFlags.cs
deleted file mode 100644
index 5b5d85a..0000000
--- a/BCCrypto/src/bcpg/sig/KeyFlags.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * Packet holding the key flag values.
- */
- public class KeyFlags
- : SignatureSubpacket
- {
- public const int CertifyOther = 0x01;
- public const int SignData = 0x02;
- public const int EncryptComms = 0x04;
- public const int EncryptStorage = 0x08;
- public const int Split = 0x10;
- public const int Authentication = 0x20;
- public const int Shared = 0x80;
-
- private static byte[] IntToByteArray(
- int v)
- {
- byte[] tmp = new byte[4];
- int size = 0;
-
- for (int i = 0; i != 4; i++)
- {
- tmp[i] = (byte)(v >> (i * 8));
- if (tmp[i] != 0)
- {
- size = i;
- }
- }
-
- byte[] data = new byte[size + 1];
- Array.Copy(tmp, 0, data, 0, data.Length);
- return data;
- }
-
- public KeyFlags(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.KeyFlags, critical, isLongLength, data)
- {
- }
-
- public KeyFlags(
- bool critical,
- int flags)
- : base(SignatureSubpacketTag.KeyFlags, critical, false, IntToByteArray(flags))
- {
- }
-
- ///
- /// Return the flag values contained in the first 4 octets (note: at the moment
- /// the standard only uses the first one).
- ///
- public int Flags
- {
- get
- {
- int flags = 0;
-
- for (int i = 0; i != data.Length; i++)
- {
- flags |= (data[i] & 0xff) << (i * 8);
- }
-
- return flags;
- }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/NotationData.cs b/BCCrypto/src/bcpg/sig/NotationData.cs
deleted file mode 100644
index 9ac6f89..0000000
--- a/BCCrypto/src/bcpg/sig/NotationData.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-using System;
-using System.IO;
-using System.Text;
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * Class provided a NotationData object according to
- * RFC2440, Chapter 5.2.3.15. Notation Data
- */
- public class NotationData
- : SignatureSubpacket
- {
- public const int HeaderFlagLength = 4;
- public const int HeaderNameLength = 2;
- public const int HeaderValueLength = 2;
-
- public NotationData(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.NotationData, critical, isLongLength, data)
- {
- }
-
- public NotationData(
- bool critical,
- bool humanReadable,
- string notationName,
- string notationValue)
- : base(SignatureSubpacketTag.NotationData, critical, false,
- CreateData(humanReadable, notationName, notationValue))
- {
- }
-
- private static byte[] CreateData(
- bool humanReadable,
- string notationName,
- string notationValue)
- {
- MemoryStream os = new MemoryStream();
-
- // (4 octets of flags, 2 octets of name length (M),
- // 2 octets of value length (N),
- // M octets of name data,
- // N octets of value data)
-
- // flags
- os.WriteByte(humanReadable ? (byte)0x80 : (byte)0x00);
- os.WriteByte(0x0);
- os.WriteByte(0x0);
- os.WriteByte(0x0);
-
- byte[] nameData, valueData = null;
- int nameLength, valueLength;
-
- nameData = Encoding.UTF8.GetBytes(notationName);
- nameLength = System.Math.Min(nameData.Length, 0xFF);
-
- valueData = Encoding.UTF8.GetBytes(notationValue);
- valueLength = System.Math.Min(valueData.Length, 0xFF);
-
- // name length
- os.WriteByte((byte)(nameLength >> 8));
- os.WriteByte((byte)(nameLength >> 0));
-
- // value length
- os.WriteByte((byte)(valueLength >> 8));
- os.WriteByte((byte)(valueLength >> 0));
-
- // name
- os.Write(nameData, 0, nameLength);
-
- // value
- os.Write(valueData, 0, valueLength);
-
- return os.ToArray();
- }
-
- public bool IsHumanReadable
- {
- get { return data[0] == (byte)0x80; }
- }
-
- public string GetNotationName()
- {
- int nameLength = ((data[HeaderFlagLength] << 8) + (data[HeaderFlagLength + 1] << 0));
- int namePos = HeaderFlagLength + HeaderNameLength + HeaderValueLength;
-
- return Encoding.UTF8.GetString(data, namePos, nameLength);
- }
-
- public string GetNotationValue()
- {
- int nameLength = ((data[HeaderFlagLength] << 8) + (data[HeaderFlagLength + 1] << 0));
- int valueLength = ((data[HeaderFlagLength + HeaderNameLength] << 8) + (data[HeaderFlagLength + HeaderNameLength + 1] << 0));
- int valuePos = HeaderFlagLength + HeaderNameLength + HeaderValueLength + nameLength;
-
- return Encoding.UTF8.GetString(data, valuePos, valueLength);
- }
-
- public byte[] GetNotationValueBytes()
- {
- int nameLength = ((data[HeaderFlagLength] << 8) + (data[HeaderFlagLength + 1] << 0));
- int valueLength = ((data[HeaderFlagLength + HeaderNameLength] << 8) + (data[HeaderFlagLength + HeaderNameLength + 1] << 0));
- int valuePos = HeaderFlagLength + HeaderNameLength + HeaderValueLength + nameLength;
-
- byte[] bytes = new byte[valueLength];
- Array.Copy(data, valuePos, bytes, 0, valueLength);
- return bytes;
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/PreferredAlgorithms.cs b/BCCrypto/src/bcpg/sig/PreferredAlgorithms.cs
deleted file mode 100644
index 9514bed..0000000
--- a/BCCrypto/src/bcpg/sig/PreferredAlgorithms.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * packet giving signature creation time.
- */
- public class PreferredAlgorithms
- : SignatureSubpacket
- {
- private static byte[] IntToByteArray(
- int[] v)
- {
- byte[] data = new byte[v.Length];
-
- for (int i = 0; i != v.Length; i++)
- {
- data[i] = (byte)v[i];
- }
-
- return data;
- }
-
- public PreferredAlgorithms(
- SignatureSubpacketTag type,
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(type, critical, isLongLength, data)
- {
- }
-
- public PreferredAlgorithms(
- SignatureSubpacketTag type,
- bool critical,
- int[] preferences)
- : base(type, critical, false, IntToByteArray(preferences))
- {
- }
-
- public int[] GetPreferences()
- {
- int[] v = new int[data.Length];
-
- for (int i = 0; i != v.Length; i++)
- {
- v[i] = data[i] & 0xff;
- }
-
- return v;
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/PrimaryUserId.cs b/BCCrypto/src/bcpg/sig/PrimaryUserId.cs
deleted file mode 100644
index 1f16f40..0000000
--- a/BCCrypto/src/bcpg/sig/PrimaryUserId.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * packet giving whether or not the signature is signed using the primary user ID for the key.
- */
- public class PrimaryUserId
- : SignatureSubpacket
- {
- private static byte[] BooleanToByteArray(
- bool val)
- {
- byte[] data = new byte[1];
-
- if (val)
- {
- data[0] = 1;
- return data;
- }
- else
- {
- return data;
- }
- }
-
- public PrimaryUserId(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.PrimaryUserId, critical, isLongLength, data)
- {
- }
-
- public PrimaryUserId(
- bool critical,
- bool isPrimaryUserId)
- : base(SignatureSubpacketTag.PrimaryUserId, critical, false, BooleanToByteArray(isPrimaryUserId))
- {
- }
-
- public bool IsPrimaryUserId()
- {
- return data[0] != 0;
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/Revocable.cs b/BCCrypto/src/bcpg/sig/Revocable.cs
deleted file mode 100644
index 7aa9139..0000000
--- a/BCCrypto/src/bcpg/sig/Revocable.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * packet giving whether or not is revocable.
- */
- public class Revocable
- : SignatureSubpacket
- {
- private static byte[] BooleanToByteArray(
- bool value)
- {
- byte[] data = new byte[1];
-
- if (value)
- {
- data[0] = 1;
- return data;
- }
- else
- {
- return data;
- }
- }
-
- public Revocable(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.Revocable, critical, isLongLength, data)
- {
- }
-
- public Revocable(
- bool critical,
- bool isRevocable)
- : base(SignatureSubpacketTag.Revocable, critical, false, BooleanToByteArray(isRevocable))
- {
- }
-
- public bool IsRevocable()
- {
- return data[0] != 0;
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/RevocationKey.cs b/BCCrypto/src/bcpg/sig/RevocationKey.cs
deleted file mode 100644
index 11467d2..0000000
--- a/BCCrypto/src/bcpg/sig/RevocationKey.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using System;
-using System.Text;
-
-namespace Org.BouncyCastle.Bcpg
-{
- ///
- /// Represents revocation key OpenPGP signature sub packet.
- ///
- public class RevocationKey
- : SignatureSubpacket
- {
- // 1 octet of class,
- // 1 octet of public-key algorithm ID,
- // 20 octets of fingerprint
- public RevocationKey(
- bool isCritical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.RevocationKey, isCritical, isLongLength, data)
- {
- }
-
- public RevocationKey(
- bool isCritical,
- RevocationKeyTag signatureClass,
- PublicKeyAlgorithmTag keyAlgorithm,
- byte[] fingerprint)
- : base(SignatureSubpacketTag.RevocationKey, isCritical, false,
- CreateData(signatureClass, keyAlgorithm, fingerprint))
- {
- }
-
- private static byte[] CreateData(
- RevocationKeyTag signatureClass,
- PublicKeyAlgorithmTag keyAlgorithm,
- byte[] fingerprint)
- {
- byte[] data = new byte[2 + fingerprint.Length];
- data[0] = (byte)signatureClass;
- data[1] = (byte)keyAlgorithm;
- Array.Copy(fingerprint, 0, data, 2, fingerprint.Length);
- return data;
- }
-
- public virtual RevocationKeyTag SignatureClass
- {
- get { return (RevocationKeyTag)this.GetData()[0]; }
- }
-
- public virtual PublicKeyAlgorithmTag Algorithm
- {
- get { return (PublicKeyAlgorithmTag)this.GetData()[1]; }
- }
-
- public virtual byte[] GetFingerprint()
- {
- byte[] data = this.GetData();
- byte[] fingerprint = new byte[data.Length - 2];
- Array.Copy(data, 2, fingerprint, 0, fingerprint.Length);
- return fingerprint;
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/RevocationKeyTags.cs b/BCCrypto/src/bcpg/sig/RevocationKeyTags.cs
deleted file mode 100644
index d76d1dc..0000000
--- a/BCCrypto/src/bcpg/sig/RevocationKeyTags.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace Org.BouncyCastle.Bcpg
-{
- public enum RevocationKeyTag
- : byte
- {
- ClassDefault = 0x80,
- ClassSensitive = 0x40
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/RevocationReason.cs b/BCCrypto/src/bcpg/sig/RevocationReason.cs
deleted file mode 100644
index 42afd5f..0000000
--- a/BCCrypto/src/bcpg/sig/RevocationReason.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg
-{
- ///
- /// Represents revocation reason OpenPGP signature sub packet.
- ///
- public class RevocationReason
- : SignatureSubpacket
- {
- public RevocationReason(bool isCritical, bool isLongLength, byte[] data)
- : base(SignatureSubpacketTag.RevocationReason, isCritical, isLongLength, data)
- {
- }
-
- public RevocationReason(
- bool isCritical,
- RevocationReasonTag reason,
- string description)
- : base(SignatureSubpacketTag.RevocationReason, isCritical, false, CreateData(reason, description))
- {
- }
-
- private static byte[] CreateData(
- RevocationReasonTag reason,
- string description)
- {
- byte[] descriptionBytes = Strings.ToUtf8ByteArray(description);
- byte[] data = new byte[1 + descriptionBytes.Length];
-
- data[0] = (byte)reason;
- Array.Copy(descriptionBytes, 0, data, 1, descriptionBytes.Length);
-
- return data;
- }
-
- public virtual RevocationReasonTag GetRevocationReason()
- {
- return (RevocationReasonTag)GetData()[0];
- }
-
- public virtual string GetRevocationDescription()
- {
- byte[] data = GetData();
- if (data.Length == 1)
- {
- return string.Empty;
- }
-
- byte[] description = new byte[data.Length - 1];
- Array.Copy(data, 1, description, 0, description.Length);
-
- return Strings.FromUtf8ByteArray(description);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/RevocationReasonTags.cs b/BCCrypto/src/bcpg/sig/RevocationReasonTags.cs
deleted file mode 100644
index 524a58c..0000000
--- a/BCCrypto/src/bcpg/sig/RevocationReasonTags.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace Org.BouncyCastle.Bcpg
-{
- public enum RevocationReasonTag
- : byte
- {
- NoReason = 0, // No reason specified (key revocations or cert revocations)
- KeySuperseded = 1, // Key is superseded (key revocations)
- KeyCompromised = 2, // Key material has been compromised (key revocations)
- KeyRetired = 3, // Key is retired and no longer used (key revocations)
- UserNoLongerValid = 32, // User ID information is no longer valid (cert revocations)
-
- // 100-110 - Private Use
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/SignatureCreationTime.cs b/BCCrypto/src/bcpg/sig/SignatureCreationTime.cs
deleted file mode 100644
index d172e5d..0000000
--- a/BCCrypto/src/bcpg/sig/SignatureCreationTime.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * packet giving signature creation time.
- */
- public class SignatureCreationTime
- : SignatureSubpacket
- {
- protected static byte[] TimeToBytes(
- DateTime time)
- {
- long t = DateTimeUtilities.DateTimeToUnixMs(time) / 1000L;
- byte[] data = new byte[4];
- data[0] = (byte)(t >> 24);
- data[1] = (byte)(t >> 16);
- data[2] = (byte)(t >> 8);
- data[3] = (byte)t;
- return data;
- }
-
- public SignatureCreationTime(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.CreationTime, critical, isLongLength, data)
- {
- }
-
- public SignatureCreationTime(
- bool critical,
- DateTime date)
- : base(SignatureSubpacketTag.CreationTime, critical, false, TimeToBytes(date))
- {
- }
-
- public DateTime GetTime()
- {
- long time = (long)(
- ((uint)data[0] << 24)
- | ((uint)data[1] << 16)
- | ((uint)data[2] << 8)
- | ((uint)data[3])
- );
- return DateTimeUtilities.UnixMsToDateTime(time * 1000L);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/SignatureExpirationTime.cs b/BCCrypto/src/bcpg/sig/SignatureExpirationTime.cs
deleted file mode 100644
index 24f0a9f..0000000
--- a/BCCrypto/src/bcpg/sig/SignatureExpirationTime.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * packet giving signature expiration time.
- */
- public class SignatureExpirationTime
- : SignatureSubpacket
- {
- protected static byte[] TimeToBytes(
- long t)
- {
- byte[] data = new byte[4];
- data[0] = (byte)(t >> 24);
- data[1] = (byte)(t >> 16);
- data[2] = (byte)(t >> 8);
- data[3] = (byte)t;
- return data;
- }
-
- public SignatureExpirationTime(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.ExpireTime, critical, isLongLength, data)
- {
- }
-
- public SignatureExpirationTime(
- bool critical,
- long seconds)
- : base(SignatureSubpacketTag.ExpireTime, critical, false, TimeToBytes(seconds))
- {
- }
-
- /**
- * return time in seconds before signature expires after creation time.
- */
- public long Time
- {
- get
- {
- long time = ((long)(data[0] & 0xff) << 24) | ((long)(data[1] & 0xff) << 16)
- | ((long)(data[2] & 0xff) << 8) | ((long)data[3] & 0xff);
-
- return time;
- }
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/SignerUserId.cs b/BCCrypto/src/bcpg/sig/SignerUserId.cs
deleted file mode 100644
index 8ab62ed..0000000
--- a/BCCrypto/src/bcpg/sig/SignerUserId.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-using System;
-
-
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * packet giving the User ID of the signer.
- */
- public class SignerUserId
- : SignatureSubpacket
- {
- private static byte[] UserIdToBytes(
- string id)
- {
- byte[] idData = new byte[id.Length];
-
- for (int i = 0; i != id.Length; i++)
- {
- idData[i] = (byte)id[i];
- }
-
- return idData;
- }
-
- public SignerUserId(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.SignerUserId, critical, isLongLength, data)
- {
- }
-
- public SignerUserId(
- bool critical,
- string userId)
- : base(SignatureSubpacketTag.SignerUserId, critical, false, UserIdToBytes(userId))
- {
- }
-
- public string GetId()
- {
- char[] chars = new char[data.Length];
-
- for (int i = 0; i != chars.Length; i++)
- {
- chars[i] = (char)(data[i] & 0xff);
- }
-
- return new string(chars);
- }
- }
-}
diff --git a/BCCrypto/src/bcpg/sig/TrustSignature.cs b/BCCrypto/src/bcpg/sig/TrustSignature.cs
deleted file mode 100644
index 9145882..0000000
--- a/BCCrypto/src/bcpg/sig/TrustSignature.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.Sig
-{
- /**
- * packet giving trust.
- */
- public class TrustSignature
- : SignatureSubpacket
- {
- private static byte[] IntToByteArray(
- int v1,
- int v2)
- {
- return new byte[]{ (byte)v1, (byte)v2 };
- }
-
- public TrustSignature(
- bool critical,
- bool isLongLength,
- byte[] data)
- : base(SignatureSubpacketTag.TrustSig, critical, isLongLength, data)
- {
- }
-
- public TrustSignature(
- bool critical,
- int depth,
- int trustAmount)
- : base(SignatureSubpacketTag.TrustSig, critical, false, IntToByteArray(depth, trustAmount))
- {
- }
-
- public int Depth
- {
- get { return data[0] & 0xff; }
- }
-
- public int TrustAmount
- {
- get { return data[1] & 0xff; }
- }
- }
-}
diff --git a/BCCrypto/src/cms/BaseDigestCalculator.cs b/BCCrypto/src/cms/BaseDigestCalculator.cs
deleted file mode 100644
index 3dcbca7..0000000
--- a/BCCrypto/src/cms/BaseDigestCalculator.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Cms
-{
- internal class BaseDigestCalculator
- : IDigestCalculator
- {
- private readonly byte[] digest;
-
- internal BaseDigestCalculator(
- byte[] digest)
- {
- this.digest = digest;
- }
-
- public byte[] GetDigest()
- {
- return Arrays.Clone(digest);
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSAttributeTableGenerationException.cs b/BCCrypto/src/cms/CMSAttributeTableGenerationException.cs
deleted file mode 100644
index 87dad99..0000000
--- a/BCCrypto/src/cms/CMSAttributeTableGenerationException.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Cms
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class CmsAttributeTableGenerationException
- : CmsException
- {
- public CmsAttributeTableGenerationException()
- {
- }
-
- public CmsAttributeTableGenerationException(
- string name)
- : base(name)
- {
- }
-
- public CmsAttributeTableGenerationException(
- string name,
- Exception e)
- : base(name, e)
- {
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSAttributeTableGenerator.cs b/BCCrypto/src/cms/CMSAttributeTableGenerator.cs
deleted file mode 100644
index 92c9a29..0000000
--- a/BCCrypto/src/cms/CMSAttributeTableGenerator.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.Cms;
-
-namespace Org.BouncyCastle.Cms
-{
- ///
- /// The 'Signature' parameter is only available when generating unsigned attributes.
- ///
- public enum CmsAttributeTableParameter
- {
-// const string ContentType = "contentType";
-// const string Digest = "digest";
-// const string Signature = "encryptedDigest";
-// const string DigestAlgorithmIdentifier = "digestAlgID";
-
- ContentType, Digest, Signature, DigestAlgorithmIdentifier
- }
-
- public interface CmsAttributeTableGenerator
- {
- AttributeTable GetAttributes(IDictionary parameters);
- }
-}
diff --git a/BCCrypto/src/cms/CMSAuthEnvelopedData.cs b/BCCrypto/src/cms/CMSAuthEnvelopedData.cs
deleted file mode 100644
index d35e946..0000000
--- a/BCCrypto/src/cms/CMSAuthEnvelopedData.cs
+++ /dev/null
@@ -1,112 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * containing class for an CMS AuthEnveloped Data object
- */
- internal class CmsAuthEnvelopedData
- {
- internal RecipientInformationStore recipientInfoStore;
- internal ContentInfo contentInfo;
-
- private OriginatorInfo originator;
- private AlgorithmIdentifier authEncAlg;
- private Asn1Set authAttrs;
- private byte[] mac;
- private Asn1Set unauthAttrs;
-
- public CmsAuthEnvelopedData(
- byte[] authEnvData)
- : this(CmsUtilities.ReadContentInfo(authEnvData))
- {
- }
-
- public CmsAuthEnvelopedData(
- Stream authEnvData)
- : this(CmsUtilities.ReadContentInfo(authEnvData))
- {
- }
-
- public CmsAuthEnvelopedData(
- ContentInfo contentInfo)
- {
- this.contentInfo = contentInfo;
-
- AuthEnvelopedData authEnvData = AuthEnvelopedData.GetInstance(contentInfo.Content);
-
- this.originator = authEnvData.OriginatorInfo;
-
- //
- // read the recipients
- //
- Asn1Set recipientInfos = authEnvData.RecipientInfos;
-
- //
- // read the auth-encrypted content info
- //
- EncryptedContentInfo authEncInfo = authEnvData.AuthEncryptedContentInfo;
- this.authEncAlg = authEncInfo.ContentEncryptionAlgorithm;
- CmsSecureReadable secureReadable = new AuthEnvelopedSecureReadable(this);
-
- //
- // build the RecipientInformationStore
- //
- this.recipientInfoStore = CmsEnvelopedHelper.BuildRecipientInformationStore(
- recipientInfos, secureReadable);
-
- // FIXME These need to be passed to the AEAD cipher as AAD (Additional Authenticated Data)
- this.authAttrs = authEnvData.AuthAttrs;
- this.mac = authEnvData.Mac.GetOctets();
- this.unauthAttrs = authEnvData.UnauthAttrs;
- }
-
- private class AuthEnvelopedSecureReadable : CmsSecureReadable
- {
- private readonly CmsAuthEnvelopedData parent;
-
- internal AuthEnvelopedSecureReadable(CmsAuthEnvelopedData parent)
- {
- this.parent = parent;
- }
-
- public AlgorithmIdentifier Algorithm
- {
- get { return parent.authEncAlg; }
- }
-
- public object CryptoObject
- {
- get { return null; }
- }
-
- public CmsReadable GetReadable(KeyParameter key)
- {
- // TODO Create AEAD cipher instance to decrypt and calculate tag ( MAC)
- throw new CmsException("AuthEnveloped data decryption not yet implemented");
-
-// RFC 5084 ASN.1 Module
-// -- Parameters for AlgorithmIdentifier
-//
-// CCMParameters ::= SEQUENCE {
-// aes-nonce OCTET STRING (SIZE(7..13)),
-// aes-ICVlen AES-CCM-ICVlen DEFAULT 12 }
-//
-// AES-CCM-ICVlen ::= INTEGER (4 | 6 | 8 | 10 | 12 | 14 | 16)
-//
-// GCMParameters ::= SEQUENCE {
-// aes-nonce OCTET STRING, -- recommended size is 12 octets
-// aes-ICVlen AES-GCM-ICVlen DEFAULT 12 }
-//
-// AES-GCM-ICVlen ::= INTEGER (12 | 13 | 14 | 15 | 16)
- }
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSAuthEnvelopedGenerator.cs b/BCCrypto/src/cms/CMSAuthEnvelopedGenerator.cs
deleted file mode 100644
index 4273cff..0000000
--- a/BCCrypto/src/cms/CMSAuthEnvelopedGenerator.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Nist;
-
-namespace Org.BouncyCastle.Cms
-{
- internal class CmsAuthEnvelopedGenerator
- {
- public static readonly string Aes128Ccm = NistObjectIdentifiers.IdAes128Ccm.Id;
- public static readonly string Aes192Ccm = NistObjectIdentifiers.IdAes192Ccm.Id;
- public static readonly string Aes256Ccm = NistObjectIdentifiers.IdAes256Ccm.Id;
- public static readonly string Aes128Gcm = NistObjectIdentifiers.IdAes128Gcm.Id;
- public static readonly string Aes192Gcm = NistObjectIdentifiers.IdAes192Gcm.Id;
- public static readonly string Aes256Gcm = NistObjectIdentifiers.IdAes256Gcm.Id;
- }
-}
diff --git a/BCCrypto/src/cms/CMSAuthenticatedData.cs b/BCCrypto/src/cms/CMSAuthenticatedData.cs
deleted file mode 100644
index 33b4cc2..0000000
--- a/BCCrypto/src/cms/CMSAuthenticatedData.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * containing class for an CMS Authenticated Data object
- */
- public class CmsAuthenticatedData
- {
- internal RecipientInformationStore recipientInfoStore;
- internal ContentInfo contentInfo;
-
- private AlgorithmIdentifier macAlg;
- private Asn1Set authAttrs;
- private Asn1Set unauthAttrs;
- private byte[] mac;
-
- public CmsAuthenticatedData(
- byte[] authData)
- : this(CmsUtilities.ReadContentInfo(authData))
- {
- }
-
- public CmsAuthenticatedData(
- Stream authData)
- : this(CmsUtilities.ReadContentInfo(authData))
- {
- }
-
- public CmsAuthenticatedData(
- ContentInfo contentInfo)
- {
- this.contentInfo = contentInfo;
-
- AuthenticatedData authData = AuthenticatedData.GetInstance(contentInfo.Content);
-
- //
- // read the recipients
- //
- Asn1Set recipientInfos = authData.RecipientInfos;
-
- this.macAlg = authData.MacAlgorithm;
-
- //
- // read the authenticated content info
- //
- ContentInfo encInfo = authData.EncapsulatedContentInfo;
- CmsReadable readable = new CmsProcessableByteArray(
- Asn1OctetString.GetInstance(encInfo.Content).GetOctets());
- CmsSecureReadable secureReadable = new CmsEnvelopedHelper.CmsAuthenticatedSecureReadable(
- this.macAlg, readable);
-
- //
- // build the RecipientInformationStore
- //
- this.recipientInfoStore = CmsEnvelopedHelper.BuildRecipientInformationStore(
- recipientInfos, secureReadable);
-
- this.authAttrs = authData.AuthAttrs;
- this.mac = authData.Mac.GetOctets();
- this.unauthAttrs = authData.UnauthAttrs;
- }
-
- public byte[] GetMac()
- {
- return Arrays.Clone(mac);
- }
-
- public AlgorithmIdentifier MacAlgorithmID
- {
- get { return macAlg; }
- }
-
- /**
- * return the object identifier for the content MAC algorithm.
- */
- public string MacAlgOid
- {
- get { return macAlg.Algorithm.Id; }
- }
-
- /**
- * return a store of the intended recipients for this message
- */
- public RecipientInformationStore GetRecipientInfos()
- {
- return recipientInfoStore;
- }
-
- /**
- * return the ContentInfo
- */
- public ContentInfo ContentInfo
- {
- get { return contentInfo; }
- }
-
- /**
- * return a table of the digested attributes indexed by
- * the OID of the attribute.
- */
- public Asn1.Cms.AttributeTable GetAuthAttrs()
- {
- if (authAttrs == null)
- return null;
-
- return new Asn1.Cms.AttributeTable(authAttrs);
- }
-
- /**
- * return a table of the undigested attributes indexed by
- * the OID of the attribute.
- */
- public Asn1.Cms.AttributeTable GetUnauthAttrs()
- {
- if (unauthAttrs == null)
- return null;
-
- return new Asn1.Cms.AttributeTable(unauthAttrs);
- }
-
- /**
- * return the ASN.1 encoded representation of this object.
- */
- public byte[] GetEncoded()
- {
- return contentInfo.GetEncoded();
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSAuthenticatedDataGenerator.cs b/BCCrypto/src/cms/CMSAuthenticatedDataGenerator.cs
deleted file mode 100644
index 131a475..0000000
--- a/BCCrypto/src/cms/CMSAuthenticatedDataGenerator.cs
+++ /dev/null
@@ -1,156 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * General class for generating a CMS authenticated-data message.
- *
- * A simple example of usage.
- *
- *
- * CMSAuthenticatedDataGenerator fact = new CMSAuthenticatedDataGenerator();
- *
- * fact.addKeyTransRecipient(cert);
- *
- * CMSAuthenticatedData data = fact.generate(content, algorithm, "BC");
- *
- */
- public class CmsAuthenticatedDataGenerator
- : CmsAuthenticatedGenerator
- {
- /**
- * base constructor
- */
- public CmsAuthenticatedDataGenerator()
- {
- }
-
- /**
- * constructor allowing specific source of randomness
- * @param rand instance of SecureRandom to use
- */
- public CmsAuthenticatedDataGenerator(
- SecureRandom rand)
- : base(rand)
- {
- }
-
- /**
- * generate an enveloped object that contains an CMS Enveloped Data
- * object using the given provider and the passed in key generator.
- */
- private CmsAuthenticatedData Generate(
- CmsProcessable content,
- string macOid,
- CipherKeyGenerator keyGen)
- {
- AlgorithmIdentifier macAlgId;
- KeyParameter encKey;
- Asn1OctetString encContent;
- Asn1OctetString macResult;
-
- try
- {
- // FIXME Will this work for macs?
- byte[] encKeyBytes = keyGen.GenerateKey();
- encKey = ParameterUtilities.CreateKeyParameter(macOid, encKeyBytes);
-
- Asn1Encodable asn1Params = GenerateAsn1Parameters(macOid, encKeyBytes);
-
- ICipherParameters cipherParameters;
- macAlgId = GetAlgorithmIdentifier(
- macOid, encKey, asn1Params, out cipherParameters);
-
- IMac mac = MacUtilities.GetMac(macOid);
- // TODO Confirm no ParametersWithRandom needed
- // FIXME Only passing key at the moment
-// mac.Init(cipherParameters);
- mac.Init(encKey);
-
- MemoryStream bOut = new MemoryStream();
- Stream mOut = new TeeOutputStream(bOut, new MacOutputStream(mac));
-
- content.Write(mOut);
-
- Platform.Dispose(mOut);
-
- encContent = new BerOctetString(bOut.ToArray());
-
- byte[] macOctets = MacUtilities.DoFinal(mac);
- macResult = new DerOctetString(macOctets);
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("couldn't create cipher.", e);
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key invalid in message.", e);
- }
- catch (IOException e)
- {
- throw new CmsException("exception decoding algorithm parameters.", e);
- }
-
- Asn1EncodableVector recipientInfos = new Asn1EncodableVector();
-
- foreach (RecipientInfoGenerator rig in recipientInfoGenerators)
- {
- try
- {
- recipientInfos.Add(rig.Generate(encKey, rand));
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key inappropriate for algorithm.", e);
- }
- catch (GeneralSecurityException e)
- {
- throw new CmsException("error making encrypted content.", e);
- }
- }
-
- ContentInfo eci = new ContentInfo(CmsObjectIdentifiers.Data, encContent);
-
- ContentInfo contentInfo = new ContentInfo(
- CmsObjectIdentifiers.AuthenticatedData,
- new AuthenticatedData(null, new DerSet(recipientInfos), macAlgId, null, eci, null, macResult, null));
-
- return new CmsAuthenticatedData(contentInfo);
- }
-
- /**
- * generate an authenticated object that contains an CMS Authenticated Data object
- */
- public CmsAuthenticatedData Generate(
- CmsProcessable content,
- string encryptionOid)
- {
- try
- {
- // FIXME Will this work for macs?
- CipherKeyGenerator keyGen = GeneratorUtilities.GetKeyGenerator(encryptionOid);
-
- keyGen.Init(new KeyGenerationParameters(rand, keyGen.DefaultStrength));
-
- return Generate(content, encryptionOid, keyGen);
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("can't find key generation algorithm.", e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSAuthenticatedDataParser.cs b/BCCrypto/src/cms/CMSAuthenticatedDataParser.cs
deleted file mode 100644
index 7defafc..0000000
--- a/BCCrypto/src/cms/CMSAuthenticatedDataParser.cs
+++ /dev/null
@@ -1,214 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * Parsing class for an CMS Authenticated Data object from an input stream.
- *
- * Note: that because we are in a streaming mode only one recipient can be tried and it is important
- * that the methods on the parser are called in the appropriate order.
- *
- *
- * Example of use - assuming the first recipient matches the private key we have.
- *
- * CMSAuthenticatedDataParser ad = new CMSAuthenticatedDataParser(inputStream);
- *
- * RecipientInformationStore recipients = ad.getRecipientInfos();
- *
- * Collection c = recipients.getRecipients();
- * Iterator it = c.iterator();
- *
- * if (it.hasNext())
- * {
- * RecipientInformation recipient = (RecipientInformation)it.next();
- *
- * CMSTypedStream recData = recipient.getContentStream(privateKey, "BC");
- *
- * processDataStream(recData.getContentStream());
- *
- * if (!Arrays.equals(ad.getMac(), recipient.getMac())
- * {
- * System.err.println("Data corrupted!!!!");
- * }
- * }
- *
- * Note: this class does not introduce buffering - if you are processing large files you should create
- * the parser with:
- *
- * CMSAuthenticatedDataParser ep = new CMSAuthenticatedDataParser(new BufferedInputStream(inputStream, bufSize));
- *
- * where bufSize is a suitably large buffer size.
- *
- */
- public class CmsAuthenticatedDataParser
- : CmsContentInfoParser
- {
- internal RecipientInformationStore _recipientInfoStore;
- internal AuthenticatedDataParser authData;
-
- private AlgorithmIdentifier macAlg;
- private byte[] mac;
- private Asn1.Cms.AttributeTable authAttrs;
- private Asn1.Cms.AttributeTable unauthAttrs;
-
- private bool authAttrNotRead;
- private bool unauthAttrNotRead;
-
- public CmsAuthenticatedDataParser(
- byte[] envelopedData)
- : this(new MemoryStream(envelopedData, false))
- {
- }
-
- public CmsAuthenticatedDataParser(
- Stream envelopedData)
- : base(envelopedData)
- {
- this.authAttrNotRead = true;
- this.authData = new AuthenticatedDataParser(
- (Asn1SequenceParser)contentInfo.GetContent(Asn1Tags.Sequence));
-
- // TODO Validate version?
- //DerInteger version = this.authData.getVersion();
-
- //
- // read the recipients
- //
- Asn1Set recipientInfos = Asn1Set.GetInstance(authData.GetRecipientInfos().ToAsn1Object());
-
- this.macAlg = authData.GetMacAlgorithm();
-
- //
- // read the authenticated content info
- //
- ContentInfoParser data = authData.GetEnapsulatedContentInfo();
- CmsReadable readable = new CmsProcessableInputStream(
- ((Asn1OctetStringParser)data.GetContent(Asn1Tags.OctetString)).GetOctetStream());
- CmsSecureReadable secureReadable = new CmsEnvelopedHelper.CmsAuthenticatedSecureReadable(
- this.macAlg, readable);
-
- //
- // build the RecipientInformationStore
- //
- this._recipientInfoStore = CmsEnvelopedHelper.BuildRecipientInformationStore(
- recipientInfos, secureReadable);
- }
-
- public AlgorithmIdentifier MacAlgorithmID
- {
- get { return macAlg; }
- }
-
- /**
- * return the object identifier for the mac algorithm.
- */
- public string MacAlgOid
- {
- get { return macAlg.Algorithm.Id; }
- }
-
-
- /**
- * return the ASN.1 encoded encryption algorithm parameters, or null if
- * there aren't any.
- */
- public Asn1Object MacAlgParams
- {
- get
- {
- Asn1Encodable ae = macAlg.Parameters;
-
- return ae == null ? null : ae.ToAsn1Object();
- }
- }
-
- /**
- * return a store of the intended recipients for this message
- */
- public RecipientInformationStore GetRecipientInfos()
- {
- return _recipientInfoStore;
- }
-
- public byte[] GetMac()
- {
- if (mac == null)
- {
- GetAuthAttrs();
- mac = authData.GetMac().GetOctets();
- }
- return Arrays.Clone(mac);
- }
-
- /**
- * return a table of the unauthenticated attributes indexed by
- * the OID of the attribute.
- * @exception java.io.IOException
- */
- public Asn1.Cms.AttributeTable GetAuthAttrs()
- {
- if (authAttrs == null && authAttrNotRead)
- {
- Asn1SetParser s = authData.GetAuthAttrs();
-
- authAttrNotRead = false;
-
- if (s != null)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- IAsn1Convertible o;
- while ((o = s.ReadObject()) != null)
- {
- Asn1SequenceParser seq = (Asn1SequenceParser)o;
-
- v.Add(seq.ToAsn1Object());
- }
-
- authAttrs = new Asn1.Cms.AttributeTable(new DerSet(v));
- }
- }
-
- return authAttrs;
- }
-
- /**
- * return a table of the unauthenticated attributes indexed by
- * the OID of the attribute.
- * @exception java.io.IOException
- */
- public Asn1.Cms.AttributeTable GetUnauthAttrs()
- {
- if (unauthAttrs == null && unauthAttrNotRead)
- {
- Asn1SetParser s = authData.GetUnauthAttrs();
-
- unauthAttrNotRead = false;
-
- if (s != null)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- IAsn1Convertible o;
- while ((o = s.ReadObject()) != null)
- {
- Asn1SequenceParser seq = (Asn1SequenceParser)o;
-
- v.Add(seq.ToAsn1Object());
- }
-
- unauthAttrs = new Asn1.Cms.AttributeTable(new DerSet(v));
- }
- }
-
- return unauthAttrs;
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs b/BCCrypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs
deleted file mode 100644
index 4d18d10..0000000
--- a/BCCrypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs
+++ /dev/null
@@ -1,297 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * General class for generating a CMS authenticated-data message stream.
- *
- * A simple example of usage.
- *
- * CMSAuthenticatedDataStreamGenerator edGen = new CMSAuthenticatedDataStreamGenerator();
- *
- * edGen.addKeyTransRecipient(cert);
- *
- * ByteArrayOutputStream bOut = new ByteArrayOutputStream();
- *
- * OutputStream out = edGen.open(
- * bOut, CMSAuthenticatedDataGenerator.AES128_CBC, "BC");*
- * out.write(data);
- *
- * out.close();
- *
- *
- */
- public class CmsAuthenticatedDataStreamGenerator
- : CmsAuthenticatedGenerator
- {
- // TODO Add support
-// private object _originatorInfo = null;
-// private object _unprotectedAttributes = null;
- private int _bufferSize;
- private bool _berEncodeRecipientSet;
-
- /**
- * base constructor
- */
- public CmsAuthenticatedDataStreamGenerator()
- {
- }
-
- /**
- * constructor allowing specific source of randomness
- * @param rand instance of SecureRandom to use
- */
- public CmsAuthenticatedDataStreamGenerator(
- SecureRandom rand)
- : base(rand)
- {
- }
-
- /**
- * Set the underlying string size for encapsulated data
- *
- * @param bufferSize length of octet strings to buffer the data.
- */
- public void SetBufferSize(
- int bufferSize)
- {
- _bufferSize = bufferSize;
- }
-
- /**
- * Use a BER Set to store the recipient information
- */
- public void SetBerEncodeRecipients(
- bool berEncodeRecipientSet)
- {
- _berEncodeRecipientSet = berEncodeRecipientSet;
- }
-
- /**
- * generate an enveloped object that contains an CMS Enveloped Data
- * object using the given provider and the passed in key generator.
- * @throws java.io.IOException
- */
- private Stream Open(
- Stream outStr,
- string macOid,
- CipherKeyGenerator keyGen)
- {
- // FIXME Will this work for macs?
- byte[] encKeyBytes = keyGen.GenerateKey();
- KeyParameter encKey = ParameterUtilities.CreateKeyParameter(macOid, encKeyBytes);
-
- Asn1Encodable asn1Params = GenerateAsn1Parameters(macOid, encKeyBytes);
-
- ICipherParameters cipherParameters;
- AlgorithmIdentifier macAlgId = GetAlgorithmIdentifier(
- macOid, encKey, asn1Params, out cipherParameters);
-
- Asn1EncodableVector recipientInfos = new Asn1EncodableVector();
-
- foreach (RecipientInfoGenerator rig in recipientInfoGenerators)
- {
- try
- {
- recipientInfos.Add(rig.Generate(encKey, rand));
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key inappropriate for algorithm.", e);
- }
- catch (GeneralSecurityException e)
- {
- throw new CmsException("error making encrypted content.", e);
- }
- }
-
- // FIXME Only passing key at the moment
-// return Open(outStr, macAlgId, cipherParameters, recipientInfos);
- return Open(outStr, macAlgId, encKey, recipientInfos);
- }
-
- protected Stream Open(
- Stream outStr,
- AlgorithmIdentifier macAlgId,
- ICipherParameters cipherParameters,
- Asn1EncodableVector recipientInfos)
- {
- try
- {
- //
- // ContentInfo
- //
- BerSequenceGenerator cGen = new BerSequenceGenerator(outStr);
-
- cGen.AddObject(CmsObjectIdentifiers.AuthenticatedData);
-
- //
- // Authenticated Data
- //
- BerSequenceGenerator authGen = new BerSequenceGenerator(
- cGen.GetRawOutputStream(), 0, true);
-
- authGen.AddObject(new DerInteger(AuthenticatedData.CalculateVersion(null)));
-
- Stream authRaw = authGen.GetRawOutputStream();
- Asn1Generator recipGen = _berEncodeRecipientSet
- ? (Asn1Generator) new BerSetGenerator(authRaw)
- : new DerSetGenerator(authRaw);
-
- foreach (Asn1Encodable ae in recipientInfos)
- {
- recipGen.AddObject(ae);
- }
-
- recipGen.Close();
-
- authGen.AddObject(macAlgId);
-
- BerSequenceGenerator eiGen = new BerSequenceGenerator(authRaw);
- eiGen.AddObject(CmsObjectIdentifiers.Data);
-
- Stream octetOutputStream = CmsUtilities.CreateBerOctetOutputStream(
- eiGen.GetRawOutputStream(), 0, false, _bufferSize);
-
- IMac mac = MacUtilities.GetMac(macAlgId.Algorithm);
- // TODO Confirm no ParametersWithRandom needed
- mac.Init(cipherParameters);
- Stream mOut = new TeeOutputStream(octetOutputStream, new MacOutputStream(mac));
-
- return new CmsAuthenticatedDataOutputStream(mOut, mac, cGen, authGen, eiGen);
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("couldn't create cipher.", e);
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key invalid in message.", e);
- }
- catch (IOException e)
- {
- throw new CmsException("exception decoding algorithm parameters.", e);
- }
- }
-
- /**
- * generate an enveloped object that contains an CMS Enveloped Data object
- */
- public Stream Open(
- Stream outStr,
- string encryptionOid)
- {
- CipherKeyGenerator keyGen = GeneratorUtilities.GetKeyGenerator(encryptionOid);
-
- keyGen.Init(new KeyGenerationParameters(rand, keyGen.DefaultStrength));
-
- return Open(outStr, encryptionOid, keyGen);
- }
-
- /**
- * generate an enveloped object that contains an CMS Enveloped Data object
- */
- public Stream Open(
- Stream outStr,
- string encryptionOid,
- int keySize)
- {
- CipherKeyGenerator keyGen = GeneratorUtilities.GetKeyGenerator(encryptionOid);
-
- keyGen.Init(new KeyGenerationParameters(rand, keySize));
-
- return Open(outStr, encryptionOid, keyGen);
- }
-
- private class CmsAuthenticatedDataOutputStream
- : BaseOutputStream
- {
- private readonly Stream macStream;
- private readonly IMac mac;
- private readonly BerSequenceGenerator cGen;
- private readonly BerSequenceGenerator authGen;
- private readonly BerSequenceGenerator eiGen;
-
- public CmsAuthenticatedDataOutputStream(
- Stream macStream,
- IMac mac,
- BerSequenceGenerator cGen,
- BerSequenceGenerator authGen,
- BerSequenceGenerator eiGen)
- {
- this.macStream = macStream;
- this.mac = mac;
- this.cGen = cGen;
- this.authGen = authGen;
- this.eiGen = eiGen;
- }
-
- public override void WriteByte(
- byte b)
- {
- macStream.WriteByte(b);
- }
-
- public override void Write(
- byte[] bytes,
- int off,
- int len)
- {
- macStream.Write(bytes, off, len);
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Platform.Dispose(macStream);
-
- // TODO Parent context(s) should really be be closed explicitly
-
- eiGen.Close();
-
- // [TODO] auth attributes go here
- byte[] macOctets = MacUtilities.DoFinal(mac);
- authGen.AddObject(new DerOctetString(macOctets));
- // [TODO] unauth attributes go here
-
- authGen.Close();
- cGen.Close();
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Platform.Dispose(macStream);
-
- // TODO Parent context(s) should really be be closed explicitly
-
- eiGen.Close();
-
- // [TODO] auth attributes go here
- byte[] macOctets = MacUtilities.DoFinal(mac);
- authGen.AddObject(new DerOctetString(macOctets));
- // [TODO] unauth attributes go here
-
- authGen.Close();
- cGen.Close();
- base.Close();
- }
-#endif
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSAuthenticatedGenerator.cs b/BCCrypto/src/cms/CMSAuthenticatedGenerator.cs
deleted file mode 100644
index 8824d19..0000000
--- a/BCCrypto/src/cms/CMSAuthenticatedGenerator.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities.Date;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Cms
-{
- public class CmsAuthenticatedGenerator
- : CmsEnvelopedGenerator
- {
- /**
- * base constructor
- */
- public CmsAuthenticatedGenerator()
- {
- }
-
- /**
- * constructor allowing specific source of randomness
- *
- * @param rand instance of SecureRandom to use
- */
- public CmsAuthenticatedGenerator(
- SecureRandom rand)
- : base(rand)
- {
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSCompressedData.cs b/BCCrypto/src/cms/CMSCompressedData.cs
deleted file mode 100644
index 21651f0..0000000
--- a/BCCrypto/src/cms/CMSCompressedData.cs
+++ /dev/null
@@ -1,108 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Zlib;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * containing class for an CMS Compressed Data object
- */
- public class CmsCompressedData
- {
- internal ContentInfo contentInfo;
-
- public CmsCompressedData(
- byte[] compressedData)
- : this(CmsUtilities.ReadContentInfo(compressedData))
- {
- }
-
- public CmsCompressedData(
- Stream compressedDataStream)
- : this(CmsUtilities.ReadContentInfo(compressedDataStream))
- {
- }
-
- public CmsCompressedData(
- ContentInfo contentInfo)
- {
- this.contentInfo = contentInfo;
- }
-
- /**
- * Return the uncompressed content.
- *
- * @return the uncompressed content
- * @throws CmsException if there is an exception uncompressing the data.
- */
- public byte[] GetContent()
- {
- CompressedData comData = CompressedData.GetInstance(contentInfo.Content);
- ContentInfo content = comData.EncapContentInfo;
-
- Asn1OctetString bytes = (Asn1OctetString) content.Content;
- ZInputStream zIn = new ZInputStream(bytes.GetOctetStream());
-
- try
- {
- return CmsUtilities.StreamToByteArray(zIn);
- }
- catch (IOException e)
- {
- throw new CmsException("exception reading compressed stream.", e);
- }
- finally
- {
- Platform.Dispose(zIn);
- }
- }
-
- /**
- * Return the uncompressed content, throwing an exception if the data size
- * is greater than the passed in limit. If the content is exceeded getCause()
- * on the CMSException will contain a StreamOverflowException
- *
- * @param limit maximum number of bytes to read
- * @return the content read
- * @throws CMSException if there is an exception uncompressing the data.
- */
- public byte[] GetContent(int limit)
- {
- CompressedData comData = CompressedData.GetInstance(contentInfo.Content);
- ContentInfo content = comData.EncapContentInfo;
-
- Asn1OctetString bytes = (Asn1OctetString)content.Content;
-
- ZInputStream zIn = new ZInputStream(new MemoryStream(bytes.GetOctets(), false));
-
- try
- {
- return CmsUtilities.StreamToByteArray(zIn, limit);
- }
- catch (IOException e)
- {
- throw new CmsException("exception reading compressed stream.", e);
- }
- }
-
- /**
- * return the ContentInfo
- */
- public ContentInfo ContentInfo
- {
- get { return contentInfo; }
- }
-
- /**
- * return the ASN.1 encoded representation of this object.
- */
- public byte[] GetEncoded()
- {
- return contentInfo.GetEncoded();
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSCompressedDataGenerator.cs b/BCCrypto/src/cms/CMSCompressedDataGenerator.cs
deleted file mode 100644
index d51de10..0000000
--- a/BCCrypto/src/cms/CMSCompressedDataGenerator.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Zlib;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * General class for generating a compressed CMS message.
- *
- * A simple example of usage.
- *
- *
- * CMSCompressedDataGenerator fact = new CMSCompressedDataGenerator();
- * CMSCompressedData data = fact.Generate(content, algorithm);
- *
- *
- */
- public class CmsCompressedDataGenerator
- {
- public const string ZLib = "1.2.840.113549.1.9.16.3.8";
-
- public CmsCompressedDataGenerator()
- {
- }
-
- /**
- * Generate an object that contains an CMS Compressed Data
- */
- public CmsCompressedData Generate(
- CmsProcessable content,
- string compressionOid)
- {
- AlgorithmIdentifier comAlgId;
- Asn1OctetString comOcts;
-
- try
- {
- MemoryStream bOut = new MemoryStream();
- ZOutputStream zOut = new ZOutputStream(bOut, JZlib.Z_DEFAULT_COMPRESSION);
-
- content.Write(zOut);
-
- Platform.Dispose(zOut);
-
- comAlgId = new AlgorithmIdentifier(new DerObjectIdentifier(compressionOid));
- comOcts = new BerOctetString(bOut.ToArray());
- }
- catch (IOException e)
- {
- throw new CmsException("exception encoding data.", e);
- }
-
- ContentInfo comContent = new ContentInfo(CmsObjectIdentifiers.Data, comOcts);
- ContentInfo contentInfo = new ContentInfo(
- CmsObjectIdentifiers.CompressedData,
- new CompressedData(comAlgId, comContent));
-
- return new CmsCompressedData(contentInfo);
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSCompressedDataParser.cs b/BCCrypto/src/cms/CMSCompressedDataParser.cs
deleted file mode 100644
index 93dfa12..0000000
--- a/BCCrypto/src/cms/CMSCompressedDataParser.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Utilities.Zlib;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * Class for reading a CMS Compressed Data stream.
- *
- * CMSCompressedDataParser cp = new CMSCompressedDataParser(inputStream);
- *
- * process(cp.GetContent().GetContentStream());
- *
- * Note: this class does not introduce buffering - if you are processing large files you should create
- * the parser with:
- *
- * CMSCompressedDataParser ep = new CMSCompressedDataParser(new BufferedInputStream(inputStream, bufSize));
- *
- * where bufSize is a suitably large buffer size.
- */
- public class CmsCompressedDataParser
- : CmsContentInfoParser
- {
- public CmsCompressedDataParser(
- byte[] compressedData)
- : this(new MemoryStream(compressedData, false))
- {
- }
-
- public CmsCompressedDataParser(
- Stream compressedData)
- : base(compressedData)
- {
- }
-
- public CmsTypedStream GetContent()
- {
- try
- {
- CompressedDataParser comData = new CompressedDataParser((Asn1SequenceParser)this.contentInfo.GetContent(Asn1Tags.Sequence));
- ContentInfoParser content = comData.GetEncapContentInfo();
-
- Asn1OctetStringParser bytes = (Asn1OctetStringParser)content.GetContent(Asn1Tags.OctetString);
-
- return new CmsTypedStream(content.ContentType.ToString(), new ZInputStream(bytes.GetOctetStream()));
- }
- catch (IOException e)
- {
- throw new CmsException("IOException reading compressed content.", e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSCompressedDataStreamGenerator.cs b/BCCrypto/src/cms/CMSCompressedDataStreamGenerator.cs
deleted file mode 100644
index 0cb1bb6..0000000
--- a/BCCrypto/src/cms/CMSCompressedDataStreamGenerator.cs
+++ /dev/null
@@ -1,158 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-using Org.BouncyCastle.Utilities.Zlib;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * General class for generating a compressed CMS message stream.
- *
- * A simple example of usage.
- *
- *
- * CMSCompressedDataStreamGenerator gen = new CMSCompressedDataStreamGenerator();
- *
- * Stream cOut = gen.Open(outputStream, CMSCompressedDataStreamGenerator.ZLIB);
- *
- * cOut.Write(data);
- *
- * cOut.Close();
- *
- */
- public class CmsCompressedDataStreamGenerator
- {
- public const string ZLib = "1.2.840.113549.1.9.16.3.8";
-
- private int _bufferSize;
-
- /**
- * base constructor
- */
- public CmsCompressedDataStreamGenerator()
- {
- }
-
- /**
- * Set the underlying string size for encapsulated data
- *
- * @param bufferSize length of octet strings to buffer the data.
- */
- public void SetBufferSize(
- int bufferSize)
- {
- _bufferSize = bufferSize;
- }
-
- public Stream Open(
- Stream outStream,
- string compressionOID)
- {
- return Open(outStream, CmsObjectIdentifiers.Data.Id, compressionOID);
- }
-
- public Stream Open(
- Stream outStream,
- string contentOID,
- string compressionOID)
- {
- BerSequenceGenerator sGen = new BerSequenceGenerator(outStream);
-
- sGen.AddObject(CmsObjectIdentifiers.CompressedData);
-
- //
- // Compressed Data
- //
- BerSequenceGenerator cGen = new BerSequenceGenerator(
- sGen.GetRawOutputStream(), 0, true);
-
- // CMSVersion
- cGen.AddObject(new DerInteger(0));
-
- // CompressionAlgorithmIdentifier
- cGen.AddObject(new AlgorithmIdentifier(new DerObjectIdentifier(ZLib)));
-
- //
- // Encapsulated ContentInfo
- //
- BerSequenceGenerator eiGen = new BerSequenceGenerator(cGen.GetRawOutputStream());
-
- eiGen.AddObject(new DerObjectIdentifier(contentOID));
-
- Stream octetStream = CmsUtilities.CreateBerOctetOutputStream(
- eiGen.GetRawOutputStream(), 0, true, _bufferSize);
-
- return new CmsCompressedOutputStream(
- new ZOutputStream(octetStream, JZlib.Z_DEFAULT_COMPRESSION), sGen, cGen, eiGen);
- }
-
- private class CmsCompressedOutputStream
- : BaseOutputStream
- {
- private ZOutputStream _out;
- private BerSequenceGenerator _sGen;
- private BerSequenceGenerator _cGen;
- private BerSequenceGenerator _eiGen;
-
- internal CmsCompressedOutputStream(
- ZOutputStream outStream,
- BerSequenceGenerator sGen,
- BerSequenceGenerator cGen,
- BerSequenceGenerator eiGen)
- {
- _out = outStream;
- _sGen = sGen;
- _cGen = cGen;
- _eiGen = eiGen;
- }
-
- public override void WriteByte(
- byte b)
- {
- _out.WriteByte(b);
- }
-
- public override void Write(
- byte[] bytes,
- int off,
- int len)
- {
- _out.Write(bytes, off, len);
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Platform.Dispose(_out);
-
- // TODO Parent context(s) should really be be closed explicitly
-
- _eiGen.Close();
- _cGen.Close();
- _sGen.Close();
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Platform.Dispose(_out);
-
- // TODO Parent context(s) should really be be closed explicitly
-
- _eiGen.Close();
- _cGen.Close();
- _sGen.Close();
- base.Close();
- }
-#endif
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSContentInfoParser.cs b/BCCrypto/src/cms/CMSContentInfoParser.cs
deleted file mode 100644
index a7b43f2..0000000
--- a/BCCrypto/src/cms/CMSContentInfoParser.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Cms
-{
- public class CmsContentInfoParser
- {
- protected ContentInfoParser contentInfo;
- protected Stream data;
-
- protected CmsContentInfoParser(
- Stream data)
- {
- if (data == null)
- throw new ArgumentNullException("data");
-
- this.data = data;
-
- try
- {
- Asn1StreamParser inStream = new Asn1StreamParser(data);
-
- this.contentInfo = new ContentInfoParser((Asn1SequenceParser)inStream.ReadObject());
- }
- catch (IOException e)
- {
- throw new CmsException("IOException reading content.", e);
- }
- catch (InvalidCastException e)
- {
- throw new CmsException("Unexpected object reading content.", e);
- }
- }
-
- /**
- * Close the underlying data stream.
- * @throws IOException if the close fails.
- */
- public void Close()
- {
- Platform.Dispose(this.data);
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSEnvelopedData.cs b/BCCrypto/src/cms/CMSEnvelopedData.cs
deleted file mode 100644
index 223d0ca..0000000
--- a/BCCrypto/src/cms/CMSEnvelopedData.cs
+++ /dev/null
@@ -1,115 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * containing class for an CMS Enveloped Data object
- */
- public class CmsEnvelopedData
- {
- internal RecipientInformationStore recipientInfoStore;
- internal ContentInfo contentInfo;
-
- private AlgorithmIdentifier encAlg;
- private Asn1Set unprotectedAttributes;
-
- public CmsEnvelopedData(
- byte[] envelopedData)
- : this(CmsUtilities.ReadContentInfo(envelopedData))
- {
- }
-
- public CmsEnvelopedData(
- Stream envelopedData)
- : this(CmsUtilities.ReadContentInfo(envelopedData))
- {
- }
-
- public CmsEnvelopedData(
- ContentInfo contentInfo)
- {
- this.contentInfo = contentInfo;
-
- EnvelopedData envData = EnvelopedData.GetInstance(contentInfo.Content);
-
- //
- // read the recipients
- //
- Asn1Set recipientInfos = envData.RecipientInfos;
-
- //
- // read the encrypted content info
- //
- EncryptedContentInfo encInfo = envData.EncryptedContentInfo;
- this.encAlg = encInfo.ContentEncryptionAlgorithm;
- CmsReadable readable = new CmsProcessableByteArray(encInfo.EncryptedContent.GetOctets());
- CmsSecureReadable secureReadable = new CmsEnvelopedHelper.CmsEnvelopedSecureReadable(
- this.encAlg, readable);
-
- //
- // build the RecipientInformationStore
- //
- this.recipientInfoStore = CmsEnvelopedHelper.BuildRecipientInformationStore(
- recipientInfos, secureReadable);
-
- this.unprotectedAttributes = envData.UnprotectedAttrs;
- }
-
- public AlgorithmIdentifier EncryptionAlgorithmID
- {
- get { return encAlg; }
- }
-
- /**
- * return the object identifier for the content encryption algorithm.
- */
- public string EncryptionAlgOid
- {
- get { return encAlg.Algorithm.Id; }
- }
-
- /**
- * return a store of the intended recipients for this message
- */
- public RecipientInformationStore GetRecipientInfos()
- {
- return recipientInfoStore;
- }
-
- /**
- * return the ContentInfo
- */
- public ContentInfo ContentInfo
- {
- get { return contentInfo; }
- }
-
- /**
- * return a table of the unprotected attributes indexed by
- * the OID of the attribute.
- */
- public Asn1.Cms.AttributeTable GetUnprotectedAttributes()
- {
- if (unprotectedAttributes == null)
- return null;
-
- return new Asn1.Cms.AttributeTable(unprotectedAttributes);
- }
-
- /**
- * return the ASN.1 encoded representation of this object.
- */
- public byte[] GetEncoded()
- {
- return contentInfo.GetEncoded();
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSEnvelopedDataGenerator.cs b/BCCrypto/src/cms/CMSEnvelopedDataGenerator.cs
deleted file mode 100644
index d260e99..0000000
--- a/BCCrypto/src/cms/CMSEnvelopedDataGenerator.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Date;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Cms
-{
- ///
- /// General class for generating a CMS enveloped-data message.
- ///
- /// A simple example of usage.
- ///
- ///
- /// CmsEnvelopedDataGenerator fact = new CmsEnvelopedDataGenerator();
- ///
- /// fact.AddKeyTransRecipient(cert);
- ///
- /// CmsEnvelopedData data = fact.Generate(content, algorithm);
- ///
- ///
- public class CmsEnvelopedDataGenerator
- : CmsEnvelopedGenerator
- {
- public CmsEnvelopedDataGenerator()
- {
- }
-
- /// Constructor allowing specific source of randomness
- /// Instance of SecureRandom to use.
- public CmsEnvelopedDataGenerator(
- SecureRandom rand)
- : base(rand)
- {
- }
-
- ///
- /// Generate an enveloped object that contains a CMS Enveloped Data
- /// object using the passed in key generator.
- ///
- private CmsEnvelopedData Generate(
- CmsProcessable content,
- string encryptionOid,
- CipherKeyGenerator keyGen)
- {
- AlgorithmIdentifier encAlgId = null;
- KeyParameter encKey;
- Asn1OctetString encContent;
-
- try
- {
- byte[] encKeyBytes = keyGen.GenerateKey();
- encKey = ParameterUtilities.CreateKeyParameter(encryptionOid, encKeyBytes);
-
- Asn1Encodable asn1Params = GenerateAsn1Parameters(encryptionOid, encKeyBytes);
-
- ICipherParameters cipherParameters;
- encAlgId = GetAlgorithmIdentifier(
- encryptionOid, encKey, asn1Params, out cipherParameters);
-
- IBufferedCipher cipher = CipherUtilities.GetCipher(encryptionOid);
- cipher.Init(true, new ParametersWithRandom(cipherParameters, rand));
-
- MemoryStream bOut = new MemoryStream();
- CipherStream cOut = new CipherStream(bOut, null, cipher);
-
- content.Write(cOut);
-
- Platform.Dispose(cOut);
-
- encContent = new BerOctetString(bOut.ToArray());
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("couldn't create cipher.", e);
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key invalid in message.", e);
- }
- catch (IOException e)
- {
- throw new CmsException("exception decoding algorithm parameters.", e);
- }
-
-
- Asn1EncodableVector recipientInfos = new Asn1EncodableVector();
-
- foreach (RecipientInfoGenerator rig in recipientInfoGenerators)
- {
- try
- {
- recipientInfos.Add(rig.Generate(encKey, rand));
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key inappropriate for algorithm.", e);
- }
- catch (GeneralSecurityException e)
- {
- throw new CmsException("error making encrypted content.", e);
- }
- }
-
- EncryptedContentInfo eci = new EncryptedContentInfo(
- CmsObjectIdentifiers.Data,
- encAlgId,
- encContent);
-
- Asn1Set unprotectedAttrSet = null;
- if (unprotectedAttributeGenerator != null)
- {
- Asn1.Cms.AttributeTable attrTable = unprotectedAttributeGenerator.GetAttributes(Platform.CreateHashtable());
-
- unprotectedAttrSet = new BerSet(attrTable.ToAsn1EncodableVector());
- }
-
- ContentInfo contentInfo = new ContentInfo(
- CmsObjectIdentifiers.EnvelopedData,
- new EnvelopedData(null, new DerSet(recipientInfos), eci, unprotectedAttrSet));
-
- return new CmsEnvelopedData(contentInfo);
- }
-
- /// Generate an enveloped object that contains an CMS Enveloped Data object.
- public CmsEnvelopedData Generate(
- CmsProcessable content,
- string encryptionOid)
- {
- try
- {
- CipherKeyGenerator keyGen = GeneratorUtilities.GetKeyGenerator(encryptionOid);
-
- keyGen.Init(new KeyGenerationParameters(rand, keyGen.DefaultStrength));
-
- return Generate(content, encryptionOid, keyGen);
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("can't find key generation algorithm.", e);
- }
- }
-
- /// Generate an enveloped object that contains an CMS Enveloped Data object.
- public CmsEnvelopedData Generate(
- CmsProcessable content,
- string encryptionOid,
- int keySize)
- {
- try
- {
- CipherKeyGenerator keyGen = GeneratorUtilities.GetKeyGenerator(encryptionOid);
-
- keyGen.Init(new KeyGenerationParameters(rand, keySize));
-
- return Generate(content, encryptionOid, keyGen);
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("can't find key generation algorithm.", e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSEnvelopedDataParser.cs b/BCCrypto/src/cms/CMSEnvelopedDataParser.cs
deleted file mode 100644
index d5dfaf5..0000000
--- a/BCCrypto/src/cms/CMSEnvelopedDataParser.cs
+++ /dev/null
@@ -1,161 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * Parsing class for an CMS Enveloped Data object from an input stream.
- *
- * Note: that because we are in a streaming mode only one recipient can be tried and it is important
- * that the methods on the parser are called in the appropriate order.
- *
- *
- * Example of use - assuming the first recipient matches the private key we have.
- *
- * CmsEnvelopedDataParser ep = new CmsEnvelopedDataParser(inputStream);
- *
- * RecipientInformationStore recipients = ep.GetRecipientInfos();
- *
- * Collection c = recipients.getRecipients();
- * Iterator it = c.iterator();
- *
- * if (it.hasNext())
- * {
- * RecipientInformation recipient = (RecipientInformation)it.next();
- *
- * CMSTypedStream recData = recipient.getContentStream(privateKey);
- *
- * processDataStream(recData.getContentStream());
- * }
- *
- * Note: this class does not introduce buffering - if you are processing large files you should create
- * the parser with:
- *
- * CmsEnvelopedDataParser ep = new CmsEnvelopedDataParser(new BufferedInputStream(inputStream, bufSize));
- *
- * where bufSize is a suitably large buffer size.
- *
- */
- public class CmsEnvelopedDataParser
- : CmsContentInfoParser
- {
- internal RecipientInformationStore recipientInfoStore;
- internal EnvelopedDataParser envelopedData;
-
- private AlgorithmIdentifier _encAlg;
- private Asn1.Cms.AttributeTable _unprotectedAttributes;
- private bool _attrNotRead;
-
- public CmsEnvelopedDataParser(
- byte[] envelopedData)
- : this(new MemoryStream(envelopedData, false))
- {
- }
-
- public CmsEnvelopedDataParser(
- Stream envelopedData)
- : base(envelopedData)
- {
- this._attrNotRead = true;
- this.envelopedData = new EnvelopedDataParser(
- (Asn1SequenceParser)this.contentInfo.GetContent(Asn1Tags.Sequence));
-
- // TODO Validate version?
- //DerInteger version = this.envelopedData.Version;
-
- //
- // read the recipients
- //
- Asn1Set recipientInfos = Asn1Set.GetInstance(this.envelopedData.GetRecipientInfos().ToAsn1Object());
-
- //
- // read the encrypted content info
- //
- EncryptedContentInfoParser encInfo = this.envelopedData.GetEncryptedContentInfo();
- this._encAlg = encInfo.ContentEncryptionAlgorithm;
- CmsReadable readable = new CmsProcessableInputStream(
- ((Asn1OctetStringParser)encInfo.GetEncryptedContent(Asn1Tags.OctetString)).GetOctetStream());
- CmsSecureReadable secureReadable = new CmsEnvelopedHelper.CmsEnvelopedSecureReadable(
- this._encAlg, readable);
-
- //
- // build the RecipientInformationStore
- //
- this.recipientInfoStore = CmsEnvelopedHelper.BuildRecipientInformationStore(
- recipientInfos, secureReadable);
- }
-
- public AlgorithmIdentifier EncryptionAlgorithmID
- {
- get { return _encAlg; }
- }
-
- /**
- * return the object identifier for the content encryption algorithm.
- */
- public string EncryptionAlgOid
- {
- get { return _encAlg.Algorithm.Id; }
- }
-
- /**
- * return the ASN.1 encoded encryption algorithm parameters, or null if
- * there aren't any.
- */
- public Asn1Object EncryptionAlgParams
- {
- get
- {
- Asn1Encodable ae = _encAlg.Parameters;
-
- return ae == null ? null : ae.ToAsn1Object();
- }
- }
-
- /**
- * return a store of the intended recipients for this message
- */
- public RecipientInformationStore GetRecipientInfos()
- {
- return this.recipientInfoStore;
- }
-
- /**
- * return a table of the unprotected attributes indexed by
- * the OID of the attribute.
- * @throws IOException
- */
- public Asn1.Cms.AttributeTable GetUnprotectedAttributes()
- {
- if (_unprotectedAttributes == null && _attrNotRead)
- {
- Asn1SetParser asn1Set = this.envelopedData.GetUnprotectedAttrs();
-
- _attrNotRead = false;
-
- if (asn1Set != null)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
- IAsn1Convertible o;
-
- while ((o = asn1Set.ReadObject()) != null)
- {
- Asn1SequenceParser seq = (Asn1SequenceParser)o;
-
- v.Add(seq.ToAsn1Object());
- }
-
- _unprotectedAttributes = new Asn1.Cms.AttributeTable(new DerSet(v));
- }
- }
-
- return _unprotectedAttributes;
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSEnvelopedDataStreamGenerator.cs b/BCCrypto/src/cms/CMSEnvelopedDataStreamGenerator.cs
deleted file mode 100644
index 8e6d272..0000000
--- a/BCCrypto/src/cms/CMSEnvelopedDataStreamGenerator.cs
+++ /dev/null
@@ -1,308 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * General class for generating a CMS enveloped-data message stream.
- *
- * A simple example of usage.
- *
- * CmsEnvelopedDataStreamGenerator edGen = new CmsEnvelopedDataStreamGenerator();
- *
- * edGen.AddKeyTransRecipient(cert);
- *
- * MemoryStream bOut = new MemoryStream();
- *
- * Stream out = edGen.Open(
- * bOut, CMSEnvelopedDataGenerator.AES128_CBC);*
- * out.Write(data);
- *
- * out.Close();
- *
- *
- */
- public class CmsEnvelopedDataStreamGenerator
- : CmsEnvelopedGenerator
- {
- private object _originatorInfo = null;
- private object _unprotectedAttributes = null;
- private int _bufferSize;
- private bool _berEncodeRecipientSet;
-
- public CmsEnvelopedDataStreamGenerator()
- {
- }
-
- /// Constructor allowing specific source of randomness
- /// Instance of SecureRandom to use.
- public CmsEnvelopedDataStreamGenerator(
- SecureRandom rand)
- : base(rand)
- {
- }
-
- /// Set the underlying string size for encapsulated data.
- /// Length of octet strings to buffer the data.
- public void SetBufferSize(
- int bufferSize)
- {
- _bufferSize = bufferSize;
- }
-
- /// Use a BER Set to store the recipient information.
- public void SetBerEncodeRecipients(
- bool berEncodeRecipientSet)
- {
- _berEncodeRecipientSet = berEncodeRecipientSet;
- }
-
- private DerInteger Version
- {
- get
- {
- int version = (_originatorInfo != null || _unprotectedAttributes != null)
- ? 2
- : 0;
-
- return new DerInteger(version);
- }
- }
-
- ///
- /// Generate an enveloped object that contains an CMS Enveloped Data
- /// object using the passed in key generator.
- ///
- private Stream Open(
- Stream outStream,
- string encryptionOid,
- CipherKeyGenerator keyGen)
- {
- byte[] encKeyBytes = keyGen.GenerateKey();
- KeyParameter encKey = ParameterUtilities.CreateKeyParameter(encryptionOid, encKeyBytes);
-
- Asn1Encodable asn1Params = GenerateAsn1Parameters(encryptionOid, encKeyBytes);
-
- ICipherParameters cipherParameters;
- AlgorithmIdentifier encAlgID = GetAlgorithmIdentifier(
- encryptionOid, encKey, asn1Params, out cipherParameters);
-
- Asn1EncodableVector recipientInfos = new Asn1EncodableVector();
-
- foreach (RecipientInfoGenerator rig in recipientInfoGenerators)
- {
- try
- {
- recipientInfos.Add(rig.Generate(encKey, rand));
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key inappropriate for algorithm.", e);
- }
- catch (GeneralSecurityException e)
- {
- throw new CmsException("error making encrypted content.", e);
- }
- }
-
- return Open(outStream, encAlgID, cipherParameters, recipientInfos);
- }
-
- private Stream Open(
- Stream outStream,
- AlgorithmIdentifier encAlgID,
- ICipherParameters cipherParameters,
- Asn1EncodableVector recipientInfos)
- {
- try
- {
- //
- // ContentInfo
- //
- BerSequenceGenerator cGen = new BerSequenceGenerator(outStream);
-
- cGen.AddObject(CmsObjectIdentifiers.EnvelopedData);
-
- //
- // Encrypted Data
- //
- BerSequenceGenerator envGen = new BerSequenceGenerator(
- cGen.GetRawOutputStream(), 0, true);
-
- envGen.AddObject(this.Version);
-
- Stream envRaw = envGen.GetRawOutputStream();
- Asn1Generator recipGen = _berEncodeRecipientSet
- ? (Asn1Generator) new BerSetGenerator(envRaw)
- : new DerSetGenerator(envRaw);
-
- foreach (Asn1Encodable ae in recipientInfos)
- {
- recipGen.AddObject(ae);
- }
-
- recipGen.Close();
-
- BerSequenceGenerator eiGen = new BerSequenceGenerator(envRaw);
- eiGen.AddObject(CmsObjectIdentifiers.Data);
- eiGen.AddObject(encAlgID);
-
- Stream octetOutputStream = CmsUtilities.CreateBerOctetOutputStream(
- eiGen.GetRawOutputStream(), 0, false, _bufferSize);
-
- IBufferedCipher cipher = CipherUtilities.GetCipher(encAlgID.Algorithm);
- cipher.Init(true, new ParametersWithRandom(cipherParameters, rand));
- CipherStream cOut = new CipherStream(octetOutputStream, null, cipher);
-
- return new CmsEnvelopedDataOutputStream(this, cOut, cGen, envGen, eiGen);
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("couldn't create cipher.", e);
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key invalid in message.", e);
- }
- catch (IOException e)
- {
- throw new CmsException("exception decoding algorithm parameters.", e);
- }
- }
-
- /**
- * generate an enveloped object that contains an CMS Enveloped Data object
- * @throws IOException
- */
- public Stream Open(
- Stream outStream,
- string encryptionOid)
- {
- CipherKeyGenerator keyGen = GeneratorUtilities.GetKeyGenerator(encryptionOid);
-
- keyGen.Init(new KeyGenerationParameters(rand, keyGen.DefaultStrength));
-
- return Open(outStream, encryptionOid, keyGen);
- }
-
- /**
- * generate an enveloped object that contains an CMS Enveloped Data object
- * @throws IOException
- */
- public Stream Open(
- Stream outStream,
- string encryptionOid,
- int keySize)
- {
- CipherKeyGenerator keyGen = GeneratorUtilities.GetKeyGenerator(encryptionOid);
-
- keyGen.Init(new KeyGenerationParameters(rand, keySize));
-
- return Open(outStream, encryptionOid, keyGen);
- }
-
- private class CmsEnvelopedDataOutputStream
- : BaseOutputStream
- {
- private readonly CmsEnvelopedGenerator _outer;
-
- private readonly CipherStream _out;
- private readonly BerSequenceGenerator _cGen;
- private readonly BerSequenceGenerator _envGen;
- private readonly BerSequenceGenerator _eiGen;
-
- public CmsEnvelopedDataOutputStream(
- CmsEnvelopedGenerator outer,
- CipherStream outStream,
- BerSequenceGenerator cGen,
- BerSequenceGenerator envGen,
- BerSequenceGenerator eiGen)
- {
- _outer = outer;
- _out = outStream;
- _cGen = cGen;
- _envGen = envGen;
- _eiGen = eiGen;
- }
-
- public override void WriteByte(
- byte b)
- {
- _out.WriteByte(b);
- }
-
- public override void Write(
- byte[] bytes,
- int off,
- int len)
- {
- _out.Write(bytes, off, len);
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Platform.Dispose(_out);
-
- // TODO Parent context(s) should really be closed explicitly
-
- _eiGen.Close();
-
- if (_outer.unprotectedAttributeGenerator != null)
- {
- Asn1.Cms.AttributeTable attrTable = _outer.unprotectedAttributeGenerator.GetAttributes(Platform.CreateHashtable());
-
- Asn1Set unprotectedAttrs = new BerSet(attrTable.ToAsn1EncodableVector());
-
- _envGen.AddObject(new DerTaggedObject(false, 1, unprotectedAttrs));
- }
-
- _envGen.Close();
- _cGen.Close();
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Platform.Dispose(_out);
-
- // TODO Parent context(s) should really be closed explicitly
-
- _eiGen.Close();
-
- if (_outer.unprotectedAttributeGenerator != null)
- {
- Asn1.Cms.AttributeTable attrTable = _outer.unprotectedAttributeGenerator.GetAttributes(Platform.CreateHashtable());
-
- Asn1Set unprotectedAttrs = new BerSet(attrTable.ToAsn1EncodableVector());
-
- _envGen.AddObject(new DerTaggedObject(false, 1, unprotectedAttrs));
- }
-
- _envGen.Close();
- _cGen.Close();
- base.Close();
- }
-#endif
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSEnvelopedGenerator.cs b/BCCrypto/src/cms/CMSEnvelopedGenerator.cs
deleted file mode 100644
index f92ae38..0000000
--- a/BCCrypto/src/cms/CMSEnvelopedGenerator.cs
+++ /dev/null
@@ -1,331 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.Kisa;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Ntt;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * General class for generating a CMS enveloped-data message.
- *
- * A simple example of usage.
- *
- *
- * CMSEnvelopedDataGenerator fact = new CMSEnvelopedDataGenerator();
- *
- * fact.addKeyTransRecipient(cert);
- *
- * CMSEnvelopedData data = fact.generate(content, algorithm, "BC");
- *
- */
- public class CmsEnvelopedGenerator
- {
- // Note: These tables are complementary: If rc2Table[i]==j, then rc2Ekb[j]==i
- internal static readonly short[] rc2Table =
- {
- 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0,
- 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a,
- 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36,
- 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c,
- 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60,
- 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa,
- 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e,
- 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf,
- 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6,
- 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3,
- 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c,
- 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2,
- 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5,
- 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5,
- 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f,
- 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab
- };
-
-// internal static readonly short[] rc2Ekb =
-// {
-// 0x5d, 0xbe, 0x9b, 0x8b, 0x11, 0x99, 0x6e, 0x4d, 0x59, 0xf3, 0x85, 0xa6, 0x3f, 0xb7, 0x83, 0xc5,
-// 0xe4, 0x73, 0x6b, 0x3a, 0x68, 0x5a, 0xc0, 0x47, 0xa0, 0x64, 0x34, 0x0c, 0xf1, 0xd0, 0x52, 0xa5,
-// 0xb9, 0x1e, 0x96, 0x43, 0x41, 0xd8, 0xd4, 0x2c, 0xdb, 0xf8, 0x07, 0x77, 0x2a, 0xca, 0xeb, 0xef,
-// 0x10, 0x1c, 0x16, 0x0d, 0x38, 0x72, 0x2f, 0x89, 0xc1, 0xf9, 0x80, 0xc4, 0x6d, 0xae, 0x30, 0x3d,
-// 0xce, 0x20, 0x63, 0xfe, 0xe6, 0x1a, 0xc7, 0xb8, 0x50, 0xe8, 0x24, 0x17, 0xfc, 0x25, 0x6f, 0xbb,
-// 0x6a, 0xa3, 0x44, 0x53, 0xd9, 0xa2, 0x01, 0xab, 0xbc, 0xb6, 0x1f, 0x98, 0xee, 0x9a, 0xa7, 0x2d,
-// 0x4f, 0x9e, 0x8e, 0xac, 0xe0, 0xc6, 0x49, 0x46, 0x29, 0xf4, 0x94, 0x8a, 0xaf, 0xe1, 0x5b, 0xc3,
-// 0xb3, 0x7b, 0x57, 0xd1, 0x7c, 0x9c, 0xed, 0x87, 0x40, 0x8c, 0xe2, 0xcb, 0x93, 0x14, 0xc9, 0x61,
-// 0x2e, 0xe5, 0xcc, 0xf6, 0x5e, 0xa8, 0x5c, 0xd6, 0x75, 0x8d, 0x62, 0x95, 0x58, 0x69, 0x76, 0xa1,
-// 0x4a, 0xb5, 0x55, 0x09, 0x78, 0x33, 0x82, 0xd7, 0xdd, 0x79, 0xf5, 0x1b, 0x0b, 0xde, 0x26, 0x21,
-// 0x28, 0x74, 0x04, 0x97, 0x56, 0xdf, 0x3c, 0xf0, 0x37, 0x39, 0xdc, 0xff, 0x06, 0xa4, 0xea, 0x42,
-// 0x08, 0xda, 0xb4, 0x71, 0xb0, 0xcf, 0x12, 0x7a, 0x4e, 0xfa, 0x6c, 0x1d, 0x84, 0x00, 0xc8, 0x7f,
-// 0x91, 0x45, 0xaa, 0x2b, 0xc2, 0xb1, 0x8f, 0xd5, 0xba, 0xf2, 0xad, 0x19, 0xb2, 0x67, 0x36, 0xf7,
-// 0x0f, 0x0a, 0x92, 0x7d, 0xe3, 0x9d, 0xe9, 0x90, 0x3e, 0x23, 0x27, 0x66, 0x13, 0xec, 0x81, 0x15,
-// 0xbd, 0x22, 0xbf, 0x9f, 0x7e, 0xa9, 0x51, 0x4b, 0x4c, 0xfb, 0x02, 0xd3, 0x70, 0x86, 0x31, 0xe7,
-// 0x3b, 0x05, 0x03, 0x54, 0x60, 0x48, 0x65, 0x18, 0xd2, 0xcd, 0x5f, 0x32, 0x88, 0x0e, 0x35, 0xfd
-// };
-
-
- // TODO Create named constants for all of these
- public static readonly string DesEde3Cbc = PkcsObjectIdentifiers.DesEde3Cbc.Id;
- public static readonly string RC2Cbc = PkcsObjectIdentifiers.RC2Cbc.Id;
- public const string IdeaCbc = "1.3.6.1.4.1.188.7.1.1.2";
- public const string Cast5Cbc = "1.2.840.113533.7.66.10";
- public static readonly string Aes128Cbc = NistObjectIdentifiers.IdAes128Cbc.Id;
- public static readonly string Aes192Cbc = NistObjectIdentifiers.IdAes192Cbc.Id;
- public static readonly string Aes256Cbc = NistObjectIdentifiers.IdAes256Cbc.Id;
- public static readonly string Camellia128Cbc = NttObjectIdentifiers.IdCamellia128Cbc.Id;
- public static readonly string Camellia192Cbc = NttObjectIdentifiers.IdCamellia192Cbc.Id;
- public static readonly string Camellia256Cbc = NttObjectIdentifiers.IdCamellia256Cbc.Id;
- public static readonly string SeedCbc = KisaObjectIdentifiers.IdSeedCbc.Id;
-
- public static readonly string DesEde3Wrap = PkcsObjectIdentifiers.IdAlgCms3DesWrap.Id;
- public static readonly string Aes128Wrap = NistObjectIdentifiers.IdAes128Wrap.Id;
- public static readonly string Aes192Wrap = NistObjectIdentifiers.IdAes192Wrap.Id;
- public static readonly string Aes256Wrap = NistObjectIdentifiers.IdAes256Wrap.Id;
- public static readonly string Camellia128Wrap = NttObjectIdentifiers.IdCamellia128Wrap.Id;
- public static readonly string Camellia192Wrap = NttObjectIdentifiers.IdCamellia192Wrap.Id;
- public static readonly string Camellia256Wrap = NttObjectIdentifiers.IdCamellia256Wrap.Id;
- public static readonly string SeedWrap = KisaObjectIdentifiers.IdNpkiAppCmsSeedWrap.Id;
-
- public static readonly string ECDHSha1Kdf = X9ObjectIdentifiers.DHSinglePassStdDHSha1KdfScheme.Id;
- public static readonly string ECMqvSha1Kdf = X9ObjectIdentifiers.MqvSinglePassSha1KdfScheme.Id;
-
- internal readonly IList recipientInfoGenerators = Platform.CreateArrayList();
- internal readonly SecureRandom rand;
-
- internal CmsAttributeTableGenerator unprotectedAttributeGenerator = null;
-
- public CmsEnvelopedGenerator()
- : this(new SecureRandom())
- {
- }
-
- /// Constructor allowing specific source of randomness
- /// Instance of SecureRandom to use.
- public CmsEnvelopedGenerator(
- SecureRandom rand)
- {
- this.rand = rand;
- }
-
- public CmsAttributeTableGenerator UnprotectedAttributeGenerator
- {
- get { return this.unprotectedAttributeGenerator; }
- set { this.unprotectedAttributeGenerator = value; }
- }
-
- /**
- * add a recipient.
- *
- * @param cert recipient's public key certificate
- * @exception ArgumentException if there is a problem with the certificate
- */
- public void AddKeyTransRecipient(
- X509Certificate cert)
- {
- KeyTransRecipientInfoGenerator ktrig = new KeyTransRecipientInfoGenerator();
- ktrig.RecipientCert = cert;
-
- recipientInfoGenerators.Add(ktrig);
- }
-
- /**
- * add a recipient
- *
- * @param key the public key used by the recipient
- * @param subKeyId the identifier for the recipient's public key
- * @exception ArgumentException if there is a problem with the key
- */
- public void AddKeyTransRecipient(
- AsymmetricKeyParameter pubKey,
- byte[] subKeyId)
- {
- KeyTransRecipientInfoGenerator ktrig = new KeyTransRecipientInfoGenerator();
- ktrig.RecipientPublicKey = pubKey;
- ktrig.SubjectKeyIdentifier = new DerOctetString(subKeyId);
-
- recipientInfoGenerators.Add(ktrig);
- }
-
- /**
- * add a KEK recipient.
- * @param key the secret key to use for wrapping
- * @param keyIdentifier the byte string that identifies the key
- */
- public void AddKekRecipient(
- string keyAlgorithm, // TODO Remove need for this parameter
- KeyParameter key,
- byte[] keyIdentifier)
- {
- AddKekRecipient(keyAlgorithm, key, new KekIdentifier(keyIdentifier, null, null));
- }
-
- /**
- * add a KEK recipient.
- * @param key the secret key to use for wrapping
- * @param keyIdentifier the byte string that identifies the key
- */
- public void AddKekRecipient(
- string keyAlgorithm, // TODO Remove need for this parameter
- KeyParameter key,
- KekIdentifier kekIdentifier)
- {
- KekRecipientInfoGenerator kekrig = new KekRecipientInfoGenerator();
- kekrig.KekIdentifier = kekIdentifier;
- kekrig.KeyEncryptionKeyOID = keyAlgorithm;
- kekrig.KeyEncryptionKey = key;
-
- recipientInfoGenerators.Add(kekrig);
- }
-
- public void AddPasswordRecipient(
- CmsPbeKey pbeKey,
- string kekAlgorithmOid)
- {
- Pbkdf2Params p = new Pbkdf2Params(pbeKey.Salt, pbeKey.IterationCount);
-
- PasswordRecipientInfoGenerator prig = new PasswordRecipientInfoGenerator();
- prig.KeyDerivationAlgorithm = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdPbkdf2, p);
- prig.KeyEncryptionKeyOID = kekAlgorithmOid;
- prig.KeyEncryptionKey = pbeKey.GetEncoded(kekAlgorithmOid);
-
- recipientInfoGenerators.Add(prig);
- }
-
- /**
- * Add a key agreement based recipient.
- *
- * @param agreementAlgorithm key agreement algorithm to use.
- * @param senderPrivateKey private key to initialise sender side of agreement with.
- * @param senderPublicKey sender public key to include with message.
- * @param recipientCert recipient's public key certificate.
- * @param cekWrapAlgorithm OID for key wrapping algorithm to use.
- * @exception SecurityUtilityException if the algorithm requested cannot be found
- * @exception InvalidKeyException if the keys are inappropriate for the algorithm specified
- */
- public void AddKeyAgreementRecipient(
- string agreementAlgorithm,
- AsymmetricKeyParameter senderPrivateKey,
- AsymmetricKeyParameter senderPublicKey,
- X509Certificate recipientCert,
- string cekWrapAlgorithm)
- {
- IList recipientCerts = Platform.CreateArrayList(1);
- recipientCerts.Add(recipientCert);
-
- AddKeyAgreementRecipients(agreementAlgorithm, senderPrivateKey, senderPublicKey,
- recipientCerts, cekWrapAlgorithm);
- }
-
- /**
- * Add multiple key agreement based recipients (sharing a single KeyAgreeRecipientInfo structure).
- *
- * @param agreementAlgorithm key agreement algorithm to use.
- * @param senderPrivateKey private key to initialise sender side of agreement with.
- * @param senderPublicKey sender public key to include with message.
- * @param recipientCerts recipients' public key certificates.
- * @param cekWrapAlgorithm OID for key wrapping algorithm to use.
- * @exception SecurityUtilityException if the algorithm requested cannot be found
- * @exception InvalidKeyException if the keys are inappropriate for the algorithm specified
- */
- public void AddKeyAgreementRecipients(
- string agreementAlgorithm,
- AsymmetricKeyParameter senderPrivateKey,
- AsymmetricKeyParameter senderPublicKey,
- ICollection recipientCerts,
- string cekWrapAlgorithm)
- {
- if (!senderPrivateKey.IsPrivate)
- throw new ArgumentException("Expected private key", "senderPrivateKey");
- if (senderPublicKey.IsPrivate)
- throw new ArgumentException("Expected public key", "senderPublicKey");
-
- /* TODO
- * "a recipient X.509 version 3 certificate that contains a key usage extension MUST
- * assert the keyAgreement bit."
- */
-
- KeyAgreeRecipientInfoGenerator karig = new KeyAgreeRecipientInfoGenerator();
- karig.KeyAgreementOID = new DerObjectIdentifier(agreementAlgorithm);
- karig.KeyEncryptionOID = new DerObjectIdentifier(cekWrapAlgorithm);
- karig.RecipientCerts = recipientCerts;
- karig.SenderKeyPair = new AsymmetricCipherKeyPair(senderPublicKey, senderPrivateKey);
-
- recipientInfoGenerators.Add(karig);
- }
-
- protected internal virtual AlgorithmIdentifier GetAlgorithmIdentifier(
- string encryptionOid,
- KeyParameter encKey,
- Asn1Encodable asn1Params,
- out ICipherParameters cipherParameters)
- {
- Asn1Object asn1Object;
- if (asn1Params != null)
- {
- asn1Object = asn1Params.ToAsn1Object();
- cipherParameters = ParameterUtilities.GetCipherParameters(
- encryptionOid, encKey, asn1Object);
- }
- else
- {
- asn1Object = DerNull.Instance;
- cipherParameters = encKey;
- }
-
- return new AlgorithmIdentifier(
- new DerObjectIdentifier(encryptionOid),
- asn1Object);
- }
-
- protected internal virtual Asn1Encodable GenerateAsn1Parameters(
- string encryptionOid,
- byte[] encKeyBytes)
- {
- Asn1Encodable asn1Params = null;
-
- try
- {
- if (encryptionOid.Equals(RC2Cbc))
- {
- byte[] iv = new byte[8];
- rand.NextBytes(iv);
-
- // TODO Is this detailed repeat of Java version really necessary?
- int effKeyBits = encKeyBytes.Length * 8;
- int parameterVersion;
-
- if (effKeyBits < 256)
- {
- parameterVersion = rc2Table[effKeyBits];
- }
- else
- {
- parameterVersion = effKeyBits;
- }
-
- asn1Params = new RC2CbcParameter(parameterVersion, iv);
- }
- else
- {
- asn1Params = ParameterUtilities.GenerateParameters(encryptionOid, rand);
- }
- }
- catch (SecurityUtilityException)
- {
- // No problem... no parameters generated
- }
-
- return asn1Params;
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSEnvelopedHelper.cs b/BCCrypto/src/cms/CMSEnvelopedHelper.cs
deleted file mode 100644
index 77d2da4..0000000
--- a/BCCrypto/src/cms/CMSEnvelopedHelper.cs
+++ /dev/null
@@ -1,311 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Cms
-{
- class CmsEnvelopedHelper
- {
- internal static readonly CmsEnvelopedHelper Instance = new CmsEnvelopedHelper();
-
- private static readonly IDictionary KeySizes = Platform.CreateHashtable();
- private static readonly IDictionary BaseCipherNames = Platform.CreateHashtable();
-
- static CmsEnvelopedHelper()
- {
- KeySizes.Add(CmsEnvelopedGenerator.DesEde3Cbc, 192);
- KeySizes.Add(CmsEnvelopedGenerator.Aes128Cbc, 128);
- KeySizes.Add(CmsEnvelopedGenerator.Aes192Cbc, 192);
- KeySizes.Add(CmsEnvelopedGenerator.Aes256Cbc, 256);
-
- BaseCipherNames.Add(CmsEnvelopedGenerator.DesEde3Cbc, "DESEDE");
- BaseCipherNames.Add(CmsEnvelopedGenerator.Aes128Cbc, "AES");
- BaseCipherNames.Add(CmsEnvelopedGenerator.Aes192Cbc, "AES");
- BaseCipherNames.Add(CmsEnvelopedGenerator.Aes256Cbc, "AES");
- }
-
- private string GetAsymmetricEncryptionAlgName(
- string encryptionAlgOid)
- {
- if (Asn1.Pkcs.PkcsObjectIdentifiers.RsaEncryption.Id.Equals(encryptionAlgOid))
- {
- return "RSA/ECB/PKCS1Padding";
- }
-
- return encryptionAlgOid;
- }
-
- internal IBufferedCipher CreateAsymmetricCipher(
- string encryptionOid)
- {
- string asymName = GetAsymmetricEncryptionAlgName(encryptionOid);
- if (!asymName.Equals(encryptionOid))
- {
- try
- {
- return CipherUtilities.GetCipher(asymName);
- }
- catch (SecurityUtilityException)
- {
- // Ignore
- }
- }
- return CipherUtilities.GetCipher(encryptionOid);
- }
-
- internal IWrapper CreateWrapper(
- string encryptionOid)
- {
- try
- {
- return WrapperUtilities.GetWrapper(encryptionOid);
- }
- catch (SecurityUtilityException)
- {
- return WrapperUtilities.GetWrapper(GetAsymmetricEncryptionAlgName(encryptionOid));
- }
- }
-
- internal string GetRfc3211WrapperName(
- string oid)
- {
- if (oid == null)
- throw new ArgumentNullException("oid");
-
- string alg = (string) BaseCipherNames[oid];
-
- if (alg == null)
- throw new ArgumentException("no name for " + oid, "oid");
-
- return alg + "RFC3211Wrap";
- }
-
- internal int GetKeySize(
- string oid)
- {
- if (!KeySizes.Contains(oid))
- {
- throw new ArgumentException("no keysize for " + oid, "oid");
- }
-
- return (int) KeySizes[oid];
- }
-
- internal static RecipientInformationStore BuildRecipientInformationStore(
- Asn1Set recipientInfos, CmsSecureReadable secureReadable)
- {
- IList infos = Platform.CreateArrayList();
- for (int i = 0; i != recipientInfos.Count; i++)
- {
- RecipientInfo info = RecipientInfo.GetInstance(recipientInfos[i]);
-
- ReadRecipientInfo(infos, info, secureReadable);
- }
- return new RecipientInformationStore(infos);
- }
-
- private static void ReadRecipientInfo(
- IList infos, RecipientInfo info, CmsSecureReadable secureReadable)
- {
- Asn1Encodable recipInfo = info.Info;
- if (recipInfo is KeyTransRecipientInfo)
- {
- infos.Add(new KeyTransRecipientInformation((KeyTransRecipientInfo)recipInfo, secureReadable));
- }
- else if (recipInfo is KekRecipientInfo)
- {
- infos.Add(new KekRecipientInformation((KekRecipientInfo)recipInfo, secureReadable));
- }
- else if (recipInfo is KeyAgreeRecipientInfo)
- {
- KeyAgreeRecipientInformation.ReadRecipientInfo(infos, (KeyAgreeRecipientInfo)recipInfo, secureReadable);
- }
- else if (recipInfo is PasswordRecipientInfo)
- {
- infos.Add(new PasswordRecipientInformation((PasswordRecipientInfo)recipInfo, secureReadable));
- }
- }
-
- internal class CmsAuthenticatedSecureReadable : CmsSecureReadable
- {
- private AlgorithmIdentifier algorithm;
- private IMac mac;
- private CmsReadable readable;
-
- internal CmsAuthenticatedSecureReadable(AlgorithmIdentifier algorithm, CmsReadable readable)
- {
- this.algorithm = algorithm;
- this.readable = readable;
- }
-
- public AlgorithmIdentifier Algorithm
- {
- get { return this.algorithm; }
- }
-
- public object CryptoObject
- {
- get { return this.mac; }
- }
-
- public CmsReadable GetReadable(KeyParameter sKey)
- {
- string macAlg = this.algorithm.Algorithm.Id;
-// Asn1Object sParams = this.algorithm.Parameters.ToAsn1Object();
-
- try
- {
- this.mac = MacUtilities.GetMac(macAlg);
-
- // FIXME Support for MAC algorithm parameters similar to cipher parameters
-// ASN1Object sParams = (ASN1Object)macAlg.getParameters();
-//
-// if (sParams != null && !(sParams instanceof ASN1Null))
-// {
-// AlgorithmParameters params = CMSEnvelopedHelper.INSTANCE.createAlgorithmParameters(macAlg.getObjectId().getId(), provider);
-//
-// params.init(sParams.getEncoded(), "ASN.1");
-//
-// mac.init(sKey, params.getParameterSpec(IvParameterSpec.class));
-// }
-// else
- {
- mac.Init(sKey);
- }
-
-// Asn1Object asn1Params = asn1Enc == null ? null : asn1Enc.ToAsn1Object();
-//
-// ICipherParameters cipherParameters = sKey;
-//
-// if (asn1Params != null && !(asn1Params is Asn1Null))
-// {
-// cipherParameters = ParameterUtilities.GetCipherParameters(
-// macAlg.Algorithm, cipherParameters, asn1Params);
-// }
-// else
-// {
-// string alg = macAlg.Algorithm.Id;
-// if (alg.Equals(CmsEnvelopedDataGenerator.DesEde3Cbc)
-// || alg.Equals(CmsEnvelopedDataGenerator.IdeaCbc)
-// || alg.Equals(CmsEnvelopedDataGenerator.Cast5Cbc))
-// {
-// cipherParameters = new ParametersWithIV(cipherParameters, new byte[8]);
-// }
-// }
-//
-// mac.Init(cipherParameters);
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("couldn't create cipher.", e);
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key invalid in message.", e);
- }
- catch (IOException e)
- {
- throw new CmsException("error decoding algorithm parameters.", e);
- }
-
- try
- {
- return new CmsProcessableInputStream(
- new TeeInputStream(
- readable.GetInputStream(),
- new MacOutputStream(this.mac)));
- }
- catch (IOException e)
- {
- throw new CmsException("error reading content.", e);
- }
- }
- }
-
- internal class CmsEnvelopedSecureReadable : CmsSecureReadable
- {
- private AlgorithmIdentifier algorithm;
- private IBufferedCipher cipher;
- private CmsReadable readable;
-
- internal CmsEnvelopedSecureReadable(AlgorithmIdentifier algorithm, CmsReadable readable)
- {
- this.algorithm = algorithm;
- this.readable = readable;
- }
-
- public AlgorithmIdentifier Algorithm
- {
- get { return this.algorithm; }
- }
-
- public object CryptoObject
- {
- get { return this.cipher; }
- }
-
- public CmsReadable GetReadable(KeyParameter sKey)
- {
- try
- {
- this.cipher = CipherUtilities.GetCipher(this.algorithm.Algorithm);
-
- Asn1Encodable asn1Enc = this.algorithm.Parameters;
- Asn1Object asn1Params = asn1Enc == null ? null : asn1Enc.ToAsn1Object();
-
- ICipherParameters cipherParameters = sKey;
-
- if (asn1Params != null && !(asn1Params is Asn1Null))
- {
- cipherParameters = ParameterUtilities.GetCipherParameters(
- this.algorithm.Algorithm, cipherParameters, asn1Params);
- }
- else
- {
- string alg = this.algorithm.Algorithm.Id;
- if (alg.Equals(CmsEnvelopedDataGenerator.DesEde3Cbc)
- || alg.Equals(CmsEnvelopedDataGenerator.IdeaCbc)
- || alg.Equals(CmsEnvelopedDataGenerator.Cast5Cbc))
- {
- cipherParameters = new ParametersWithIV(cipherParameters, new byte[8]);
- }
- }
-
- cipher.Init(false, cipherParameters);
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("couldn't create cipher.", e);
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key invalid in message.", e);
- }
- catch (IOException e)
- {
- throw new CmsException("error decoding algorithm parameters.", e);
- }
-
- try
- {
- return new CmsProcessableInputStream(
- new CipherStream(readable.GetInputStream(), cipher, null));
- }
- catch (IOException e)
- {
- throw new CmsException("error reading content.", e);
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/cms/CMSException.cs b/BCCrypto/src/cms/CMSException.cs
deleted file mode 100644
index 29fe0a6..0000000
--- a/BCCrypto/src/cms/CMSException.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Cms
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class CmsException
- : Exception
- {
- public CmsException()
- {
- }
-
- public CmsException(
- string msg)
- : base(msg)
- {
- }
-
- public CmsException(
- string msg,
- Exception e)
- : base(msg, e)
- {
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSPBEKey.cs b/BCCrypto/src/cms/CMSPBEKey.cs
deleted file mode 100644
index e03307e..0000000
--- a/BCCrypto/src/cms/CMSPBEKey.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-//import javax.crypto.interfaces.PBEKey;
-
-namespace Org.BouncyCastle.Cms
-{
- public abstract class CmsPbeKey
- // TODO Create an equivalent interface somewhere?
- // : PBEKey
- : ICipherParameters
- {
- internal readonly char[] password;
- internal readonly byte[] salt;
- internal readonly int iterationCount;
-
- [Obsolete("Use version taking 'char[]' instead")]
- public CmsPbeKey(
- string password,
- byte[] salt,
- int iterationCount)
- : this(password.ToCharArray(), salt, iterationCount)
- {
- }
-
- [Obsolete("Use version taking 'char[]' instead")]
- public CmsPbeKey(
- string password,
- AlgorithmIdentifier keyDerivationAlgorithm)
- : this(password.ToCharArray(), keyDerivationAlgorithm)
- {
- }
-
- public CmsPbeKey(
- char[] password,
- byte[] salt,
- int iterationCount)
- {
- this.password = (char[])password.Clone();
- this.salt = Arrays.Clone(salt);
- this.iterationCount = iterationCount;
- }
-
- public CmsPbeKey(
- char[] password,
- AlgorithmIdentifier keyDerivationAlgorithm)
- {
- if (!keyDerivationAlgorithm.Algorithm.Equals(PkcsObjectIdentifiers.IdPbkdf2))
- throw new ArgumentException("Unsupported key derivation algorithm: "
- + keyDerivationAlgorithm.Algorithm);
-
- Pbkdf2Params kdfParams = Pbkdf2Params.GetInstance(
- keyDerivationAlgorithm.Parameters.ToAsn1Object());
-
- this.password = (char[])password.Clone();
- this.salt = kdfParams.GetSalt();
- this.iterationCount = kdfParams.IterationCount.IntValue;
- }
-
- ~CmsPbeKey()
- {
- Array.Clear(this.password, 0, this.password.Length);
- }
-
- [Obsolete("Will be removed")]
- public string Password
- {
- get { return new string(password); }
- }
-
- public byte[] Salt
- {
- get { return Arrays.Clone(salt); }
- }
-
- [Obsolete("Use 'Salt' property instead")]
- public byte[] GetSalt()
- {
- return Salt;
- }
-
- public int IterationCount
- {
- get { return iterationCount; }
- }
-
- public string Algorithm
- {
- get { return "PKCS5S2"; }
- }
-
- public string Format
- {
- get { return "RAW"; }
- }
-
- public byte[] GetEncoded()
- {
- return null;
- }
-
- internal abstract KeyParameter GetEncoded(string algorithmOid);
- }
-}
diff --git a/BCCrypto/src/cms/CMSProcessable.cs b/BCCrypto/src/cms/CMSProcessable.cs
deleted file mode 100644
index 41018d1..0000000
--- a/BCCrypto/src/cms/CMSProcessable.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Cms
-{
- public interface CmsProcessable
- {
- ///
- /// Generic routine to copy out the data we want processed.
- ///
- ///
- /// This routine may be called multiple times.
- ///
- void Write(Stream outStream);
-
- [Obsolete]
- object GetContent();
- }
-}
diff --git a/BCCrypto/src/cms/CMSProcessableByteArray.cs b/BCCrypto/src/cms/CMSProcessableByteArray.cs
deleted file mode 100644
index a6ab9b6..0000000
--- a/BCCrypto/src/cms/CMSProcessableByteArray.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * a holding class for a byte array of data to be processed.
- */
- public class CmsProcessableByteArray
- : CmsProcessable, CmsReadable
- {
- private readonly byte[] bytes;
-
- public CmsProcessableByteArray(byte[] bytes)
- {
- this.bytes = bytes;
- }
-
- public virtual Stream GetInputStream()
- {
- return new MemoryStream(bytes, false);
- }
-
- public virtual void Write(Stream zOut)
- {
- zOut.Write(bytes, 0, bytes.Length);
- }
-
- /// A clone of the byte array
- [Obsolete]
- public virtual object GetContent()
- {
- return bytes.Clone();
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSProcessableFile.cs b/BCCrypto/src/cms/CMSProcessableFile.cs
deleted file mode 100644
index c74d2a8..0000000
--- a/BCCrypto/src/cms/CMSProcessableFile.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-#if !PORTABLE || DOTNET
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * a holding class for a file of data to be processed.
- */
- public class CmsProcessableFile
- : CmsProcessable, CmsReadable
- {
- private const int DefaultBufSize = 32 * 1024;
-
- private readonly FileInfo _file;
- private readonly int _bufSize;
-
- public CmsProcessableFile(FileInfo file)
- : this(file, DefaultBufSize)
- {
- }
-
- public CmsProcessableFile(FileInfo file, int bufSize)
- {
- _file = file;
- _bufSize = bufSize;
- }
-
- public virtual Stream GetInputStream()
- {
- return new FileStream(_file.FullName, FileMode.Open, FileAccess.Read, FileShare.Read, _bufSize);
- }
-
- public virtual void Write(Stream zOut)
- {
- Stream inStr = GetInputStream();
- Streams.PipeAll(inStr, zOut);
- Platform.Dispose(inStr);
- }
-
- /// The file handle
- [Obsolete]
- public virtual object GetContent()
- {
- return _file;
- }
- }
-}
-#endif
diff --git a/BCCrypto/src/cms/CMSProcessableInputStream.cs b/BCCrypto/src/cms/CMSProcessableInputStream.cs
deleted file mode 100644
index b2abd6f..0000000
--- a/BCCrypto/src/cms/CMSProcessableInputStream.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Cms
-{
- public class CmsProcessableInputStream
- : CmsProcessable, CmsReadable
- {
- private readonly Stream input;
-
- private bool used = false;
-
- public CmsProcessableInputStream(Stream input)
- {
- this.input = input;
- }
-
- public virtual Stream GetInputStream()
- {
- CheckSingleUsage();
-
- return input;
- }
-
- public virtual void Write(Stream output)
- {
- CheckSingleUsage();
-
- Streams.PipeAll(input, output);
- Platform.Dispose(input);
- }
-
- [Obsolete]
- public virtual object GetContent()
- {
- return GetInputStream();
- }
-
- protected virtual void CheckSingleUsage()
- {
- lock (this)
- {
- if (used)
- throw new InvalidOperationException("CmsProcessableInputStream can only be used once");
-
- used = true;
- }
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSReadable.cs b/BCCrypto/src/cms/CMSReadable.cs
deleted file mode 100644
index ad83ba0..0000000
--- a/BCCrypto/src/cms/CMSReadable.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Cms
-{
- public interface CmsReadable
- {
- Stream GetInputStream();
- }
-}
diff --git a/BCCrypto/src/cms/CMSSecureReadable.cs b/BCCrypto/src/cms/CMSSecureReadable.cs
deleted file mode 100644
index 5ceac24..0000000
--- a/BCCrypto/src/cms/CMSSecureReadable.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Cms
-{
- internal interface CmsSecureReadable
- {
- AlgorithmIdentifier Algorithm { get; }
- object CryptoObject { get; }
- CmsReadable GetReadable(KeyParameter key);
- }
-}
diff --git a/BCCrypto/src/cms/CMSSignedData.cs b/BCCrypto/src/cms/CMSSignedData.cs
deleted file mode 100644
index 237c152..0000000
--- a/BCCrypto/src/cms/CMSSignedData.cs
+++ /dev/null
@@ -1,425 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * general class for handling a pkcs7-signature message.
- *
- * A simple example of usage - note, in the example below the validity of
- * the certificate isn't verified, just the fact that one of the certs
- * matches the given signer...
- *
- *
- * IX509Store certs = s.GetCertificates();
- * SignerInformationStore signers = s.GetSignerInfos();
- *
- * foreach (SignerInformation signer in signers.GetSigners())
- * {
- * ArrayList certList = new ArrayList(certs.GetMatches(signer.SignerID));
- * X509Certificate cert = (X509Certificate) certList[0];
- *
- * if (signer.Verify(cert.GetPublicKey()))
- * {
- * verified++;
- * }
- * }
- *
- */
- public class CmsSignedData
- {
- private static readonly CmsSignedHelper Helper = CmsSignedHelper.Instance;
-
- private readonly CmsProcessable signedContent;
- private SignedData signedData;
- private ContentInfo contentInfo;
- private SignerInformationStore signerInfoStore;
- private IX509Store attrCertStore;
- private IX509Store certificateStore;
- private IX509Store crlStore;
- private IDictionary hashes;
-
- private CmsSignedData(
- CmsSignedData c)
- {
- this.signedData = c.signedData;
- this.contentInfo = c.contentInfo;
- this.signedContent = c.signedContent;
- this.signerInfoStore = c.signerInfoStore;
- }
-
- public CmsSignedData(
- byte[] sigBlock)
- : this(CmsUtilities.ReadContentInfo(new MemoryStream(sigBlock, false)))
- {
- }
-
- public CmsSignedData(
- CmsProcessable signedContent,
- byte[] sigBlock)
- : this(signedContent, CmsUtilities.ReadContentInfo(new MemoryStream(sigBlock, false)))
- {
- }
-
- /**
- * Content with detached signature, digests precomputed
- *
- * @param hashes a map of precomputed digests for content indexed by name of hash.
- * @param sigBlock the signature object.
- */
- public CmsSignedData(
- IDictionary hashes,
- byte[] sigBlock)
- : this(hashes, CmsUtilities.ReadContentInfo(sigBlock))
- {
- }
-
- /**
- * base constructor - content with detached signature.
- *
- * @param signedContent the content that was signed.
- * @param sigData the signature object.
- */
- public CmsSignedData(
- CmsProcessable signedContent,
- Stream sigData)
- : this(signedContent, CmsUtilities.ReadContentInfo(sigData))
- {
- }
-
- /**
- * base constructor - with encapsulated content
- */
- public CmsSignedData(
- Stream sigData)
- : this(CmsUtilities.ReadContentInfo(sigData))
- {
- }
-
- public CmsSignedData(
- CmsProcessable signedContent,
- ContentInfo sigData)
- {
- this.signedContent = signedContent;
- this.contentInfo = sigData;
- this.signedData = SignedData.GetInstance(contentInfo.Content);
- }
-
- public CmsSignedData(
- IDictionary hashes,
- ContentInfo sigData)
- {
- this.hashes = hashes;
- this.contentInfo = sigData;
- this.signedData = SignedData.GetInstance(contentInfo.Content);
- }
-
- public CmsSignedData(
- ContentInfo sigData)
- {
- this.contentInfo = sigData;
- this.signedData = SignedData.GetInstance(contentInfo.Content);
-
- //
- // this can happen if the signed message is sent simply to send a
- // certificate chain.
- //
- if (signedData.EncapContentInfo.Content != null)
- {
- this.signedContent = new CmsProcessableByteArray(
- ((Asn1OctetString)(signedData.EncapContentInfo.Content)).GetOctets());
- }
-// else
-// {
-// this.signedContent = null;
-// }
- }
-
- /// Return the version number for this object.
- public int Version
- {
- get { return signedData.Version.Value.IntValue; }
- }
-
- /**
- * return the collection of signers that are associated with the
- * signatures for the message.
- */
- public SignerInformationStore GetSignerInfos()
- {
- if (signerInfoStore == null)
- {
- IList signerInfos = Platform.CreateArrayList();
- Asn1Set s = signedData.SignerInfos;
-
- foreach (object obj in s)
- {
- SignerInfo info = SignerInfo.GetInstance(obj);
- DerObjectIdentifier contentType = signedData.EncapContentInfo.ContentType;
-
- if (hashes == null)
- {
- signerInfos.Add(new SignerInformation(info, contentType, signedContent, null));
- }
- else
- {
- byte[] hash = (byte[])hashes[info.DigestAlgorithm.Algorithm.Id];
-
- signerInfos.Add(new SignerInformation(info, contentType, null, new BaseDigestCalculator(hash)));
- }
- }
-
- signerInfoStore = new SignerInformationStore(signerInfos);
- }
-
- return signerInfoStore;
- }
-
- /**
- * return a X509Store containing the attribute certificates, if any, contained
- * in this message.
- *
- * @param type type of store to create
- * @return a store of attribute certificates
- * @exception NoSuchStoreException if the store type isn't available.
- * @exception CmsException if a general exception prevents creation of the X509Store
- */
- public IX509Store GetAttributeCertificates(
- string type)
- {
- if (attrCertStore == null)
- {
- attrCertStore = Helper.CreateAttributeStore(type, signedData.Certificates);
- }
-
- return attrCertStore;
- }
-
- /**
- * return a X509Store containing the public key certificates, if any, contained
- * in this message.
- *
- * @param type type of store to create
- * @return a store of public key certificates
- * @exception NoSuchStoreException if the store type isn't available.
- * @exception CmsException if a general exception prevents creation of the X509Store
- */
- public IX509Store GetCertificates(
- string type)
- {
- if (certificateStore == null)
- {
- certificateStore = Helper.CreateCertificateStore(type, signedData.Certificates);
- }
-
- return certificateStore;
- }
-
- /**
- * return a X509Store containing CRLs, if any, contained
- * in this message.
- *
- * @param type type of store to create
- * @return a store of CRLs
- * @exception NoSuchStoreException if the store type isn't available.
- * @exception CmsException if a general exception prevents creation of the X509Store
- */
- public IX509Store GetCrls(
- string type)
- {
- if (crlStore == null)
- {
- crlStore = Helper.CreateCrlStore(type, signedData.CRLs);
- }
-
- return crlStore;
- }
-
- [Obsolete("Use 'SignedContentType' property instead.")]
- public string SignedContentTypeOid
- {
- get { return signedData.EncapContentInfo.ContentType.Id; }
- }
-
- ///
- /// Return the DerObjectIdentifier associated with the encapsulated
- /// content info structure carried in the signed data.
- ///
- public DerObjectIdentifier SignedContentType
- {
- get { return signedData.EncapContentInfo.ContentType; }
- }
-
- public CmsProcessable SignedContent
- {
- get { return signedContent; }
- }
-
- /**
- * return the ContentInfo
- */
- public ContentInfo ContentInfo
- {
- get { return contentInfo; }
- }
-
- /**
- * return the ASN.1 encoded representation of this object.
- */
- public byte[] GetEncoded()
- {
- return contentInfo.GetEncoded();
- }
-
- /**
- * Replace the signerinformation store associated with this
- * CmsSignedData object with the new one passed in. You would
- * probably only want to do this if you wanted to change the unsigned
- * attributes associated with a signer, or perhaps delete one.
- *
- * @param signedData the signed data object to be used as a base.
- * @param signerInformationStore the new signer information store to use.
- * @return a new signed data object.
- */
- public static CmsSignedData ReplaceSigners(
- CmsSignedData signedData,
- SignerInformationStore signerInformationStore)
- {
- //
- // copy
- //
- CmsSignedData cms = new CmsSignedData(signedData);
-
- //
- // replace the store
- //
- cms.signerInfoStore = signerInformationStore;
-
- //
- // replace the signers in the SignedData object
- //
- Asn1EncodableVector digestAlgs = new Asn1EncodableVector();
- Asn1EncodableVector vec = new Asn1EncodableVector();
-
- foreach (SignerInformation signer in signerInformationStore.GetSigners())
- {
- digestAlgs.Add(Helper.FixAlgID(signer.DigestAlgorithmID));
- vec.Add(signer.ToSignerInfo());
- }
-
- Asn1Set digests = new DerSet(digestAlgs);
- Asn1Set signers = new DerSet(vec);
- Asn1Sequence sD = (Asn1Sequence)signedData.signedData.ToAsn1Object();
-
- //
- // signers are the last item in the sequence.
- //
- vec = new Asn1EncodableVector(
- sD[0], // version
- digests);
-
- for (int i = 2; i != sD.Count - 1; i++)
- {
- vec.Add(sD[i]);
- }
-
- vec.Add(signers);
-
- cms.signedData = SignedData.GetInstance(new BerSequence(vec));
-
- //
- // replace the contentInfo with the new one
- //
- cms.contentInfo = new ContentInfo(cms.contentInfo.ContentType, cms.signedData);
-
- return cms;
- }
-
- /**
- * Replace the certificate and CRL information associated with this
- * CmsSignedData object with the new one passed in.
- *
- * @param signedData the signed data object to be used as a base.
- * @param x509Certs the new certificates to be used.
- * @param x509Crls the new CRLs to be used.
- * @return a new signed data object.
- * @exception CmsException if there is an error processing the stores
- */
- public static CmsSignedData ReplaceCertificatesAndCrls(
- CmsSignedData signedData,
- IX509Store x509Certs,
- IX509Store x509Crls,
- IX509Store x509AttrCerts)
- {
- if (x509AttrCerts != null)
- throw Platform.CreateNotImplementedException("Currently can't replace attribute certificates");
-
- //
- // copy
- //
- CmsSignedData cms = new CmsSignedData(signedData);
-
- //
- // replace the certs and crls in the SignedData object
- //
- Asn1Set certs = null;
- try
- {
- Asn1Set asn1Set = CmsUtilities.CreateBerSetFromList(
- CmsUtilities.GetCertificatesFromStore(x509Certs));
-
- if (asn1Set.Count != 0)
- {
- certs = asn1Set;
- }
- }
- catch (X509StoreException e)
- {
- throw new CmsException("error getting certificates from store", e);
- }
-
- Asn1Set crls = null;
- try
- {
- Asn1Set asn1Set = CmsUtilities.CreateBerSetFromList(
- CmsUtilities.GetCrlsFromStore(x509Crls));
-
- if (asn1Set.Count != 0)
- {
- crls = asn1Set;
- }
- }
- catch (X509StoreException e)
- {
- throw new CmsException("error getting CRLs from store", e);
- }
-
- //
- // replace the CMS structure.
- //
- SignedData old = signedData.signedData;
- cms.signedData = new SignedData(
- old.DigestAlgorithms,
- old.EncapContentInfo,
- certs,
- crls,
- old.SignerInfos);
-
- //
- // replace the contentInfo with the new one
- //
- cms.contentInfo = new ContentInfo(cms.contentInfo.ContentType, cms.signedData);
-
- return cms;
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSSignedDataGenerator.cs b/BCCrypto/src/cms/CMSSignedDataGenerator.cs
deleted file mode 100644
index f63ed87..0000000
--- a/BCCrypto/src/cms/CMSSignedDataGenerator.cs
+++ /dev/null
@@ -1,585 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.Crypto.Operators;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * general class for generating a pkcs7-signature message.
- *
- * A simple example of usage.
- *
- *
- * IX509Store certs...
- * IX509Store crls...
- * CmsSignedDataGenerator gen = new CmsSignedDataGenerator();
- *
- * gen.AddSigner(privKey, cert, CmsSignedGenerator.DigestSha1);
- * gen.AddCertificates(certs);
- * gen.AddCrls(crls);
- *
- * CmsSignedData data = gen.Generate(content);
- *
- *
- */
- public class CmsSignedDataGenerator
- : CmsSignedGenerator
- {
- private static readonly CmsSignedHelper Helper = CmsSignedHelper.Instance;
-
- private readonly IList signerInfs = Platform.CreateArrayList();
-
- private class SignerInf
- {
- private readonly CmsSignedGenerator outer;
-
- private readonly ISignatureFactory sigCalc;
- private readonly SignerIdentifier signerIdentifier;
- private readonly string digestOID;
- private readonly string encOID;
- private readonly CmsAttributeTableGenerator sAttr;
- private readonly CmsAttributeTableGenerator unsAttr;
- private readonly Asn1.Cms.AttributeTable baseSignedTable;
-
- internal SignerInf(
- CmsSignedGenerator outer,
- AsymmetricKeyParameter key,
- SignerIdentifier signerIdentifier,
- string digestOID,
- string encOID,
- CmsAttributeTableGenerator sAttr,
- CmsAttributeTableGenerator unsAttr,
- Asn1.Cms.AttributeTable baseSignedTable)
- {
- string digestName = Helper.GetDigestAlgName(digestOID);
-
- string signatureName = digestName + "with" + Helper.GetEncryptionAlgName(encOID);
-
- this.outer = outer;
- this.sigCalc = new Asn1SignatureFactory(signatureName, key);
- this.signerIdentifier = signerIdentifier;
- this.digestOID = digestOID;
- this.encOID = encOID;
- this.sAttr = sAttr;
- this.unsAttr = unsAttr;
- this.baseSignedTable = baseSignedTable;
- }
-
- internal SignerInf(
- CmsSignedGenerator outer,
- ISignatureFactory sigCalc,
- SignerIdentifier signerIdentifier,
- CmsAttributeTableGenerator sAttr,
- CmsAttributeTableGenerator unsAttr,
- Asn1.Cms.AttributeTable baseSignedTable)
- {
- this.outer = outer;
- this.sigCalc = sigCalc;
- this.signerIdentifier = signerIdentifier;
- this.digestOID = new DefaultDigestAlgorithmIdentifierFinder().find((AlgorithmIdentifier)sigCalc.AlgorithmDetails).Algorithm.Id;
- this.encOID = ((AlgorithmIdentifier)sigCalc.AlgorithmDetails).Algorithm.Id;
- this.sAttr = sAttr;
- this.unsAttr = unsAttr;
- this.baseSignedTable = baseSignedTable;
- }
-
- internal AlgorithmIdentifier DigestAlgorithmID
- {
- get { return new AlgorithmIdentifier(new DerObjectIdentifier(digestOID), DerNull.Instance); }
- }
-
- internal CmsAttributeTableGenerator SignedAttributes
- {
- get { return sAttr; }
- }
-
- internal CmsAttributeTableGenerator UnsignedAttributes
- {
- get { return unsAttr; }
- }
-
- internal SignerInfo ToSignerInfo(
- DerObjectIdentifier contentType,
- CmsProcessable content,
- SecureRandom random)
- {
- AlgorithmIdentifier digAlgId = DigestAlgorithmID;
- string digestName = Helper.GetDigestAlgName(digestOID);
-
- string signatureName = digestName + "with" + Helper.GetEncryptionAlgName(encOID);
-
- byte[] hash;
- if (outer._digests.Contains(digestOID))
- {
- hash = (byte[])outer._digests[digestOID];
- }
- else
- {
- IDigest dig = Helper.GetDigestInstance(digestName);
- if (content != null)
- {
- content.Write(new DigOutputStream(dig));
- }
- hash = DigestUtilities.DoFinal(dig);
- outer._digests.Add(digestOID, hash.Clone());
- }
-
- IStreamCalculator calculator = sigCalc.CreateCalculator();
-
-#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE
- Stream sigStr = calculator.Stream;
-#else
- Stream sigStr = new BufferedStream(calculator.Stream);
-#endif
-
- Asn1Set signedAttr = null;
- if (sAttr != null)
- {
- IDictionary parameters = outer.GetBaseParameters(contentType, digAlgId, hash);
-
-// Asn1.Cms.AttributeTable signed = sAttr.GetAttributes(Collections.unmodifiableMap(parameters));
- Asn1.Cms.AttributeTable signed = sAttr.GetAttributes(parameters);
-
- if (contentType == null) //counter signature
- {
- if (signed != null && signed[CmsAttributes.ContentType] != null)
- {
- IDictionary tmpSigned = signed.ToDictionary();
- tmpSigned.Remove(CmsAttributes.ContentType);
- signed = new Asn1.Cms.AttributeTable(tmpSigned);
- }
- }
-
- // TODO Validate proposed signed attributes
-
- signedAttr = outer.GetAttributeSet(signed);
-
- // sig must be composed from the DER encoding.
- new DerOutputStream(sigStr).WriteObject(signedAttr);
- }
- else if (content != null)
- {
- // TODO Use raw signature of the hash value instead
- content.Write(sigStr);
- }
-
- Platform.Dispose(sigStr);
- byte[] sigBytes = ((IBlockResult)calculator.GetResult()).Collect();
-
- Asn1Set unsignedAttr = null;
- if (unsAttr != null)
- {
- IDictionary baseParameters = outer.GetBaseParameters(contentType, digAlgId, hash);
- baseParameters[CmsAttributeTableParameter.Signature] = sigBytes.Clone();
-
-// Asn1.Cms.AttributeTable unsigned = unsAttr.GetAttributes(Collections.unmodifiableMap(baseParameters));
- Asn1.Cms.AttributeTable unsigned = unsAttr.GetAttributes(baseParameters);
-
- // TODO Validate proposed unsigned attributes
-
- unsignedAttr = outer.GetAttributeSet(unsigned);
- }
-
- // TODO[RSAPSS] Need the ability to specify non-default parameters
- Asn1Encodable sigX509Parameters = SignerUtilities.GetDefaultX509Parameters(signatureName);
- AlgorithmIdentifier encAlgId = Helper.GetEncAlgorithmIdentifier(
- new DerObjectIdentifier(encOID), sigX509Parameters);
-
- return new SignerInfo(signerIdentifier, digAlgId,
- signedAttr, encAlgId, new DerOctetString(sigBytes), unsignedAttr);
- }
- }
-
- public CmsSignedDataGenerator()
- {
- }
-
- /// Constructor allowing specific source of randomness
- /// Instance of SecureRandom to use.
- public CmsSignedDataGenerator(
- SecureRandom rand)
- : base(rand)
- {
- }
-
- /**
- * add a signer - no attributes other than the default ones will be
- * provided here.
- *
- * @param key signing key to use
- * @param cert certificate containing corresponding public key
- * @param digestOID digest algorithm OID
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- X509Certificate cert,
- string digestOID)
- {
- AddSigner(privateKey, cert, Helper.GetEncOid(privateKey, digestOID), digestOID);
- }
-
- /**
- * add a signer, specifying the digest encryption algorithm to use - no attributes other than the default ones will be
- * provided here.
- *
- * @param key signing key to use
- * @param cert certificate containing corresponding public key
- * @param encryptionOID digest encryption algorithm OID
- * @param digestOID digest algorithm OID
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- X509Certificate cert,
- string encryptionOID,
- string digestOID)
- {
- doAddSigner(privateKey, GetSignerIdentifier(cert), encryptionOID, digestOID,
- new DefaultSignedAttributeTableGenerator(), null, null);
- }
-
- /**
- * add a signer - no attributes other than the default ones will be
- * provided here.
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- byte[] subjectKeyID,
- string digestOID)
- {
- AddSigner(privateKey, subjectKeyID, Helper.GetEncOid(privateKey, digestOID), digestOID);
- }
-
- /**
- * add a signer, specifying the digest encryption algorithm to use - no attributes other than the default ones will be
- * provided here.
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- byte[] subjectKeyID,
- string encryptionOID,
- string digestOID)
- {
- doAddSigner(privateKey, GetSignerIdentifier(subjectKeyID), encryptionOID, digestOID,
- new DefaultSignedAttributeTableGenerator(), null, null);
- }
-
- /**
- * add a signer with extra signed/unsigned attributes.
- *
- * @param key signing key to use
- * @param cert certificate containing corresponding public key
- * @param digestOID digest algorithm OID
- * @param signedAttr table of attributes to be included in signature
- * @param unsignedAttr table of attributes to be included as unsigned
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- X509Certificate cert,
- string digestOID,
- Asn1.Cms.AttributeTable signedAttr,
- Asn1.Cms.AttributeTable unsignedAttr)
- {
- AddSigner(privateKey, cert, Helper.GetEncOid(privateKey, digestOID), digestOID,
- signedAttr, unsignedAttr);
- }
-
- /**
- * add a signer, specifying the digest encryption algorithm, with extra signed/unsigned attributes.
- *
- * @param key signing key to use
- * @param cert certificate containing corresponding public key
- * @param encryptionOID digest encryption algorithm OID
- * @param digestOID digest algorithm OID
- * @param signedAttr table of attributes to be included in signature
- * @param unsignedAttr table of attributes to be included as unsigned
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- X509Certificate cert,
- string encryptionOID,
- string digestOID,
- Asn1.Cms.AttributeTable signedAttr,
- Asn1.Cms.AttributeTable unsignedAttr)
- {
- doAddSigner(privateKey, GetSignerIdentifier(cert), encryptionOID, digestOID,
- new DefaultSignedAttributeTableGenerator(signedAttr),
- new SimpleAttributeTableGenerator(unsignedAttr),
- signedAttr);
- }
-
- /**
- * add a signer with extra signed/unsigned attributes.
- *
- * @param key signing key to use
- * @param subjectKeyID subjectKeyID of corresponding public key
- * @param digestOID digest algorithm OID
- * @param signedAttr table of attributes to be included in signature
- * @param unsignedAttr table of attributes to be included as unsigned
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- byte[] subjectKeyID,
- string digestOID,
- Asn1.Cms.AttributeTable signedAttr,
- Asn1.Cms.AttributeTable unsignedAttr)
- {
- AddSigner(privateKey, subjectKeyID, Helper.GetEncOid(privateKey, digestOID), digestOID,
- signedAttr, unsignedAttr);
- }
-
- /**
- * add a signer, specifying the digest encryption algorithm, with extra signed/unsigned attributes.
- *
- * @param key signing key to use
- * @param subjectKeyID subjectKeyID of corresponding public key
- * @param encryptionOID digest encryption algorithm OID
- * @param digestOID digest algorithm OID
- * @param signedAttr table of attributes to be included in signature
- * @param unsignedAttr table of attributes to be included as unsigned
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- byte[] subjectKeyID,
- string encryptionOID,
- string digestOID,
- Asn1.Cms.AttributeTable signedAttr,
- Asn1.Cms.AttributeTable unsignedAttr)
- {
- doAddSigner(privateKey, GetSignerIdentifier(subjectKeyID), encryptionOID, digestOID,
- new DefaultSignedAttributeTableGenerator(signedAttr),
- new SimpleAttributeTableGenerator(unsignedAttr),
- signedAttr);
- }
-
- /**
- * add a signer with extra signed/unsigned attributes based on generators.
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- X509Certificate cert,
- string digestOID,
- CmsAttributeTableGenerator signedAttrGen,
- CmsAttributeTableGenerator unsignedAttrGen)
- {
- AddSigner(privateKey, cert, Helper.GetEncOid(privateKey, digestOID), digestOID,
- signedAttrGen, unsignedAttrGen);
- }
-
- /**
- * add a signer, specifying the digest encryption algorithm, with extra signed/unsigned attributes based on generators.
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- X509Certificate cert,
- string encryptionOID,
- string digestOID,
- CmsAttributeTableGenerator signedAttrGen,
- CmsAttributeTableGenerator unsignedAttrGen)
- {
- doAddSigner(privateKey, GetSignerIdentifier(cert), encryptionOID, digestOID, signedAttrGen,
- unsignedAttrGen, null);
- }
-
- /**
- * add a signer with extra signed/unsigned attributes based on generators.
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- byte[] subjectKeyID,
- string digestOID,
- CmsAttributeTableGenerator signedAttrGen,
- CmsAttributeTableGenerator unsignedAttrGen)
- {
- AddSigner(privateKey, subjectKeyID, Helper.GetEncOid(privateKey, digestOID), digestOID,
- signedAttrGen, unsignedAttrGen);
- }
-
- /**
- * add a signer, including digest encryption algorithm, with extra signed/unsigned attributes based on generators.
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- byte[] subjectKeyID,
- string encryptionOID,
- string digestOID,
- CmsAttributeTableGenerator signedAttrGen,
- CmsAttributeTableGenerator unsignedAttrGen)
- {
- doAddSigner(privateKey, GetSignerIdentifier(subjectKeyID), encryptionOID, digestOID,
- signedAttrGen, unsignedAttrGen, null);
- }
-
- public void AddSignerInfoGenerator(SignerInfoGenerator signerInfoGenerator)
- {
- signerInfs.Add(new SignerInf(this, signerInfoGenerator.contentSigner, signerInfoGenerator.sigId,
- signerInfoGenerator.signedGen, signerInfoGenerator.unsignedGen, null));
- }
-
- private void doAddSigner(
- AsymmetricKeyParameter privateKey,
- SignerIdentifier signerIdentifier,
- string encryptionOID,
- string digestOID,
- CmsAttributeTableGenerator signedAttrGen,
- CmsAttributeTableGenerator unsignedAttrGen,
- Asn1.Cms.AttributeTable baseSignedTable)
- {
- signerInfs.Add(new SignerInf(this, privateKey, signerIdentifier, digestOID, encryptionOID,
- signedAttrGen, unsignedAttrGen, baseSignedTable));
- }
-
- /**
- * generate a signed object that for a CMS Signed Data object
- */
- public CmsSignedData Generate(
- CmsProcessable content)
- {
- return Generate(content, false);
- }
-
- /**
- * generate a signed object that for a CMS Signed Data
- * object - if encapsulate is true a copy
- * of the message will be included in the signature. The content type
- * is set according to the OID represented by the string signedContentType.
- */
- public CmsSignedData Generate(
- string signedContentType,
- // FIXME Avoid accessing more than once to support CmsProcessableInputStream
- CmsProcessable content,
- bool encapsulate)
- {
- Asn1EncodableVector digestAlgs = new Asn1EncodableVector();
- Asn1EncodableVector signerInfos = new Asn1EncodableVector();
-
- _digests.Clear(); // clear the current preserved digest state
-
- //
- // add the precalculated SignerInfo objects.
- //
- foreach (SignerInformation signer in _signers)
- {
- digestAlgs.Add(Helper.FixAlgID(signer.DigestAlgorithmID));
-
- // TODO Verify the content type and calculated digest match the precalculated SignerInfo
- signerInfos.Add(signer.ToSignerInfo());
- }
-
- //
- // add the SignerInfo objects
- //
- bool isCounterSignature = (signedContentType == null);
-
- DerObjectIdentifier contentTypeOid = isCounterSignature
- ? null
- : new DerObjectIdentifier(signedContentType);
-
- foreach (SignerInf signer in signerInfs)
- {
- try
- {
- digestAlgs.Add(signer.DigestAlgorithmID);
- signerInfos.Add(signer.ToSignerInfo(contentTypeOid, content, rand));
- }
- catch (IOException e)
- {
- throw new CmsException("encoding error.", e);
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key inappropriate for signature.", e);
- }
- catch (SignatureException e)
- {
- throw new CmsException("error creating signature.", e);
- }
- catch (CertificateEncodingException e)
- {
- throw new CmsException("error creating sid.", e);
- }
- }
-
- Asn1Set certificates = null;
-
- if (_certs.Count != 0)
- {
- certificates = CmsUtilities.CreateBerSetFromList(_certs);
- }
-
- Asn1Set certrevlist = null;
-
- if (_crls.Count != 0)
- {
- certrevlist = CmsUtilities.CreateBerSetFromList(_crls);
- }
-
- Asn1OctetString octs = null;
- if (encapsulate)
- {
- MemoryStream bOut = new MemoryStream();
- if (content != null)
- {
- try
- {
- content.Write(bOut);
- }
- catch (IOException e)
- {
- throw new CmsException("encapsulation error.", e);
- }
- }
- octs = new BerOctetString(bOut.ToArray());
- }
-
- ContentInfo encInfo = new ContentInfo(contentTypeOid, octs);
-
- SignedData sd = new SignedData(
- new DerSet(digestAlgs),
- encInfo,
- certificates,
- certrevlist,
- new DerSet(signerInfos));
-
- ContentInfo contentInfo = new ContentInfo(CmsObjectIdentifiers.SignedData, sd);
-
- return new CmsSignedData(content, contentInfo);
- }
-
- /**
- * generate a signed object that for a CMS Signed Data
- * object - if encapsulate is true a copy
- * of the message will be included in the signature with the
- * default content type "data".
- */
- public CmsSignedData Generate(
- CmsProcessable content,
- bool encapsulate)
- {
- return this.Generate(Data, content, encapsulate);
- }
-
- /**
- * generate a set of one or more SignerInformation objects representing counter signatures on
- * the passed in SignerInformation object.
- *
- * @param signer the signer to be countersigned
- * @param sigProvider the provider to be used for counter signing.
- * @return a store containing the signers.
- */
- public SignerInformationStore GenerateCounterSigners(
- SignerInformation signer)
- {
- return this.Generate(null, new CmsProcessableByteArray(signer.GetSignature()), false).GetSignerInfos();
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSSignedDataParser.cs b/BCCrypto/src/cms/CMSSignedDataParser.cs
deleted file mode 100644
index fb51ab1..0000000
--- a/BCCrypto/src/cms/CMSSignedDataParser.cs
+++ /dev/null
@@ -1,450 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.IO;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * Parsing class for an CMS Signed Data object from an input stream.
- *
- * Note: that because we are in a streaming mode only one signer can be tried and it is important
- * that the methods on the parser are called in the appropriate order.
- *
- *
- * A simple example of usage for an encapsulated signature.
- *
- *
- * Two notes: first, in the example below the validity of
- * the certificate isn't verified, just the fact that one of the certs
- * matches the given signer, and, second, because we are in a streaming
- * mode the order of the operations is important.
- *
- *
- * CmsSignedDataParser sp = new CmsSignedDataParser(encapSigData);
- *
- * sp.GetSignedContent().Drain();
- *
- * IX509Store certs = sp.GetCertificates();
- * SignerInformationStore signers = sp.GetSignerInfos();
- *
- * foreach (SignerInformation signer in signers.GetSigners())
- * {
- * ArrayList certList = new ArrayList(certs.GetMatches(signer.SignerID));
- * X509Certificate cert = (X509Certificate) certList[0];
- *
- * Console.WriteLine("verify returns: " + signer.Verify(cert));
- * }
- *
- * Note also: this class does not introduce buffering - if you are processing large files you should create
- * the parser with:
- *
- * CmsSignedDataParser ep = new CmsSignedDataParser(new BufferedInputStream(encapSigData, bufSize));
- *
- * where bufSize is a suitably large buffer size.
- */
- public class CmsSignedDataParser
- : CmsContentInfoParser
- {
- private static readonly CmsSignedHelper Helper = CmsSignedHelper.Instance;
-
- private SignedDataParser _signedData;
- private DerObjectIdentifier _signedContentType;
- private CmsTypedStream _signedContent;
- private IDictionary _digests;
- private ISet _digestOids;
-
- private SignerInformationStore _signerInfoStore;
- private Asn1Set _certSet, _crlSet;
- private bool _isCertCrlParsed;
- private IX509Store _attributeStore;
- private IX509Store _certificateStore;
- private IX509Store _crlStore;
-
- public CmsSignedDataParser(
- byte[] sigBlock)
- : this(new MemoryStream(sigBlock, false))
- {
- }
-
- public CmsSignedDataParser(
- CmsTypedStream signedContent,
- byte[] sigBlock)
- : this(signedContent, new MemoryStream(sigBlock, false))
- {
- }
-
- /**
- * base constructor - with encapsulated content
- */
- public CmsSignedDataParser(
- Stream sigData)
- : this(null, sigData)
- {
- }
-
- /**
- * base constructor
- *
- * @param signedContent the content that was signed.
- * @param sigData the signature object.
- */
- public CmsSignedDataParser(
- CmsTypedStream signedContent,
- Stream sigData)
- : base(sigData)
- {
- try
- {
- this._signedContent = signedContent;
- this._signedData = SignedDataParser.GetInstance(this.contentInfo.GetContent(Asn1Tags.Sequence));
- this._digests = Platform.CreateHashtable();
- this._digestOids = new HashSet();
-
- Asn1SetParser digAlgs = _signedData.GetDigestAlgorithms();
- IAsn1Convertible o;
-
- while ((o = digAlgs.ReadObject()) != null)
- {
- AlgorithmIdentifier id = AlgorithmIdentifier.GetInstance(o.ToAsn1Object());
-
- try
- {
- string digestOid = id.Algorithm.Id;
- string digestName = Helper.GetDigestAlgName(digestOid);
-
- if (!this._digests.Contains(digestName))
- {
- this._digests[digestName] = Helper.GetDigestInstance(digestName);
- this._digestOids.Add(digestOid);
- }
- }
- catch (SecurityUtilityException)
- {
- // TODO Should do something other than ignore it
- }
- }
-
- //
- // If the message is simply a certificate chain message GetContent() may return null.
- //
- ContentInfoParser cont = _signedData.GetEncapContentInfo();
- Asn1OctetStringParser octs = (Asn1OctetStringParser)
- cont.GetContent(Asn1Tags.OctetString);
-
- if (octs != null)
- {
- CmsTypedStream ctStr = new CmsTypedStream(
- cont.ContentType.Id, octs.GetOctetStream());
-
- if (_signedContent == null)
- {
- this._signedContent = ctStr;
- }
- else
- {
- //
- // content passed in, need to read past empty encapsulated content info object if present
- //
- ctStr.Drain();
- }
- }
-
- _signedContentType = _signedContent == null
- ? cont.ContentType
- : new DerObjectIdentifier(_signedContent.ContentType);
- }
- catch (IOException e)
- {
- throw new CmsException("io exception: " + e.Message, e);
- }
- }
-
- /**
- * Return the version number for the SignedData object
- *
- * @return the version number
- */
- public int Version
- {
- get { return _signedData.Version.Value.IntValue; }
- }
-
- public ISet DigestOids
- {
- get { return new HashSet(_digestOids); }
- }
-
- /**
- * return the collection of signers that are associated with the
- * signatures for the message.
- * @throws CmsException
- */
- public SignerInformationStore GetSignerInfos()
- {
- if (_signerInfoStore == null)
- {
- PopulateCertCrlSets();
-
- IList signerInfos = Platform.CreateArrayList();
- IDictionary hashes = Platform.CreateHashtable();
-
- foreach (object digestKey in _digests.Keys)
- {
- hashes[digestKey] = DigestUtilities.DoFinal(
- (IDigest)_digests[digestKey]);
- }
-
- try
- {
- Asn1SetParser s = _signedData.GetSignerInfos();
- IAsn1Convertible o;
-
- while ((o = s.ReadObject()) != null)
- {
- SignerInfo info = SignerInfo.GetInstance(o.ToAsn1Object());
- string digestName = Helper.GetDigestAlgName(
- info.DigestAlgorithm.Algorithm.Id);
-
- byte[] hash = (byte[]) hashes[digestName];
-
- signerInfos.Add(new SignerInformation(info, _signedContentType, null, new BaseDigestCalculator(hash)));
- }
- }
- catch (IOException e)
- {
- throw new CmsException("io exception: " + e.Message, e);
- }
-
- _signerInfoStore = new SignerInformationStore(signerInfos);
- }
-
- return _signerInfoStore;
- }
-
- /**
- * return a X509Store containing the attribute certificates, if any, contained
- * in this message.
- *
- * @param type type of store to create
- * @return a store of attribute certificates
- * @exception org.bouncycastle.x509.NoSuchStoreException if the store type isn't available.
- * @exception CmsException if a general exception prevents creation of the X509Store
- */
- public IX509Store GetAttributeCertificates(
- string type)
- {
- if (_attributeStore == null)
- {
- PopulateCertCrlSets();
-
- _attributeStore = Helper.CreateAttributeStore(type, _certSet);
- }
-
- return _attributeStore;
- }
-
- /**
- * return a X509Store containing the public key certificates, if any, contained
- * in this message.
- *
- * @param type type of store to create
- * @return a store of public key certificates
- * @exception NoSuchStoreException if the store type isn't available.
- * @exception CmsException if a general exception prevents creation of the X509Store
- */
- public IX509Store GetCertificates(
- string type)
- {
- if (_certificateStore == null)
- {
- PopulateCertCrlSets();
-
- _certificateStore = Helper.CreateCertificateStore(type, _certSet);
- }
-
- return _certificateStore;
- }
-
- /**
- * return a X509Store containing CRLs, if any, contained
- * in this message.
- *
- * @param type type of store to create
- * @return a store of CRLs
- * @exception NoSuchStoreException if the store type isn't available.
- * @exception CmsException if a general exception prevents creation of the X509Store
- */
- public IX509Store GetCrls(
- string type)
- {
- if (_crlStore == null)
- {
- PopulateCertCrlSets();
-
- _crlStore = Helper.CreateCrlStore(type, _crlSet);
- }
-
- return _crlStore;
- }
-
- private void PopulateCertCrlSets()
- {
- if (_isCertCrlParsed)
- return;
-
- _isCertCrlParsed = true;
-
- try
- {
- // care! Streaming - Must process the GetCertificates() result before calling GetCrls()
- _certSet = GetAsn1Set(_signedData.GetCertificates());
- _crlSet = GetAsn1Set(_signedData.GetCrls());
- }
- catch (IOException e)
- {
- throw new CmsException("problem parsing cert/crl sets", e);
- }
- }
-
- ///
- /// Return the DerObjectIdentifier associated with the encapsulated
- /// content info structure carried in the signed data.
- ///
- public DerObjectIdentifier SignedContentType
- {
- get { return _signedContentType; }
- }
-
- public CmsTypedStream GetSignedContent()
- {
- if (_signedContent == null)
- {
- return null;
- }
-
- Stream digStream = _signedContent.ContentStream;
-
- foreach (IDigest digest in _digests.Values)
- {
- digStream = new DigestStream(digStream, digest, null);
- }
-
- return new CmsTypedStream(_signedContent.ContentType, digStream);
- }
-
- /**
- * Replace the signerinformation store associated with the passed
- * in message contained in the stream original with the new one passed in.
- * You would probably only want to do this if you wanted to change the unsigned
- * attributes associated with a signer, or perhaps delete one.
- *
- * The output stream is returned unclosed.
- *
- * @param original the signed data stream to be used as a base.
- * @param signerInformationStore the new signer information store to use.
- * @param out the stream to Write the new signed data object to.
- * @return out.
- */
- public static Stream ReplaceSigners(
- Stream original,
- SignerInformationStore signerInformationStore,
- Stream outStr)
- {
- // NB: SecureRandom would be ignored since using existing signatures only
- CmsSignedDataStreamGenerator gen = new CmsSignedDataStreamGenerator();
- CmsSignedDataParser parser = new CmsSignedDataParser(original);
-
-// gen.AddDigests(parser.DigestOids);
- gen.AddSigners(signerInformationStore);
-
- CmsTypedStream signedContent = parser.GetSignedContent();
- bool encapsulate = (signedContent != null);
- Stream contentOut = gen.Open(outStr, parser.SignedContentType.Id, encapsulate);
- if (encapsulate)
- {
- Streams.PipeAll(signedContent.ContentStream, contentOut);
- }
-
- gen.AddAttributeCertificates(parser.GetAttributeCertificates("Collection"));
- gen.AddCertificates(parser.GetCertificates("Collection"));
- gen.AddCrls(parser.GetCrls("Collection"));
-
-// gen.AddSigners(parser.GetSignerInfos());
-
- Platform.Dispose(contentOut);
-
- return outStr;
- }
-
- /**
- * Replace the certificate and CRL information associated with this
- * CMSSignedData object with the new one passed in.
- *
- * The output stream is returned unclosed.
- *
- * @param original the signed data stream to be used as a base.
- * @param certsAndCrls the new certificates and CRLs to be used.
- * @param out the stream to Write the new signed data object to.
- * @return out.
- * @exception CmsException if there is an error processing the CertStore
- */
- public static Stream ReplaceCertificatesAndCrls(
- Stream original,
- IX509Store x509Certs,
- IX509Store x509Crls,
- IX509Store x509AttrCerts,
- Stream outStr)
- {
- // NB: SecureRandom would be ignored since using existing signatures only
- CmsSignedDataStreamGenerator gen = new CmsSignedDataStreamGenerator();
- CmsSignedDataParser parser = new CmsSignedDataParser(original);
-
- gen.AddDigests(parser.DigestOids);
-
- CmsTypedStream signedContent = parser.GetSignedContent();
- bool encapsulate = (signedContent != null);
- Stream contentOut = gen.Open(outStr, parser.SignedContentType.Id, encapsulate);
- if (encapsulate)
- {
- Streams.PipeAll(signedContent.ContentStream, contentOut);
- }
-
-// gen.AddAttributeCertificates(parser.GetAttributeCertificates("Collection"));
-// gen.AddCertificates(parser.GetCertificates("Collection"));
-// gen.AddCrls(parser.GetCrls("Collection"));
- if (x509AttrCerts != null)
- gen.AddAttributeCertificates(x509AttrCerts);
- if (x509Certs != null)
- gen.AddCertificates(x509Certs);
- if (x509Crls != null)
- gen.AddCrls(x509Crls);
-
- gen.AddSigners(parser.GetSignerInfos());
-
- Platform.Dispose(contentOut);
-
- return outStr;
- }
-
- private static Asn1Set GetAsn1Set(
- Asn1SetParser asn1SetParser)
- {
- return asn1SetParser == null
- ? null
- : Asn1Set.GetInstance(asn1SetParser.ToAsn1Object());
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSSignedDataStreamGenerator.cs b/BCCrypto/src/cms/CMSSignedDataStreamGenerator.cs
deleted file mode 100644
index d0ab742..0000000
--- a/BCCrypto/src/cms/CMSSignedDataStreamGenerator.cs
+++ /dev/null
@@ -1,929 +0,0 @@
-using System;
-using System.Collections;
-using System.Diagnostics;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.IO;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * General class for generating a pkcs7-signature message stream.
- *
- * A simple example of usage.
- *
- *
- * IX509Store certs...
- * CmsSignedDataStreamGenerator gen = new CmsSignedDataStreamGenerator();
- *
- * gen.AddSigner(privateKey, cert, CmsSignedDataStreamGenerator.DIGEST_SHA1);
- *
- * gen.AddCertificates(certs);
- *
- * Stream sigOut = gen.Open(bOut);
- *
- * sigOut.Write(Encoding.UTF8.GetBytes("Hello World!"));
- *
- * sigOut.Close();
- *
- */
- public class CmsSignedDataStreamGenerator
- : CmsSignedGenerator
- {
- private static readonly CmsSignedHelper Helper = CmsSignedHelper.Instance;
-
- private readonly IList _signerInfs = Platform.CreateArrayList();
- private readonly ISet _messageDigestOids = new HashSet();
- private readonly IDictionary _messageDigests = Platform.CreateHashtable();
- private readonly IDictionary _messageHashes = Platform.CreateHashtable();
- private bool _messageDigestsLocked;
- private int _bufferSize;
-
- private class DigestAndSignerInfoGeneratorHolder
- {
- internal readonly ISignerInfoGenerator signerInf;
- internal readonly string digestOID;
-
- internal DigestAndSignerInfoGeneratorHolder(ISignerInfoGenerator signerInf, String digestOID)
- {
- this.signerInf = signerInf;
- this.digestOID = digestOID;
- }
-
- internal AlgorithmIdentifier DigestAlgorithm
- {
- get { return new AlgorithmIdentifier(new DerObjectIdentifier(this.digestOID), DerNull.Instance); }
- }
- }
-
- private class SignerInfoGeneratorImpl : ISignerInfoGenerator
- {
- private readonly CmsSignedDataStreamGenerator outer;
-
- private readonly SignerIdentifier _signerIdentifier;
- private readonly string _digestOID;
- private readonly string _encOID;
- private readonly CmsAttributeTableGenerator _sAttr;
- private readonly CmsAttributeTableGenerator _unsAttr;
- private readonly string _encName;
- private readonly ISigner _sig;
-
- internal SignerInfoGeneratorImpl(
- CmsSignedDataStreamGenerator outer,
- AsymmetricKeyParameter key,
- SignerIdentifier signerIdentifier,
- string digestOID,
- string encOID,
- CmsAttributeTableGenerator sAttr,
- CmsAttributeTableGenerator unsAttr)
- {
- this.outer = outer;
-
- _signerIdentifier = signerIdentifier;
- _digestOID = digestOID;
- _encOID = encOID;
- _sAttr = sAttr;
- _unsAttr = unsAttr;
- _encName = Helper.GetEncryptionAlgName(_encOID);
-
- string digestName = Helper.GetDigestAlgName(_digestOID);
- string signatureName = digestName + "with" + _encName;
-
- if (_sAttr != null)
- {
- _sig = Helper.GetSignatureInstance(signatureName);
- }
- else
- {
- // Note: Need to use raw signatures here since we have already calculated the digest
- if (_encName.Equals("RSA"))
- {
- _sig = Helper.GetSignatureInstance("RSA");
- }
- else if (_encName.Equals("DSA"))
- {
- _sig = Helper.GetSignatureInstance("NONEwithDSA");
- }
- // TODO Add support for raw PSS
-// else if (_encName.equals("RSAandMGF1"))
-// {
-// _sig = CMSSignedHelper.INSTANCE.getSignatureInstance("NONEWITHRSAPSS", _sigProvider);
-// try
-// {
-// // Init the params this way to avoid having a 'raw' version of each PSS algorithm
-// Signature sig2 = CMSSignedHelper.INSTANCE.getSignatureInstance(signatureName, _sigProvider);
-// PSSParameterSpec spec = (PSSParameterSpec)sig2.getParameters().getParameterSpec(PSSParameterSpec.class);
-// _sig.setParameter(spec);
-// }
-// catch (Exception e)
-// {
-// throw new SignatureException("algorithm: " + _encName + " could not be configured.");
-// }
-// }
- else
- {
- throw new SignatureException("algorithm: " + _encName + " not supported in base signatures.");
- }
- }
-
- _sig.Init(true, new ParametersWithRandom(key, outer.rand));
- }
-
- public SignerInfo Generate(DerObjectIdentifier contentType, AlgorithmIdentifier digestAlgorithm,
- byte[] calculatedDigest)
- {
- try
- {
- string digestName = Helper.GetDigestAlgName(_digestOID);
- string signatureName = digestName + "with" + _encName;
-
-// AlgorithmIdentifier digAlgId = DigestAlgorithmID;
-//
-// byte[] hash = (byte[])outer._messageHashes[Helper.GetDigestAlgName(this._digestOID)];
-// outer._digests[_digestOID] = hash.Clone();
-
- byte[] bytesToSign = calculatedDigest;
-
- /* RFC 3852 5.4
- * The result of the message digest calculation process depends on
- * whether the signedAttrs field is present. When the field is absent,
- * the result is just the message digest of the content as described
- *
- * above. When the field is present, however, the result is the message
- * digest of the complete DER encoding of the SignedAttrs value
- * contained in the signedAttrs field.
- */
- Asn1Set signedAttr = null;
- if (_sAttr != null)
- {
- IDictionary parameters = outer.GetBaseParameters(contentType, digestAlgorithm, calculatedDigest);
-
-// Asn1.Cms.AttributeTable signed = _sAttr.GetAttributes(Collections.unmodifiableMap(parameters));
- Asn1.Cms.AttributeTable signed = _sAttr.GetAttributes(parameters);
-
- if (contentType == null) //counter signature
- {
- if (signed != null && signed[CmsAttributes.ContentType] != null)
- {
- IDictionary tmpSigned = signed.ToDictionary();
- tmpSigned.Remove(CmsAttributes.ContentType);
- signed = new Asn1.Cms.AttributeTable(tmpSigned);
- }
- }
-
- signedAttr = outer.GetAttributeSet(signed);
-
- // sig must be composed from the DER encoding.
- bytesToSign = signedAttr.GetEncoded(Asn1Encodable.Der);
- }
- else
- {
- // Note: Need to use raw signatures here since we have already calculated the digest
- if (_encName.Equals("RSA"))
- {
- DigestInfo dInfo = new DigestInfo(digestAlgorithm, calculatedDigest);
- bytesToSign = dInfo.GetEncoded(Asn1Encodable.Der);
- }
- }
-
- _sig.BlockUpdate(bytesToSign, 0, bytesToSign.Length);
- byte[] sigBytes = _sig.GenerateSignature();
-
- Asn1Set unsignedAttr = null;
- if (_unsAttr != null)
- {
- IDictionary parameters = outer.GetBaseParameters(
- contentType, digestAlgorithm, calculatedDigest);
- parameters[CmsAttributeTableParameter.Signature] = sigBytes.Clone();
-
-// Asn1.Cms.AttributeTable unsigned = _unsAttr.getAttributes(Collections.unmodifiableMap(parameters));
- Asn1.Cms.AttributeTable unsigned = _unsAttr.GetAttributes(parameters);
-
- unsignedAttr = outer.GetAttributeSet(unsigned);
- }
-
- // TODO[RSAPSS] Need the ability to specify non-default parameters
- Asn1Encodable sigX509Parameters = SignerUtilities.GetDefaultX509Parameters(signatureName);
- AlgorithmIdentifier digestEncryptionAlgorithm = Helper.GetEncAlgorithmIdentifier(
- new DerObjectIdentifier(_encOID), sigX509Parameters);
-
- return new SignerInfo(_signerIdentifier, digestAlgorithm,
- signedAttr, digestEncryptionAlgorithm, new DerOctetString(sigBytes), unsignedAttr);
- }
- catch (IOException e)
- {
- throw new CmsStreamException("encoding error.", e);
- }
- catch (SignatureException e)
- {
- throw new CmsStreamException("error creating signature.", e);
- }
- }
- }
-
- public CmsSignedDataStreamGenerator()
- {
- }
-
- /// Constructor allowing specific source of randomness
- /// Instance of SecureRandom to use.
- public CmsSignedDataStreamGenerator(
- SecureRandom rand)
- : base(rand)
- {
- }
-
- /**
- * Set the underlying string size for encapsulated data
- *
- * @param bufferSize length of octet strings to buffer the data.
- */
- public void SetBufferSize(
- int bufferSize)
- {
- _bufferSize = bufferSize;
- }
-
- public void AddDigests(
- params string[] digestOids)
- {
- AddDigests((IEnumerable) digestOids);
- }
-
- public void AddDigests(
- IEnumerable digestOids)
- {
- foreach (string digestOid in digestOids)
- {
- ConfigureDigest(digestOid);
- }
- }
-
- /**
- * add a signer - no attributes other than the default ones will be
- * provided here.
- * @throws NoSuchAlgorithmException
- * @throws InvalidKeyException
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- X509Certificate cert,
- string digestOid)
- {
- AddSigner(privateKey, cert, digestOid,
- new DefaultSignedAttributeTableGenerator(), null);
- }
-
- /**
- * add a signer, specifying the digest encryption algorithm - no attributes other than the default ones will be
- * provided here.
- * @throws NoSuchProviderException
- * @throws NoSuchAlgorithmException
- * @throws InvalidKeyException
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- X509Certificate cert,
- string encryptionOid,
- string digestOid)
- {
- AddSigner(privateKey, cert, encryptionOid, digestOid,
- new DefaultSignedAttributeTableGenerator(),
- (CmsAttributeTableGenerator)null);
- }
-
- /**
- * add a signer with extra signed/unsigned attributes.
- * @throws NoSuchAlgorithmException
- * @throws InvalidKeyException
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- X509Certificate cert,
- string digestOid,
- Asn1.Cms.AttributeTable signedAttr,
- Asn1.Cms.AttributeTable unsignedAttr)
- {
- AddSigner(privateKey, cert, digestOid,
- new DefaultSignedAttributeTableGenerator(signedAttr),
- new SimpleAttributeTableGenerator(unsignedAttr));
- }
-
- /**
- * add a signer with extra signed/unsigned attributes - specifying digest
- * encryption algorithm.
- * @throws NoSuchProviderException
- * @throws NoSuchAlgorithmException
- * @throws InvalidKeyException
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- X509Certificate cert,
- string encryptionOid,
- string digestOid,
- Asn1.Cms.AttributeTable signedAttr,
- Asn1.Cms.AttributeTable unsignedAttr)
- {
- AddSigner(privateKey, cert, encryptionOid, digestOid,
- new DefaultSignedAttributeTableGenerator(signedAttr),
- new SimpleAttributeTableGenerator(unsignedAttr));
- }
-
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- X509Certificate cert,
- string digestOid,
- CmsAttributeTableGenerator signedAttrGenerator,
- CmsAttributeTableGenerator unsignedAttrGenerator)
- {
- AddSigner(privateKey, cert, Helper.GetEncOid(privateKey, digestOid), digestOid,
- signedAttrGenerator, unsignedAttrGenerator);
- }
-
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- X509Certificate cert,
- string encryptionOid,
- string digestOid,
- CmsAttributeTableGenerator signedAttrGenerator,
- CmsAttributeTableGenerator unsignedAttrGenerator)
- {
- DoAddSigner(privateKey, GetSignerIdentifier(cert), encryptionOid, digestOid,
- signedAttrGenerator, unsignedAttrGenerator);
- }
-
- /**
- * add a signer - no attributes other than the default ones will be
- * provided here.
- * @throws NoSuchAlgorithmException
- * @throws InvalidKeyException
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- byte[] subjectKeyID,
- string digestOid)
- {
- AddSigner(privateKey, subjectKeyID, digestOid, new DefaultSignedAttributeTableGenerator(),
- (CmsAttributeTableGenerator)null);
- }
-
- /**
- * add a signer - no attributes other than the default ones will be
- * provided here.
- * @throws NoSuchProviderException
- * @throws NoSuchAlgorithmException
- * @throws InvalidKeyException
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- byte[] subjectKeyID,
- string encryptionOid,
- string digestOid)
- {
- AddSigner(privateKey, subjectKeyID, encryptionOid, digestOid,
- new DefaultSignedAttributeTableGenerator(),
- (CmsAttributeTableGenerator)null);
- }
-
- /**
- * add a signer with extra signed/unsigned attributes.
- * @throws NoSuchAlgorithmException
- * @throws InvalidKeyException
- */
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- byte[] subjectKeyID,
- string digestOid,
- Asn1.Cms.AttributeTable signedAttr,
- Asn1.Cms.AttributeTable unsignedAttr)
- {
- AddSigner(privateKey, subjectKeyID, digestOid,
- new DefaultSignedAttributeTableGenerator(signedAttr),
- new SimpleAttributeTableGenerator(unsignedAttr));
- }
-
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- byte[] subjectKeyID,
- string digestOid,
- CmsAttributeTableGenerator signedAttrGenerator,
- CmsAttributeTableGenerator unsignedAttrGenerator)
- {
- AddSigner(privateKey, subjectKeyID, Helper.GetEncOid(privateKey, digestOid),
- digestOid, signedAttrGenerator, unsignedAttrGenerator);
- }
-
- public void AddSigner(
- AsymmetricKeyParameter privateKey,
- byte[] subjectKeyID,
- string encryptionOid,
- string digestOid,
- CmsAttributeTableGenerator signedAttrGenerator,
- CmsAttributeTableGenerator unsignedAttrGenerator)
- {
- DoAddSigner(privateKey, GetSignerIdentifier(subjectKeyID), encryptionOid, digestOid,
- signedAttrGenerator, unsignedAttrGenerator);
- }
-
- private void DoAddSigner(
- AsymmetricKeyParameter privateKey,
- SignerIdentifier signerIdentifier,
- string encryptionOid,
- string digestOid,
- CmsAttributeTableGenerator signedAttrGenerator,
- CmsAttributeTableGenerator unsignedAttrGenerator)
- {
- ConfigureDigest(digestOid);
-
- SignerInfoGeneratorImpl signerInf = new SignerInfoGeneratorImpl(this, privateKey,
- signerIdentifier, digestOid, encryptionOid, signedAttrGenerator, unsignedAttrGenerator);
-
- _signerInfs.Add(new DigestAndSignerInfoGeneratorHolder(signerInf, digestOid));
- }
-
- internal override void AddSignerCallback(
- SignerInformation si)
- {
- // FIXME If there were parameters in si.DigestAlgorithmID.Parameters, they are lost
- // NB: Would need to call FixAlgID on the DigestAlgorithmID
-
- // For precalculated signers, just need to register the algorithm, not configure a digest
- RegisterDigestOid(si.DigestAlgorithmID.Algorithm.Id);
- }
-
- /**
- * generate a signed object that for a CMS Signed Data object
- */
- public Stream Open(
- Stream outStream)
- {
- return Open(outStream, false);
- }
-
- /**
- * generate a signed object that for a CMS Signed Data
- * object - if encapsulate is true a copy
- * of the message will be included in the signature with the
- * default content type "data".
- */
- public Stream Open(
- Stream outStream,
- bool encapsulate)
- {
- return Open(outStream, Data, encapsulate);
- }
-
- /**
- * generate a signed object that for a CMS Signed Data
- * object using the given provider - if encapsulate is true a copy
- * of the message will be included in the signature with the
- * default content type "data". If dataOutputStream is non null the data
- * being signed will be written to the stream as it is processed.
- * @param out stream the CMS object is to be written to.
- * @param encapsulate true if data should be encapsulated.
- * @param dataOutputStream output stream to copy the data being signed to.
- */
- public Stream Open(
- Stream outStream,
- bool encapsulate,
- Stream dataOutputStream)
- {
- return Open(outStream, Data, encapsulate, dataOutputStream);
- }
-
- /**
- * generate a signed object that for a CMS Signed Data
- * object - if encapsulate is true a copy
- * of the message will be included in the signature. The content type
- * is set according to the OID represented by the string signedContentType.
- */
- public Stream Open(
- Stream outStream,
- string signedContentType,
- bool encapsulate)
- {
- return Open(outStream, signedContentType, encapsulate, null);
- }
-
- /**
- * generate a signed object that for a CMS Signed Data
- * object using the given provider - if encapsulate is true a copy
- * of the message will be included in the signature. The content type
- * is set according to the OID represented by the string signedContentType.
- * @param out stream the CMS object is to be written to.
- * @param signedContentType OID for data to be signed.
- * @param encapsulate true if data should be encapsulated.
- * @param dataOutputStream output stream to copy the data being signed to.
- */
- public Stream Open(
- Stream outStream,
- string signedContentType,
- bool encapsulate,
- Stream dataOutputStream)
- {
- if (outStream == null)
- throw new ArgumentNullException("outStream");
- if (!outStream.CanWrite)
- throw new ArgumentException("Expected writeable stream", "outStream");
- if (dataOutputStream != null && !dataOutputStream.CanWrite)
- throw new ArgumentException("Expected writeable stream", "dataOutputStream");
-
- _messageDigestsLocked = true;
-
- //
- // ContentInfo
- //
- BerSequenceGenerator sGen = new BerSequenceGenerator(outStream);
-
- sGen.AddObject(CmsObjectIdentifiers.SignedData);
-
- //
- // Signed Data
- //
- BerSequenceGenerator sigGen = new BerSequenceGenerator(
- sGen.GetRawOutputStream(), 0, true);
-
- bool isCounterSignature = (signedContentType == null);
-
- DerObjectIdentifier contentTypeOid = isCounterSignature
- ? null
- : new DerObjectIdentifier(signedContentType);
-
- sigGen.AddObject(CalculateVersion(contentTypeOid));
-
- Asn1EncodableVector digestAlgs = new Asn1EncodableVector();
-
- foreach (string digestOid in _messageDigestOids)
- {
- digestAlgs.Add(
- new AlgorithmIdentifier(new DerObjectIdentifier(digestOid), DerNull.Instance));
- }
-
- {
- byte[] tmp = new DerSet(digestAlgs).GetEncoded();
- sigGen.GetRawOutputStream().Write(tmp, 0, tmp.Length);
- }
-
- BerSequenceGenerator eiGen = new BerSequenceGenerator(sigGen.GetRawOutputStream());
- eiGen.AddObject(contentTypeOid);
-
- // If encapsulating, add the data as an octet string in the sequence
- Stream encapStream = encapsulate
- ? CmsUtilities.CreateBerOctetOutputStream(eiGen.GetRawOutputStream(), 0, true, _bufferSize)
- : null;
-
- // Also send the data to 'dataOutputStream' if necessary
- Stream teeStream = GetSafeTeeOutputStream(dataOutputStream, encapStream);
-
- // Let all the digests see the data as it is written
- Stream digStream = AttachDigestsToOutputStream(_messageDigests.Values, teeStream);
-
- return new CmsSignedDataOutputStream(this, digStream, signedContentType, sGen, sigGen, eiGen);
- }
-
- private void RegisterDigestOid(
- string digestOid)
- {
- if (_messageDigestsLocked)
- {
- if (!_messageDigestOids.Contains(digestOid))
- throw new InvalidOperationException("Cannot register new digest OIDs after the data stream is opened");
- }
- else
- {
- _messageDigestOids.Add(digestOid);
- }
- }
-
- private void ConfigureDigest(
- string digestOid)
- {
- RegisterDigestOid(digestOid);
-
- string digestName = Helper.GetDigestAlgName(digestOid);
- IDigest dig = (IDigest)_messageDigests[digestName];
- if (dig == null)
- {
- if (_messageDigestsLocked)
- throw new InvalidOperationException("Cannot configure new digests after the data stream is opened");
-
- dig = Helper.GetDigestInstance(digestName);
- _messageDigests[digestName] = dig;
- }
- }
-
- // TODO Make public?
- internal void Generate(
- Stream outStream,
- string eContentType,
- bool encapsulate,
- Stream dataOutputStream,
- CmsProcessable content)
- {
- Stream signedOut = Open(outStream, eContentType, encapsulate, dataOutputStream);
- if (content != null)
- {
- content.Write(signedOut);
- }
- Platform.Dispose(signedOut);
- }
-
- // RFC3852, section 5.1:
- // IF ((certificates is present) AND
- // (any certificates with a type of other are present)) OR
- // ((crls is present) AND
- // (any crls with a type of other are present))
- // THEN version MUST be 5
- // ELSE
- // IF (certificates is present) AND
- // (any version 2 attribute certificates are present)
- // THEN version MUST be 4
- // ELSE
- // IF ((certificates is present) AND
- // (any version 1 attribute certificates are present)) OR
- // (any SignerInfo structures are version 3) OR
- // (encapContentInfo eContentType is other than id-data)
- // THEN version MUST be 3
- // ELSE version MUST be 1
- //
- private DerInteger CalculateVersion(
- DerObjectIdentifier contentOid)
- {
- bool otherCert = false;
- bool otherCrl = false;
- bool attrCertV1Found = false;
- bool attrCertV2Found = false;
-
- if (_certs != null)
- {
- foreach (object obj in _certs)
- {
- if (obj is Asn1TaggedObject)
- {
- Asn1TaggedObject tagged = (Asn1TaggedObject) obj;
-
- if (tagged.TagNo == 1)
- {
- attrCertV1Found = true;
- }
- else if (tagged.TagNo == 2)
- {
- attrCertV2Found = true;
- }
- else if (tagged.TagNo == 3)
- {
- otherCert = true;
- break;
- }
- }
- }
- }
-
- if (otherCert)
- {
- return new DerInteger(5);
- }
-
- if (_crls != null)
- {
- foreach (object obj in _crls)
- {
- if (obj is Asn1TaggedObject)
- {
- otherCrl = true;
- break;
- }
- }
- }
-
- if (otherCrl)
- {
- return new DerInteger(5);
- }
-
- if (attrCertV2Found)
- {
- return new DerInteger(4);
- }
-
- if (attrCertV1Found || !CmsObjectIdentifiers.Data.Equals(contentOid) || CheckForVersion3(_signers))
- {
- return new DerInteger(3);
- }
-
- return new DerInteger(1);
- }
-
- private bool CheckForVersion3(
- IList signerInfos)
- {
- foreach (SignerInformation si in signerInfos)
- {
- SignerInfo s = SignerInfo.GetInstance(si.ToSignerInfo());
-
- if (s.Version.Value.IntValue == 3)
- {
- return true;
- }
- }
-
- return false;
- }
-
- private static Stream AttachDigestsToOutputStream(ICollection digests, Stream s)
- {
- Stream result = s;
- foreach (IDigest digest in digests)
- {
- result = GetSafeTeeOutputStream(result, new DigOutputStream(digest));
- }
- return result;
- }
-
- private static Stream GetSafeOutputStream(Stream s)
- {
- if (s == null)
- return new NullOutputStream();
- return s;
- }
-
- private static Stream GetSafeTeeOutputStream(Stream s1, Stream s2)
- {
- if (s1 == null)
- return GetSafeOutputStream(s2);
- if (s2 == null)
- return GetSafeOutputStream(s1);
- return new TeeOutputStream(s1, s2);
- }
-
- private class CmsSignedDataOutputStream
- : BaseOutputStream
- {
- private readonly CmsSignedDataStreamGenerator outer;
-
- private Stream _out;
- private DerObjectIdentifier _contentOID;
- private BerSequenceGenerator _sGen;
- private BerSequenceGenerator _sigGen;
- private BerSequenceGenerator _eiGen;
-
- public CmsSignedDataOutputStream(
- CmsSignedDataStreamGenerator outer,
- Stream outStream,
- string contentOID,
- BerSequenceGenerator sGen,
- BerSequenceGenerator sigGen,
- BerSequenceGenerator eiGen)
- {
- this.outer = outer;
-
- _out = outStream;
- _contentOID = new DerObjectIdentifier(contentOID);
- _sGen = sGen;
- _sigGen = sigGen;
- _eiGen = eiGen;
- }
-
- public override void WriteByte(
- byte b)
- {
- _out.WriteByte(b);
- }
-
- public override void Write(
- byte[] bytes,
- int off,
- int len)
- {
- _out.Write(bytes, off, len);
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- DoClose();
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- DoClose();
- base.Close();
- }
-#endif
-
- private void DoClose()
- {
- Platform.Dispose(_out);
-
- // TODO Parent context(s) should really be be closed explicitly
-
- _eiGen.Close();
-
- outer._digests.Clear(); // clear the current preserved digest state
-
- if (outer._certs.Count > 0)
- {
- Asn1Set certs = CmsUtilities.CreateBerSetFromList(outer._certs);
-
- WriteToGenerator(_sigGen, new BerTaggedObject(false, 0, certs));
- }
-
- if (outer._crls.Count > 0)
- {
- Asn1Set crls = CmsUtilities.CreateBerSetFromList(outer._crls);
-
- WriteToGenerator(_sigGen, new BerTaggedObject(false, 1, crls));
- }
-
- //
- // Calculate the digest hashes
- //
- foreach (DictionaryEntry de in outer._messageDigests)
- {
- outer._messageHashes.Add(de.Key, DigestUtilities.DoFinal((IDigest)de.Value));
- }
-
- // TODO If the digest OIDs for precalculated signers weren't mixed in with
- // the others, we could fill in outer._digests here, instead of SignerInfoGenerator.Generate
-
- //
- // collect all the SignerInfo objects
- //
- Asn1EncodableVector signerInfos = new Asn1EncodableVector();
-
- //
- // add the generated SignerInfo objects
- //
- {
- foreach (DigestAndSignerInfoGeneratorHolder holder in outer._signerInfs)
- {
- AlgorithmIdentifier digestAlgorithm = holder.DigestAlgorithm;
-
- byte[] calculatedDigest = (byte[])outer._messageHashes[
- Helper.GetDigestAlgName(holder.digestOID)];
- outer._digests[holder.digestOID] = calculatedDigest.Clone();
-
- signerInfos.Add(holder.signerInf.Generate(_contentOID, digestAlgorithm, calculatedDigest));
- }
- }
-
- //
- // add the precalculated SignerInfo objects.
- //
- {
- foreach (SignerInformation signer in outer._signers)
- {
- // TODO Verify the content type and calculated digest match the precalculated SignerInfo
-// if (!signer.ContentType.Equals(_contentOID))
-// {
-// // TODO The precalculated content type did not match - error?
-// }
-//
-// byte[] calculatedDigest = (byte[])outer._digests[signer.DigestAlgOid];
-// if (calculatedDigest == null)
-// {
-// // TODO We can't confirm this digest because we didn't calculate it - error?
-// }
-// else
-// {
-// if (!Arrays.AreEqual(signer.GetContentDigest(), calculatedDigest))
-// {
-// // TODO The precalculated digest did not match - error?
-// }
-// }
-
- signerInfos.Add(signer.ToSignerInfo());
- }
- }
-
- WriteToGenerator(_sigGen, new DerSet(signerInfos));
-
- _sigGen.Close();
- _sGen.Close();
- }
-
- private static void WriteToGenerator(
- Asn1Generator ag,
- Asn1Encodable ae)
- {
- byte[] encoded = ae.GetEncoded();
- ag.GetRawOutputStream().Write(encoded, 0, encoded.Length);
- }
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSSignedGenerator.cs b/BCCrypto/src/cms/CMSSignedGenerator.cs
deleted file mode 100644
index 0fb1f31..0000000
--- a/BCCrypto/src/cms/CMSSignedGenerator.cs
+++ /dev/null
@@ -1,267 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Cms
-{
- public class DefaultDigestAlgorithmIdentifierFinder
- {
- private static readonly IDictionary digestOids = Platform.CreateHashtable();
- private static readonly IDictionary digestNameToOids = Platform.CreateHashtable();
-
- static DefaultDigestAlgorithmIdentifierFinder()
- {
- //
- // digests
- //
- digestOids.Add(OiwObjectIdentifiers.MD4WithRsaEncryption, PkcsObjectIdentifiers.MD4);
- digestOids.Add(OiwObjectIdentifiers.MD4WithRsa, PkcsObjectIdentifiers.MD4);
- digestOids.Add(OiwObjectIdentifiers.Sha1WithRsa, OiwObjectIdentifiers.IdSha1);
-
- digestOids.Add(PkcsObjectIdentifiers.Sha224WithRsaEncryption, NistObjectIdentifiers.IdSha224);
- digestOids.Add(PkcsObjectIdentifiers.Sha256WithRsaEncryption, NistObjectIdentifiers.IdSha256);
- digestOids.Add(PkcsObjectIdentifiers.Sha384WithRsaEncryption, NistObjectIdentifiers.IdSha384);
- digestOids.Add(PkcsObjectIdentifiers.Sha512WithRsaEncryption, NistObjectIdentifiers.IdSha512);
- digestOids.Add(PkcsObjectIdentifiers.MD2WithRsaEncryption, PkcsObjectIdentifiers.MD2);
- digestOids.Add(PkcsObjectIdentifiers.MD4WithRsaEncryption, PkcsObjectIdentifiers.MD4);
- digestOids.Add(PkcsObjectIdentifiers.MD5WithRsaEncryption, PkcsObjectIdentifiers.MD5);
- digestOids.Add(PkcsObjectIdentifiers.Sha1WithRsaEncryption, OiwObjectIdentifiers.IdSha1);
-
- digestOids.Add(X9ObjectIdentifiers.ECDsaWithSha1, OiwObjectIdentifiers.IdSha1);
- digestOids.Add(X9ObjectIdentifiers.ECDsaWithSha224, NistObjectIdentifiers.IdSha224);
- digestOids.Add(X9ObjectIdentifiers.ECDsaWithSha256, NistObjectIdentifiers.IdSha256);
- digestOids.Add(X9ObjectIdentifiers.ECDsaWithSha384, NistObjectIdentifiers.IdSha384);
- digestOids.Add(X9ObjectIdentifiers.ECDsaWithSha512, NistObjectIdentifiers.IdSha512);
- digestOids.Add(X9ObjectIdentifiers.IdDsaWithSha1, OiwObjectIdentifiers.IdSha1);
-
- digestOids.Add(NistObjectIdentifiers.DsaWithSha224, NistObjectIdentifiers.IdSha224);
- digestOids.Add(NistObjectIdentifiers.DsaWithSha256, NistObjectIdentifiers.IdSha256);
- digestOids.Add(NistObjectIdentifiers.DsaWithSha384, NistObjectIdentifiers.IdSha384);
- digestOids.Add(NistObjectIdentifiers.DsaWithSha512, NistObjectIdentifiers.IdSha512);
-
- digestOids.Add(TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128, TeleTrusTObjectIdentifiers.RipeMD128);
- digestOids.Add(TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160, TeleTrusTObjectIdentifiers.RipeMD160);
- digestOids.Add(TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256, TeleTrusTObjectIdentifiers.RipeMD256);
-
- digestOids.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94, CryptoProObjectIdentifiers.GostR3411);
- digestOids.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001, CryptoProObjectIdentifiers.GostR3411);
-
- digestNameToOids.Add("SHA-1", OiwObjectIdentifiers.IdSha1);
- digestNameToOids.Add("SHA-224", NistObjectIdentifiers.IdSha224);
- digestNameToOids.Add("SHA-256", NistObjectIdentifiers.IdSha256);
- digestNameToOids.Add("SHA-384", NistObjectIdentifiers.IdSha384);
- digestNameToOids.Add("SHA-512", NistObjectIdentifiers.IdSha512);
-
- digestNameToOids.Add("SHA1", OiwObjectIdentifiers.IdSha1);
- digestNameToOids.Add("SHA224", NistObjectIdentifiers.IdSha224);
- digestNameToOids.Add("SHA256", NistObjectIdentifiers.IdSha256);
- digestNameToOids.Add("SHA384", NistObjectIdentifiers.IdSha384);
- digestNameToOids.Add("SHA512", NistObjectIdentifiers.IdSha512);
-
- digestNameToOids.Add("SHA3-224", NistObjectIdentifiers.IdSha3_224);
- digestNameToOids.Add("SHA3-256", NistObjectIdentifiers.IdSha3_256);
- digestNameToOids.Add("SHA3-384", NistObjectIdentifiers.IdSha3_384);
- digestNameToOids.Add("SHA3-512", NistObjectIdentifiers.IdSha3_512);
-
- digestNameToOids.Add("SHAKE-128", NistObjectIdentifiers.IdShake128);
- digestNameToOids.Add("SHAKE-256", NistObjectIdentifiers.IdShake256);
-
- digestNameToOids.Add("GOST3411", CryptoProObjectIdentifiers.GostR3411);
-
- digestNameToOids.Add("MD2", PkcsObjectIdentifiers.MD2);
- digestNameToOids.Add("MD4", PkcsObjectIdentifiers.MD4);
- digestNameToOids.Add("MD5", PkcsObjectIdentifiers.MD5);
-
- digestNameToOids.Add("RIPEMD128", TeleTrusTObjectIdentifiers.RipeMD128);
- digestNameToOids.Add("RIPEMD160", TeleTrusTObjectIdentifiers.RipeMD160);
- digestNameToOids.Add("RIPEMD256", TeleTrusTObjectIdentifiers.RipeMD256);
- }
-
- public AlgorithmIdentifier find(AlgorithmIdentifier sigAlgId)
- {
- AlgorithmIdentifier digAlgId;
-
- if (sigAlgId.Algorithm.Equals(PkcsObjectIdentifiers.IdRsassaPss))
- {
- digAlgId = RsassaPssParameters.GetInstance(sigAlgId.Parameters).HashAlgorithm;
- }
- else
- {
- digAlgId = new AlgorithmIdentifier((DerObjectIdentifier)digestOids[sigAlgId.Algorithm], DerNull.Instance);
- }
-
- return digAlgId;
- }
-
- public AlgorithmIdentifier find(String digAlgName)
- {
- return new AlgorithmIdentifier((DerObjectIdentifier)digestNameToOids[digAlgName], DerNull.Instance);
- }
- }
-
- public class CmsSignedGenerator
- {
- /**
- * Default type for the signed data.
- */
- public static readonly string Data = CmsObjectIdentifiers.Data.Id;
-
- public static readonly string DigestSha1 = OiwObjectIdentifiers.IdSha1.Id;
- public static readonly string DigestSha224 = NistObjectIdentifiers.IdSha224.Id;
- public static readonly string DigestSha256 = NistObjectIdentifiers.IdSha256.Id;
- public static readonly string DigestSha384 = NistObjectIdentifiers.IdSha384.Id;
- public static readonly string DigestSha512 = NistObjectIdentifiers.IdSha512.Id;
- public static readonly string DigestMD5 = PkcsObjectIdentifiers.MD5.Id;
- public static readonly string DigestGost3411 = CryptoProObjectIdentifiers.GostR3411.Id;
- public static readonly string DigestRipeMD128 = TeleTrusTObjectIdentifiers.RipeMD128.Id;
- public static readonly string DigestRipeMD160 = TeleTrusTObjectIdentifiers.RipeMD160.Id;
- public static readonly string DigestRipeMD256 = TeleTrusTObjectIdentifiers.RipeMD256.Id;
-
- public static readonly string EncryptionRsa = PkcsObjectIdentifiers.RsaEncryption.Id;
- public static readonly string EncryptionDsa = X9ObjectIdentifiers.IdDsaWithSha1.Id;
- public static readonly string EncryptionECDsa = X9ObjectIdentifiers.ECDsaWithSha1.Id;
- public static readonly string EncryptionRsaPss = PkcsObjectIdentifiers.IdRsassaPss.Id;
- public static readonly string EncryptionGost3410 = CryptoProObjectIdentifiers.GostR3410x94.Id;
- public static readonly string EncryptionECGost3410 = CryptoProObjectIdentifiers.GostR3410x2001.Id;
-
- internal IList _certs = Platform.CreateArrayList();
- internal IList _crls = Platform.CreateArrayList();
- internal IList _signers = Platform.CreateArrayList();
- internal IDictionary _digests = Platform.CreateHashtable();
-
- protected readonly SecureRandom rand;
-
- protected CmsSignedGenerator()
- : this(new SecureRandom())
- {
- }
-
- /// Constructor allowing specific source of randomness
- /// Instance of SecureRandom to use.
- protected CmsSignedGenerator(
- SecureRandom rand)
- {
- this.rand = rand;
- }
-
- internal protected virtual IDictionary GetBaseParameters(
- DerObjectIdentifier contentType,
- AlgorithmIdentifier digAlgId,
- byte[] hash)
- {
- IDictionary param = Platform.CreateHashtable();
-
- if (contentType != null)
- {
- param[CmsAttributeTableParameter.ContentType] = contentType;
- }
-
- param[CmsAttributeTableParameter.DigestAlgorithmIdentifier] = digAlgId;
- param[CmsAttributeTableParameter.Digest] = hash.Clone();
-
- return param;
- }
-
- internal protected virtual Asn1Set GetAttributeSet(
- Asn1.Cms.AttributeTable attr)
- {
- return attr == null
- ? null
- : new DerSet(attr.ToAsn1EncodableVector());
- }
-
- public void AddCertificates(
- IX509Store certStore)
- {
- CollectionUtilities.AddRange(_certs, CmsUtilities.GetCertificatesFromStore(certStore));
- }
-
- public void AddCrls(
- IX509Store crlStore)
- {
- CollectionUtilities.AddRange(_crls, CmsUtilities.GetCrlsFromStore(crlStore));
- }
-
- /**
- * Add the attribute certificates contained in the passed in store to the
- * generator.
- *
- * @param store a store of Version 2 attribute certificates
- * @throws CmsException if an error occurse processing the store.
- */
- public void AddAttributeCertificates(
- IX509Store store)
- {
- try
- {
- foreach (IX509AttributeCertificate attrCert in store.GetMatches(null))
- {
- _certs.Add(new DerTaggedObject(false, 2,
- AttributeCertificate.GetInstance(Asn1Object.FromByteArray(attrCert.GetEncoded()))));
- }
- }
- catch (Exception e)
- {
- throw new CmsException("error processing attribute certs", e);
- }
- }
-
- /**
- * Add a store of precalculated signers to the generator.
- *
- * @param signerStore store of signers
- */
- public void AddSigners(
- SignerInformationStore signerStore)
- {
- foreach (SignerInformation o in signerStore.GetSigners())
- {
- _signers.Add(o);
- AddSignerCallback(o);
- }
- }
-
- /**
- * Return a map of oids and byte arrays representing the digests calculated on the content during
- * the last generate.
- *
- * @return a map of oids (as String objects) and byte[] representing digests.
- */
- public IDictionary GetGeneratedDigests()
- {
- return Platform.CreateHashtable(_digests);
- }
-
- internal virtual void AddSignerCallback(
- SignerInformation si)
- {
- }
-
- internal static SignerIdentifier GetSignerIdentifier(X509Certificate cert)
- {
- return new SignerIdentifier(CmsUtilities.GetIssuerAndSerialNumber(cert));
- }
-
- internal static SignerIdentifier GetSignerIdentifier(byte[] subjectKeyIdentifier)
- {
- return new SignerIdentifier(new DerOctetString(subjectKeyIdentifier));
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSSignedHelper.cs b/BCCrypto/src/cms/CMSSignedHelper.cs
deleted file mode 100644
index 5b6c93b..0000000
--- a/BCCrypto/src/cms/CMSSignedHelper.cs
+++ /dev/null
@@ -1,426 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Eac;
-using Org.BouncyCastle.Asn1.Iana;
-using Org.BouncyCastle.Asn1.Misc;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Cms
-{
- internal class CmsSignedHelper
- {
- internal static readonly CmsSignedHelper Instance = new CmsSignedHelper();
-
- private static readonly string EncryptionECDsaWithSha1 = X9ObjectIdentifiers.ECDsaWithSha1.Id;
- private static readonly string EncryptionECDsaWithSha224 = X9ObjectIdentifiers.ECDsaWithSha224.Id;
- private static readonly string EncryptionECDsaWithSha256 = X9ObjectIdentifiers.ECDsaWithSha256.Id;
- private static readonly string EncryptionECDsaWithSha384 = X9ObjectIdentifiers.ECDsaWithSha384.Id;
- private static readonly string EncryptionECDsaWithSha512 = X9ObjectIdentifiers.ECDsaWithSha512.Id;
-
- private static readonly IDictionary encryptionAlgs = Platform.CreateHashtable();
- private static readonly IDictionary digestAlgs = Platform.CreateHashtable();
- private static readonly IDictionary digestAliases = Platform.CreateHashtable();
-
- private static readonly ISet noParams = new HashSet();
- private static readonly IDictionary ecAlgorithms = Platform.CreateHashtable();
-
- private static void AddEntries(DerObjectIdentifier oid, string digest, string encryption)
- {
- string alias = oid.Id;
- digestAlgs.Add(alias, digest);
- encryptionAlgs.Add(alias, encryption);
- }
-
- static CmsSignedHelper()
- {
- AddEntries(NistObjectIdentifiers.DsaWithSha224, "SHA224", "DSA");
- AddEntries(NistObjectIdentifiers.DsaWithSha256, "SHA256", "DSA");
- AddEntries(NistObjectIdentifiers.DsaWithSha384, "SHA384", "DSA");
- AddEntries(NistObjectIdentifiers.DsaWithSha512, "SHA512", "DSA");
- AddEntries(OiwObjectIdentifiers.DsaWithSha1, "SHA1", "DSA");
- AddEntries(OiwObjectIdentifiers.MD4WithRsa, "MD4", "RSA");
- AddEntries(OiwObjectIdentifiers.MD4WithRsaEncryption, "MD4", "RSA");
- AddEntries(OiwObjectIdentifiers.MD5WithRsa, "MD5", "RSA");
- AddEntries(OiwObjectIdentifiers.Sha1WithRsa, "SHA1", "RSA");
- AddEntries(PkcsObjectIdentifiers.MD2WithRsaEncryption, "MD2", "RSA");
- AddEntries(PkcsObjectIdentifiers.MD4WithRsaEncryption, "MD4", "RSA");
- AddEntries(PkcsObjectIdentifiers.MD5WithRsaEncryption, "MD5", "RSA");
- AddEntries(PkcsObjectIdentifiers.Sha1WithRsaEncryption, "SHA1", "RSA");
- AddEntries(PkcsObjectIdentifiers.Sha224WithRsaEncryption, "SHA224", "RSA");
- AddEntries(PkcsObjectIdentifiers.Sha256WithRsaEncryption, "SHA256", "RSA");
- AddEntries(PkcsObjectIdentifiers.Sha384WithRsaEncryption, "SHA384", "RSA");
- AddEntries(PkcsObjectIdentifiers.Sha512WithRsaEncryption, "SHA512", "RSA");
- AddEntries(X9ObjectIdentifiers.ECDsaWithSha1, "SHA1", "ECDSA");
- AddEntries(X9ObjectIdentifiers.ECDsaWithSha224, "SHA224", "ECDSA");
- AddEntries(X9ObjectIdentifiers.ECDsaWithSha256, "SHA256", "ECDSA");
- AddEntries(X9ObjectIdentifiers.ECDsaWithSha384, "SHA384", "ECDSA");
- AddEntries(X9ObjectIdentifiers.ECDsaWithSha512, "SHA512", "ECDSA");
- AddEntries(X9ObjectIdentifiers.IdDsaWithSha1, "SHA1", "DSA");
- AddEntries(EacObjectIdentifiers.id_TA_ECDSA_SHA_1, "SHA1", "ECDSA");
- AddEntries(EacObjectIdentifiers.id_TA_ECDSA_SHA_224, "SHA224", "ECDSA");
- AddEntries(EacObjectIdentifiers.id_TA_ECDSA_SHA_256, "SHA256", "ECDSA");
- AddEntries(EacObjectIdentifiers.id_TA_ECDSA_SHA_384, "SHA384", "ECDSA");
- AddEntries(EacObjectIdentifiers.id_TA_ECDSA_SHA_512, "SHA512", "ECDSA");
- AddEntries(EacObjectIdentifiers.id_TA_RSA_v1_5_SHA_1, "SHA1", "RSA");
- AddEntries(EacObjectIdentifiers.id_TA_RSA_v1_5_SHA_256, "SHA256", "RSA");
- AddEntries(EacObjectIdentifiers.id_TA_RSA_PSS_SHA_1, "SHA1", "RSAandMGF1");
- AddEntries(EacObjectIdentifiers.id_TA_RSA_PSS_SHA_256, "SHA256", "RSAandMGF1");
-
- encryptionAlgs.Add(X9ObjectIdentifiers.IdDsa.Id, "DSA");
- encryptionAlgs.Add(PkcsObjectIdentifiers.RsaEncryption.Id, "RSA");
- encryptionAlgs.Add(TeleTrusTObjectIdentifiers.TeleTrusTRsaSignatureAlgorithm, "RSA");
- encryptionAlgs.Add(X509ObjectIdentifiers.IdEARsa.Id, "RSA");
- encryptionAlgs.Add(CmsSignedGenerator.EncryptionRsaPss, "RSAandMGF1");
- encryptionAlgs.Add(CryptoProObjectIdentifiers.GostR3410x94.Id, "GOST3410");
- encryptionAlgs.Add(CryptoProObjectIdentifiers.GostR3410x2001.Id, "ECGOST3410");
- encryptionAlgs.Add("1.3.6.1.4.1.5849.1.6.2", "ECGOST3410");
- encryptionAlgs.Add("1.3.6.1.4.1.5849.1.1.5", "GOST3410");
-
- digestAlgs.Add(PkcsObjectIdentifiers.MD2.Id, "MD2");
- digestAlgs.Add(PkcsObjectIdentifiers.MD4.Id, "MD4");
- digestAlgs.Add(PkcsObjectIdentifiers.MD5.Id, "MD5");
- digestAlgs.Add(OiwObjectIdentifiers.IdSha1.Id, "SHA1");
- digestAlgs.Add(NistObjectIdentifiers.IdSha224.Id, "SHA224");
- digestAlgs.Add(NistObjectIdentifiers.IdSha256.Id, "SHA256");
- digestAlgs.Add(NistObjectIdentifiers.IdSha384.Id, "SHA384");
- digestAlgs.Add(NistObjectIdentifiers.IdSha512.Id, "SHA512");
- digestAlgs.Add(TeleTrusTObjectIdentifiers.RipeMD128.Id, "RIPEMD128");
- digestAlgs.Add(TeleTrusTObjectIdentifiers.RipeMD160.Id, "RIPEMD160");
- digestAlgs.Add(TeleTrusTObjectIdentifiers.RipeMD256.Id, "RIPEMD256");
- digestAlgs.Add(CryptoProObjectIdentifiers.GostR3411.Id, "GOST3411");
- digestAlgs.Add("1.3.6.1.4.1.5849.1.2.1", "GOST3411");
-
- digestAliases.Add("SHA1", new string[] { "SHA-1" });
- digestAliases.Add("SHA224", new string[] { "SHA-224" });
- digestAliases.Add("SHA256", new string[] { "SHA-256" });
- digestAliases.Add("SHA384", new string[] { "SHA-384" });
- digestAliases.Add("SHA512", new string[] { "SHA-512" });
-
- noParams.Add(CmsSignedGenerator.EncryptionDsa);
- // noParams.Add(EncryptionECDsa);
- noParams.Add(EncryptionECDsaWithSha1);
- noParams.Add(EncryptionECDsaWithSha224);
- noParams.Add(EncryptionECDsaWithSha256);
- noParams.Add(EncryptionECDsaWithSha384);
- noParams.Add(EncryptionECDsaWithSha512);
-
- ecAlgorithms.Add(CmsSignedGenerator.DigestSha1, EncryptionECDsaWithSha1);
- ecAlgorithms.Add(CmsSignedGenerator.DigestSha224, EncryptionECDsaWithSha224);
- ecAlgorithms.Add(CmsSignedGenerator.DigestSha256, EncryptionECDsaWithSha256);
- ecAlgorithms.Add(CmsSignedGenerator.DigestSha384, EncryptionECDsaWithSha384);
- ecAlgorithms.Add(CmsSignedGenerator.DigestSha512, EncryptionECDsaWithSha512);
- }
-
- /**
- * Return the digest algorithm using one of the standard JCA string
- * representations rather than the algorithm identifier (if possible).
- */
- internal string GetDigestAlgName(
- string digestAlgOid)
- {
- string algName = (string)digestAlgs[digestAlgOid];
-
- if (algName != null)
- {
- return algName;
- }
-
- return digestAlgOid;
- }
-
- internal AlgorithmIdentifier GetEncAlgorithmIdentifier(
- DerObjectIdentifier encOid,
- Asn1Encodable sigX509Parameters)
- {
- if (noParams.Contains(encOid.Id))
- {
- return new AlgorithmIdentifier(encOid);
- }
-
- return new AlgorithmIdentifier(encOid, sigX509Parameters);
- }
-
- internal string[] GetDigestAliases(
- string algName)
- {
- string[] aliases = (string[]) digestAliases[algName];
-
- return aliases == null ? new String[0] : (string[]) aliases.Clone();
- }
-
- /**
- * Return the digest encryption algorithm using one of the standard
- * JCA string representations rather than the algorithm identifier (if
- * possible).
- */
- internal string GetEncryptionAlgName(
- string encryptionAlgOid)
- {
- string algName = (string) encryptionAlgs[encryptionAlgOid];
-
- if (algName != null)
- {
- return algName;
- }
-
- return encryptionAlgOid;
- }
-
- internal IDigest GetDigestInstance(
- string algorithm)
- {
- try
- {
- return DigestUtilities.GetDigest(algorithm);
- }
- catch (SecurityUtilityException e)
- {
- // This is probably superfluous on C#, since no provider infrastructure,
- // assuming DigestUtilities already knows all the aliases
- foreach (string alias in GetDigestAliases(algorithm))
- {
- try { return DigestUtilities.GetDigest(alias); }
- catch (SecurityUtilityException) {}
- }
- throw e;
- }
- }
-
- internal ISigner GetSignatureInstance(
- string algorithm)
- {
- return SignerUtilities.GetSigner(algorithm);
- }
-
- internal IX509Store CreateAttributeStore(
- string type,
- Asn1Set certSet)
- {
- IList certs = Platform.CreateArrayList();
-
- if (certSet != null)
- {
- foreach (Asn1Encodable ae in certSet)
- {
- try
- {
- Asn1Object obj = ae.ToAsn1Object();
-
- if (obj is Asn1TaggedObject)
- {
- Asn1TaggedObject tagged = (Asn1TaggedObject)obj;
-
- if (tagged.TagNo == 2)
- {
- certs.Add(
- new X509V2AttributeCertificate(
- Asn1Sequence.GetInstance(tagged, false).GetEncoded()));
- }
- }
- }
- catch (Exception ex)
- {
- throw new CmsException("can't re-encode attribute certificate!", ex);
- }
- }
- }
-
- try
- {
- return X509StoreFactory.Create(
- "AttributeCertificate/" + type,
- new X509CollectionStoreParameters(certs));
- }
- catch (ArgumentException e)
- {
- throw new CmsException("can't setup the X509Store", e);
- }
- }
-
- internal IX509Store CreateCertificateStore(
- string type,
- Asn1Set certSet)
- {
- IList certs = Platform.CreateArrayList();
-
- if (certSet != null)
- {
- AddCertsFromSet(certs, certSet);
- }
-
- try
- {
- return X509StoreFactory.Create(
- "Certificate/" + type,
- new X509CollectionStoreParameters(certs));
- }
- catch (ArgumentException e)
- {
- throw new CmsException("can't setup the X509Store", e);
- }
- }
-
- internal IX509Store CreateCrlStore(
- string type,
- Asn1Set crlSet)
- {
- IList crls = Platform.CreateArrayList();
-
- if (crlSet != null)
- {
- AddCrlsFromSet(crls, crlSet);
- }
-
- try
- {
- return X509StoreFactory.Create(
- "CRL/" + type,
- new X509CollectionStoreParameters(crls));
- }
- catch (ArgumentException e)
- {
- throw new CmsException("can't setup the X509Store", e);
- }
- }
-
- private void AddCertsFromSet(
- IList certs,
- Asn1Set certSet)
- {
- X509CertificateParser cf = new X509CertificateParser();
-
- foreach (Asn1Encodable ae in certSet)
- {
- try
- {
- Asn1Object obj = ae.ToAsn1Object();
-
- if (obj is Asn1Sequence)
- {
- // TODO Build certificate directly from sequence?
- certs.Add(cf.ReadCertificate(obj.GetEncoded()));
- }
- }
- catch (Exception ex)
- {
- throw new CmsException("can't re-encode certificate!", ex);
- }
- }
- }
-
- private void AddCrlsFromSet(
- IList crls,
- Asn1Set crlSet)
- {
- X509CrlParser cf = new X509CrlParser();
-
- foreach (Asn1Encodable ae in crlSet)
- {
- try
- {
- // TODO Build CRL directly from ae.ToAsn1Object()?
- crls.Add(cf.ReadCrl(ae.GetEncoded()));
- }
- catch (Exception ex)
- {
- throw new CmsException("can't re-encode CRL!", ex);
- }
- }
- }
-
- internal AlgorithmIdentifier FixAlgID(
- AlgorithmIdentifier algId)
- {
- if (algId.Parameters == null)
- return new AlgorithmIdentifier(algId.Algorithm, DerNull.Instance);
-
- return algId;
- }
-
- internal string GetEncOid(
- AsymmetricKeyParameter key,
- string digestOID)
- {
- string encOID = null;
-
- if (key is RsaKeyParameters)
- {
- if (!((RsaKeyParameters)key).IsPrivate)
- throw new ArgumentException("Expected RSA private key");
-
- encOID = CmsSignedGenerator.EncryptionRsa;
- }
- else if (key is DsaPrivateKeyParameters)
- {
- if (digestOID.Equals(CmsSignedGenerator.DigestSha1))
- {
- encOID = CmsSignedGenerator.EncryptionDsa;
- }
- else if (digestOID.Equals(CmsSignedGenerator.DigestSha224))
- {
- encOID = NistObjectIdentifiers.DsaWithSha224.Id;
- }
- else if (digestOID.Equals(CmsSignedGenerator.DigestSha256))
- {
- encOID = NistObjectIdentifiers.DsaWithSha256.Id;
- }
- else if (digestOID.Equals(CmsSignedGenerator.DigestSha384))
- {
- encOID = NistObjectIdentifiers.DsaWithSha384.Id;
- }
- else if (digestOID.Equals(CmsSignedGenerator.DigestSha512))
- {
- encOID = NistObjectIdentifiers.DsaWithSha512.Id;
- }
- else
- {
- throw new ArgumentException("can't mix DSA with anything but SHA1/SHA2");
- }
- }
- else if (key is ECPrivateKeyParameters)
- {
- ECPrivateKeyParameters ecPrivKey = (ECPrivateKeyParameters)key;
- string algName = ecPrivKey.AlgorithmName;
-
- if (algName == "ECGOST3410")
- {
- encOID = CmsSignedGenerator.EncryptionECGost3410;
- }
- else
- {
- // TODO Should we insist on algName being one of "EC" or "ECDSA", as Java does?
- encOID = (string)ecAlgorithms[digestOID];
-
- if (encOID == null)
- throw new ArgumentException("can't mix ECDSA with anything but SHA family digests");
- }
- }
- else if (key is Gost3410PrivateKeyParameters)
- {
- encOID = CmsSignedGenerator.EncryptionGost3410;
- }
- else
- {
- throw new ArgumentException("Unknown algorithm in CmsSignedGenerator.GetEncOid");
- }
-
- return encOID;
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSStreamException.cs b/BCCrypto/src/cms/CMSStreamException.cs
deleted file mode 100644
index 68a8be0..0000000
--- a/BCCrypto/src/cms/CMSStreamException.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Cms
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class CmsStreamException
- : IOException
- {
- public CmsStreamException()
- {
- }
-
- public CmsStreamException(
- string name)
- : base(name)
- {
- }
-
- public CmsStreamException(
- string name,
- Exception e)
- : base(name, e)
- {
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSTypedStream.cs b/BCCrypto/src/cms/CMSTypedStream.cs
deleted file mode 100644
index 6815837..0000000
--- a/BCCrypto/src/cms/CMSTypedStream.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Cms
-{
- public class CmsTypedStream
- {
- private const int BufferSize = 32 * 1024;
-
- private readonly string _oid;
- private readonly Stream _in;
-
- public CmsTypedStream(
- Stream inStream)
- : this(PkcsObjectIdentifiers.Data.Id, inStream, BufferSize)
- {
- }
-
- public CmsTypedStream(
- string oid,
- Stream inStream)
- : this(oid, inStream, BufferSize)
- {
- }
-
- public CmsTypedStream(
- string oid,
- Stream inStream,
- int bufSize)
- {
- _oid = oid;
-#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE
- _in = new FullReaderStream(inStream);
-#else
- _in = new FullReaderStream(new BufferedStream(inStream, bufSize));
-#endif
- }
-
- public string ContentType
- {
- get { return _oid; }
- }
-
- public Stream ContentStream
- {
- get { return _in; }
- }
-
- public void Drain()
- {
- Streams.Drain(_in);
- Platform.Dispose(_in);
- }
-
- private class FullReaderStream : FilterStream
- {
- internal FullReaderStream(Stream input)
- : base(input)
- {
- }
-
- public override int Read(byte[] buf, int off, int len)
- {
- return Streams.ReadFully(base.s, buf, off, len);
- }
- }
- }
-}
diff --git a/BCCrypto/src/cms/CMSUtils.cs b/BCCrypto/src/cms/CMSUtils.cs
deleted file mode 100644
index 95d7106..0000000
--- a/BCCrypto/src/cms/CMSUtils.cs
+++ /dev/null
@@ -1,186 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Cms
-{
- internal class CmsUtilities
- {
- // TODO Is there a .NET equivalent to this?
-// private static readonly Runtime RUNTIME = Runtime.getRuntime();
-
- internal static int MaximumMemory
- {
- get
- {
- // TODO Is there a .NET equivalent to this?
- long maxMem = int.MaxValue;//RUNTIME.maxMemory();
-
- if (maxMem > int.MaxValue)
- {
- return int.MaxValue;
- }
-
- return (int)maxMem;
- }
- }
-
- internal static ContentInfo ReadContentInfo(
- byte[] input)
- {
- // enforce limit checking as from a byte array
- return ReadContentInfo(new Asn1InputStream(input));
- }
-
- internal static ContentInfo ReadContentInfo(
- Stream input)
- {
- // enforce some limit checking
- return ReadContentInfo(new Asn1InputStream(input, MaximumMemory));
- }
-
- private static ContentInfo ReadContentInfo(
- Asn1InputStream aIn)
- {
- try
- {
- return ContentInfo.GetInstance(aIn.ReadObject());
- }
- catch (IOException e)
- {
- throw new CmsException("IOException reading content.", e);
- }
- catch (InvalidCastException e)
- {
- throw new CmsException("Malformed content.", e);
- }
- catch (ArgumentException e)
- {
- throw new CmsException("Malformed content.", e);
- }
- }
-
- public static byte[] StreamToByteArray(
- Stream inStream)
- {
- return Streams.ReadAll(inStream);
- }
-
- public static byte[] StreamToByteArray(
- Stream inStream,
- int limit)
- {
- return Streams.ReadAllLimited(inStream, limit);
- }
-
- public static IList GetCertificatesFromStore(
- IX509Store certStore)
- {
- try
- {
- IList certs = Platform.CreateArrayList();
-
- if (certStore != null)
- {
- foreach (X509Certificate c in certStore.GetMatches(null))
- {
- certs.Add(
- X509CertificateStructure.GetInstance(
- Asn1Object.FromByteArray(c.GetEncoded())));
- }
- }
-
- return certs;
- }
- catch (CertificateEncodingException e)
- {
- throw new CmsException("error encoding certs", e);
- }
- catch (Exception e)
- {
- throw new CmsException("error processing certs", e);
- }
- }
-
- public static IList GetCrlsFromStore(
- IX509Store crlStore)
- {
- try
- {
- IList crls = Platform.CreateArrayList();
-
- if (crlStore != null)
- {
- foreach (X509Crl c in crlStore.GetMatches(null))
- {
- crls.Add(
- CertificateList.GetInstance(
- Asn1Object.FromByteArray(c.GetEncoded())));
- }
- }
-
- return crls;
- }
- catch (CrlException e)
- {
- throw new CmsException("error encoding crls", e);
- }
- catch (Exception e)
- {
- throw new CmsException("error processing crls", e);
- }
- }
-
- public static Asn1Set CreateBerSetFromList(
- IList berObjects)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- foreach (Asn1Encodable ae in berObjects)
- {
- v.Add(ae);
- }
-
- return new BerSet(v);
- }
-
- public static Asn1Set CreateDerSetFromList(
- IList derObjects)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- foreach (Asn1Encodable ae in derObjects)
- {
- v.Add(ae);
- }
-
- return new DerSet(v);
- }
-
- internal static Stream CreateBerOctetOutputStream(Stream s, int tagNo, bool isExplicit, int bufferSize)
- {
- BerOctetStringGenerator octGen = new BerOctetStringGenerator(s, tagNo, isExplicit);
- return octGen.GetOctetOutputStream(bufferSize);
- }
-
- internal static TbsCertificateStructure GetTbsCertificateStructure(X509Certificate cert)
- {
- return TbsCertificateStructure.GetInstance(Asn1Object.FromByteArray(cert.GetTbsCertificate()));
- }
-
- internal static IssuerAndSerialNumber GetIssuerAndSerialNumber(X509Certificate cert)
- {
- TbsCertificateStructure tbsCert = GetTbsCertificateStructure(cert);
- return new IssuerAndSerialNumber(tbsCert.Issuer, tbsCert.SerialNumber.Value);
- }
- }
-}
diff --git a/BCCrypto/src/cms/CounterSignatureDigestCalculator.cs b/BCCrypto/src/cms/CounterSignatureDigestCalculator.cs
deleted file mode 100644
index 6f8bf65..0000000
--- a/BCCrypto/src/cms/CounterSignatureDigestCalculator.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Cms
-{
- internal class CounterSignatureDigestCalculator
- : IDigestCalculator
- {
- private readonly string alg;
- private readonly byte[] data;
-
- internal CounterSignatureDigestCalculator(
- string alg,
- byte[] data)
- {
- this.alg = alg;
- this.data = data;
- }
-
- public byte[] GetDigest()
- {
- IDigest digest = CmsSignedHelper.Instance.GetDigestInstance(alg);
- return DigestUtilities.DoFinal(digest, data);
- }
- }
-}
diff --git a/BCCrypto/src/cms/DefaultAuthenticatedAttributeTableGenerator.cs b/BCCrypto/src/cms/DefaultAuthenticatedAttributeTableGenerator.cs
deleted file mode 100644
index d49b1d9..0000000
--- a/BCCrypto/src/cms/DefaultAuthenticatedAttributeTableGenerator.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * Default authenticated attributes generator.
- */
- public class DefaultAuthenticatedAttributeTableGenerator
- : CmsAttributeTableGenerator
- {
- private readonly IDictionary table;
-
- /**
- * Initialise to use all defaults
- */
- public DefaultAuthenticatedAttributeTableGenerator()
- {
- table = Platform.CreateHashtable();
- }
-
- /**
- * Initialise with some extra attributes or overrides.
- *
- * @param attributeTable initial attribute table to use.
- */
- public DefaultAuthenticatedAttributeTableGenerator(
- AttributeTable attributeTable)
- {
- if (attributeTable != null)
- {
- table = attributeTable.ToDictionary();
- }
- else
- {
- table = Platform.CreateHashtable();
- }
- }
-
- /**
- * Create a standard attribute table from the passed in parameters - this will
- * normally include contentType and messageDigest. If the constructor
- * using an AttributeTable was used, entries in it for contentType and
- * messageDigest will override the generated ones.
- *
- * @param parameters source parameters for table generation.
- *
- * @return a filled in IDictionary of attributes.
- */
- protected virtual IDictionary CreateStandardAttributeTable(
- IDictionary parameters)
- {
- IDictionary std = Platform.CreateHashtable(table);
-
- if (!std.Contains(CmsAttributes.ContentType))
- {
- DerObjectIdentifier contentType = (DerObjectIdentifier)
- parameters[CmsAttributeTableParameter.ContentType];
- Asn1.Cms.Attribute attr = new Asn1.Cms.Attribute(CmsAttributes.ContentType,
- new DerSet(contentType));
- std[attr.AttrType] = attr;
- }
-
- if (!std.Contains(CmsAttributes.MessageDigest))
- {
- byte[] messageDigest = (byte[])parameters[CmsAttributeTableParameter.Digest];
- Asn1.Cms.Attribute attr = new Asn1.Cms.Attribute(CmsAttributes.MessageDigest,
- new DerSet(new DerOctetString(messageDigest)));
- std[attr.AttrType] = attr;
- }
-
- return std;
- }
-
- /**
- * @param parameters source parameters
- * @return the populated attribute table
- */
- public virtual AttributeTable GetAttributes(
- IDictionary parameters)
- {
- IDictionary table = CreateStandardAttributeTable(parameters);
- return new AttributeTable(table);
- }
- }
-}
diff --git a/BCCrypto/src/cms/DefaultSignedAttributeTableGenerator.cs b/BCCrypto/src/cms/DefaultSignedAttributeTableGenerator.cs
deleted file mode 100644
index 925a98a..0000000
--- a/BCCrypto/src/cms/DefaultSignedAttributeTableGenerator.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * Default signed attributes generator.
- */
- public class DefaultSignedAttributeTableGenerator
- : CmsAttributeTableGenerator
- {
- private readonly IDictionary table;
-
- /**
- * Initialise to use all defaults
- */
- public DefaultSignedAttributeTableGenerator()
- {
- table = Platform.CreateHashtable();
- }
-
- /**
- * Initialise with some extra attributes or overrides.
- *
- * @param attributeTable initial attribute table to use.
- */
- public DefaultSignedAttributeTableGenerator(
- AttributeTable attributeTable)
- {
- if (attributeTable != null)
- {
- table = attributeTable.ToDictionary();
- }
- else
- {
- table = Platform.CreateHashtable();
- }
- }
-
-#if SILVERLIGHT || PORTABLE
- /**
- * Create a standard attribute table from the passed in parameters - this will
- * normally include contentType, signingTime, and messageDigest. If the constructor
- * using an AttributeTable was used, entries in it for contentType, signingTime, and
- * messageDigest will override the generated ones.
- *
- * @param parameters source parameters for table generation.
- *
- * @return a filled in Hashtable of attributes.
- */
- protected virtual IDictionary createStandardAttributeTable(
- IDictionary parameters)
- {
- IDictionary std = Platform.CreateHashtable(table);
- DoCreateStandardAttributeTable(parameters, std);
- return std;
- }
-#else
- /**
- * Create a standard attribute table from the passed in parameters - this will
- * normally include contentType, signingTime, and messageDigest. If the constructor
- * using an AttributeTable was used, entries in it for contentType, signingTime, and
- * messageDigest will override the generated ones.
- *
- * @param parameters source parameters for table generation.
- *
- * @return a filled in Hashtable of attributes.
- */
- protected virtual Hashtable createStandardAttributeTable(
- IDictionary parameters)
- {
- Hashtable std = new Hashtable(table);
- DoCreateStandardAttributeTable(parameters, std);
- return std;
- }
-#endif
-
- private void DoCreateStandardAttributeTable(IDictionary parameters, IDictionary std)
- {
- // contentType will be absent if we're trying to generate a counter signature.
- if (parameters.Contains(CmsAttributeTableParameter.ContentType))
- {
- if (!std.Contains(CmsAttributes.ContentType))
- {
- DerObjectIdentifier contentType = (DerObjectIdentifier)
- parameters[CmsAttributeTableParameter.ContentType];
- Asn1.Cms.Attribute attr = new Asn1.Cms.Attribute(CmsAttributes.ContentType,
- new DerSet(contentType));
- std[attr.AttrType] = attr;
- }
- }
-
- if (!std.Contains(CmsAttributes.SigningTime))
- {
- Asn1.Cms.Attribute attr = new Asn1.Cms.Attribute(CmsAttributes.SigningTime,
- new DerSet(new Time(DateTime.UtcNow)));
- std[attr.AttrType] = attr;
- }
-
- if (!std.Contains(CmsAttributes.MessageDigest))
- {
- byte[] messageDigest = (byte[])parameters[CmsAttributeTableParameter.Digest];
- Asn1.Cms.Attribute attr = new Asn1.Cms.Attribute(CmsAttributes.MessageDigest,
- new DerSet(new DerOctetString(messageDigest)));
- std[attr.AttrType] = attr;
- }
- }
-
- /**
- * @param parameters source parameters
- * @return the populated attribute table
- */
- public virtual AttributeTable GetAttributes(
- IDictionary parameters)
- {
- IDictionary table = createStandardAttributeTable(parameters);
- return new AttributeTable(table);
- }
- }
-}
diff --git a/BCCrypto/src/cms/DigOutputStream.cs b/BCCrypto/src/cms/DigOutputStream.cs
deleted file mode 100644
index 103b45c..0000000
--- a/BCCrypto/src/cms/DigOutputStream.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Cms
-{
- internal class DigOutputStream
- : BaseOutputStream
- {
- private readonly IDigest dig;
-
- internal DigOutputStream(IDigest dig)
- {
- this.dig = dig;
- }
-
- public override void WriteByte(byte b)
- {
- dig.Update(b);
- }
-
- public override void Write(byte[] b, int off, int len)
- {
- dig.BlockUpdate(b, off, len);
- }
- }
-}
diff --git a/BCCrypto/src/cms/IDigestCalculator.cs b/BCCrypto/src/cms/IDigestCalculator.cs
deleted file mode 100644
index 3661e40..0000000
--- a/BCCrypto/src/cms/IDigestCalculator.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Cms
-{
- internal interface IDigestCalculator
- {
- byte[] GetDigest();
- }
-}
diff --git a/BCCrypto/src/cms/KEKRecipientInfoGenerator.cs b/BCCrypto/src/cms/KEKRecipientInfoGenerator.cs
deleted file mode 100644
index 6f34fec..0000000
--- a/BCCrypto/src/cms/KEKRecipientInfoGenerator.cs
+++ /dev/null
@@ -1,138 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.Kisa;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Ntt;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Cms
-{
- internal class KekRecipientInfoGenerator : RecipientInfoGenerator
- {
- private static readonly CmsEnvelopedHelper Helper = CmsEnvelopedHelper.Instance;
-
- private KeyParameter keyEncryptionKey;
- // TODO Can get this from keyEncryptionKey?
- private string keyEncryptionKeyOID;
- private KekIdentifier kekIdentifier;
-
- // Derived
- private AlgorithmIdentifier keyEncryptionAlgorithm;
-
- internal KekRecipientInfoGenerator()
- {
- }
-
- internal KekIdentifier KekIdentifier
- {
- set { this.kekIdentifier = value; }
- }
-
- internal KeyParameter KeyEncryptionKey
- {
- set
- {
- this.keyEncryptionKey = value;
- this.keyEncryptionAlgorithm = DetermineKeyEncAlg(keyEncryptionKeyOID, keyEncryptionKey);
- }
- }
-
- internal string KeyEncryptionKeyOID
- {
- set { this.keyEncryptionKeyOID = value; }
- }
-
- public RecipientInfo Generate(KeyParameter contentEncryptionKey, SecureRandom random)
- {
- byte[] keyBytes = contentEncryptionKey.GetKey();
-
- IWrapper keyWrapper = Helper.CreateWrapper(keyEncryptionAlgorithm.Algorithm.Id);
- keyWrapper.Init(true, new ParametersWithRandom(keyEncryptionKey, random));
- Asn1OctetString encryptedKey = new DerOctetString(
- keyWrapper.Wrap(keyBytes, 0, keyBytes.Length));
-
- return new RecipientInfo(new KekRecipientInfo(kekIdentifier, keyEncryptionAlgorithm, encryptedKey));
- }
-
- private static AlgorithmIdentifier DetermineKeyEncAlg(
- string algorithm, KeyParameter key)
- {
- if (Platform.StartsWith(algorithm, "DES"))
- {
- return new AlgorithmIdentifier(
- PkcsObjectIdentifiers.IdAlgCms3DesWrap,
- DerNull.Instance);
- }
- else if (Platform.StartsWith(algorithm, "RC2"))
- {
- return new AlgorithmIdentifier(
- PkcsObjectIdentifiers.IdAlgCmsRC2Wrap,
- new DerInteger(58));
- }
- else if (Platform.StartsWith(algorithm, "AES"))
- {
- int length = key.GetKey().Length * 8;
- DerObjectIdentifier wrapOid;
-
- if (length == 128)
- {
- wrapOid = NistObjectIdentifiers.IdAes128Wrap;
- }
- else if (length == 192)
- {
- wrapOid = NistObjectIdentifiers.IdAes192Wrap;
- }
- else if (length == 256)
- {
- wrapOid = NistObjectIdentifiers.IdAes256Wrap;
- }
- else
- {
- throw new ArgumentException("illegal keysize in AES");
- }
-
- return new AlgorithmIdentifier(wrapOid); // parameters absent
- }
- else if (Platform.StartsWith(algorithm, "SEED"))
- {
- // parameters absent
- return new AlgorithmIdentifier(KisaObjectIdentifiers.IdNpkiAppCmsSeedWrap);
- }
- else if (Platform.StartsWith(algorithm, "CAMELLIA"))
- {
- int length = key.GetKey().Length * 8;
- DerObjectIdentifier wrapOid;
-
- if (length == 128)
- {
- wrapOid = NttObjectIdentifiers.IdCamellia128Wrap;
- }
- else if (length == 192)
- {
- wrapOid = NttObjectIdentifiers.IdCamellia192Wrap;
- }
- else if (length == 256)
- {
- wrapOid = NttObjectIdentifiers.IdCamellia256Wrap;
- }
- else
- {
- throw new ArgumentException("illegal keysize in Camellia");
- }
-
- return new AlgorithmIdentifier(wrapOid); // parameters must be absent
- }
- else
- {
- throw new ArgumentException("unknown algorithm");
- }
- }
- }
-}
diff --git a/BCCrypto/src/cms/KEKRecipientInformation.cs b/BCCrypto/src/cms/KEKRecipientInformation.cs
deleted file mode 100644
index 871dc76..0000000
--- a/BCCrypto/src/cms/KEKRecipientInformation.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * the RecipientInfo class for a recipient who has been sent a message
- * encrypted using a secret key known to the other side.
- */
- public class KekRecipientInformation
- : RecipientInformation
- {
- private KekRecipientInfo info;
-
- internal KekRecipientInformation(
- KekRecipientInfo info,
- CmsSecureReadable secureReadable)
- : base(info.KeyEncryptionAlgorithm, secureReadable)
- {
- this.info = info;
- this.rid = new RecipientID();
-
- KekIdentifier kekId = info.KekID;
-
- rid.KeyIdentifier = kekId.KeyIdentifier.GetOctets();
- }
-
- /**
- * decrypt the content and return an input stream.
- */
- public override CmsTypedStream GetContentStream(
- ICipherParameters key)
- {
- try
- {
- byte[] encryptedKey = info.EncryptedKey.GetOctets();
- IWrapper keyWrapper = WrapperUtilities.GetWrapper(keyEncAlg.Algorithm.Id);
-
- keyWrapper.Init(false, key);
-
- KeyParameter sKey = ParameterUtilities.CreateKeyParameter(
- GetContentAlgorithmName(), keyWrapper.Unwrap(encryptedKey, 0, encryptedKey.Length));
-
- return GetContentFromSessionKey(sKey);
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("couldn't create cipher.", e);
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key invalid in message.", e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/cms/KeyAgreeRecipientInfoGenerator.cs b/BCCrypto/src/cms/KeyAgreeRecipientInfoGenerator.cs
deleted file mode 100644
index 6bd2cea..0000000
--- a/BCCrypto/src/cms/KeyAgreeRecipientInfoGenerator.cs
+++ /dev/null
@@ -1,171 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.Cms.Ecc;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Cms
-{
- internal class KeyAgreeRecipientInfoGenerator : RecipientInfoGenerator
- {
- private static readonly CmsEnvelopedHelper Helper = CmsEnvelopedHelper.Instance;
-
- private DerObjectIdentifier keyAgreementOID;
- private DerObjectIdentifier keyEncryptionOID;
- private IList recipientCerts;
- private AsymmetricCipherKeyPair senderKeyPair;
-
- internal KeyAgreeRecipientInfoGenerator()
- {
- }
-
- internal DerObjectIdentifier KeyAgreementOID
- {
- set { this.keyAgreementOID = value; }
- }
-
- internal DerObjectIdentifier KeyEncryptionOID
- {
- set { this.keyEncryptionOID = value; }
- }
-
- internal ICollection RecipientCerts
- {
- set { this.recipientCerts = Platform.CreateArrayList(value); }
- }
-
- internal AsymmetricCipherKeyPair SenderKeyPair
- {
- set { this.senderKeyPair = value; }
- }
-
- public RecipientInfo Generate(KeyParameter contentEncryptionKey, SecureRandom random)
- {
- byte[] keyBytes = contentEncryptionKey.GetKey();
-
- AsymmetricKeyParameter senderPublicKey = senderKeyPair.Public;
- ICipherParameters senderPrivateParams = senderKeyPair.Private;
-
-
- OriginatorIdentifierOrKey originator;
- try
- {
- originator = new OriginatorIdentifierOrKey(
- CreateOriginatorPublicKey(senderPublicKey));
- }
- catch (IOException e)
- {
- throw new InvalidKeyException("cannot extract originator public key: " + e);
- }
-
-
- Asn1OctetString ukm = null;
- if (keyAgreementOID.Id.Equals(CmsEnvelopedGenerator.ECMqvSha1Kdf))
- {
- try
- {
- IAsymmetricCipherKeyPairGenerator ephemKPG =
- GeneratorUtilities.GetKeyPairGenerator(keyAgreementOID);
- ephemKPG.Init(
- ((ECPublicKeyParameters)senderPublicKey).CreateKeyGenerationParameters(random));
-
- AsymmetricCipherKeyPair ephemKP = ephemKPG.GenerateKeyPair();
-
- ukm = new DerOctetString(
- new MQVuserKeyingMaterial(
- CreateOriginatorPublicKey(ephemKP.Public), null));
-
- senderPrivateParams = new MqvPrivateParameters(
- (ECPrivateKeyParameters)senderPrivateParams,
- (ECPrivateKeyParameters)ephemKP.Private,
- (ECPublicKeyParameters)ephemKP.Public);
- }
- catch (IOException e)
- {
- throw new InvalidKeyException("cannot extract MQV ephemeral public key: " + e);
- }
- catch (SecurityUtilityException e)
- {
- throw new InvalidKeyException("cannot determine MQV ephemeral key pair parameters from public key: " + e);
- }
- }
-
-
- DerSequence paramSeq = new DerSequence(
- keyEncryptionOID,
- DerNull.Instance);
- AlgorithmIdentifier keyEncAlg = new AlgorithmIdentifier(keyAgreementOID, paramSeq);
-
-
- Asn1EncodableVector recipientEncryptedKeys = new Asn1EncodableVector();
- foreach (X509Certificate recipientCert in recipientCerts)
- {
- TbsCertificateStructure tbsCert;
- try
- {
- tbsCert = TbsCertificateStructure.GetInstance(
- Asn1Object.FromByteArray(recipientCert.GetTbsCertificate()));
- }
- catch (Exception)
- {
- throw new ArgumentException("can't extract TBS structure from certificate");
- }
-
- // TODO Should there be a SubjectKeyIdentifier-based alternative?
- IssuerAndSerialNumber issuerSerial = new IssuerAndSerialNumber(
- tbsCert.Issuer, tbsCert.SerialNumber.Value);
- KeyAgreeRecipientIdentifier karid = new KeyAgreeRecipientIdentifier(issuerSerial);
-
- ICipherParameters recipientPublicParams = recipientCert.GetPublicKey();
- if (keyAgreementOID.Id.Equals(CmsEnvelopedGenerator.ECMqvSha1Kdf))
- {
- recipientPublicParams = new MqvPublicParameters(
- (ECPublicKeyParameters)recipientPublicParams,
- (ECPublicKeyParameters)recipientPublicParams);
- }
-
- // Use key agreement to choose a wrap key for this recipient
- IBasicAgreement keyAgreement = AgreementUtilities.GetBasicAgreementWithKdf(
- keyAgreementOID, keyEncryptionOID.Id);
- keyAgreement.Init(new ParametersWithRandom(senderPrivateParams, random));
- BigInteger agreedValue = keyAgreement.CalculateAgreement(recipientPublicParams);
-
- int keyEncryptionKeySize = GeneratorUtilities.GetDefaultKeySize(keyEncryptionOID) / 8;
- byte[] keyEncryptionKeyBytes = X9IntegerConverter.IntegerToBytes(agreedValue, keyEncryptionKeySize);
- KeyParameter keyEncryptionKey = ParameterUtilities.CreateKeyParameter(
- keyEncryptionOID, keyEncryptionKeyBytes);
-
- // Wrap the content encryption key with the agreement key
- IWrapper keyWrapper = Helper.CreateWrapper(keyEncryptionOID.Id);
- keyWrapper.Init(true, new ParametersWithRandom(keyEncryptionKey, random));
- byte[] encryptedKeyBytes = keyWrapper.Wrap(keyBytes, 0, keyBytes.Length);
-
- Asn1OctetString encryptedKey = new DerOctetString(encryptedKeyBytes);
-
- recipientEncryptedKeys.Add(new RecipientEncryptedKey(karid, encryptedKey));
- }
-
- return new RecipientInfo(new KeyAgreeRecipientInfo(originator, ukm, keyEncAlg,
- new DerSequence(recipientEncryptedKeys)));
- }
-
- private static OriginatorPublicKey CreateOriginatorPublicKey(
- AsymmetricKeyParameter publicKey)
- {
- SubjectPublicKeyInfo spki = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey);
- return new OriginatorPublicKey(
- new AlgorithmIdentifier(spki.AlgorithmID.Algorithm, DerNull.Instance),
- spki.PublicKeyData.GetBytes());
- }
- }
-}
diff --git a/BCCrypto/src/cms/KeyAgreeRecipientInformation.cs b/BCCrypto/src/cms/KeyAgreeRecipientInformation.cs
deleted file mode 100644
index 73e57a7..0000000
--- a/BCCrypto/src/cms/KeyAgreeRecipientInformation.cs
+++ /dev/null
@@ -1,226 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.Cms.Ecc;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.Utilities;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Pkcs;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * the RecipientInfo class for a recipient who has been sent a message
- * encrypted using key agreement.
- */
- public class KeyAgreeRecipientInformation
- : RecipientInformation
- {
- private KeyAgreeRecipientInfo info;
- private Asn1OctetString encryptedKey;
-
- internal static void ReadRecipientInfo(IList infos, KeyAgreeRecipientInfo info,
- CmsSecureReadable secureReadable)
- {
- try
- {
- foreach (Asn1Encodable rek in info.RecipientEncryptedKeys)
- {
- RecipientEncryptedKey id = RecipientEncryptedKey.GetInstance(rek.ToAsn1Object());
-
- RecipientID rid = new RecipientID();
-
- Asn1.Cms.KeyAgreeRecipientIdentifier karid = id.Identifier;
-
- Asn1.Cms.IssuerAndSerialNumber iAndSN = karid.IssuerAndSerialNumber;
- if (iAndSN != null)
- {
- rid.Issuer = iAndSN.Name;
- rid.SerialNumber = iAndSN.SerialNumber.Value;
- }
- else
- {
- Asn1.Cms.RecipientKeyIdentifier rKeyID = karid.RKeyID;
-
- // Note: 'date' and 'other' fields of RecipientKeyIdentifier appear to be only informational
-
- rid.SubjectKeyIdentifier = rKeyID.SubjectKeyIdentifier.GetOctets();
- }
-
- infos.Add(new KeyAgreeRecipientInformation(info, rid, id.EncryptedKey,
- secureReadable));
- }
- }
- catch (IOException e)
- {
- throw new ArgumentException("invalid rid in KeyAgreeRecipientInformation", e);
- }
- }
-
- internal KeyAgreeRecipientInformation(
- KeyAgreeRecipientInfo info,
- RecipientID rid,
- Asn1OctetString encryptedKey,
- CmsSecureReadable secureReadable)
- : base(info.KeyEncryptionAlgorithm, secureReadable)
- {
- this.info = info;
- this.rid = rid;
- this.encryptedKey = encryptedKey;
- }
-
- private AsymmetricKeyParameter GetSenderPublicKey(
- AsymmetricKeyParameter receiverPrivateKey,
- OriginatorIdentifierOrKey originator)
- {
- OriginatorPublicKey opk = originator.OriginatorPublicKey;
- if (opk != null)
- {
- return GetPublicKeyFromOriginatorPublicKey(receiverPrivateKey, opk);
- }
-
- OriginatorID origID = new OriginatorID();
-
- Asn1.Cms.IssuerAndSerialNumber iAndSN = originator.IssuerAndSerialNumber;
- if (iAndSN != null)
- {
- origID.Issuer = iAndSN.Name;
- origID.SerialNumber = iAndSN.SerialNumber.Value;
- }
- else
- {
- SubjectKeyIdentifier ski = originator.SubjectKeyIdentifier;
-
- origID.SubjectKeyIdentifier = ski.GetKeyIdentifier();
- }
-
- return GetPublicKeyFromOriginatorID(origID);
- }
-
- private AsymmetricKeyParameter GetPublicKeyFromOriginatorPublicKey(
- AsymmetricKeyParameter receiverPrivateKey,
- OriginatorPublicKey originatorPublicKey)
- {
- PrivateKeyInfo privInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(receiverPrivateKey);
- SubjectPublicKeyInfo pubInfo = new SubjectPublicKeyInfo(
- privInfo.PrivateKeyAlgorithm,
- originatorPublicKey.PublicKey.GetBytes());
- return PublicKeyFactory.CreateKey(pubInfo);
- }
-
- private AsymmetricKeyParameter GetPublicKeyFromOriginatorID(
- OriginatorID origID)
- {
- // TODO Support all alternatives for OriginatorIdentifierOrKey
- // see RFC 3852 6.2.2
- throw new CmsException("No support for 'originator' as IssuerAndSerialNumber or SubjectKeyIdentifier");
- }
-
- 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 UnwrapSessionKey(
- string wrapAlg,
- KeyParameter agreedKey)
- {
- byte[] encKeyOctets = encryptedKey.GetOctets();
-
- IWrapper keyCipher = WrapperUtilities.GetWrapper(wrapAlg);
- keyCipher.Init(false, agreedKey);
- byte[] sKeyBytes = keyCipher.Unwrap(encKeyOctets, 0, encKeyOctets.Length);
- return ParameterUtilities.CreateKeyParameter(GetContentAlgorithmName(), sKeyBytes);
- }
-
- internal KeyParameter GetSessionKey(
- AsymmetricKeyParameter receiverPrivateKey)
- {
- try
- {
- string wrapAlg = DerObjectIdentifier.GetInstance(
- Asn1Sequence.GetInstance(keyEncAlg.Parameters)[0]).Id;
-
- AsymmetricKeyParameter senderPublicKey = GetSenderPublicKey(
- receiverPrivateKey, info.Originator);
-
- KeyParameter agreedWrapKey = CalculateAgreedWrapKey(wrapAlg,
- senderPublicKey, receiverPrivateKey);
-
- return UnwrapSessionKey(wrapAlg, agreedWrapKey);
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("couldn't create cipher.", e);
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key invalid in message.", e);
- }
- catch (Exception e)
- {
- throw new CmsException("originator key invalid.", e);
- }
- }
-
- /**
- * decrypt the content and return an input stream.
- */
- public override CmsTypedStream GetContentStream(
- ICipherParameters key)
- {
- if (!(key is AsymmetricKeyParameter))
- throw new ArgumentException("KeyAgreement requires asymmetric key", "key");
-
- AsymmetricKeyParameter receiverPrivateKey = (AsymmetricKeyParameter) key;
-
- if (!receiverPrivateKey.IsPrivate)
- throw new ArgumentException("Expected private key", "key");
-
- KeyParameter sKey = GetSessionKey(receiverPrivateKey);
-
- return GetContentFromSessionKey(sKey);
- }
- }
-}
diff --git a/BCCrypto/src/cms/KeyTransRecipientInfoGenerator.cs b/BCCrypto/src/cms/KeyTransRecipientInfoGenerator.cs
deleted file mode 100644
index a1d8fbf..0000000
--- a/BCCrypto/src/cms/KeyTransRecipientInfoGenerator.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Cms
-{
- internal class KeyTransRecipientInfoGenerator : RecipientInfoGenerator
- {
- private static readonly CmsEnvelopedHelper Helper = CmsEnvelopedHelper.Instance;
-
- private TbsCertificateStructure recipientTbsCert;
- private AsymmetricKeyParameter recipientPublicKey;
- private Asn1OctetString subjectKeyIdentifier;
-
- // Derived fields
- private SubjectPublicKeyInfo info;
-
- internal KeyTransRecipientInfoGenerator()
- {
- }
-
- internal X509Certificate RecipientCert
- {
- set
- {
- this.recipientTbsCert = CmsUtilities.GetTbsCertificateStructure(value);
- this.recipientPublicKey = value.GetPublicKey();
- this.info = recipientTbsCert.SubjectPublicKeyInfo;
- }
- }
-
- internal AsymmetricKeyParameter RecipientPublicKey
- {
- set
- {
- this.recipientPublicKey = value;
-
- try
- {
- info = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(
- recipientPublicKey);
- }
- catch (IOException)
- {
- throw new ArgumentException("can't extract key algorithm from this key");
- }
- }
- }
-
- internal Asn1OctetString SubjectKeyIdentifier
- {
- set { this.subjectKeyIdentifier = value; }
- }
-
- public RecipientInfo Generate(KeyParameter contentEncryptionKey, SecureRandom random)
- {
- byte[] keyBytes = contentEncryptionKey.GetKey();
- AlgorithmIdentifier keyEncryptionAlgorithm = info.AlgorithmID;
-
- IWrapper keyWrapper = Helper.CreateWrapper(keyEncryptionAlgorithm.Algorithm.Id);
- keyWrapper.Init(true, new ParametersWithRandom(recipientPublicKey, random));
- byte[] encryptedKeyBytes = keyWrapper.Wrap(keyBytes, 0, keyBytes.Length);
-
- RecipientIdentifier recipId;
- if (recipientTbsCert != null)
- {
- IssuerAndSerialNumber issuerAndSerial = new IssuerAndSerialNumber(
- recipientTbsCert.Issuer, recipientTbsCert.SerialNumber.Value);
- recipId = new RecipientIdentifier(issuerAndSerial);
- }
- else
- {
- recipId = new RecipientIdentifier(subjectKeyIdentifier);
- }
-
- return new RecipientInfo(new KeyTransRecipientInfo(recipId, keyEncryptionAlgorithm,
- new DerOctetString(encryptedKeyBytes)));
- }
- }
-}
diff --git a/BCCrypto/src/cms/KeyTransRecipientInformation.cs b/BCCrypto/src/cms/KeyTransRecipientInformation.cs
deleted file mode 100644
index 3b1ea7b..0000000
--- a/BCCrypto/src/cms/KeyTransRecipientInformation.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Asn1Pkcs = Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * the KeyTransRecipientInformation class for a recipient who has been sent a secret
- * key encrypted using their public key that needs to be used to
- * extract the message.
- */
- public class KeyTransRecipientInformation
- : RecipientInformation
- {
- private KeyTransRecipientInfo info;
-
- internal KeyTransRecipientInformation(
- KeyTransRecipientInfo info,
- CmsSecureReadable secureReadable)
- : base(info.KeyEncryptionAlgorithm, secureReadable)
- {
- this.info = info;
- this.rid = new RecipientID();
-
- RecipientIdentifier r = info.RecipientIdentifier;
-
- try
- {
- if (r.IsTagged)
- {
- Asn1OctetString octs = Asn1OctetString.GetInstance(r.ID);
-
- rid.SubjectKeyIdentifier = octs.GetOctets();
- }
- else
- {
- IssuerAndSerialNumber iAnds = IssuerAndSerialNumber.GetInstance(r.ID);
-
- rid.Issuer = iAnds.Name;
- rid.SerialNumber = iAnds.SerialNumber.Value;
- }
- }
- catch (IOException)
- {
- throw new ArgumentException("invalid rid in KeyTransRecipientInformation");
- }
- }
-
- private string GetExchangeEncryptionAlgorithmName(
- DerObjectIdentifier oid)
- {
- if (Asn1Pkcs.PkcsObjectIdentifiers.RsaEncryption.Equals(oid))
- {
- return "RSA//PKCS1Padding";
- }
-
- return oid.Id;
- }
-
- internal KeyParameter UnwrapKey(ICipherParameters key)
- {
- byte[] encryptedKey = info.EncryptedKey.GetOctets();
- string keyExchangeAlgorithm = GetExchangeEncryptionAlgorithmName(keyEncAlg.Algorithm);
-
- try
- {
- IWrapper keyWrapper = WrapperUtilities.GetWrapper(keyExchangeAlgorithm);
- keyWrapper.Init(false, key);
-
- // FIXME Support for MAC algorithm parameters similar to cipher parameters
- return ParameterUtilities.CreateKeyParameter(
- GetContentAlgorithmName(), keyWrapper.Unwrap(encryptedKey, 0, encryptedKey.Length));
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("couldn't create cipher.", e);
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key invalid in message.", e);
- }
-// catch (IllegalBlockSizeException e)
- catch (DataLengthException e)
- {
- throw new CmsException("illegal blocksize in message.", e);
- }
-// catch (BadPaddingException e)
- catch (InvalidCipherTextException e)
- {
- throw new CmsException("bad padding in message.", e);
- }
- }
-
- /**
- * decrypt the content and return it as a byte array.
- */
- public override CmsTypedStream GetContentStream(
- ICipherParameters key)
- {
- KeyParameter sKey = UnwrapKey(key);
-
- return GetContentFromSessionKey(sKey);
- }
- }
-}
diff --git a/BCCrypto/src/cms/MacOutputStream.cs b/BCCrypto/src/cms/MacOutputStream.cs
deleted file mode 100644
index 8891dbc..0000000
--- a/BCCrypto/src/cms/MacOutputStream.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Cms
-{
- internal class MacOutputStream
- : BaseOutputStream
- {
- private readonly IMac mac;
-
- internal MacOutputStream(IMac mac)
- {
- this.mac = mac;
- }
-
- public override void Write(byte[] b, int off, int len)
- {
- mac.BlockUpdate(b, off, len);
- }
-
- public override void WriteByte(byte b)
- {
- mac.Update(b);
- }
- }
-}
diff --git a/BCCrypto/src/cms/OriginatorId.cs b/BCCrypto/src/cms/OriginatorId.cs
deleted file mode 100644
index 5a3b737..0000000
--- a/BCCrypto/src/cms/OriginatorId.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * a basic index for an originator.
- */
- public class OriginatorID
- : X509CertStoreSelector
- {
- public override int GetHashCode()
- {
- int code = Arrays.GetHashCode(this.SubjectKeyIdentifier);
-
- BigInteger serialNumber = this.SerialNumber;
- if (serialNumber != null)
- {
- code ^= serialNumber.GetHashCode();
- }
-
- X509Name issuer = this.Issuer;
- if (issuer != null)
- {
- code ^= issuer.GetHashCode();
- }
-
- return code;
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return false;
-
- OriginatorID id = obj as OriginatorID;
-
- if (id == null)
- return false;
-
- return Arrays.AreEqual(SubjectKeyIdentifier, id.SubjectKeyIdentifier)
- && Platform.Equals(SerialNumber, id.SerialNumber)
- && IssuersMatch(Issuer, id.Issuer);
- }
- }
-}
diff --git a/BCCrypto/src/cms/OriginatorInfoGenerator.cs b/BCCrypto/src/cms/OriginatorInfoGenerator.cs
deleted file mode 100644
index 6bf1087..0000000
--- a/BCCrypto/src/cms/OriginatorInfoGenerator.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Cms
-{
- public class OriginatorInfoGenerator
- {
- private readonly IList origCerts;
- private readonly IList origCrls;
-
- public OriginatorInfoGenerator(X509Certificate origCert)
- {
- this.origCerts = Platform.CreateArrayList(1);
- this.origCrls = null;
- origCerts.Add(origCert.CertificateStructure);
- }
-
- public OriginatorInfoGenerator(IX509Store origCerts)
- : this(origCerts, null)
- {
- }
-
- public OriginatorInfoGenerator(IX509Store origCerts, IX509Store origCrls)
- {
- this.origCerts = CmsUtilities.GetCertificatesFromStore(origCerts);
- this.origCrls = origCrls == null ? null : CmsUtilities.GetCrlsFromStore(origCrls);
- }
-
- public virtual OriginatorInfo Generate()
- {
- Asn1Set certSet = CmsUtilities.CreateDerSetFromList(origCerts);
- Asn1Set crlSet = origCrls == null ? null : CmsUtilities.CreateDerSetFromList(origCrls);
- return new OriginatorInfo(certSet, crlSet);
- }
- }
-}
diff --git a/BCCrypto/src/cms/OriginatorInformation.cs b/BCCrypto/src/cms/OriginatorInformation.cs
deleted file mode 100644
index 618add6..0000000
--- a/BCCrypto/src/cms/OriginatorInformation.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Cms
-{
- public class OriginatorInformation
- {
- private readonly OriginatorInfo originatorInfo;
-
- internal OriginatorInformation(OriginatorInfo originatorInfo)
- {
- this.originatorInfo = originatorInfo;
- }
-
- /**
- * Return the certificates stored in the underlying OriginatorInfo object.
- *
- * @return a Store of X509CertificateHolder objects.
- */
- public virtual IX509Store GetCertificates()
- {
- Asn1Set certSet = originatorInfo.Certificates;
-
- if (certSet != null)
- {
- IList certList = Platform.CreateArrayList(certSet.Count);
-
- foreach (Asn1Encodable enc in certSet)
- {
- Asn1Object obj = enc.ToAsn1Object();
- if (obj is Asn1Sequence)
- {
- certList.Add(new X509Certificate(X509CertificateStructure.GetInstance(obj)));
- }
- }
-
- return X509StoreFactory.Create(
- "Certificate/Collection",
- new X509CollectionStoreParameters(certList));
- }
-
- return X509StoreFactory.Create(
- "Certificate/Collection",
- new X509CollectionStoreParameters(Platform.CreateArrayList()));
- }
-
- /**
- * Return the CRLs stored in the underlying OriginatorInfo object.
- *
- * @return a Store of X509CRLHolder objects.
- */
- public virtual IX509Store GetCrls()
- {
- Asn1Set crlSet = originatorInfo.Certificates;
-
- if (crlSet != null)
- {
- IList crlList = Platform.CreateArrayList(crlSet.Count);
-
- foreach (Asn1Encodable enc in crlSet)
- {
- Asn1Object obj = enc.ToAsn1Object();
- if (obj is Asn1Sequence)
- {
- crlList.Add(new X509Crl(CertificateList.GetInstance(obj)));
- }
- }
-
- return X509StoreFactory.Create(
- "CRL/Collection",
- new X509CollectionStoreParameters(crlList));
- }
-
- return X509StoreFactory.Create(
- "CRL/Collection",
- new X509CollectionStoreParameters(Platform.CreateArrayList()));
- }
-
- /**
- * Return the underlying ASN.1 object defining this SignerInformation object.
- *
- * @return a OriginatorInfo.
- */
- public virtual OriginatorInfo ToAsn1Structure()
- {
- return originatorInfo;
- }
- }
-}
diff --git a/BCCrypto/src/cms/PKCS5Scheme2PBEKey.cs b/BCCrypto/src/cms/PKCS5Scheme2PBEKey.cs
deleted file mode 100644
index 08b8518..0000000
--- a/BCCrypto/src/cms/PKCS5Scheme2PBEKey.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Cms
-{
- ///
- /// PKCS5 scheme-2 - password converted to bytes assuming ASCII.
- ///
- public class Pkcs5Scheme2PbeKey
- : CmsPbeKey
- {
- [Obsolete("Use version taking 'char[]' instead")]
- public Pkcs5Scheme2PbeKey(
- string password,
- byte[] salt,
- int iterationCount)
- : this(password.ToCharArray(), salt, iterationCount)
- {
- }
-
- [Obsolete("Use version taking 'char[]' instead")]
- public Pkcs5Scheme2PbeKey(
- string password,
- AlgorithmIdentifier keyDerivationAlgorithm)
- : this(password.ToCharArray(), keyDerivationAlgorithm)
- {
- }
-
- public Pkcs5Scheme2PbeKey(
- char[] password,
- byte[] salt,
- int iterationCount)
- : base(password, salt, iterationCount)
- {
- }
-
- public Pkcs5Scheme2PbeKey(
- char[] password,
- AlgorithmIdentifier keyDerivationAlgorithm)
- : base(password, keyDerivationAlgorithm)
- {
- }
-
- internal override KeyParameter GetEncoded(
- string algorithmOid)
- {
- Pkcs5S2ParametersGenerator gen = new Pkcs5S2ParametersGenerator();
-
- gen.Init(
- PbeParametersGenerator.Pkcs5PasswordToBytes(password),
- salt,
- iterationCount);
-
- return (KeyParameter) gen.GenerateDerivedParameters(
- algorithmOid,
- CmsEnvelopedHelper.Instance.GetKeySize(algorithmOid));
- }
- }
-}
diff --git a/BCCrypto/src/cms/PKCS5Scheme2UTF8PBEKey.cs b/BCCrypto/src/cms/PKCS5Scheme2UTF8PBEKey.cs
deleted file mode 100644
index 7aecc29..0000000
--- a/BCCrypto/src/cms/PKCS5Scheme2UTF8PBEKey.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * PKCS5 scheme-2 - password converted to bytes using UTF-8.
- */
- public class Pkcs5Scheme2Utf8PbeKey
- : CmsPbeKey
- {
- [Obsolete("Use version taking 'char[]' instead")]
- public Pkcs5Scheme2Utf8PbeKey(
- string password,
- byte[] salt,
- int iterationCount)
- : this(password.ToCharArray(), salt, iterationCount)
- {
- }
-
- [Obsolete("Use version taking 'char[]' instead")]
- public Pkcs5Scheme2Utf8PbeKey(
- string password,
- AlgorithmIdentifier keyDerivationAlgorithm)
- : this(password.ToCharArray(), keyDerivationAlgorithm)
- {
- }
-
- public Pkcs5Scheme2Utf8PbeKey(
- char[] password,
- byte[] salt,
- int iterationCount)
- : base(password, salt, iterationCount)
- {
- }
-
- public Pkcs5Scheme2Utf8PbeKey(
- char[] password,
- AlgorithmIdentifier keyDerivationAlgorithm)
- : base(password, keyDerivationAlgorithm)
- {
- }
-
- internal override KeyParameter GetEncoded(
- string algorithmOid)
- {
- Pkcs5S2ParametersGenerator gen = new Pkcs5S2ParametersGenerator();
-
- gen.Init(
- PbeParametersGenerator.Pkcs5PasswordToUtf8Bytes(password),
- salt,
- iterationCount);
-
- return (KeyParameter) gen.GenerateDerivedParameters(
- algorithmOid,
- CmsEnvelopedHelper.Instance.GetKeySize(algorithmOid));
- }
- }
-}
diff --git a/BCCrypto/src/cms/PasswordRecipientInfoGenerator.cs b/BCCrypto/src/cms/PasswordRecipientInfoGenerator.cs
deleted file mode 100644
index 9916edf..0000000
--- a/BCCrypto/src/cms/PasswordRecipientInfoGenerator.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Cms
-{
- internal class PasswordRecipientInfoGenerator : RecipientInfoGenerator
- {
- private static readonly CmsEnvelopedHelper Helper = CmsEnvelopedHelper.Instance;
-
- private AlgorithmIdentifier keyDerivationAlgorithm;
- private KeyParameter keyEncryptionKey;
- // TODO Can get this from keyEncryptionKey?
- private string keyEncryptionKeyOID;
-
- internal PasswordRecipientInfoGenerator()
- {
- }
-
- internal AlgorithmIdentifier KeyDerivationAlgorithm
- {
- set { this.keyDerivationAlgorithm = value; }
- }
-
- internal KeyParameter KeyEncryptionKey
- {
- set { this.keyEncryptionKey = value; }
- }
-
- internal string KeyEncryptionKeyOID
- {
- set { this.keyEncryptionKeyOID = value; }
- }
-
- public RecipientInfo Generate(KeyParameter contentEncryptionKey, SecureRandom random)
- {
- byte[] keyBytes = contentEncryptionKey.GetKey();
-
- string rfc3211WrapperName = Helper.GetRfc3211WrapperName(keyEncryptionKeyOID);
- IWrapper keyWrapper = Helper.CreateWrapper(rfc3211WrapperName);
-
- // Note: In Java build, the IV is automatically generated in JCE layer
- int ivLength = Platform.StartsWith(rfc3211WrapperName, "DESEDE") ? 8 : 16;
- byte[] iv = new byte[ivLength];
- random.NextBytes(iv);
-
- ICipherParameters parameters = new ParametersWithIV(keyEncryptionKey, iv);
- keyWrapper.Init(true, new ParametersWithRandom(parameters, random));
- Asn1OctetString encryptedKey = new DerOctetString(
- keyWrapper.Wrap(keyBytes, 0, keyBytes.Length));
-
- DerSequence seq = new DerSequence(
- new DerObjectIdentifier(keyEncryptionKeyOID),
- new DerOctetString(iv));
-
- AlgorithmIdentifier keyEncryptionAlgorithm = new AlgorithmIdentifier(
- PkcsObjectIdentifiers.IdAlgPwriKek, seq);
-
- return new RecipientInfo(new PasswordRecipientInfo(
- keyDerivationAlgorithm, keyEncryptionAlgorithm, encryptedKey));
- }
- }
-}
diff --git a/BCCrypto/src/cms/PasswordRecipientInformation.cs b/BCCrypto/src/cms/PasswordRecipientInformation.cs
deleted file mode 100644
index f629cab..0000000
--- a/BCCrypto/src/cms/PasswordRecipientInformation.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * the RecipientInfo class for a recipient who has been sent a message
- * encrypted using a password.
- */
- public class PasswordRecipientInformation
- : RecipientInformation
- {
- private readonly PasswordRecipientInfo info;
-
- internal PasswordRecipientInformation(
- PasswordRecipientInfo info,
- CmsSecureReadable secureReadable)
- : base(info.KeyEncryptionAlgorithm, secureReadable)
- {
- this.info = info;
- this.rid = new RecipientID();
- }
-
- /**
- * return the object identifier for the key derivation algorithm, or null
- * if there is none present.
- *
- * @return OID for key derivation algorithm, if present.
- */
- public virtual AlgorithmIdentifier KeyDerivationAlgorithm
- {
- get { return info.KeyDerivationAlgorithm; }
- }
-
- /**
- * decrypt the content and return an input stream.
- */
- public override CmsTypedStream GetContentStream(
- ICipherParameters key)
- {
- try
- {
- AlgorithmIdentifier kekAlg = AlgorithmIdentifier.GetInstance(info.KeyEncryptionAlgorithm);
- Asn1Sequence kekAlgParams = (Asn1Sequence)kekAlg.Parameters;
- byte[] encryptedKey = info.EncryptedKey.GetOctets();
- string kekAlgName = DerObjectIdentifier.GetInstance(kekAlgParams[0]).Id;
- string cName = CmsEnvelopedHelper.Instance.GetRfc3211WrapperName(kekAlgName);
- IWrapper keyWrapper = WrapperUtilities.GetWrapper(cName);
-
- byte[] iv = Asn1OctetString.GetInstance(kekAlgParams[1]).GetOctets();
-
- ICipherParameters parameters = ((CmsPbeKey)key).GetEncoded(kekAlgName);
- parameters = new ParametersWithIV(parameters, iv);
-
- keyWrapper.Init(false, parameters);
-
- KeyParameter sKey = ParameterUtilities.CreateKeyParameter(
- GetContentAlgorithmName(), keyWrapper.Unwrap(encryptedKey, 0, encryptedKey.Length));
-
- return GetContentFromSessionKey(sKey);
- }
- catch (SecurityUtilityException e)
- {
- throw new CmsException("couldn't create cipher.", e);
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key invalid in message.", e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/cms/RecipientId.cs b/BCCrypto/src/cms/RecipientId.cs
deleted file mode 100644
index 9b6eb09..0000000
--- a/BCCrypto/src/cms/RecipientId.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Cms
-{
- public class RecipientID
- : X509CertStoreSelector
- {
- private byte[] keyIdentifier;
-
- public byte[] KeyIdentifier
- {
- get { return Arrays.Clone(keyIdentifier); }
- set { keyIdentifier = Arrays.Clone(value); }
- }
-
- public override int GetHashCode()
- {
- int code = Arrays.GetHashCode(keyIdentifier)
- ^ Arrays.GetHashCode(this.SubjectKeyIdentifier);
-
- BigInteger serialNumber = this.SerialNumber;
- if (serialNumber != null)
- {
- code ^= serialNumber.GetHashCode();
- }
-
- X509Name issuer = this.Issuer;
- if (issuer != null)
- {
- code ^= issuer.GetHashCode();
- }
-
- return code;
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- RecipientID id = obj as RecipientID;
-
- if (id == null)
- return false;
-
- return Arrays.AreEqual(keyIdentifier, id.keyIdentifier)
- && Arrays.AreEqual(SubjectKeyIdentifier, id.SubjectKeyIdentifier)
- && Platform.Equals(SerialNumber, id.SerialNumber)
- && IssuersMatch(Issuer, id.Issuer);
- }
- }
-}
diff --git a/BCCrypto/src/cms/RecipientInfoGenerator.cs b/BCCrypto/src/cms/RecipientInfoGenerator.cs
deleted file mode 100644
index c41db61..0000000
--- a/BCCrypto/src/cms/RecipientInfoGenerator.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Cms
-{
- interface RecipientInfoGenerator
- {
- ///
- /// Generate a RecipientInfo object for the given key.
- ///
- ///
- /// A
- ///
- ///
- /// A
- ///
- ///
- /// A
- ///
- ///
- RecipientInfo Generate(KeyParameter contentEncryptionKey, SecureRandom random);
- }
-}
diff --git a/BCCrypto/src/cms/RecipientInformation.cs b/BCCrypto/src/cms/RecipientInformation.cs
deleted file mode 100644
index 272b841..0000000
--- a/BCCrypto/src/cms/RecipientInformation.cs
+++ /dev/null
@@ -1,126 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Cms
-{
- public abstract class RecipientInformation
- {
- internal RecipientID rid = new RecipientID();
- internal AlgorithmIdentifier keyEncAlg;
- internal CmsSecureReadable secureReadable;
-
- private byte[] resultMac;
-
- internal RecipientInformation(
- AlgorithmIdentifier keyEncAlg,
- CmsSecureReadable secureReadable)
- {
- this.keyEncAlg = keyEncAlg;
- this.secureReadable = secureReadable;
- }
-
- internal string GetContentAlgorithmName()
- {
- AlgorithmIdentifier algorithm = secureReadable.Algorithm;
-// return CmsEnvelopedHelper.Instance.GetSymmetricCipherName(algorithm.Algorithm.Id);
- return algorithm.Algorithm.Id;
- }
-
- public RecipientID RecipientID
- {
- get { return rid; }
- }
-
- public AlgorithmIdentifier KeyEncryptionAlgorithmID
- {
- get { return keyEncAlg; }
- }
-
- /**
- * return the object identifier for the key encryption algorithm.
- *
- * @return OID for key encryption algorithm.
- */
- public string KeyEncryptionAlgOid
- {
- get { return keyEncAlg.Algorithm.Id; }
- }
-
- /**
- * return the ASN.1 encoded key encryption algorithm parameters, or null if
- * there aren't any.
- *
- * @return ASN.1 encoding of key encryption algorithm parameters.
- */
- public Asn1Object KeyEncryptionAlgParams
- {
- get
- {
- Asn1Encodable ae = keyEncAlg.Parameters;
-
- return ae == null ? null : ae.ToAsn1Object();
- }
- }
-
- internal CmsTypedStream GetContentFromSessionKey(
- KeyParameter sKey)
- {
- CmsReadable readable = secureReadable.GetReadable(sKey);
-
- try
- {
- return new CmsTypedStream(readable.GetInputStream());
- }
- catch (IOException e)
- {
- throw new CmsException("error getting .", e);
- }
- }
-
- public byte[] GetContent(
- ICipherParameters key)
- {
- try
- {
- return CmsUtilities.StreamToByteArray(GetContentStream(key).ContentStream);
- }
- catch (IOException e)
- {
- throw new Exception("unable to parse internal stream: " + e);
- }
- }
-
- /**
- * Return the MAC calculated for the content stream. Note: this call is only meaningful once all
- * the content has been read.
- *
- * @return byte array containing the mac.
- */
- public byte[] GetMac()
- {
- if (resultMac == null)
- {
- object cryptoObject = secureReadable.CryptoObject;
- if (cryptoObject is IMac)
- {
- resultMac = MacUtilities.DoFinal((IMac)cryptoObject);
- }
- }
-
- return Arrays.Clone(resultMac);
- }
-
- public abstract CmsTypedStream GetContentStream(ICipherParameters key);
- }
-}
diff --git a/BCCrypto/src/cms/RecipientInformationStore.cs b/BCCrypto/src/cms/RecipientInformationStore.cs
deleted file mode 100644
index 33b472f..0000000
--- a/BCCrypto/src/cms/RecipientInformationStore.cs
+++ /dev/null
@@ -1,86 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Cms
-{
- public class RecipientInformationStore
- {
- private readonly IList all; //ArrayList[RecipientInformation]
- private readonly IDictionary table = Platform.CreateHashtable(); // Hashtable[RecipientID, ArrayList[RecipientInformation]]
-
- public RecipientInformationStore(
- ICollection recipientInfos)
- {
- foreach (RecipientInformation recipientInformation in recipientInfos)
- {
- RecipientID rid = recipientInformation.RecipientID;
- IList list = (IList)table[rid];
-
- if (list == null)
- {
- table[rid] = list = Platform.CreateArrayList(1);
- }
-
- list.Add(recipientInformation);
- }
-
- this.all = Platform.CreateArrayList(recipientInfos);
- }
-
- public RecipientInformation this[RecipientID selector]
- {
- get { return GetFirstRecipient(selector); }
- }
-
- /**
- * Return the first RecipientInformation object that matches the
- * passed in selector. Null if there are no matches.
- *
- * @param selector to identify a recipient
- * @return a single RecipientInformation object. Null if none matches.
- */
- public RecipientInformation GetFirstRecipient(
- RecipientID selector)
- {
- IList list = (IList) table[selector];
-
- return list == null ? null : (RecipientInformation) list[0];
- }
-
- /**
- * Return the number of recipients in the collection.
- *
- * @return number of recipients identified.
- */
- public int Count
- {
- get { return all.Count; }
- }
-
- /**
- * Return all recipients in the collection
- *
- * @return a collection of recipients.
- */
- public ICollection GetRecipients()
- {
- return Platform.CreateArrayList(all);
- }
-
- /**
- * Return possible empty collection with recipients matching the passed in RecipientID
- *
- * @param selector a recipient id to select against.
- * @return a collection of RecipientInformation objects.
- */
- public ICollection GetRecipients(
- RecipientID selector)
- {
- IList list = (IList)table[selector];
-
- return list == null ? Platform.CreateArrayList() : Platform.CreateArrayList(list);
- }
- }
-}
diff --git a/BCCrypto/src/cms/SigOutputStream.cs b/BCCrypto/src/cms/SigOutputStream.cs
deleted file mode 100644
index a807fa7..0000000
--- a/BCCrypto/src/cms/SigOutputStream.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Utilities.IO;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Cms
-{
- internal class SigOutputStream
- : BaseOutputStream
- {
- private readonly ISigner sig;
-
- internal SigOutputStream(ISigner sig)
- {
- this.sig = sig;
- }
-
- public override void WriteByte(byte b)
- {
- try
- {
- sig.Update(b);
- }
- catch (SignatureException e)
- {
- throw new CmsStreamException("signature problem: " + e);
- }
- }
-
- public override void Write(byte[] b, int off, int len)
- {
- try
- {
- sig.BlockUpdate(b, off, len);
- }
- catch (SignatureException e)
- {
- throw new CmsStreamException("signature problem: " + e);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/cms/SignerId.cs b/BCCrypto/src/cms/SignerId.cs
deleted file mode 100644
index baac936..0000000
--- a/BCCrypto/src/cms/SignerId.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * a basic index for a signer.
- */
- public class SignerID
- : X509CertStoreSelector
- {
- public override int GetHashCode()
- {
- int code = Arrays.GetHashCode(this.SubjectKeyIdentifier);
-
- BigInteger serialNumber = this.SerialNumber;
- if (serialNumber != null)
- {
- code ^= serialNumber.GetHashCode();
- }
-
- X509Name issuer = this.Issuer;
- if (issuer != null)
- {
- code ^= issuer.GetHashCode();
- }
-
- return code;
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return false;
-
- SignerID id = obj as SignerID;
-
- if (id == null)
- return false;
-
- return Arrays.AreEqual(SubjectKeyIdentifier, id.SubjectKeyIdentifier)
- && Platform.Equals(SerialNumber, id.SerialNumber)
- && IssuersMatch(Issuer, id.Issuer);
- }
- }
-}
diff --git a/BCCrypto/src/cms/SignerInfoGenerator.cs b/BCCrypto/src/cms/SignerInfoGenerator.cs
deleted file mode 100644
index 7b9318c..0000000
--- a/BCCrypto/src/cms/SignerInfoGenerator.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Cms
-{
- internal interface ISignerInfoGenerator
- {
- SignerInfo Generate(DerObjectIdentifier contentType, AlgorithmIdentifier digestAlgorithm,
- byte[] calculatedDigest);
- }
-
- public class SignerInfoGenerator
- {
- internal X509Certificate certificate;
- internal ISignatureFactory contentSigner;
- internal SignerIdentifier sigId;
- internal CmsAttributeTableGenerator signedGen;
- internal CmsAttributeTableGenerator unsignedGen;
- private bool isDirectSignature;
-
- internal SignerInfoGenerator(SignerIdentifier sigId, ISignatureFactory signerFactory): this(sigId, signerFactory, false)
- {
-
- }
-
- internal SignerInfoGenerator(SignerIdentifier sigId, ISignatureFactory signerFactory, bool isDirectSignature)
- {
- this.sigId = sigId;
- this.contentSigner = signerFactory;
- this.isDirectSignature = isDirectSignature;
- if (this.isDirectSignature)
- {
- this.signedGen = null;
- this.unsignedGen = null;
- }
- else
- {
- this.signedGen = new DefaultSignedAttributeTableGenerator();
- this.unsignedGen = null;
- }
- }
-
- internal SignerInfoGenerator(SignerIdentifier sigId, ISignatureFactory contentSigner, CmsAttributeTableGenerator signedGen, CmsAttributeTableGenerator unsignedGen)
- {
- this.sigId = sigId;
- this.contentSigner = contentSigner;
- this.signedGen = signedGen;
- this.unsignedGen = unsignedGen;
- this.isDirectSignature = false;
- }
-
- internal void setAssociatedCertificate(X509Certificate certificate)
- {
- this.certificate = certificate;
- }
- }
-
- public class SignerInfoGeneratorBuilder
- {
- private bool directSignature;
- private CmsAttributeTableGenerator signedGen;
- private CmsAttributeTableGenerator unsignedGen;
-
- public SignerInfoGeneratorBuilder()
- {
- }
-
- /**
- * If the passed in flag is true, the signer signature will be based on the data, not
- * a collection of signed attributes, and no signed attributes will be included.
- *
- * @return the builder object
- */
- public SignerInfoGeneratorBuilder SetDirectSignature(bool hasNoSignedAttributes)
- {
- this.directSignature = hasNoSignedAttributes;
-
- return this;
- }
-
- /**
- * Provide a custom signed attribute generator.
- *
- * @param signedGen a generator of signed attributes.
- * @return the builder object
- */
- public SignerInfoGeneratorBuilder WithSignedAttributeGenerator(CmsAttributeTableGenerator signedGen)
- {
- this.signedGen = signedGen;
-
- return this;
- }
-
- /**
- * Provide a generator of unsigned attributes.
- *
- * @param unsignedGen a generator for signed attributes.
- * @return the builder object
- */
- public SignerInfoGeneratorBuilder WithUnsignedAttributeGenerator(CmsAttributeTableGenerator unsignedGen)
- {
- this.unsignedGen = unsignedGen;
-
- return this;
- }
-
- /**
- * Build a generator with the passed in certHolder issuer and serial number as the signerIdentifier.
- *
- * @param contentSigner operator for generating the final signature in the SignerInfo with.
- * @param certHolder carrier for the X.509 certificate related to the contentSigner.
- * @return a SignerInfoGenerator
- * @throws OperatorCreationException if the generator cannot be built.
- */
- public SignerInfoGenerator Build(ISignatureFactory contentSigner, X509Certificate certificate)
- {
- SignerIdentifier sigId = new SignerIdentifier(new IssuerAndSerialNumber(certificate.IssuerDN, new DerInteger(certificate.SerialNumber)));
-
- SignerInfoGenerator sigInfoGen = CreateGenerator(contentSigner, sigId);
-
- sigInfoGen.setAssociatedCertificate(certificate);
-
- return sigInfoGen;
- }
-
- /**
- * Build a generator with the passed in subjectKeyIdentifier as the signerIdentifier. If used you should
- * try to follow the calculation described in RFC 5280 section 4.2.1.2.
- *
- * @param signerFactory operator factory for generating the final signature in the SignerInfo with.
- * @param subjectKeyIdentifier key identifier to identify the public key for verifying the signature.
- * @return a SignerInfoGenerator
- */
- public SignerInfoGenerator Build(ISignatureFactory signerFactory, byte[] subjectKeyIdentifier)
- {
- SignerIdentifier sigId = new SignerIdentifier(new DerOctetString(subjectKeyIdentifier));
-
- return CreateGenerator(signerFactory, sigId);
- }
-
- private SignerInfoGenerator CreateGenerator(ISignatureFactory contentSigner, SignerIdentifier sigId)
- {
- if (directSignature)
- {
- return new SignerInfoGenerator(sigId, contentSigner, true);
- }
-
- if (signedGen != null || unsignedGen != null)
- {
- if (signedGen == null)
- {
- signedGen = new DefaultSignedAttributeTableGenerator();
- }
-
- return new SignerInfoGenerator(sigId, contentSigner, signedGen, unsignedGen);
- }
-
- return new SignerInfoGenerator(sigId, contentSigner);
- }
- }
-}
diff --git a/BCCrypto/src/cms/SignerInformation.cs b/BCCrypto/src/cms/SignerInformation.cs
deleted file mode 100644
index dad1282..0000000
--- a/BCCrypto/src/cms/SignerInformation.cs
+++ /dev/null
@@ -1,761 +0,0 @@
-using System;
-using System.Collections;
-using System.Diagnostics;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Signers;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * an expanded SignerInfo block from a CMS Signed message
- */
- public class SignerInformation
- {
- private static readonly CmsSignedHelper Helper = CmsSignedHelper.Instance;
-
- private SignerID sid;
- private SignerInfo info;
- private AlgorithmIdentifier digestAlgorithm;
- private AlgorithmIdentifier encryptionAlgorithm;
- private readonly Asn1Set signedAttributeSet;
- private readonly Asn1Set unsignedAttributeSet;
- private CmsProcessable content;
- private byte[] signature;
- private DerObjectIdentifier contentType;
- private IDigestCalculator digestCalculator;
- private byte[] resultDigest;
-
- // Derived
- private Asn1.Cms.AttributeTable signedAttributeTable;
- private Asn1.Cms.AttributeTable unsignedAttributeTable;
- private readonly bool isCounterSignature;
-
- internal SignerInformation(
- SignerInfo info,
- DerObjectIdentifier contentType,
- CmsProcessable content,
- IDigestCalculator digestCalculator)
- {
- this.info = info;
- this.sid = new SignerID();
- this.contentType = contentType;
- this.isCounterSignature = contentType == null;
-
- try
- {
- SignerIdentifier s = info.SignerID;
-
- if (s.IsTagged)
- {
- Asn1OctetString octs = Asn1OctetString.GetInstance(s.ID);
-
- sid.SubjectKeyIdentifier = octs.GetEncoded();
- }
- else
- {
- Asn1.Cms.IssuerAndSerialNumber iAnds =
- Asn1.Cms.IssuerAndSerialNumber.GetInstance(s.ID);
-
- sid.Issuer = iAnds.Name;
- sid.SerialNumber = iAnds.SerialNumber.Value;
- }
- }
- catch (IOException)
- {
- throw new ArgumentException("invalid sid in SignerInfo");
- }
-
- this.digestAlgorithm = info.DigestAlgorithm;
- this.signedAttributeSet = info.AuthenticatedAttributes;
- this.unsignedAttributeSet = info.UnauthenticatedAttributes;
- this.encryptionAlgorithm = info.DigestEncryptionAlgorithm;
- this.signature = info.EncryptedDigest.GetOctets();
-
- this.content = content;
- this.digestCalculator = digestCalculator;
- }
-
- public bool IsCounterSignature
- {
- get { return isCounterSignature; }
- }
-
- public DerObjectIdentifier ContentType
- {
- get { return contentType; }
- }
-
- public SignerID SignerID
- {
- get { return sid; }
- }
-
- /**
- * return the version number for this objects underlying SignerInfo structure.
- */
- public int Version
- {
- get { return info.Version.Value.IntValue; }
- }
-
- public AlgorithmIdentifier DigestAlgorithmID
- {
- get { return digestAlgorithm; }
- }
-
- /**
- * return the object identifier for the signature.
- */
- public string DigestAlgOid
- {
- get { return digestAlgorithm.Algorithm.Id; }
- }
-
- /**
- * return the signature parameters, or null if there aren't any.
- */
- public Asn1Object DigestAlgParams
- {
- get
- {
- Asn1Encodable ae = digestAlgorithm.Parameters;
-
- return ae == null ? null : ae.ToAsn1Object();
- }
- }
-
- /**
- * return the content digest that was calculated during verification.
- */
- public byte[] GetContentDigest()
- {
- if (resultDigest == null)
- {
- throw new InvalidOperationException("method can only be called after verify.");
- }
-
- return (byte[])resultDigest.Clone();
- }
-
- public AlgorithmIdentifier EncryptionAlgorithmID
- {
- get { return encryptionAlgorithm; }
- }
-
- /**
- * return the object identifier for the signature.
- */
- public string EncryptionAlgOid
- {
- get { return encryptionAlgorithm.Algorithm.Id; }
- }
-
- /**
- * return the signature/encryption algorithm parameters, or null if
- * there aren't any.
- */
- public Asn1Object EncryptionAlgParams
- {
- get
- {
- Asn1Encodable ae = encryptionAlgorithm.Parameters;
-
- return ae == null ? null : ae.ToAsn1Object();
- }
- }
-
- /**
- * return a table of the signed attributes - indexed by
- * the OID of the attribute.
- */
- public Asn1.Cms.AttributeTable SignedAttributes
- {
- get
- {
- if (signedAttributeSet != null && signedAttributeTable == null)
- {
- signedAttributeTable = new Asn1.Cms.AttributeTable(signedAttributeSet);
- }
- return signedAttributeTable;
- }
- }
-
- /**
- * return a table of the unsigned attributes indexed by
- * the OID of the attribute.
- */
- public Asn1.Cms.AttributeTable UnsignedAttributes
- {
- get
- {
- if (unsignedAttributeSet != null && unsignedAttributeTable == null)
- {
- unsignedAttributeTable = new Asn1.Cms.AttributeTable(unsignedAttributeSet);
- }
- return unsignedAttributeTable;
- }
- }
-
- /**
- * return the encoded signature
- */
- public byte[] GetSignature()
- {
- return (byte[]) signature.Clone();
- }
-
- /**
- * Return a SignerInformationStore containing the counter signatures attached to this
- * signer. If no counter signatures are present an empty store is returned.
- */
- public SignerInformationStore GetCounterSignatures()
- {
- // TODO There are several checks implied by the RFC3852 comments that are missing
-
- /*
- The countersignature attribute MUST be an unsigned attribute; it MUST
- NOT be a signed attribute, an authenticated attribute, an
- unauthenticated attribute, or an unprotected attribute.
- */
- Asn1.Cms.AttributeTable unsignedAttributeTable = UnsignedAttributes;
- if (unsignedAttributeTable == null)
- {
- return new SignerInformationStore(Platform.CreateArrayList(0));
- }
-
- IList counterSignatures = Platform.CreateArrayList();
-
- /*
- The UnsignedAttributes syntax is defined as a SET OF Attributes. The
- UnsignedAttributes in a signerInfo may include multiple instances of
- the countersignature attribute.
- */
- Asn1EncodableVector allCSAttrs = unsignedAttributeTable.GetAll(CmsAttributes.CounterSignature);
-
- foreach (Asn1.Cms.Attribute counterSignatureAttribute in allCSAttrs)
- {
- /*
- A countersignature attribute can have multiple attribute values. The
- syntax is defined as a SET OF AttributeValue, and there MUST be one
- or more instances of AttributeValue present.
- */
- Asn1Set values = counterSignatureAttribute.AttrValues;
- if (values.Count < 1)
- {
- // TODO Throw an appropriate exception?
- }
-
- foreach (Asn1Encodable asn1Obj in values)
- {
- /*
- Countersignature values have the same meaning as SignerInfo values
- for ordinary signatures, except that:
-
- 1. The signedAttributes field MUST NOT contain a content-type
- attribute; there is no content type for countersignatures.
-
- 2. The signedAttributes field MUST contain a message-digest
- attribute if it contains any other attributes.
-
- 3. The input to the message-digesting process is the contents
- octets of the DER encoding of the signatureValue field of the
- SignerInfo value with which the attribute is associated.
- */
- SignerInfo si = SignerInfo.GetInstance(asn1Obj.ToAsn1Object());
-
- string digestName = CmsSignedHelper.Instance.GetDigestAlgName(si.DigestAlgorithm.Algorithm.Id);
-
- counterSignatures.Add(new SignerInformation(si, null, null, new CounterSignatureDigestCalculator(digestName, GetSignature())));
- }
- }
-
- return new SignerInformationStore(counterSignatures);
- }
-
- /**
- * return the DER encoding of the signed attributes.
- * @throws IOException if an encoding error occurs.
- */
- public byte[] GetEncodedSignedAttributes()
- {
- return signedAttributeSet == null
- ? null
- : signedAttributeSet.GetEncoded(Asn1Encodable.Der);
- }
-
- private bool DoVerify(
- AsymmetricKeyParameter key)
- {
- string digestName = Helper.GetDigestAlgName(this.DigestAlgOid);
- IDigest digest = Helper.GetDigestInstance(digestName);
-
- DerObjectIdentifier sigAlgOid = this.encryptionAlgorithm.Algorithm;
- Asn1Encodable sigParams = this.encryptionAlgorithm.Parameters;
- ISigner sig;
-
- if (sigAlgOid.Equals(Asn1.Pkcs.PkcsObjectIdentifiers.IdRsassaPss))
- {
- // RFC 4056 2.2
- // When the id-RSASSA-PSS algorithm identifier is used for a signature,
- // the AlgorithmIdentifier parameters field MUST contain RSASSA-PSS-params.
- if (sigParams == null)
- throw new CmsException("RSASSA-PSS signature must specify algorithm parameters");
-
- try
- {
- // TODO Provide abstract configuration mechanism
- // (via alternate SignerUtilities.GetSigner method taking ASN.1 params)
-
- Asn1.Pkcs.RsassaPssParameters pss = Asn1.Pkcs.RsassaPssParameters.GetInstance(
- sigParams.ToAsn1Object());
-
- if (!pss.HashAlgorithm.Algorithm.Equals(this.digestAlgorithm.Algorithm))
- throw new CmsException("RSASSA-PSS signature parameters specified incorrect hash algorithm");
- if (!pss.MaskGenAlgorithm.Algorithm.Equals(Asn1.Pkcs.PkcsObjectIdentifiers.IdMgf1))
- throw new CmsException("RSASSA-PSS signature parameters specified unknown MGF");
-
- IDigest pssDigest = DigestUtilities.GetDigest(pss.HashAlgorithm.Algorithm);
- int saltLength = pss.SaltLength.Value.IntValue;
- byte trailerField = (byte) pss.TrailerField.Value.IntValue;
-
- // RFC 4055 3.1
- // The value MUST be 1, which represents the trailer field with hexadecimal value 0xBC
- if (trailerField != 1)
- throw new CmsException("RSASSA-PSS signature parameters must have trailerField of 1");
-
- sig = new PssSigner(new RsaBlindedEngine(), pssDigest, saltLength);
- }
- catch (Exception e)
- {
- throw new CmsException("failed to set RSASSA-PSS signature parameters", e);
- }
- }
- else
- {
- // TODO Probably too strong a check at the moment
-// if (sigParams != null)
-// throw new CmsException("unrecognised signature parameters provided");
-
- string signatureName = digestName + "with" + Helper.GetEncryptionAlgName(this.EncryptionAlgOid);
-
- sig = Helper.GetSignatureInstance(signatureName);
-
- //sig = Helper.GetSignatureInstance(this.EncryptionAlgOid);
- //sig = SignerUtilities.GetSigner(sigAlgOid);
- }
-
- try
- {
- if (digestCalculator != null)
- {
- resultDigest = digestCalculator.GetDigest();
- }
- else
- {
- if (content != null)
- {
- content.Write(new DigOutputStream(digest));
- }
- else if (signedAttributeSet == null)
- {
- // TODO Get rid of this exception and just treat content==null as empty not missing?
- throw new CmsException("data not encapsulated in signature - use detached constructor.");
- }
-
- resultDigest = DigestUtilities.DoFinal(digest);
- }
- }
- catch (IOException e)
- {
- throw new CmsException("can't process mime object to create signature.", e);
- }
-
- // RFC 3852 11.1 Check the content-type attribute is correct
- {
- Asn1Object validContentType = GetSingleValuedSignedAttribute(
- CmsAttributes.ContentType, "content-type");
- if (validContentType == null)
- {
- if (!isCounterSignature && signedAttributeSet != null)
- throw new CmsException("The content-type attribute type MUST be present whenever signed attributes are present in signed-data");
- }
- else
- {
- if (isCounterSignature)
- throw new CmsException("[For counter signatures,] the signedAttributes field MUST NOT contain a content-type attribute");
-
- if (!(validContentType is DerObjectIdentifier))
- throw new CmsException("content-type attribute value not of ASN.1 type 'OBJECT IDENTIFIER'");
-
- DerObjectIdentifier signedContentType = (DerObjectIdentifier)validContentType;
-
- if (!signedContentType.Equals(contentType))
- throw new CmsException("content-type attribute value does not match eContentType");
- }
- }
-
- // RFC 3852 11.2 Check the message-digest attribute is correct
- {
- Asn1Object validMessageDigest = GetSingleValuedSignedAttribute(
- CmsAttributes.MessageDigest, "message-digest");
- if (validMessageDigest == null)
- {
- if (signedAttributeSet != null)
- throw new CmsException("the message-digest signed attribute type MUST be present when there are any signed attributes present");
- }
- else
- {
- if (!(validMessageDigest is Asn1OctetString))
- {
- throw new CmsException("message-digest attribute value not of ASN.1 type 'OCTET STRING'");
- }
-
- Asn1OctetString signedMessageDigest = (Asn1OctetString)validMessageDigest;
-
- if (!Arrays.AreEqual(resultDigest, signedMessageDigest.GetOctets()))
- throw new CmsException("message-digest attribute value does not match calculated value");
- }
- }
-
- // RFC 3852 11.4 Validate countersignature attribute(s)
- {
- Asn1.Cms.AttributeTable signedAttrTable = this.SignedAttributes;
- if (signedAttrTable != null
- && signedAttrTable.GetAll(CmsAttributes.CounterSignature).Count > 0)
- {
- throw new CmsException("A countersignature attribute MUST NOT be a signed attribute");
- }
-
- Asn1.Cms.AttributeTable unsignedAttrTable = this.UnsignedAttributes;
- if (unsignedAttrTable != null)
- {
- foreach (Asn1.Cms.Attribute csAttr in unsignedAttrTable.GetAll(CmsAttributes.CounterSignature))
- {
- if (csAttr.AttrValues.Count < 1)
- throw new CmsException("A countersignature attribute MUST contain at least one AttributeValue");
-
- // Note: We don't recursively validate the countersignature value
- }
- }
- }
-
- try
- {
- sig.Init(false, key);
-
- if (signedAttributeSet == null)
- {
- if (digestCalculator != null)
- {
- // need to decrypt signature and check message bytes
- return VerifyDigest(resultDigest, key, this.GetSignature());
- }
- else if (content != null)
- {
- // TODO Use raw signature of the hash value instead
- content.Write(new SigOutputStream(sig));
- }
- }
- else
- {
- byte[] tmp = this.GetEncodedSignedAttributes();
- sig.BlockUpdate(tmp, 0, tmp.Length);
- }
-
- return sig.VerifySignature(this.GetSignature());
- }
- catch (InvalidKeyException e)
- {
- throw new CmsException("key not appropriate to signature in message.", e);
- }
- catch (IOException e)
- {
- throw new CmsException("can't process mime object to create signature.", e);
- }
- catch (SignatureException e)
- {
- throw new CmsException("invalid signature format in message: " + e.Message, e);
- }
- }
-
- private bool IsNull(
- Asn1Encodable o)
- {
- return (o is Asn1Null) || (o == null);
- }
-
- private DigestInfo DerDecode(
- byte[] encoding)
- {
- if (encoding[0] != (int)(Asn1Tags.Constructed | Asn1Tags.Sequence))
- {
- throw new IOException("not a digest info object");
- }
-
- DigestInfo digInfo = DigestInfo.GetInstance(Asn1Object.FromByteArray(encoding));
-
- // length check to avoid Bleichenbacher vulnerability
-
- if (digInfo.GetEncoded().Length != encoding.Length)
- {
- throw new CmsException("malformed RSA signature");
- }
-
- return digInfo;
- }
-
- private bool VerifyDigest(
- byte[] digest,
- AsymmetricKeyParameter key,
- byte[] signature)
- {
- string algorithm = Helper.GetEncryptionAlgName(this.EncryptionAlgOid);
-
- try
- {
- if (algorithm.Equals("RSA"))
- {
- IBufferedCipher c = CmsEnvelopedHelper.Instance.CreateAsymmetricCipher("RSA/ECB/PKCS1Padding");
-
- c.Init(false, key);
-
- byte[] decrypt = c.DoFinal(signature);
-
- DigestInfo digInfo = DerDecode(decrypt);
-
- if (!digInfo.AlgorithmID.Algorithm.Equals(digestAlgorithm.Algorithm))
- {
- return false;
- }
-
- if (!IsNull(digInfo.AlgorithmID.Parameters))
- {
- return false;
- }
-
- byte[] sigHash = digInfo.GetDigest();
-
- return Arrays.ConstantTimeAreEqual(digest, sigHash);
- }
- else if (algorithm.Equals("DSA"))
- {
- ISigner sig = SignerUtilities.GetSigner("NONEwithDSA");
-
- sig.Init(false, key);
-
- sig.BlockUpdate(digest, 0, digest.Length);
-
- return sig.VerifySignature(signature);
- }
- else
- {
- throw new CmsException("algorithm: " + algorithm + " not supported in base signatures.");
- }
- }
- catch (SecurityUtilityException e)
- {
- throw e;
- }
- catch (GeneralSecurityException e)
- {
- throw new CmsException("Exception processing signature: " + e, e);
- }
- catch (IOException e)
- {
- throw new CmsException("Exception decoding signature: " + e, e);
- }
- }
-
- /**
- * verify that the given public key successfully handles and confirms the
- * signature associated with this signer.
- */
- public bool Verify(
- AsymmetricKeyParameter pubKey)
- {
- if (pubKey.IsPrivate)
- throw new ArgumentException("Expected public key", "pubKey");
-
- // Optional, but still need to validate if present
- GetSigningTime();
-
- return DoVerify(pubKey);
- }
-
- /**
- * verify that the given certificate successfully handles and confirms
- * the signature associated with this signer and, if a signingTime
- * attribute is available, that the certificate was valid at the time the
- * signature was generated.
- */
- public bool Verify(
- X509Certificate cert)
- {
- Asn1.Cms.Time signingTime = GetSigningTime();
- if (signingTime != null)
- {
- cert.CheckValidity(signingTime.Date);
- }
-
- return DoVerify(cert.GetPublicKey());
- }
-
- /**
- * Return the base ASN.1 CMS structure that this object contains.
- *
- * @return an object containing a CMS SignerInfo structure.
- */
- public SignerInfo ToSignerInfo()
- {
- return info;
- }
-
- private Asn1Object GetSingleValuedSignedAttribute(
- DerObjectIdentifier attrOID, string printableName)
- {
-
- Asn1.Cms.AttributeTable unsignedAttrTable = this.UnsignedAttributes;
- if (unsignedAttrTable != null
- && unsignedAttrTable.GetAll(attrOID).Count > 0)
- {
- throw new CmsException("The " + printableName
- + " attribute MUST NOT be an unsigned attribute");
- }
-
- Asn1.Cms.AttributeTable signedAttrTable = this.SignedAttributes;
- if (signedAttrTable == null)
- {
- return null;
- }
-
- Asn1EncodableVector v = signedAttrTable.GetAll(attrOID);
- switch (v.Count)
- {
- case 0:
- return null;
- case 1:
- Asn1.Cms.Attribute t = (Asn1.Cms.Attribute) v[0];
- Asn1Set attrValues = t.AttrValues;
-
- if (attrValues.Count != 1)
- throw new CmsException("A " + printableName
- + " attribute MUST have a single attribute value");
-
- return attrValues[0].ToAsn1Object();
- default:
- throw new CmsException("The SignedAttributes in a signerInfo MUST NOT include multiple instances of the "
- + printableName + " attribute");
- }
- }
-
- private Asn1.Cms.Time GetSigningTime()
- {
- Asn1Object validSigningTime = GetSingleValuedSignedAttribute(
- CmsAttributes.SigningTime, "signing-time");
-
- if (validSigningTime == null)
- return null;
-
- try
- {
- return Asn1.Cms.Time.GetInstance(validSigningTime);
- }
- catch (ArgumentException)
- {
- throw new CmsException("signing-time attribute value not a valid 'Time' structure");
- }
- }
-
- /**
- * Return a signer information object with the passed in unsigned
- * attributes replacing the ones that are current associated with
- * the object passed in.
- *
- * @param signerInformation the signerInfo to be used as the basis.
- * @param unsignedAttributes the unsigned attributes to add.
- * @return a copy of the original SignerInformationObject with the changed attributes.
- */
- public static SignerInformation ReplaceUnsignedAttributes(
- SignerInformation signerInformation,
- Asn1.Cms.AttributeTable unsignedAttributes)
- {
- SignerInfo sInfo = signerInformation.info;
- Asn1Set unsignedAttr = null;
-
- if (unsignedAttributes != null)
- {
- unsignedAttr = new DerSet(unsignedAttributes.ToAsn1EncodableVector());
- }
-
- return new SignerInformation(
- new SignerInfo(
- sInfo.SignerID,
- sInfo.DigestAlgorithm,
- sInfo.AuthenticatedAttributes,
- sInfo.DigestEncryptionAlgorithm,
- sInfo.EncryptedDigest,
- unsignedAttr),
- signerInformation.contentType,
- signerInformation.content,
- null);
- }
-
- /**
- * Return a signer information object with passed in SignerInformationStore representing counter
- * signatures attached as an unsigned attribute.
- *
- * @param signerInformation the signerInfo to be used as the basis.
- * @param counterSigners signer info objects carrying counter signature.
- * @return a copy of the original SignerInformationObject with the changed attributes.
- */
- public static SignerInformation AddCounterSigners(
- SignerInformation signerInformation,
- SignerInformationStore counterSigners)
- {
- // TODO Perform checks from RFC 3852 11.4
-
- SignerInfo sInfo = signerInformation.info;
- Asn1.Cms.AttributeTable unsignedAttr = signerInformation.UnsignedAttributes;
- Asn1EncodableVector v;
-
- if (unsignedAttr != null)
- {
- v = unsignedAttr.ToAsn1EncodableVector();
- }
- else
- {
- v = new Asn1EncodableVector();
- }
-
- Asn1EncodableVector sigs = new Asn1EncodableVector();
-
- foreach (SignerInformation sigInf in counterSigners.GetSigners())
- {
- sigs.Add(sigInf.ToSignerInfo());
- }
-
- v.Add(new Asn1.Cms.Attribute(CmsAttributes.CounterSignature, new DerSet(sigs)));
-
- return new SignerInformation(
- new SignerInfo(
- sInfo.SignerID,
- sInfo.DigestAlgorithm,
- sInfo.AuthenticatedAttributes,
- sInfo.DigestEncryptionAlgorithm,
- sInfo.EncryptedDigest,
- new DerSet(v)),
- signerInformation.contentType,
- signerInformation.content,
- null);
- }
- }
-}
diff --git a/BCCrypto/src/cms/SignerInformationStore.cs b/BCCrypto/src/cms/SignerInformationStore.cs
deleted file mode 100644
index 2794086..0000000
--- a/BCCrypto/src/cms/SignerInformationStore.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Cms
-{
- public class SignerInformationStore
- {
- private readonly IList all; //ArrayList[SignerInformation]
- private readonly IDictionary table = Platform.CreateHashtable(); // Hashtable[SignerID, ArrayList[SignerInformation]]
-
- /**
- * Create a store containing a single SignerInformation object.
- *
- * @param signerInfo the signer information to contain.
- */
- public SignerInformationStore(
- SignerInformation signerInfo)
- {
- this.all = Platform.CreateArrayList(1);
- this.all.Add(signerInfo);
-
- SignerID sid = signerInfo.SignerID;
-
- table[sid] = all;
- }
-
- /**
- * Create a store containing a collection of SignerInformation objects.
- *
- * @param signerInfos a collection signer information objects to contain.
- */
- public SignerInformationStore(
- ICollection signerInfos)
- {
- foreach (SignerInformation signer in signerInfos)
- {
- SignerID sid = signer.SignerID;
- IList list = (IList)table[sid];
-
- if (list == null)
- {
- table[sid] = list = Platform.CreateArrayList(1);
- }
-
- list.Add(signer);
- }
-
- this.all = Platform.CreateArrayList(signerInfos);
- }
-
- /**
- * Return the first SignerInformation object that matches the
- * passed in selector. Null if there are no matches.
- *
- * @param selector to identify a signer
- * @return a single SignerInformation object. Null if none matches.
- */
- public SignerInformation GetFirstSigner(
- SignerID selector)
- {
- IList list = (IList) table[selector];
-
- return list == null ? null : (SignerInformation) list[0];
- }
-
- /// The number of signers in the collection.
- public int Count
- {
- get { return all.Count; }
- }
-
- /// An ICollection of all signers in the collection
- public ICollection GetSigners()
- {
- return Platform.CreateArrayList(all);
- }
-
- /**
- * Return possible empty collection with signers matching the passed in SignerID
- *
- * @param selector a signer id to select against.
- * @return a collection of SignerInformation objects.
- */
- public ICollection GetSigners(
- SignerID selector)
- {
- IList list = (IList) table[selector];
-
- return list == null ? Platform.CreateArrayList() : Platform.CreateArrayList(list);
- }
- }
-}
diff --git a/BCCrypto/src/cms/SimpleAttributeTableGenerator.cs b/BCCrypto/src/cms/SimpleAttributeTableGenerator.cs
deleted file mode 100644
index b3df21c..0000000
--- a/BCCrypto/src/cms/SimpleAttributeTableGenerator.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.Cms;
-
-namespace Org.BouncyCastle.Cms
-{
- /**
- * Basic generator that just returns a preconstructed attribute table
- */
- public class SimpleAttributeTableGenerator
- : CmsAttributeTableGenerator
- {
- private readonly AttributeTable attributes;
-
- public SimpleAttributeTableGenerator(
- AttributeTable attributes)
- {
- this.attributes = attributes;
- }
-
- public virtual AttributeTable GetAttributes(
- IDictionary parameters)
- {
- return attributes;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/AsymmetricCipherKeyPair.cs b/BCCrypto/src/crypto/AsymmetricCipherKeyPair.cs
deleted file mode 100644
index b00a3dc..0000000
--- a/BCCrypto/src/crypto/AsymmetricCipherKeyPair.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * a holding class for public/private parameter pairs.
- */
- public class AsymmetricCipherKeyPair
- {
- private readonly AsymmetricKeyParameter publicParameter;
- private readonly AsymmetricKeyParameter privateParameter;
-
- /**
- * basic constructor.
- *
- * @param publicParam a public key parameters object.
- * @param privateParam the corresponding private key parameters.
- */
- public AsymmetricCipherKeyPair(
- AsymmetricKeyParameter publicParameter,
- AsymmetricKeyParameter privateParameter)
- {
- if (publicParameter.IsPrivate)
- throw new ArgumentException("Expected a public key", "publicParameter");
- if (!privateParameter.IsPrivate)
- throw new ArgumentException("Expected a private key", "privateParameter");
-
- this.publicParameter = publicParameter;
- this.privateParameter = privateParameter;
- }
-
- /**
- * return the public key parameters.
- *
- * @return the public key parameters.
- */
- public AsymmetricKeyParameter Public
- {
- get { return publicParameter; }
- }
-
- /**
- * return the private key parameters.
- *
- * @return the private key parameters.
- */
- public AsymmetricKeyParameter Private
- {
- get { return privateParameter; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/AsymmetricKeyParameter.cs b/BCCrypto/src/crypto/AsymmetricKeyParameter.cs
deleted file mode 100644
index 7502ee3..0000000
--- a/BCCrypto/src/crypto/AsymmetricKeyParameter.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.Crypto
-{
- public abstract class AsymmetricKeyParameter
- : ICipherParameters
- {
- private readonly bool privateKey;
-
- protected AsymmetricKeyParameter(
- bool privateKey)
- {
- this.privateKey = privateKey;
- }
-
- public bool IsPrivate
- {
- get { return privateKey; }
- }
-
- public override bool Equals(
- object obj)
- {
- AsymmetricKeyParameter other = obj as AsymmetricKeyParameter;
-
- if (other == null)
- {
- return false;
- }
-
- return Equals(other);
- }
-
- protected bool Equals(
- AsymmetricKeyParameter other)
- {
- return privateKey == other.privateKey;
- }
-
- public override int GetHashCode()
- {
- return privateKey.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/BufferedAeadBlockCipher.cs b/BCCrypto/src/crypto/BufferedAeadBlockCipher.cs
deleted file mode 100644
index 7ba4109..0000000
--- a/BCCrypto/src/crypto/BufferedAeadBlockCipher.cs
+++ /dev/null
@@ -1,247 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * The AEAD block ciphers already handle buffering internally, so this class
- * just takes care of implementing IBufferedCipher methods.
- */
- public class BufferedAeadBlockCipher
- : BufferedCipherBase
- {
- private readonly IAeadBlockCipher cipher;
-
- public BufferedAeadBlockCipher(
- IAeadBlockCipher cipher)
- {
- if (cipher == null)
- throw new ArgumentNullException("cipher");
-
- this.cipher = cipher;
- }
-
- public override string AlgorithmName
- {
- get { return cipher.AlgorithmName; }
- }
-
- /**
- * initialise the cipher.
- *
- * @param forEncryption if true the cipher is initialised for
- * encryption, if false for decryption.
- * @param param the key and other data required by the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public override void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (parameters is ParametersWithRandom)
- {
- parameters = ((ParametersWithRandom) parameters).Parameters;
- }
-
- cipher.Init(forEncryption, parameters);
- }
-
- /**
- * return the blocksize for the underlying cipher.
- *
- * @return the blocksize for the underlying cipher.
- */
- public override int GetBlockSize()
- {
- return cipher.GetBlockSize();
- }
-
- /**
- * return the size of the output buffer required for an update
- * an input of len bytes.
- *
- * @param len the length of the input.
- * @return the space required to accommodate a call to update
- * with len bytes of input.
- */
- public override int GetUpdateOutputSize(
- int length)
- {
- return cipher.GetUpdateOutputSize(length);
- }
-
- /**
- * return the size of the output buffer required for an update plus a
- * doFinal with an input of len bytes.
- *
- * @param len the length of the input.
- * @return the space required to accommodate a call to update and doFinal
- * with len bytes of input.
- */
- public override int GetOutputSize(
- int length)
- {
- return cipher.GetOutputSize(length);
- }
-
- /**
- * process a single byte, producing an output block if necessary.
- *
- * @param in the input byte.
- * @param out the space for any output that might be produced.
- * @param outOff the offset from which the output will be copied.
- * @return the number of output bytes copied to out.
- * @exception DataLengthException if there isn't enough space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- */
- public override int ProcessByte(
- byte input,
- byte[] output,
- int outOff)
- {
- return cipher.ProcessByte(input, output, outOff);
- }
-
- public override byte[] ProcessByte(
- byte input)
- {
- int outLength = GetUpdateOutputSize(1);
-
- byte[] outBytes = outLength > 0 ? new byte[outLength] : null;
-
- int pos = ProcessByte(input, outBytes, 0);
-
- if (outLength > 0 && pos < outLength)
- {
- byte[] tmp = new byte[pos];
- Array.Copy(outBytes, 0, tmp, 0, pos);
- outBytes = tmp;
- }
-
- return outBytes;
- }
-
- public override byte[] ProcessBytes(
- byte[] input,
- int inOff,
- int length)
- {
- if (input == null)
- throw new ArgumentNullException("input");
- if (length < 1)
- return null;
-
- int outLength = GetUpdateOutputSize(length);
-
- byte[] outBytes = outLength > 0 ? new byte[outLength] : null;
-
- int pos = ProcessBytes(input, inOff, length, outBytes, 0);
-
- if (outLength > 0 && pos < outLength)
- {
- byte[] tmp = new byte[pos];
- Array.Copy(outBytes, 0, tmp, 0, pos);
- outBytes = tmp;
- }
-
- return outBytes;
- }
-
- /**
- * process an array of bytes, producing output if necessary.
- *
- * @param in the input byte array.
- * @param inOff the offset at which the input data starts.
- * @param len the number of bytes to be copied out of the input array.
- * @param out the space for any output that might be produced.
- * @param outOff the offset from which the output will be copied.
- * @return the number of output bytes copied to out.
- * @exception DataLengthException if there isn't enough space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- */
- public override int ProcessBytes(
- byte[] input,
- int inOff,
- int length,
- byte[] output,
- int outOff)
- {
- return cipher.ProcessBytes(input, inOff, length, output, outOff);
- }
-
- public override byte[] DoFinal()
- {
- byte[] outBytes = new byte[GetOutputSize(0)];
-
- int pos = DoFinal(outBytes, 0);
-
- if (pos < outBytes.Length)
- {
- byte[] tmp = new byte[pos];
- Array.Copy(outBytes, 0, tmp, 0, pos);
- outBytes = tmp;
- }
-
- return outBytes;
- }
-
- public override byte[] DoFinal(
- byte[] input,
- int inOff,
- int inLen)
- {
- if (input == null)
- throw new ArgumentNullException("input");
-
- byte[] outBytes = new byte[GetOutputSize(inLen)];
-
- int pos = (inLen > 0)
- ? ProcessBytes(input, inOff, inLen, outBytes, 0)
- : 0;
-
- pos += DoFinal(outBytes, pos);
-
- if (pos < outBytes.Length)
- {
- byte[] tmp = new byte[pos];
- Array.Copy(outBytes, 0, tmp, 0, pos);
- outBytes = tmp;
- }
-
- return outBytes;
- }
-
- /**
- * Process the last block in the buffer.
- *
- * @param out the array the block currently being held is copied into.
- * @param outOff the offset at which the copying starts.
- * @return the number of output bytes copied to out.
- * @exception DataLengthException if there is insufficient space in out for
- * the output, or the input is not block size aligned and should be.
- * @exception InvalidOperationException if the underlying cipher is not
- * initialised.
- * @exception InvalidCipherTextException if padding is expected and not found.
- * @exception DataLengthException if the input is not block size
- * aligned.
- */
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- return cipher.DoFinal(output, outOff);
- }
-
- /**
- * Reset the buffer and cipher. After resetting the object is in the same
- * state as it was after the last init (if there was one).
- */
- public override void Reset()
- {
- cipher.Reset();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/BufferedAsymmetricBlockCipher.cs b/BCCrypto/src/crypto/BufferedAsymmetricBlockCipher.cs
deleted file mode 100644
index 09ec59f..0000000
--- a/BCCrypto/src/crypto/BufferedAsymmetricBlockCipher.cs
+++ /dev/null
@@ -1,152 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Engines;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * a buffer wrapper for an asymmetric block cipher, allowing input
- * to be accumulated in a piecemeal fashion until final processing.
- */
- public class BufferedAsymmetricBlockCipher
- : BufferedCipherBase
- {
- private readonly IAsymmetricBlockCipher cipher;
-
- private byte[] buffer;
- private int bufOff;
-
- /**
- * base constructor.
- *
- * @param cipher the cipher this buffering object wraps.
- */
- public BufferedAsymmetricBlockCipher(
- IAsymmetricBlockCipher cipher)
- {
- this.cipher = cipher;
- }
-
- /**
- * return the amount of data sitting in the buffer.
- *
- * @return the amount of data sitting in the buffer.
- */
- internal int GetBufferPosition()
- {
- return bufOff;
- }
-
- public override string AlgorithmName
- {
- get { return cipher.AlgorithmName; }
- }
-
- public override int GetBlockSize()
- {
- return cipher.GetInputBlockSize();
- }
-
- public override int GetOutputSize(
- int length)
- {
- return cipher.GetOutputBlockSize();
- }
-
- public override int GetUpdateOutputSize(
- int length)
- {
- return 0;
- }
-
- /**
- * initialise the buffer and the underlying cipher.
- *
- * @param forEncryption if true the cipher is initialised for
- * encryption, if false for decryption.
- * @param param the key and other data required by the cipher.
- */
- public override void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- Reset();
-
- cipher.Init(forEncryption, parameters);
-
- //
- // we allow for an extra byte where people are using their own padding
- // mechanisms on a raw cipher.
- //
- this.buffer = new byte[cipher.GetInputBlockSize() + (forEncryption ? 1 : 0)];
- this.bufOff = 0;
- }
-
- public override byte[] ProcessByte(
- byte input)
- {
- if (bufOff >= buffer.Length)
- throw new DataLengthException("attempt to process message to long for cipher");
-
- buffer[bufOff++] = input;
- return null;
- }
-
- public override byte[] ProcessBytes(
- byte[] input,
- int inOff,
- int length)
- {
- if (length < 1)
- return null;
-
- if (input == null)
- throw new ArgumentNullException("input");
- if (bufOff + length > buffer.Length)
- throw new DataLengthException("attempt to process message to long for cipher");
-
- Array.Copy(input, inOff, buffer, bufOff, length);
- bufOff += length;
- return null;
- }
-
- /**
- * process the contents of the buffer using the underlying
- * cipher.
- *
- * @return the result of the encryption/decryption process on the
- * buffer.
- * @exception InvalidCipherTextException if we are given a garbage block.
- */
- public override byte[] DoFinal()
- {
- byte[] outBytes = bufOff > 0
- ? cipher.ProcessBlock(buffer, 0, bufOff)
- : EmptyBuffer;
-
- Reset();
-
- return outBytes;
- }
-
- public override byte[] DoFinal(
- byte[] input,
- int inOff,
- int length)
- {
- ProcessBytes(input, inOff, length);
- return DoFinal();
- }
-
- /// Reset the buffer
- public override void Reset()
- {
- if (buffer != null)
- {
- Array.Clear(buffer, 0, buffer.Length);
- bufOff = 0;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/BufferedBlockCipher.cs b/BCCrypto/src/crypto/BufferedBlockCipher.cs
deleted file mode 100644
index c87d2da..0000000
--- a/BCCrypto/src/crypto/BufferedBlockCipher.cs
+++ /dev/null
@@ -1,367 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * A wrapper class that allows block ciphers to be used to process data in
- * a piecemeal fashion. The BufferedBlockCipher outputs a block only when the
- * buffer is full and more data is being added, or on a doFinal.
- *
- * Note: in the case where the underlying cipher is either a CFB cipher or an
- * OFB one the last block may not be a multiple of the block size.
- *
- */
- public class BufferedBlockCipher
- : BufferedCipherBase
- {
- internal byte[] buf;
- internal int bufOff;
- internal bool forEncryption;
- internal IBlockCipher cipher;
-
- /**
- * constructor for subclasses
- */
- protected BufferedBlockCipher()
- {
- }
-
- /**
- * Create a buffered block cipher without padding.
- *
- * @param cipher the underlying block cipher this buffering object wraps.
- * false otherwise.
- */
- public BufferedBlockCipher(
- IBlockCipher cipher)
- {
- if (cipher == null)
- throw new ArgumentNullException("cipher");
-
- this.cipher = cipher;
- buf = new byte[cipher.GetBlockSize()];
- bufOff = 0;
- }
-
- public override string AlgorithmName
- {
- get { return cipher.AlgorithmName; }
- }
-
- /**
- * initialise the cipher.
- *
- * @param forEncryption if true the cipher is initialised for
- * encryption, if false for decryption.
- * @param param the key and other data required by the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- // Note: This doubles as the Init in the event that this cipher is being used as an IWrapper
- public override void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- this.forEncryption = forEncryption;
-
- ParametersWithRandom pwr = parameters as ParametersWithRandom;
- if (pwr != null)
- parameters = pwr.Parameters;
-
- Reset();
-
- cipher.Init(forEncryption, parameters);
- }
-
- /**
- * return the blocksize for the underlying cipher.
- *
- * @return the blocksize for the underlying cipher.
- */
- public override int GetBlockSize()
- {
- return cipher.GetBlockSize();
- }
-
- /**
- * return the size of the output buffer required for an update
- * an input of len bytes.
- *
- * @param len the length of the input.
- * @return the space required to accommodate a call to update
- * with len bytes of input.
- */
- public override int GetUpdateOutputSize(
- int length)
- {
- int total = length + bufOff;
- int leftOver = total % buf.Length;
- return total - leftOver;
- }
-
- /**
- * return the size of the output buffer required for an update plus a
- * doFinal with an input of len bytes.
- *
- * @param len the length of the input.
- * @return the space required to accommodate a call to update and doFinal
- * with len bytes of input.
- */
- public override int GetOutputSize(
- int length)
- {
- // Note: Can assume IsPartialBlockOkay is true for purposes of this calculation
- return length + bufOff;
- }
-
- /**
- * process a single byte, producing an output block if necessary.
- *
- * @param in the input byte.
- * @param out the space for any output that might be produced.
- * @param outOff the offset from which the output will be copied.
- * @return the number of output bytes copied to out.
- * @exception DataLengthException if there isn't enough space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- */
- public override int ProcessByte(
- byte input,
- byte[] output,
- int outOff)
- {
- buf[bufOff++] = input;
-
- if (bufOff == buf.Length)
- {
- if ((outOff + buf.Length) > output.Length)
- throw new DataLengthException("output buffer too short");
-
- bufOff = 0;
- return cipher.ProcessBlock(buf, 0, output, outOff);
- }
-
- return 0;
- }
-
- public override byte[] ProcessByte(
- byte input)
- {
- int outLength = GetUpdateOutputSize(1);
-
- byte[] outBytes = outLength > 0 ? new byte[outLength] : null;
-
- int pos = ProcessByte(input, outBytes, 0);
-
- if (outLength > 0 && pos < outLength)
- {
- byte[] tmp = new byte[pos];
- Array.Copy(outBytes, 0, tmp, 0, pos);
- outBytes = tmp;
- }
-
- return outBytes;
- }
-
- public override byte[] ProcessBytes(
- byte[] input,
- int inOff,
- int length)
- {
- if (input == null)
- throw new ArgumentNullException("input");
- if (length < 1)
- return null;
-
- int outLength = GetUpdateOutputSize(length);
-
- byte[] outBytes = outLength > 0 ? new byte[outLength] : null;
-
- int pos = ProcessBytes(input, inOff, length, outBytes, 0);
-
- if (outLength > 0 && pos < outLength)
- {
- byte[] tmp = new byte[pos];
- Array.Copy(outBytes, 0, tmp, 0, pos);
- outBytes = tmp;
- }
-
- return outBytes;
- }
-
- /**
- * process an array of bytes, producing output if necessary.
- *
- * @param in the input byte array.
- * @param inOff the offset at which the input data starts.
- * @param len the number of bytes to be copied out of the input array.
- * @param out the space for any output that might be produced.
- * @param outOff the offset from which the output will be copied.
- * @return the number of output bytes copied to out.
- * @exception DataLengthException if there isn't enough space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- */
- public override int ProcessBytes(
- byte[] input,
- int inOff,
- int length,
- byte[] output,
- int outOff)
- {
- if (length < 1)
- {
- if (length < 0)
- throw new ArgumentException("Can't have a negative input length!");
-
- return 0;
- }
-
- int blockSize = GetBlockSize();
- int outLength = GetUpdateOutputSize(length);
-
- if (outLength > 0)
- {
- Check.OutputLength(output, outOff, outLength, "output buffer too short");
- }
-
- int resultLen = 0;
- int gapLen = buf.Length - bufOff;
- if (length > gapLen)
- {
- Array.Copy(input, inOff, buf, bufOff, gapLen);
- resultLen += cipher.ProcessBlock(buf, 0, output, outOff);
- bufOff = 0;
- length -= gapLen;
- inOff += gapLen;
- while (length > buf.Length)
- {
- resultLen += cipher.ProcessBlock(input, inOff, output, outOff + resultLen);
- length -= blockSize;
- inOff += blockSize;
- }
- }
- Array.Copy(input, inOff, buf, bufOff, length);
- bufOff += length;
- if (bufOff == buf.Length)
- {
- resultLen += cipher.ProcessBlock(buf, 0, output, outOff + resultLen);
- bufOff = 0;
- }
- return resultLen;
- }
-
- public override byte[] DoFinal()
- {
- byte[] outBytes = EmptyBuffer;
-
- int length = GetOutputSize(0);
- if (length > 0)
- {
- outBytes = new byte[length];
-
- int pos = DoFinal(outBytes, 0);
- if (pos < outBytes.Length)
- {
- byte[] tmp = new byte[pos];
- Array.Copy(outBytes, 0, tmp, 0, pos);
- outBytes = tmp;
- }
- }
- else
- {
- Reset();
- }
-
- return outBytes;
- }
-
- public override byte[] DoFinal(
- byte[] input,
- int inOff,
- int inLen)
- {
- if (input == null)
- throw new ArgumentNullException("input");
-
- int length = GetOutputSize(inLen);
-
- byte[] outBytes = EmptyBuffer;
-
- if (length > 0)
- {
- outBytes = new byte[length];
-
- int pos = (inLen > 0)
- ? ProcessBytes(input, inOff, inLen, outBytes, 0)
- : 0;
-
- pos += DoFinal(outBytes, pos);
-
- if (pos < outBytes.Length)
- {
- byte[] tmp = new byte[pos];
- Array.Copy(outBytes, 0, tmp, 0, pos);
- outBytes = tmp;
- }
- }
- else
- {
- Reset();
- }
-
- return outBytes;
- }
-
- /**
- * Process the last block in the buffer.
- *
- * @param out the array the block currently being held is copied into.
- * @param outOff the offset at which the copying starts.
- * @return the number of output bytes copied to out.
- * @exception DataLengthException if there is insufficient space in out for
- * the output, or the input is not block size aligned and should be.
- * @exception InvalidOperationException if the underlying cipher is not
- * initialised.
- * @exception InvalidCipherTextException if padding is expected and not found.
- * @exception DataLengthException if the input is not block size
- * aligned.
- */
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- try
- {
- if (bufOff != 0)
- {
- Check.DataLength(!cipher.IsPartialBlockOkay, "data not block size aligned");
- Check.OutputLength(output, outOff, bufOff, "output buffer too short for DoFinal()");
-
- // NB: Can't copy directly, or we may write too much output
- cipher.ProcessBlock(buf, 0, buf, 0);
- Array.Copy(buf, 0, output, outOff, bufOff);
- }
-
- return bufOff;
- }
- finally
- {
- Reset();
- }
- }
-
- /**
- * Reset the buffer and cipher. After resetting the object is in the same
- * state as it was after the last init (if there was one).
- */
- public override void Reset()
- {
- Array.Clear(buf, 0, buf.Length);
- bufOff = 0;
-
- cipher.Reset();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/BufferedCipherBase.cs b/BCCrypto/src/crypto/BufferedCipherBase.cs
deleted file mode 100644
index 9d86102..0000000
--- a/BCCrypto/src/crypto/BufferedCipherBase.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- public abstract class BufferedCipherBase
- : IBufferedCipher
- {
- protected static readonly byte[] EmptyBuffer = new byte[0];
-
- public abstract string AlgorithmName { get; }
-
- public abstract void Init(bool forEncryption, ICipherParameters parameters);
-
- public abstract int GetBlockSize();
-
- public abstract int GetOutputSize(int inputLen);
- public abstract int GetUpdateOutputSize(int inputLen);
-
- public abstract byte[] ProcessByte(byte input);
-
- public virtual int ProcessByte(
- byte input,
- byte[] output,
- int outOff)
- {
- byte[] outBytes = ProcessByte(input);
- if (outBytes == null)
- return 0;
- if (outOff + outBytes.Length > output.Length)
- throw new DataLengthException("output buffer too short");
- outBytes.CopyTo(output, outOff);
- return outBytes.Length;
- }
-
- public virtual byte[] ProcessBytes(
- byte[] input)
- {
- return ProcessBytes(input, 0, input.Length);
- }
-
- public abstract byte[] ProcessBytes(byte[] input, int inOff, int length);
-
- public virtual int ProcessBytes(
- byte[] input,
- byte[] output,
- int outOff)
- {
- return ProcessBytes(input, 0, input.Length, output, outOff);
- }
-
- public virtual int ProcessBytes(
- byte[] input,
- int inOff,
- int length,
- byte[] output,
- int outOff)
- {
- byte[] outBytes = ProcessBytes(input, inOff, length);
- if (outBytes == null)
- return 0;
- if (outOff + outBytes.Length > output.Length)
- throw new DataLengthException("output buffer too short");
- outBytes.CopyTo(output, outOff);
- return outBytes.Length;
- }
-
- public abstract byte[] DoFinal();
-
- public virtual byte[] DoFinal(
- byte[] input)
- {
- return DoFinal(input, 0, input.Length);
- }
-
- public abstract byte[] DoFinal(
- byte[] input,
- int inOff,
- int length);
-
- public virtual int DoFinal(
- byte[] output,
- int outOff)
- {
- byte[] outBytes = DoFinal();
- if (outOff + outBytes.Length > output.Length)
- throw new DataLengthException("output buffer too short");
- outBytes.CopyTo(output, outOff);
- return outBytes.Length;
- }
-
- public virtual int DoFinal(
- byte[] input,
- byte[] output,
- int outOff)
- {
- return DoFinal(input, 0, input.Length, output, outOff);
- }
-
- public virtual int DoFinal(
- byte[] input,
- int inOff,
- int length,
- byte[] output,
- int outOff)
- {
- int len = ProcessBytes(input, inOff, length, output, outOff);
- len += DoFinal(output, outOff + len);
- return len;
- }
-
- public abstract void Reset();
- }
-}
diff --git a/BCCrypto/src/crypto/BufferedIesCipher.cs b/BCCrypto/src/crypto/BufferedIesCipher.cs
deleted file mode 100644
index 6dab4ae..0000000
--- a/BCCrypto/src/crypto/BufferedIesCipher.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto
-{
- public class BufferedIesCipher
- : BufferedCipherBase
- {
- private readonly IesEngine engine;
- private bool forEncryption;
- private MemoryStream buffer = new MemoryStream();
-
- public BufferedIesCipher(
- IesEngine engine)
- {
- if (engine == null)
- throw new ArgumentNullException("engine");
-
- this.engine = engine;
- }
-
- public override string AlgorithmName
- {
- // TODO Create IESEngine.AlgorithmName
- get { return "IES"; }
- }
-
- public override void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- this.forEncryption = forEncryption;
-
- // TODO
- throw Platform.CreateNotImplementedException("IES");
- }
-
- public override int GetBlockSize()
- {
- return 0;
- }
-
- public override int GetOutputSize(
- int inputLen)
- {
- if (engine == null)
- throw new InvalidOperationException("cipher not initialised");
-
- int baseLen = inputLen + (int) buffer.Length;
- return forEncryption
- ? baseLen + 20
- : baseLen - 20;
- }
-
- public override int GetUpdateOutputSize(
- int inputLen)
- {
- return 0;
- }
-
- public override byte[] ProcessByte(
- byte input)
- {
- buffer.WriteByte(input);
- return null;
- }
-
- public override byte[] ProcessBytes(
- byte[] input,
- int inOff,
- int length)
- {
- if (input == null)
- throw new ArgumentNullException("input");
- if (inOff < 0)
- throw new ArgumentException("inOff");
- if (length < 0)
- throw new ArgumentException("length");
- if (inOff + length > input.Length)
- throw new ArgumentException("invalid offset/length specified for input array");
-
- buffer.Write(input, inOff, length);
- return null;
- }
-
- public override byte[] DoFinal()
- {
- byte[] buf = buffer.ToArray();
-
- Reset();
-
- return engine.ProcessBlock(buf, 0, buf.Length);
- }
-
- public override byte[] DoFinal(
- byte[] input,
- int inOff,
- int length)
- {
- ProcessBytes(input, inOff, length);
- return DoFinal();
- }
-
- public override void Reset()
- {
- buffer.SetLength(0);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/BufferedStreamCipher.cs b/BCCrypto/src/crypto/BufferedStreamCipher.cs
deleted file mode 100644
index 2d4987b..0000000
--- a/BCCrypto/src/crypto/BufferedStreamCipher.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto
-{
- public class BufferedStreamCipher
- : BufferedCipherBase
- {
- private readonly IStreamCipher cipher;
-
- public BufferedStreamCipher(
- IStreamCipher cipher)
- {
- if (cipher == null)
- throw new ArgumentNullException("cipher");
-
- this.cipher = cipher;
- }
-
- public override string AlgorithmName
- {
- get { return cipher.AlgorithmName; }
- }
-
- public override void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (parameters is ParametersWithRandom)
- {
- parameters = ((ParametersWithRandom) parameters).Parameters;
- }
-
- cipher.Init(forEncryption, parameters);
- }
-
- public override int GetBlockSize()
- {
- return 0;
- }
-
- public override int GetOutputSize(
- int inputLen)
- {
- return inputLen;
- }
-
- public override int GetUpdateOutputSize(
- int inputLen)
- {
- return inputLen;
- }
-
- public override byte[] ProcessByte(
- byte input)
- {
- return new byte[]{ cipher.ReturnByte(input) };
- }
-
- public override int ProcessByte(
- byte input,
- byte[] output,
- int outOff)
- {
- if (outOff >= output.Length)
- throw new DataLengthException("output buffer too short");
-
- output[outOff] = cipher.ReturnByte(input);
- return 1;
- }
-
- public override byte[] ProcessBytes(
- byte[] input,
- int inOff,
- int length)
- {
- if (length < 1)
- return null;
-
- byte[] output = new byte[length];
- cipher.ProcessBytes(input, inOff, length, output, 0);
- return output;
- }
-
- public override int ProcessBytes(
- byte[] input,
- int inOff,
- int length,
- byte[] output,
- int outOff)
- {
- if (length < 1)
- return 0;
-
- if (length > 0)
- {
- cipher.ProcessBytes(input, inOff, length, output, outOff);
- }
-
- return length;
- }
-
- public override byte[] DoFinal()
- {
- Reset();
-
- return EmptyBuffer;
- }
-
- public override byte[] DoFinal(
- byte[] input,
- int inOff,
- int length)
- {
- if (length < 1)
- return EmptyBuffer;
-
- byte[] output = ProcessBytes(input, inOff, length);
-
- Reset();
-
- return output;
- }
-
- public override void Reset()
- {
- cipher.Reset();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/Check.cs b/BCCrypto/src/crypto/Check.cs
deleted file mode 100644
index 96a05c6..0000000
--- a/BCCrypto/src/crypto/Check.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- internal class Check
- {
- internal static void DataLength(bool condition, string msg)
- {
- if (condition)
- throw new DataLengthException(msg);
- }
-
- internal static void DataLength(byte[] buf, int off, int len, string msg)
- {
- if (off + len > buf.Length)
- throw new DataLengthException(msg);
- }
-
- internal static void OutputLength(byte[] buf, int off, int len, string msg)
- {
- if (off + len > buf.Length)
- throw new OutputLengthException(msg);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/CipherKeyGenerator.cs b/BCCrypto/src/crypto/CipherKeyGenerator.cs
deleted file mode 100644
index d8d9b29..0000000
--- a/BCCrypto/src/crypto/CipherKeyGenerator.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * The base class for symmetric, or secret, cipher key generators.
- */
- public class CipherKeyGenerator
- {
- protected internal SecureRandom random;
- protected internal int strength;
- private bool uninitialised = true;
- private int defaultStrength;
-
- public CipherKeyGenerator()
- {
- }
-
- internal CipherKeyGenerator(
- int defaultStrength)
- {
- if (defaultStrength < 1)
- throw new ArgumentException("strength must be a positive value", "defaultStrength");
-
- this.defaultStrength = defaultStrength;
- }
-
- public int DefaultStrength
- {
- get { return defaultStrength; }
- }
-
- /**
- * initialise the key generator.
- *
- * @param param the parameters to be used for key generation
- */
- public void Init(
- KeyGenerationParameters parameters)
- {
- if (parameters == null)
- throw new ArgumentNullException("parameters");
-
- this.uninitialised = false;
-
- engineInit(parameters);
- }
-
- protected virtual void engineInit(
- KeyGenerationParameters parameters)
- {
- this.random = parameters.Random;
- this.strength = (parameters.Strength + 7) / 8;
- }
-
- /**
- * Generate a secret key.
- *
- * @return a byte array containing the key value.
- */
- public byte[] GenerateKey()
- {
- if (uninitialised)
- {
- if (defaultStrength < 1)
- throw new InvalidOperationException("Generator has not been initialised");
-
- uninitialised = false;
-
- engineInit(new KeyGenerationParameters(new SecureRandom(), defaultStrength));
- }
-
- return engineGenerateKey();
- }
-
- protected virtual byte[] engineGenerateKey()
- {
- return SecureRandom.GetNextBytes(random, strength);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/CryptoException.cs b/BCCrypto/src/crypto/CryptoException.cs
deleted file mode 100644
index 73d450b..0000000
--- a/BCCrypto/src/crypto/CryptoException.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class CryptoException
- : Exception
- {
- public CryptoException()
- {
- }
-
- public CryptoException(
- string message)
- : base(message)
- {
- }
-
- public CryptoException(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/DataLengthException.cs b/BCCrypto/src/crypto/DataLengthException.cs
deleted file mode 100644
index 447ff2a..0000000
--- a/BCCrypto/src/crypto/DataLengthException.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * this exception is thrown if a buffer that is meant to have output
- * copied into it turns out to be too short, or if we've been given
- * insufficient input. In general this exception will Get thrown rather
- * than an ArrayOutOfBounds exception.
- */
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class DataLengthException
- : CryptoException
- {
- /**
- * base constructor.
- */
- public DataLengthException()
- {
- }
-
- /**
- * create a DataLengthException with the given message.
- *
- * @param message the message to be carried with the exception.
- */
- public DataLengthException(
- string message)
- : base(message)
- {
- }
-
- public DataLengthException(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/IAsymmetricBlockCipher.cs b/BCCrypto/src/crypto/IAsymmetricBlockCipher.cs
deleted file mode 100644
index 455cfaa..0000000
--- a/BCCrypto/src/crypto/IAsymmetricBlockCipher.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /// Base interface for a public/private key block cipher.
- public interface IAsymmetricBlockCipher
- {
- /// The name of the algorithm this cipher implements.
- string AlgorithmName { get; }
-
- /// Initialise the cipher.
- /// Initialise for encryption if true, for decryption if false.
- /// The key or other data required by the cipher.
- void Init(bool forEncryption, ICipherParameters parameters);
-
- /// The maximum size, in bytes, an input block may be.
- int GetInputBlockSize();
-
- /// The maximum size, in bytes, an output block will be.
- int GetOutputBlockSize();
-
- /// Process a block.
- /// The input buffer.
- /// The offset into inBuf that the input block begins.
- /// The length of the input block.
- /// Input decrypts improperly.
- /// Input is too large for the cipher.
- byte[] ProcessBlock(byte[] inBuf, int inOff, int inLen);
- }
-}
diff --git a/BCCrypto/src/crypto/IAsymmetricCipherKeyPairGenerator.cs b/BCCrypto/src/crypto/IAsymmetricCipherKeyPairGenerator.cs
deleted file mode 100644
index 9ec5dfa..0000000
--- a/BCCrypto/src/crypto/IAsymmetricCipherKeyPairGenerator.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * interface that a public/private key pair generator should conform to.
- */
- public interface IAsymmetricCipherKeyPairGenerator
- {
- /**
- * intialise the key pair generator.
- *
- * @param the parameters the key pair is to be initialised with.
- */
- void Init(KeyGenerationParameters parameters);
-
- /**
- * return an AsymmetricCipherKeyPair containing the Generated keys.
- *
- * @return an AsymmetricCipherKeyPair containing the Generated keys.
- */
- AsymmetricCipherKeyPair GenerateKeyPair();
- }
-}
diff --git a/BCCrypto/src/crypto/IBasicAgreement.cs b/BCCrypto/src/crypto/IBasicAgreement.cs
deleted file mode 100644
index 7dfc618..0000000
--- a/BCCrypto/src/crypto/IBasicAgreement.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * The basic interface that basic Diffie-Hellman implementations
- * conforms to.
- */
- public interface IBasicAgreement
- {
- /**
- * initialise the agreement engine.
- */
- void Init(ICipherParameters parameters);
-
- /**
- * return the field size for the agreement algorithm in bytes.
- */
- int GetFieldSize();
-
- /**
- * given a public key from a given party calculate the next
- * message in the agreement sequence.
- */
- BigInteger CalculateAgreement(ICipherParameters pubKey);
- }
-
-}
diff --git a/BCCrypto/src/crypto/IBlockCipher.cs b/BCCrypto/src/crypto/IBlockCipher.cs
deleted file mode 100644
index a3ad6d6..0000000
--- a/BCCrypto/src/crypto/IBlockCipher.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /// Base interface for a symmetric key block cipher.
- public interface IBlockCipher
- {
- /// The name of the algorithm this cipher implements.
- string AlgorithmName { get; }
-
- /// Initialise the cipher.
- /// Initialise for encryption if true, for decryption if false.
- /// The key or other data required by the cipher.
- void Init(bool forEncryption, ICipherParameters parameters);
-
- /// The block size for this cipher, in bytes.
- int GetBlockSize();
-
- /// Indicates whether this cipher can handle partial blocks.
- bool IsPartialBlockOkay { get; }
-
- /// Process a block.
- /// The input buffer.
- /// The offset into inBuf that the input block begins.
- /// The output buffer.
- /// The offset into outBuf to write the output block.
- /// If input block is wrong size, or outBuf too small.
- /// The number of bytes processed and produced.
- int ProcessBlock(byte[] inBuf, int inOff, byte[] outBuf, int outOff);
-
- ///
- /// Reset the cipher to the same state as it was after the last init (if there was one).
- ///
- void Reset();
- }
-}
diff --git a/BCCrypto/src/crypto/IBlockResult.cs b/BCCrypto/src/crypto/IBlockResult.cs
deleted file mode 100644
index 0f054fe..0000000
--- a/BCCrypto/src/crypto/IBlockResult.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-
-namespace Org.BouncyCastle.Crypto
-{
- ///
- /// Operators that reduce their input to a single block return an object
- /// of this type.
- ///
- public interface IBlockResult
- {
- ///
- /// Return the final result of the operation.
- ///
- /// A block of bytes, representing the result of an operation.
- byte[] Collect();
-
- ///
- /// Store the final result of the operation by copying it into the destination array.
- ///
- /// The number of bytes copied into destination.
- /// The byte array to copy the result into.
- /// The offset into destination to start copying the result at.
- int Collect(byte[] destination, int offset);
- }
-}
diff --git a/BCCrypto/src/crypto/IBufferedCipher.cs b/BCCrypto/src/crypto/IBufferedCipher.cs
deleted file mode 100644
index 69dec95..0000000
--- a/BCCrypto/src/crypto/IBufferedCipher.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /// Block cipher engines are expected to conform to this interface.
- public interface IBufferedCipher
- {
- /// The name of the algorithm this cipher implements.
- string AlgorithmName { get; }
-
- /// Initialise the cipher.
- /// If true the cipher is initialised for encryption,
- /// if false for decryption.
- /// The key and other data required by the cipher.
- void Init(bool forEncryption, ICipherParameters parameters);
-
- int GetBlockSize();
-
- int GetOutputSize(int inputLen);
-
- int GetUpdateOutputSize(int inputLen);
-
- byte[] ProcessByte(byte input);
- int ProcessByte(byte input, byte[] output, int outOff);
-
- byte[] ProcessBytes(byte[] input);
- byte[] ProcessBytes(byte[] input, int inOff, int length);
- int ProcessBytes(byte[] input, byte[] output, int outOff);
- int ProcessBytes(byte[] input, int inOff, int length, byte[] output, int outOff);
-
- byte[] DoFinal();
- byte[] DoFinal(byte[] input);
- byte[] DoFinal(byte[] input, int inOff, int length);
- int DoFinal(byte[] output, int outOff);
- int DoFinal(byte[] input, byte[] output, int outOff);
- int DoFinal(byte[] input, int inOff, int length, byte[] output, int outOff);
-
- ///
- /// Reset the cipher. After resetting the cipher is in the same state
- /// as it was after the last init (if there was one).
- ///
- void Reset();
- }
-}
diff --git a/BCCrypto/src/crypto/ICipherParameters.cs b/BCCrypto/src/crypto/ICipherParameters.cs
deleted file mode 100644
index fff0941..0000000
--- a/BCCrypto/src/crypto/ICipherParameters.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * all parameter classes implement this.
- */
- public interface ICipherParameters
- {
- }
-}
diff --git a/BCCrypto/src/crypto/IDSA.cs b/BCCrypto/src/crypto/IDSA.cs
deleted file mode 100644
index 46056d8..0000000
--- a/BCCrypto/src/crypto/IDSA.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * interface for classes implementing the Digital Signature Algorithm
- */
- public interface IDsa
- {
- string AlgorithmName { get; }
-
- /**
- * initialise the signer for signature generation or signature
- * verification.
- *
- * @param forSigning true if we are generating a signature, false
- * otherwise.
- * @param param key parameters for signature generation.
- */
- void Init(bool forSigning, ICipherParameters parameters);
-
- /**
- * sign the passed in message (usually the output of a hash function).
- *
- * @param message the message to be signed.
- * @return two big integers representing the r and s values respectively.
- */
- BigInteger[] GenerateSignature(byte[] message);
-
- /**
- * verify the message message against the signature values r and s.
- *
- * @param message the message that was supposed to have been signed.
- * @param r the r signature value.
- * @param s the s signature value.
- */
- bool VerifySignature(byte[] message, BigInteger r, BigInteger s);
- }
-}
diff --git a/BCCrypto/src/crypto/IDerivationFunction.cs b/BCCrypto/src/crypto/IDerivationFunction.cs
deleted file mode 100644
index 7f289f7..0000000
--- a/BCCrypto/src/crypto/IDerivationFunction.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * base interface for general purpose byte derivation functions.
- */
- public interface IDerivationFunction
- {
- void Init(IDerivationParameters parameters);
-
- /**
- * return the message digest used as the basis for the function
- */
- IDigest Digest
- {
- get;
- }
-
- int GenerateBytes(byte[] output, int outOff, int length);
- //throws DataLengthException, ArgumentException;
- }
-
-}
diff --git a/BCCrypto/src/crypto/IDerivationParameters.cs b/BCCrypto/src/crypto/IDerivationParameters.cs
deleted file mode 100644
index f1c8485..0000000
--- a/BCCrypto/src/crypto/IDerivationParameters.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * Parameters for key/byte stream derivation classes
- */
- public interface IDerivationParameters
- {
- }
-}
diff --git a/BCCrypto/src/crypto/IDigest.cs b/BCCrypto/src/crypto/IDigest.cs
deleted file mode 100644
index 6769dcc..0000000
--- a/BCCrypto/src/crypto/IDigest.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * interface that a message digest conforms to.
- */
- public interface IDigest
- {
- /**
- * return the algorithm name
- *
- * @return the algorithm name
- */
- string AlgorithmName { get; }
-
- /**
- * return the size, in bytes, of the digest produced by this message digest.
- *
- * @return the size, in bytes, of the digest produced by this message digest.
- */
- int GetDigestSize();
-
- /**
- * return the size, in bytes, of the internal buffer used by this digest.
- *
- * @return the size, in bytes, of the internal buffer used by this digest.
- */
- int GetByteLength();
-
- /**
- * update the message digest with a single byte.
- *
- * @param inByte the input byte to be entered.
- */
- void Update(byte input);
-
- /**
- * update the message digest with a block of bytes.
- *
- * @param input the byte array containing the data.
- * @param inOff the offset into the byte array where the data starts.
- * @param len the length of the data.
- */
- void BlockUpdate(byte[] input, int inOff, int length);
-
- /**
- * Close the digest, producing the final digest value. The doFinal
- * call leaves the digest reset.
- *
- * @param output the array the digest is to be copied into.
- * @param outOff the offset into the out array the digest is to start at.
- */
- int DoFinal(byte[] output, int outOff);
-
- /**
- * reset the digest back to it's initial state.
- */
- void Reset();
- }
-}
diff --git a/BCCrypto/src/crypto/IEntropySource.cs b/BCCrypto/src/crypto/IEntropySource.cs
deleted file mode 100644
index 62e3bc7..0000000
--- a/BCCrypto/src/crypto/IEntropySource.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- ///
- /// Base interface describing an entropy source for a DRBG.
- ///
- public interface IEntropySource
- {
- ///
- /// Return whether or not this entropy source is regarded as prediction resistant.
- ///
- /// true if this instance is prediction resistant; otherwise, false .
- bool IsPredictionResistant { get; }
-
- ///
- /// Return a byte array of entropy.
- ///
- /// The entropy bytes.
- byte[] GetEntropy();
-
- ///
- /// Return the number of bits of entropy this source can produce.
- ///
- /// The size, in bits, of the return value of getEntropy.
- int EntropySize { get; }
- }
-}
-
diff --git a/BCCrypto/src/crypto/IEntropySourceProvider.cs b/BCCrypto/src/crypto/IEntropySourceProvider.cs
deleted file mode 100644
index 7564141..0000000
--- a/BCCrypto/src/crypto/IEntropySourceProvider.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- ///
- /// Base interface describing a provider of entropy sources.
- ///
- public interface IEntropySourceProvider
- {
- ///
- /// Return an entropy source providing a block of entropy.
- ///
- /// The size of the block of entropy required.
- /// An entropy source providing bitsRequired blocks of entropy.
- IEntropySource Get(int bitsRequired);
- }
-}
diff --git a/BCCrypto/src/crypto/IMac.cs b/BCCrypto/src/crypto/IMac.cs
deleted file mode 100644
index 03a86e8..0000000
--- a/BCCrypto/src/crypto/IMac.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * The base interface for implementations of message authentication codes (MACs).
- */
- public interface IMac
- {
- /**
- * Initialise the MAC.
- *
- * @param param the key and other data required by the MAC.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- void Init(ICipherParameters parameters);
-
- /**
- * Return the name of the algorithm the MAC implements.
- *
- * @return the name of the algorithm the MAC implements.
- */
- string AlgorithmName { get; }
-
- /**
- * Return the block size for this MAC (in bytes).
- *
- * @return the block size for this MAC in bytes.
- */
- int GetMacSize();
-
- /**
- * add a single byte to the mac for processing.
- *
- * @param in the byte to be processed.
- * @exception InvalidOperationException if the MAC is not initialised.
- */
- void Update(byte input);
-
- /**
- * @param in the array containing the input.
- * @param inOff the index in the array the data begins at.
- * @param len the length of the input starting at inOff.
- * @exception InvalidOperationException if the MAC is not initialised.
- * @exception DataLengthException if there isn't enough data in in.
- */
- void BlockUpdate(byte[] input, int inOff, int len);
-
- /**
- * Compute the final stage of the MAC writing the output to the out
- * parameter.
- *
- * doFinal leaves the MAC in the same state it was after the last init.
- *
- * @param out the array the MAC is to be output to.
- * @param outOff the offset into the out buffer the output is to start at.
- * @exception DataLengthException if there isn't enough space in out.
- * @exception InvalidOperationException if the MAC is not initialised.
- */
- int DoFinal(byte[] output, int outOff);
-
- /**
- * Reset the MAC. At the end of resetting the MAC should be in the
- * in the same state it was after the last init (if there was one).
- */
- void Reset();
- }
-}
diff --git a/BCCrypto/src/crypto/ISignatureFactory.cs b/BCCrypto/src/crypto/ISignatureFactory.cs
deleted file mode 100644
index cbca7d1..0000000
--- a/BCCrypto/src/crypto/ISignatureFactory.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- ///
- /// Base interface for operators that serve as stream-based signature calculators.
- ///
- public interface ISignatureFactory
- {
- /// The algorithm details object for this calculator.
- Object AlgorithmDetails { get ; }
-
- ///
- /// Create a stream calculator for this signature calculator. The stream
- /// calculator is used for the actual operation of entering the data to be signed
- /// and producing the signature block.
- ///
- /// A calculator producing an IBlockResult with a signature in it.
- IStreamCalculator CreateCalculator();
- }
-}
-
-
diff --git a/BCCrypto/src/crypto/ISigner.cs b/BCCrypto/src/crypto/ISigner.cs
deleted file mode 100644
index e03bbf4..0000000
--- a/BCCrypto/src/crypto/ISigner.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-
-using System;
-using System.Text;
-
-namespace Org.BouncyCastle.Crypto
-{
- public interface ISigner
- {
- /**
- * Return the name of the algorithm the signer implements.
- *
- * @return the name of the algorithm the signer implements.
- */
- string AlgorithmName { get; }
-
- /**
- * Initialise the signer for signing or verification.
- *
- * @param forSigning true if for signing, false otherwise
- * @param param necessary parameters.
- */
- void Init(bool forSigning, ICipherParameters parameters);
-
- /**
- * update the internal digest with the byte b
- */
- void Update(byte input);
-
- /**
- * update the internal digest with the byte array in
- */
- void BlockUpdate(byte[] input, int inOff, int length);
-
- /**
- * Generate a signature for the message we've been loaded with using
- * the key we were initialised with.
- */
- byte[] GenerateSignature();
- /**
- * return true if the internal state represents the signature described
- * in the passed in array.
- */
- bool VerifySignature(byte[] signature);
-
- /**
- * reset the internal state
- */
- void Reset();
- }
-}
diff --git a/BCCrypto/src/crypto/ISignerWithRecovery.cs b/BCCrypto/src/crypto/ISignerWithRecovery.cs
deleted file mode 100644
index 024f5ce..0000000
--- a/BCCrypto/src/crypto/ISignerWithRecovery.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-using System.Text;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * Signer with message recovery.
- */
- public interface ISignerWithRecovery
- : ISigner
- {
- /**
- * Returns true if the signer has recovered the full message as
- * part of signature verification.
- *
- * @return true if full message recovered.
- */
- bool HasFullMessage();
-
- /**
- * Returns a reference to what message was recovered (if any).
- *
- * @return full/partial message, null if nothing.
- */
- byte[] GetRecoveredMessage();
-
- /**
- * Perform an update with the recovered message before adding any other data. This must
- * be the first update method called, and calling it will result in the signer assuming
- * that further calls to update will include message content past what is recoverable.
- *
- * @param signature the signature that we are in the process of verifying.
- * @throws IllegalStateException
- */
- void UpdateWithRecoveredMessage(byte[] signature);
- }
-}
diff --git a/BCCrypto/src/crypto/IStreamCalculator.cs b/BCCrypto/src/crypto/IStreamCalculator.cs
deleted file mode 100644
index 19a5428..0000000
--- a/BCCrypto/src/crypto/IStreamCalculator.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto
-{
- ///
- /// Base interface for cryptographic operations such as Hashes, MACs, and Signatures which reduce a stream of data
- /// to a single value.
- ///
- public interface IStreamCalculator
- {
- /// Return a "sink" stream which only exists to update the implementing object.
- /// A stream to write to in order to update the implementing object.
- Stream Stream { get; }
-
- ///
- /// Return the result of processing the stream. This value is only available once the stream
- /// has been closed.
- ///
- /// The result of processing the stream.
- Object GetResult();
- }
-}
diff --git a/BCCrypto/src/crypto/IStreamCipher.cs b/BCCrypto/src/crypto/IStreamCipher.cs
deleted file mode 100644
index 8e575a7..0000000
--- a/BCCrypto/src/crypto/IStreamCipher.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /// The interface stream ciphers conform to.
- public interface IStreamCipher
- {
- /// The name of the algorithm this cipher implements.
- string AlgorithmName { get; }
-
- /// Initialise the cipher.
- /// If true the cipher is initialised for encryption,
- /// if false for decryption.
- /// The key and other data required by the cipher.
- ///
- /// If the parameters argument is inappropriate.
- ///
- void Init(bool forEncryption, ICipherParameters parameters);
-
- /// encrypt/decrypt a single byte returning the result.
- /// the byte to be processed.
- /// the result of processing the input byte.
- byte ReturnByte(byte input);
-
- ///
- /// Process a block of bytes from input putting the result into output .
- ///
- /// The input byte array.
- ///
- /// The offset into input where the data to be processed starts.
- ///
- /// The number of bytes to be processed.
- /// The output buffer the processed bytes go into.
- ///
- /// The offset into output the processed data starts at.
- ///
- /// If the output buffer is too small.
- void ProcessBytes(byte[] input, int inOff, int length, byte[] output, int outOff);
-
- ///
- /// Reset the cipher to the same state as it was after the last init (if there was one).
- ///
- void Reset();
- }
-}
diff --git a/BCCrypto/src/crypto/IVerifier.cs b/BCCrypto/src/crypto/IVerifier.cs
deleted file mode 100644
index 560cabf..0000000
--- a/BCCrypto/src/crypto/IVerifier.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-namespace Org.BouncyCastle.Crypto
-{
- ///
- /// Operators that reduce their input to the validation of a signature produce this type.
- ///
- public interface IVerifier
- {
- ///
- /// Return true if the passed in data matches what is expected by the verification result.
- ///
- /// The bytes representing the signature.
- /// true if the signature verifies, false otherwise.
- bool IsVerified(byte[] data);
-
- ///
- /// Return true if the length bytes from off in the source array match the signature
- /// expected by the verification result.
- ///
- /// Byte array containing the signature.
- /// The offset into the source array where the signature starts.
- /// The number of bytes in source making up the signature.
- /// true if the signature verifies, false otherwise.
- bool IsVerified(byte[] source, int off, int length);
- }
-}
diff --git a/BCCrypto/src/crypto/IVerifierFactory.cs b/BCCrypto/src/crypto/IVerifierFactory.cs
deleted file mode 100644
index 9502b14..0000000
--- a/BCCrypto/src/crypto/IVerifierFactory.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- ///
- /// Base interface for operators that serve as stream-based signature verifiers.
- ///
- public interface IVerifierFactory
- {
- /// The algorithm details object for this verifier.
- Object AlgorithmDetails { get ; }
-
- ///
- /// Create a stream calculator for this verifier. The stream
- /// calculator is used for the actual operation of entering the data to be verified
- /// and producing a result which can be used to verify the original signature.
- ///
- /// A calculator producing an IVerifier which can verify the signature.
- IStreamCalculator CreateCalculator();
- }
-}
diff --git a/BCCrypto/src/crypto/IVerifierFactoryProvider.cs b/BCCrypto/src/crypto/IVerifierFactoryProvider.cs
deleted file mode 100644
index 9cfcbb2..0000000
--- a/BCCrypto/src/crypto/IVerifierFactoryProvider.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- ///
- /// Base interface for a provider to support the dynamic creation of signature verifiers.
- ///
- public interface IVerifierFactoryProvider
- {
- ///
- /// Return a signature verfier for signature algorithm described in the passed in algorithm details object.
- ///
- /// The details of the signature algorithm verification is required for.
- /// A new signature verifier.
- IVerifierFactory CreateVerifierFactory (Object algorithmDetails);
- }
-}
-
diff --git a/BCCrypto/src/crypto/IWrapper.cs b/BCCrypto/src/crypto/IWrapper.cs
deleted file mode 100644
index 58202b3..0000000
--- a/BCCrypto/src/crypto/IWrapper.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto
-{
- public interface IWrapper
- {
- /// The name of the algorithm this cipher implements.
- string AlgorithmName { get; }
-
- void Init(bool forWrapping, ICipherParameters parameters);
-
- byte[] Wrap(byte[] input, int inOff, int length);
-
- byte[] Unwrap(byte[] input, int inOff, int length);
- }
-}
diff --git a/BCCrypto/src/crypto/IXof.cs b/BCCrypto/src/crypto/IXof.cs
deleted file mode 100644
index f76304d..0000000
--- a/BCCrypto/src/crypto/IXof.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- ///
- /// With FIPS PUB 202 a new kind of message digest was announced which supported extendable output, or variable digest sizes.
- /// This interface provides the extra method required to support variable output on a digest implementation.
- ///
- public interface IXof
- : IDigest
- {
- ///
- /// Output the results of the final calculation for this digest to outLen number of bytes.
- ///
- /// output array to write the output bytes to.
- /// offset to start writing the bytes at.
- /// the number of output bytes requested.
- /// the number of bytes written
- int DoFinal(byte[] output, int outOff, int outLen);
-
- ///
- /// Start outputting the results of the final calculation for this digest. Unlike DoFinal, this method
- /// will continue producing output until the Xof is explicitly reset, or signals otherwise.
- ///
- /// output array to write the output bytes to.
- /// offset to start writing the bytes at.
- /// the number of output bytes requested.
- /// the number of bytes written
- int DoOutput(byte[] output, int outOff, int outLen);
- }
-}
diff --git a/BCCrypto/src/crypto/InvalidCipherTextException.cs b/BCCrypto/src/crypto/InvalidCipherTextException.cs
deleted file mode 100644
index 0fe540d..0000000
--- a/BCCrypto/src/crypto/InvalidCipherTextException.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * this exception is thrown whenever we find something we don't expect in a
- * message.
- */
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class InvalidCipherTextException
- : CryptoException
- {
- /**
- * base constructor.
- */
- public InvalidCipherTextException()
- {
- }
-
- /**
- * create a InvalidCipherTextException with the given message.
- *
- * @param message the message to be carried with the exception.
- */
- public InvalidCipherTextException(
- string message)
- : base(message)
- {
- }
-
- public InvalidCipherTextException(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/KeyGenerationParameters.cs b/BCCrypto/src/crypto/KeyGenerationParameters.cs
deleted file mode 100644
index 0cb6b07..0000000
--- a/BCCrypto/src/crypto/KeyGenerationParameters.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * The base class for parameters to key generators.
- */
- public class KeyGenerationParameters
- {
- private SecureRandom random;
- private int strength;
-
- /**
- * initialise the generator with a source of randomness
- * and a strength (in bits).
- *
- * @param random the random byte source.
- * @param strength the size, in bits, of the keys we want to produce.
- */
- public KeyGenerationParameters(
- SecureRandom random,
- int strength)
- {
- if (random == null)
- throw new ArgumentNullException("random");
- if (strength < 1)
- throw new ArgumentException("strength must be a positive value", "strength");
-
- this.random = random;
- this.strength = strength;
- }
-
- /**
- * return the random source associated with this
- * generator.
- *
- * @return the generators random source.
- */
- public SecureRandom Random
- {
- get { return random; }
- }
-
- /**
- * return the bit strength for keys produced by this generator,
- *
- * @return the strength of the keys this generator produces (in bits).
- */
- public int Strength
- {
- get { return strength; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/MaxBytesExceededException.cs b/BCCrypto/src/crypto/MaxBytesExceededException.cs
deleted file mode 100644
index 8992c45..0000000
--- a/BCCrypto/src/crypto/MaxBytesExceededException.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
- ///
- /// This exception is thrown whenever a cipher requires a change of key, iv
- /// or similar after x amount of bytes enciphered
- ///
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class MaxBytesExceededException
- : CryptoException
- {
- public MaxBytesExceededException()
- {
- }
-
- public MaxBytesExceededException(
- string message)
- : base(message)
- {
- }
-
- public MaxBytesExceededException(
- string message,
- Exception e)
- : base(message, e)
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/OutputLengthException.cs b/BCCrypto/src/crypto/OutputLengthException.cs
deleted file mode 100644
index 437589f..0000000
--- a/BCCrypto/src/crypto/OutputLengthException.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class OutputLengthException
- : DataLengthException
- {
- public OutputLengthException()
- {
- }
-
- public OutputLengthException(
- string message)
- : base(message)
- {
- }
-
- public OutputLengthException(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/PbeParametersGenerator.cs b/BCCrypto/src/crypto/PbeParametersGenerator.cs
deleted file mode 100644
index 97d23df..0000000
--- a/BCCrypto/src/crypto/PbeParametersGenerator.cs
+++ /dev/null
@@ -1,202 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * super class for all Password Based Encyrption (Pbe) parameter generator classes.
- */
- public abstract class PbeParametersGenerator
- {
- protected byte[] mPassword;
- protected byte[] mSalt;
- protected int mIterationCount;
-
- /**
- * base constructor.
- */
- protected PbeParametersGenerator()
- {
- }
-
- /**
- * initialise the Pbe generator.
- *
- * @param password the password converted into bytes (see below).
- * @param salt the salt to be mixed with the password.
- * @param iterationCount the number of iterations the "mixing" function
- * is to be applied for.
- */
- public virtual void Init(
- byte[] password,
- byte[] salt,
- int iterationCount)
- {
- if (password == null)
- throw new ArgumentNullException("password");
- if (salt == null)
- throw new ArgumentNullException("salt");
-
- this.mPassword = Arrays.Clone(password);
- this.mSalt = Arrays.Clone(salt);
- this.mIterationCount = iterationCount;
- }
-
- public virtual byte[] Password
- {
- get { return Arrays.Clone(mPassword); }
- }
-
- /**
- * return the password byte array.
- *
- * @return the password byte array.
- */
- [Obsolete("Use 'Password' property")]
- public byte[] GetPassword()
- {
- return Password;
- }
-
- public virtual byte[] Salt
- {
- get { return Arrays.Clone(mSalt); }
- }
-
- /**
- * return the salt byte array.
- *
- * @return the salt byte array.
- */
- [Obsolete("Use 'Salt' property")]
- public byte[] GetSalt()
- {
- return Salt;
- }
-
- /**
- * return the iteration count.
- *
- * @return the iteration count.
- */
- public virtual int IterationCount
- {
- get { return mIterationCount; }
- }
-
- /**
- * Generate derived parameters for a key of length keySize.
- *
- * @param keySize the length, in bits, of the key required.
- * @return a parameters object representing a key.
- */
- [Obsolete("Use version with 'algorithm' parameter")]
- public abstract ICipherParameters GenerateDerivedParameters(int keySize);
- public abstract ICipherParameters GenerateDerivedParameters(string algorithm, int keySize);
-
- /**
- * Generate derived parameters for a key of length keySize, and
- * an initialisation vector (IV) of length ivSize.
- *
- * @param keySize the length, in bits, of the key required.
- * @param ivSize the length, in bits, of the iv required.
- * @return a parameters object representing a key and an IV.
- */
- [Obsolete("Use version with 'algorithm' parameter")]
- public abstract ICipherParameters GenerateDerivedParameters(int keySize, int ivSize);
- public abstract ICipherParameters GenerateDerivedParameters(string algorithm, int keySize, int ivSize);
-
- /**
- * Generate derived parameters for a key of length keySize, specifically
- * for use with a MAC.
- *
- * @param keySize the length, in bits, of the key required.
- * @return a parameters object representing a key.
- */
- public abstract ICipherParameters GenerateDerivedMacParameters(int keySize);
-
- /**
- * converts a password to a byte array according to the scheme in
- * Pkcs5 (ascii, no padding)
- *
- * @param password a character array representing the password.
- * @return a byte array representing the password.
- */
- public static byte[] Pkcs5PasswordToBytes(
- char[] password)
- {
- if (password == null)
- return new byte[0];
-
- return Strings.ToByteArray(password);
- }
-
- [Obsolete("Use version taking 'char[]' instead")]
- public static byte[] Pkcs5PasswordToBytes(
- string password)
- {
- if (password == null)
- return new byte[0];
-
- return Strings.ToByteArray(password);
- }
-
- /**
- * converts a password to a byte array according to the scheme in
- * PKCS5 (UTF-8, no padding)
- *
- * @param password a character array representing the password.
- * @return a byte array representing the password.
- */
- public static byte[] Pkcs5PasswordToUtf8Bytes(
- char[] password)
- {
- if (password == null)
- return new byte[0];
-
- return Encoding.UTF8.GetBytes(password);
- }
-
- [Obsolete("Use version taking 'char[]' instead")]
- public static byte[] Pkcs5PasswordToUtf8Bytes(
- string password)
- {
- if (password == null)
- return new byte[0];
-
- return Encoding.UTF8.GetBytes(password);
- }
-
- /**
- * converts a password to a byte array according to the scheme in
- * Pkcs12 (unicode, big endian, 2 zero pad bytes at the end).
- *
- * @param password a character array representing the password.
- * @return a byte array representing the password.
- */
- public static byte[] Pkcs12PasswordToBytes(
- char[] password)
- {
- return Pkcs12PasswordToBytes(password, false);
- }
-
- public static byte[] Pkcs12PasswordToBytes(
- char[] password,
- bool wrongPkcs12Zero)
- {
- if (password == null || password.Length < 1)
- {
- return new byte[wrongPkcs12Zero ? 2 : 0];
- }
-
- // +1 for extra 2 pad bytes.
- byte[] bytes = new byte[(password.Length + 1) * 2];
-
- Encoding.BigEndianUnicode.GetBytes(password, 0, password.Length, bytes, 0);
-
- return bytes;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/StreamBlockCipher.cs b/BCCrypto/src/crypto/StreamBlockCipher.cs
deleted file mode 100644
index ef2a8b6..0000000
--- a/BCCrypto/src/crypto/StreamBlockCipher.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto
-{
- /**
- * a wrapper for block ciphers with a single byte block size, so that they
- * can be treated like stream ciphers.
- */
- public class StreamBlockCipher
- : IStreamCipher
- {
- private readonly IBlockCipher cipher;
- private readonly byte[] oneByte = new byte[1];
-
- /**
- * basic constructor.
- *
- * @param cipher the block cipher to be wrapped.
- * @exception ArgumentException if the cipher has a block size other than
- * one.
- */
- public StreamBlockCipher(
- IBlockCipher cipher)
- {
- if (cipher == null)
- throw new ArgumentNullException("cipher");
- if (cipher.GetBlockSize() != 1)
- throw new ArgumentException("block cipher block size != 1.", "cipher");
-
- this.cipher = cipher;
- }
-
- /**
- * initialise the underlying cipher.
- *
- * @param forEncryption true if we are setting up for encryption, false otherwise.
- * @param param the necessary parameters for the underlying cipher to be initialised.
- */
- public void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- cipher.Init(forEncryption, parameters);
- }
-
- /**
- * return the name of the algorithm we are wrapping.
- *
- * @return the name of the algorithm we are wrapping.
- */
- public string AlgorithmName
- {
- get { return cipher.AlgorithmName; }
- }
-
- /**
- * encrypt/decrypt a single byte returning the result.
- *
- * @param in the byte to be processed.
- * @return the result of processing the input byte.
- */
- public byte ReturnByte(
- byte input)
- {
- oneByte[0] = input;
-
- cipher.ProcessBlock(oneByte, 0, oneByte, 0);
-
- return oneByte[0];
- }
-
- /**
- * process a block of bytes from in putting the result into out.
- *
- * @param in the input byte array.
- * @param inOff the offset into the in array where the data to be processed starts.
- * @param len the number of bytes to be processed.
- * @param out the output buffer the processed bytes go into.
- * @param outOff the offset into the output byte array the processed data stars at.
- * @exception DataLengthException if the output buffer is too small.
- */
- public void ProcessBytes(
- byte[] input,
- int inOff,
- int length,
- byte[] output,
- int outOff)
- {
- if (outOff + length > output.Length)
- throw new DataLengthException("output buffer too small in ProcessBytes()");
-
- for (int i = 0; i != length; i++)
- {
- cipher.ProcessBlock(input, inOff + i, output, outOff + i);
- }
- }
-
- /**
- * reset the underlying cipher. This leaves it in the same state
- * it was at after the last init (if there was one).
- */
- public void Reset()
- {
- cipher.Reset();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/DHAgreement.cs b/BCCrypto/src/crypto/agreement/DHAgreement.cs
deleted file mode 100644
index e988c0d..0000000
--- a/BCCrypto/src/crypto/agreement/DHAgreement.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Agreement
-{
- /**
- * a Diffie-Hellman key exchange engine.
- *
- * note: This uses MTI/A0 key agreement in order to make the key agreement
- * secure against passive attacks. If you're doing Diffie-Hellman and both
- * parties have long term public keys you should look at using this. For
- * further information have a look at RFC 2631.
- *
- * It's possible to extend this to more than two parties as well, for the moment
- * that is left as an exercise for the reader.
- */
- public class DHAgreement
- {
- private DHPrivateKeyParameters key;
- private DHParameters dhParams;
- private BigInteger privateValue;
- private SecureRandom random;
-
- public void Init(
- ICipherParameters parameters)
- {
- AsymmetricKeyParameter kParam;
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom)parameters;
-
- this.random = rParam.Random;
- kParam = (AsymmetricKeyParameter)rParam.Parameters;
- }
- else
- {
- this.random = new SecureRandom();
- kParam = (AsymmetricKeyParameter)parameters;
- }
-
- if (!(kParam is DHPrivateKeyParameters))
- {
- throw new ArgumentException("DHEngine expects DHPrivateKeyParameters");
- }
-
- this.key = (DHPrivateKeyParameters)kParam;
- this.dhParams = key.Parameters;
- }
-
- /**
- * calculate our initial message.
- */
- public BigInteger CalculateMessage()
- {
- DHKeyPairGenerator dhGen = new DHKeyPairGenerator();
- dhGen.Init(new DHKeyGenerationParameters(random, dhParams));
- AsymmetricCipherKeyPair dhPair = dhGen.GenerateKeyPair();
-
- this.privateValue = ((DHPrivateKeyParameters)dhPair.Private).X;
-
- return ((DHPublicKeyParameters)dhPair.Public).Y;
- }
-
- /**
- * given a message from a given party and the corresponding public key
- * calculate the next message in the agreement sequence. In this case
- * this will represent the shared secret.
- */
- public BigInteger CalculateAgreement(
- DHPublicKeyParameters pub,
- BigInteger message)
- {
- if (pub == null)
- throw new ArgumentNullException("pub");
- if (message == null)
- throw new ArgumentNullException("message");
-
- if (!pub.Parameters.Equals(dhParams))
- throw new ArgumentException("Diffie-Hellman public key has wrong parameters.");
-
- BigInteger p = dhParams.P;
-
- BigInteger peerY = pub.Y;
- if (peerY == null || peerY.CompareTo(BigInteger.One) <= 0 || peerY.CompareTo(p.Subtract(BigInteger.One)) >= 0)
- throw new ArgumentException("Diffie-Hellman public key is weak");
-
- BigInteger result = peerY.ModPow(privateValue, p);
- if (result.Equals(BigInteger.One))
- throw new InvalidOperationException("Shared key can't be 1");
-
- return message.ModPow(key.X, p).Multiply(result).Mod(p);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/DHBasicAgreement.cs b/BCCrypto/src/crypto/agreement/DHBasicAgreement.cs
deleted file mode 100644
index 6c3fe65..0000000
--- a/BCCrypto/src/crypto/agreement/DHBasicAgreement.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Agreement
-{
- /**
- * a Diffie-Hellman key agreement class.
- *
- * note: This is only the basic algorithm, it doesn't take advantage of
- * long term public keys if they are available. See the DHAgreement class
- * for a "better" implementation.
- */
- public class DHBasicAgreement
- : IBasicAgreement
- {
- private DHPrivateKeyParameters key;
- private DHParameters dhParams;
-
- public virtual void Init(
- ICipherParameters parameters)
- {
- if (parameters is ParametersWithRandom)
- {
- parameters = ((ParametersWithRandom) parameters).Parameters;
- }
-
- if (!(parameters is DHPrivateKeyParameters))
- {
- throw new ArgumentException("DHEngine expects DHPrivateKeyParameters");
- }
-
- this.key = (DHPrivateKeyParameters) parameters;
- this.dhParams = key.Parameters;
- }
-
- public virtual int GetFieldSize()
- {
- return (key.Parameters.P.BitLength + 7) / 8;
- }
-
- /**
- * given a short term public key from a given party calculate the next
- * message in the agreement sequence.
- */
- public virtual BigInteger CalculateAgreement(
- ICipherParameters pubKey)
- {
- if (this.key == null)
- throw new InvalidOperationException("Agreement algorithm not initialised");
-
- DHPublicKeyParameters pub = (DHPublicKeyParameters)pubKey;
-
- if (!pub.Parameters.Equals(dhParams))
- throw new ArgumentException("Diffie-Hellman public key has wrong parameters.");
-
- BigInteger p = dhParams.P;
-
- BigInteger peerY = pub.Y;
- if (peerY == null || peerY.CompareTo(BigInteger.One) <= 0 || peerY.CompareTo(p.Subtract(BigInteger.One)) >= 0)
- throw new ArgumentException("Diffie-Hellman public key is weak");
-
- BigInteger result = peerY.ModPow(key.X, p);
- if (result.Equals(BigInteger.One))
- throw new InvalidOperationException("Shared key can't be 1");
-
- return result;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/DHStandardGroups.cs b/BCCrypto/src/crypto/agreement/DHStandardGroups.cs
deleted file mode 100644
index 425a978..0000000
--- a/BCCrypto/src/crypto/agreement/DHStandardGroups.cs
+++ /dev/null
@@ -1,221 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Crypto.Agreement
-{
- /// Standard Diffie-Hellman groups from various IETF specifications.
- public class DHStandardGroups
- {
- private static BigInteger FromHex(string hex)
- {
- return new BigInteger(1, Hex.Decode(hex));
- }
-
- private static DHParameters FromPG(string hexP, string hexG)
- {
- return new DHParameters(FromHex(hexP), FromHex(hexG));
- }
-
- private static DHParameters FromPGQ(string hexP, string hexG, string hexQ)
- {
- return new DHParameters(FromHex(hexP), FromHex(hexG), FromHex(hexQ));
- }
-
- /*
- * RFC 2409
- */
- private static readonly string rfc2409_768_p = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
- + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
- + "E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF";
- private static readonly string rfc2409_768_g = "02";
- public static readonly DHParameters rfc2409_768 = FromPG(rfc2409_768_p, rfc2409_768_g);
-
- private static readonly string rfc2409_1024_p = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
- + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
- + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381"
- + "FFFFFFFFFFFFFFFF";
- private static readonly string rfc2409_1024_g = "02";
- public static readonly DHParameters rfc2409_1024 = FromPG(rfc2409_1024_p, rfc2409_1024_g);
-
- /*
- * RFC 3526
- */
- private static readonly string rfc3526_1536_p = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
- + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
- + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
- + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" + "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
- + "670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF";
- private static readonly string rfc3526_1536_g = "02";
- public static readonly DHParameters rfc3526_1536 = FromPG(rfc3526_1536_p, rfc3526_1536_g);
-
- private static readonly string rfc3526_2048_p = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
- + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
- + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
- + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" + "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
- + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
- + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" + "15728E5A8AACAA68FFFFFFFFFFFFFFFF";
- private static readonly string rfc3526_2048_g = "02";
- public static readonly DHParameters rfc3526_2048 = FromPG(rfc3526_2048_p, rfc3526_2048_g);
-
- private static readonly string rfc3526_3072_p = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
- + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
- + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
- + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" + "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
- + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
- + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" + "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"
- + "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" + "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"
- + "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"
- + "43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF";
- private static readonly string rfc3526_3072_g = "02";
- public static readonly DHParameters rfc3526_3072 = FromPG(rfc3526_3072_p, rfc3526_3072_g);
-
- private static readonly string rfc3526_4096_p = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
- + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
- + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
- + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" + "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
- + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
- + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" + "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"
- + "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" + "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"
- + "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"
- + "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" + "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA"
- + "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" + "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED"
- + "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" + "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199"
- + "FFFFFFFFFFFFFFFF";
- private static readonly string rfc3526_4096_g = "02";
- public static readonly DHParameters rfc3526_4096 = FromPG(rfc3526_4096_p, rfc3526_4096_g);
-
- private static readonly string rfc3526_6144_p = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08"
- + "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B"
- + "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9"
- + "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"
- + "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8"
- + "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D"
- + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C"
- + "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718"
- + "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D"
- + "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D"
- + "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226"
- + "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
- + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC"
- + "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26"
- + "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB"
- + "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2"
- + "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127"
- + "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492"
- + "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406"
- + "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918"
- + "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151"
- + "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03"
- + "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F"
- + "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA"
- + "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B"
- + "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632"
- + "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E"
- + "6DCC4024FFFFFFFFFFFFFFFF";
- private static readonly string rfc3526_6144_g = "02";
- public static readonly DHParameters rfc3526_6144 = FromPG(rfc3526_6144_p, rfc3526_6144_g);
-
- private static readonly string rfc3526_8192_p = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
- + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
- + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
- + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" + "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
- + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
- + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" + "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"
- + "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" + "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"
- + "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"
- + "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" + "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA"
- + "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" + "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED"
- + "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" + "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492"
- + "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BD" + "F8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831"
- + "179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B" + "DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF"
- + "5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6" + "D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F3"
- + "23A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA" + "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE328"
- + "06A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55C" + "DA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE"
- + "12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E4" + "38777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300"
- + "741FA7BF8AFC47ED2576F6936BA424663AAB639C5AE4F568" + "3423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9"
- + "22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B" + "4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A"
- + "062B3CF5B3A278A66D2A13F83F44F82DDF310EE074AB6A36" + "4597E899A0255DC164F31CC50846851DF9AB48195DED7EA1"
- + "B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F92" + "4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E47"
- + "9558E4475677E9AA9E3050E2765694DFC81F56E880B96E71" + "60C980DD98EDD3DFFFFFFFFFFFFFFFFF";
- private static readonly string rfc3526_8192_g = "02";
- public static readonly DHParameters rfc3526_8192 = FromPG(rfc3526_8192_p, rfc3526_8192_g);
-
- /*
- * RFC 4306
- */
- public static readonly DHParameters rfc4306_768 = rfc2409_768;
- public static readonly DHParameters rfc4306_1024 = rfc2409_1024;
-
- /*
- * RFC 5114
- */
- private static readonly string rfc5114_1024_160_p = "B10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C6"
- + "9A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C0" + "13ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD70"
- + "98488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0" + "A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708"
- + "DF1FB2BC2E4A4371";
- private static readonly string rfc5114_1024_160_g = "A4D1CBD5C3FD34126765A442EFB99905F8104DD258AC507F"
- + "D6406CFF14266D31266FEA1E5C41564B777E690F5504F213" + "160217B4B01B886A5E91547F9E2749F4D7FBD7D3B9A92EE1"
- + "909D0D2263F80A76A6A24C087A091F531DBF0A0169B6A28A" + "D662A4D18E73AFA32D779D5918D08BC8858F4DCEF97C2A24"
- + "855E6EEB22B3B2E5";
- private static readonly string rfc5114_1024_160_q = "F518AA8781A8DF278ABA4E7D64B7CB9D49462353";
-
- ///
- /// Existence of a "hidden SNFS" backdoor cannot be ruled out. see https://eprint.iacr.org/2016/961.pdf .
- ///
- [Obsolete("Existence of a 'hidden SNFS' backdoor cannot be ruled out.")]
- public static readonly DHParameters rfc5114_1024_160 = FromPGQ(rfc5114_1024_160_p, rfc5114_1024_160_g,
- rfc5114_1024_160_q);
-
- private static readonly string rfc5114_2048_224_p = "AD107E1E9123A9D0D660FAA79559C51FA20D64E5683B9FD1"
- + "B54B1597B61D0A75E6FA141DF95A56DBAF9A3C407BA1DF15" + "EB3D688A309C180E1DE6B85A1274A0A66D3F8152AD6AC212"
- + "9037C9EDEFDA4DF8D91E8FEF55B7394B7AD5B7D0B6C12207" + "C9F98D11ED34DBF6C6BA0B2C8BBC27BE6A00E0A0B9C49708"
- + "B3BF8A317091883681286130BC8985DB1602E714415D9330" + "278273C7DE31EFDC7310F7121FD5A07415987D9ADC0A486D"
- + "CDF93ACC44328387315D75E198C641A480CD86A1B9E587E8" + "BE60E69CC928B2B9C52172E413042E9B23F10B0E16E79763"
- + "C9B53DCF4BA80A29E3FB73C16B8E75B97EF363E2FFA31F71" + "CF9DE5384E71B81C0AC4DFFE0C10E64F";
- private static readonly string rfc5114_2048_224_g = "AC4032EF4F2D9AE39DF30B5C8FFDAC506CDEBE7B89998CAF"
- + "74866A08CFE4FFE3A6824A4E10B9A6F0DD921F01A70C4AFA" + "AB739D7700C29F52C57DB17C620A8652BE5E9001A8D66AD7"
- + "C17669101999024AF4D027275AC1348BB8A762D0521BC98A" + "E247150422EA1ED409939D54DA7460CDB5F6C6B250717CBE"
- + "F180EB34118E98D119529A45D6F834566E3025E316A330EF" + "BB77A86F0C1AB15B051AE3D428C8F8ACB70A8137150B8EEB"
- + "10E183EDD19963DDD9E263E4770589EF6AA21E7F5F2FF381" + "B539CCE3409D13CD566AFBB48D6C019181E1BCFE94B30269"
- + "EDFE72FE9B6AA4BD7B5A0F1C71CFFF4C19C418E1F6EC0179" + "81BC087F2A7065B384B890D3191F2BFA";
- private static readonly string rfc5114_2048_224_q = "801C0D34C58D93FE997177101F80535A4738CEBCBF389A99B36371EB";
-
- ///
- /// Existence of a "hidden SNFS" backdoor cannot be ruled out. see https://eprint.iacr.org/2016/961.pdf .
- ///
- [Obsolete("Existence of a 'hidden SNFS' backdoor cannot be ruled out.")]
- public static readonly DHParameters rfc5114_2048_224 = FromPGQ(rfc5114_2048_224_p, rfc5114_2048_224_g,
- rfc5114_2048_224_q);
-
- private static readonly string rfc5114_2048_256_p = "87A8E61DB4B6663CFFBBD19C651959998CEEF608660DD0F2"
- + "5D2CEED4435E3B00E00DF8F1D61957D4FAF7DF4561B2AA30" + "16C3D91134096FAA3BF4296D830E9A7C209E0C6497517ABD"
- + "5A8A9D306BCF67ED91F9E6725B4758C022E0B1EF4275BF7B" + "6C5BFC11D45F9088B941F54EB1E59BB8BC39A0BF12307F5C"
- + "4FDB70C581B23F76B63ACAE1CAA6B7902D52526735488A0E" + "F13C6D9A51BFA4AB3AD8347796524D8EF6A167B5A41825D9"
- + "67E144E5140564251CCACB83E6B486F6B3CA3F7971506026" + "C0B857F689962856DED4010ABD0BE621C3A3960A54E710C3"
- + "75F26375D7014103A4B54330C198AF126116D2276E11715F" + "693877FAD7EF09CADB094AE91E1A1597";
- private static readonly string rfc5114_2048_256_g = "3FB32C9B73134D0B2E77506660EDBD484CA7B18F21EF2054"
- + "07F4793A1A0BA12510DBC15077BE463FFF4FED4AAC0BB555" + "BE3A6C1B0C6B47B1BC3773BF7E8C6F62901228F8C28CBB18"
- + "A55AE31341000A650196F931C77A57F2DDF463E5E9EC144B" + "777DE62AAAB8A8628AC376D282D6ED3864E67982428EBC83"
- + "1D14348F6F2F9193B5045AF2767164E1DFC967C1FB3F2E55" + "A4BD1BFFE83B9C80D052B985D182EA0ADB2A3B7313D3FE14"
- + "C8484B1E052588B9B7D2BBD2DF016199ECD06E1557CD0915" + "B3353BBB64E0EC377FD028370DF92B52C7891428CDC67EB6"
- + "184B523D1DB246C32F63078490F00EF8D647D148D4795451" + "5E2327CFEF98C582664B4C0F6CC41659";
- private static readonly string rfc5114_2048_256_q = "8CF83642A709A097B447997640129DA299B1A47D1EB3750B"
- + "A308B0FE64F5FBD3";
-
- ///
- /// Existence of a "hidden SNFS" backdoor cannot be ruled out. see https://eprint.iacr.org/2016/961.pdf .
- ///
- [Obsolete("Existence of a 'hidden SNFS' backdoor cannot be ruled out.")]
- public static readonly DHParameters rfc5114_2048_256 = FromPGQ(rfc5114_2048_256_p, rfc5114_2048_256_g,
- rfc5114_2048_256_q);
-
- /*
- * RFC 5996
- */
- public static readonly DHParameters rfc5996_768 = rfc4306_768;
- public static readonly DHParameters rfc5996_1024 = rfc4306_1024;
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/ECDHBasicAgreement.cs b/BCCrypto/src/crypto/agreement/ECDHBasicAgreement.cs
deleted file mode 100644
index ca7b3fa..0000000
--- a/BCCrypto/src/crypto/agreement/ECDHBasicAgreement.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Agreement
-{
- /**
- * P1363 7.2.1 ECSVDP-DH
- *
- * ECSVDP-DH is Elliptic Curve Secret Value Derivation Primitive,
- * Diffie-Hellman version. It is based on the work of [DH76], [Mil86],
- * and [Kob87]. 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 assumes that the input keys are valid (see also
- * Section 7.2.2).
- */
- public class ECDHBasicAgreement
- : IBasicAgreement
- {
- protected internal ECPrivateKeyParameters privKey;
-
- public virtual void Init(
- ICipherParameters parameters)
- {
- if (parameters is ParametersWithRandom)
- {
- parameters = ((ParametersWithRandom)parameters).Parameters;
- }
-
- this.privKey = (ECPrivateKeyParameters)parameters;
- }
-
- public virtual int GetFieldSize()
- {
- return (privKey.Parameters.Curve.FieldSize + 7) / 8;
- }
-
- public virtual BigInteger CalculateAgreement(
- ICipherParameters pubKey)
- {
- ECPublicKeyParameters pub = (ECPublicKeyParameters) pubKey;
- if (!pub.Parameters.Equals(privKey.Parameters))
- throw new InvalidOperationException("ECDH public key has wrong domain parameters");
-
- ECPoint P = pub.Q.Multiply(privKey.D).Normalize();
-
- if (P.IsInfinity)
- throw new InvalidOperationException("Infinity is not a valid agreement value for ECDH");
-
- return P.AffineXCoord.ToBigInteger();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/ECDHCBasicAgreement.cs b/BCCrypto/src/crypto/agreement/ECDHCBasicAgreement.cs
deleted file mode 100644
index 1c9ae45..0000000
--- a/BCCrypto/src/crypto/agreement/ECDHCBasicAgreement.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using System;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Agreement
-{
- /**
- * 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
- : IBasicAgreement
- {
- private ECPrivateKeyParameters privKey;
-
- public virtual void Init(
- ICipherParameters parameters)
- {
- if (parameters is ParametersWithRandom)
- {
- parameters = ((ParametersWithRandom) parameters).Parameters;
- }
-
- this.privKey = (ECPrivateKeyParameters)parameters;
- }
-
- public virtual int GetFieldSize()
- {
- return (privKey.Parameters.Curve.FieldSize + 7) / 8;
- }
-
- public virtual BigInteger CalculateAgreement(
- ICipherParameters pubKey)
- {
- ECPublicKeyParameters pub = (ECPublicKeyParameters) pubKey;
- ECDomainParameters parameters = pub.Parameters;
- if (!parameters.Equals(privKey.Parameters))
- throw new InvalidOperationException("ECDHC public key has wrong domain parameters");
-
- BigInteger hd = parameters.H.Multiply(privKey.D).Mod(parameters.N);
-
- ECPoint P = pub.Q.Multiply(hd).Normalize();
-
- if (P.IsInfinity)
- throw new InvalidOperationException("Infinity is not a valid agreement value for ECDHC");
-
- return P.AffineXCoord.ToBigInteger();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/ECDHWithKdfBasicAgreement.cs b/BCCrypto/src/crypto/agreement/ECDHWithKdfBasicAgreement.cs
deleted file mode 100644
index 1de80d1..0000000
--- a/BCCrypto/src/crypto/agreement/ECDHWithKdfBasicAgreement.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto.Agreement.Kdf;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Agreement
-{
- public class ECDHWithKdfBasicAgreement
- : ECDHBasicAgreement
- {
- private readonly string algorithm;
- private readonly IDerivationFunction kdf;
-
- public ECDHWithKdfBasicAgreement(
- string algorithm,
- IDerivationFunction kdf)
- {
- if (algorithm == null)
- throw new ArgumentNullException("algorithm");
- if (kdf == null)
- throw new ArgumentNullException("kdf");
-
- this.algorithm = algorithm;
- this.kdf = kdf;
- }
-
- public override BigInteger CalculateAgreement(
- ICipherParameters pubKey)
- {
- // Note that the ec.KeyAgreement class in JCE only uses kdf in one
- // of the engineGenerateSecret methods.
-
- BigInteger result = base.CalculateAgreement(pubKey);
-
- int keySize = GeneratorUtilities.GetDefaultKeySize(algorithm);
-
- DHKdfParameters dhKdfParams = new DHKdfParameters(
- new DerObjectIdentifier(algorithm),
- keySize,
- BigIntToBytes(result));
-
- kdf.Init(dhKdfParams);
-
- byte[] keyBytes = new byte[keySize / 8];
- kdf.GenerateBytes(keyBytes, 0, keyBytes.Length);
-
- return new BigInteger(1, keyBytes);
- }
-
- private byte[] BigIntToBytes(BigInteger r)
- {
- int byteLength = X9IntegerConverter.GetByteLength(privKey.Parameters.Curve);
- return X9IntegerConverter.IntegerToBytes(r, byteLength);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/ECMqvBasicAgreement.cs b/BCCrypto/src/crypto/agreement/ECMqvBasicAgreement.cs
deleted file mode 100644
index 8d5cebb..0000000
--- a/BCCrypto/src/crypto/agreement/ECMqvBasicAgreement.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-
-namespace Org.BouncyCastle.Crypto.Agreement
-{
- public class ECMqvBasicAgreement
- : IBasicAgreement
- {
- protected internal MqvPrivateParameters privParams;
-
- public virtual void Init(
- ICipherParameters parameters)
- {
- if (parameters is ParametersWithRandom)
- {
- parameters = ((ParametersWithRandom)parameters).Parameters;
- }
-
- this.privParams = (MqvPrivateParameters)parameters;
- }
-
- public virtual int GetFieldSize()
- {
- return (privParams.StaticPrivateKey.Parameters.Curve.FieldSize + 7) / 8;
- }
-
- public virtual BigInteger CalculateAgreement(
- ICipherParameters pubKey)
- {
- MqvPublicParameters pubParams = (MqvPublicParameters)pubKey;
-
- ECPrivateKeyParameters staticPrivateKey = privParams.StaticPrivateKey;
- ECDomainParameters parameters = staticPrivateKey.Parameters;
-
- if (!parameters.Equals(pubParams.StaticPublicKey.Parameters))
- throw new InvalidOperationException("ECMQV public key components have wrong domain parameters");
-
- ECPoint agreement = CalculateMqvAgreement(parameters, staticPrivateKey,
- privParams.EphemeralPrivateKey, privParams.EphemeralPublicKey,
- pubParams.StaticPublicKey, pubParams.EphemeralPublicKey).Normalize();
-
- if (agreement.IsInfinity)
- throw new InvalidOperationException("Infinity is not a valid agreement value for MQV");
-
- return agreement.AffineXCoord.ToBigInteger();
- }
-
- // The ECMQV Primitive as described in SEC-1, 3.4
- private static ECPoint CalculateMqvAgreement(
- ECDomainParameters parameters,
- ECPrivateKeyParameters d1U,
- ECPrivateKeyParameters d2U,
- ECPublicKeyParameters Q2U,
- ECPublicKeyParameters Q1V,
- ECPublicKeyParameters Q2V)
- {
- BigInteger n = parameters.N;
- int e = (n.BitLength + 1) / 2;
- BigInteger powE = BigInteger.One.ShiftLeft(e);
-
- ECCurve curve = parameters.Curve;
-
- ECPoint[] points = new ECPoint[]{
- // The Q2U public key is optional - but will be calculated for us if it wasn't present
- ECAlgorithms.ImportPoint(curve, Q2U.Q),
- ECAlgorithms.ImportPoint(curve, Q1V.Q),
- ECAlgorithms.ImportPoint(curve, Q2V.Q)
- };
-
- curve.NormalizeAll(points);
-
- ECPoint q2u = points[0], q1v = points[1], q2v = points[2];
-
- BigInteger x = q2u.AffineXCoord.ToBigInteger();
- BigInteger xBar = x.Mod(powE);
- BigInteger Q2UBar = xBar.SetBit(e);
- BigInteger s = d1U.D.Multiply(Q2UBar).Add(d2U.D).Mod(n);
-
- BigInteger xPrime = q2v.AffineXCoord.ToBigInteger();
- BigInteger xPrimeBar = xPrime.Mod(powE);
- BigInteger Q2VBar = xPrimeBar.SetBit(e);
-
- BigInteger hs = parameters.H.Multiply(s).Mod(n);
-
- return ECAlgorithms.SumOfTwoMultiplies(
- q1v, Q2VBar.Multiply(hs).Mod(n), q2v, hs);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/ECMqvWithKdfBasicAgreement.cs b/BCCrypto/src/crypto/agreement/ECMqvWithKdfBasicAgreement.cs
deleted file mode 100644
index 7d79fc4..0000000
--- a/BCCrypto/src/crypto/agreement/ECMqvWithKdfBasicAgreement.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto.Agreement.Kdf;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Agreement
-{
- public class ECMqvWithKdfBasicAgreement
- : ECMqvBasicAgreement
- {
- private readonly string algorithm;
- private readonly IDerivationFunction kdf;
-
- public ECMqvWithKdfBasicAgreement(
- string algorithm,
- IDerivationFunction kdf)
- {
- if (algorithm == null)
- throw new ArgumentNullException("algorithm");
- if (kdf == null)
- throw new ArgumentNullException("kdf");
-
- this.algorithm = algorithm;
- this.kdf = kdf;
- }
-
- public override BigInteger CalculateAgreement(
- ICipherParameters pubKey)
- {
- // Note that the ec.KeyAgreement class in JCE only uses kdf in one
- // of the engineGenerateSecret methods.
-
- BigInteger result = base.CalculateAgreement(pubKey);
-
- int keySize = GeneratorUtilities.GetDefaultKeySize(algorithm);
-
- DHKdfParameters dhKdfParams = new DHKdfParameters(
- new DerObjectIdentifier(algorithm),
- keySize,
- BigIntToBytes(result));
-
- kdf.Init(dhKdfParams);
-
- byte[] keyBytes = new byte[keySize / 8];
- kdf.GenerateBytes(keyBytes, 0, keyBytes.Length);
-
- return new BigInteger(1, keyBytes);
- }
-
- private byte[] BigIntToBytes(BigInteger r)
- {
- int byteLength = X9IntegerConverter.GetByteLength(privParams.StaticPrivateKey.Parameters.Curve);
- return X9IntegerConverter.IntegerToBytes(r, byteLength);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/jpake/JPakeParticipant.cs b/BCCrypto/src/crypto/agreement/jpake/JPakeParticipant.cs
deleted file mode 100644
index 7942848..0000000
--- a/BCCrypto/src/crypto/agreement/jpake/JPakeParticipant.cs
+++ /dev/null
@@ -1,456 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Agreement.JPake
-{
- ///
- /// A participant in a Password Authenticated Key Exchange by Juggling (J-PAKE) exchange.
- ///
- /// The J-PAKE exchange is defined by Feng Hao and Peter Ryan in the paper
- ///
- /// "Password Authenticated Key Exchange by Juggling, 2008."
- ///
- /// The J-PAKE protocol is symmetric.
- /// There is no notion of a client or server , but rather just two participants .
- /// An instance of JPakeParticipant represents one participant, and
- /// is the primary interface for executing the exchange.
- ///
- /// To execute an exchange, construct a JPakeParticipant on each end,
- /// and call the following 7 methods
- /// (once and only once, in the given order, for each participant, sending messages between them as described):
- ///
- /// CreateRound1PayloadToSend() - and send the payload to the other participant
- /// ValidateRound1PayloadReceived(JPakeRound1Payload) - use the payload received from the other participant
- /// CreateRound2PayloadToSend() - and send the payload to the other participant
- /// ValidateRound2PayloadReceived(JPakeRound2Payload) - use the payload received from the other participant
- /// CalculateKeyingMaterial()
- /// CreateRound3PayloadToSend(BigInteger) - and send the payload to the other participant
- /// ValidateRound3PayloadReceived(JPakeRound3Payload, BigInteger) - use the payload received from the other participant
- ///
- /// Each side should derive a session key from the keying material returned by CalculateKeyingMaterial().
- /// The caller is responsible for deriving the session key using a secure key derivation function (KDF).
- ///
- /// Round 3 is an optional key confirmation process.
- /// If you do not execute round 3, then there is no assurance that both participants are using the same key.
- /// (i.e. if the participants used different passwords, then their session keys will differ.)
- ///
- /// If the round 3 validation succeeds, then the keys are guaranteed to be the same on both sides.
- ///
- /// The symmetric design can easily support the asymmetric cases when one party initiates the communication.
- /// e.g. Sometimes the round1 payload and round2 payload may be sent in one pass.
- /// Also, in some cases, the key confirmation payload can be sent together with the round2 payload.
- /// These are the trivial techniques to optimize the communication.
- ///
- /// The key confirmation process is implemented as specified in
- /// NIST SP 800-56A Revision 1 ,
- /// Section 8.2 Unilateral Key Confirmation for Key Agreement Schemes.
- ///
- /// This class is stateful and NOT threadsafe.
- /// Each instance should only be used for ONE complete J-PAKE exchange
- /// (i.e. a new JPakeParticipant should be constructed for each new J-PAKE exchange).
- ///
- public class JPakeParticipant
- {
- // Possible internal states. Used for state checking.
- public static readonly int STATE_INITIALIZED = 0;
- public static readonly int STATE_ROUND_1_CREATED = 10;
- public static readonly int STATE_ROUND_1_VALIDATED = 20;
- public static readonly int STATE_ROUND_2_CREATED = 30;
- public static readonly int STATE_ROUND_2_VALIDATED = 40;
- public static readonly int STATE_KEY_CALCULATED = 50;
- public static readonly int STATE_ROUND_3_CREATED = 60;
- public static readonly int STATE_ROUND_3_VALIDATED = 70;
-
- // Unique identifier of this participant.
- // The two participants in the exchange must NOT share the same id.
- private string participantId;
-
- // Shared secret. This only contains the secret between construction
- // and the call to CalculateKeyingMaterial().
- //
- // i.e. When CalculateKeyingMaterial() is called, this buffer overwritten with 0's,
- // and the field is set to null.
- private char[] password;
-
- // Digest to use during calculations.
- private IDigest digest;
-
- // Source of secure random data.
- private readonly SecureRandom random;
-
- private readonly BigInteger p;
- private readonly BigInteger q;
- private readonly BigInteger g;
-
- // The participantId of the other participant in this exchange.
- private string partnerParticipantId;
-
- // Alice's x1 or Bob's x3.
- private BigInteger x1;
- // Alice's x2 or Bob's x4.
- private BigInteger x2;
- // Alice's g^x1 or Bob's g^x3.
- private BigInteger gx1;
- // Alice's g^x2 or Bob's g^x4.
- private BigInteger gx2;
- // Alice's g^x3 or Bob's g^x1.
- private BigInteger gx3;
- // Alice's g^x4 or Bob's g^x2.
- private BigInteger gx4;
- // Alice's B or Bob's A.
- private BigInteger b;
-
- // The current state.
- // See the STATE_* constants for possible values.
- private int state;
-
- ///
- /// Convenience constructor for a new JPakeParticipant that uses
- /// the JPakePrimeOrderGroups#NIST_3072 prime order group,
- /// a SHA-256 digest, and a default SecureRandom implementation.
- ///
- /// After construction, the State state will be STATE_INITIALIZED.
- ///
- /// Throws NullReferenceException if any argument is null. Throws
- /// ArgumentException if password is empty.
- ///
- /// Unique identifier of this participant.
- /// The two participants in the exchange must NOT share the same id.
- /// Shared secret.
- /// A defensive copy of this array is made (and cleared once CalculateKeyingMaterial() is called).
- /// Caller should clear the input password as soon as possible.
- public JPakeParticipant(string participantId, char[] password)
- : this(participantId, password, JPakePrimeOrderGroups.NIST_3072) { }
-
- ///
- /// Convenience constructor for a new JPakeParticipant that uses
- /// a SHA-256 digest, and a default SecureRandom implementation.
- ///
- /// After construction, the State state will be STATE_INITIALIZED.
- ///
- /// Throws NullReferenceException if any argument is null. Throws
- /// ArgumentException if password is empty.
- ///
- /// Unique identifier of this participant.
- /// The two participants in the exchange must NOT share the same id.
- /// Shared secret.
- /// A defensive copy of this array is made (and cleared once CalculateKeyingMaterial() is called).
- /// Caller should clear the input password as soon as possible.
- /// Prime order group. See JPakePrimeOrderGroups for standard groups.
- public JPakeParticipant(string participantId, char[] password, JPakePrimeOrderGroup group)
- : this(participantId, password, group, new Sha256Digest(), new SecureRandom()) { }
-
-
- ///
- /// Constructor for a new JPakeParticipant.
- ///
- /// After construction, the State state will be STATE_INITIALIZED.
- ///
- /// Throws NullReferenceException if any argument is null. Throws
- /// ArgumentException if password is empty.
- ///
- /// Unique identifier of this participant.
- /// The two participants in the exchange must NOT share the same id.
- /// Shared secret.
- /// A defensive copy of this array is made (and cleared once CalculateKeyingMaterial() is called).
- /// Caller should clear the input password as soon as possible.
- /// Prime order group. See JPakePrimeOrderGroups for standard groups.
- /// Digest to use during zero knowledge proofs and key confirmation
- /// (SHA-256 or stronger preferred).
- /// Source of secure random data for x1 and x2, and for the zero knowledge proofs.
- public JPakeParticipant(string participantId, char[] password, JPakePrimeOrderGroup group, IDigest digest, SecureRandom random)
- {
- JPakeUtilities.ValidateNotNull(participantId, "participantId");
- JPakeUtilities.ValidateNotNull(password, "password");
- JPakeUtilities.ValidateNotNull(group, "p");
- JPakeUtilities.ValidateNotNull(digest, "digest");
- JPakeUtilities.ValidateNotNull(random, "random");
-
- if (password.Length == 0)
- {
- throw new ArgumentException("Password must not be empty.");
- }
-
- this.participantId = participantId;
-
- // Create a defensive copy so as to fully encapsulate the password.
- //
- // This array will contain the password for the lifetime of this
- // participant BEFORE CalculateKeyingMaterial() is called.
- //
- // i.e. When CalculateKeyingMaterial() is called, the array will be cleared
- // in order to remove the password from memory.
- //
- // The caller is responsible for clearing the original password array
- // given as input to this constructor.
- this.password = new char[password.Length];
- Array.Copy(password, this.password, password.Length);
-
- this.p = group.P;
- this.q = group.Q;
- this.g = group.G;
-
- this.digest = digest;
- this.random = random;
-
- this.state = STATE_INITIALIZED;
- }
-
- ///
- /// Gets the current state of this participant.
- /// See the STATE_* constants for possible values.
- ///
- public virtual int State
- {
- get { return state; }
- }
-
-
- ///
- /// Creates and returns the payload to send to the other participant during round 1.
- ///
- /// After execution, the State state} will be STATE_ROUND_1_CREATED}.
- ///
- public virtual JPakeRound1Payload CreateRound1PayloadToSend()
- {
- if (this.state >= STATE_ROUND_1_CREATED)
- throw new InvalidOperationException("Round 1 payload already created for " + this.participantId);
-
- this.x1 = JPakeUtilities.GenerateX1(q, random);
- this.x2 = JPakeUtilities.GenerateX2(q, random);
-
- this.gx1 = JPakeUtilities.CalculateGx(p, g, x1);
- this.gx2 = JPakeUtilities.CalculateGx(p, g, x2);
- BigInteger[] knowledgeProofForX1 = JPakeUtilities.CalculateZeroKnowledgeProof(p, q, g, gx1, x1, participantId, digest, random);
- BigInteger[] knowledgeProofForX2 = JPakeUtilities.CalculateZeroKnowledgeProof(p, q, g, gx2, x2, participantId, digest, random);
-
- this.state = STATE_ROUND_1_CREATED;
-
- return new JPakeRound1Payload(participantId, gx1, gx2, knowledgeProofForX1, knowledgeProofForX2);
- }
-
- ///
- /// Validates the payload received from the other participant during round 1.
- ///
- /// Must be called prior to CreateRound2PayloadToSend().
- ///
- /// After execution, the State state will be STATE_ROUND_1_VALIDATED.
- ///
- /// Throws CryptoException if validation fails. Throws InvalidOperationException
- /// if called multiple times.
- ///
- public virtual void ValidateRound1PayloadReceived(JPakeRound1Payload round1PayloadReceived)
- {
- if (this.state >= STATE_ROUND_1_VALIDATED)
- throw new InvalidOperationException("Validation already attempted for round 1 payload for " + this.participantId);
-
- this.partnerParticipantId = round1PayloadReceived.ParticipantId;
- this.gx3 = round1PayloadReceived.Gx1;
- this.gx4 = round1PayloadReceived.Gx2;
-
- BigInteger[] knowledgeProofForX3 = round1PayloadReceived.KnowledgeProofForX1;
- BigInteger[] knowledgeProofForX4 = round1PayloadReceived.KnowledgeProofForX2;
-
- JPakeUtilities.ValidateParticipantIdsDiffer(participantId, round1PayloadReceived.ParticipantId);
- JPakeUtilities.ValidateGx4(gx4);
- JPakeUtilities.ValidateZeroKnowledgeProof(p, q, g, gx3, knowledgeProofForX3, round1PayloadReceived.ParticipantId, digest);
- JPakeUtilities.ValidateZeroKnowledgeProof(p, q, g, gx4, knowledgeProofForX4, round1PayloadReceived.ParticipantId, digest);
- this.state = STATE_ROUND_1_VALIDATED;
- }
-
- ///
- /// Creates and returns the payload to send to the other participant during round 2.
- ///
- /// ValidateRound1PayloadReceived(JPakeRound1Payload) must be called prior to this method.
- ///
- /// After execution, the State state will be STATE_ROUND_2_CREATED.
- ///
- /// Throws InvalidOperationException if called prior to ValidateRound1PayloadReceived(JPakeRound1Payload), or multiple times
- ///
- public virtual JPakeRound2Payload CreateRound2PayloadToSend()
- {
- if (this.state >= STATE_ROUND_2_CREATED)
- throw new InvalidOperationException("Round 2 payload already created for " + this.participantId);
- if (this.state < STATE_ROUND_1_VALIDATED)
- throw new InvalidOperationException("Round 1 payload must be validated prior to creating round 2 payload for " + this.participantId);
-
- BigInteger gA = JPakeUtilities.CalculateGA(p, gx1, gx3, gx4);
- BigInteger s = JPakeUtilities.CalculateS(password);
- BigInteger x2s = JPakeUtilities.CalculateX2s(q, x2, s);
- BigInteger A = JPakeUtilities.CalculateA(p, q, gA, x2s);
- BigInteger[] knowledgeProofForX2s = JPakeUtilities.CalculateZeroKnowledgeProof(p, q, gA, A, x2s, participantId, digest, random);
-
- this.state = STATE_ROUND_2_CREATED;
-
- return new JPakeRound2Payload(participantId, A, knowledgeProofForX2s);
- }
-
- ///
- /// Validates the payload received from the other participant during round 2.
- /// Note that this DOES NOT detect a non-common password.
- /// The only indication of a non-common password is through derivation
- /// of different keys (which can be detected explicitly by executing round 3 and round 4)
- ///
- /// Must be called prior to CalculateKeyingMaterial().
- ///
- /// After execution, the State state will be STATE_ROUND_2_VALIDATED.
- ///
- /// Throws CryptoException if validation fails. Throws
- /// InvalidOperationException if called prior to ValidateRound1PayloadReceived(JPakeRound1Payload), or multiple times
- ///
- public virtual void ValidateRound2PayloadReceived(JPakeRound2Payload round2PayloadReceived)
- {
- if (this.state >= STATE_ROUND_2_VALIDATED)
- throw new InvalidOperationException("Validation already attempted for round 2 payload for " + this.participantId);
- if (this.state < STATE_ROUND_1_VALIDATED)
- throw new InvalidOperationException("Round 1 payload must be validated prior to validation round 2 payload for " + this.participantId);
-
- BigInteger gB = JPakeUtilities.CalculateGA(p, gx3, gx1, gx2);
- this.b = round2PayloadReceived.A;
- BigInteger[] knowledgeProofForX4s = round2PayloadReceived.KnowledgeProofForX2s;
-
- JPakeUtilities.ValidateParticipantIdsDiffer(participantId, round2PayloadReceived.ParticipantId);
- JPakeUtilities.ValidateParticipantIdsEqual(this.partnerParticipantId, round2PayloadReceived.ParticipantId);
- JPakeUtilities.ValidateGa(gB);
- JPakeUtilities.ValidateZeroKnowledgeProof(p, q, gB, b, knowledgeProofForX4s, round2PayloadReceived.ParticipantId, digest);
-
- this.state = STATE_ROUND_2_VALIDATED;
- }
-
- ///
- /// Calculates and returns the key material.
- /// A session key must be derived from this key material using a secure key derivation function (KDF).
- /// The KDF used to derive the key is handled externally (i.e. not by JPakeParticipant).
- ///
- /// The keying material will be identical for each participant if and only if
- /// each participant's password is the same. i.e. If the participants do not
- /// share the same password, then each participant will derive a different key.
- /// Therefore, if you immediately start using a key derived from
- /// the keying material, then you must handle detection of incorrect keys.
- /// If you want to handle this detection explicitly, you can optionally perform
- /// rounds 3 and 4. See JPakeParticipant for details on how to execute
- /// rounds 3 and 4.
- ///
- /// The keying material will be in the range [0, p-1] .
- ///
- /// ValidateRound2PayloadReceived(JPakeRound2Payload) must be called prior to this method.
- ///
- /// As a side effect, the internal password array is cleared, since it is no longer needed.
- ///
- /// After execution, the State state will be STATE_KEY_CALCULATED.
- ///
- /// Throws InvalidOperationException if called prior to ValidateRound2PayloadReceived(JPakeRound2Payload),
- /// or if called multiple times.
- ///
- public virtual BigInteger CalculateKeyingMaterial()
- {
- if (this.state >= STATE_KEY_CALCULATED)
- throw new InvalidOperationException("Key already calculated for " + participantId);
- if (this.state < STATE_ROUND_2_VALIDATED)
- throw new InvalidOperationException("Round 2 payload must be validated prior to creating key for " + participantId);
-
- BigInteger s = JPakeUtilities.CalculateS(password);
-
- // Clear the password array from memory, since we don't need it anymore.
- // Also set the field to null as a flag to indicate that the key has already been calculated.
- Array.Clear(password, 0, password.Length);
- this.password = null;
-
- BigInteger keyingMaterial = JPakeUtilities.CalculateKeyingMaterial(p, q, gx4, x2, s, b);
-
- // Clear the ephemeral private key fields as well.
- // Note that we're relying on the garbage collector to do its job to clean these up.
- // The old objects will hang around in memory until the garbage collector destroys them.
- //
- // If the ephemeral private keys x1 and x2 are leaked,
- // the attacker might be able to brute-force the password.
- this.x1 = null;
- this.x2 = null;
- this.b = null;
-
- // Do not clear gx* yet, since those are needed by round 3.
-
- this.state = STATE_KEY_CALCULATED;
-
- return keyingMaterial;
- }
-
- ///
- /// Creates and returns the payload to send to the other participant during round 3.
- ///
- /// See JPakeParticipant for more details on round 3.
- ///
- /// After execution, the State state} will be STATE_ROUND_3_CREATED.
- /// Throws InvalidOperationException if called prior to CalculateKeyingMaterial, or multiple
- /// times.
- ///
- /// The keying material as returned from CalculateKeyingMaterial().
- public virtual JPakeRound3Payload CreateRound3PayloadToSend(BigInteger keyingMaterial)
- {
- if (this.state >= STATE_ROUND_3_CREATED)
- throw new InvalidOperationException("Round 3 payload already created for " + this.participantId);
- if (this.state < STATE_KEY_CALCULATED)
- throw new InvalidOperationException("Keying material must be calculated prior to creating round 3 payload for " + this.participantId);
-
- BigInteger macTag = JPakeUtilities.CalculateMacTag(
- this.participantId,
- this.partnerParticipantId,
- this.gx1,
- this.gx2,
- this.gx3,
- this.gx4,
- keyingMaterial,
- this.digest);
-
- this.state = STATE_ROUND_3_CREATED;
-
- return new JPakeRound3Payload(participantId, macTag);
- }
-
- ///
- /// Validates the payload received from the other participant during round 3.
- ///
- /// See JPakeParticipant for more details on round 3.
- ///
- /// After execution, the State state will be STATE_ROUND_3_VALIDATED.
- ///
- /// Throws CryptoException if validation fails. Throws InvalidOperationException if called prior to
- /// CalculateKeyingMaterial or multiple times
- ///
- /// The round 3 payload received from the other participant.
- /// The keying material as returned from CalculateKeyingMaterial().
- public virtual void ValidateRound3PayloadReceived(JPakeRound3Payload round3PayloadReceived, BigInteger keyingMaterial)
- {
- if (this.state >= STATE_ROUND_3_VALIDATED)
- throw new InvalidOperationException("Validation already attempted for round 3 payload for " + this.participantId);
- if (this.state < STATE_KEY_CALCULATED)
- throw new InvalidOperationException("Keying material must be calculated prior to validating round 3 payload for " + this.participantId);
-
- JPakeUtilities.ValidateParticipantIdsDiffer(participantId, round3PayloadReceived.ParticipantId);
- JPakeUtilities.ValidateParticipantIdsEqual(this.partnerParticipantId, round3PayloadReceived.ParticipantId);
-
- JPakeUtilities.ValidateMacTag(
- this.participantId,
- this.partnerParticipantId,
- this.gx1,
- this.gx2,
- this.gx3,
- this.gx4,
- keyingMaterial,
- this.digest,
- round3PayloadReceived.MacTag);
-
- // Clear the rest of the fields.
- this.gx1 = null;
- this.gx2 = null;
- this.gx3 = null;
- this.gx4 = null;
-
- this.state = STATE_ROUND_3_VALIDATED;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/jpake/JPakePrimeOrderGroup.cs b/BCCrypto/src/crypto/agreement/jpake/JPakePrimeOrderGroup.cs
deleted file mode 100644
index 08ffe1a..0000000
--- a/BCCrypto/src/crypto/agreement/jpake/JPakePrimeOrderGroup.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Agreement.JPake
-{
- ///
- /// A pre-computed prime order group for use during a J-PAKE exchange.
- ///
- /// Typically a Schnorr group is used. In general, J-PAKE can use any prime order group
- /// that is suitable for public key cryptography, including elliptic curve cryptography.
- ///
- /// See JPakePrimeOrderGroups for convenient standard groups.
- ///
- /// NIST publishes
- /// many groups that can be used for the desired level of security.
- ///
- public class JPakePrimeOrderGroup
- {
- private readonly BigInteger p;
- private readonly BigInteger q;
- private readonly BigInteger g;
-
- ///
- /// Constructs a new JPakePrimeOrderGroup.
- ///
- /// In general, you should use one of the pre-approved groups from
- /// JPakePrimeOrderGroups, rather than manually constructing one.
- ///
- /// The following basic checks are performed:
- ///
- /// p-1 must be evenly divisible by q
- /// g must be in [2, p-1]
- /// g^q mod p must equal 1
- /// p must be prime (within reasonably certainty)
- /// q must be prime (within reasonably certainty)
- ///
- /// The prime checks are performed using BigInteger#isProbablePrime(int),
- /// and are therefore subject to the same probability guarantees.
- ///
- /// These checks prevent trivial mistakes.
- /// However, due to the small uncertainties if p and q are not prime,
- /// advanced attacks are not prevented.
- /// Use it at your own risk.
- ///
- /// Throws NullReferenceException if any argument is null. Throws
- /// InvalidOperationException is any of the above validations fail.
- ///
- public JPakePrimeOrderGroup(BigInteger p, BigInteger q, BigInteger g)
- : this(p, q, g, false)
- {
- // Don't skip the checks on user-specified groups.
- }
-
- ///
- /// Constructor used by the pre-approved groups in JPakePrimeOrderGroups.
- /// These pre-approved groups can avoid the expensive checks.
- /// User-specified groups should not use this constructor.
- ///
- public JPakePrimeOrderGroup(BigInteger p, BigInteger q, BigInteger g, bool skipChecks)
- {
- JPakeUtilities.ValidateNotNull(p, "p");
- JPakeUtilities.ValidateNotNull(q, "q");
- JPakeUtilities.ValidateNotNull(g, "g");
-
- if (!skipChecks)
- {
- if (!p.Subtract(JPakeUtilities.One).Mod(q).Equals(JPakeUtilities.Zero))
- throw new ArgumentException("p-1 must be evenly divisible by q");
- if (g.CompareTo(BigInteger.Two) == -1 || g.CompareTo(p.Subtract(JPakeUtilities.One)) == 1)
- throw new ArgumentException("g must be in [2, p-1]");
- if (!g.ModPow(q, p).Equals(JPakeUtilities.One))
- throw new ArgumentException("g^q mod p must equal 1");
-
- // Note these checks do not guarantee that p and q are prime.
- // We just have reasonable certainty that they are prime.
- if (!p.IsProbablePrime(20))
- throw new ArgumentException("p must be prime");
- if (!q.IsProbablePrime(20))
- throw new ArgumentException("q must be prime");
- }
-
- this.p = p;
- this.q = q;
- this.g = g;
- }
-
- public virtual BigInteger P
- {
- get { return p; }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public virtual BigInteger G
- {
- get { return g; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/jpake/JPakePrimeOrderGroups.cs b/BCCrypto/src/crypto/agreement/jpake/JPakePrimeOrderGroups.cs
deleted file mode 100644
index 192cd2b..0000000
--- a/BCCrypto/src/crypto/agreement/jpake/JPakePrimeOrderGroups.cs
+++ /dev/null
@@ -1,108 +0,0 @@
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Agreement.JPake
-{
- ///
- /// Standard pre-computed prime order groups for use by J-PAKE.
- /// (J-PAKE can use pre-computed prime order groups, same as DSA and Diffie-Hellman.)
- ///
- /// This class contains some convenient constants for use as input for
- /// constructing {@link JPAKEParticipant}s.
- ///
- /// The prime order groups below are taken from Sun's JDK JavaDoc (docs/guide/security/CryptoSpec.html#AppB),
- /// and from the prime order groups
- /// published by NIST .
- ///
- public class JPakePrimeOrderGroups
- {
- ///
- /// From Sun's JDK JavaDoc (docs/guide/security/CryptoSpec.html#AppB)
- /// 1024-bit p, 160-bit q and 1024-bit g for 80-bit security.
- ///
- public static readonly JPakePrimeOrderGroup SUN_JCE_1024 = new JPakePrimeOrderGroup(
- // p
- new BigInteger(
- "fd7f53811d75122952df4a9c2eece4e7f611b7523cef4400c31e3f80b6512669" +
- "455d402251fb593d8d58fabfc5f5ba30f6cb9b556cd7813b801d346ff26660b7" +
- "6b9950a5a49f9fe8047b1022c24fbba9d7feb7c61bf83b57e7c6a8a6150f04fb" +
- "83f6d3c51ec3023554135a169132f675f3ae2b61d72aeff22203199dd14801c7", 16),
- // q
- new BigInteger("9760508f15230bccb292b982a2eb840bf0581cf5", 16),
- // g
- new BigInteger(
- "f7e1a085d69b3ddecbbcab5c36b857b97994afbbfa3aea82f9574c0b3d078267" +
- "5159578ebad4594fe67107108180b449167123e84c281613b7cf09328cc8a6e1" +
- "3c167a8b547c8d28e0a3ae1e2bb3a675916ea37f0bfa213562f1fb627a01243b" +
- "cca4f1bea8519089a883dfe15ae59f06928b665e807b552564014c3bfecf492a", 16),
- true
- );
-
- ///
- /// From NIST.
- /// 2048-bit p, 224-bit q and 2048-bit g for 112-bit security.
- ///
- public static readonly JPakePrimeOrderGroup NIST_2048 = new JPakePrimeOrderGroup(
- // p
- new BigInteger(
- "C196BA05AC29E1F9C3C72D56DFFC6154A033F1477AC88EC37F09BE6C5BB95F51" +
- "C296DD20D1A28A067CCC4D4316A4BD1DCA55ED1066D438C35AEBAABF57E7DAE4" +
- "28782A95ECA1C143DB701FD48533A3C18F0FE23557EA7AE619ECACC7E0B51652" +
- "A8776D02A425567DED36EABD90CA33A1E8D988F0BBB92D02D1D20290113BB562" +
- "CE1FC856EEB7CDD92D33EEA6F410859B179E7E789A8F75F645FAE2E136D252BF" +
- "FAFF89528945C1ABE705A38DBC2D364AADE99BE0D0AAD82E5320121496DC65B3" +
- "930E38047294FF877831A16D5228418DE8AB275D7D75651CEFED65F78AFC3EA7" +
- "FE4D79B35F62A0402A1117599ADAC7B269A59F353CF450E6982D3B1702D9CA83", 16),
- // q
- new BigInteger("90EAF4D1AF0708B1B612FF35E0A2997EB9E9D263C9CE659528945C0D", 16),
- // g
- new BigInteger(
- "A59A749A11242C58C894E9E5A91804E8FA0AC64B56288F8D47D51B1EDC4D6544" +
- "4FECA0111D78F35FC9FDD4CB1F1B79A3BA9CBEE83A3F811012503C8117F98E50" +
- "48B089E387AF6949BF8784EBD9EF45876F2E6A5A495BE64B6E770409494B7FEE" +
- "1DBB1E4B2BC2A53D4F893D418B7159592E4FFFDF6969E91D770DAEBD0B5CB14C" +
- "00AD68EC7DC1E5745EA55C706C4A1C5C88964E34D09DEB753AD418C1AD0F4FDF" +
- "D049A955E5D78491C0B7A2F1575A008CCD727AB376DB6E695515B05BD412F5B8" +
- "C2F4C77EE10DA48ABD53F5DD498927EE7B692BBBCDA2FB23A516C5B4533D7398" +
- "0B2A3B60E384ED200AE21B40D273651AD6060C13D97FD69AA13C5611A51B9085", 16),
- true
- );
-
- ///
- /// From NIST.
- /// 3072-bit p, 256-bit q and 3072-bit g for 128-bit security.
- ///
- public static readonly JPakePrimeOrderGroup NIST_3072 = new JPakePrimeOrderGroup(
- // p
- new BigInteger(
- "90066455B5CFC38F9CAA4A48B4281F292C260FEEF01FD61037E56258A7795A1C" +
- "7AD46076982CE6BB956936C6AB4DCFE05E6784586940CA544B9B2140E1EB523F" +
- "009D20A7E7880E4E5BFA690F1B9004A27811CD9904AF70420EEFD6EA11EF7DA1" +
- "29F58835FF56B89FAA637BC9AC2EFAAB903402229F491D8D3485261CD068699B" +
- "6BA58A1DDBBEF6DB51E8FE34E8A78E542D7BA351C21EA8D8F1D29F5D5D159394" +
- "87E27F4416B0CA632C59EFD1B1EB66511A5A0FBF615B766C5862D0BD8A3FE7A0" +
- "E0DA0FB2FE1FCB19E8F9996A8EA0FCCDE538175238FC8B0EE6F29AF7F642773E" +
- "BE8CD5402415A01451A840476B2FCEB0E388D30D4B376C37FE401C2A2C2F941D" +
- "AD179C540C1C8CE030D460C4D983BE9AB0B20F69144C1AE13F9383EA1C08504F" +
- "B0BF321503EFE43488310DD8DC77EC5B8349B8BFE97C2C560EA878DE87C11E3D" +
- "597F1FEA742D73EEC7F37BE43949EF1A0D15C3F3E3FC0A8335617055AC91328E" +
- "C22B50FC15B941D3D1624CD88BC25F3E941FDDC6200689581BFEC416B4B2CB73", 16),
- // q
- new BigInteger("CFA0478A54717B08CE64805B76E5B14249A77A4838469DF7F7DC987EFCCFB11D", 16),
- // g
- new BigInteger(
- "5E5CBA992E0A680D885EB903AEA78E4A45A469103D448EDE3B7ACCC54D521E37" +
- "F84A4BDD5B06B0970CC2D2BBB715F7B82846F9A0C393914C792E6A923E2117AB" +
- "805276A975AADB5261D91673EA9AAFFEECBFA6183DFCB5D3B7332AA19275AFA1" +
- "F8EC0B60FB6F66CC23AE4870791D5982AAD1AA9485FD8F4A60126FEB2CF05DB8" +
- "A7F0F09B3397F3937F2E90B9E5B9C9B6EFEF642BC48351C46FB171B9BFA9EF17" +
- "A961CE96C7E7A7CC3D3D03DFAD1078BA21DA425198F07D2481622BCE45969D9C" +
- "4D6063D72AB7A0F08B2F49A7CC6AF335E08C4720E31476B67299E231F8BD90B3" +
- "9AC3AE3BE0C6B6CACEF8289A2E2873D58E51E029CAFBD55E6841489AB66B5B4B" +
- "9BA6E2F784660896AFF387D92844CCB8B69475496DE19DA2E58259B090489AC8" +
- "E62363CDF82CFD8EF2A427ABCD65750B506F56DDE3B988567A88126B914D7828" +
- "E2B63A6D7ED0747EC59E0E0A23CE7D8A74C1D2C2A7AFB6A29799620F00E11C33" +
- "787F7DED3B30E1A22D09F1FBDA1ABBBFBF25CAE05A13F812E34563F99410E73B", 16),
- true
- );
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/jpake/JPakeRound1Payload.cs b/BCCrypto/src/crypto/agreement/jpake/JPakeRound1Payload.cs
deleted file mode 100644
index 9e4ab7a..0000000
--- a/BCCrypto/src/crypto/agreement/jpake/JPakeRound1Payload.cs
+++ /dev/null
@@ -1,101 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Agreement.JPake
-{
- ///
- /// The payload sent/received during the first round of a J-PAKE exchange.
- ///
- /// Each JPAKEParticipant creates and sends an instance of this payload to
- /// the other. The payload to send should be created via
- /// JPAKEParticipant.CreateRound1PayloadToSend().
- ///
- /// Each participant must also validate the payload received from the other.
- /// The received payload should be validated via
- /// JPAKEParticipant.ValidateRound1PayloadReceived(JPakeRound1Payload).
- ///
- public class JPakeRound1Payload
- {
- ///
- /// The id of the JPAKEParticipant who created/sent this payload.
- ///
- private readonly string participantId;
-
- ///
- /// The value of g^x1
- ///
- private readonly BigInteger gx1;
-
- ///
- /// The value of g^x2
- ///
- private readonly BigInteger gx2;
-
- ///
- /// The zero knowledge proof for x1.
- ///
- /// This is a two element array, containing {g^v, r} for x1.
- ///
- private readonly BigInteger[] knowledgeProofForX1;
-
- ///
- /// The zero knowledge proof for x2.
- ///
- /// This is a two element array, containing {g^v, r} for x2.
- ///
- private readonly BigInteger[] knowledgeProofForX2;
-
- public JPakeRound1Payload(string participantId, BigInteger gx1, BigInteger gx2, BigInteger[] knowledgeProofForX1, BigInteger[] knowledgeProofForX2)
- {
- JPakeUtilities.ValidateNotNull(participantId, "participantId");
- JPakeUtilities.ValidateNotNull(gx1, "gx1");
- JPakeUtilities.ValidateNotNull(gx2, "gx2");
- JPakeUtilities.ValidateNotNull(knowledgeProofForX1, "knowledgeProofForX1");
- JPakeUtilities.ValidateNotNull(knowledgeProofForX2, "knowledgeProofForX2");
-
- this.participantId = participantId;
- this.gx1 = gx1;
- this.gx2 = gx2;
- this.knowledgeProofForX1 = new BigInteger[knowledgeProofForX1.Length];
- Array.Copy(knowledgeProofForX1, this.knowledgeProofForX1, knowledgeProofForX1.Length);
- this.knowledgeProofForX2 = new BigInteger[knowledgeProofForX2.Length];
- Array.Copy(knowledgeProofForX2, this.knowledgeProofForX2, knowledgeProofForX2.Length);
- }
-
- public virtual string ParticipantId
- {
- get { return participantId; }
- }
-
- public virtual BigInteger Gx1
- {
- get { return gx1; }
- }
-
- public virtual BigInteger Gx2
- {
- get { return gx2; }
- }
-
- public virtual BigInteger[] KnowledgeProofForX1
- {
- get
- {
- BigInteger[] kp = new BigInteger[knowledgeProofForX1.Length];
- Array.Copy(knowledgeProofForX1, kp, knowledgeProofForX1.Length);
- return kp;
- }
- }
-
- public virtual BigInteger[] KnowledgeProofForX2
- {
- get
- {
- BigInteger[] kp = new BigInteger[knowledgeProofForX2.Length];
- Array.Copy(knowledgeProofForX2, kp, knowledgeProofForX2.Length);
- return kp;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/jpake/JPakeRound2Payload.cs b/BCCrypto/src/crypto/agreement/jpake/JPakeRound2Payload.cs
deleted file mode 100644
index 47962cb..0000000
--- a/BCCrypto/src/crypto/agreement/jpake/JPakeRound2Payload.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Agreement.JPake
-{
- ///
- /// The payload sent/received during the second round of a J-PAKE exchange.
- ///
- /// Each JPAKEParticipant creates and sends an instance
- /// of this payload to the other JPAKEParticipant.
- /// The payload to send should be created via
- /// JPAKEParticipant#createRound2PayloadToSend()
- ///
- /// Each JPAKEParticipant must also validate the payload
- /// received from the other JPAKEParticipant.
- /// The received payload should be validated via
- /// JPAKEParticipant#validateRound2PayloadReceived(JPakeRound2Payload)
- ///
- public class JPakeRound2Payload
- {
- ///
- /// The id of the JPAKEParticipant who created/sent this payload.
- ///
- private readonly string participantId;
-
- ///
- /// The value of A, as computed during round 2.
- ///
- private readonly BigInteger a;
-
- ///
- /// The zero knowledge proof for x2 * s.
- ///
- /// This is a two element array, containing {g^v, r} for x2 * s.
- ///
- private readonly BigInteger[] knowledgeProofForX2s;
-
- public JPakeRound2Payload(string participantId, BigInteger a, BigInteger[] knowledgeProofForX2s)
- {
- JPakeUtilities.ValidateNotNull(participantId, "participantId");
- JPakeUtilities.ValidateNotNull(a, "a");
- JPakeUtilities.ValidateNotNull(knowledgeProofForX2s, "knowledgeProofForX2s");
-
- this.participantId = participantId;
- this.a = a;
- this.knowledgeProofForX2s = new BigInteger[knowledgeProofForX2s.Length];
- knowledgeProofForX2s.CopyTo(this.knowledgeProofForX2s, 0);
- }
-
- public virtual string ParticipantId
- {
- get { return participantId; }
- }
-
- public virtual BigInteger A
- {
- get { return a; }
- }
-
- public virtual BigInteger[] KnowledgeProofForX2s
- {
- get
- {
- BigInteger[] kp = new BigInteger[knowledgeProofForX2s.Length];
- Array.Copy(knowledgeProofForX2s, kp, knowledgeProofForX2s.Length);
- return kp;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/jpake/JPakeRound3Payload.cs b/BCCrypto/src/crypto/agreement/jpake/JPakeRound3Payload.cs
deleted file mode 100644
index 767702f..0000000
--- a/BCCrypto/src/crypto/agreement/jpake/JPakeRound3Payload.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Agreement.JPake
-{
- ///
- /// The payload sent/received during the optional third round of a J-PAKE exchange,
- /// which is for explicit key confirmation.
- ///
- /// Each JPAKEParticipant creates and sends an instance
- /// of this payload to the other JPAKEParticipant.
- /// The payload to send should be created via
- /// JPAKEParticipant#createRound3PayloadToSend(BigInteger)
- ///
- /// Eeach JPAKEParticipant must also validate the payload
- /// received from the other JPAKEParticipant.
- /// The received payload should be validated via
- /// JPAKEParticipant#validateRound3PayloadReceived(JPakeRound3Payload, BigInteger)
- ///
- public class JPakeRound3Payload
- {
- ///
- /// The id of the {@link JPAKEParticipant} who created/sent this payload.
- ///
- private readonly string participantId;
-
- ///
- /// The value of MacTag, as computed by round 3.
- ///
- /// See JPAKEUtil#calculateMacTag(string, string, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, org.bouncycastle.crypto.Digest)
- ///
- private readonly BigInteger macTag;
-
- public JPakeRound3Payload(string participantId, BigInteger magTag)
- {
- this.participantId = participantId;
- this.macTag = magTag;
- }
-
- public virtual string ParticipantId
- {
- get { return participantId; }
- }
-
- public virtual BigInteger MacTag
- {
- get { return macTag; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/jpake/JPakeUtilities.cs b/BCCrypto/src/crypto/agreement/jpake/JPakeUtilities.cs
deleted file mode 100644
index b23518a..0000000
--- a/BCCrypto/src/crypto/agreement/jpake/JPakeUtilities.cs
+++ /dev/null
@@ -1,390 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Agreement.JPake
-{
- ///
- /// Primitives needed for a J-PAKE exchange.
- ///
- /// The recommended way to perform a J-PAKE exchange is by using
- /// two JPAKEParticipants. Internally, those participants
- /// call these primitive operations in JPakeUtilities.
- ///
- /// The primitives, however, can be used without a JPAKEParticipant if needed.
- ///
- public abstract class JPakeUtilities
- {
- public static readonly BigInteger Zero = BigInteger.Zero;
- public static readonly BigInteger One = BigInteger.One;
-
- ///
- /// Return a value that can be used as x1 or x3 during round 1.
- /// The returned value is a random value in the range [0, q-1].
- ///
- public static BigInteger GenerateX1(BigInteger q, SecureRandom random)
- {
- BigInteger min = Zero;
- BigInteger max = q.Subtract(One);
- return BigIntegers.CreateRandomInRange(min, max, random);
- }
-
- ///
- /// Return a value that can be used as x2 or x4 during round 1.
- /// The returned value is a random value in the range [1, q-1].
- ///
- public static BigInteger GenerateX2(BigInteger q, SecureRandom random)
- {
- BigInteger min = One;
- BigInteger max = q.Subtract(One);
- return BigIntegers.CreateRandomInRange(min, max, random);
- }
-
- ///
- /// Converts the given password to a BigInteger
- /// for use in arithmetic calculations.
- ///
- public static BigInteger CalculateS(char[] password)
- {
- return new BigInteger(Encoding.UTF8.GetBytes(password));
- }
-
- ///
- /// Calculate g^x mod p as done in round 1.
- ///
- public static BigInteger CalculateGx(BigInteger p, BigInteger g, BigInteger x)
- {
- return g.ModPow(x, p);
- }
-
- ///
- /// Calculate ga as done in round 2.
- ///
- public static BigInteger CalculateGA(BigInteger p, BigInteger gx1, BigInteger gx3, BigInteger gx4)
- {
- // ga = g^(x1+x3+x4) = g^x1 * g^x3 * g^x4
- return gx1.Multiply(gx3).Multiply(gx4).Mod(p);
- }
-
- ///
- /// Calculate x2 * s as done in round 2.
- ///
- public static BigInteger CalculateX2s(BigInteger q, BigInteger x2, BigInteger s)
- {
- return x2.Multiply(s).Mod(q);
- }
-
- ///
- /// Calculate A as done in round 2.
- ///
- public static BigInteger CalculateA(BigInteger p, BigInteger q, BigInteger gA, BigInteger x2s)
- {
- // A = ga^(x*s)
- return gA.ModPow(x2s, p);
- }
-
- ///
- /// Calculate a zero knowledge proof of x using Schnorr's signature.
- /// The returned array has two elements {g^v, r = v-x*h} for x.
- ///
- public static BigInteger[] CalculateZeroKnowledgeProof(BigInteger p, BigInteger q, BigInteger g,
- BigInteger gx, BigInteger x, string participantId, IDigest digest, SecureRandom random)
- {
- /* Generate a random v, and compute g^v */
- BigInteger vMin = Zero;
- BigInteger vMax = q.Subtract(One);
- BigInteger v = BigIntegers.CreateRandomInRange(vMin, vMax, random);
-
- BigInteger gv = g.ModPow(v, p);
- BigInteger h = CalculateHashForZeroKnowledgeProof(g, gv, gx, participantId, digest); // h
-
- return new BigInteger[]
- {
- gv,
- v.Subtract(x.Multiply(h)).Mod(q) // r = v-x*h
- };
- }
-
- private static BigInteger CalculateHashForZeroKnowledgeProof(BigInteger g, BigInteger gr, BigInteger gx,
- string participantId, IDigest digest)
- {
- digest.Reset();
-
- UpdateDigestIncludingSize(digest, g);
-
- UpdateDigestIncludingSize(digest, gr);
-
- UpdateDigestIncludingSize(digest, gx);
-
- UpdateDigestIncludingSize(digest, participantId);
-
- byte[] output = DigestUtilities.DoFinal(digest);
-
- return new BigInteger(output);
- }
-
- ///
- /// Validates that g^x4 is not 1.
- /// throws CryptoException if g^x4 is 1
- ///
- public static void ValidateGx4(BigInteger gx4)
- {
- if (gx4.Equals(One))
- throw new CryptoException("g^x validation failed. g^x should not be 1.");
- }
-
- ///
- /// Validates that ga is not 1.
- ///
- /// As described by Feng Hao...
- /// Alice could simply check ga != 1 to ensure it is a generator.
- /// In fact, as we will explain in Section 3, (x1 + x3 + x4 ) is random over Zq even in the face of active attacks.
- /// Hence, the probability for ga = 1 is extremely small - on the order of 2^160 for 160-bit q.
- ///
- /// throws CryptoException if ga is 1
- ///
- public static void ValidateGa(BigInteger ga)
- {
- if (ga.Equals(One))
- throw new CryptoException("ga is equal to 1. It should not be. The chances of this happening are on the order of 2^160 for a 160-bit q. Try again.");
- }
-
- ///
- /// Validates the zero knowledge proof (generated by
- /// calculateZeroKnowledgeProof(BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, string, Digest, SecureRandom)
- /// is correct.
- ///
- /// throws CryptoException if the zero knowledge proof is not correct
- ///
- public static void ValidateZeroKnowledgeProof(BigInteger p, BigInteger q, BigInteger g,
- BigInteger gx, BigInteger[] zeroKnowledgeProof, string participantId, IDigest digest)
- {
- /* sig={g^v,r} */
- BigInteger gv = zeroKnowledgeProof[0];
- BigInteger r = zeroKnowledgeProof[1];
-
- BigInteger h = CalculateHashForZeroKnowledgeProof(g, gv, gx, participantId, digest);
- if (!(gx.CompareTo(Zero) == 1 && // g^x > 0
- gx.CompareTo(p) == -1 && // g^x < p
- gx.ModPow(q, p).CompareTo(One) == 0 && // g^x^q mod q = 1
- /*
- * Below, I took a straightforward way to compute g^r * g^x^h,
- * which needs 2 exp. Using a simultaneous computation technique
- * would only need 1 exp.
- */
- g.ModPow(r, p).Multiply(gx.ModPow(h, p)).Mod(p).CompareTo(gv) == 0)) // g^v=g^r * g^x^h
- {
- throw new CryptoException("Zero-knowledge proof validation failed");
- }
- }
-
- ///
- /// Calculates the keying material, which can be done after round 2 has completed.
- /// A session key must be derived from this key material using a secure key derivation function (KDF).
- /// The KDF used to derive the key is handled externally (i.e. not by JPAKEParticipant).
- ///
- /// KeyingMaterial = (B/g^{x2*x4*s})^x2
- ///
- public static BigInteger CalculateKeyingMaterial(BigInteger p, BigInteger q,
- BigInteger gx4, BigInteger x2, BigInteger s, BigInteger B)
- {
- return gx4.ModPow(x2.Multiply(s).Negate().Mod(q), p).Multiply(B).ModPow(x2, p);
- }
-
- ///
- /// Validates that the given participant ids are not equal.
- /// (For the J-PAKE exchange, each participant must use a unique id.)
- ///
- /// Throws CryptoException if the participantId strings are equal.
- ///
- public static void ValidateParticipantIdsDiffer(string participantId1, string participantId2)
- {
- if (participantId1.Equals(participantId2))
- {
- throw new CryptoException(
- "Both participants are using the same participantId ("
- + participantId1
- + "). This is not allowed. "
- + "Each participant must use a unique participantId.");
- }
- }
-
- ///
- /// Validates that the given participant ids are equal.
- /// This is used to ensure that the payloads received from
- /// each round all come from the same participant.
- ///
- public static void ValidateParticipantIdsEqual(string expectedParticipantId, string actualParticipantId)
- {
- if (!expectedParticipantId.Equals(actualParticipantId))
- {
- throw new CryptoException(
- "Received payload from incorrect partner ("
- + actualParticipantId
- + "). Expected to receive payload from "
- + expectedParticipantId
- + ".");
- }
- }
-
- ///
- /// Validates that the given object is not null.
- /// throws NullReferenceException if the object is null.
- ///
- /// object in question
- /// name of the object (to be used in exception message)
- public static void ValidateNotNull(object obj, string description)
- {
- if (obj == null)
- throw new ArgumentNullException(description);
- }
-
- ///
- /// Calculates the MacTag (to be used for key confirmation), as defined by
- /// NIST SP 800-56A Revision 1 ,
- /// Section 8.2 Unilateral Key Confirmation for Key Agreement Schemes.
- ///
- /// MacTag = HMAC(MacKey, MacLen, MacData)
- /// MacKey = H(K || "JPAKE_KC")
- /// MacData = "KC_1_U" || participantId || partnerParticipantId || gx1 || gx2 || gx3 || gx4
- ///
- /// Note that both participants use "KC_1_U" because the sender of the round 3 message
- /// is always the initiator for key confirmation.
- ///
- /// HMAC = {@link HMac} used with the given {@link Digest}
- /// H = The given {@link Digest}
- /// MacLen = length of MacTag
- ///
- public static BigInteger CalculateMacTag(string participantId, string partnerParticipantId,
- BigInteger gx1, BigInteger gx2, BigInteger gx3, BigInteger gx4, BigInteger keyingMaterial, IDigest digest)
- {
- byte[] macKey = CalculateMacKey(keyingMaterial, digest);
-
- HMac mac = new HMac(digest);
- mac.Init(new KeyParameter(macKey));
- Arrays.Fill(macKey, (byte)0);
-
- /*
- * MacData = "KC_1_U" || participantId_Alice || participantId_Bob || gx1 || gx2 || gx3 || gx4.
- */
- UpdateMac(mac, "KC_1_U");
- UpdateMac(mac, participantId);
- UpdateMac(mac, partnerParticipantId);
- UpdateMac(mac, gx1);
- UpdateMac(mac, gx2);
- UpdateMac(mac, gx3);
- UpdateMac(mac, gx4);
-
- byte[] macOutput = MacUtilities.DoFinal(mac);
-
- return new BigInteger(macOutput);
- }
-
- ///
- /// Calculates the MacKey (i.e. the key to use when calculating the MagTag for key confirmation).
- ///
- /// MacKey = H(K || "JPAKE_KC")
- ///
- private static byte[] CalculateMacKey(BigInteger keyingMaterial, IDigest digest)
- {
- digest.Reset();
-
- UpdateDigest(digest, keyingMaterial);
- /*
- * This constant is used to ensure that the macKey is NOT the same as the derived key.
- */
- UpdateDigest(digest, "JPAKE_KC");
-
- return DigestUtilities.DoFinal(digest);
- }
-
- ///
- /// Validates the MacTag received from the partner participant.
- ///
- /// throws CryptoException if the participantId strings are equal.
- ///
- public static void ValidateMacTag(string participantId, string partnerParticipantId,
- BigInteger gx1, BigInteger gx2, BigInteger gx3, BigInteger gx4,
- BigInteger keyingMaterial, IDigest digest, BigInteger partnerMacTag)
- {
- /*
- * Calculate the expected MacTag using the parameters as the partner
- * would have used when the partner called calculateMacTag.
- *
- * i.e. basically all the parameters are reversed.
- * participantId <-> partnerParticipantId
- * x1 <-> x3
- * x2 <-> x4
- */
- BigInteger expectedMacTag = CalculateMacTag(partnerParticipantId, participantId, gx3, gx4, gx1, gx2, keyingMaterial, digest);
-
- if (!expectedMacTag.Equals(partnerMacTag))
- {
- throw new CryptoException(
- "Partner MacTag validation failed. "
- + "Therefore, the password, MAC, or digest algorithm of each participant does not match.");
- }
- }
-
- private static void UpdateDigest(IDigest digest, BigInteger bigInteger)
- {
- UpdateDigest(digest, BigIntegers.AsUnsignedByteArray(bigInteger));
- }
-
- private static void UpdateDigest(IDigest digest, string str)
- {
- UpdateDigest(digest, Encoding.UTF8.GetBytes(str));
- }
-
- private static void UpdateDigest(IDigest digest, byte[] bytes)
- {
- digest.BlockUpdate(bytes, 0, bytes.Length);
- Arrays.Fill(bytes, (byte)0);
- }
-
- private static void UpdateDigestIncludingSize(IDigest digest, BigInteger bigInteger)
- {
- UpdateDigestIncludingSize(digest, BigIntegers.AsUnsignedByteArray(bigInteger));
- }
-
- private static void UpdateDigestIncludingSize(IDigest digest, string str)
- {
- UpdateDigestIncludingSize(digest, Encoding.UTF8.GetBytes(str));
- }
-
- private static void UpdateDigestIncludingSize(IDigest digest, byte[] bytes)
- {
- digest.BlockUpdate(IntToByteArray(bytes.Length), 0, 4);
- digest.BlockUpdate(bytes, 0, bytes.Length);
- Arrays.Fill(bytes, (byte)0);
- }
-
- private static void UpdateMac(IMac mac, BigInteger bigInteger)
- {
- UpdateMac(mac, BigIntegers.AsUnsignedByteArray(bigInteger));
- }
-
- private static void UpdateMac(IMac mac, string str)
- {
- UpdateMac(mac, Encoding.UTF8.GetBytes(str));
- }
-
- private static void UpdateMac(IMac mac, byte[] bytes)
- {
- mac.BlockUpdate(bytes, 0, bytes.Length);
- Arrays.Fill(bytes, (byte)0);
- }
-
- private static byte[] IntToByteArray(int value)
- {
- return Pack.UInt32_To_BE((uint)value);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/kdf/DHKdfParameters.cs b/BCCrypto/src/crypto/agreement/kdf/DHKdfParameters.cs
deleted file mode 100644
index f6c9e60..0000000
--- a/BCCrypto/src/crypto/agreement/kdf/DHKdfParameters.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-
-namespace Org.BouncyCastle.Crypto.Agreement.Kdf
-{
- public class DHKdfParameters
- : IDerivationParameters
- {
- private readonly DerObjectIdentifier algorithm;
- private readonly int keySize;
- private readonly byte[] z;
- private readonly byte[] extraInfo;
-
- public DHKdfParameters(
- DerObjectIdentifier algorithm,
- int keySize,
- byte[] z)
- : this(algorithm, keySize, z, null)
- {
- }
-
- public DHKdfParameters(
- DerObjectIdentifier algorithm,
- int keySize,
- byte[] z,
- byte[] extraInfo)
- {
- this.algorithm = algorithm;
- this.keySize = keySize;
- this.z = z; // TODO Clone?
- this.extraInfo = extraInfo;
- }
-
- public DerObjectIdentifier Algorithm
- {
- get { return algorithm; }
- }
-
- public int KeySize
- {
- get { return keySize; }
- }
-
- public byte[] GetZ()
- {
- // TODO Clone?
- return z;
- }
-
- public byte[] GetExtraInfo()
- {
- // TODO Clone?
- return extraInfo;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/kdf/DHKekGenerator.cs b/BCCrypto/src/crypto/agreement/kdf/DHKekGenerator.cs
deleted file mode 100644
index 259e21e..0000000
--- a/BCCrypto/src/crypto/agreement/kdf/DHKekGenerator.cs
+++ /dev/null
@@ -1,112 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Agreement.Kdf
-{
- /**
- * RFC 2631 Diffie-hellman KEK derivation function.
- */
- public class DHKekGenerator
- : IDerivationFunction
- {
- private readonly IDigest digest;
-
- private DerObjectIdentifier algorithm;
- private int keySize;
- private byte[] z;
- private byte[] partyAInfo;
-
- public DHKekGenerator(IDigest digest)
- {
- this.digest = digest;
- }
-
- public virtual void Init(IDerivationParameters param)
- {
- DHKdfParameters parameters = (DHKdfParameters)param;
-
- this.algorithm = parameters.Algorithm;
- this.keySize = parameters.KeySize;
- this.z = parameters.GetZ(); // TODO Clone?
- this.partyAInfo = parameters.GetExtraInfo(); // TODO Clone?
- }
-
- public virtual IDigest Digest
- {
- get { return digest; }
- }
-
- public virtual int GenerateBytes(byte[] outBytes, int outOff, int len)
- {
- if ((outBytes.Length - len) < outOff)
- {
- throw new DataLengthException("output buffer too small");
- }
-
- long oBytes = len;
- int outLen = digest.GetDigestSize();
-
- //
- // this is at odds with the standard implementation, the
- // maximum value should be hBits * (2^32 - 1) where hBits
- // is the digest output size in bits. We can't have an
- // array with a long index at the moment...
- //
- if (oBytes > ((2L << 32) - 1))
- {
- throw new ArgumentException("Output length too large");
- }
-
- int cThreshold = (int)((oBytes + outLen - 1) / outLen);
-
- byte[] dig = new byte[digest.GetDigestSize()];
-
- uint counter = 1;
-
- for (int i = 0; i < cThreshold; i++)
- {
- digest.BlockUpdate(z, 0, z.Length);
-
- // KeySpecificInfo
- DerSequence keyInfo = new DerSequence(
- algorithm,
- new DerOctetString(Pack.UInt32_To_BE(counter)));
-
- // OtherInfo
- Asn1EncodableVector v1 = new Asn1EncodableVector(keyInfo);
-
- if (partyAInfo != null)
- {
- v1.Add(new DerTaggedObject(true, 0, new DerOctetString(partyAInfo)));
- }
-
- v1.Add(new DerTaggedObject(true, 2, new DerOctetString(Pack.UInt32_To_BE((uint)keySize))));
-
- byte[] other = new DerSequence(v1).GetDerEncoded();
-
- digest.BlockUpdate(other, 0, other.Length);
-
- digest.DoFinal(dig, 0);
-
- if (len > outLen)
- {
- Array.Copy(dig, 0, outBytes, outOff, outLen);
- outOff += outLen;
- len -= outLen;
- }
- else
- {
- Array.Copy(dig, 0, outBytes, outOff, len);
- }
-
- counter++;
- }
-
- digest.Reset();
-
- return (int)oBytes;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/kdf/ECDHKekGenerator.cs b/BCCrypto/src/crypto/agreement/kdf/ECDHKekGenerator.cs
deleted file mode 100644
index 7446457..0000000
--- a/BCCrypto/src/crypto/agreement/kdf/ECDHKekGenerator.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Agreement.Kdf
-{
- /**
- * X9.63 based key derivation function for ECDH CMS.
- */
- public class ECDHKekGenerator
- : IDerivationFunction
- {
- private readonly IDerivationFunction kdf;
-
- private DerObjectIdentifier algorithm;
- private int keySize;
- private byte[] z;
-
- public ECDHKekGenerator(IDigest digest)
- {
- this.kdf = new Kdf2BytesGenerator(digest);
- }
-
- public virtual void Init(IDerivationParameters param)
- {
- DHKdfParameters parameters = (DHKdfParameters)param;
-
- this.algorithm = parameters.Algorithm;
- this.keySize = parameters.KeySize;
- this.z = parameters.GetZ(); // TODO Clone?
- }
-
- public virtual IDigest Digest
- {
- get { return kdf.Digest; }
- }
-
- public virtual int GenerateBytes(byte[] outBytes, int outOff, int len)
- {
- // TODO Create an ASN.1 class for this (RFC3278)
- // ECC-CMS-SharedInfo
- DerSequence s = new DerSequence(
- new AlgorithmIdentifier(algorithm, DerNull.Instance),
- new DerTaggedObject(true, 2, new DerOctetString(Pack.UInt32_To_BE((uint)keySize))));
-
- kdf.Init(new KdfParameters(z, s.GetDerEncoded()));
-
- return kdf.GenerateBytes(outBytes, outOff, len);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/srp/SRP6Client.cs b/BCCrypto/src/crypto/agreement/srp/SRP6Client.cs
deleted file mode 100644
index f075d7a..0000000
--- a/BCCrypto/src/crypto/agreement/srp/SRP6Client.cs
+++ /dev/null
@@ -1,164 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Agreement.Srp
-{
- /**
- * Implements the client side SRP-6a protocol. Note that this class is stateful, and therefore NOT threadsafe.
- * This implementation of SRP is based on the optimized message sequence put forth by Thomas Wu in the paper
- * "SRP-6: Improvements and Refinements to the Secure Remote Password Protocol, 2002"
- */
- public class Srp6Client
- {
- protected BigInteger N;
- protected BigInteger g;
-
- protected BigInteger privA;
- protected BigInteger pubA;
-
- protected BigInteger B;
-
- protected BigInteger x;
- protected BigInteger u;
- protected BigInteger S;
-
- protected BigInteger M1;
- protected BigInteger M2;
- protected BigInteger Key;
-
- protected IDigest digest;
- protected SecureRandom random;
-
- public Srp6Client()
- {
- }
-
- /**
- * Initialises the client to begin new authentication attempt
- * @param N The safe prime associated with the client's verifier
- * @param g The group parameter associated with the client's verifier
- * @param digest The digest algorithm associated with the client's verifier
- * @param random For key generation
- */
- public virtual void Init(BigInteger N, BigInteger g, IDigest digest, SecureRandom random)
- {
- this.N = N;
- this.g = g;
- this.digest = digest;
- this.random = random;
- }
-
- public virtual void Init(Srp6GroupParameters group, IDigest digest, SecureRandom random)
- {
- Init(group.N, group.G, digest, random);
- }
-
- /**
- * Generates client's credentials given the client's salt, identity and password
- * @param salt The salt used in the client's verifier.
- * @param identity The user's identity (eg. username)
- * @param password The user's password
- * @return Client's public value to send to server
- */
- public virtual BigInteger GenerateClientCredentials(byte[] salt, byte[] identity, byte[] password)
- {
- this.x = Srp6Utilities.CalculateX(digest, N, salt, identity, password);
- this.privA = SelectPrivateValue();
- this.pubA = g.ModPow(privA, N);
-
- return pubA;
- }
-
- /**
- * Generates client's verification message given the server's credentials
- * @param serverB The server's credentials
- * @return Client's verification message for the server
- * @throws CryptoException If server's credentials are invalid
- */
- public virtual BigInteger CalculateSecret(BigInteger serverB)
- {
- this.B = Srp6Utilities.ValidatePublicValue(N, serverB);
- this.u = Srp6Utilities.CalculateU(digest, N, pubA, B);
- this.S = CalculateS();
-
- return S;
- }
-
- protected virtual BigInteger SelectPrivateValue()
- {
- return Srp6Utilities.GeneratePrivateValue(digest, N, g, random);
- }
-
- private BigInteger CalculateS()
- {
- BigInteger k = Srp6Utilities.CalculateK(digest, N, g);
- BigInteger exp = u.Multiply(x).Add(privA);
- BigInteger tmp = g.ModPow(x, N).Multiply(k).Mod(N);
- return B.Subtract(tmp).Mod(N).ModPow(exp, N);
- }
-
- /**
- * Computes the client evidence message M1 using the previously received values.
- * To be called after calculating the secret S.
- * @return M1: the client side generated evidence message
- * @throws CryptoException
- */
- public virtual BigInteger CalculateClientEvidenceMessage()
- {
- // Verify pre-requirements
- if (this.pubA == null || this.B == null || this.S == null)
- {
- throw new CryptoException("Impossible to compute M1: " +
- "some data are missing from the previous operations (A,B,S)");
- }
- // compute the client evidence message 'M1'
- this.M1 = Srp6Utilities.CalculateM1(digest, N, pubA, B, S);
- return M1;
- }
-
- /** Authenticates the server evidence message M2 received and saves it only if correct.
- * @param M2: the server side generated evidence message
- * @return A boolean indicating if the server message M2 was the expected one.
- * @throws CryptoException
- */
- public virtual bool VerifyServerEvidenceMessage(BigInteger serverM2)
- {
- // Verify pre-requirements
- if (this.pubA == null || this.M1 == null || this.S == null)
- {
- throw new CryptoException("Impossible to compute and verify M2: " +
- "some data are missing from the previous operations (A,M1,S)");
- }
-
- // Compute the own server evidence message 'M2'
- BigInteger computedM2 = Srp6Utilities.CalculateM2(digest, N, pubA, M1, S);
- if (computedM2.Equals(serverM2))
- {
- this.M2 = serverM2;
- return true;
- }
- return false;
- }
-
- /**
- * Computes the final session key as a result of the SRP successful mutual authentication
- * To be called after verifying the server evidence message M2.
- * @return Key: the mutually authenticated symmetric session key
- * @throws CryptoException
- */
- public virtual BigInteger CalculateSessionKey()
- {
- // Verify pre-requirements (here we enforce a previous calculation of M1 and M2)
- if (this.S == null || this.M1 == null || this.M2 == null)
- {
- throw new CryptoException("Impossible to compute Key: " +
- "some data are missing from the previous operations (S,M1,M2)");
- }
- this.Key = Srp6Utilities.CalculateKey(digest, N, S);
- return Key;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/srp/SRP6Server.cs b/BCCrypto/src/crypto/agreement/srp/SRP6Server.cs
deleted file mode 100644
index fd0c9f1..0000000
--- a/BCCrypto/src/crypto/agreement/srp/SRP6Server.cs
+++ /dev/null
@@ -1,163 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Agreement.Srp
-{
- /**
- * Implements the server side SRP-6a protocol. Note that this class is stateful, and therefore NOT threadsafe.
- * This implementation of SRP is based on the optimized message sequence put forth by Thomas Wu in the paper
- * "SRP-6: Improvements and Refinements to the Secure Remote Password Protocol, 2002"
- */
- public class Srp6Server
- {
- protected BigInteger N;
- protected BigInteger g;
- protected BigInteger v;
-
- protected SecureRandom random;
- protected IDigest digest;
-
- protected BigInteger A;
-
- protected BigInteger privB;
- protected BigInteger pubB;
-
- protected BigInteger u;
- protected BigInteger S;
- protected BigInteger M1;
- protected BigInteger M2;
- protected BigInteger Key;
-
- public Srp6Server()
- {
- }
-
- /**
- * Initialises the server to accept a new client authentication attempt
- * @param N The safe prime associated with the client's verifier
- * @param g The group parameter associated with the client's verifier
- * @param v The client's verifier
- * @param digest The digest algorithm associated with the client's verifier
- * @param random For key generation
- */
- public virtual void Init(BigInteger N, BigInteger g, BigInteger v, IDigest digest, SecureRandom random)
- {
- this.N = N;
- this.g = g;
- this.v = v;
-
- this.random = random;
- this.digest = digest;
- }
-
- public virtual void Init(Srp6GroupParameters group, BigInteger v, IDigest digest, SecureRandom random)
- {
- Init(group.N, group.G, v, digest, random);
- }
-
- /**
- * Generates the server's credentials that are to be sent to the client.
- * @return The server's public value to the client
- */
- public virtual BigInteger GenerateServerCredentials()
- {
- BigInteger k = Srp6Utilities.CalculateK(digest, N, g);
- this.privB = SelectPrivateValue();
- this.pubB = k.Multiply(v).Mod(N).Add(g.ModPow(privB, N)).Mod(N);
-
- return pubB;
- }
-
- /**
- * Processes the client's credentials. If valid the shared secret is generated and returned.
- * @param clientA The client's credentials
- * @return A shared secret BigInteger
- * @throws CryptoException If client's credentials are invalid
- */
- public virtual BigInteger CalculateSecret(BigInteger clientA)
- {
- this.A = Srp6Utilities.ValidatePublicValue(N, clientA);
- this.u = Srp6Utilities.CalculateU(digest, N, A, pubB);
- this.S = CalculateS();
-
- return S;
- }
-
- protected virtual BigInteger SelectPrivateValue()
- {
- return Srp6Utilities.GeneratePrivateValue(digest, N, g, random);
- }
-
- private BigInteger CalculateS()
- {
- return v.ModPow(u, N).Multiply(A).Mod(N).ModPow(privB, N);
- }
-
- /**
- * Authenticates the received client evidence message M1 and saves it only if correct.
- * To be called after calculating the secret S.
- * @param M1: the client side generated evidence message
- * @return A boolean indicating if the client message M1 was the expected one.
- * @throws CryptoException
- */
- public virtual bool VerifyClientEvidenceMessage(BigInteger clientM1)
- {
- // Verify pre-requirements
- if (this.A == null || this.pubB == null || this.S == null)
- {
- throw new CryptoException("Impossible to compute and verify M1: " +
- "some data are missing from the previous operations (A,B,S)");
- }
-
- // Compute the own client evidence message 'M1'
- BigInteger computedM1 = Srp6Utilities.CalculateM1(digest, N, A, pubB, S);
- if (computedM1.Equals(clientM1))
- {
- this.M1 = clientM1;
- return true;
- }
- return false;
- }
-
- /**
- * Computes the server evidence message M2 using the previously verified values.
- * To be called after successfully verifying the client evidence message M1.
- * @return M2: the server side generated evidence message
- * @throws CryptoException
- */
- public virtual BigInteger CalculateServerEvidenceMessage()
- {
- // Verify pre-requirements
- if (this.A == null || this.M1 == null || this.S == null)
- {
- throw new CryptoException("Impossible to compute M2: " +
- "some data are missing from the previous operations (A,M1,S)");
- }
-
- // Compute the server evidence message 'M2'
- this.M2 = Srp6Utilities.CalculateM2(digest, N, A, M1, S);
- return M2;
- }
-
- /**
- * Computes the final session key as a result of the SRP successful mutual authentication
- * To be called after calculating the server evidence message M2.
- * @return Key: the mutual authenticated symmetric session key
- * @throws CryptoException
- */
- public virtual BigInteger CalculateSessionKey()
- {
- // Verify pre-requirements
- if (this.S == null || this.M1 == null || this.M2 == null)
- {
- throw new CryptoException("Impossible to compute Key: " +
- "some data are missing from the previous operations (S,M1,M2)");
- }
- this.Key = Srp6Utilities.CalculateKey(digest, N, S);
- return Key;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/srp/SRP6StandardGroups.cs b/BCCrypto/src/crypto/agreement/srp/SRP6StandardGroups.cs
deleted file mode 100644
index 36f4aba..0000000
--- a/BCCrypto/src/crypto/agreement/srp/SRP6StandardGroups.cs
+++ /dev/null
@@ -1,159 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Crypto.Agreement.Srp
-{
- public class Srp6StandardGroups
- {
- private static BigInteger FromHex(string hex)
- {
- return new BigInteger(1, Hex.Decode(hex));
- }
-
- private static Srp6GroupParameters FromNG(string hexN, string hexG)
- {
- return new Srp6GroupParameters(FromHex(hexN), FromHex(hexG));
- }
-
- /*
- * RFC 5054
- */
- private const string rfc5054_1024_N = "EEAF0AB9ADB38DD69C33F80AFA8FC5E86072618775FF3C0B9EA2314C"
- + "9C256576D674DF7496EA81D3383B4813D692C6E0E0D5D8E250B98BE4"
- + "8E495C1D6089DAD15DC7D7B46154D6B6CE8EF4AD69B15D4982559B29"
- + "7BCF1885C529F566660E57EC68EDBC3C05726CC02FD4CBF4976EAA9A" + "FD5138FE8376435B9FC61D2FC0EB06E3";
- private const string rfc5054_1024_g = "02";
- public static readonly Srp6GroupParameters rfc5054_1024 = FromNG(rfc5054_1024_N, rfc5054_1024_g);
-
- private const string rfc5054_1536_N = "9DEF3CAFB939277AB1F12A8617A47BBBDBA51DF499AC4C80BEEEA961"
- + "4B19CC4D5F4F5F556E27CBDE51C6A94BE4607A291558903BA0D0F843"
- + "80B655BB9A22E8DCDF028A7CEC67F0D08134B1C8B97989149B609E0B"
- + "E3BAB63D47548381DBC5B1FC764E3F4B53DD9DA1158BFD3E2B9C8CF5"
- + "6EDF019539349627DB2FD53D24B7C48665772E437D6C7F8CE442734A"
- + "F7CCB7AE837C264AE3A9BEB87F8A2FE9B8B5292E5A021FFF5E91479E"
- + "8CE7A28C2442C6F315180F93499A234DCF76E3FED135F9BB";
- private const string rfc5054_1536_g = "02";
- public static readonly Srp6GroupParameters rfc5054_1536 = FromNG(rfc5054_1536_N, rfc5054_1536_g);
-
- private const string rfc5054_2048_N = "AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC319294"
- + "3DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310D"
- + "CD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FB"
- + "D5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF74"
- + "7359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A"
- + "436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D"
- + "5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E73"
- + "03CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB6"
- + "94B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F" + "9E4AFF73";
- private const string rfc5054_2048_g = "02";
- public static readonly Srp6GroupParameters rfc5054_2048 = FromNG(rfc5054_2048_N, rfc5054_2048_g);
-
- private const string rfc5054_3072_N = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08"
- + "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B"
- + "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9"
- + "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"
- + "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8"
- + "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D"
- + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C"
- + "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718"
- + "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D"
- + "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D"
- + "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226"
- + "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
- + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC" + "E0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF";
- private const string rfc5054_3072_g = "05";
- public static readonly Srp6GroupParameters rfc5054_3072 = FromNG(rfc5054_3072_N, rfc5054_3072_g);
-
- private const string rfc5054_4096_N = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08"
- + "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B"
- + "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9"
- + "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"
- + "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8"
- + "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D"
- + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C"
- + "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718"
- + "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D"
- + "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D"
- + "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226"
- + "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
- + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC"
- + "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26"
- + "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB"
- + "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2"
- + "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127"
- + "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" + "FFFFFFFFFFFFFFFF";
- private const string rfc5054_4096_g = "05";
- public static readonly Srp6GroupParameters rfc5054_4096 = FromNG(rfc5054_4096_N, rfc5054_4096_g);
-
- private const string rfc5054_6144_N = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08"
- + "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B"
- + "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9"
- + "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"
- + "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8"
- + "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D"
- + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C"
- + "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718"
- + "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D"
- + "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D"
- + "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226"
- + "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
- + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC"
- + "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26"
- + "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB"
- + "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2"
- + "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127"
- + "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492"
- + "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406"
- + "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918"
- + "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151"
- + "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03"
- + "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F"
- + "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA"
- + "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B"
- + "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632"
- + "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E" + "6DCC4024FFFFFFFFFFFFFFFF";
- private const string rfc5054_6144_g = "05";
- public static readonly Srp6GroupParameters rfc5054_6144 = FromNG(rfc5054_6144_N, rfc5054_6144_g);
-
- private const string rfc5054_8192_N = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08"
- + "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B"
- + "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9"
- + "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"
- + "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8"
- + "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D"
- + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C"
- + "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718"
- + "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D"
- + "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D"
- + "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226"
- + "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
- + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC"
- + "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26"
- + "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB"
- + "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2"
- + "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127"
- + "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492"
- + "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406"
- + "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918"
- + "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151"
- + "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03"
- + "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F"
- + "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA"
- + "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B"
- + "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632"
- + "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E"
- + "6DBE115974A3926F12FEE5E438777CB6A932DF8CD8BEC4D073B931BA"
- + "3BC832B68D9DD300741FA7BF8AFC47ED2576F6936BA424663AAB639C"
- + "5AE4F5683423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9"
- + "22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B4BCBC886"
- + "2F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A6"
- + "6D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC5"
- + "0846851DF9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268"
- + "359046F4EB879F924009438B481C6CD7889A002ED5EE382BC9190DA6"
- + "FC026E479558E4475677E9AA9E3050E2765694DFC81F56E880B96E71" + "60C980DD98EDD3DFFFFFFFFFFFFFFFFF";
- private const string rfc5054_8192_g = "13";
- public static readonly Srp6GroupParameters rfc5054_8192 = FromNG(rfc5054_8192_N, rfc5054_8192_g);
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/srp/SRP6Utilities.cs b/BCCrypto/src/crypto/agreement/srp/SRP6Utilities.cs
deleted file mode 100644
index ef6d8f2..0000000
--- a/BCCrypto/src/crypto/agreement/srp/SRP6Utilities.cs
+++ /dev/null
@@ -1,153 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Agreement.Srp
-{
- public class Srp6Utilities
- {
- public static BigInteger CalculateK(IDigest digest, BigInteger N, BigInteger g)
- {
- return HashPaddedPair(digest, N, N, g);
- }
-
- public static BigInteger CalculateU(IDigest digest, BigInteger N, BigInteger A, BigInteger B)
- {
- return HashPaddedPair(digest, N, A, B);
- }
-
- public static BigInteger CalculateX(IDigest digest, BigInteger N, byte[] salt, byte[] identity, byte[] password)
- {
- byte[] output = new byte[digest.GetDigestSize()];
-
- digest.BlockUpdate(identity, 0, identity.Length);
- digest.Update((byte)':');
- digest.BlockUpdate(password, 0, password.Length);
- digest.DoFinal(output, 0);
-
- digest.BlockUpdate(salt, 0, salt.Length);
- digest.BlockUpdate(output, 0, output.Length);
- digest.DoFinal(output, 0);
-
- return new BigInteger(1, output);
- }
-
- public static BigInteger GeneratePrivateValue(IDigest digest, BigInteger N, BigInteger g, SecureRandom random)
- {
- int minBits = System.Math.Min(256, N.BitLength / 2);
- BigInteger min = BigInteger.One.ShiftLeft(minBits - 1);
- BigInteger max = N.Subtract(BigInteger.One);
-
- return BigIntegers.CreateRandomInRange(min, max, random);
- }
-
- public static BigInteger ValidatePublicValue(BigInteger N, BigInteger val)
- {
- val = val.Mod(N);
-
- // Check that val % N != 0
- if (val.Equals(BigInteger.Zero))
- throw new CryptoException("Invalid public value: 0");
-
- return val;
- }
-
- /**
- * Computes the client evidence message (M1) according to the standard routine:
- * M1 = H( A | B | S )
- * @param digest The Digest used as the hashing function H
- * @param N Modulus used to get the pad length
- * @param A The public client value
- * @param B The public server value
- * @param S The secret calculated by both sides
- * @return M1 The calculated client evidence message
- */
- public static BigInteger CalculateM1(IDigest digest, BigInteger N, BigInteger A, BigInteger B, BigInteger S)
- {
- BigInteger M1 = HashPaddedTriplet(digest, N, A, B, S);
- return M1;
- }
-
- /**
- * Computes the server evidence message (M2) according to the standard routine:
- * M2 = H( A | M1 | S )
- * @param digest The Digest used as the hashing function H
- * @param N Modulus used to get the pad length
- * @param A The public client value
- * @param M1 The client evidence message
- * @param S The secret calculated by both sides
- * @return M2 The calculated server evidence message
- */
- public static BigInteger CalculateM2(IDigest digest, BigInteger N, BigInteger A, BigInteger M1, BigInteger S)
- {
- BigInteger M2 = HashPaddedTriplet(digest, N, A, M1, S);
- return M2;
- }
-
- /**
- * Computes the final Key according to the standard routine: Key = H(S)
- * @param digest The Digest used as the hashing function H
- * @param N Modulus used to get the pad length
- * @param S The secret calculated by both sides
- * @return
- */
- public static BigInteger CalculateKey(IDigest digest, BigInteger N, BigInteger S)
- {
- int padLength = (N.BitLength + 7) / 8;
- byte[] _S = GetPadded(S, padLength);
- digest.BlockUpdate(_S, 0, _S.Length);
-
- byte[] output = new byte[digest.GetDigestSize()];
- digest.DoFinal(output, 0);
- return new BigInteger(1, output);
- }
-
- private static BigInteger HashPaddedTriplet(IDigest digest, BigInteger N, BigInteger n1, BigInteger n2, BigInteger n3)
- {
- int padLength = (N.BitLength + 7) / 8;
-
- byte[] n1_bytes = GetPadded(n1, padLength);
- byte[] n2_bytes = GetPadded(n2, padLength);
- byte[] n3_bytes = GetPadded(n3, padLength);
-
- digest.BlockUpdate(n1_bytes, 0, n1_bytes.Length);
- digest.BlockUpdate(n2_bytes, 0, n2_bytes.Length);
- digest.BlockUpdate(n3_bytes, 0, n3_bytes.Length);
-
- byte[] output = new byte[digest.GetDigestSize()];
- digest.DoFinal(output, 0);
-
- return new BigInteger(1, output);
- }
-
- private static BigInteger HashPaddedPair(IDigest digest, BigInteger N, BigInteger n1, BigInteger n2)
- {
- int padLength = (N.BitLength + 7) / 8;
-
- byte[] n1_bytes = GetPadded(n1, padLength);
- byte[] n2_bytes = GetPadded(n2, padLength);
-
- digest.BlockUpdate(n1_bytes, 0, n1_bytes.Length);
- digest.BlockUpdate(n2_bytes, 0, n2_bytes.Length);
-
- byte[] output = new byte[digest.GetDigestSize()];
- digest.DoFinal(output, 0);
-
- return new BigInteger(1, output);
- }
-
- private static byte[] GetPadded(BigInteger n, int length)
- {
- byte[] bs = BigIntegers.AsUnsignedByteArray(n);
- if (bs.Length < length)
- {
- byte[] tmp = new byte[length];
- Array.Copy(bs, 0, tmp, length - bs.Length, bs.Length);
- bs = tmp;
- }
- return bs;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/agreement/srp/SRP6VerifierGenerator.cs b/BCCrypto/src/crypto/agreement/srp/SRP6VerifierGenerator.cs
deleted file mode 100644
index 9569735..0000000
--- a/BCCrypto/src/crypto/agreement/srp/SRP6VerifierGenerator.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Agreement.Srp
-{
- /**
- * Generates new SRP verifier for user
- */
- public class Srp6VerifierGenerator
- {
- protected BigInteger N;
- protected BigInteger g;
- protected IDigest digest;
-
- public Srp6VerifierGenerator()
- {
- }
-
- /**
- * Initialises generator to create new verifiers
- * @param N The safe prime to use (see DHParametersGenerator)
- * @param g The group parameter to use (see DHParametersGenerator)
- * @param digest The digest to use. The same digest type will need to be used later for the actual authentication
- * attempt. Also note that the final session key size is dependent on the chosen digest.
- */
- public virtual void Init(BigInteger N, BigInteger g, IDigest digest)
- {
- this.N = N;
- this.g = g;
- this.digest = digest;
- }
-
- public virtual void Init(Srp6GroupParameters group, IDigest digest)
- {
- Init(group.N, group.G, digest);
- }
-
- /**
- * Creates a new SRP verifier
- * @param salt The salt to use, generally should be large and random
- * @param identity The user's identifying information (eg. username)
- * @param password The user's password
- * @return A new verifier for use in future SRP authentication
- */
- public virtual BigInteger GenerateVerifier(byte[] salt, byte[] identity, byte[] password)
- {
- BigInteger x = Srp6Utilities.CalculateX(digest, N, salt, identity, password);
-
- return g.ModPow(x, N);
- }
- }
-}
-
diff --git a/BCCrypto/src/crypto/digests/DSTU7564Digest.cs b/BCCrypto/src/crypto/digests/DSTU7564Digest.cs
deleted file mode 100644
index 9de41dd..0000000
--- a/BCCrypto/src/crypto/digests/DSTU7564Digest.cs
+++ /dev/null
@@ -1,562 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-//using Org.BouncyCastle.Utilities;
-
-
-using Org.BouncyCastle.Utilities.Encoders;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * implementation of Ukrainian DSTU 7564 hash function
- */
- public class Dstu7564Digest : IDigest, IMemoable
- {
- private const int ROWS = 8;
- private const int REDUCTION_POLYNOMIAL = 0x011d;
- private const int BITS_IN_BYTE = 8;
-
-
- private const int NB_512 = 8; //Number of 8-byte words in state for <=256-bit hash code.
- private const int NB_1024 = 16; //Number of 8-byte words in state for <=512-bit hash code.
-
- private const int NR_512 = 10; //Number of rounds for 512-bit state.
- private const int NR_1024 = 14; //Number of rounds for 1024-bit state.
-
- private const int STATE_BYTE_SIZE_512 = ROWS * NB_512;
- private const int STATE_BYTE_SIZE_1024 = ROWS * NB_1024;
-
- private int hashSize;
- private int blockSize;
-
-
-
- private int columns;
- private int rounds;
-
-
- private byte[] padded_;
-
- private byte[][] state_;
-
- private ulong inputLength;
- private int bufOff;
- private byte[] buf;
-
- public Dstu7564Digest(Dstu7564Digest digest)
- {
- copyIn(digest);
- }
-
- private void copyIn(Dstu7564Digest digest)
- {
- this.hashSize = digest.hashSize;
- this.blockSize = digest.blockSize;
-
- this.columns = digest.columns;
- this.rounds = digest.rounds;
-
- this.padded_ = Arrays.Clone(digest.padded_);
- this.state_ = new byte[digest.state_.Length][];
- for (int i = 0; i != this.state_.Length; i++)
- {
- this.state_[i] = Arrays.Clone(digest.state_[i]);
- }
-
- this.inputLength = digest.inputLength;
- this.bufOff = digest.bufOff;
- this.buf = Arrays.Clone(digest.buf);
- }
-
- public Dstu7564Digest(int hashSizeBits)
- {
- if (hashSizeBits == 256 || hashSizeBits == 384 || hashSizeBits == 512)
- {
- this.hashSize = hashSizeBits / 8;
- }
- else
- {
- throw new ArgumentException("Hash size is not recommended. Use 256 or 384 or 512 size");
- }
-
- if (hashSizeBits > 256)
- {
- this.blockSize = 1024 / 8;
- this.columns = NB_1024;
- this.rounds = NR_1024;
- this.state_ = new byte[STATE_BYTE_SIZE_1024][];
-
- }
- else
- {
- this.blockSize = 512 / 8;
- this.columns = NB_512;
- this.rounds = NR_512;
- this.state_ = new byte[STATE_BYTE_SIZE_512][];
-
- }
-
- //Console.WriteLine("length: " + state_.Length);
-
- for (int i = 0; i < state_.Length; i++)
- {
- this.state_[i] = new byte[columns];
- }
-
- this.state_[0][0] = (byte)state_.Length;
-
- this.hashSize = hashSizeBits / 8;
-
- this.padded_ = null;
- this.buf = new byte[blockSize];
- }
-
- public string AlgorithmName
- {
- get { return "DSTU7564"; }
- }
-
-
- public virtual void BlockUpdate(byte[] input, int inOff, int length)
- {
- while (bufOff != 0 && length > 0)
- {
- Update(input[inOff++]);
- length--;
- }
-
- if (length > 0)
- {
- while (length > blockSize)
- {
- ProcessBlock(input, inOff);
- inOff += blockSize;
- inputLength += (ulong)blockSize;
- length -= blockSize;
- }
-
- while (length > 0)
- {
- Update(input[inOff++]);
- length--;
- }
- }
- }
-
- protected byte[] Pad(byte[] input, int inOff, int length)
- {
- //Console.WriteLine(length);
-
- byte[] padded;
- if (blockSize - length < 13) // terminator byte + 96 bits of length
- {
- padded = new byte[2 * blockSize];
- }
- else
- {
- padded = new byte[blockSize];
- }
-
-
- Array.Copy(input, inOff, padded, 0, length);
- padded[length] = 0x80;
- Pack.UInt64_To_LE(inputLength * 8, padded, padded.Length - 12);
-
- return padded;
- }
-
- protected void ProcessBlock(byte[] input, int inOff)
- {
- byte[][] temp1 = new byte[STATE_BYTE_SIZE_1024][];
- byte[][] temp2 = new byte[STATE_BYTE_SIZE_1024][];
-
- for (int i = 0; i < state_.Length; i++)
- {
- temp1[i] = new byte[ROWS];
- temp2[i] = new byte[ROWS];
- }
-
- for (int i = 0; i < ROWS; ++i)
- {
- for (int j = 0; j < columns; ++j)
- {
- //Console.WriteLine("row = {0}, column = {1}", i, j);
-
- temp1[j][i] = (byte)(state_[j][i] ^ input[j * ROWS + i + inOff]);
- temp2[j][i] = input[j * ROWS + i + inOff];
-
- }
-
- }
-
- P(temp1);
-
- Q(temp2);
-
- for (int i = 0; i < ROWS; ++i)
- {
- for (int j = 0; j < columns; ++j)
- {
- state_[j][i] ^= (byte)(temp1[j][i] ^ temp2[j][i]);
-
- }
-
- }
- }
-
- public int DoFinal(byte[] output, int outOff)
- {
- padded_ = Pad(buf, 0, bufOff);
-
- int paddedLen = padded_.Length;
- int paddedOff = 0;
-
- while (paddedLen != 0)
- {
- ProcessBlock(padded_, paddedOff);
- paddedOff += blockSize;
- paddedLen -= blockSize;
- }
-
-
- //Console.WriteLine(stateLine.Length);
-
- byte[][] temp = new byte[STATE_BYTE_SIZE_1024][];
- for (int i = 0; i < state_.Length; i++)
- {
- temp[i] = new byte[ROWS];
- Array.Copy(state_[i], temp[i], ROWS);
- }
-
- P(temp);
-
- for (int i = 0; i < ROWS; ++i)
- {
- for (int j = 0; j < columns; ++j)
- {
- state_[j][i] ^= temp[j][i];
- //Console.Write("{0:x} ", state_[j][i]);
- }
- //Console.WriteLine();
- }
-
- byte[] stateLine = new byte[ROWS * columns];
- int stateLineIndex = 0;
- for (int j = 0; j < columns; ++j)
- {
- for (int i = 0; i < ROWS; ++i)
- {
-
- stateLine[stateLineIndex] = state_[j][i];
- stateLineIndex++;
-
- //Console.WriteLine("index = {0}, row = {1}, column = {2}", stateLineIndex, i, j);
-
- }
- }
-
- //Console.WriteLine("final: " + Hex.ToHexString(stateLine));
- //Console.WriteLine(stateLine.Length);
-
- Array.Copy(stateLine, stateLine.Length - hashSize, output, outOff, hashSize);
-
- Reset();
-
- return hashSize;
- }
-
- public void Reset()
- {
- for (int bufferIndex = 0; bufferIndex < state_.Length; bufferIndex++)
- {
- state_[bufferIndex] = new byte[columns];
- }
-
- state_[0][0] = (byte)state_.Length;
-
- inputLength = 0;
- bufOff = 0;
-
- Arrays.Fill(buf, (byte)0);
-
- if (padded_ != null)
- {
- Arrays.Fill(padded_, (byte)0);
- }
- }
-
- public int GetDigestSize()
- {
- return hashSize;
- }
-
- public int GetByteLength()
- {
- return blockSize;
- }
-
- public void Update(byte input)
- {
- buf[bufOff++] = input;
- if (bufOff == blockSize)
- {
- ProcessBlock(buf, 0);
- bufOff = 0;
- }
- inputLength++;
- }
-
- void SubBytes(byte[][] state)
- {
- int i, j;
- for (i = 0; i < ROWS; ++i)
- {
- for (j = 0; j < columns; ++j)
- {
- state[j][i] = sBoxes[i % 4][state[j][i]];
- }
- }
- }
-
- void ShiftBytes(byte[][] state)
- {
- int i, j;
- byte[] temp = new byte[NB_1024];
- int shift = -1;
- for (i = 0; i < ROWS; ++i)
- {
- if ((i == ROWS - 1) && (columns == NB_1024))
- {
- shift = 11;
- }
- else
- {
- ++shift;
- }
- for (j = 0; j < columns; ++j)
- {
- temp[(j + shift) % columns] = state[j][i];
- }
- for (j = 0; j < columns; ++j)
- {
- state[j][i] = temp[j];
- }
- }
- }
-
- byte MultiplyGF(byte x, byte y)
- {
- int i;
- byte r = 0;
- byte hbit = 0;
- for (i = 0; i < BITS_IN_BYTE; ++i)
- {
- if ((y & 0x1) == 1)
- {
- r ^= x;
- }
-
- hbit = (byte)(x & 0x80);
-
- x <<= 1;
-
- if (hbit == 0x80)
- {
- x = (byte)((int)x ^ REDUCTION_POLYNOMIAL);
- }
-
- y >>= 1;
- }
- return r;
- }
-
- private void MixColumns(byte[][] state)
- {
- int i, row, col, b;
- byte product;
- byte[] result = new byte[ROWS];
-
- for (col = 0; col < columns; ++col)
- {
- Array.Clear(result, 0, ROWS);
- for (row = ROWS - 1; row >= 0; --row)
- {
- product = 0;
- for (b = ROWS - 1; b >= 0; --b)
- {
- product ^= MultiplyGF(state[col][b], mds_matrix[row][b]);
- }
- result[row] = product;
- }
- for (i = 0; i < ROWS; ++i)
- {
- state[col][i] = result[i];
- }
- }
- }
-
- void AddRoundConstantP(byte[][] state, int round)
- {
- int i;
- for (i = 0; i < columns; ++i)
- {
- state[i][0] ^= (byte)((i * 0x10) ^ round);
- }
- }
-
- void AddRoundConstantQ(byte[][] state, int round)
- {
- int j;
- UInt64[] s = new UInt64[columns];
-
- for (j = 0; j < columns; j++)
- {
- s[j] = Pack.LE_To_UInt64(state[j]);
-
- s[j] = s[j] + (0x00F0F0F0F0F0F0F3UL ^ ((((UInt64)(columns - j - 1) * 0x10UL) ^ (UInt64)round) << (7 * 8)));
-
- state[j] = Pack.UInt64_To_LE(s[j]);
- }
- }
-
- void P(byte[][] state)
- {
- int i;
- for (i = 0; i < rounds; ++i)
- {
- AddRoundConstantP(state, i);
- SubBytes(state);
- ShiftBytes(state);
- MixColumns(state);
- }
- }
-
- void Q(byte[][] state)
- {
- int i;
- for (i = 0; i < rounds; ++i)
- {
- AddRoundConstantQ(state, i);
- SubBytes(state);
- ShiftBytes(state);
- MixColumns(state);
- }
- }
-
- public IMemoable Copy()
- {
- return new Dstu7564Digest(this);
- }
-
- public void Reset(IMemoable other)
- {
- Dstu7564Digest d = (Dstu7564Digest)other;
-
- copyIn(d);
- }
-
- private readonly byte[][] mds_matrix = new byte[][]
- {
- new byte[] {0x01, 0x01, 0x05, 0x01, 0x08, 0x06, 0x07, 0x04},
- new byte[] {0x04, 0x01, 0x01, 0x05, 0x01, 0x08, 0x06, 0x07},
- new byte[] {0x07, 0x04, 0x01, 0x01, 0x05, 0x01, 0x08, 0x06},
- new byte[] {0x06, 0x07, 0x04, 0x01, 0x01, 0x05, 0x01, 0x08},
- new byte[] {0x08, 0x06, 0x07, 0x04, 0x01, 0x01, 0x05, 0x01},
- new byte[] {0x01, 0x08, 0x06, 0x07, 0x04, 0x01, 0x01, 0x05},
- new byte[] {0x05, 0x01, 0x08, 0x06, 0x07, 0x04, 0x01, 0x01},
- new byte[] {0x01, 0x05, 0x01, 0x08, 0x06, 0x07, 0x04, 0x01}
- };
-
-
-
-
- private readonly byte[][] sBoxes = new byte[][]
- {
- new byte[]
- {
- 0xa8, 0x43, 0x5f, 0x06, 0x6b, 0x75, 0x6c, 0x59, 0x71, 0xdf, 0x87, 0x95, 0x17, 0xf0, 0xd8, 0x09,
- 0x6d, 0xf3, 0x1d, 0xcb, 0xc9, 0x4d, 0x2c, 0xaf, 0x79, 0xe0, 0x97, 0xfd, 0x6f, 0x4b, 0x45, 0x39,
- 0x3e, 0xdd, 0xa3, 0x4f, 0xb4, 0xb6, 0x9a, 0x0e, 0x1f, 0xbf, 0x15, 0xe1, 0x49, 0xd2, 0x93, 0xc6,
- 0x92, 0x72, 0x9e, 0x61, 0xd1, 0x63, 0xfa, 0xee, 0xf4, 0x19, 0xd5, 0xad, 0x58, 0xa4, 0xbb, 0xa1,
- 0xdc, 0xf2, 0x83, 0x37, 0x42, 0xe4, 0x7a, 0x32, 0x9c, 0xcc, 0xab, 0x4a, 0x8f, 0x6e, 0x04, 0x27,
- 0x2e, 0xe7, 0xe2, 0x5a, 0x96, 0x16, 0x23, 0x2b, 0xc2, 0x65, 0x66, 0x0f, 0xbc, 0xa9, 0x47, 0x41,
- 0x34, 0x48, 0xfc, 0xb7, 0x6a, 0x88, 0xa5, 0x53, 0x86, 0xf9, 0x5b, 0xdb, 0x38, 0x7b, 0xc3, 0x1e,
- 0x22, 0x33, 0x24, 0x28, 0x36, 0xc7, 0xb2, 0x3b, 0x8e, 0x77, 0xba, 0xf5, 0x14, 0x9f, 0x08, 0x55,
- 0x9b, 0x4c, 0xfe, 0x60, 0x5c, 0xda, 0x18, 0x46, 0xcd, 0x7d, 0x21, 0xb0, 0x3f, 0x1b, 0x89, 0xff,
- 0xeb, 0x84, 0x69, 0x3a, 0x9d, 0xd7, 0xd3, 0x70, 0x67, 0x40, 0xb5, 0xde, 0x5d, 0x30, 0x91, 0xb1,
- 0x78, 0x11, 0x01, 0xe5, 0x00, 0x68, 0x98, 0xa0, 0xc5, 0x02, 0xa6, 0x74, 0x2d, 0x0b, 0xa2, 0x76,
- 0xb3, 0xbe, 0xce, 0xbd, 0xae, 0xe9, 0x8a, 0x31, 0x1c, 0xec, 0xf1, 0x99, 0x94, 0xaa, 0xf6, 0x26,
- 0x2f, 0xef, 0xe8, 0x8c, 0x35, 0x03, 0xd4, 0x7f, 0xfb, 0x05, 0xc1, 0x5e, 0x90, 0x20, 0x3d, 0x82,
- 0xf7, 0xea, 0x0a, 0x0d, 0x7e, 0xf8, 0x50, 0x1a, 0xc4, 0x07, 0x57, 0xb8, 0x3c, 0x62, 0xe3, 0xc8,
- 0xac, 0x52, 0x64, 0x10, 0xd0, 0xd9, 0x13, 0x0c, 0x12, 0x29, 0x51, 0xb9, 0xcf, 0xd6, 0x73, 0x8d,
- 0x81, 0x54, 0xc0, 0xed, 0x4e, 0x44, 0xa7, 0x2a, 0x85, 0x25, 0xe6, 0xca, 0x7c, 0x8b, 0x56, 0x80
- },
-
- new byte[]
- {
- 0xce, 0xbb, 0xeb, 0x92, 0xea, 0xcb, 0x13, 0xc1, 0xe9, 0x3a, 0xd6, 0xb2, 0xd2, 0x90, 0x17, 0xf8,
- 0x42, 0x15, 0x56, 0xb4, 0x65, 0x1c, 0x88, 0x43, 0xc5, 0x5c, 0x36, 0xba, 0xf5, 0x57, 0x67, 0x8d,
- 0x31, 0xf6, 0x64, 0x58, 0x9e, 0xf4, 0x22, 0xaa, 0x75, 0x0f, 0x02, 0xb1, 0xdf, 0x6d, 0x73, 0x4d,
- 0x7c, 0x26, 0x2e, 0xf7, 0x08, 0x5d, 0x44, 0x3e, 0x9f, 0x14, 0xc8, 0xae, 0x54, 0x10, 0xd8, 0xbc,
- 0x1a, 0x6b, 0x69, 0xf3, 0xbd, 0x33, 0xab, 0xfa, 0xd1, 0x9b, 0x68, 0x4e, 0x16, 0x95, 0x91, 0xee,
- 0x4c, 0x63, 0x8e, 0x5b, 0xcc, 0x3c, 0x19, 0xa1, 0x81, 0x49, 0x7b, 0xd9, 0x6f, 0x37, 0x60, 0xca,
- 0xe7, 0x2b, 0x48, 0xfd, 0x96, 0x45, 0xfc, 0x41, 0x12, 0x0d, 0x79, 0xe5, 0x89, 0x8c, 0xe3, 0x20,
- 0x30, 0xdc, 0xb7, 0x6c, 0x4a, 0xb5, 0x3f, 0x97, 0xd4, 0x62, 0x2d, 0x06, 0xa4, 0xa5, 0x83, 0x5f,
- 0x2a, 0xda, 0xc9, 0x00, 0x7e, 0xa2, 0x55, 0xbf, 0x11, 0xd5, 0x9c, 0xcf, 0x0e, 0x0a, 0x3d, 0x51,
- 0x7d, 0x93, 0x1b, 0xfe, 0xc4, 0x47, 0x09, 0x86, 0x0b, 0x8f, 0x9d, 0x6a, 0x07, 0xb9, 0xb0, 0x98,
- 0x18, 0x32, 0x71, 0x4b, 0xef, 0x3b, 0x70, 0xa0, 0xe4, 0x40, 0xff, 0xc3, 0xa9, 0xe6, 0x78, 0xf9,
- 0x8b, 0x46, 0x80, 0x1e, 0x38, 0xe1, 0xb8, 0xa8, 0xe0, 0x0c, 0x23, 0x76, 0x1d, 0x25, 0x24, 0x05,
- 0xf1, 0x6e, 0x94, 0x28, 0x9a, 0x84, 0xe8, 0xa3, 0x4f, 0x77, 0xd3, 0x85, 0xe2, 0x52, 0xf2, 0x82,
- 0x50, 0x7a, 0x2f, 0x74, 0x53, 0xb3, 0x61, 0xaf, 0x39, 0x35, 0xde, 0xcd, 0x1f, 0x99, 0xac, 0xad,
- 0x72, 0x2c, 0xdd, 0xd0, 0x87, 0xbe, 0x5e, 0xa6, 0xec, 0x04, 0xc6, 0x03, 0x34, 0xfb, 0xdb, 0x59,
- 0xb6, 0xc2, 0x01, 0xf0, 0x5a, 0xed, 0xa7, 0x66, 0x21, 0x7f, 0x8a, 0x27, 0xc7, 0xc0, 0x29, 0xd7
- },
-
- new byte[]
- {
- 0x93, 0xd9, 0x9a, 0xb5, 0x98, 0x22, 0x45, 0xfc, 0xba, 0x6a, 0xdf, 0x02, 0x9f, 0xdc, 0x51, 0x59,
- 0x4a, 0x17, 0x2b, 0xc2, 0x94, 0xf4, 0xbb, 0xa3, 0x62, 0xe4, 0x71, 0xd4, 0xcd, 0x70, 0x16, 0xe1,
- 0x49, 0x3c, 0xc0, 0xd8, 0x5c, 0x9b, 0xad, 0x85, 0x53, 0xa1, 0x7a, 0xc8, 0x2d, 0xe0, 0xd1, 0x72,
- 0xa6, 0x2c, 0xc4, 0xe3, 0x76, 0x78, 0xb7, 0xb4, 0x09, 0x3b, 0x0e, 0x41, 0x4c, 0xde, 0xb2, 0x90,
- 0x25, 0xa5, 0xd7, 0x03, 0x11, 0x00, 0xc3, 0x2e, 0x92, 0xef, 0x4e, 0x12, 0x9d, 0x7d, 0xcb, 0x35,
- 0x10, 0xd5, 0x4f, 0x9e, 0x4d, 0xa9, 0x55, 0xc6, 0xd0, 0x7b, 0x18, 0x97, 0xd3, 0x36, 0xe6, 0x48,
- 0x56, 0x81, 0x8f, 0x77, 0xcc, 0x9c, 0xb9, 0xe2, 0xac, 0xb8, 0x2f, 0x15, 0xa4, 0x7c, 0xda, 0x38,
- 0x1e, 0x0b, 0x05, 0xd6, 0x14, 0x6e, 0x6c, 0x7e, 0x66, 0xfd, 0xb1, 0xe5, 0x60, 0xaf, 0x5e, 0x33,
- 0x87, 0xc9, 0xf0, 0x5d, 0x6d, 0x3f, 0x88, 0x8d, 0xc7, 0xf7, 0x1d, 0xe9, 0xec, 0xed, 0x80, 0x29,
- 0x27, 0xcf, 0x99, 0xa8, 0x50, 0x0f, 0x37, 0x24, 0x28, 0x30, 0x95, 0xd2, 0x3e, 0x5b, 0x40, 0x83,
- 0xb3, 0x69, 0x57, 0x1f, 0x07, 0x1c, 0x8a, 0xbc, 0x20, 0xeb, 0xce, 0x8e, 0xab, 0xee, 0x31, 0xa2,
- 0x73, 0xf9, 0xca, 0x3a, 0x1a, 0xfb, 0x0d, 0xc1, 0xfe, 0xfa, 0xf2, 0x6f, 0xbd, 0x96, 0xdd, 0x43,
- 0x52, 0xb6, 0x08, 0xf3, 0xae, 0xbe, 0x19, 0x89, 0x32, 0x26, 0xb0, 0xea, 0x4b, 0x64, 0x84, 0x82,
- 0x6b, 0xf5, 0x79, 0xbf, 0x01, 0x5f, 0x75, 0x63, 0x1b, 0x23, 0x3d, 0x68, 0x2a, 0x65, 0xe8, 0x91,
- 0xf6, 0xff, 0x13, 0x58, 0xf1, 0x47, 0x0a, 0x7f, 0xc5, 0xa7, 0xe7, 0x61, 0x5a, 0x06, 0x46, 0x44,
- 0x42, 0x04, 0xa0, 0xdb, 0x39, 0x86, 0x54, 0xaa, 0x8c, 0x34, 0x21, 0x8b, 0xf8, 0x0c, 0x74, 0x67
- },
-
- new byte[]
- {
- 0x68, 0x8d, 0xca, 0x4d, 0x73, 0x4b, 0x4e, 0x2a, 0xd4, 0x52, 0x26, 0xb3, 0x54, 0x1e, 0x19, 0x1f,
- 0x22, 0x03, 0x46, 0x3d, 0x2d, 0x4a, 0x53, 0x83, 0x13, 0x8a, 0xb7, 0xd5, 0x25, 0x79, 0xf5, 0xbd,
- 0x58, 0x2f, 0x0d, 0x02, 0xed, 0x51, 0x9e, 0x11, 0xf2, 0x3e, 0x55, 0x5e, 0xd1, 0x16, 0x3c, 0x66,
- 0x70, 0x5d, 0xf3, 0x45, 0x40, 0xcc, 0xe8, 0x94, 0x56, 0x08, 0xce, 0x1a, 0x3a, 0xd2, 0xe1, 0xdf,
- 0xb5, 0x38, 0x6e, 0x0e, 0xe5, 0xf4, 0xf9, 0x86, 0xe9, 0x4f, 0xd6, 0x85, 0x23, 0xcf, 0x32, 0x99,
- 0x31, 0x14, 0xae, 0xee, 0xc8, 0x48, 0xd3, 0x30, 0xa1, 0x92, 0x41, 0xb1, 0x18, 0xc4, 0x2c, 0x71,
- 0x72, 0x44, 0x15, 0xfd, 0x37, 0xbe, 0x5f, 0xaa, 0x9b, 0x88, 0xd8, 0xab, 0x89, 0x9c, 0xfa, 0x60,
- 0xea, 0xbc, 0x62, 0x0c, 0x24, 0xa6, 0xa8, 0xec, 0x67, 0x20, 0xdb, 0x7c, 0x28, 0xdd, 0xac, 0x5b,
- 0x34, 0x7e, 0x10, 0xf1, 0x7b, 0x8f, 0x63, 0xa0, 0x05, 0x9a, 0x43, 0x77, 0x21, 0xbf, 0x27, 0x09,
- 0xc3, 0x9f, 0xb6, 0xd7, 0x29, 0xc2, 0xeb, 0xc0, 0xa4, 0x8b, 0x8c, 0x1d, 0xfb, 0xff, 0xc1, 0xb2,
- 0x97, 0x2e, 0xf8, 0x65, 0xf6, 0x75, 0x07, 0x04, 0x49, 0x33, 0xe4, 0xd9, 0xb9, 0xd0, 0x42, 0xc7,
- 0x6c, 0x90, 0x00, 0x8e, 0x6f, 0x50, 0x01, 0xc5, 0xda, 0x47, 0x3f, 0xcd, 0x69, 0xa2, 0xe2, 0x7a,
- 0xa7, 0xc6, 0x93, 0x0f, 0x0a, 0x06, 0xe6, 0x2b, 0x96, 0xa3, 0x1c, 0xaf, 0x6a, 0x12, 0x84, 0x39,
- 0xe7, 0xb0, 0x82, 0xf7, 0xfe, 0x9d, 0x87, 0x5c, 0x81, 0x35, 0xde, 0xb4, 0xa5, 0xfc, 0x80, 0xef,
- 0xcb, 0xbb, 0x6b, 0x76, 0xba, 0x5a, 0x7d, 0x78, 0x0b, 0x95, 0xe3, 0xad, 0x74, 0x98, 0x3b, 0x36,
- 0x64, 0x6d, 0xdc, 0xf0, 0x59, 0xa9, 0x4c, 0x17, 0x7f, 0x91, 0xb8, 0xc9, 0x57, 0x1b, 0xe0, 0x61
- }
- };
-
-
- }
-}
diff --git a/BCCrypto/src/crypto/digests/GOST3411Digest.cs b/BCCrypto/src/crypto/digests/GOST3411Digest.cs
deleted file mode 100644
index 218adf6..0000000
--- a/BCCrypto/src/crypto/digests/GOST3411Digest.cs
+++ /dev/null
@@ -1,356 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * implementation of GOST R 34.11-94
- */
- public class Gost3411Digest
- : IDigest, IMemoable
- {
- private const int DIGEST_LENGTH = 32;
-
- private byte[] H = new byte[32], L = new byte[32],
- M = new byte[32], Sum = new byte[32];
- private byte[][] C = MakeC();
-
- private byte[] xBuf = new byte[32];
- private int xBufOff;
- private ulong byteCount;
-
- private readonly IBlockCipher cipher = new Gost28147Engine();
- private byte[] sBox;
-
- private static byte[][] MakeC()
- {
- byte[][] c = new byte[4][];
- for (int i = 0; i < 4; ++i)
- {
- c[i] = new byte[32];
- }
- return c;
- }
-
- /**
- * Standard constructor
- */
- public Gost3411Digest()
- {
- sBox = Gost28147Engine.GetSBox("D-A");
- cipher.Init(true, new ParametersWithSBox(null, sBox));
-
- Reset();
- }
-
- /**
- * Constructor to allow use of a particular sbox with GOST28147
- * @see GOST28147Engine#getSBox(String)
- */
- public Gost3411Digest(byte[] sBoxParam)
- {
- sBox = Arrays.Clone(sBoxParam);
- cipher.Init(true, new ParametersWithSBox(null, sBox));
-
- Reset();
- }
-
- /**
- * Copy constructor. This will copy the state of the provided
- * message digest.
- */
- public Gost3411Digest(Gost3411Digest t)
- {
- Reset(t);
- }
-
- public string AlgorithmName
- {
- get { return "Gost3411"; }
- }
-
- public int GetDigestSize()
- {
- return DIGEST_LENGTH;
- }
-
- public void Update(
- byte input)
- {
- xBuf[xBufOff++] = input;
- if (xBufOff == xBuf.Length)
- {
- sumByteArray(xBuf); // calc sum M
- processBlock(xBuf, 0);
- xBufOff = 0;
- }
- byteCount++;
- }
-
- public void BlockUpdate(
- byte[] input,
- int inOff,
- int length)
- {
- while ((xBufOff != 0) && (length > 0))
- {
- Update(input[inOff]);
- inOff++;
- length--;
- }
-
- while (length > xBuf.Length)
- {
- Array.Copy(input, inOff, xBuf, 0, xBuf.Length);
-
- sumByteArray(xBuf); // calc sum M
- processBlock(xBuf, 0);
- inOff += xBuf.Length;
- length -= xBuf.Length;
- byteCount += (uint)xBuf.Length;
- }
-
- // load in the remainder.
- while (length > 0)
- {
- Update(input[inOff]);
- inOff++;
- length--;
- }
- }
-
- // (i + 1 + 4(k - 1)) = 8i + k i = 0-3, k = 1-8
- private byte[] K = new byte[32];
-
- private byte[] P(byte[] input)
- {
- int fourK = 0;
- for(int k = 0; k < 8; k++)
- {
- K[fourK++] = input[k];
- K[fourK++] = input[8 + k];
- K[fourK++] = input[16 + k];
- K[fourK++] = input[24 + k];
- }
-
- return K;
- }
-
- //A (x) = (x0 ^ x1) || x3 || x2 || x1
- byte[] a = new byte[8];
- private byte[] A(byte[] input)
- {
- for(int j=0; j<8; j++)
- {
- a[j]=(byte)(input[j] ^ input[j+8]);
- }
-
- Array.Copy(input, 8, input, 0, 24);
- Array.Copy(a, 0, input, 24, 8);
-
- return input;
- }
-
- //Encrypt function, ECB mode
- private void E(byte[] key, byte[] s, int sOff, byte[] input, int inOff)
- {
- cipher.Init(true, new KeyParameter(key));
-
- cipher.ProcessBlock(input, inOff, s, sOff);
- }
-
- // (in:) n16||..||n1 ==> (out:) n1^n2^n3^n4^n13^n16||n16||..||n2
- internal short[] wS = new short[16], w_S = new short[16];
-
- private void fw(byte[] input)
- {
- cpyBytesToShort(input, wS);
- w_S[15] = (short)(wS[0] ^ wS[1] ^ wS[2] ^ wS[3] ^ wS[12] ^ wS[15]);
- Array.Copy(wS, 1, w_S, 0, 15);
- cpyShortToBytes(w_S, input);
- }
-
- // block processing
- internal byte[] S = new byte[32], U = new byte[32], V = new byte[32], W = new byte[32];
-
- private void processBlock(byte[] input, int inOff)
- {
- Array.Copy(input, inOff, M, 0, 32);
-
- //key step 1
-
- // H = h3 || h2 || h1 || h0
- // S = s3 || s2 || s1 || s0
- H.CopyTo(U, 0);
- M.CopyTo(V, 0);
- for (int j=0; j<32; j++)
- {
- W[j] = (byte)(U[j]^V[j]);
- }
- // Encrypt gost28147-ECB
- E(P(W), S, 0, H, 0); // s0 = EK0 [h0]
-
- //keys step 2,3,4
- for (int i=1; i<4; i++)
- {
- byte[] tmpA = A(U);
- for (int j=0; j<32; j++)
- {
- U[j] = (byte)(tmpA[j] ^ C[i][j]);
- }
- V = A(A(V));
- for (int j=0; j<32; j++)
- {
- W[j] = (byte)(U[j]^V[j]);
- }
- // Encrypt gost28147-ECB
- E(P(W), S, i * 8, H, i * 8); // si = EKi [hi]
- }
-
- // x(M, H) = y61(H^y(M^y12(S)))
- for(int n = 0; n < 12; n++)
- {
- fw(S);
- }
- for(int n = 0; n < 32; n++)
- {
- S[n] = (byte)(S[n] ^ M[n]);
- }
-
- fw(S);
-
- for(int n = 0; n < 32; n++)
- {
- S[n] = (byte)(H[n] ^ S[n]);
- }
- for(int n = 0; n < 61; n++)
- {
- fw(S);
- }
- Array.Copy(S, 0, H, 0, H.Length);
- }
-
- private void finish()
- {
- ulong bitCount = byteCount * 8;
- Pack.UInt64_To_LE(bitCount, L);
-
- while (xBufOff != 0)
- {
- Update((byte)0);
- }
-
- processBlock(L, 0);
- processBlock(Sum, 0);
- }
-
- public int DoFinal(
- byte[] output,
- int outOff)
- {
- finish();
-
- H.CopyTo(output, outOff);
-
- Reset();
-
- return DIGEST_LENGTH;
- }
-
- /**
- * reset the chaining variables to the IV values.
- */
- private static readonly byte[] C2 = {
- 0x00,(byte)0xFF,0x00,(byte)0xFF,0x00,(byte)0xFF,0x00,(byte)0xFF,
- (byte)0xFF,0x00,(byte)0xFF,0x00,(byte)0xFF,0x00,(byte)0xFF,0x00,
- 0x00,(byte)0xFF,(byte)0xFF,0x00,(byte)0xFF,0x00,0x00,(byte)0xFF,
- (byte)0xFF,0x00,0x00,0x00,(byte)0xFF,(byte)0xFF,0x00,(byte)0xFF
- };
-
- public void Reset()
- {
- byteCount = 0;
- xBufOff = 0;
-
- Array.Clear(H, 0, H.Length);
- Array.Clear(L, 0, L.Length);
- Array.Clear(M, 0, M.Length);
- Array.Clear(C[1], 0, C[1].Length); // real index C = +1 because index array with 0.
- Array.Clear(C[3], 0, C[3].Length);
- Array.Clear(Sum, 0, Sum.Length);
- Array.Clear(xBuf, 0, xBuf.Length);
-
- C2.CopyTo(C[2], 0);
- }
-
- // 256 bitsblock modul -> (Sum + a mod (2^256))
- private void sumByteArray(
- byte[] input)
- {
- int carry = 0;
-
- for (int i = 0; i != Sum.Length; i++)
- {
- int sum = (Sum[i] & 0xff) + (input[i] & 0xff) + carry;
-
- Sum[i] = (byte)sum;
-
- carry = sum >> 8;
- }
- }
-
- private static void cpyBytesToShort(byte[] S, short[] wS)
- {
- for(int i = 0; i < S.Length / 2; i++)
- {
- wS[i] = (short)(((S[i*2+1]<<8)&0xFF00)|(S[i*2]&0xFF));
- }
- }
-
- private static void cpyShortToBytes(short[] wS, byte[] S)
- {
- for(int i=0; i> 8);
- S[i*2] = (byte)wS[i];
- }
- }
-
- public int GetByteLength()
- {
- return 32;
- }
-
- public IMemoable Copy()
- {
- return new Gost3411Digest(this);
- }
-
- public void Reset(IMemoable other)
- {
- Gost3411Digest t = (Gost3411Digest)other;
-
- this.sBox = t.sBox;
- cipher.Init(true, new ParametersWithSBox(null, sBox));
-
- Reset();
-
- Array.Copy(t.H, 0, this.H, 0, t.H.Length);
- Array.Copy(t.L, 0, this.L, 0, t.L.Length);
- Array.Copy(t.M, 0, this.M, 0, t.M.Length);
- Array.Copy(t.Sum, 0, this.Sum, 0, t.Sum.Length);
- Array.Copy(t.C[1], 0, this.C[1], 0, t.C[1].Length);
- Array.Copy(t.C[2], 0, this.C[2], 0, t.C[2].Length);
- Array.Copy(t.C[3], 0, this.C[3], 0, t.C[3].Length);
- Array.Copy(t.xBuf, 0, this.xBuf, 0, t.xBuf.Length);
-
- this.xBufOff = t.xBufOff;
- this.byteCount = t.byteCount;
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/digests/GOST3411_2012Digest.cs b/BCCrypto/src/crypto/digests/GOST3411_2012Digest.cs
deleted file mode 100644
index 4395129..0000000
--- a/BCCrypto/src/crypto/digests/GOST3411_2012Digest.cs
+++ /dev/null
@@ -1,1036 +0,0 @@
-using System;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- public abstract class GOST3411_2012Digest:IDigest,IMemoable
- {
- private readonly byte[] IV = new byte[64];
- private readonly byte[] N = new byte[64];
- private readonly byte[] Sigma = new byte[64];
- private readonly byte[] Ki = new byte[64];
- private readonly byte[] m = new byte[64];
- private readonly byte[] h = new byte[64];
-
- // Temporary buffers
- private readonly byte[] tmp = new byte[64];
- private readonly byte[] block = new byte[64];
-
- private int bOff = 64;
-
- protected GOST3411_2012Digest(byte[] IV)
- {
- System.Array.Copy(IV,this.IV,64);
- System.Array.Copy(IV, h, 64);
- }
-
- public abstract string AlgorithmName { get; }
-
- public abstract IMemoable Copy();
-
- public virtual int DoFinal(byte[] output, int outOff)
- {
- int lenM = 64 - bOff;
-
- // At this point it is certain that lenM is smaller than 64
- for (int i = 0; i != 64 - lenM; i++)
- {
- m[i] = 0;
- }
-
- m[63 - lenM] = 1;
-
- if (bOff != 64)
- {
- System.Array.Copy(block, bOff, m, 64 - lenM, lenM);
- }
-
- g_N(h, N, m);
- addMod512(N, lenM * 8);
- addMod512(Sigma, m);
- g_N(h, Zero, N);
- g_N(h, Zero, Sigma);
-
- reverse(h, tmp);
-
- Array.Copy(tmp, 0, output, outOff, 64);
-
- Reset();
- return 64;
- }
-
- public int GetByteLength()
- {
- return 64;
- }
-
- public abstract int GetDigestSize();
-
-
- public void Reset()
- {
- bOff = 64;
- Arrays.Fill(N, (byte)0);
- Arrays.Fill(Sigma, (byte)0);
- System.Array.Copy(IV, 0, h, 0, 64);
- Arrays.Fill(block, (byte)0);
- }
-
- public void Reset(IMemoable other)
- {
- GOST3411_2012Digest o = (GOST3411_2012Digest)other;
-
- System.Array.Copy(o.IV, 0, this.IV, 0, 64);
- System.Array.Copy(o.N, 0, this.N, 0, 64);
- System.Array.Copy(o.Sigma, 0, this.Sigma, 0, 64);
- System.Array.Copy(o.Ki, 0, this.Ki, 0, 64);
- System.Array.Copy(o.m, 0, this.m, 0, 64);
- System.Array.Copy(o.h, 0, this.h, 0, 64);
-
- System.Array.Copy(o.block, 0, this.block, 0, 64);
- this.bOff = o.bOff;
- }
-
- public void Update(byte input)
- {
- block[--bOff] = input;
- if (bOff == 0)
- {
- g_N(h, N, block);
- addMod512(N, 512);
- addMod512(Sigma, block);
- bOff = 64;
- }
- }
-
-
- public void BlockUpdate(byte[] input, int inOff, int len)
- {
- while (bOff != 64 && len > 0)
- {
- Update(input[inOff++]);
- len--;
- }
- while (len >= 64)
- {
- System.Array.Copy(input, inOff, tmp, 0, 64);
- reverse(tmp, block);
- g_N(h, N, block);
- addMod512(N, 512);
- addMod512(Sigma, block);
-
- len -= 64;
- inOff += 64;
- }
- while (len > 0)
- {
- Update(input[inOff++]);
- len--;
- }
- }
-
-
-
-
- private void F(byte[] V)
- {
- ulong[] res = new ulong[8];
- ulong r;
-
- r = 0;
- r ^= T[0][(V[56] & 0xFF)];
- r ^= T[1][(V[48] & 0xFF)];
- r ^= T[2][(V[40] & 0xFF)];
- r ^= T[3][(V[32] & 0xFF)];
- r ^= T[4][(V[24] & 0xFF)];
- r ^= T[5][(V[16] & 0xFF)];
- r ^= T[6][(V[8] & 0xFF)];
- r ^= T[7][(V[0] & 0xFF)];
- res[0] = r;
-
- r = 0;
- r ^= T[0][(V[57] & 0xFF)];
- r ^= T[1][(V[49] & 0xFF)];
- r ^= T[2][(V[41] & 0xFF)];
- r ^= T[3][(V[33] & 0xFF)];
- r ^= T[4][(V[25] & 0xFF)];
- r ^= T[5][(V[17] & 0xFF)];
- r ^= T[6][(V[9] & 0xFF)];
- r ^= T[7][(V[1] & 0xFF)];
- res[1] = r;
-
- r = 0;
- r ^= T[0][(V[58] & 0xFF)];
- r ^= T[1][(V[50] & 0xFF)];
- r ^= T[2][(V[42] & 0xFF)];
- r ^= T[3][(V[34] & 0xFF)];
- r ^= T[4][(V[26] & 0xFF)];
- r ^= T[5][(V[18] & 0xFF)];
- r ^= T[6][(V[10] & 0xFF)];
- r ^= T[7][(V[2] & 0xFF)];
- res[2] = r;
-
- r = 0;
- r ^= T[0][(V[59] & 0xFF)];
- r ^= T[1][(V[51] & 0xFF)];
- r ^= T[2][(V[43] & 0xFF)];
- r ^= T[3][(V[35] & 0xFF)];
- r ^= T[4][(V[27] & 0xFF)];
- r ^= T[5][(V[19] & 0xFF)];
- r ^= T[6][(V[11] & 0xFF)];
- r ^= T[7][(V[3] & 0xFF)];
- res[3] = r;
-
- r = 0;
- r ^= T[0][(V[60] & 0xFF)];
- r ^= T[1][(V[52] & 0xFF)];
- r ^= T[2][(V[44] & 0xFF)];
- r ^= T[3][(V[36] & 0xFF)];
- r ^= T[4][(V[28] & 0xFF)];
- r ^= T[5][(V[20] & 0xFF)];
- r ^= T[6][(V[12] & 0xFF)];
- r ^= T[7][(V[4] & 0xFF)];
- res[4] = r;
-
- r = 0;
- r ^= T[0][(V[61] & 0xFF)];
- r ^= T[1][(V[53] & 0xFF)];
- r ^= T[2][(V[45] & 0xFF)];
- r ^= T[3][(V[37] & 0xFF)];
- r ^= T[4][(V[29] & 0xFF)];
- r ^= T[5][(V[21] & 0xFF)];
- r ^= T[6][(V[13] & 0xFF)];
- r ^= T[7][(V[5] & 0xFF)];
- res[5] = r;
-
- r = 0;
- r ^= T[0][(V[62] & 0xFF)];
- r ^= T[1][(V[54] & 0xFF)];
- r ^= T[2][(V[46] & 0xFF)];
- r ^= T[3][(V[38] & 0xFF)];
- r ^= T[4][(V[30] & 0xFF)];
- r ^= T[5][(V[22] & 0xFF)];
- r ^= T[6][(V[14] & 0xFF)];
- r ^= T[7][(V[6] & 0xFF)];
- res[6] = r;
-
- r = 0;
- r ^= T[0][(V[63] & 0xFF)];
- r ^= T[1][(V[55] & 0xFF)];
- r ^= T[2][(V[47] & 0xFF)];
- r ^= T[3][(V[39] & 0xFF)];
- r ^= T[4][(V[31] & 0xFF)];
- r ^= T[5][(V[23] & 0xFF)];
- r ^= T[6][(V[15] & 0xFF)];
- r ^= T[7][(V[7] & 0xFF)];
- res[7] = r;
-
- r = res[0];
- V[7] = (byte)(r >> 56);
- V[6] = (byte)(r >> 48);
- V[5] = (byte)(r >> 40);
- V[4] = (byte)(r >> 32);
- V[3] = (byte)(r >> 24);
- V[2] = (byte)(r >> 16);
- V[1] = (byte)(r >> 8);
- V[0] = (byte)(r);
-
- r = res[1];
- V[15] = (byte)(r >> 56);
- V[14] = (byte)(r >> 48);
- V[13] = (byte)(r >> 40);
- V[12] = (byte)(r >> 32);
- V[11] = (byte)(r >> 24);
- V[10] = (byte)(r >> 16);
- V[9] = (byte)(r >> 8);
- V[8] = (byte)(r);
-
- r = res[2];
- V[23] = (byte)(r >> 56);
- V[22] = (byte)(r >> 48);
- V[21] = (byte)(r >> 40);
- V[20] = (byte)(r >> 32);
- V[19] = (byte)(r >> 24);
- V[18] = (byte)(r >> 16);
- V[17] = (byte)(r >> 8);
- V[16] = (byte)(r);
-
- r = res[3];
- V[31] = (byte)(r >> 56);
- V[30] = (byte)(r >> 48);
- V[29] = (byte)(r >> 40);
- V[28] = (byte)(r >> 32);
- V[27] = (byte)(r >> 24);
- V[26] = (byte)(r >> 16);
- V[25] = (byte)(r >> 8);
- V[24] = (byte)(r);
-
- r = res[4];
- V[39] = (byte)(r >> 56);
- V[38] = (byte)(r >> 48);
- V[37] = (byte)(r >> 40);
- V[36] = (byte)(r >> 32);
- V[35] = (byte)(r >> 24);
- V[34] = (byte)(r >> 16);
- V[33] = (byte)(r >> 8);
- V[32] = (byte)(r);
-
- r = res[5];
- V[47] = (byte)(r >> 56);
- V[46] = (byte)(r >> 48);
- V[45] = (byte)(r >> 40);
- V[44] = (byte)(r >> 32);
- V[43] = (byte)(r >> 24);
- V[42] = (byte)(r >> 16);
- V[41] = (byte)(r >> 8);
- V[40] = (byte)(r);
-
- r = res[6];
- V[55] = (byte)(r >> 56);
- V[54] = (byte)(r >> 48);
- V[53] = (byte)(r >> 40);
- V[52] = (byte)(r >> 32);
- V[51] = (byte)(r >> 24);
- V[50] = (byte)(r >> 16);
- V[49] = (byte)(r >> 8);
- V[48] = (byte)(r);
-
- r = res[7];
- V[63] = (byte)(r >> 56);
- V[62] = (byte)(r >> 48);
- V[61] = (byte)(r >> 40);
- V[60] = (byte)(r >> 32);
- V[59] = (byte)(r >> 24);
- V[58] = (byte)(r >> 16);
- V[57] = (byte)(r >> 8);
- V[56] = (byte)(r);
- }
-
- private void xor512(byte[] A, byte[] B)
- {
- for (int i = 0; i < 64; ++i)
- {
- A[i] ^= B[i];
- }
- }
-
- private void E(byte[] K, byte[] m)
- {
- System.Array.Copy(K, 0, Ki, 0, 64);
- xor512(K, m);
- F(K);
- for (int i = 0; i < 11; ++i)
- {
- xor512(Ki, C[i]);
- F(Ki);
- xor512(K, Ki);
- F(K);
- }
- xor512(Ki, C[11]);
- F(Ki);
- xor512(K, Ki);
- }
-
- private void g_N(byte[] h, byte[] N, byte[] m)
- {
- System.Array.Copy(h, 0, tmp, 0, 64);
-
- xor512(h, N);
- F(h);
-
- E(h, m);
- xor512(h, tmp);
- xor512(h, m);
- }
-
- private void addMod512(byte[] A, int num)
- {
- int c;
- c = (A[63] & 0xFF) + (num & 0xFF);
- A[63] = (byte)c;
-
- c = (A[62] & 0xFF) + ((num >> 8) & 0xFF) + (c >> 8);
- A[62] = (byte)c;
-
- for (int i = 61; (i >= 0) && (c > 0); --i)
- {
- c = (A[i] & 0xFF) + (c >> 8);
- A[i] = (byte)c;
- }
- }
-
- private void addMod512(byte[] A, byte[] B)
- {
- for (int c = 0, i = 63; i >= 0; --i)
- {
- c = (A[i] & 0xFF) + (B[i] & 0xFF) + (c >> 8);
- A[i] = (byte)c;
- }
- }
-
- private void reverse(byte[] src, byte[] dst)
- {
- int len = src.Length;
- for (int i = 0; i < len; i++)
- {
- dst[len - 1 - i] = src[i];
- }
- }
-
- private static readonly byte[][] C = new byte[][]{ new byte[]{
- (byte)0xb1, (byte)0x08, (byte)0x5b, (byte)0xda, (byte)0x1e, (byte)0xca, (byte)0xda, (byte)0xe9,
- (byte)0xeb, (byte)0xcb, (byte)0x2f, (byte)0x81, (byte)0xc0, (byte)0x65, (byte)0x7c, (byte)0x1f,
- (byte)0x2f, (byte)0x6a, (byte)0x76, (byte)0x43, (byte)0x2e, (byte)0x45, (byte)0xd0, (byte)0x16,
- (byte)0x71, (byte)0x4e, (byte)0xb8, (byte)0x8d, (byte)0x75, (byte)0x85, (byte)0xc4, (byte)0xfc,
- (byte)0x4b, (byte)0x7c, (byte)0xe0, (byte)0x91, (byte)0x92, (byte)0x67, (byte)0x69, (byte)0x01,
- (byte)0xa2, (byte)0x42, (byte)0x2a, (byte)0x08, (byte)0xa4, (byte)0x60, (byte)0xd3, (byte)0x15,
- (byte)0x05, (byte)0x76, (byte)0x74, (byte)0x36, (byte)0xcc, (byte)0x74, (byte)0x4d, (byte)0x23,
- (byte)0xdd, (byte)0x80, (byte)0x65, (byte)0x59, (byte)0xf2, (byte)0xa6, (byte)0x45, (byte)0x07},
-
- new byte[]{
- (byte)0x6f, (byte)0xa3, (byte)0xb5, (byte)0x8a, (byte)0xa9, (byte)0x9d, (byte)0x2f, (byte)0x1a,
- (byte)0x4f, (byte)0xe3, (byte)0x9d, (byte)0x46, (byte)0x0f, (byte)0x70, (byte)0xb5, (byte)0xd7,
- (byte)0xf3, (byte)0xfe, (byte)0xea, (byte)0x72, (byte)0x0a, (byte)0x23, (byte)0x2b, (byte)0x98,
- (byte)0x61, (byte)0xd5, (byte)0x5e, (byte)0x0f, (byte)0x16, (byte)0xb5, (byte)0x01, (byte)0x31,
- (byte)0x9a, (byte)0xb5, (byte)0x17, (byte)0x6b, (byte)0x12, (byte)0xd6, (byte)0x99, (byte)0x58,
- (byte)0x5c, (byte)0xb5, (byte)0x61, (byte)0xc2, (byte)0xdb, (byte)0x0a, (byte)0xa7, (byte)0xca,
- (byte)0x55, (byte)0xdd, (byte)0xa2, (byte)0x1b, (byte)0xd7, (byte)0xcb, (byte)0xcd, (byte)0x56,
- (byte)0xe6, (byte)0x79, (byte)0x04, (byte)0x70, (byte)0x21, (byte)0xb1, (byte)0x9b, (byte)0xb7},
- new byte[]{
- (byte)0xf5, (byte)0x74, (byte)0xdc, (byte)0xac, (byte)0x2b, (byte)0xce, (byte)0x2f, (byte)0xc7,
- (byte)0x0a, (byte)0x39, (byte)0xfc, (byte)0x28, (byte)0x6a, (byte)0x3d, (byte)0x84, (byte)0x35,
- (byte)0x06, (byte)0xf1, (byte)0x5e, (byte)0x5f, (byte)0x52, (byte)0x9c, (byte)0x1f, (byte)0x8b,
- (byte)0xf2, (byte)0xea, (byte)0x75, (byte)0x14, (byte)0xb1, (byte)0x29, (byte)0x7b, (byte)0x7b,
- (byte)0xd3, (byte)0xe2, (byte)0x0f, (byte)0xe4, (byte)0x90, (byte)0x35, (byte)0x9e, (byte)0xb1,
- (byte)0xc1, (byte)0xc9, (byte)0x3a, (byte)0x37, (byte)0x60, (byte)0x62, (byte)0xdb, (byte)0x09,
- (byte)0xc2, (byte)0xb6, (byte)0xf4, (byte)0x43, (byte)0x86, (byte)0x7a, (byte)0xdb, (byte)0x31,
- (byte)0x99, (byte)0x1e, (byte)0x96, (byte)0xf5, (byte)0x0a, (byte)0xba, (byte)0x0a, (byte)0xb2},
- new byte[]{
- (byte)0xef, (byte)0x1f, (byte)0xdf, (byte)0xb3, (byte)0xe8, (byte)0x15, (byte)0x66, (byte)0xd2,
- (byte)0xf9, (byte)0x48, (byte)0xe1, (byte)0xa0, (byte)0x5d, (byte)0x71, (byte)0xe4, (byte)0xdd,
- (byte)0x48, (byte)0x8e, (byte)0x85, (byte)0x7e, (byte)0x33, (byte)0x5c, (byte)0x3c, (byte)0x7d,
- (byte)0x9d, (byte)0x72, (byte)0x1c, (byte)0xad, (byte)0x68, (byte)0x5e, (byte)0x35, (byte)0x3f,
- (byte)0xa9, (byte)0xd7, (byte)0x2c, (byte)0x82, (byte)0xed, (byte)0x03, (byte)0xd6, (byte)0x75,
- (byte)0xd8, (byte)0xb7, (byte)0x13, (byte)0x33, (byte)0x93, (byte)0x52, (byte)0x03, (byte)0xbe,
- (byte)0x34, (byte)0x53, (byte)0xea, (byte)0xa1, (byte)0x93, (byte)0xe8, (byte)0x37, (byte)0xf1,
- (byte)0x22, (byte)0x0c, (byte)0xbe, (byte)0xbc, (byte)0x84, (byte)0xe3, (byte)0xd1, (byte)0x2e},
- new byte[] {
- (byte)0x4b, (byte)0xea, (byte)0x6b, (byte)0xac, (byte)0xad, (byte)0x47, (byte)0x47, (byte)0x99,
- (byte)0x9a, (byte)0x3f, (byte)0x41, (byte)0x0c, (byte)0x6c, (byte)0xa9, (byte)0x23, (byte)0x63,
- (byte)0x7f, (byte)0x15, (byte)0x1c, (byte)0x1f, (byte)0x16, (byte)0x86, (byte)0x10, (byte)0x4a,
- (byte)0x35, (byte)0x9e, (byte)0x35, (byte)0xd7, (byte)0x80, (byte)0x0f, (byte)0xff, (byte)0xbd,
- (byte)0xbf, (byte)0xcd, (byte)0x17, (byte)0x47, (byte)0x25, (byte)0x3a, (byte)0xf5, (byte)0xa3,
- (byte)0xdf, (byte)0xff, (byte)0x00, (byte)0xb7, (byte)0x23, (byte)0x27, (byte)0x1a, (byte)0x16,
- (byte)0x7a, (byte)0x56, (byte)0xa2, (byte)0x7e, (byte)0xa9, (byte)0xea, (byte)0x63, (byte)0xf5,
- (byte)0x60, (byte)0x17, (byte)0x58, (byte)0xfd, (byte)0x7c, (byte)0x6c, (byte)0xfe, (byte)0x57},
- new byte[]{
- (byte)0xae, (byte)0x4f, (byte)0xae, (byte)0xae, (byte)0x1d, (byte)0x3a, (byte)0xd3, (byte)0xd9,
- (byte)0x6f, (byte)0xa4, (byte)0xc3, (byte)0x3b, (byte)0x7a, (byte)0x30, (byte)0x39, (byte)0xc0,
- (byte)0x2d, (byte)0x66, (byte)0xc4, (byte)0xf9, (byte)0x51, (byte)0x42, (byte)0xa4, (byte)0x6c,
- (byte)0x18, (byte)0x7f, (byte)0x9a, (byte)0xb4, (byte)0x9a, (byte)0xf0, (byte)0x8e, (byte)0xc6,
- (byte)0xcf, (byte)0xfa, (byte)0xa6, (byte)0xb7, (byte)0x1c, (byte)0x9a, (byte)0xb7, (byte)0xb4,
- (byte)0x0a, (byte)0xf2, (byte)0x1f, (byte)0x66, (byte)0xc2, (byte)0xbe, (byte)0xc6, (byte)0xb6,
- (byte)0xbf, (byte)0x71, (byte)0xc5, (byte)0x72, (byte)0x36, (byte)0x90, (byte)0x4f, (byte)0x35,
- (byte)0xfa, (byte)0x68, (byte)0x40, (byte)0x7a, (byte)0x46, (byte)0x64, (byte)0x7d, (byte)0x6e},
- new byte[] {
- (byte)0xf4, (byte)0xc7, (byte)0x0e, (byte)0x16, (byte)0xee, (byte)0xaa, (byte)0xc5, (byte)0xec,
- (byte)0x51, (byte)0xac, (byte)0x86, (byte)0xfe, (byte)0xbf, (byte)0x24, (byte)0x09, (byte)0x54,
- (byte)0x39, (byte)0x9e, (byte)0xc6, (byte)0xc7, (byte)0xe6, (byte)0xbf, (byte)0x87, (byte)0xc9,
- (byte)0xd3, (byte)0x47, (byte)0x3e, (byte)0x33, (byte)0x19, (byte)0x7a, (byte)0x93, (byte)0xc9,
- (byte)0x09, (byte)0x92, (byte)0xab, (byte)0xc5, (byte)0x2d, (byte)0x82, (byte)0x2c, (byte)0x37,
- (byte)0x06, (byte)0x47, (byte)0x69, (byte)0x83, (byte)0x28, (byte)0x4a, (byte)0x05, (byte)0x04,
- (byte)0x35, (byte)0x17, (byte)0x45, (byte)0x4c, (byte)0xa2, (byte)0x3c, (byte)0x4a, (byte)0xf3,
- (byte)0x88, (byte)0x86, (byte)0x56, (byte)0x4d, (byte)0x3a, (byte)0x14, (byte)0xd4, (byte)0x93},
- new byte[] {
- (byte)0x9b, (byte)0x1f, (byte)0x5b, (byte)0x42, (byte)0x4d, (byte)0x93, (byte)0xc9, (byte)0xa7,
- (byte)0x03, (byte)0xe7, (byte)0xaa, (byte)0x02, (byte)0x0c, (byte)0x6e, (byte)0x41, (byte)0x41,
- (byte)0x4e, (byte)0xb7, (byte)0xf8, (byte)0x71, (byte)0x9c, (byte)0x36, (byte)0xde, (byte)0x1e,
- (byte)0x89, (byte)0xb4, (byte)0x44, (byte)0x3b, (byte)0x4d, (byte)0xdb, (byte)0xc4, (byte)0x9a,
- (byte)0xf4, (byte)0x89, (byte)0x2b, (byte)0xcb, (byte)0x92, (byte)0x9b, (byte)0x06, (byte)0x90,
- (byte)0x69, (byte)0xd1, (byte)0x8d, (byte)0x2b, (byte)0xd1, (byte)0xa5, (byte)0xc4, (byte)0x2f,
- (byte)0x36, (byte)0xac, (byte)0xc2, (byte)0x35, (byte)0x59, (byte)0x51, (byte)0xa8, (byte)0xd9,
- (byte)0xa4, (byte)0x7f, (byte)0x0d, (byte)0xd4, (byte)0xbf, (byte)0x02, (byte)0xe7, (byte)0x1e},
- new byte[]{
- (byte)0x37, (byte)0x8f, (byte)0x5a, (byte)0x54, (byte)0x16, (byte)0x31, (byte)0x22, (byte)0x9b,
- (byte)0x94, (byte)0x4c, (byte)0x9a, (byte)0xd8, (byte)0xec, (byte)0x16, (byte)0x5f, (byte)0xde,
- (byte)0x3a, (byte)0x7d, (byte)0x3a, (byte)0x1b, (byte)0x25, (byte)0x89, (byte)0x42, (byte)0x24,
- (byte)0x3c, (byte)0xd9, (byte)0x55, (byte)0xb7, (byte)0xe0, (byte)0x0d, (byte)0x09, (byte)0x84,
- (byte)0x80, (byte)0x0a, (byte)0x44, (byte)0x0b, (byte)0xdb, (byte)0xb2, (byte)0xce, (byte)0xb1,
- (byte)0x7b, (byte)0x2b, (byte)0x8a, (byte)0x9a, (byte)0xa6, (byte)0x07, (byte)0x9c, (byte)0x54,
- (byte)0x0e, (byte)0x38, (byte)0xdc, (byte)0x92, (byte)0xcb, (byte)0x1f, (byte)0x2a, (byte)0x60,
- (byte)0x72, (byte)0x61, (byte)0x44, (byte)0x51, (byte)0x83, (byte)0x23, (byte)0x5a, (byte)0xdb},
- new byte[] {
- (byte)0xab, (byte)0xbe, (byte)0xde, (byte)0xa6, (byte)0x80, (byte)0x05, (byte)0x6f, (byte)0x52,
- (byte)0x38, (byte)0x2a, (byte)0xe5, (byte)0x48, (byte)0xb2, (byte)0xe4, (byte)0xf3, (byte)0xf3,
- (byte)0x89, (byte)0x41, (byte)0xe7, (byte)0x1c, (byte)0xff, (byte)0x8a, (byte)0x78, (byte)0xdb,
- (byte)0x1f, (byte)0xff, (byte)0xe1, (byte)0x8a, (byte)0x1b, (byte)0x33, (byte)0x61, (byte)0x03,
- (byte)0x9f, (byte)0xe7, (byte)0x67, (byte)0x02, (byte)0xaf, (byte)0x69, (byte)0x33, (byte)0x4b,
- (byte)0x7a, (byte)0x1e, (byte)0x6c, (byte)0x30, (byte)0x3b, (byte)0x76, (byte)0x52, (byte)0xf4,
- (byte)0x36, (byte)0x98, (byte)0xfa, (byte)0xd1, (byte)0x15, (byte)0x3b, (byte)0xb6, (byte)0xc3,
- (byte)0x74, (byte)0xb4, (byte)0xc7, (byte)0xfb, (byte)0x98, (byte)0x45, (byte)0x9c, (byte)0xed},
- new byte[] {
- (byte)0x7b, (byte)0xcd, (byte)0x9e, (byte)0xd0, (byte)0xef, (byte)0xc8, (byte)0x89, (byte)0xfb,
- (byte)0x30, (byte)0x02, (byte)0xc6, (byte)0xcd, (byte)0x63, (byte)0x5a, (byte)0xfe, (byte)0x94,
- (byte)0xd8, (byte)0xfa, (byte)0x6b, (byte)0xbb, (byte)0xeb, (byte)0xab, (byte)0x07, (byte)0x61,
- (byte)0x20, (byte)0x01, (byte)0x80, (byte)0x21, (byte)0x14, (byte)0x84, (byte)0x66, (byte)0x79,
- (byte)0x8a, (byte)0x1d, (byte)0x71, (byte)0xef, (byte)0xea, (byte)0x48, (byte)0xb9, (byte)0xca,
- (byte)0xef, (byte)0xba, (byte)0xcd, (byte)0x1d, (byte)0x7d, (byte)0x47, (byte)0x6e, (byte)0x98,
- (byte)0xde, (byte)0xa2, (byte)0x59, (byte)0x4a, (byte)0xc0, (byte)0x6f, (byte)0xd8, (byte)0x5d,
- (byte)0x6b, (byte)0xca, (byte)0xa4, (byte)0xcd, (byte)0x81, (byte)0xf3, (byte)0x2d, (byte)0x1b},
- new byte[] {
- (byte)0x37, (byte)0x8e, (byte)0xe7, (byte)0x67, (byte)0xf1, (byte)0x16, (byte)0x31, (byte)0xba,
- (byte)0xd2, (byte)0x13, (byte)0x80, (byte)0xb0, (byte)0x04, (byte)0x49, (byte)0xb1, (byte)0x7a,
- (byte)0xcd, (byte)0xa4, (byte)0x3c, (byte)0x32, (byte)0xbc, (byte)0xdf, (byte)0x1d, (byte)0x77,
- (byte)0xf8, (byte)0x20, (byte)0x12, (byte)0xd4, (byte)0x30, (byte)0x21, (byte)0x9f, (byte)0x9b,
- (byte)0x5d, (byte)0x80, (byte)0xef, (byte)0x9d, (byte)0x18, (byte)0x91, (byte)0xcc, (byte)0x86,
- (byte)0xe7, (byte)0x1d, (byte)0xa4, (byte)0xaa, (byte)0x88, (byte)0xe1, (byte)0x28, (byte)0x52,
- (byte)0xfa, (byte)0xf4, (byte)0x17, (byte)0xd5, (byte)0xd9, (byte)0xb2, (byte)0x1b, (byte)0x99,
- (byte)0x48, (byte)0xbc, (byte)0x92, (byte)0x4a, (byte)0xf1, (byte)0x1b, (byte)0xd7, (byte)0x20}
- };
-
- private static readonly byte[] Zero = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
-
- private readonly static ulong[][] T = {
- new ulong[] {
- 0xE6F87E5C5B711FD0L, 0x258377800924FA16L, 0xC849E07E852EA4A8L, 0x5B4686A18F06C16AL,
- 0x0B32E9A2D77B416EL, 0xABDA37A467815C66L, 0xF61796A81A686676L, 0xF5DC0B706391954BL,
- 0x4862F38DB7E64BF1L, 0xFF5C629A68BD85C5L, 0xCB827DA6FCD75795L, 0x66D36DAF69B9F089L,
- 0x356C9F74483D83B0L, 0x7CBCECB1238C99A1L, 0x36A702AC31C4708DL, 0x9EB6A8D02FBCDFD6L,
- 0x8B19FA51E5B3AE37L, 0x9CCFB5408A127D0BL, 0xBC0C78B508208F5AL, 0xE533E3842288ECEDL,
- 0xCEC2C7D377C15FD2L, 0xEC7817B6505D0F5EL, 0xB94CC2C08336871DL, 0x8C205DB4CB0B04ADL,
- 0x763C855B28A0892FL, 0x588D1B79F6FF3257L, 0x3FECF69E4311933EL, 0x0FC0D39F803A18C9L,
- 0xEE010A26F5F3AD83L, 0x10EFE8F4411979A6L, 0x5DCDA10C7DE93A10L, 0x4A1BEE1D1248E92CL,
- 0x53BFF2DB21847339L, 0xB4F50CCFA6A23D09L, 0x5FB4BC9CD84798CDL, 0xE88A2D8B071C56F9L,
- 0x7F7771695A756A9CL, 0xC5F02E71A0BA1EBCL, 0xA663F9AB4215E672L, 0x2EB19E22DE5FBB78L,
- 0x0DB9CE0F2594BA14L, 0x82520E6397664D84L, 0x2F031E6A0208EA98L, 0x5C7F2144A1BE6BF0L,
- 0x7A37CB1CD16362DBL, 0x83E08E2B4B311C64L, 0xCF70479BAB960E32L, 0x856BA986B9DEE71EL,
- 0xB5478C877AF56CE9L, 0xB8FE42885F61D6FDL, 0x1BDD0156966238C8L, 0x622157923EF8A92EL,
- 0xFC97FF42114476F8L, 0x9D7D350856452CEBL, 0x4C90C9B0E0A71256L, 0x2308502DFBCB016CL,
- 0x2D7A03FAA7A64845L, 0xF46E8B38BFC6C4ABL, 0xBDBEF8FDD477DEBAL, 0x3AAC4CEBC8079B79L,
- 0xF09CB105E8879D0CL, 0x27FA6A10AC8A58CBL, 0x8960E7C1401D0CEAL, 0x1A6F811E4A356928L,
- 0x90C4FB0773D196FFL, 0x43501A2F609D0A9FL, 0xF7A516E0C63F3796L, 0x1CE4A6B3B8DA9252L,
- 0x1324752C38E08A9BL, 0xA5A864733BEC154FL, 0x2BF124575549B33FL, 0xD766DB15440DC5C7L,
- 0xA7D179E39E42B792L, 0xDADF151A61997FD3L, 0x86A0345EC0271423L, 0x38D5517B6DA939A4L,
- 0x6518F077104003B4L, 0x02791D90A5AEA2DDL, 0x88D267899C4A5D0AL, 0x930F66DF0A2865C2L,
- 0x4EE9D4204509B08BL, 0x325538916685292AL, 0x412907BFC533A842L, 0xB27E2B62544DC673L,
- 0x6C5304456295E007L, 0x5AF406E95351908AL, 0x1F2F3B6BC123616FL, 0xC37B09DC5255E5C6L,
- 0x3967D133B1FE6844L, 0x298839C7F0E711E2L, 0x409B87F71964F9A2L, 0xE938ADC3DB4B0719L,
- 0x0C0B4E47F9C3EBF4L, 0x5534D576D36B8843L, 0x4610A05AEB8B02D8L, 0x20C3CDF58232F251L,
- 0x6DE1840DBEC2B1E7L, 0xA0E8DE06B0FA1D08L, 0x7B854B540D34333BL, 0x42E29A67BCCA5B7FL,
- 0xD8A6088AC437DD0EL, 0xC63BB3A9D943ED81L, 0x21714DBD5E65A3B1L, 0x6761EDE7B5EEA169L,
- 0x2431F7C8D573ABF6L, 0xD51FC685E1A3671AL, 0x5E063CD40410C92DL, 0x283AB98F2CB04002L,
- 0x8FEBC06CB2F2F790L, 0x17D64F116FA1D33CL, 0xE07359F1A99EE4AAL, 0x784ED68C74CDC006L,
- 0x6E2A19D5C73B42DAL, 0x8712B4161C7045C3L, 0x371582E4ED93216DL, 0xACE390414939F6FCL,
- 0x7EC5F12186223B7CL, 0xC0B094042BAC16FBL, 0xF9D745379A527EBFL, 0x737C3F2EA3B68168L,
- 0x33E7B8D9BAD278CAL, 0xA9A32A34C22FFEBBL, 0xE48163CCFEDFBD0DL, 0x8E5940246EA5A670L,
- 0x51C6EF4B842AD1E4L, 0x22BAD065279C508CL, 0xD91488C218608CEEL, 0x319EA5491F7CDA17L,
- 0xD394E128134C9C60L, 0x094BF43272D5E3B3L, 0x9BF612A5A4AAD791L, 0xCCBBDA43D26FFD0FL,
- 0x34DE1F3C946AD250L, 0x4F5B5468995EE16BL, 0xDF9FAF6FEA8F7794L, 0x2648EA5870DD092BL,
- 0xBFC7E56D71D97C67L, 0xDDE6B2FF4F21D549L, 0x3C276B463AE86003L, 0x91767B4FAF86C71FL,
- 0x68A13E7835D4B9A0L, 0xB68C115F030C9FD4L, 0x141DD2C916582001L, 0x983D8F7DDD5324ACL,
- 0x64AA703FCC175254L, 0xC2C989948E02B426L, 0x3E5E76D69F46C2DEL, 0x50746F03587D8004L,
- 0x45DB3D829272F1E5L, 0x60584A029B560BF3L, 0xFBAE58A73FFCDC62L, 0xA15A5E4E6CAD4CE8L,
- 0x4BA96E55CE1FB8CCL, 0x08F9747AAE82B253L, 0xC102144CF7FB471BL, 0x9F042898F3EB8E36L,
- 0x068B27ADF2EFFB7AL, 0xEDCA97FE8C0A5EBEL, 0x778E0513F4F7D8CFL, 0x302C2501C32B8BF7L,
- 0x8D92DDFC175C554DL, 0xF865C57F46052F5FL, 0xEAF3301BA2B2F424L, 0xAA68B7ECBBD60D86L,
- 0x998F0F350104754CL, 0x0000000000000000L, 0xF12E314D34D0CCECL, 0x710522BE061823B5L,
- 0xAF280D9930C005C1L, 0x97FD5CE25D693C65L, 0x19A41CC633CC9A15L, 0x95844172F8C79EB8L,
- 0xDC5432B7937684A9L, 0x9436C13A2490CF58L, 0x802B13F332C8EF59L, 0xC442AE397CED4F5CL,
- 0xFA1CD8EFE3AB8D82L, 0xF2E5AC954D293FD1L, 0x6AD823E8907A1B7DL, 0x4D2249F83CF043B6L,
- 0x03CB9DD879F9F33DL, 0xDE2D2F2736D82674L, 0x2A43A41F891EE2DFL, 0x6F98999D1B6C133AL,
- 0xD4AD46CD3DF436FAL, 0xBB35DF50269825C0L, 0x964FDCAA813E6D85L, 0xEB41B0537EE5A5C4L,
- 0x0540BA758B160847L, 0xA41AE43BE7BB44AFL, 0xE3B8C429D0671797L, 0x819993BBEE9FBEB9L,
- 0xAE9A8DD1EC975421L, 0xF3572CDD917E6E31L, 0x6393D7DAE2AFF8CEL, 0x47A2201237DC5338L,
- 0xA32343DEC903EE35L, 0x79FC56C4A89A91E6L, 0x01B28048DC5751E0L, 0x1296F564E4B7DB7BL,
- 0x75F7188351597A12L, 0xDB6D9552BDCE2E33L, 0x1E9DBB231D74308FL, 0x520D7293FDD322D9L,
- 0xE20A44610C304677L, 0xFEEEE2D2B4EAD425L, 0xCA30FDEE20800675L, 0x61EACA4A47015A13L,
- 0xE74AFE1487264E30L, 0x2CC883B27BF119A5L, 0x1664CF59B3F682DCL, 0xA811AA7C1E78AF5BL,
- 0x1D5626FB648DC3B2L, 0xB73E9117DF5BCE34L, 0xD05F7CF06AB56F5DL, 0xFD257F0ACD132718L,
- 0x574DC8E676C52A9EL, 0x0739A7E52EB8AA9AL, 0x5486553E0F3CD9A3L, 0x56FF48AEAA927B7EL,
- 0xBE756525AD8E2D87L, 0x7D0E6CF9FFDBC841L, 0x3B1ECCA31450CA99L, 0x6913BE30E983E840L,
- 0xAD511009956EA71CL, 0xB1B5B6BA2DB4354EL, 0x4469BDCA4E25A005L, 0x15AF5281CA0F71E1L,
- 0x744598CB8D0E2BF2L, 0x593F9B312AA863B7L, 0xEFB38A6E29A4FC63L, 0x6B6AA3A04C2D4A9DL,
- 0x3D95EB0EE6BF31E3L, 0xA291C3961554BFD5L, 0x18169C8EEF9BCBF5L, 0x115D68BC9D4E2846L,
- 0xBA875F18FACF7420L, 0xD1EDFCB8B6E23EBDL, 0xB00736F2F1E364AEL, 0x84D929CE6589B6FEL,
- 0x70B7A2F6DA4F7255L, 0x0E7253D75C6D4929L, 0x04F23A3D574159A7L, 0x0A8069EA0B2C108EL,
- 0x49D073C56BB11A11L, 0x8AAB7A1939E4FFD7L, 0xCD095A0B0E38ACEFL, 0xC9FB60365979F548L,
- 0x92BDE697D67F3422L, 0xC78933E10514BC61L, 0xE1C1D9B975C9B54AL, 0xD2266160CF1BCD80L,
- 0x9A4492ED78FD8671L, 0xB3CCAB2A881A9793L, 0x72CEBF667FE1D088L, 0xD6D45B5D985A9427L
- },
- new ulong[]{
- 0xC811A8058C3F55DEL, 0x65F5B43196B50619L, 0xF74F96B1D6706E43L, 0x859D1E8BCB43D336L,
- 0x5AAB8A85CCFA3D84L, 0xF9C7BF99C295FCFDL, 0xA21FD5A1DE4B630FL, 0xCDB3EF763B8B456DL,
- 0x803F59F87CF7C385L, 0xB27C73BE5F31913CL, 0x98E3AC6633B04821L, 0xBF61674C26B8F818L,
- 0x0FFBC995C4C130C8L, 0xAAA0862010761A98L, 0x6057F342210116AAL, 0xF63C760C0654CC35L,
- 0x2DDB45CC667D9042L, 0xBCF45A964BD40382L, 0x68E8A0C3EF3C6F3DL, 0xA7BD92D269FF73BCL,
- 0x290AE20201ED2287L, 0xB7DE34CDE885818FL, 0xD901EEA7DD61059BL, 0xD6FA273219A03553L,
- 0xD56F1AE874CCCEC9L, 0xEA31245C2E83F554L, 0x7034555DA07BE499L, 0xCE26D2AC56E7BEF7L,
- 0xFD161857A5054E38L, 0x6A0E7DA4527436D1L, 0x5BD86A381CDE9FF2L, 0xCAF7756231770C32L,
- 0xB09AAED9E279C8D0L, 0x5DEF1091C60674DBL, 0x111046A2515E5045L, 0x23536CE4729802FCL,
- 0xC50CBCF7F5B63CFAL, 0x73A16887CD171F03L, 0x7D2941AFD9F28DBDL, 0x3F5E3EB45A4F3B9DL,
- 0x84EEFE361B677140L, 0x3DB8E3D3E7076271L, 0x1A3A28F9F20FD248L, 0x7EBC7C75B49E7627L,
- 0x74E5F293C7EB565CL, 0x18DCF59E4F478BA4L, 0x0C6EF44FA9ADCB52L, 0xC699812D98DAC760L,
- 0x788B06DC6E469D0EL, 0xFC65F8EA7521EC4EL, 0x30A5F7219E8E0B55L, 0x2BEC3F65BCA57B6BL,
- 0xDDD04969BAF1B75EL, 0x99904CDBE394EA57L, 0x14B201D1E6EA40F6L, 0xBBB0C08241284ADDL,
- 0x50F20463BF8F1DFFL, 0xE8D7F93B93CBACB8L, 0x4D8CB68E477C86E8L, 0xC1DD1B3992268E3FL,
- 0x7C5AA11209D62FCBL, 0x2F3D98ABDB35C9AEL, 0x671369562BFD5FF5L, 0x15C1E16C36CEE280L,
- 0x1D7EB2EDF8F39B17L, 0xDA94D37DB00DFE01L, 0x877BC3EC760B8ADAL, 0xCB8495DFE153AE44L,
- 0x05A24773B7B410B3L, 0x12857B783C32ABDFL, 0x8EB770D06812513BL, 0x536739B9D2E3E665L,
- 0x584D57E271B26468L, 0xD789C78FC9849725L, 0xA935BBFA7D1AE102L, 0x8B1537A3DFA64188L,
- 0xD0CD5D9BC378DE7AL, 0x4AC82C9A4D80CFB7L, 0x42777F1B83BDB620L, 0x72D2883A1D33BD75L,
- 0x5E7A2D4BAB6A8F41L, 0xF4DAAB6BBB1C95D9L, 0x905CFFE7FD8D31B6L, 0x83AA6422119B381FL,
- 0xC0AEFB8442022C49L, 0xA0F908C663033AE3L, 0xA428AF0804938826L, 0xADE41C341A8A53C7L,
- 0xAE7121EE77E6A85DL, 0xC47F5C4A25929E8CL, 0xB538E9AA55CDD863L, 0x06377AA9DAD8EB29L,
- 0xA18AE87BB3279895L, 0x6EDFDA6A35E48414L, 0x6B7D9D19825094A7L, 0xD41CFA55A4E86CBFL,
- 0xE5CAEDC9EA42C59CL, 0xA36C351C0E6FC179L, 0x5181E4DE6FABBF89L, 0xFFF0C530184D17D4L,
- 0x9D41EB1584045892L, 0x1C0D525028D73961L, 0xF178EC180CA8856AL, 0x9A0571018EF811CDL,
- 0x4091A27C3EF5EFCCL, 0x19AF15239F6329D2L, 0x347450EFF91EB990L, 0xE11B4A078DD27759L,
- 0xB9561DE5FC601331L, 0x912F1F5A2DA993C0L, 0x1654DCB65BA2191AL, 0x3E2DDE098A6B99EBL,
- 0x8A66D71E0F82E3FEL, 0x8C51ADB7D55A08D7L, 0x4533E50F8941FF7FL, 0x02E6DD67BD4859ECL,
- 0xE068AABA5DF6D52FL, 0xC24826E3FF4A75A5L, 0x6C39070D88ACDDF8L, 0x6486548C4691A46FL,
- 0xD1BEBD26135C7C0CL, 0xB30F93038F15334AL, 0x82D9849FC1BF9A69L, 0x9C320BA85420FAE4L,
- 0xFA528243AFF90767L, 0x9ED4D6CFE968A308L, 0xB825FD582C44B147L, 0x9B7691BC5EDCB3BBL,
- 0xC7EA619048FE6516L, 0x1063A61F817AF233L, 0x47D538683409A693L, 0x63C2CE984C6DED30L,
- 0x2A9FDFD86C81D91DL, 0x7B1E3B06032A6694L, 0x666089EBFBD9FD83L, 0x0A598EE67375207BL,
- 0x07449A140AFC495FL, 0x2CA8A571B6593234L, 0x1F986F8A45BBC2FBL, 0x381AA4A050B372C2L,
- 0x5423A3ADD81FAF3AL, 0x17273C0B8B86BB6CL, 0xFE83258DC869B5A2L, 0x287902BFD1C980F1L,
- 0xF5A94BD66B3837AFL, 0x88800A79B2CABA12L, 0x55504310083B0D4CL, 0xDF36940E07B9EEB2L,
- 0x04D1A7CE6790B2C5L, 0x612413FFF125B4DCL, 0x26F12B97C52C124FL, 0x86082351A62F28ACL,
- 0xEF93632F9937E5E7L, 0x3507B052293A1BE6L, 0xE72C30AE570A9C70L, 0xD3586041AE1425E0L,
- 0xDE4574B3D79D4CC4L, 0x92BA228040C5685AL, 0xF00B0CA5DC8C271CL, 0xBE1287F1F69C5A6EL,
- 0xF39E317FB1E0DC86L, 0x495D114020EC342DL, 0x699B407E3F18CD4BL, 0xDCA3A9D46AD51528L,
- 0x0D1D14F279896924L, 0x0000000000000000L, 0x593EB75FA196C61EL, 0x2E4E78160B116BD8L,
- 0x6D4AE7B058887F8EL, 0xE65FD013872E3E06L, 0x7A6DDBBBD30EC4E2L, 0xAC97FC89CAAEF1B1L,
- 0x09CCB33C1E19DBE1L, 0x89F3EAC462EE1864L, 0x7770CF49AA87ADC6L, 0x56C57ECA6557F6D6L,
- 0x03953DDA6D6CFB9AL, 0x36928D884456E07CL, 0x1EEB8F37959F608DL, 0x31D6179C4EAAA923L,
- 0x6FAC3AD7E5C02662L, 0x43049FA653991456L, 0xABD3669DC052B8EEL, 0xAF02C153A7C20A2BL,
- 0x3CCB036E3723C007L, 0x93C9C23D90E1CA2CL, 0xC33BC65E2F6ED7D3L, 0x4CFF56339758249EL,
- 0xB1E94E64325D6AA6L, 0x37E16D359472420AL, 0x79F8E661BE623F78L, 0x5214D90402C74413L,
- 0x482EF1FDF0C8965BL, 0x13F69BC5EC1609A9L, 0x0E88292814E592BEL, 0x4E198B542A107D72L,
- 0xCCC00FCBEBAFE71BL, 0x1B49C844222B703EL, 0x2564164DA840E9D5L, 0x20C6513E1FF4F966L,
- 0xBAC3203F910CE8ABL, 0xF2EDD1C261C47EF0L, 0x814CB945ACD361F3L, 0x95FEB8944A392105L,
- 0x5C9CF02C1622D6ADL, 0x971865F3F77178E9L, 0xBD87BA2B9BF0A1F4L, 0x444005B259655D09L,
- 0xED75BE48247FBC0BL, 0x7596122E17CFF42AL, 0xB44B091785E97A15L, 0x966B854E2755DA9FL,
- 0xEEE0839249134791L, 0x32432A4623C652B9L, 0xA8465B47AD3E4374L, 0xF8B45F2412B15E8BL,
- 0x2417F6F078644BA3L, 0xFB2162FE7FDDA511L, 0x4BBBCC279DA46DC1L, 0x0173E0BDD024A276L,
- 0x22208C59A2BCA08AL, 0x8FC4906DB836F34DL, 0xE4B90D743A6667EAL, 0x7147B5E0705F46EFL,
- 0x2782CB2A1508B039L, 0xEC065EF5F45B1E7DL, 0x21B5B183CFD05B10L, 0xDBE733C060295C77L,
- 0x9FA73672394C017EL, 0xCF55321186C31C81L, 0xD8720E1A0D45A7EDL, 0x3B8F997A3DDF8958L,
- 0x3AFC79C7EDFB2B2EL, 0xE9A4198643EF0ECEL, 0x5F09CDF67B4E2D37L, 0x4F6A6BE9FA34DF04L,
- 0xB6ADD47038A123F9L, 0x8D224D0A057EAAA1L, 0xC96248B85C1BF7A8L, 0xE3FD9760309A2EB5L,
- 0x0B2A6E5BA351820DL, 0xEB42C4E1FEA75722L, 0x948D58299A1D8373L, 0x7FCF9CC864BAD451L,
- 0xA55B4FB5D4B72A50L, 0x08BF5381CE3D7997L, 0x46A6D8D5E42D04E5L, 0xD22B80FC7E308796L,
- 0x57B69E77B57354A0L, 0x3969441D8097D0B4L, 0x3330CAFBF3E2F0CFL, 0xE28E77DDE0BE8CC3L,
- 0x62B12E259C494F46L, 0xA6CE726FB9DBD1CAL, 0x41E242C1EED14DBAL, 0x76032FF47AA30FB0L
- },
- new ulong[]{
- 0x45B268A93ACDE4CCL, 0xAF7F0BE884549D08L, 0x048354B3C1468263L, 0x925435C2C80EFED2L,
- 0xEE4E37F27FDFFBA7L, 0x167A33920C60F14DL, 0xFB123B52EA03E584L, 0x4A0CAB53FDBB9007L,
- 0x9DEAF6380F788A19L, 0xCB48EC558F0CB32AL, 0xB59DC4B2D6FEF7E0L, 0xDCDBCA22F4F3ECB6L,
- 0x11DF5813549A9C40L, 0xE33FDEDF568ACED3L, 0xA0C1C8124322E9C3L, 0x07A56B8158FA6D0DL,
- 0x77279579B1E1F3DDL, 0xD9B18B74422AC004L, 0xB8EC2D9FFFABC294L, 0xF4ACF8A82D75914FL,
- 0x7BBF69B1EF2B6878L, 0xC4F62FAF487AC7E1L, 0x76CE809CC67E5D0CL, 0x6711D88F92E4C14CL,
- 0x627B99D9243DEDFEL, 0x234AA5C3DFB68B51L, 0x909B1F15262DBF6DL, 0x4F66EA054B62BCB5L,
- 0x1AE2CF5A52AA6AE8L, 0xBEA053FBD0CE0148L, 0xED6808C0E66314C9L, 0x43FE16CD15A82710L,
- 0xCD049231A06970F6L, 0xE7BC8A6C97CC4CB0L, 0x337CE835FCB3B9C0L, 0x65DEF2587CC780F3L,
- 0x52214EDE4132BB50L, 0x95F15E4390F493DFL, 0x870839625DD2E0F1L, 0x41313C1AFB8B66AFL,
- 0x91720AF051B211BCL, 0x477D427ED4EEA573L, 0x2E3B4CEEF6E3BE25L, 0x82627834EB0BCC43L,
- 0x9C03E3DD78E724C8L, 0x2877328AD9867DF9L, 0x14B51945E243B0F2L, 0x574B0F88F7EB97E2L,
- 0x88B6FA989AA4943AL, 0x19C4F068CB168586L, 0x50EE6409AF11FAEFL, 0x7DF317D5C04EABA4L,
- 0x7A567C5498B4C6A9L, 0xB6BBFB804F42188EL, 0x3CC22BCF3BC5CD0BL, 0xD04336EAAA397713L,
- 0xF02FAC1BEC33132CL, 0x2506DBA7F0D3488DL, 0xD7E65D6BF2C31A1EL, 0x5EB9B2161FF820F5L,
- 0x842E0650C46E0F9FL, 0x716BEB1D9E843001L, 0xA933758CAB315ED4L, 0x3FE414FDA2792265L,
- 0x27C9F1701EF00932L, 0x73A4C1CA70A771BEL, 0x94184BA6E76B3D0EL, 0x40D829FF8C14C87EL,
- 0x0FBEC3FAC77674CBL, 0x3616A9634A6A9572L, 0x8F139119C25EF937L, 0xF545ED4D5AEA3F9EL,
- 0xE802499650BA387BL, 0x6437E7BD0B582E22L, 0xE6559F89E053E261L, 0x80AD52E305288DFCL,
- 0x6DC55A23E34B9935L, 0xDE14E0F51AD0AD09L, 0xC6390578A659865EL, 0x96D7617109487CB1L,
- 0xE2D6CB3A21156002L, 0x01E915E5779FAED1L, 0xADB0213F6A77DCB7L, 0x9880B76EB9A1A6ABL,
- 0x5D9F8D248644CF9BL, 0xFD5E4536C5662658L, 0xF1C6B9FE9BACBDFDL, 0xEACD6341BE9979C4L,
- 0xEFA7221708405576L, 0x510771ECD88E543EL, 0xC2BA51CB671F043DL, 0x0AD482AC71AF5879L,
- 0xFE787A045CDAC936L, 0xB238AF338E049AEDL, 0xBD866CC94972EE26L, 0x615DA6EBBD810290L,
- 0x3295FDD08B2C1711L, 0xF834046073BF0AEAL, 0xF3099329758FFC42L, 0x1CAEB13E7DCFA934L,
- 0xBA2307481188832BL, 0x24EFCE42874CE65CL, 0x0E57D61FB0E9DA1AL, 0xB3D1BAD6F99B343CL,
- 0xC0757B1C893C4582L, 0x2B510DB8403A9297L, 0x5C7698C1F1DB614AL, 0x3E0D0118D5E68CB4L,
- 0xD60F488E855CB4CFL, 0xAE961E0DF3CB33D9L, 0x3A8E55AB14A00ED7L, 0x42170328623789C1L,
- 0x838B6DD19C946292L, 0x895FEF7DED3B3AEBL, 0xCFCBB8E64E4A3149L, 0x064C7E642F65C3DCL,
- 0x3D2B3E2A4C5A63DAL, 0x5BD3F340A9210C47L, 0xB474D157A1615931L, 0xAC5934DA1DE87266L,
- 0x6EE365117AF7765BL, 0xC86ED36716B05C44L, 0x9BA6885C201D49C5L, 0xB905387A88346C45L,
- 0x131072C4BAB9DDFFL, 0xBF49461EA751AF99L, 0xD52977BC1CE05BA1L, 0xB0F785E46027DB52L,
- 0x546D30BA6E57788CL, 0x305AD707650F56AEL, 0xC987C682612FF295L, 0xA5AB8944F5FBC571L,
- 0x7ED528E759F244CAL, 0x8DDCBBCE2C7DB888L, 0xAA154ABE328DB1BAL, 0x1E619BE993ECE88BL,
- 0x09F2BD9EE813B717L, 0x7401AA4B285D1CB3L, 0x21858F143195CAEEL, 0x48C381841398D1B8L,
- 0xFCB750D3B2F98889L, 0x39A86A998D1CE1B9L, 0x1F888E0CE473465AL, 0x7899568376978716L,
- 0x02CF2AD7EE2341BFL, 0x85C713B5B3F1A14EL, 0xFF916FE12B4567E7L, 0x7C1A0230B7D10575L,
- 0x0C98FCC85ECA9BA5L, 0xA3E7F720DA9E06ADL, 0x6A6031A2BBB1F438L, 0x973E74947ED7D260L,
- 0x2CF4663918C0FF9AL, 0x5F50A7F368678E24L, 0x34D983B4A449D4CDL, 0x68AF1B755592B587L,
- 0x7F3C3D022E6DEA1BL, 0xABFC5F5B45121F6BL, 0x0D71E92D29553574L, 0xDFFDF5106D4F03D8L,
- 0x081BA87B9F8C19C6L, 0xDB7EA1A3AC0981BBL, 0xBBCA12AD66172DFAL, 0x79704366010829C7L,
- 0x179326777BFF5F9CL, 0x0000000000000000L, 0xEB2476A4C906D715L, 0x724DD42F0738DF6FL,
- 0xB752EE6538DDB65FL, 0x37FFBC863DF53BA3L, 0x8EFA84FCB5C157E6L, 0xE9EB5C73272596AAL,
- 0x1B0BDABF2535C439L, 0x86E12C872A4D4E20L, 0x9969A28BCE3E087AL, 0xFAFB2EB79D9C4B55L,
- 0x056A4156B6D92CB2L, 0x5A3AE6A5DEBEA296L, 0x22A3B026A8292580L, 0x53C85B3B36AD1581L,
- 0xB11E900117B87583L, 0xC51F3A4A3FE56930L, 0xE019E1EDCF3621BDL, 0xEC811D2591FCBA18L,
- 0x445B7D4C4D524A1DL, 0xA8DA6069DCAEF005L, 0x58F5CC72309DE329L, 0xD4C062596B7FF570L,
- 0xCE22AD0339D59F98L, 0x591CD99747024DF8L, 0x8B90C5AA03187B54L, 0xF663D27FC356D0F0L,
- 0xD8589E9135B56ED5L, 0x35309651D3D67A1CL, 0x12F96721CD26732EL, 0xD28C1C3D441A36ACL,
- 0x492A946164077F69L, 0x2D1D73DC6F5F514BL, 0x6F0A70F40D68D88AL, 0x60B4B30ECA1EAC41L,
- 0xD36509D83385987DL, 0x0B3D97490630F6A8L, 0x9ECCC90A96C46577L, 0xA20EE2C5AD01A87CL,
- 0xE49AB55E0E70A3DEL, 0xA4429CA182646BA0L, 0xDA97B446DB962F6AL, 0xCCED87D4D7F6DE27L,
- 0x2AB8185D37A53C46L, 0x9F25DCEFE15BCBA6L, 0xC19C6EF9FEA3EB53L, 0xA764A3931BD884CEL,
- 0x2FD2590B817C10F4L, 0x56A21A6D80743933L, 0xE573A0BB79EF0D0FL, 0x155C0CA095DC1E23L,
- 0x6C2C4FC694D437E4L, 0x10364DF623053291L, 0xDD32DFC7836C4267L, 0x03263F3299BCEF6EL,
- 0x66F8CD6AE57B6F9DL, 0x8C35AE2B5BE21659L, 0x31B3C2E21290F87FL, 0x93BD2027BF915003L,
- 0x69460E90220D1B56L, 0x299E276FAE19D328L, 0x63928C3C53A2432FL, 0x7082FEF8E91B9ED0L,
- 0xBC6F792C3EED40F7L, 0x4C40D537D2DE53DBL, 0x75E8BFAE5FC2B262L, 0x4DA9C0D2A541FD0AL,
- 0x4E8FFFE03CFD1264L, 0x2620E495696FA7E3L, 0xE1F0F408B8A98F6CL, 0xD1AA230FDDA6D9C2L,
- 0xC7D0109DD1C6288FL, 0x8A79D04F7487D585L, 0x4694579BA3710BA2L, 0x38417F7CFA834F68L,
- 0x1D47A4DB0A5007E5L, 0x206C9AF1460A643FL, 0xA128DDF734BD4712L, 0x8144470672B7232DL,
- 0xF2E086CC02105293L, 0x182DE58DBC892B57L, 0xCAA1F9B0F8931DFBL, 0x6B892447CC2E5AE9L,
- 0xF9DD11850420A43BL, 0x4BE5BEB68A243ED6L, 0x5584255F19C8D65DL, 0x3B67404E633FA006L,
- 0xA68DB6766C472A1FL, 0xF78AC79AB4C97E21L, 0xC353442E1080AAECL, 0x9A4F9DB95782E714L
- },
- new ulong[] {
- 0x05BA7BC82C9B3220L, 0x31A54665F8B65E4FL, 0xB1B651F77547F4D4L, 0x8BFA0D857BA46682L,
- 0x85A96C5AA16A98BBL, 0x990FAEF908EB79C9L, 0xA15E37A247F4A62DL, 0x76857DCD5D27741EL,
- 0xF8C50B800A1820BCL, 0xBE65DCB201F7A2B4L, 0x666D1B986F9426E7L, 0x4CC921BF53C4E648L,
- 0x95410A0F93D9CA42L, 0x20CDCCAA647BA4EFL, 0x429A4060890A1871L, 0x0C4EA4F69B32B38BL,
- 0xCCDA362DDE354CD3L, 0x96DC23BC7C5B2FA9L, 0xC309BB68AA851AB3L, 0xD26131A73648E013L,
- 0x021DC52941FC4DB2L, 0xCD5ADAB7704BE48AL, 0xA77965D984ED71E6L, 0x32386FD61734BBA4L,
- 0xE82D6DD538AB7245L, 0x5C2147EA6177B4B1L, 0x5DA1AB70CF091CE8L, 0xAC907FCE72B8BDFFL,
- 0x57C85DFD972278A8L, 0xA4E44C6A6B6F940DL, 0x3851995B4F1FDFE4L, 0x62578CCAED71BC9EL,
- 0xD9882BB0C01D2C0AL, 0x917B9D5D113C503BL, 0xA2C31E11A87643C6L, 0xE463C923A399C1CEL,
- 0xF71686C57EA876DCL, 0x87B4A973E096D509L, 0xAF0D567D9D3A5814L, 0xB40C2A3F59DCC6F4L,
- 0x3602F88495D121DDL, 0xD3E1DD3D9836484AL, 0xF945E71AA46688E5L, 0x7518547EB2A591F5L,
- 0x9366587450C01D89L, 0x9EA81018658C065BL, 0x4F54080CBC4603A3L, 0x2D0384C65137BF3DL,
- 0xDC325078EC861E2AL, 0xEA30A8FC79573FF7L, 0x214D2030CA050CB6L, 0x65F0322B8016C30CL,
- 0x69BE96DD1B247087L, 0xDB95EE9981E161B8L, 0xD1FC1814D9CA05F8L, 0x820ED2BBCC0DE729L,
- 0x63D76050430F14C7L, 0x3BCCB0E8A09D3A0FL, 0x8E40764D573F54A2L, 0x39D175C1E16177BDL,
- 0x12F5A37C734F1F4BL, 0xAB37C12F1FDFC26DL, 0x5648B167395CD0F1L, 0x6C04ED1537BF42A7L,
- 0xED97161D14304065L, 0x7D6C67DAAB72B807L, 0xEC17FA87BA4EE83CL, 0xDFAF79CB0304FBC1L,
- 0x733F060571BC463EL, 0x78D61C1287E98A27L, 0xD07CF48E77B4ADA1L, 0xB9C262536C90DD26L,
- 0xE2449B5860801605L, 0x8FC09AD7F941FCFBL, 0xFAD8CEA94BE46D0EL, 0xA343F28B0608EB9FL,
- 0x9B126BD04917347BL, 0x9A92874AE7699C22L, 0x1B017C42C4E69EE0L, 0x3A4C5C720EE39256L,
- 0x4B6E9F5E3EA399DAL, 0x6BA353F45AD83D35L, 0xE7FEE0904C1B2425L, 0x22D009832587E95DL,
- 0x842980C00F1430E2L, 0xC6B3C0A0861E2893L, 0x087433A419D729F2L, 0x341F3DADD42D6C6FL,
- 0xEE0A3FAEFBB2A58EL, 0x4AEE73C490DD3183L, 0xAAB72DB5B1A16A34L, 0xA92A04065E238FDFL,
- 0x7B4B35A1686B6FCCL, 0x6A23BF6EF4A6956CL, 0x191CB96B851AD352L, 0x55D598D4D6DE351AL,
- 0xC9604DE5F2AE7EF3L, 0x1CA6C2A3A981E172L, 0xDE2F9551AD7A5398L, 0x3025AAFF56C8F616L,
- 0x15521D9D1E2860D9L, 0x506FE31CFA45073AL, 0x189C55F12B647B0BL, 0x0180EC9AAE7EA859L,
- 0x7CEC8B40050C105EL, 0x2350E5198BF94104L, 0xEF8AD33455CC0DD7L, 0x07A7BEE16D677F92L,
- 0xE5E325B90DE76997L, 0x5A061591A26E637AL, 0xB611EF1618208B46L, 0x09F4DF3EB7A981ABL,
- 0x1EBB078AE87DACC0L, 0xB791038CB65E231FL, 0x0FD38D4574B05660L, 0x67EDF702C1EA8EBEL,
- 0xBA5F4BE0831238CDL, 0xE3C477C2CEFEBE5CL, 0x0DCE486C354C1BD2L, 0x8C5DB36416C31910L,
- 0x26EA9ED1A7627324L, 0x039D29B3EF82E5EBL, 0x9F28FC82CBF2AE02L, 0xA8AAE89CF05D2786L,
- 0x431AACFA2774B028L, 0xCF471F9E31B7A938L, 0x581BD0B8E3922EC8L, 0xBC78199B400BEF06L,
- 0x90FB71C7BF42F862L, 0x1F3BEB1046030499L, 0x683E7A47B55AD8DEL, 0x988F4263A695D190L,
- 0xD808C72A6E638453L, 0x0627527BC319D7CBL, 0xEBB04466D72997AEL, 0xE67E0C0AE2658C7CL,
- 0x14D2F107B056C880L, 0x7122C32C30400B8CL, 0x8A7AE11FD5DACEDBL, 0xA0DEDB38E98A0E74L,
- 0xAD109354DCC615A6L, 0x0BE91A17F655CC19L, 0x8DDD5FFEB8BDB149L, 0xBFE53028AF890AEDL,
- 0xD65BA6F5B4AD7A6AL, 0x7956F0882997227EL, 0x10E8665532B352F9L, 0x0E5361DFDACEFE39L,
- 0xCEC7F3049FC90161L, 0xFF62B561677F5F2EL, 0x975CCF26D22587F0L, 0x51EF0F86543BAF63L,
- 0x2F1E41EF10CBF28FL, 0x52722635BBB94A88L, 0xAE8DBAE73344F04DL, 0x410769D36688FD9AL,
- 0xB3AB94DE34BBB966L, 0x801317928DF1AA9BL, 0xA564A0F0C5113C54L, 0xF131D4BEBDB1A117L,
- 0x7F71A2F3EA8EF5B5L, 0x40878549C8F655C3L, 0x7EF14E6944F05DECL, 0xD44663DCF55137D8L,
- 0xF2ACFD0D523344FCL, 0x0000000000000000L, 0x5FBC6E598EF5515AL, 0x16CF342EF1AA8532L,
- 0xB036BD6DDB395C8DL, 0x13754FE6DD31B712L, 0xBBDFA77A2D6C9094L, 0x89E7C8AC3A582B30L,
- 0x3C6B0E09CDFA459DL, 0xC4AE0589C7E26521L, 0x49735A777F5FD468L, 0xCAFD64561D2C9B18L,
- 0xDA1502032F9FC9E1L, 0x8867243694268369L, 0x3782141E3BAF8984L, 0x9CB5D53124704BE9L,
- 0xD7DB4A6F1AD3D233L, 0xA6F989432A93D9BFL, 0x9D3539AB8A0EE3B0L, 0x53F2CAAF15C7E2D1L,
- 0x6E19283C76430F15L, 0x3DEBE2936384EDC4L, 0x5E3C82C3208BF903L, 0x33B8834CB94A13FDL,
- 0x6470DEB12E686B55L, 0x359FD1377A53C436L, 0x61CAA57902F35975L, 0x043A975282E59A79L,
- 0xFD7F70482683129CL, 0xC52EE913699CCD78L, 0x28B9FF0E7DAC8D1DL, 0x5455744E78A09D43L,
- 0xCB7D88CCB3523341L, 0x44BD121B4A13CFBAL, 0x4D49CD25FDBA4E11L, 0x3E76CB208C06082FL,
- 0x3FF627BA2278A076L, 0xC28957F204FBB2EAL, 0x453DFE81E46D67E3L, 0x94C1E6953DA7621BL,
- 0x2C83685CFF491764L, 0xF32C1197FC4DECA5L, 0x2B24D6BD922E68F6L, 0xB22B78449AC5113FL,
- 0x48F3B6EDD1217C31L, 0x2E9EAD75BEB55AD6L, 0x174FD8B45FD42D6BL, 0x4ED4E4961238ABFAL,
- 0x92E6B4EEFEBEB5D0L, 0x46A0D7320BEF8208L, 0x47203BA8A5912A51L, 0x24F75BF8E69E3E96L,
- 0xF0B1382413CF094EL, 0xFEE259FBC901F777L, 0x276A724B091CDB7DL, 0xBDF8F501EE75475FL,
- 0x599B3C224DEC8691L, 0x6D84018F99C1EAFEL, 0x7498B8E41CDB39ACL, 0xE0595E71217C5BB7L,
- 0x2AA43A273C50C0AFL, 0xF50B43EC3F543B6EL, 0x838E3E2162734F70L, 0xC09492DB4507FF58L,
- 0x72BFEA9FDFC2EE67L, 0x11688ACF9CCDFAA0L, 0x1A8190D86A9836B9L, 0x7ACBD93BC615C795L,
- 0xC7332C3A286080CAL, 0x863445E94EE87D50L, 0xF6966A5FD0D6DE85L, 0xE9AD814F96D5DA1CL,
- 0x70A22FB69E3EA3D5L, 0x0A69F68D582B6440L, 0xB8428EC9C2EE757FL, 0x604A49E3AC8DF12CL,
- 0x5B86F90B0C10CB23L, 0xE1D9B2EB8F02F3EEL, 0x29391394D3D22544L, 0xC8E0A17F5CD0D6AAL,
- 0xB58CC6A5F7A26EADL, 0x8193FB08238F02C2L, 0xD5C68F465B2F9F81L, 0xFCFF9CD288FDBAC5L,
- 0x77059157F359DC47L, 0x1D262E3907FF492BL, 0xFB582233E59AC557L, 0xDDB2BCE242F8B673L,
- 0x2577B76248E096CFL, 0x6F99C4A6D83DA74CL, 0xC1147E41EB795701L, 0xF48BAF76912A9337L
- },
- new ulong[] {
- 0x3EF29D249B2C0A19L, 0xE9E16322B6F8622FL, 0x5536994047757F7AL, 0x9F4D56D5A47B0B33L,
- 0x822567466AA1174CL, 0xB8F5057DEB082FB2L, 0xCC48C10BF4475F53L, 0x373088D4275DEC3AL,
- 0x968F4325180AED10L, 0x173D232CF7016151L, 0xAE4ED09F946FCC13L, 0xFD4B4741C4539873L,
- 0x1B5B3F0DD9933765L, 0x2FFCB0967B644052L, 0xE02376D20A89840CL, 0xA3AE3A70329B18D7L,
- 0x419CBD2335DE8526L, 0xFAFEBF115B7C3199L, 0x0397074F85AA9B0DL, 0xC58AD4FB4836B970L,
- 0xBEC60BE3FC4104A8L, 0x1EFF36DC4B708772L, 0x131FDC33ED8453B6L, 0x0844E33E341764D3L,
- 0x0FF11B6EAB38CD39L, 0x64351F0A7761B85AL, 0x3B5694F509CFBA0EL, 0x30857084B87245D0L,
- 0x47AFB3BD2297AE3CL, 0xF2BA5C2F6F6B554AL, 0x74BDC4761F4F70E1L, 0xCFDFC64471EDC45EL,
- 0xE610784C1DC0AF16L, 0x7ACA29D63C113F28L, 0x2DED411776A859AFL, 0xAC5F211E99A3D5EEL,
- 0xD484F949A87EF33BL, 0x3CE36CA596E013E4L, 0xD120F0983A9D432CL, 0x6BC40464DC597563L,
- 0x69D5F5E5D1956C9EL, 0x9AE95F043698BB24L, 0xC9ECC8DA66A4EF44L, 0xD69508C8A5B2EAC6L,
- 0xC40C2235C0503B80L, 0x38C193BA8C652103L, 0x1CEEC75D46BC9E8FL, 0xD331011937515AD1L,
- 0xD8E2E56886ECA50FL, 0xB137108D5779C991L, 0x709F3B6905CA4206L, 0x4FEB50831680CAEFL,
- 0xEC456AF3241BD238L, 0x58D673AFE181ABBEL, 0x242F54E7CAD9BF8CL, 0x0211F1810DCC19FDL,
- 0x90BC4DBB0F43C60AL, 0x9518446A9DA0761DL, 0xA1BFCBF13F57012AL, 0x2BDE4F8961E172B5L,
- 0x27B853A84F732481L, 0xB0B1E643DF1F4B61L, 0x18CC38425C39AC68L, 0xD2B7F7D7BF37D821L,
- 0x3103864A3014C720L, 0x14AA246372ABFA5CL, 0x6E600DB54EBAC574L, 0x394765740403A3F3L,
- 0x09C215F0BC71E623L, 0x2A58B947E987F045L, 0x7B4CDF18B477BDD8L, 0x9709B5EB906C6FE0L,
- 0x73083C268060D90BL, 0xFEDC400E41F9037EL, 0x284948C6E44BE9B8L, 0x728ECAE808065BFBL,
- 0x06330E9E17492B1AL, 0x5950856169E7294EL, 0xBAE4F4FCE6C4364FL, 0xCA7BCF95E30E7449L,
- 0x7D7FD186A33E96C2L, 0x52836110D85AD690L, 0x4DFAA1021B4CD312L, 0x913ABB75872544FAL,
- 0xDD46ECB9140F1518L, 0x3D659A6B1E869114L, 0xC23F2CABD719109AL, 0xD713FE062DD46836L,
- 0xD0A60656B2FBC1DCL, 0x221C5A79DD909496L, 0xEFD26DBCA1B14935L, 0x0E77EDA0235E4FC9L,
- 0xCBFD395B6B68F6B9L, 0x0DE0EAEFA6F4D4C4L, 0x0422FF1F1A8532E7L, 0xF969B85EDED6AA94L,
- 0x7F6E2007AEF28F3FL, 0x3AD0623B81A938FEL, 0x6624EE8B7AADA1A7L, 0xB682E8DDC856607BL,
- 0xA78CC56F281E2A30L, 0xC79B257A45FAA08DL, 0x5B4174E0642B30B3L, 0x5F638BFF7EAE0254L,
- 0x4BC9AF9C0C05F808L, 0xCE59308AF98B46AEL, 0x8FC58DA9CC55C388L, 0x803496C7676D0EB1L,
- 0xF33CAAE1E70DD7BAL, 0xBB6202326EA2B4BFL, 0xD5020F87201871CBL, 0x9D5CA754A9B712CEL,
- 0x841669D87DE83C56L, 0x8A6184785EB6739FL, 0x420BBA6CB0741E2BL, 0xF12D5B60EAC1CE47L,
- 0x76AC35F71283691CL, 0x2C6BB7D9FECEDB5FL, 0xFCCDB18F4C351A83L, 0x1F79C012C3160582L,
- 0xF0ABADAE62A74CB7L, 0xE1A5801C82EF06FCL, 0x67A21845F2CB2357L, 0x5114665F5DF04D9DL,
- 0xBF40FD2D74278658L, 0xA0393D3FB73183DAL, 0x05A409D192E3B017L, 0xA9FB28CF0B4065F9L,
- 0x25A9A22942BF3D7CL, 0xDB75E22703463E02L, 0xB326E10C5AB5D06CL, 0xE7968E8295A62DE6L,
- 0xB973F3B3636EAD42L, 0xDF571D3819C30CE5L, 0xEE549B7229D7CBC5L, 0x12992AFD65E2D146L,
- 0xF8EF4E9056B02864L, 0xB7041E134030E28BL, 0xC02EDD2ADAD50967L, 0x932B4AF48AE95D07L,
- 0x6FE6FB7BC6DC4784L, 0x239AACB755F61666L, 0x401A4BEDBDB807D6L, 0x485EA8D389AF6305L,
- 0xA41BC220ADB4B13DL, 0x753B32B89729F211L, 0x997E584BB3322029L, 0x1D683193CEDA1C7FL,
- 0xFF5AB6C0C99F818EL, 0x16BBD5E27F67E3A1L, 0xA59D34EE25D233CDL, 0x98F8AE853B54A2D9L,
- 0x6DF70AFACB105E79L, 0x795D2E99B9BBA425L, 0x8E437B6744334178L, 0x0186F6CE886682F0L,
- 0xEBF092A3BB347BD2L, 0xBCD7FA62F18D1D55L, 0xADD9D7D011C5571EL, 0x0BD3E471B1BDFFDEL,
- 0xAA6C2F808EEAFEF4L, 0x5EE57D31F6C880A4L, 0xF50FA47FF044FCA0L, 0x1ADDC9C351F5B595L,
- 0xEA76646D3352F922L, 0x0000000000000000L, 0x85909F16F58EBEA6L, 0x46294573AAF12CCCL,
- 0x0A5512BF39DB7D2EL, 0x78DBD85731DD26D5L, 0x29CFBE086C2D6B48L, 0x218B5D36583A0F9BL,
- 0x152CD2ADFACD78ACL, 0x83A39188E2C795BCL, 0xC3B9DA655F7F926AL, 0x9ECBA01B2C1D89C3L,
- 0x07B5F8509F2FA9EAL, 0x7EE8D6C926940DCFL, 0x36B67E1AAF3B6ECAL, 0x86079859702425ABL,
- 0xFB7849DFD31AB369L, 0x4C7C57CC932A51E2L, 0xD96413A60E8A27FFL, 0x263EA566C715A671L,
- 0x6C71FC344376DC89L, 0x4A4F595284637AF8L, 0xDAF314E98B20BCF2L, 0x572768C14AB96687L,
- 0x1088DB7C682EC8BBL, 0x887075F9537A6A62L, 0x2E7A4658F302C2A2L, 0x619116DBE582084DL,
- 0xA87DDE018326E709L, 0xDCC01A779C6997E8L, 0xEDC39C3DAC7D50C8L, 0xA60A33A1A078A8C0L,
- 0xC1A82BE452B38B97L, 0x3F746BEA134A88E9L, 0xA228CCBEBAFD9A27L, 0xABEAD94E068C7C04L,
- 0xF48952B178227E50L, 0x5CF48CB0FB049959L, 0x6017E0156DE48ABDL, 0x4438B4F2A73D3531L,
- 0x8C528AE649FF5885L, 0xB515EF924DFCFB76L, 0x0C661C212E925634L, 0xB493195CC59A7986L,
- 0x9CDA519A21D1903EL, 0x32948105B5BE5C2DL, 0x194ACE8CD45F2E98L, 0x438D4CA238129CDBL,
- 0x9B6FA9CABEFE39D4L, 0x81B26009EF0B8C41L, 0xDED1EBF691A58E15L, 0x4E6DA64D9EE6481FL,
- 0x54B06F8ECF13FD8AL, 0x49D85E1D01C9E1F5L, 0xAFC826511C094EE3L, 0xF698A33075EE67ADL,
- 0x5AC7822EEC4DB243L, 0x8DD47C28C199DA75L, 0x89F68337DB1CE892L, 0xCDCE37C57C21DDA3L,
- 0x530597DE503C5460L, 0x6A42F2AA543FF793L, 0x5D727A7E73621BA9L, 0xE232875307459DF1L,
- 0x56A19E0FC2DFE477L, 0xC61DD3B4CD9C227DL, 0xE5877F03986A341BL, 0x949EB2A415C6F4EDL,
- 0x6206119460289340L, 0x6380E75AE84E11B0L, 0x8BE772B6D6D0F16FL, 0x50929091D596CF6DL,
- 0xE86795EC3E9EE0DFL, 0x7CF927482B581432L, 0xC86A3E14EEC26DB4L, 0x7119CDA78DACC0F6L,
- 0xE40189CD100CB6EBL, 0x92ADBC3A028FDFF7L, 0xB2A017C2D2D3529CL, 0x200DABF8D05C8D6BL,
- 0x34A78F9BA2F77737L, 0xE3B4719D8F231F01L, 0x45BE423C2F5BB7C1L, 0xF71E55FEFD88E55DL,
- 0x6853032B59F3EE6EL, 0x65B3E9C4FF073AAAL, 0x772AC3399AE5EBECL, 0x87816E97F842A75BL,
- 0x110E2DB2E0484A4BL, 0x331277CB3DD8DEDDL, 0xBD510CAC79EB9FA5L, 0x352179552A91F5C7L
- },
- new ulong[] {
- 0x8AB0A96846E06A6DL, 0x43C7E80B4BF0B33AL, 0x08C9B3546B161EE5L, 0x39F1C235EBA990BEL,
- 0xC1BEF2376606C7B2L, 0x2C209233614569AAL, 0xEB01523B6FC3289AL, 0x946953AB935ACEDDL,
- 0x272838F63E13340EL, 0x8B0455ECA12BA052L, 0x77A1B2C4978FF8A2L, 0xA55122CA13E54086L,
- 0x2276135862D3F1CDL, 0xDB8DDFDE08B76CFEL, 0x5D1E12C89E4A178AL, 0x0E56816B03969867L,
- 0xEE5F79953303ED59L, 0xAFED748BAB78D71DL, 0x6D929F2DF93E53EEL, 0xF5D8A8F8BA798C2AL,
- 0xF619B1698E39CF6BL, 0x95DDAF2F749104E2L, 0xEC2A9C80E0886427L, 0xCE5C8FD8825B95EAL,
- 0xC4E0D9993AC60271L, 0x4699C3A5173076F9L, 0x3D1B151F50A29F42L, 0x9ED505EA2BC75946L,
- 0x34665ACFDC7F4B98L, 0x61B1FB53292342F7L, 0xC721C0080E864130L, 0x8693CD1696FD7B74L,
- 0x872731927136B14BL, 0xD3446C8A63A1721BL, 0x669A35E8A6680E4AL, 0xCAB658F239509A16L,
- 0xA4E5DE4EF42E8AB9L, 0x37A7435EE83F08D9L, 0x134E6239E26C7F96L, 0x82791A3C2DF67488L,
- 0x3F6EF00A8329163CL, 0x8E5A7E42FDEB6591L, 0x5CAAEE4C7981DDB5L, 0x19F234785AF1E80DL,
- 0x255DDDE3ED98BD70L, 0x50898A32A99CCCACL, 0x28CA4519DA4E6656L, 0xAE59880F4CB31D22L,
- 0x0D9798FA37D6DB26L, 0x32F968F0B4FFCD1AL, 0xA00F09644F258545L, 0xFA3AD5175E24DE72L,
- 0xF46C547C5DB24615L, 0x713E80FBFF0F7E20L, 0x7843CF2B73D2AAFAL, 0xBD17EA36AEDF62B4L,
- 0xFD111BACD16F92CFL, 0x4ABAA7DBC72D67E0L, 0xB3416B5DAD49FAD3L, 0xBCA316B24914A88BL,
- 0x15D150068AECF914L, 0xE27C1DEBE31EFC40L, 0x4FE48C759BEDA223L, 0x7EDCFD141B522C78L,
- 0x4E5070F17C26681CL, 0xE696CAC15815F3BCL, 0x35D2A64B3BB481A7L, 0x800CFF29FE7DFDF6L,
- 0x1ED9FAC3D5BAA4B0L, 0x6C2663A91EF599D1L, 0x03C1199134404341L, 0xF7AD4DED69F20554L,
- 0xCD9D9649B61BD6ABL, 0xC8C3BDE7EADB1368L, 0xD131899FB02AFB65L, 0x1D18E352E1FAE7F1L,
- 0xDA39235AEF7CA6C1L, 0xA1BBF5E0A8EE4F7AL, 0x91377805CF9A0B1EL, 0x3138716180BF8E5BL,
- 0xD9F83ACBDB3CE580L, 0x0275E515D38B897EL, 0x472D3F21F0FBBCC6L, 0x2D946EB7868EA395L,
- 0xBA3C248D21942E09L, 0xE7223645BFDE3983L, 0xFF64FEB902E41BB1L, 0xC97741630D10D957L,
- 0xC3CB1722B58D4ECCL, 0xA27AEC719CAE0C3BL, 0x99FECB51A48C15FBL, 0x1465AC826D27332BL,
- 0xE1BD047AD75EBF01L, 0x79F733AF941960C5L, 0x672EC96C41A3C475L, 0xC27FEBA6524684F3L,
- 0x64EFD0FD75E38734L, 0xED9E60040743AE18L, 0xFB8E2993B9EF144DL, 0x38453EB10C625A81L,
- 0x6978480742355C12L, 0x48CF42CE14A6EE9EL, 0x1CAC1FD606312DCEL, 0x7B82D6BA4792E9BBL,
- 0x9D141C7B1F871A07L, 0x5616B80DC11C4A2EL, 0xB849C198F21FA777L, 0x7CA91801C8D9A506L,
- 0xB1348E487EC273ADL, 0x41B20D1E987B3A44L, 0x7460AB55A3CFBBE3L, 0x84E628034576F20AL,
- 0x1B87D16D897A6173L, 0x0FE27DEFE45D5258L, 0x83CDE6B8CA3DBEB7L, 0x0C23647ED01D1119L,
- 0x7A362A3EA0592384L, 0xB61F40F3F1893F10L, 0x75D457D1440471DCL, 0x4558DA34237035B8L,
- 0xDCA6116587FC2043L, 0x8D9B67D3C9AB26D0L, 0x2B0B5C88EE0E2517L, 0x6FE77A382AB5DA90L,
- 0x269CC472D9D8FE31L, 0x63C41E46FAA8CB89L, 0xB7ABBC771642F52FL, 0x7D1DE4852F126F39L,
- 0xA8C6BA3024339BA0L, 0x600507D7CEE888C8L, 0x8FEE82C61A20AFAEL, 0x57A2448926D78011L,
- 0xFCA5E72836A458F0L, 0x072BCEBB8F4B4CBDL, 0x497BBE4AF36D24A1L, 0x3CAFE99BB769557DL,
- 0x12FA9EBD05A7B5A9L, 0xE8C04BAA5B836BDBL, 0x4273148FAC3B7905L, 0x908384812851C121L,
- 0xE557D3506C55B0FDL, 0x72FF996ACB4F3D61L, 0x3EDA0C8E64E2DC03L, 0xF0868356E6B949E9L,
- 0x04EAD72ABB0B0FFCL, 0x17A4B5135967706AL, 0xE3C8E16F04D5367FL, 0xF84F30028DAF570CL,
- 0x1846C8FCBD3A2232L, 0x5B8120F7F6CA9108L, 0xD46FA231ECEA3EA6L, 0x334D947453340725L,
- 0x58403966C28AD249L, 0xBED6F3A79A9F21F5L, 0x68CCB483A5FE962DL, 0xD085751B57E1315AL,
- 0xFED0023DE52FD18EL, 0x4B0E5B5F20E6ADDFL, 0x1A332DE96EB1AB4CL, 0xA3CE10F57B65C604L,
- 0x108F7BA8D62C3CD7L, 0xAB07A3A11073D8E1L, 0x6B0DAD1291BED56CL, 0xF2F366433532C097L,
- 0x2E557726B2CEE0D4L, 0x0000000000000000L, 0xCB02A476DE9B5029L, 0xE4E32FD48B9E7AC2L,
- 0x734B65EE2C84F75EL, 0x6E5386BCCD7E10AFL, 0x01B4FC84E7CBCA3FL, 0xCFE8735C65905FD5L,
- 0x3613BFDA0FF4C2E6L, 0x113B872C31E7F6E8L, 0x2FE18BA255052AEBL, 0xE974B72EBC48A1E4L,
- 0x0ABC5641B89D979BL, 0xB46AA5E62202B66EL, 0x44EC26B0C4BBFF87L, 0xA6903B5B27A503C7L,
- 0x7F680190FC99E647L, 0x97A84A3AA71A8D9CL, 0xDD12EDE16037EA7CL, 0xC554251DDD0DC84EL,
- 0x88C54C7D956BE313L, 0x4D91696048662B5DL, 0xB08072CC9909B992L, 0xB5DE5962C5C97C51L,
- 0x81B803AD19B637C9L, 0xB2F597D94A8230ECL, 0x0B08AAC55F565DA4L, 0xF1327FD2017283D6L,
- 0xAD98919E78F35E63L, 0x6AB9519676751F53L, 0x24E921670A53774FL, 0xB9FD3D1C15D46D48L,
- 0x92F66194FBDA485FL, 0x5A35DC7311015B37L, 0xDED3F4705477A93DL, 0xC00A0EB381CD0D8DL,
- 0xBB88D809C65FE436L, 0x16104997BEACBA55L, 0x21B70AC95693B28CL, 0x59F4C5E225411876L,
- 0xD5DB5EB50B21F499L, 0x55D7A19CF55C096FL, 0xA97246B4C3F8519FL, 0x8552D487A2BD3835L,
- 0x54635D181297C350L, 0x23C2EFDC85183BF2L, 0x9F61F96ECC0C9379L, 0x534893A39DDC8FEDL,
- 0x5EDF0B59AA0A54CBL, 0xAC2C6D1A9F38945CL, 0xD7AEBBA0D8AA7DE7L, 0x2ABFA00C09C5EF28L,
- 0xD84CC64F3CF72FBFL, 0x2003F64DB15878B3L, 0xA724C7DFC06EC9F8L, 0x069F323F68808682L,
- 0xCC296ACD51D01C94L, 0x055E2BAE5CC0C5C3L, 0x6270E2C21D6301B6L, 0x3B842720382219C0L,
- 0xD2F0900E846AB824L, 0x52FC6F277A1745D2L, 0xC6953C8CE94D8B0FL, 0xE009F8FE3095753EL,
- 0x655B2C7992284D0BL, 0x984A37D54347DFC4L, 0xEAB5AEBF8808E2A5L, 0x9A3FD2C090CC56BAL,
- 0x9CA0E0FFF84CD038L, 0x4C2595E4AFADE162L, 0xDF6708F4B3BC6302L, 0xBF620F237D54EBCAL,
- 0x93429D101C118260L, 0x097D4FD08CDDD4DAL, 0x8C2F9B572E60ECEFL, 0x708A7C7F18C4B41FL,
- 0x3A30DBA4DFE9D3FFL, 0x4006F19A7FB0F07BL, 0x5F6BF7DD4DC19EF4L, 0x1F6D064732716E8FL,
- 0xF9FBCC866A649D33L, 0x308C8DE567744464L, 0x8971B0F972A0292CL, 0xD61A47243F61B7D8L,
- 0xEFEB8511D4C82766L, 0x961CB6BE40D147A3L, 0xAAB35F25F7B812DEL, 0x76154E407044329DL,
- 0x513D76B64E570693L, 0xF3479AC7D2F90AA8L, 0x9B8B2E4477079C85L, 0x297EB99D3D85AC69L
- },
- new ulong[] {
- 0x7E37E62DFC7D40C3L, 0x776F25A4EE939E5BL, 0xE045C850DD8FB5ADL, 0x86ED5BA711FF1952L,
- 0xE91D0BD9CF616B35L, 0x37E0AB256E408FFBL, 0x9607F6C031025A7AL, 0x0B02F5E116D23C9DL,
- 0xF3D8486BFB50650CL, 0x621CFF27C40875F5L, 0x7D40CB71FA5FD34AL, 0x6DAA6616DAA29062L,
- 0x9F5F354923EC84E2L, 0xEC847C3DC507C3B3L, 0x025A3668043CE205L, 0xA8BF9E6C4DAC0B19L,
- 0xFA808BE2E9BEBB94L, 0xB5B99C5277C74FA3L, 0x78D9BC95F0397BCCL, 0xE332E50CDBAD2624L,
- 0xC74FCE129332797EL, 0x1729ECEB2EA709ABL, 0xC2D6B9F69954D1F8L, 0x5D898CBFBAB8551AL,
- 0x859A76FB17DD8ADBL, 0x1BE85886362F7FB5L, 0xF6413F8FF136CD8AL, 0xD3110FA5BBB7E35CL,
- 0x0A2FEED514CC4D11L, 0xE83010EDCD7F1AB9L, 0xA1E75DE55F42D581L, 0xEEDE4A55C13B21B6L,
- 0xF2F5535FF94E1480L, 0x0CC1B46D1888761EL, 0xBCE15FDB6529913BL, 0x2D25E8975A7181C2L,
- 0x71817F1CE2D7A554L, 0x2E52C5CB5C53124BL, 0xF9F7A6BEEF9C281DL, 0x9E722E7D21F2F56EL,
- 0xCE170D9B81DCA7E6L, 0x0E9B82051CB4941BL, 0x1E712F623C49D733L, 0x21E45CFA42F9F7DCL,
- 0xCB8E7A7F8BBA0F60L, 0x8E98831A010FB646L, 0x474CCF0D8E895B23L, 0xA99285584FB27A95L,
- 0x8CC2B57205335443L, 0x42D5B8E984EFF3A5L, 0x012D1B34021E718CL, 0x57A6626AAE74180BL,
- 0xFF19FC06E3D81312L, 0x35BA9D4D6A7C6DFEL, 0xC9D44C178F86ED65L, 0x506523E6A02E5288L,
- 0x03772D5C06229389L, 0x8B01F4FE0B691EC0L, 0xF8DABD8AED825991L, 0x4C4E3AEC985B67BEL,
- 0xB10DF0827FBF96A9L, 0x6A69279AD4F8DAE1L, 0xE78689DCD3D5FF2EL, 0x812E1A2B1FA553D1L,
- 0xFBAD90D6EBA0CA18L, 0x1AC543B234310E39L, 0x1604F7DF2CB97827L, 0xA6241C6951189F02L,
- 0x753513CCEAAF7C5EL, 0x64F2A59FC84C4EFAL, 0x247D2B1E489F5F5AL, 0xDB64D718AB474C48L,
- 0x79F4A7A1F2270A40L, 0x1573DA832A9BEBAEL, 0x3497867968621C72L, 0x514838D2A2302304L,
- 0xF0AF6537FD72F685L, 0x1D06023E3A6B44BAL, 0x678588C3CE6EDD73L, 0x66A893F7CC70ACFFL,
- 0xD4D24E29B5EDA9DFL, 0x3856321470EA6A6CL, 0x07C3418C0E5A4A83L, 0x2BCBB22F5635BACDL,
- 0x04B46CD00878D90AL, 0x06EE5AB80C443B0FL, 0x3B211F4876C8F9E5L, 0x0958C38912EEDE98L,
- 0xD14B39CDBF8B0159L, 0x397B292072F41BE0L, 0x87C0409313E168DEL, 0xAD26E98847CAA39FL,
- 0x4E140C849C6785BBL, 0xD5FF551DB7F3D853L, 0xA0CA46D15D5CA40DL, 0xCD6020C787FE346FL,
- 0x84B76DCF15C3FB57L, 0xDEFDA0FCA121E4CEL, 0x4B8D7B6096012D3DL, 0x9AC642AD298A2C64L,
- 0x0875D8BD10F0AF14L, 0xB357C6EA7B8374ACL, 0x4D6321D89A451632L, 0xEDA96709C719B23FL,
- 0xF76C24BBF328BC06L, 0xC662D526912C08F2L, 0x3CE25EC47892B366L, 0xB978283F6F4F39BDL,
- 0xC08C8F9E9D6833FDL, 0x4F3917B09E79F437L, 0x593DE06FB2C08C10L, 0xD6887841B1D14BDAL,
- 0x19B26EEE32139DB0L, 0xB494876675D93E2FL, 0x825937771987C058L, 0x90E9AC783D466175L,
- 0xF1827E03FF6C8709L, 0x945DC0A8353EB87FL, 0x4516F9658AB5B926L, 0x3F9573987EB020EFL,
- 0xB855330B6D514831L, 0x2AE6A91B542BCB41L, 0x6331E413C6160479L, 0x408F8E8180D311A0L,
- 0xEFF35161C325503AL, 0xD06622F9BD9570D5L, 0x8876D9A20D4B8D49L, 0xA5533135573A0C8BL,
- 0xE168D364DF91C421L, 0xF41B09E7F50A2F8FL, 0x12B09B0F24C1A12DL, 0xDA49CC2CA9593DC4L,
- 0x1F5C34563E57A6BFL, 0x54D14F36A8568B82L, 0xAF7CDFE043F6419AL, 0xEA6A2685C943F8BCL,
- 0xE5DCBFB4D7E91D2BL, 0xB27ADDDE799D0520L, 0x6B443CAED6E6AB6DL, 0x7BAE91C9F61BE845L,
- 0x3EB868AC7CAE5163L, 0x11C7B65322E332A4L, 0xD23C1491B9A992D0L, 0x8FB5982E0311C7CAL,
- 0x70AC6428E0C9D4D8L, 0x895BC2960F55FCC5L, 0x76423E90EC8DEFD7L, 0x6FF0507EDE9E7267L,
- 0x3DCF45F07A8CC2EAL, 0x4AA06054941F5CB1L, 0x5810FB5BB0DEFD9CL, 0x5EFEA1E3BC9AC693L,
- 0x6EDD4B4ADC8003EBL, 0x741808F8E8B10DD2L, 0x145EC1B728859A22L, 0x28BC9F7350172944L,
- 0x270A06424EBDCCD3L, 0x972AEDF4331C2BF6L, 0x059977E40A66A886L, 0x2550302A4A812ED6L,
- 0xDD8A8DA0A7037747L, 0xC515F87A970E9B7BL, 0x3023EAA9601AC578L, 0xB7E3AA3A73FBADA6L,
- 0x0FB699311EAAE597L, 0x0000000000000000L, 0x310EF19D6204B4F4L, 0x229371A644DB6455L,
- 0x0DECAF591A960792L, 0x5CA4978BB8A62496L, 0x1C2B190A38753536L, 0x41A295B582CD602CL,
- 0x3279DCC16426277DL, 0xC1A194AA9F764271L, 0x139D803B26DFD0A1L, 0xAE51C4D441E83016L,
- 0xD813FA44AD65DFC1L, 0xAC0BF2BC45D4D213L, 0x23BE6A9246C515D9L, 0x49D74D08923DCF38L,
- 0x9D05032127D066E7L, 0x2F7FDEFF5E4D63C7L, 0xA47E2A0155247D07L, 0x99B16FF12FA8BFEDL,
- 0x4661D4398C972AAFL, 0xDFD0BBC8A33F9542L, 0xDCA79694A51D06CBL, 0xB020EBB67DA1E725L,
- 0xBA0F0563696DAA34L, 0xE4F1A480D5F76CA7L, 0xC438E34E9510EAF7L, 0x939E81243B64F2FCL,
- 0x8DEFAE46072D25CFL, 0x2C08F3A3586FF04EL, 0xD7A56375B3CF3A56L, 0x20C947CE40E78650L,
- 0x43F8A3DD86F18229L, 0x568B795EAC6A6987L, 0x8003011F1DBB225DL, 0xF53612D3F7145E03L,
- 0x189F75DA300DEC3CL, 0x9570DB9C3720C9F3L, 0xBB221E576B73DBB8L, 0x72F65240E4F536DDL,
- 0x443BE25188ABC8AAL, 0xE21FFE38D9B357A8L, 0xFD43CA6EE7E4F117L, 0xCAA3614B89A47EECL,
- 0xFE34E732E1C6629EL, 0x83742C431B99B1D4L, 0xCF3A16AF83C2D66AL, 0xAAE5A8044990E91CL,
- 0x26271D764CA3BD5FL, 0x91C4B74C3F5810F9L, 0x7C6DD045F841A2C6L, 0x7F1AFD19FE63314FL,
- 0xC8F957238D989CE9L, 0xA709075D5306EE8EL, 0x55FC5402AA48FA0EL, 0x48FA563C9023BEB4L,
- 0x65DFBEABCA523F76L, 0x6C877D22D8BCE1EEL, 0xCC4D3BF385E045E3L, 0xBEBB69B36115733EL,
- 0x10EAAD6720FD4328L, 0xB6CEB10E71E5DC2AL, 0xBDCC44EF6737E0B7L, 0x523F158EA412B08DL,
- 0x989C74C52DB6CE61L, 0x9BEB59992B945DE8L, 0x8A2CEFCA09776F4CL, 0xA3BD6B8D5B7E3784L,
- 0xEB473DB1CB5D8930L, 0xC3FBA2C29B4AA074L, 0x9C28181525CE176BL, 0x683311F2D0C438E4L,
- 0x5FD3BAD7BE84B71FL, 0xFC6ED15AE5FA809BL, 0x36CDB0116C5EFE77L, 0x29918447520958C8L,
- 0xA29070B959604608L, 0x53120EBAA60CC101L, 0x3A0C047C74D68869L, 0x691E0AC6D2DA4968L,
- 0x73DB4974E6EB4751L, 0x7A838AFDF40599C9L, 0x5A4ACD33B4E21F99L, 0x6046C94FC03497F0L,
- 0xE6AB92E8D1CB8EA2L, 0x3354C7F5663856F1L, 0xD93EE170AF7BAE4DL, 0x616BD27BC22AE67CL,
- 0x92B39A10397A8370L, 0xABC8B3304B8E9890L, 0xBF967287630B02B2L, 0x5B67D607B6FC6E15L
- },
- new ulong[] {
- 0xD031C397CE553FE6L, 0x16BA5B01B006B525L, 0xA89BADE6296E70C8L, 0x6A1F525D77D3435BL,
- 0x6E103570573DFA0BL, 0x660EFB2A17FC95ABL, 0x76327A9E97634BF6L, 0x4BAD9D6462458BF5L,
- 0xF1830CAEDBC3F748L, 0xC5C8F542669131FFL, 0x95044A1CDC48B0CBL, 0x892962DF3CF8B866L,
- 0xB0B9E208E930C135L, 0xA14FB3F0611A767CL, 0x8D2605F21C160136L, 0xD6B71922FECC549EL,
- 0x37089438A5907D8BL, 0x0B5DA38E5803D49CL, 0x5A5BCC9CEA6F3CBCL, 0xEDAE246D3B73FFE5L,
- 0xD2B87E0FDE22EDCEL, 0x5E54ABB1CA8185ECL, 0x1DE7F88FE80561B9L, 0xAD5E1A870135A08CL,
- 0x2F2ADBD665CECC76L, 0x5780B5A782F58358L, 0x3EDC8A2EEDE47B3FL, 0xC9D95C3506BEE70FL,
- 0x83BE111D6C4E05EEL, 0xA603B90959367410L, 0x103C81B4809FDE5DL, 0x2C69B6027D0C774AL,
- 0x399080D7D5C87953L, 0x09D41E16487406B4L, 0xCDD63B1826505E5FL, 0xF99DC2F49B0298E8L,
- 0x9CD0540A943CB67FL, 0xBCA84B7F891F17C5L, 0x723D1DB3B78DF2A6L, 0x78AA6E71E73B4F2EL,
- 0x1433E699A071670DL, 0x84F21BE454620782L, 0x98DF3327B4D20F2FL, 0xF049DCE2D3769E5CL,
- 0xDB6C60199656EB7AL, 0x648746B2078B4783L, 0x32CD23598DCBADCFL, 0x1EA4955BF0C7DA85L,
- 0xE9A143401B9D46B5L, 0xFD92A5D9BBEC21B8L, 0xC8138C790E0B8E1BL, 0x2EE00B9A6D7BA562L,
- 0xF85712B893B7F1FCL, 0xEB28FED80BEA949DL, 0x564A65EB8A40EA4CL, 0x6C9988E8474A2823L,
- 0x4535898B121D8F2DL, 0xABD8C03231ACCBF4L, 0xBA2E91CAB9867CBDL, 0x7960BE3DEF8E263AL,
- 0x0C11A977602FD6F0L, 0xCB50E1AD16C93527L, 0xEAE22E94035FFD89L, 0x2866D12F5DE2CE1AL,
- 0xFF1B1841AB9BF390L, 0x9F9339DE8CFE0D43L, 0x964727C8C48A0BF7L, 0x524502C6AAAE531CL,
- 0x9B9C5EF3AC10B413L, 0x4FA2FA4942AB32A5L, 0x3F165A62E551122BL, 0xC74148DA76E6E3D7L,
- 0x924840E5E464B2A7L, 0xD372AE43D69784DAL, 0x233B72A105E11A86L, 0xA48A04914941A638L,
- 0xB4B68525C9DE7865L, 0xDDEABAACA6CF8002L, 0x0A9773C250B6BD88L, 0xC284FFBB5EBD3393L,
- 0x8BA0DF472C8F6A4EL, 0x2AEF6CB74D951C32L, 0x427983722A318D41L, 0x73F7CDFFBF389BB2L,
- 0x074C0AF9382C026CL, 0x8A6A0F0B243A035AL, 0x6FDAE53C5F88931FL, 0xC68B98967E538AC3L,
- 0x44FF59C71AA8E639L, 0xE2FCE0CE439E9229L, 0xA20CDE2479D8CD40L, 0x19E89FA2C8EBD8E9L,
- 0xF446BBCFF398270CL, 0x43B3533E2284E455L, 0xD82F0DCD8E945046L, 0x51066F12B26CE820L,
- 0xE73957AF6BC5426DL, 0x081ECE5A40C16FA0L, 0x3B193D4FC5BFAB7BL, 0x7FE66488DF174D42L,
- 0x0E9814EF705804D8L, 0x8137AC857C39D7C6L, 0xB1733244E185A821L, 0x695C3F896F11F867L,
- 0xF6CF0657E3EFF524L, 0x1AABF276D02963D5L, 0x2DA3664E75B91E5EL, 0x0289BD981077D228L,
- 0x90C1FD7DF413608FL, 0x3C5537B6FD93A917L, 0xAA12107E3919A2E0L, 0x0686DAB530996B78L,
- 0xDAA6B0559EE3826EL, 0xC34E2FF756085A87L, 0x6D5358A44FFF4137L, 0xFC587595B35948ACL,
- 0x7CA5095CC7D5F67EL, 0xFB147F6C8B754AC0L, 0xBFEB26AB91DDACF9L, 0x6896EFC567A49173L,
- 0xCA9A31E11E7C5C33L, 0xBBE44186B13315A9L, 0x0DDB793B689ABFE4L, 0x70B4A02BA7FA208EL,
- 0xE47A3A7B7307F951L, 0x8CECD5BE14A36822L, 0xEEED49B923B144D9L, 0x17708B4DB8B3DC31L,
- 0x6088219F2765FED3L, 0xB3FA8FDCF1F27A09L, 0x910B2D31FCA6099BL, 0x0F52C4A378ED6DCCL,
- 0x50CCBF5EBAD98134L, 0x6BD582117F662A4FL, 0x94CE9A50D4FDD9DFL, 0x2B25BCFB45207526L,
- 0x67C42B661F49FCBFL, 0x492420FC723259DDL, 0x03436DD418C2BB3CL, 0x1F6E4517F872B391L,
- 0xA08563BC69AF1F68L, 0xD43EA4BAEEBB86B6L, 0x01CAD04C08B56914L, 0xAC94CACB0980C998L,
- 0x54C3D8739A373864L, 0x26FEC5C02DBACAC2L, 0xDEA9D778BE0D3B3EL, 0x040F672D20EEB950L,
- 0xE5B0EA377BB29045L, 0xF30AB136CBB42560L, 0x62019C0737122CFBL, 0xE86B930C13282FA1L,
- 0xCC1CEB542EE5374BL, 0x538FD28AA21B3A08L, 0x1B61223AD89C0AC1L, 0x36C24474AD25149FL,
- 0x7A23D3E9F74C9D06L, 0xBE21F6E79968C5EDL, 0xCF5F868036278C77L, 0xF705D61BEB5A9C30L,
- 0x4D2B47D152DCE08DL, 0x5F9E7BFDC234ECF8L, 0x247778583DCD18EAL, 0x867BA67C4415D5AAL,
- 0x4CE1979D5A698999L, 0x0000000000000000L, 0xEC64F42133C696F1L, 0xB57C5569C16B1171L,
- 0xC1C7926F467F88AFL, 0x654D96FE0F3E2E97L, 0x15F936D5A8C40E19L, 0xB8A72C52A9F1AE95L,
- 0xA9517DAA21DB19DCL, 0x58D27104FA18EE94L, 0x5918A148F2AD8780L, 0x5CDD1629DAF657C4L,
- 0x8274C15164FB6CFAL, 0xD1FB13DBC6E056F2L, 0x7D6FD910CF609F6AL, 0xB63F38BDD9A9AA4DL,
- 0x3D9FE7FAF526C003L, 0x74BBC706871499DEL, 0xDF630734B6B8522AL, 0x3AD3ED03CD0AC26FL,
- 0xFADEAF2083C023D4L, 0xC00D42234ECAE1BBL, 0x8538CBA85CD76E96L, 0xC402250E6E2458EBL,
- 0x47BC3413026A5D05L, 0xAFD7A71F114272A4L, 0x978DF784CC3F62E3L, 0xB96DFC1EA144C781L,
- 0x21B2CF391596C8AEL, 0x318E4E8D950916F3L, 0xCE9556CC3E92E563L, 0x385A509BDD7D1047L,
- 0x358129A0B5E7AFA3L, 0xE6F387E363702B79L, 0xE0755D5653E94001L, 0x7BE903A5FFF9F412L,
- 0x12B53C2C90E80C75L, 0x3307F315857EC4DBL, 0x8FAFB86A0C61D31EL, 0xD9E5DD8186213952L,
- 0x77F8AAD29FD622E2L, 0x25BDA814357871FEL, 0x7571174A8FA1F0CAL, 0x137FEC60985D6561L,
- 0x30449EC19DBC7FE7L, 0xA540D4DD41F4CF2CL, 0xDC206AE0AE7AE916L, 0x5B911CD0E2DA55A8L,
- 0xB2305F90F947131DL, 0x344BF9ECBD52C6B7L, 0x5D17C665D2433ED0L, 0x18224FEEC05EB1FDL,
- 0x9E59E992844B6457L, 0x9A568EBFA4A5DD07L, 0xA3C60E68716DA454L, 0x7E2CB4C4D7A22456L,
- 0x87B176304CA0BCBEL, 0x413AEEA632F3367DL, 0x9915E36BBC67663BL, 0x40F03EEA3A465F69L,
- 0x1C2D28C3E0B008ADL, 0x4E682A054A1E5BB1L, 0x05C5B761285BD044L, 0xE1BF8D1A5B5C2915L,
- 0xF2C0617AC3014C74L, 0xB7F5E8F1D11CC359L, 0x63CB4C4B3FA745EFL, 0x9D1A84469C89DF6BL,
- 0xE33630824B2BFB3DL, 0xD5F474F6E60EEFA2L, 0xF58C6B83FB2D4E18L, 0x4676E45F0ADF3411L,
- 0x20781F751D23A1BAL, 0xBD629B3381AA7ED1L, 0xAE1D775319F71BB0L, 0xFED1C80DA32E9A84L,
- 0x5509083F92825170L, 0x29AC01635557A70EL, 0xA7C9694551831D04L, 0x8E65682604D4BA0AL,
- 0x11F651F8882AB749L, 0xD77DC96EF6793D8AL, 0xEF2799F52B042DCDL, 0x48EEF0B07A8730C9L,
- 0x22F1A2ED0D547392L, 0x6142F1D32FD097C7L, 0x4A674D286AF0E2E1L, 0x80FD7CC9748CBED2L,
- 0x717E7067AF4F499AL, 0x938290A9ECD1DBB3L, 0x88E3B293344DD172L, 0x2734158C250FA3D6L
- }
- };
-
-
- }
-}
diff --git a/BCCrypto/src/crypto/digests/GOST3411_2012_256Digest.cs b/BCCrypto/src/crypto/digests/GOST3411_2012_256Digest.cs
deleted file mode 100644
index 8686851..0000000
--- a/BCCrypto/src/crypto/digests/GOST3411_2012_256Digest.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- public class GOST3411_2012_256Digest : GOST3411_2012Digest
- {
- private readonly static byte[] IV = {
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
- };
-
- public override string AlgorithmName
- {
- get { return "GOST3411-2012-256"; }
- }
-
- public GOST3411_2012_256Digest() : base(IV)
- {
-
- }
-
- public GOST3411_2012_256Digest(GOST3411_2012_256Digest other) : base(IV)
- {
- Reset(other);
- }
-
- public override int GetDigestSize()
- {
- return 32;
- }
-
- public override int DoFinal(byte[] output, int outOff)
- {
- byte[] result = new byte[64];
- base.DoFinal(result, 0);
-
- Array.Copy(result, 32, output, outOff, 32);
-
- return 32;
- }
-
- public override IMemoable Copy()
- {
- return new GOST3411_2012_256Digest(this);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/digests/GOST3411_2012_512Digest.cs b/BCCrypto/src/crypto/digests/GOST3411_2012_512Digest.cs
deleted file mode 100644
index eb40aba..0000000
--- a/BCCrypto/src/crypto/digests/GOST3411_2012_512Digest.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- public class GOST3411_2012_512Digest:GOST3411_2012Digest
- {
- private readonly static byte[] IV = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
-
- public override string AlgorithmName
- {
- get { return "GOST3411-2012-512"; }
- }
-
- public GOST3411_2012_512Digest():base(IV)
- {
- }
-
- public GOST3411_2012_512Digest(GOST3411_2012_512Digest other) : base(IV)
- {
- Reset(other);
- }
-
- public override int GetDigestSize()
- {
- return 64;
- }
-
- public override IMemoable Copy()
- {
- return new GOST3411_2012_512Digest(this);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/digests/GeneralDigest.cs b/BCCrypto/src/crypto/digests/GeneralDigest.cs
deleted file mode 100644
index d40ad28..0000000
--- a/BCCrypto/src/crypto/digests/GeneralDigest.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * base implementation of MD4 family style digest as outlined in
- * "Handbook of Applied Cryptography", pages 344 - 347.
- */
- public abstract class GeneralDigest
- : IDigest, IMemoable
- {
- private const int BYTE_LENGTH = 64;
-
- private byte[] xBuf;
- private int xBufOff;
-
- private long byteCount;
-
- internal GeneralDigest()
- {
- xBuf = new byte[4];
- }
-
- internal GeneralDigest(GeneralDigest t)
- {
- xBuf = new byte[t.xBuf.Length];
- CopyIn(t);
- }
-
- protected void CopyIn(GeneralDigest t)
- {
- Array.Copy(t.xBuf, 0, xBuf, 0, t.xBuf.Length);
-
- xBufOff = t.xBufOff;
- byteCount = t.byteCount;
- }
-
- public void Update(byte input)
- {
- xBuf[xBufOff++] = input;
-
- if (xBufOff == xBuf.Length)
- {
- ProcessWord(xBuf, 0);
- xBufOff = 0;
- }
-
- byteCount++;
- }
-
- public void BlockUpdate(
- byte[] input,
- int inOff,
- int length)
- {
- length = System.Math.Max(0, length);
-
- //
- // fill the current word
- //
- int i = 0;
- if (xBufOff != 0)
- {
- while (i < length)
- {
- xBuf[xBufOff++] = input[inOff + i++];
- if (xBufOff == 4)
- {
- ProcessWord(xBuf, 0);
- xBufOff = 0;
- break;
- }
- }
- }
-
- //
- // process whole words.
- //
- int limit = ((length - i) & ~3) + i;
- for (; i < limit; i += 4)
- {
- ProcessWord(input, inOff + i);
- }
-
- //
- // load in the remainder.
- //
- while (i < length)
- {
- xBuf[xBufOff++] = input[inOff + i++];
- }
-
- byteCount += length;
- }
-
- public void Finish()
- {
- long bitLength = (byteCount << 3);
-
- //
- // add the pad bytes.
- //
- Update((byte)128);
-
- while (xBufOff != 0) Update((byte)0);
- ProcessLength(bitLength);
- ProcessBlock();
- }
-
- public virtual void Reset()
- {
- byteCount = 0;
- xBufOff = 0;
- Array.Clear(xBuf, 0, xBuf.Length);
- }
-
- public int GetByteLength()
- {
- return BYTE_LENGTH;
- }
-
- internal abstract void ProcessWord(byte[] input, int inOff);
- internal abstract void ProcessLength(long bitLength);
- internal abstract void ProcessBlock();
- public abstract string AlgorithmName { get; }
- public abstract int GetDigestSize();
- public abstract int DoFinal(byte[] output, int outOff);
- public abstract IMemoable Copy();
- public abstract void Reset(IMemoable t);
- }
-}
diff --git a/BCCrypto/src/crypto/digests/KeccakDigest.cs b/BCCrypto/src/crypto/digests/KeccakDigest.cs
deleted file mode 100644
index 8b16e5d..0000000
--- a/BCCrypto/src/crypto/digests/KeccakDigest.cs
+++ /dev/null
@@ -1,479 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- ///
- /// Implementation of Keccak based on following KeccakNISTInterface.c from http://keccak.noekeon.org/
- ///
- ///
- /// Following the naming conventions used in the C source code to enable easy review of the implementation.
- ///
- public class KeccakDigest
- : IDigest, IMemoable
- {
- private static readonly ulong[] KeccakRoundConstants = KeccakInitializeRoundConstants();
-
- private static readonly int[] KeccakRhoOffsets = KeccakInitializeRhoOffsets();
-
- private static ulong[] KeccakInitializeRoundConstants()
- {
- ulong[] keccakRoundConstants = new ulong[24];
- byte LFSRState = 0x01;
-
- for (int i = 0; i < 24; i++)
- {
- keccakRoundConstants[i] = 0;
- for (int j = 0; j < 7; j++)
- {
- int bitPosition = (1 << j) - 1;
-
- // LFSR86540
-
- bool loBit = (LFSRState & 0x01) != 0;
- if (loBit)
- {
- keccakRoundConstants[i] ^= 1UL << bitPosition;
- }
-
- bool hiBit = (LFSRState & 0x80) != 0;
- LFSRState <<= 1;
- if (hiBit)
- {
- LFSRState ^= 0x71;
- }
-
- }
- }
-
- return keccakRoundConstants;
- }
-
- private static int[] KeccakInitializeRhoOffsets()
- {
- int[] keccakRhoOffsets = new int[25];
- int x, y, t, newX, newY;
-
- int rhoOffset = 0;
- keccakRhoOffsets[0] = rhoOffset;
- x = 1;
- y = 0;
- for (t = 1; t < 25; t++)
- {
- rhoOffset = (rhoOffset + t) & 63;
- keccakRhoOffsets[(((x) % 5) + 5 * ((y) % 5))] = rhoOffset;
- newX = (0 * x + 1 * y) % 5;
- newY = (2 * x + 3 * y) % 5;
- x = newX;
- y = newY;
- }
-
- return keccakRhoOffsets;
- }
-
- private static readonly int STATE_LENGTH = (1600 / 8);
-
- private ulong[] state = new ulong[STATE_LENGTH / 8];
- protected byte[] dataQueue = new byte[1536 / 8];
- protected int rate;
- protected int bitsInQueue;
- protected int fixedOutputLength;
- protected bool squeezing;
- protected int bitsAvailableForSqueezing;
-
- public KeccakDigest()
- : this(288)
- {
- }
-
- public KeccakDigest(int bitLength)
- {
- Init(bitLength);
- }
-
- public KeccakDigest(KeccakDigest source)
- {
- CopyIn(source);
- }
-
- private void CopyIn(KeccakDigest source)
- {
- Array.Copy(source.state, 0, this.state, 0, source.state.Length);
- Array.Copy(source.dataQueue, 0, this.dataQueue, 0, source.dataQueue.Length);
- this.rate = source.rate;
- this.bitsInQueue = source.bitsInQueue;
- this.fixedOutputLength = source.fixedOutputLength;
- this.squeezing = source.squeezing;
- this.bitsAvailableForSqueezing = source.bitsAvailableForSqueezing;
- }
-
- public virtual string AlgorithmName
- {
- get { return "Keccak-" + fixedOutputLength; }
- }
-
- public virtual int GetDigestSize()
- {
- return fixedOutputLength >> 3;
- }
-
- public virtual void Update(byte input)
- {
- Absorb(new byte[]{ input }, 0, 1);
- }
-
- public virtual void BlockUpdate(byte[] input, int inOff, int len)
- {
- Absorb(input, inOff, len);
- }
-
- public virtual int DoFinal(byte[] output, int outOff)
- {
- Squeeze(output, outOff, fixedOutputLength >> 3);
-
- Reset();
-
- return GetDigestSize();
- }
-
- /*
- * TODO Possible API change to support partial-byte suffixes.
- */
- protected virtual int DoFinal(byte[] output, int outOff, byte partialByte, int partialBits)
- {
- if (partialBits > 0)
- {
- AbsorbBits(partialByte, partialBits);
- }
-
- Squeeze(output, outOff, fixedOutputLength >> 3);
-
- Reset();
-
- return GetDigestSize();
- }
-
- public virtual void Reset()
- {
- Init(fixedOutputLength);
- }
-
- /**
- * Return the size of block that the compression function is applied to in bytes.
- *
- * @return internal byte length of a block.
- */
- public virtual int GetByteLength()
- {
- return rate >> 3;
- }
-
- private void Init(int bitLength)
- {
- switch (bitLength)
- {
- case 128:
- case 224:
- case 256:
- case 288:
- case 384:
- case 512:
- InitSponge(1600 - (bitLength << 1));
- break;
- default:
- throw new ArgumentException("must be one of 128, 224, 256, 288, 384, or 512.", "bitLength");
- }
- }
-
- private void InitSponge(int rate)
- {
- if (rate <= 0 || rate >= 1600 || (rate & 63) != 0)
- throw new InvalidOperationException("invalid rate value");
-
- this.rate = rate;
- Array.Clear(state, 0, state.Length);
- Arrays.Fill(this.dataQueue, (byte)0);
- this.bitsInQueue = 0;
- this.squeezing = false;
- this.bitsAvailableForSqueezing = 0;
- this.fixedOutputLength = (1600 - rate) >> 1;
- }
-
- protected void Absorb(byte[] data, int off, int len)
- {
- if ((bitsInQueue & 7) != 0)
- throw new InvalidOperationException("attempt to absorb with odd length queue");
- if (squeezing)
- throw new InvalidOperationException("attempt to absorb while squeezing");
-
- int bytesInQueue = bitsInQueue >> 3;
- int rateBytes = rate >> 3;
-
- int count = 0;
- while (count < len)
- {
- if (bytesInQueue == 0 && count <= (len - rateBytes))
- {
- do
- {
- KeccakAbsorb(data, off + count);
- count += rateBytes;
- }
- while (count <= (len - rateBytes));
- }
- else
- {
- int partialBlock = System.Math.Min(rateBytes - bytesInQueue, len - count);
- Array.Copy(data, off + count, dataQueue, bytesInQueue, partialBlock);
-
- bytesInQueue += partialBlock;
- count += partialBlock;
-
- if (bytesInQueue == rateBytes)
- {
- KeccakAbsorb(dataQueue, 0);
- bytesInQueue = 0;
- }
- }
- }
-
- bitsInQueue = bytesInQueue << 3;
- }
-
- protected void AbsorbBits(int data, int bits)
- {
- if (bits < 1 || bits > 7)
- throw new ArgumentException("must be in the range 1 to 7", "bits");
- if ((bitsInQueue & 7) != 0)
- throw new InvalidOperationException("attempt to absorb with odd length queue");
- if (squeezing)
- throw new InvalidOperationException("attempt to absorb while squeezing");
-
- int mask = (1 << bits) - 1;
- dataQueue[bitsInQueue >> 3] = (byte)(data & mask);
-
- // NOTE: After this, bitsInQueue is no longer a multiple of 8, so no more absorbs will work
- bitsInQueue += bits;
- }
-
- private void PadAndSwitchToSqueezingPhase()
- {
- Debug.Assert(bitsInQueue < rate);
-
- dataQueue[bitsInQueue >> 3] |= (byte)(1U << (bitsInQueue & 7));
-
- if (++bitsInQueue == rate)
- {
- KeccakAbsorb(dataQueue, 0);
- bitsInQueue = 0;
- }
-
- {
- int full = bitsInQueue >> 6, partial = bitsInQueue & 63;
- int off = 0;
- for (int i = 0; i < full; ++i)
- {
- state[i] ^= Pack.LE_To_UInt64(dataQueue, off);
- off += 8;
- }
- if (partial > 0)
- {
- ulong mask = (1UL << partial) - 1UL;
- state[full] ^= Pack.LE_To_UInt64(dataQueue, off) & mask;
- }
- state[(rate - 1) >> 6] ^= (1UL << 63);
- }
-
- KeccakPermutation();
- KeccakExtract();
- bitsAvailableForSqueezing = rate;
-
- bitsInQueue = 0;
- squeezing = true;
- }
-
- protected void Squeeze(byte[] output, int off, int len)
- {
- if (!squeezing)
- {
- PadAndSwitchToSqueezingPhase();
- }
-
- long outputLength = (long)len << 3;
- long i = 0;
- while (i < outputLength)
- {
- if (bitsAvailableForSqueezing == 0)
- {
- KeccakPermutation();
- KeccakExtract();
- bitsAvailableForSqueezing = rate;
- }
-
- int partialBlock = (int)System.Math.Min((long)bitsAvailableForSqueezing, outputLength - i);
- Array.Copy(dataQueue, (rate - bitsAvailableForSqueezing) >> 3, output, off + (int)(i >> 3), partialBlock >> 3);
- bitsAvailableForSqueezing -= partialBlock;
- i += partialBlock;
- }
- }
-
- private void KeccakAbsorb(byte[] data, int off)
- {
- int count = rate >> 6;
- for (int i = 0; i < count; ++i)
- {
- state[i] ^= Pack.LE_To_UInt64(data, off);
- off += 8;
- }
-
- KeccakPermutation();
- }
-
- private void KeccakExtract()
- {
- Pack.UInt64_To_LE(state, 0, rate >> 6, dataQueue, 0);
- }
-
- private void KeccakPermutation()
- {
- for (int i = 0; i < 24; i++)
- {
- Theta(state);
- Rho(state);
- Pi(state);
- Chi(state);
- Iota(state, i);
- }
- }
-
- private static ulong leftRotate(ulong v, int r)
- {
- return (v << r) | (v >> -r);
- }
-
- private static void Theta(ulong[] A)
- {
- ulong C0 = A[0 + 0] ^ A[0 + 5] ^ A[0 + 10] ^ A[0 + 15] ^ A[0 + 20];
- ulong C1 = A[1 + 0] ^ A[1 + 5] ^ A[1 + 10] ^ A[1 + 15] ^ A[1 + 20];
- ulong C2 = A[2 + 0] ^ A[2 + 5] ^ A[2 + 10] ^ A[2 + 15] ^ A[2 + 20];
- ulong C3 = A[3 + 0] ^ A[3 + 5] ^ A[3 + 10] ^ A[3 + 15] ^ A[3 + 20];
- ulong C4 = A[4 + 0] ^ A[4 + 5] ^ A[4 + 10] ^ A[4 + 15] ^ A[4 + 20];
-
- ulong dX = leftRotate(C1, 1) ^ C4;
-
- A[0] ^= dX;
- A[5] ^= dX;
- A[10] ^= dX;
- A[15] ^= dX;
- A[20] ^= dX;
-
- dX = leftRotate(C2, 1) ^ C0;
-
- A[1] ^= dX;
- A[6] ^= dX;
- A[11] ^= dX;
- A[16] ^= dX;
- A[21] ^= dX;
-
- dX = leftRotate(C3, 1) ^ C1;
-
- A[2] ^= dX;
- A[7] ^= dX;
- A[12] ^= dX;
- A[17] ^= dX;
- A[22] ^= dX;
-
- dX = leftRotate(C4, 1) ^ C2;
-
- A[3] ^= dX;
- A[8] ^= dX;
- A[13] ^= dX;
- A[18] ^= dX;
- A[23] ^= dX;
-
- dX = leftRotate(C0, 1) ^ C3;
-
- A[4] ^= dX;
- A[9] ^= dX;
- A[14] ^= dX;
- A[19] ^= dX;
- A[24] ^= dX;
- }
-
- private static void Rho(ulong[] A)
- {
- // KeccakRhoOffsets[0] == 0
- for (int x = 1; x < 25; x++)
- {
- A[x] = leftRotate(A[x], KeccakRhoOffsets[x]);
- }
- }
-
- private static void Pi(ulong[] A)
- {
- ulong a1 = A[1];
- A[1] = A[6];
- A[6] = A[9];
- A[9] = A[22];
- A[22] = A[14];
- A[14] = A[20];
- A[20] = A[2];
- A[2] = A[12];
- A[12] = A[13];
- A[13] = A[19];
- A[19] = A[23];
- A[23] = A[15];
- A[15] = A[4];
- A[4] = A[24];
- A[24] = A[21];
- A[21] = A[8];
- A[8] = A[16];
- A[16] = A[5];
- A[5] = A[3];
- A[3] = A[18];
- A[18] = A[17];
- A[17] = A[11];
- A[11] = A[7];
- A[7] = A[10];
- A[10] = a1;
- }
-
- private static void Chi(ulong[] A)
- {
- ulong chiC0, chiC1, chiC2, chiC3, chiC4;
-
- for (int yBy5 = 0; yBy5 < 25; yBy5 += 5)
- {
- chiC0 = A[0 + yBy5] ^ ((~A[(((0 + 1) % 5) + yBy5)]) & A[(((0 + 2) % 5) + yBy5)]);
- chiC1 = A[1 + yBy5] ^ ((~A[(((1 + 1) % 5) + yBy5)]) & A[(((1 + 2) % 5) + yBy5)]);
- chiC2 = A[2 + yBy5] ^ ((~A[(((2 + 1) % 5) + yBy5)]) & A[(((2 + 2) % 5) + yBy5)]);
- chiC3 = A[3 + yBy5] ^ ((~A[(((3 + 1) % 5) + yBy5)]) & A[(((3 + 2) % 5) + yBy5)]);
- chiC4 = A[4 + yBy5] ^ ((~A[(((4 + 1) % 5) + yBy5)]) & A[(((4 + 2) % 5) + yBy5)]);
-
- A[0 + yBy5] = chiC0;
- A[1 + yBy5] = chiC1;
- A[2 + yBy5] = chiC2;
- A[3 + yBy5] = chiC3;
- A[4 + yBy5] = chiC4;
- }
- }
-
- private static void Iota(ulong[] A, int indexRound)
- {
- A[0] ^= KeccakRoundConstants[indexRound];
- }
-
- public virtual IMemoable Copy()
- {
- return new KeccakDigest(this);
- }
-
- public virtual void Reset(IMemoable other)
- {
- CopyIn((KeccakDigest)other);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/digests/LongDigest.cs b/BCCrypto/src/crypto/digests/LongDigest.cs
deleted file mode 100644
index 9ee9bcd..0000000
--- a/BCCrypto/src/crypto/digests/LongDigest.cs
+++ /dev/null
@@ -1,355 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * Base class for SHA-384 and SHA-512.
- */
- public abstract class LongDigest
- : IDigest, IMemoable
- {
- private int MyByteLength = 128;
-
- private byte[] xBuf;
- private int xBufOff;
-
- private long byteCount1;
- private long byteCount2;
-
- internal ulong H1, H2, H3, H4, H5, H6, H7, H8;
-
- private ulong[] W = new ulong[80];
- private int wOff;
-
- /**
- * Constructor for variable length word
- */
- internal LongDigest()
- {
- xBuf = new byte[8];
-
- Reset();
- }
-
- /**
- * Copy constructor. We are using copy constructors in place
- * of the object.Clone() interface as this interface is not
- * supported by J2ME.
- */
- internal LongDigest(
- LongDigest t)
- {
- xBuf = new byte[t.xBuf.Length];
-
- CopyIn(t);
- }
-
- protected void CopyIn(LongDigest t)
- {
- Array.Copy(t.xBuf, 0, xBuf, 0, t.xBuf.Length);
-
- xBufOff = t.xBufOff;
- byteCount1 = t.byteCount1;
- byteCount2 = t.byteCount2;
-
- H1 = t.H1;
- H2 = t.H2;
- H3 = t.H3;
- H4 = t.H4;
- H5 = t.H5;
- H6 = t.H6;
- H7 = t.H7;
- H8 = t.H8;
-
- Array.Copy(t.W, 0, W, 0, t.W.Length);
- wOff = t.wOff;
- }
-
- public void Update(
- byte input)
- {
- xBuf[xBufOff++] = input;
-
- if (xBufOff == xBuf.Length)
- {
- ProcessWord(xBuf, 0);
- xBufOff = 0;
- }
-
- byteCount1++;
- }
-
- public void BlockUpdate(
- byte[] input,
- int inOff,
- int length)
- {
- //
- // fill the current word
- //
- while ((xBufOff != 0) && (length > 0))
- {
- Update(input[inOff]);
-
- inOff++;
- length--;
- }
-
- //
- // process whole words.
- //
- while (length > xBuf.Length)
- {
- ProcessWord(input, inOff);
-
- inOff += xBuf.Length;
- length -= xBuf.Length;
- byteCount1 += xBuf.Length;
- }
-
- //
- // load in the remainder.
- //
- while (length > 0)
- {
- Update(input[inOff]);
-
- inOff++;
- length--;
- }
- }
-
- public void Finish()
- {
- AdjustByteCounts();
-
- long lowBitLength = byteCount1 << 3;
- long hiBitLength = byteCount2;
-
- //
- // add the pad bytes.
- //
- Update((byte)128);
-
- while (xBufOff != 0)
- {
- Update((byte)0);
- }
-
- ProcessLength(lowBitLength, hiBitLength);
-
- ProcessBlock();
- }
-
- public virtual void Reset()
- {
- byteCount1 = 0;
- byteCount2 = 0;
-
- xBufOff = 0;
- for ( int i = 0; i < xBuf.Length; i++ )
- {
- xBuf[i] = 0;
- }
-
- wOff = 0;
- Array.Clear(W, 0, W.Length);
- }
-
- internal void ProcessWord(
- byte[] input,
- int inOff)
- {
- W[wOff] = Pack.BE_To_UInt64(input, inOff);
-
- if (++wOff == 16)
- {
- ProcessBlock();
- }
- }
-
- /**
- * adjust the byte counts so that byteCount2 represents the
- * upper long (less 3 bits) word of the byte count.
- */
- private void AdjustByteCounts()
- {
- if (byteCount1 > 0x1fffffffffffffffL)
- {
- byteCount2 += (long) ((ulong) byteCount1 >> 61);
- byteCount1 &= 0x1fffffffffffffffL;
- }
- }
-
- internal void ProcessLength(
- long lowW,
- long hiW)
- {
- if (wOff > 14)
- {
- ProcessBlock();
- }
-
- W[14] = (ulong)hiW;
- W[15] = (ulong)lowW;
- }
-
- internal void ProcessBlock()
- {
- AdjustByteCounts();
-
- //
- // expand 16 word block into 80 word blocks.
- //
- for (int ti = 16; ti <= 79; ++ti)
- {
- W[ti] = Sigma1(W[ti - 2]) + W[ti - 7] + Sigma0(W[ti - 15]) + W[ti - 16];
- }
-
- //
- // set up working variables.
- //
- ulong a = H1;
- ulong b = H2;
- ulong c = H3;
- ulong d = H4;
- ulong e = H5;
- ulong f = H6;
- ulong g = H7;
- ulong h = H8;
-
- int t = 0;
- for(int i = 0; i < 10; i ++)
- {
- // t = 8 * i
- h += Sum1(e) + Ch(e, f, g) + K[t] + W[t++];
- d += h;
- h += Sum0(a) + Maj(a, b, c);
-
- // t = 8 * i + 1
- g += Sum1(d) + Ch(d, e, f) + K[t] + W[t++];
- c += g;
- g += Sum0(h) + Maj(h, a, b);
-
- // t = 8 * i + 2
- f += Sum1(c) + Ch(c, d, e) + K[t] + W[t++];
- b += f;
- f += Sum0(g) + Maj(g, h, a);
-
- // t = 8 * i + 3
- e += Sum1(b) + Ch(b, c, d) + K[t] + W[t++];
- a += e;
- e += Sum0(f) + Maj(f, g, h);
-
- // t = 8 * i + 4
- d += Sum1(a) + Ch(a, b, c) + K[t] + W[t++];
- h += d;
- d += Sum0(e) + Maj(e, f, g);
-
- // t = 8 * i + 5
- c += Sum1(h) + Ch(h, a, b) + K[t] + W[t++];
- g += c;
- c += Sum0(d) + Maj(d, e, f);
-
- // t = 8 * i + 6
- b += Sum1(g) + Ch(g, h, a) + K[t] + W[t++];
- f += b;
- b += Sum0(c) + Maj(c, d, e);
-
- // t = 8 * i + 7
- a += Sum1(f) + Ch(f, g, h) + K[t] + W[t++];
- e += a;
- a += Sum0(b) + Maj(b, c, d);
- }
-
- H1 += a;
- H2 += b;
- H3 += c;
- H4 += d;
- H5 += e;
- H6 += f;
- H7 += g;
- H8 += h;
-
- //
- // reset the offset and clean out the word buffer.
- //
- wOff = 0;
- Array.Clear(W, 0, 16);
- }
-
- /* SHA-384 and SHA-512 functions (as for SHA-256 but for longs) */
- private static ulong Ch(ulong x, ulong y, ulong z)
- {
- return (x & y) ^ (~x & z);
- }
-
- private static ulong Maj(ulong x, ulong y, ulong z)
- {
- return (x & y) ^ (x & z) ^ (y & z);
- }
-
- private static ulong Sum0(ulong x)
- {
- return ((x << 36) | (x >> 28)) ^ ((x << 30) | (x >> 34)) ^ ((x << 25) | (x >> 39));
- }
-
- private static ulong Sum1(ulong x)
- {
- return ((x << 50) | (x >> 14)) ^ ((x << 46) | (x >> 18)) ^ ((x << 23) | (x >> 41));
- }
-
- private static ulong Sigma0(ulong x)
- {
- return ((x << 63) | (x >> 1)) ^ ((x << 56) | (x >> 8)) ^ (x >> 7);
- }
-
- private static ulong Sigma1(ulong x)
- {
- return ((x << 45) | (x >> 19)) ^ ((x << 3) | (x >> 61)) ^ (x >> 6);
- }
-
- /* SHA-384 and SHA-512 Constants
- * (represent the first 64 bits of the fractional parts of the
- * cube roots of the first sixty-four prime numbers)
- */
- internal static readonly ulong[] K =
- {
- 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,
- 0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,
- 0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,
- 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,
- 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,
- 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,
- 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,
- 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,
- 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,
- 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,
- 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,
- 0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,
- 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,
- 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,
- 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,
- 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,
- 0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,
- 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,
- 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,
- 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
- };
-
- public int GetByteLength()
- {
- return MyByteLength;
- }
-
- public abstract string AlgorithmName { get; }
- public abstract int GetDigestSize();
- public abstract int DoFinal(byte[] output, int outOff);
- public abstract IMemoable Copy();
- public abstract void Reset(IMemoable t);
- }
-}
diff --git a/BCCrypto/src/crypto/digests/MD2Digest.cs b/BCCrypto/src/crypto/digests/MD2Digest.cs
deleted file mode 100644
index 6d90f3f..0000000
--- a/BCCrypto/src/crypto/digests/MD2Digest.cs
+++ /dev/null
@@ -1,269 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
-
- /**
- * implementation of MD2
- * as outlined in RFC1319 by B.Kaliski from RSA Laboratories April 1992
- */
- public class MD2Digest
- : IDigest, IMemoable
- {
- private const int DigestLength = 16;
- private const int BYTE_LENGTH = 16;
-
- /* X buffer */
- private byte[] X = new byte[48];
- private int xOff;
-
- /* M buffer */
-
- private byte[] M = new byte[16];
- private int mOff;
-
- /* check sum */
-
- private byte[] C = new byte[16];
- private int COff;
-
- public MD2Digest()
- {
- Reset();
- }
-
- public MD2Digest(MD2Digest t)
- {
- CopyIn(t);
- }
-
- private void CopyIn(MD2Digest t)
- {
- Array.Copy(t.X, 0, X, 0, t.X.Length);
- xOff = t.xOff;
- Array.Copy(t.M, 0, M, 0, t.M.Length);
- mOff = t.mOff;
- Array.Copy(t.C, 0, C, 0, t.C.Length);
- COff = t.COff;
- }
-
- /**
- * return the algorithm name
- *
- * @return the algorithm name
- */
- public string AlgorithmName
- {
- get { return "MD2"; }
- }
-
- public int GetDigestSize()
- {
- return DigestLength;
- }
-
- public int GetByteLength()
- {
- return BYTE_LENGTH;
- }
-
- /**
- * Close the digest, producing the final digest value. The doFinal
- * call leaves the digest reset.
- *
- * @param out the array the digest is to be copied into.
- * @param outOff the offset into the out array the digest is to start at.
- */
- public int DoFinal(byte[] output, int outOff)
- {
- // add padding
- byte paddingByte = (byte)(M.Length - mOff);
- for (int i=mOff;i 0))
- {
- Update(input[inOff]);
- inOff++;
- length--;
- }
-
- //
- // process whole words.
- //
- while (length > 16)
- {
- Array.Copy(input,inOff,M,0,16);
- ProcessChecksum(M);
- ProcessBlock(M);
- length -= 16;
- inOff += 16;
- }
-
- //
- // load in the remainder.
- //
- while (length > 0)
- {
- Update(input[inOff]);
- inOff++;
- length--;
- }
- }
-
- internal void ProcessChecksum(byte[] m)
- {
- int L = C[15];
- for (int i=0;i<16;i++)
- {
- C[i] ^= S[(m[i] ^ L) & 0xff];
- L = C[i];
- }
- }
- internal void ProcessBlock(byte[] m)
- {
- for (int i=0;i<16;i++)
- {
- X[i+16] = m[i];
- X[i+32] = (byte)(m[i] ^ X[i]);
- }
- // encrypt block
- int t = 0;
-
- for (int j=0;j<18;j++)
- {
- for (int k=0;k<48;k++)
- {
- t = X[k] ^= S[t];
- t = t & 0xff;
- }
- t = (t + j)%256;
- }
- }
-
-
-
- // 256-byte random permutation constructed from the digits of PI
- private static readonly byte[] S = {
- (byte)41,(byte)46,(byte)67,(byte)201,(byte)162,(byte)216,(byte)124,
- (byte)1,(byte)61,(byte)54,(byte)84,(byte)161,(byte)236,(byte)240,
- (byte)6,(byte)19,(byte)98,(byte)167,(byte)5,(byte)243,(byte)192,
- (byte)199,(byte)115,(byte)140,(byte)152,(byte)147,(byte)43,(byte)217,
- (byte)188,(byte)76,(byte)130,(byte)202,(byte)30,(byte)155,(byte)87,
- (byte)60,(byte)253,(byte)212,(byte)224,(byte)22,(byte)103,(byte)66,
- (byte)111,(byte)24,(byte)138,(byte)23,(byte)229,(byte)18,(byte)190,
- (byte)78,(byte)196,(byte)214,(byte)218,(byte)158,(byte)222,(byte)73,
- (byte)160,(byte)251,(byte)245,(byte)142,(byte)187,(byte)47,(byte)238,
- (byte)122,(byte)169,(byte)104,(byte)121,(byte)145,(byte)21,(byte)178,
- (byte)7,(byte)63,(byte)148,(byte)194,(byte)16,(byte)137,(byte)11,
- (byte)34,(byte)95,(byte)33,(byte)128,(byte)127,(byte)93,(byte)154,
- (byte)90,(byte)144,(byte)50,(byte)39,(byte)53,(byte)62,(byte)204,
- (byte)231,(byte)191,(byte)247,(byte)151,(byte)3,(byte)255,(byte)25,
- (byte)48,(byte)179,(byte)72,(byte)165,(byte)181,(byte)209,(byte)215,
- (byte)94,(byte)146,(byte)42,(byte)172,(byte)86,(byte)170,(byte)198,
- (byte)79,(byte)184,(byte)56,(byte)210,(byte)150,(byte)164,(byte)125,
- (byte)182,(byte)118,(byte)252,(byte)107,(byte)226,(byte)156,(byte)116,
- (byte)4,(byte)241,(byte)69,(byte)157,(byte)112,(byte)89,(byte)100,
- (byte)113,(byte)135,(byte)32,(byte)134,(byte)91,(byte)207,(byte)101,
- (byte)230,(byte)45,(byte)168,(byte)2,(byte)27,(byte)96,(byte)37,
- (byte)173,(byte)174,(byte)176,(byte)185,(byte)246,(byte)28,(byte)70,
- (byte)97,(byte)105,(byte)52,(byte)64,(byte)126,(byte)15,(byte)85,
- (byte)71,(byte)163,(byte)35,(byte)221,(byte)81,(byte)175,(byte)58,
- (byte)195,(byte)92,(byte)249,(byte)206,(byte)186,(byte)197,(byte)234,
- (byte)38,(byte)44,(byte)83,(byte)13,(byte)110,(byte)133,(byte)40,
- (byte)132, 9,(byte)211,(byte)223,(byte)205,(byte)244,(byte)65,
- (byte)129,(byte)77,(byte)82,(byte)106,(byte)220,(byte)55,(byte)200,
- (byte)108,(byte)193,(byte)171,(byte)250,(byte)36,(byte)225,(byte)123,
- (byte)8,(byte)12,(byte)189,(byte)177,(byte)74,(byte)120,(byte)136,
- (byte)149,(byte)139,(byte)227,(byte)99,(byte)232,(byte)109,(byte)233,
- (byte)203,(byte)213,(byte)254,(byte)59,(byte)0,(byte)29,(byte)57,
- (byte)242,(byte)239,(byte)183,(byte)14,(byte)102,(byte)88,(byte)208,
- (byte)228,(byte)166,(byte)119,(byte)114,(byte)248,(byte)235,(byte)117,
- (byte)75,(byte)10,(byte)49,(byte)68,(byte)80,(byte)180,(byte)143,
- (byte)237,(byte)31,(byte)26,(byte)219,(byte)153,(byte)141,(byte)51,
- (byte)159,(byte)17,(byte)131,(byte)20
- };
-
- public IMemoable Copy()
- {
- return new MD2Digest(this);
- }
-
- public void Reset(IMemoable other)
- {
- MD2Digest d = (MD2Digest)other;
-
- CopyIn(d);
- }
-
- }
-
-}
diff --git a/BCCrypto/src/crypto/digests/MD4Digest.cs b/BCCrypto/src/crypto/digests/MD4Digest.cs
deleted file mode 100644
index 8743f7d..0000000
--- a/BCCrypto/src/crypto/digests/MD4Digest.cs
+++ /dev/null
@@ -1,292 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * implementation of MD4 as RFC 1320 by R. Rivest, MIT Laboratory for
- * Computer Science and RSA Data Security, Inc.
- *
- * NOTE : This algorithm is only included for backwards compatibility
- * with legacy applications, it's not secure, don't use it for anything new!
- */
- public class MD4Digest
- : GeneralDigest
- {
- private const int DigestLength = 16;
-
- private int H1, H2, H3, H4; // IV's
-
- private int[] X = new int[16];
- private int xOff;
-
- /**
- * Standard constructor
- */
- public MD4Digest()
- {
- Reset();
- }
-
- /**
- * Copy constructor. This will copy the state of the provided
- * message digest.
- */
- public MD4Digest(MD4Digest t) : base(t)
- {
- CopyIn(t);
- }
-
- private void CopyIn(MD4Digest t)
- {
- base.CopyIn(t);
- H1 = t.H1;
- H2 = t.H2;
- H3 = t.H3;
- H4 = t.H4;
-
- Array.Copy(t.X, 0, X, 0, t.X.Length);
- xOff = t.xOff;
- }
-
- public override string AlgorithmName
- {
- get { return "MD4"; }
- }
-
- public override int GetDigestSize()
- {
- return DigestLength;
- }
-
- internal override void ProcessWord(
- byte[] input,
- int inOff)
- {
- X[xOff++] = (input[inOff] & 0xff) | ((input[inOff + 1] & 0xff) << 8)
- | ((input[inOff + 2] & 0xff) << 16) | ((input[inOff + 3] & 0xff) << 24);
-
- if (xOff == 16)
- {
- ProcessBlock();
- }
- }
-
- internal override void ProcessLength(
- long bitLength)
- {
- if (xOff > 14)
- {
- ProcessBlock();
- }
-
- X[14] = (int)(bitLength & 0xffffffff);
- X[15] = (int)((ulong) bitLength >> 32);
- }
-
- private void UnpackWord(
- int word,
- byte[] outBytes,
- int outOff)
- {
- outBytes[outOff] = (byte)word;
- outBytes[outOff + 1] = (byte)((uint) word >> 8);
- outBytes[outOff + 2] = (byte)((uint) word >> 16);
- outBytes[outOff + 3] = (byte)((uint) word >> 24);
- }
-
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- Finish();
-
- UnpackWord(H1, output, outOff);
- UnpackWord(H2, output, outOff + 4);
- UnpackWord(H3, output, outOff + 8);
- UnpackWord(H4, output, outOff + 12);
-
- Reset();
-
- return DigestLength;
- }
-
- /**
- * reset the chaining variables to the IV values.
- */
- public override void Reset()
- {
- base.Reset();
-
- H1 = unchecked((int) 0x67452301);
- H2 = unchecked((int) 0xefcdab89);
- H3 = unchecked((int) 0x98badcfe);
- H4 = unchecked((int) 0x10325476);
-
- xOff = 0;
-
- for (int i = 0; i != X.Length; i++)
- {
- X[i] = 0;
- }
- }
-
- //
- // round 1 left rotates
- //
- private const int S11 = 3;
- private const int S12 = 7;
- private const int S13 = 11;
- private const int S14 = 19;
-
- //
- // round 2 left rotates
- //
- private const int S21 = 3;
- private const int S22 = 5;
- private const int S23 = 9;
- private const int S24 = 13;
-
- //
- // round 3 left rotates
- //
- private const int S31 = 3;
- private const int S32 = 9;
- private const int S33 = 11;
- private const int S34 = 15;
-
- /*
- * rotate int x left n bits.
- */
- private int RotateLeft(
- int x,
- int n)
- {
- return (x << n) | (int) ((uint) x >> (32 - n));
- }
-
- /*
- * F, G, H and I are the basic MD4 functions.
- */
- private int F(
- int u,
- int v,
- int w)
- {
- return (u & v) | (~u & w);
- }
-
- private int G(
- int u,
- int v,
- int w)
- {
- return (u & v) | (u & w) | (v & w);
- }
-
- private int H(
- int u,
- int v,
- int w)
- {
- return u ^ v ^ w;
- }
-
- internal override void ProcessBlock()
- {
- int a = H1;
- int b = H2;
- int c = H3;
- int d = H4;
-
- //
- // Round 1 - F cycle, 16 times.
- //
- a = RotateLeft((a + F(b, c, d) + X[ 0]), S11);
- d = RotateLeft((d + F(a, b, c) + X[ 1]), S12);
- c = RotateLeft((c + F(d, a, b) + X[ 2]), S13);
- b = RotateLeft((b + F(c, d, a) + X[ 3]), S14);
- a = RotateLeft((a + F(b, c, d) + X[ 4]), S11);
- d = RotateLeft((d + F(a, b, c) + X[ 5]), S12);
- c = RotateLeft((c + F(d, a, b) + X[ 6]), S13);
- b = RotateLeft((b + F(c, d, a) + X[ 7]), S14);
- a = RotateLeft((a + F(b, c, d) + X[ 8]), S11);
- d = RotateLeft((d + F(a, b, c) + X[ 9]), S12);
- c = RotateLeft((c + F(d, a, b) + X[10]), S13);
- b = RotateLeft((b + F(c, d, a) + X[11]), S14);
- a = RotateLeft((a + F(b, c, d) + X[12]), S11);
- d = RotateLeft((d + F(a, b, c) + X[13]), S12);
- c = RotateLeft((c + F(d, a, b) + X[14]), S13);
- b = RotateLeft((b + F(c, d, a) + X[15]), S14);
-
- //
- // Round 2 - G cycle, 16 times.
- //
- a = RotateLeft((a + G(b, c, d) + X[ 0] + 0x5a827999), S21);
- d = RotateLeft((d + G(a, b, c) + X[ 4] + 0x5a827999), S22);
- c = RotateLeft((c + G(d, a, b) + X[ 8] + 0x5a827999), S23);
- b = RotateLeft((b + G(c, d, a) + X[12] + 0x5a827999), S24);
- a = RotateLeft((a + G(b, c, d) + X[ 1] + 0x5a827999), S21);
- d = RotateLeft((d + G(a, b, c) + X[ 5] + 0x5a827999), S22);
- c = RotateLeft((c + G(d, a, b) + X[ 9] + 0x5a827999), S23);
- b = RotateLeft((b + G(c, d, a) + X[13] + 0x5a827999), S24);
- a = RotateLeft((a + G(b, c, d) + X[ 2] + 0x5a827999), S21);
- d = RotateLeft((d + G(a, b, c) + X[ 6] + 0x5a827999), S22);
- c = RotateLeft((c + G(d, a, b) + X[10] + 0x5a827999), S23);
- b = RotateLeft((b + G(c, d, a) + X[14] + 0x5a827999), S24);
- a = RotateLeft((a + G(b, c, d) + X[ 3] + 0x5a827999), S21);
- d = RotateLeft((d + G(a, b, c) + X[ 7] + 0x5a827999), S22);
- c = RotateLeft((c + G(d, a, b) + X[11] + 0x5a827999), S23);
- b = RotateLeft((b + G(c, d, a) + X[15] + 0x5a827999), S24);
-
- //
- // Round 3 - H cycle, 16 times.
- //
- a = RotateLeft((a + H(b, c, d) + X[ 0] + 0x6ed9eba1), S31);
- d = RotateLeft((d + H(a, b, c) + X[ 8] + 0x6ed9eba1), S32);
- c = RotateLeft((c + H(d, a, b) + X[ 4] + 0x6ed9eba1), S33);
- b = RotateLeft((b + H(c, d, a) + X[12] + 0x6ed9eba1), S34);
- a = RotateLeft((a + H(b, c, d) + X[ 2] + 0x6ed9eba1), S31);
- d = RotateLeft((d + H(a, b, c) + X[10] + 0x6ed9eba1), S32);
- c = RotateLeft((c + H(d, a, b) + X[ 6] + 0x6ed9eba1), S33);
- b = RotateLeft((b + H(c, d, a) + X[14] + 0x6ed9eba1), S34);
- a = RotateLeft((a + H(b, c, d) + X[ 1] + 0x6ed9eba1), S31);
- d = RotateLeft((d + H(a, b, c) + X[ 9] + 0x6ed9eba1), S32);
- c = RotateLeft((c + H(d, a, b) + X[ 5] + 0x6ed9eba1), S33);
- b = RotateLeft((b + H(c, d, a) + X[13] + 0x6ed9eba1), S34);
- a = RotateLeft((a + H(b, c, d) + X[ 3] + 0x6ed9eba1), S31);
- d = RotateLeft((d + H(a, b, c) + X[11] + 0x6ed9eba1), S32);
- c = RotateLeft((c + H(d, a, b) + X[ 7] + 0x6ed9eba1), S33);
- b = RotateLeft((b + H(c, d, a) + X[15] + 0x6ed9eba1), S34);
-
- H1 += a;
- H2 += b;
- H3 += c;
- H4 += d;
-
- //
- // reset the offset and clean out the word buffer.
- //
- xOff = 0;
- for (int i = 0; i != X.Length; i++)
- {
- X[i] = 0;
- }
- }
-
- public override IMemoable Copy()
- {
- return new MD4Digest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- MD4Digest d = (MD4Digest)other;
-
- CopyIn(d);
- }
-
- }
-
-}
diff --git a/BCCrypto/src/crypto/digests/MD5Digest.cs b/BCCrypto/src/crypto/digests/MD5Digest.cs
deleted file mode 100644
index c60ac92..0000000
--- a/BCCrypto/src/crypto/digests/MD5Digest.cs
+++ /dev/null
@@ -1,313 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * implementation of MD5 as outlined in "Handbook of Applied Cryptography", pages 346 - 347.
- */
- public class MD5Digest
- : GeneralDigest
- {
- private const int DigestLength = 16;
-
- private uint H1, H2, H3, H4; // IV's
-
- private uint[] X = new uint[16];
- private int xOff;
-
- public MD5Digest()
- {
- Reset();
- }
-
- /**
- * Copy constructor. This will copy the state of the provided
- * message digest.
- */
- public MD5Digest(MD5Digest t)
- : base(t)
- {
- CopyIn(t);
- }
-
- private void CopyIn(MD5Digest t)
- {
- base.CopyIn(t);
- H1 = t.H1;
- H2 = t.H2;
- H3 = t.H3;
- H4 = t.H4;
-
- Array.Copy(t.X, 0, X, 0, t.X.Length);
- xOff = t.xOff;
- }
-
- public override string AlgorithmName
- {
- get { return "MD5"; }
- }
-
- public override int GetDigestSize()
- {
- return DigestLength;
- }
-
- internal override void ProcessWord(
- byte[] input,
- int inOff)
- {
- X[xOff] = Pack.LE_To_UInt32(input, inOff);
-
- if (++xOff == 16)
- {
- ProcessBlock();
- }
- }
-
- internal override void ProcessLength(
- long bitLength)
- {
- if (xOff > 14)
- {
- if (xOff == 15)
- X[15] = 0;
-
- ProcessBlock();
- }
-
- for (int i = xOff; i < 14; ++i)
- {
- X[i] = 0;
- }
-
- X[14] = (uint)((ulong)bitLength);
- X[15] = (uint)((ulong)bitLength >> 32);
- }
-
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- Finish();
-
- Pack.UInt32_To_LE(H1, output, outOff);
- Pack.UInt32_To_LE(H2, output, outOff + 4);
- Pack.UInt32_To_LE(H3, output, outOff + 8);
- Pack.UInt32_To_LE(H4, output, outOff + 12);
-
- Reset();
-
- return DigestLength;
- }
-
- /**
- * reset the chaining variables to the IV values.
- */
- public override void Reset()
- {
- base.Reset();
-
- H1 = 0x67452301;
- H2 = 0xefcdab89;
- H3 = 0x98badcfe;
- H4 = 0x10325476;
-
- xOff = 0;
-
- for (int i = 0; i != X.Length; i++)
- {
- X[i] = 0;
- }
- }
-
- //
- // round 1 left rotates
- //
- private static readonly int S11 = 7;
- private static readonly int S12 = 12;
- private static readonly int S13 = 17;
- private static readonly int S14 = 22;
-
- //
- // round 2 left rotates
- //
- private static readonly int S21 = 5;
- private static readonly int S22 = 9;
- private static readonly int S23 = 14;
- private static readonly int S24 = 20;
-
- //
- // round 3 left rotates
- //
- private static readonly int S31 = 4;
- private static readonly int S32 = 11;
- private static readonly int S33 = 16;
- private static readonly int S34 = 23;
-
- //
- // round 4 left rotates
- //
- private static readonly int S41 = 6;
- private static readonly int S42 = 10;
- private static readonly int S43 = 15;
- private static readonly int S44 = 21;
-
- /*
- * rotate int x left n bits.
- */
- private static uint RotateLeft(
- uint x,
- int n)
- {
- return (x << n) | (x >> (32 - n));
- }
-
- /*
- * F, G, H and I are the basic MD5 functions.
- */
- private static uint F(
- uint u,
- uint v,
- uint w)
- {
- return (u & v) | (~u & w);
- }
-
- private static uint G(
- uint u,
- uint v,
- uint w)
- {
- return (u & w) | (v & ~w);
- }
-
- private static uint H(
- uint u,
- uint v,
- uint w)
- {
- return u ^ v ^ w;
- }
-
- private static uint K(
- uint u,
- uint v,
- uint w)
- {
- return v ^ (u | ~w);
- }
-
- internal override void ProcessBlock()
- {
- uint a = H1;
- uint b = H2;
- uint c = H3;
- uint d = H4;
-
- //
- // Round 1 - F cycle, 16 times.
- //
- a = RotateLeft((a + F(b, c, d) + X[0] + 0xd76aa478), S11) + b;
- d = RotateLeft((d + F(a, b, c) + X[1] + 0xe8c7b756), S12) + a;
- c = RotateLeft((c + F(d, a, b) + X[2] + 0x242070db), S13) + d;
- b = RotateLeft((b + F(c, d, a) + X[3] + 0xc1bdceee), S14) + c;
- a = RotateLeft((a + F(b, c, d) + X[4] + 0xf57c0faf), S11) + b;
- d = RotateLeft((d + F(a, b, c) + X[5] + 0x4787c62a), S12) + a;
- c = RotateLeft((c + F(d, a, b) + X[6] + 0xa8304613), S13) + d;
- b = RotateLeft((b + F(c, d, a) + X[7] + 0xfd469501), S14) + c;
- a = RotateLeft((a + F(b, c, d) + X[8] + 0x698098d8), S11) + b;
- d = RotateLeft((d + F(a, b, c) + X[9] + 0x8b44f7af), S12) + a;
- c = RotateLeft((c + F(d, a, b) + X[10] + 0xffff5bb1), S13) + d;
- b = RotateLeft((b + F(c, d, a) + X[11] + 0x895cd7be), S14) + c;
- a = RotateLeft((a + F(b, c, d) + X[12] + 0x6b901122), S11) + b;
- d = RotateLeft((d + F(a, b, c) + X[13] + 0xfd987193), S12) + a;
- c = RotateLeft((c + F(d, a, b) + X[14] + 0xa679438e), S13) + d;
- b = RotateLeft((b + F(c, d, a) + X[15] + 0x49b40821), S14) + c;
-
- //
- // Round 2 - G cycle, 16 times.
- //
- a = RotateLeft((a + G(b, c, d) + X[1] + 0xf61e2562), S21) + b;
- d = RotateLeft((d + G(a, b, c) + X[6] + 0xc040b340), S22) + a;
- c = RotateLeft((c + G(d, a, b) + X[11] + 0x265e5a51), S23) + d;
- b = RotateLeft((b + G(c, d, a) + X[0] + 0xe9b6c7aa), S24) + c;
- a = RotateLeft((a + G(b, c, d) + X[5] + 0xd62f105d), S21) + b;
- d = RotateLeft((d + G(a, b, c) + X[10] + 0x02441453), S22) + a;
- c = RotateLeft((c + G(d, a, b) + X[15] + 0xd8a1e681), S23) + d;
- b = RotateLeft((b + G(c, d, a) + X[4] + 0xe7d3fbc8), S24) + c;
- a = RotateLeft((a + G(b, c, d) + X[9] + 0x21e1cde6), S21) + b;
- d = RotateLeft((d + G(a, b, c) + X[14] + 0xc33707d6), S22) + a;
- c = RotateLeft((c + G(d, a, b) + X[3] + 0xf4d50d87), S23) + d;
- b = RotateLeft((b + G(c, d, a) + X[8] + 0x455a14ed), S24) + c;
- a = RotateLeft((a + G(b, c, d) + X[13] + 0xa9e3e905), S21) + b;
- d = RotateLeft((d + G(a, b, c) + X[2] + 0xfcefa3f8), S22) + a;
- c = RotateLeft((c + G(d, a, b) + X[7] + 0x676f02d9), S23) + d;
- b = RotateLeft((b + G(c, d, a) + X[12] + 0x8d2a4c8a), S24) + c;
-
- //
- // Round 3 - H cycle, 16 times.
- //
- a = RotateLeft((a + H(b, c, d) + X[5] + 0xfffa3942), S31) + b;
- d = RotateLeft((d + H(a, b, c) + X[8] + 0x8771f681), S32) + a;
- c = RotateLeft((c + H(d, a, b) + X[11] + 0x6d9d6122), S33) + d;
- b = RotateLeft((b + H(c, d, a) + X[14] + 0xfde5380c), S34) + c;
- a = RotateLeft((a + H(b, c, d) + X[1] + 0xa4beea44), S31) + b;
- d = RotateLeft((d + H(a, b, c) + X[4] + 0x4bdecfa9), S32) + a;
- c = RotateLeft((c + H(d, a, b) + X[7] + 0xf6bb4b60), S33) + d;
- b = RotateLeft((b + H(c, d, a) + X[10] + 0xbebfbc70), S34) + c;
- a = RotateLeft((a + H(b, c, d) + X[13] + 0x289b7ec6), S31) + b;
- d = RotateLeft((d + H(a, b, c) + X[0] + 0xeaa127fa), S32) + a;
- c = RotateLeft((c + H(d, a, b) + X[3] + 0xd4ef3085), S33) + d;
- b = RotateLeft((b + H(c, d, a) + X[6] + 0x04881d05), S34) + c;
- a = RotateLeft((a + H(b, c, d) + X[9] + 0xd9d4d039), S31) + b;
- d = RotateLeft((d + H(a, b, c) + X[12] + 0xe6db99e5), S32) + a;
- c = RotateLeft((c + H(d, a, b) + X[15] + 0x1fa27cf8), S33) + d;
- b = RotateLeft((b + H(c, d, a) + X[2] + 0xc4ac5665), S34) + c;
-
- //
- // Round 4 - K cycle, 16 times.
- //
- a = RotateLeft((a + K(b, c, d) + X[0] + 0xf4292244), S41) + b;
- d = RotateLeft((d + K(a, b, c) + X[7] + 0x432aff97), S42) + a;
- c = RotateLeft((c + K(d, a, b) + X[14] + 0xab9423a7), S43) + d;
- b = RotateLeft((b + K(c, d, a) + X[5] + 0xfc93a039), S44) + c;
- a = RotateLeft((a + K(b, c, d) + X[12] + 0x655b59c3), S41) + b;
- d = RotateLeft((d + K(a, b, c) + X[3] + 0x8f0ccc92), S42) + a;
- c = RotateLeft((c + K(d, a, b) + X[10] + 0xffeff47d), S43) + d;
- b = RotateLeft((b + K(c, d, a) + X[1] + 0x85845dd1), S44) + c;
- a = RotateLeft((a + K(b, c, d) + X[8] + 0x6fa87e4f), S41) + b;
- d = RotateLeft((d + K(a, b, c) + X[15] + 0xfe2ce6e0), S42) + a;
- c = RotateLeft((c + K(d, a, b) + X[6] + 0xa3014314), S43) + d;
- b = RotateLeft((b + K(c, d, a) + X[13] + 0x4e0811a1), S44) + c;
- a = RotateLeft((a + K(b, c, d) + X[4] + 0xf7537e82), S41) + b;
- d = RotateLeft((d + K(a, b, c) + X[11] + 0xbd3af235), S42) + a;
- c = RotateLeft((c + K(d, a, b) + X[2] + 0x2ad7d2bb), S43) + d;
- b = RotateLeft((b + K(c, d, a) + X[9] + 0xeb86d391), S44) + c;
-
- H1 += a;
- H2 += b;
- H3 += c;
- H4 += d;
-
- xOff = 0;
- }
-
- public override IMemoable Copy()
- {
- return new MD5Digest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- MD5Digest d = (MD5Digest)other;
-
- CopyIn(d);
- }
-
- }
-
-}
-
diff --git a/BCCrypto/src/crypto/digests/NonMemoableDigest.cs b/BCCrypto/src/crypto/digests/NonMemoableDigest.cs
deleted file mode 100644
index 02c49b8..0000000
--- a/BCCrypto/src/crypto/digests/NonMemoableDigest.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * Wrapper removes exposure to the IMemoable interface on an IDigest implementation.
- */
- public class NonMemoableDigest
- : IDigest
- {
- protected readonly IDigest mBaseDigest;
-
- /**
- * Base constructor.
- *
- * @param baseDigest underlying digest to use.
- * @exception IllegalArgumentException if baseDigest is null
- */
- public NonMemoableDigest(IDigest baseDigest)
- {
- if (baseDigest == null)
- throw new ArgumentNullException("baseDigest");
-
- this.mBaseDigest = baseDigest;
- }
-
- public virtual string AlgorithmName
- {
- get { return mBaseDigest.AlgorithmName; }
- }
-
- public virtual int GetDigestSize()
- {
- return mBaseDigest.GetDigestSize();
- }
-
- public virtual void Update(byte input)
- {
- mBaseDigest.Update(input);
- }
-
- public virtual void BlockUpdate(byte[] input, int inOff, int len)
- {
- mBaseDigest.BlockUpdate(input, inOff, len);
- }
-
- public virtual int DoFinal(byte[] output, int outOff)
- {
- return mBaseDigest.DoFinal(output, outOff);
- }
-
- public virtual void Reset()
- {
- mBaseDigest.Reset();
- }
-
- public virtual int GetByteLength()
- {
- return mBaseDigest.GetByteLength();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/digests/NullDigest.cs b/BCCrypto/src/crypto/digests/NullDigest.cs
deleted file mode 100644
index e598cb1..0000000
--- a/BCCrypto/src/crypto/digests/NullDigest.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- public class NullDigest : IDigest
- {
- private readonly MemoryStream bOut = new MemoryStream();
-
- public string AlgorithmName
- {
- get { return "NULL"; }
- }
-
- public int GetByteLength()
- {
- // TODO Is this okay?
- return 0;
- }
-
- public int GetDigestSize()
- {
- return (int) bOut.Length;
- }
-
- public void Update(byte b)
- {
- bOut.WriteByte(b);
- }
-
- public void BlockUpdate(byte[] inBytes, int inOff, int len)
- {
- bOut.Write(inBytes, inOff, len);
- }
-
- public int DoFinal(byte[] outBytes, int outOff)
- {
- byte[] res = bOut.ToArray();
- res.CopyTo(outBytes, outOff);
- Reset();
- return res.Length;
- }
-
- public void Reset()
- {
- bOut.SetLength(0);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/digests/RipeMD128Digest.cs b/BCCrypto/src/crypto/digests/RipeMD128Digest.cs
deleted file mode 100644
index e8a0331..0000000
--- a/BCCrypto/src/crypto/digests/RipeMD128Digest.cs
+++ /dev/null
@@ -1,484 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * implementation of RipeMD128
- */
- public class RipeMD128Digest
- : GeneralDigest
- {
- private const int DigestLength = 16;
-
- private int H0, H1, H2, H3; // IV's
-
- private int[] X = new int[16];
- private int xOff;
-
- /**
- * Standard constructor
- */
- public RipeMD128Digest()
- {
- Reset();
- }
-
- /**
- * Copy constructor. This will copy the state of the provided
- * message digest.
- */
- public RipeMD128Digest(RipeMD128Digest t) : base(t)
- {
- CopyIn(t);
- }
-
- private void CopyIn(RipeMD128Digest t)
- {
- base.CopyIn(t);
-
- H0 = t.H0;
- H1 = t.H1;
- H2 = t.H2;
- H3 = t.H3;
-
- Array.Copy(t.X, 0, X, 0, t.X.Length);
- xOff = t.xOff;
- }
-
- public override string AlgorithmName
- {
- get { return "RIPEMD128"; }
- }
-
- public override int GetDigestSize()
- {
- return DigestLength;
- }
-
- internal override void ProcessWord(
- byte[] input,
- int inOff)
- {
- X[xOff++] = (input[inOff] & 0xff) | ((input[inOff + 1] & 0xff) << 8)
- | ((input[inOff + 2] & 0xff) << 16) | ((input[inOff + 3] & 0xff) << 24);
-
- if (xOff == 16)
- {
- ProcessBlock();
- }
- }
-
- internal override void ProcessLength(
- long bitLength)
- {
- if (xOff > 14)
- {
- ProcessBlock();
- }
-
- X[14] = (int)(bitLength & 0xffffffff);
- X[15] = (int)((ulong) bitLength >> 32);
- }
-
- private void UnpackWord(
- int word,
- byte[] outBytes,
- int outOff)
- {
- outBytes[outOff] = (byte)word;
- outBytes[outOff + 1] = (byte)((uint) word >> 8);
- outBytes[outOff + 2] = (byte)((uint) word >> 16);
- outBytes[outOff + 3] = (byte)((uint) word >> 24);
- }
-
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- Finish();
-
- UnpackWord(H0, output, outOff);
- UnpackWord(H1, output, outOff + 4);
- UnpackWord(H2, output, outOff + 8);
- UnpackWord(H3, output, outOff + 12);
-
- Reset();
-
- return DigestLength;
- }
-
- /**
- * reset the chaining variables to the IV values.
- */
- public override void Reset()
- {
- base.Reset();
-
- H0 = unchecked((int) 0x67452301);
- H1 = unchecked((int) 0xefcdab89);
- H2 = unchecked((int) 0x98badcfe);
- H3 = unchecked((int) 0x10325476);
-
- xOff = 0;
-
- for (int i = 0; i != X.Length; i++)
- {
- X[i] = 0;
- }
- }
-
- /*
- * rotate int x left n bits.
- */
- private int RL(
- int x,
- int n)
- {
- return (x << n) | (int) ((uint) x >> (32 - n));
- }
-
- /*
- * f1,f2,f3,f4 are the basic RipeMD128 functions.
- */
-
- /*
- * F
- */
- private int F1(
- int x,
- int y,
- int z)
- {
- return x ^ y ^ z;
- }
-
- /*
- * G
- */
- private int F2(
- int x,
- int y,
- int z)
- {
- return (x & y) | (~x & z);
- }
-
- /*
- * H
- */
- private int F3(
- int x,
- int y,
- int z)
- {
- return (x | ~y) ^ z;
- }
-
- /*
- * I
- */
- private int F4(
- int x,
- int y,
- int z)
- {
- return (x & z) | (y & ~z);
- }
-
- private int F1(
- int a,
- int b,
- int c,
- int d,
- int x,
- int s)
- {
- return RL(a + F1(b, c, d) + x, s);
- }
-
- private int F2(
- int a,
- int b,
- int c,
- int d,
- int x,
- int s)
- {
- return RL(a + F2(b, c, d) + x + unchecked((int) 0x5a827999), s);
- }
-
- private int F3(
- int a,
- int b,
- int c,
- int d,
- int x,
- int s)
- {
- return RL(a + F3(b, c, d) + x + unchecked((int) 0x6ed9eba1), s);
- }
-
- private int F4(
- int a,
- int b,
- int c,
- int d,
- int x,
- int s)
- {
- return RL(a + F4(b, c, d) + x + unchecked((int) 0x8f1bbcdc), s);
- }
-
- private int FF1(
- int a,
- int b,
- int c,
- int d,
- int x,
- int s)
- {
- return RL(a + F1(b, c, d) + x, s);
- }
-
- private int FF2(
- int a,
- int b,
- int c,
- int d,
- int x,
- int s)
- {
- return RL(a + F2(b, c, d) + x + unchecked((int) 0x6d703ef3), s);
- }
-
- private int FF3(
- int a,
- int b,
- int c,
- int d,
- int x,
- int s)
- {
- return RL(a + F3(b, c, d) + x + unchecked((int) 0x5c4dd124), s);
- }
-
- private int FF4(
- int a,
- int b,
- int c,
- int d,
- int x,
- int s)
- {
- return RL(a + F4(b, c, d) + x + unchecked((int) 0x50a28be6), s);
- }
-
- internal override void ProcessBlock()
- {
- int a, aa;
- int b, bb;
- int c, cc;
- int d, dd;
-
- a = aa = H0;
- b = bb = H1;
- c = cc = H2;
- d = dd = H3;
-
- //
- // Round 1
- //
- a = F1(a, b, c, d, X[ 0], 11);
- d = F1(d, a, b, c, X[ 1], 14);
- c = F1(c, d, a, b, X[ 2], 15);
- b = F1(b, c, d, a, X[ 3], 12);
- a = F1(a, b, c, d, X[ 4], 5);
- d = F1(d, a, b, c, X[ 5], 8);
- c = F1(c, d, a, b, X[ 6], 7);
- b = F1(b, c, d, a, X[ 7], 9);
- a = F1(a, b, c, d, X[ 8], 11);
- d = F1(d, a, b, c, X[ 9], 13);
- c = F1(c, d, a, b, X[10], 14);
- b = F1(b, c, d, a, X[11], 15);
- a = F1(a, b, c, d, X[12], 6);
- d = F1(d, a, b, c, X[13], 7);
- c = F1(c, d, a, b, X[14], 9);
- b = F1(b, c, d, a, X[15], 8);
-
- //
- // Round 2
- //
- a = F2(a, b, c, d, X[ 7], 7);
- d = F2(d, a, b, c, X[ 4], 6);
- c = F2(c, d, a, b, X[13], 8);
- b = F2(b, c, d, a, X[ 1], 13);
- a = F2(a, b, c, d, X[10], 11);
- d = F2(d, a, b, c, X[ 6], 9);
- c = F2(c, d, a, b, X[15], 7);
- b = F2(b, c, d, a, X[ 3], 15);
- a = F2(a, b, c, d, X[12], 7);
- d = F2(d, a, b, c, X[ 0], 12);
- c = F2(c, d, a, b, X[ 9], 15);
- b = F2(b, c, d, a, X[ 5], 9);
- a = F2(a, b, c, d, X[ 2], 11);
- d = F2(d, a, b, c, X[14], 7);
- c = F2(c, d, a, b, X[11], 13);
- b = F2(b, c, d, a, X[ 8], 12);
-
- //
- // Round 3
- //
- a = F3(a, b, c, d, X[ 3], 11);
- d = F3(d, a, b, c, X[10], 13);
- c = F3(c, d, a, b, X[14], 6);
- b = F3(b, c, d, a, X[ 4], 7);
- a = F3(a, b, c, d, X[ 9], 14);
- d = F3(d, a, b, c, X[15], 9);
- c = F3(c, d, a, b, X[ 8], 13);
- b = F3(b, c, d, a, X[ 1], 15);
- a = F3(a, b, c, d, X[ 2], 14);
- d = F3(d, a, b, c, X[ 7], 8);
- c = F3(c, d, a, b, X[ 0], 13);
- b = F3(b, c, d, a, X[ 6], 6);
- a = F3(a, b, c, d, X[13], 5);
- d = F3(d, a, b, c, X[11], 12);
- c = F3(c, d, a, b, X[ 5], 7);
- b = F3(b, c, d, a, X[12], 5);
-
- //
- // Round 4
- //
- a = F4(a, b, c, d, X[ 1], 11);
- d = F4(d, a, b, c, X[ 9], 12);
- c = F4(c, d, a, b, X[11], 14);
- b = F4(b, c, d, a, X[10], 15);
- a = F4(a, b, c, d, X[ 0], 14);
- d = F4(d, a, b, c, X[ 8], 15);
- c = F4(c, d, a, b, X[12], 9);
- b = F4(b, c, d, a, X[ 4], 8);
- a = F4(a, b, c, d, X[13], 9);
- d = F4(d, a, b, c, X[ 3], 14);
- c = F4(c, d, a, b, X[ 7], 5);
- b = F4(b, c, d, a, X[15], 6);
- a = F4(a, b, c, d, X[14], 8);
- d = F4(d, a, b, c, X[ 5], 6);
- c = F4(c, d, a, b, X[ 6], 5);
- b = F4(b, c, d, a, X[ 2], 12);
-
- //
- // Parallel round 1
- //
- aa = FF4(aa, bb, cc, dd, X[ 5], 8);
- dd = FF4(dd, aa, bb, cc, X[14], 9);
- cc = FF4(cc, dd, aa, bb, X[ 7], 9);
- bb = FF4(bb, cc, dd, aa, X[ 0], 11);
- aa = FF4(aa, bb, cc, dd, X[ 9], 13);
- dd = FF4(dd, aa, bb, cc, X[ 2], 15);
- cc = FF4(cc, dd, aa, bb, X[11], 15);
- bb = FF4(bb, cc, dd, aa, X[ 4], 5);
- aa = FF4(aa, bb, cc, dd, X[13], 7);
- dd = FF4(dd, aa, bb, cc, X[ 6], 7);
- cc = FF4(cc, dd, aa, bb, X[15], 8);
- bb = FF4(bb, cc, dd, aa, X[ 8], 11);
- aa = FF4(aa, bb, cc, dd, X[ 1], 14);
- dd = FF4(dd, aa, bb, cc, X[10], 14);
- cc = FF4(cc, dd, aa, bb, X[ 3], 12);
- bb = FF4(bb, cc, dd, aa, X[12], 6);
-
- //
- // Parallel round 2
- //
- aa = FF3(aa, bb, cc, dd, X[ 6], 9);
- dd = FF3(dd, aa, bb, cc, X[11], 13);
- cc = FF3(cc, dd, aa, bb, X[ 3], 15);
- bb = FF3(bb, cc, dd, aa, X[ 7], 7);
- aa = FF3(aa, bb, cc, dd, X[ 0], 12);
- dd = FF3(dd, aa, bb, cc, X[13], 8);
- cc = FF3(cc, dd, aa, bb, X[ 5], 9);
- bb = FF3(bb, cc, dd, aa, X[10], 11);
- aa = FF3(aa, bb, cc, dd, X[14], 7);
- dd = FF3(dd, aa, bb, cc, X[15], 7);
- cc = FF3(cc, dd, aa, bb, X[ 8], 12);
- bb = FF3(bb, cc, dd, aa, X[12], 7);
- aa = FF3(aa, bb, cc, dd, X[ 4], 6);
- dd = FF3(dd, aa, bb, cc, X[ 9], 15);
- cc = FF3(cc, dd, aa, bb, X[ 1], 13);
- bb = FF3(bb, cc, dd, aa, X[ 2], 11);
-
- //
- // Parallel round 3
- //
- aa = FF2(aa, bb, cc, dd, X[15], 9);
- dd = FF2(dd, aa, bb, cc, X[ 5], 7);
- cc = FF2(cc, dd, aa, bb, X[ 1], 15);
- bb = FF2(bb, cc, dd, aa, X[ 3], 11);
- aa = FF2(aa, bb, cc, dd, X[ 7], 8);
- dd = FF2(dd, aa, bb, cc, X[14], 6);
- cc = FF2(cc, dd, aa, bb, X[ 6], 6);
- bb = FF2(bb, cc, dd, aa, X[ 9], 14);
- aa = FF2(aa, bb, cc, dd, X[11], 12);
- dd = FF2(dd, aa, bb, cc, X[ 8], 13);
- cc = FF2(cc, dd, aa, bb, X[12], 5);
- bb = FF2(bb, cc, dd, aa, X[ 2], 14);
- aa = FF2(aa, bb, cc, dd, X[10], 13);
- dd = FF2(dd, aa, bb, cc, X[ 0], 13);
- cc = FF2(cc, dd, aa, bb, X[ 4], 7);
- bb = FF2(bb, cc, dd, aa, X[13], 5);
-
- //
- // Parallel round 4
- //
- aa = FF1(aa, bb, cc, dd, X[ 8], 15);
- dd = FF1(dd, aa, bb, cc, X[ 6], 5);
- cc = FF1(cc, dd, aa, bb, X[ 4], 8);
- bb = FF1(bb, cc, dd, aa, X[ 1], 11);
- aa = FF1(aa, bb, cc, dd, X[ 3], 14);
- dd = FF1(dd, aa, bb, cc, X[11], 14);
- cc = FF1(cc, dd, aa, bb, X[15], 6);
- bb = FF1(bb, cc, dd, aa, X[ 0], 14);
- aa = FF1(aa, bb, cc, dd, X[ 5], 6);
- dd = FF1(dd, aa, bb, cc, X[12], 9);
- cc = FF1(cc, dd, aa, bb, X[ 2], 12);
- bb = FF1(bb, cc, dd, aa, X[13], 9);
- aa = FF1(aa, bb, cc, dd, X[ 9], 12);
- dd = FF1(dd, aa, bb, cc, X[ 7], 5);
- cc = FF1(cc, dd, aa, bb, X[10], 15);
- bb = FF1(bb, cc, dd, aa, X[14], 8);
-
- dd += c + H1; // final result for H0
-
- //
- // combine the results
- //
- H1 = H2 + d + aa;
- H2 = H3 + a + bb;
- H3 = H0 + b + cc;
- H0 = dd;
-
- //
- // reset the offset and clean out the word buffer.
- //
- xOff = 0;
- for (int i = 0; i != X.Length; i++)
- {
- X[i] = 0;
- }
- }
-
- public override IMemoable Copy()
- {
- return new RipeMD128Digest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- RipeMD128Digest d = (RipeMD128Digest)other;
-
- CopyIn(d);
- }
-
- }
-
-}
diff --git a/BCCrypto/src/crypto/digests/RipeMD160Digest.cs b/BCCrypto/src/crypto/digests/RipeMD160Digest.cs
deleted file mode 100644
index af4aa44..0000000
--- a/BCCrypto/src/crypto/digests/RipeMD160Digest.cs
+++ /dev/null
@@ -1,445 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * implementation of RipeMD see,
- * http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html
- */
- public class RipeMD160Digest
- : GeneralDigest
- {
- private const int DigestLength = 20;
-
- private int H0, H1, H2, H3, H4; // IV's
-
- private int[] X = new int[16];
- private int xOff;
-
- /**
- * Standard constructor
- */
- public RipeMD160Digest()
- {
- Reset();
- }
-
- /**
- * Copy constructor. This will copy the state of the provided
- * message digest.
- */
- public RipeMD160Digest(RipeMD160Digest t) : base(t)
- {
- CopyIn(t);
- }
-
- private void CopyIn(RipeMD160Digest t)
- {
- base.CopyIn(t);
-
- H0 = t.H0;
- H1 = t.H1;
- H2 = t.H2;
- H3 = t.H3;
- H4 = t.H4;
-
- Array.Copy(t.X, 0, X, 0, t.X.Length);
- xOff = t.xOff;
- }
-
- public override string AlgorithmName
- {
- get { return "RIPEMD160"; }
- }
-
- public override int GetDigestSize()
- {
- return DigestLength;
- }
-
- internal override void ProcessWord(
- byte[] input,
- int inOff)
- {
- X[xOff++] = (input[inOff] & 0xff) | ((input[inOff + 1] & 0xff) << 8)
- | ((input[inOff + 2] & 0xff) << 16) | ((input[inOff + 3] & 0xff) << 24);
-
- if (xOff == 16)
- {
- ProcessBlock();
- }
- }
-
- internal override void ProcessLength(
- long bitLength)
- {
- if (xOff > 14)
- {
- ProcessBlock();
- }
-
- X[14] = (int)(bitLength & 0xffffffff);
- X[15] = (int)((ulong) bitLength >> 32);
- }
-
- private void UnpackWord(
- int word,
- byte[] outBytes,
- int outOff)
- {
- outBytes[outOff] = (byte)word;
- outBytes[outOff + 1] = (byte)((uint) word >> 8);
- outBytes[outOff + 2] = (byte)((uint) word >> 16);
- outBytes[outOff + 3] = (byte)((uint) word >> 24);
- }
-
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- Finish();
-
- UnpackWord(H0, output, outOff);
- UnpackWord(H1, output, outOff + 4);
- UnpackWord(H2, output, outOff + 8);
- UnpackWord(H3, output, outOff + 12);
- UnpackWord(H4, output, outOff + 16);
-
- Reset();
-
- return DigestLength;
- }
-
- /**
- * reset the chaining variables to the IV values.
- */
- public override void Reset()
- {
- base.Reset();
-
- H0 = unchecked((int) 0x67452301);
- H1 = unchecked((int) 0xefcdab89);
- H2 = unchecked((int) 0x98badcfe);
- H3 = unchecked((int) 0x10325476);
- H4 = unchecked((int) 0xc3d2e1f0);
-
- xOff = 0;
-
- for (int i = 0; i != X.Length; i++)
- {
- X[i] = 0;
- }
- }
-
- /*
- * rotate int x left n bits.
- */
- private int RL(
- int x,
- int n)
- {
- return (x << n) | (int) ((uint) x >> (32 - n));
- }
-
- /*
- * f1,f2,f3,f4,f5 are the basic RipeMD160 functions.
- */
-
- /*
- * rounds 0-15
- */
- private int F1(
- int x,
- int y,
- int z)
- {
- return x ^ y ^ z;
- }
-
- /*
- * rounds 16-31
- */
- private int F2(
- int x,
- int y,
- int z)
- {
- return (x & y) | (~x & z);
- }
-
- /*
- * rounds 32-47
- */
- private int F3(
- int x,
- int y,
- int z)
- {
- return (x | ~y) ^ z;
- }
-
- /*
- * rounds 48-63
- */
- private int F4(
- int x,
- int y,
- int z)
- {
- return (x & z) | (y & ~z);
- }
-
- /*
- * rounds 64-79
- */
- private int F5(
- int x,
- int y,
- int z)
- {
- return x ^ (y | ~z);
- }
-
- internal override void ProcessBlock()
- {
- int a, aa;
- int b, bb;
- int c, cc;
- int d, dd;
- int e, ee;
-
- a = aa = H0;
- b = bb = H1;
- c = cc = H2;
- d = dd = H3;
- e = ee = H4;
-
- //
- // Rounds 1 - 16
- //
- // left
- a = RL(a + F1(b,c,d) + X[ 0], 11) + e; c = RL(c, 10);
- e = RL(e + F1(a,b,c) + X[ 1], 14) + d; b = RL(b, 10);
- d = RL(d + F1(e,a,b) + X[ 2], 15) + c; a = RL(a, 10);
- c = RL(c + F1(d,e,a) + X[ 3], 12) + b; e = RL(e, 10);
- b = RL(b + F1(c,d,e) + X[ 4], 5) + a; d = RL(d, 10);
- a = RL(a + F1(b,c,d) + X[ 5], 8) + e; c = RL(c, 10);
- e = RL(e + F1(a,b,c) + X[ 6], 7) + d; b = RL(b, 10);
- d = RL(d + F1(e,a,b) + X[ 7], 9) + c; a = RL(a, 10);
- c = RL(c + F1(d,e,a) + X[ 8], 11) + b; e = RL(e, 10);
- b = RL(b + F1(c,d,e) + X[ 9], 13) + a; d = RL(d, 10);
- a = RL(a + F1(b,c,d) + X[10], 14) + e; c = RL(c, 10);
- e = RL(e + F1(a,b,c) + X[11], 15) + d; b = RL(b, 10);
- d = RL(d + F1(e,a,b) + X[12], 6) + c; a = RL(a, 10);
- c = RL(c + F1(d,e,a) + X[13], 7) + b; e = RL(e, 10);
- b = RL(b + F1(c,d,e) + X[14], 9) + a; d = RL(d, 10);
- a = RL(a + F1(b,c,d) + X[15], 8) + e; c = RL(c, 10);
-
- // right
- aa = RL(aa + F5(bb,cc,dd) + X[ 5] + unchecked((int) 0x50a28be6), 8) + ee; cc = RL(cc, 10);
- ee = RL(ee + F5(aa,bb,cc) + X[14] + unchecked((int) 0x50a28be6), 9) + dd; bb = RL(bb, 10);
- dd = RL(dd + F5(ee,aa,bb) + X[ 7] + unchecked((int) 0x50a28be6), 9) + cc; aa = RL(aa, 10);
- cc = RL(cc + F5(dd,ee,aa) + X[ 0] + unchecked((int) 0x50a28be6), 11) + bb; ee = RL(ee, 10);
- bb = RL(bb + F5(cc,dd,ee) + X[ 9] + unchecked((int) 0x50a28be6), 13) + aa; dd = RL(dd, 10);
- aa = RL(aa + F5(bb,cc,dd) + X[ 2] + unchecked((int) 0x50a28be6), 15) + ee; cc = RL(cc, 10);
- ee = RL(ee + F5(aa,bb,cc) + X[11] + unchecked((int) 0x50a28be6), 15) + dd; bb = RL(bb, 10);
- dd = RL(dd + F5(ee,aa,bb) + X[ 4] + unchecked((int) 0x50a28be6), 5) + cc; aa = RL(aa, 10);
- cc = RL(cc + F5(dd,ee,aa) + X[13] + unchecked((int) 0x50a28be6), 7) + bb; ee = RL(ee, 10);
- bb = RL(bb + F5(cc,dd,ee) + X[ 6] + unchecked((int) 0x50a28be6), 7) + aa; dd = RL(dd, 10);
- aa = RL(aa + F5(bb,cc,dd) + X[15] + unchecked((int) 0x50a28be6), 8) + ee; cc = RL(cc, 10);
- ee = RL(ee + F5(aa,bb,cc) + X[ 8] + unchecked((int) 0x50a28be6), 11) + dd; bb = RL(bb, 10);
- dd = RL(dd + F5(ee,aa,bb) + X[ 1] + unchecked((int) 0x50a28be6), 14) + cc; aa = RL(aa, 10);
- cc = RL(cc + F5(dd,ee,aa) + X[10] + unchecked((int) 0x50a28be6), 14) + bb; ee = RL(ee, 10);
- bb = RL(bb + F5(cc,dd,ee) + X[ 3] + unchecked((int) 0x50a28be6), 12) + aa; dd = RL(dd, 10);
- aa = RL(aa + F5(bb,cc,dd) + X[12] + unchecked((int) 0x50a28be6), 6) + ee; cc = RL(cc, 10);
-
- //
- // Rounds 16-31
- //
- // left
- e = RL(e + F2(a,b,c) + X[ 7] + unchecked((int) 0x5a827999), 7) + d; b = RL(b, 10);
- d = RL(d + F2(e,a,b) + X[ 4] + unchecked((int) 0x5a827999), 6) + c; a = RL(a, 10);
- c = RL(c + F2(d,e,a) + X[13] + unchecked((int) 0x5a827999), 8) + b; e = RL(e, 10);
- b = RL(b + F2(c,d,e) + X[ 1] + unchecked((int) 0x5a827999), 13) + a; d = RL(d, 10);
- a = RL(a + F2(b,c,d) + X[10] + unchecked((int) 0x5a827999), 11) + e; c = RL(c, 10);
- e = RL(e + F2(a,b,c) + X[ 6] + unchecked((int) 0x5a827999), 9) + d; b = RL(b, 10);
- d = RL(d + F2(e,a,b) + X[15] + unchecked((int) 0x5a827999), 7) + c; a = RL(a, 10);
- c = RL(c + F2(d,e,a) + X[ 3] + unchecked((int) 0x5a827999), 15) + b; e = RL(e, 10);
- b = RL(b + F2(c,d,e) + X[12] + unchecked((int) 0x5a827999), 7) + a; d = RL(d, 10);
- a = RL(a + F2(b,c,d) + X[ 0] + unchecked((int) 0x5a827999), 12) + e; c = RL(c, 10);
- e = RL(e + F2(a,b,c) + X[ 9] + unchecked((int) 0x5a827999), 15) + d; b = RL(b, 10);
- d = RL(d + F2(e,a,b) + X[ 5] + unchecked((int) 0x5a827999), 9) + c; a = RL(a, 10);
- c = RL(c + F2(d,e,a) + X[ 2] + unchecked((int) 0x5a827999), 11) + b; e = RL(e, 10);
- b = RL(b + F2(c,d,e) + X[14] + unchecked((int) 0x5a827999), 7) + a; d = RL(d, 10);
- a = RL(a + F2(b,c,d) + X[11] + unchecked((int) 0x5a827999), 13) + e; c = RL(c, 10);
- e = RL(e + F2(a,b,c) + X[ 8] + unchecked((int) 0x5a827999), 12) + d; b = RL(b, 10);
-
- // right
- ee = RL(ee + F4(aa,bb,cc) + X[ 6] + unchecked((int) 0x5c4dd124), 9) + dd; bb = RL(bb, 10);
- dd = RL(dd + F4(ee,aa,bb) + X[11] + unchecked((int) 0x5c4dd124), 13) + cc; aa = RL(aa, 10);
- cc = RL(cc + F4(dd,ee,aa) + X[ 3] + unchecked((int) 0x5c4dd124), 15) + bb; ee = RL(ee, 10);
- bb = RL(bb + F4(cc,dd,ee) + X[ 7] + unchecked((int) 0x5c4dd124), 7) + aa; dd = RL(dd, 10);
- aa = RL(aa + F4(bb,cc,dd) + X[ 0] + unchecked((int) 0x5c4dd124), 12) + ee; cc = RL(cc, 10);
- ee = RL(ee + F4(aa,bb,cc) + X[13] + unchecked((int) 0x5c4dd124), 8) + dd; bb = RL(bb, 10);
- dd = RL(dd + F4(ee,aa,bb) + X[ 5] + unchecked((int) 0x5c4dd124), 9) + cc; aa = RL(aa, 10);
- cc = RL(cc + F4(dd,ee,aa) + X[10] + unchecked((int) 0x5c4dd124), 11) + bb; ee = RL(ee, 10);
- bb = RL(bb + F4(cc,dd,ee) + X[14] + unchecked((int) 0x5c4dd124), 7) + aa; dd = RL(dd, 10);
- aa = RL(aa + F4(bb,cc,dd) + X[15] + unchecked((int) 0x5c4dd124), 7) + ee; cc = RL(cc, 10);
- ee = RL(ee + F4(aa,bb,cc) + X[ 8] + unchecked((int) 0x5c4dd124), 12) + dd; bb = RL(bb, 10);
- dd = RL(dd + F4(ee,aa,bb) + X[12] + unchecked((int) 0x5c4dd124), 7) + cc; aa = RL(aa, 10);
- cc = RL(cc + F4(dd,ee,aa) + X[ 4] + unchecked((int) 0x5c4dd124), 6) + bb; ee = RL(ee, 10);
- bb = RL(bb + F4(cc,dd,ee) + X[ 9] + unchecked((int) 0x5c4dd124), 15) + aa; dd = RL(dd, 10);
- aa = RL(aa + F4(bb,cc,dd) + X[ 1] + unchecked((int) 0x5c4dd124), 13) + ee; cc = RL(cc, 10);
- ee = RL(ee + F4(aa,bb,cc) + X[ 2] + unchecked((int) 0x5c4dd124), 11) + dd; bb = RL(bb, 10);
-
- //
- // Rounds 32-47
- //
- // left
- d = RL(d + F3(e,a,b) + X[ 3] + unchecked((int) 0x6ed9eba1), 11) + c; a = RL(a, 10);
- c = RL(c + F3(d,e,a) + X[10] + unchecked((int) 0x6ed9eba1), 13) + b; e = RL(e, 10);
- b = RL(b + F3(c,d,e) + X[14] + unchecked((int) 0x6ed9eba1), 6) + a; d = RL(d, 10);
- a = RL(a + F3(b,c,d) + X[ 4] + unchecked((int) 0x6ed9eba1), 7) + e; c = RL(c, 10);
- e = RL(e + F3(a,b,c) + X[ 9] + unchecked((int) 0x6ed9eba1), 14) + d; b = RL(b, 10);
- d = RL(d + F3(e,a,b) + X[15] + unchecked((int) 0x6ed9eba1), 9) + c; a = RL(a, 10);
- c = RL(c + F3(d,e,a) + X[ 8] + unchecked((int) 0x6ed9eba1), 13) + b; e = RL(e, 10);
- b = RL(b + F3(c,d,e) + X[ 1] + unchecked((int) 0x6ed9eba1), 15) + a; d = RL(d, 10);
- a = RL(a + F3(b,c,d) + X[ 2] + unchecked((int) 0x6ed9eba1), 14) + e; c = RL(c, 10);
- e = RL(e + F3(a,b,c) + X[ 7] + unchecked((int) 0x6ed9eba1), 8) + d; b = RL(b, 10);
- d = RL(d + F3(e,a,b) + X[ 0] + unchecked((int) 0x6ed9eba1), 13) + c; a = RL(a, 10);
- c = RL(c + F3(d,e,a) + X[ 6] + unchecked((int) 0x6ed9eba1), 6) + b; e = RL(e, 10);
- b = RL(b + F3(c,d,e) + X[13] + unchecked((int) 0x6ed9eba1), 5) + a; d = RL(d, 10);
- a = RL(a + F3(b,c,d) + X[11] + unchecked((int) 0x6ed9eba1), 12) + e; c = RL(c, 10);
- e = RL(e + F3(a,b,c) + X[ 5] + unchecked((int) 0x6ed9eba1), 7) + d; b = RL(b, 10);
- d = RL(d + F3(e,a,b) + X[12] + unchecked((int) 0x6ed9eba1), 5) + c; a = RL(a, 10);
-
- // right
- dd = RL(dd + F3(ee,aa,bb) + X[15] + unchecked((int) 0x6d703ef3), 9) + cc; aa = RL(aa, 10);
- cc = RL(cc + F3(dd,ee,aa) + X[ 5] + unchecked((int) 0x6d703ef3), 7) + bb; ee = RL(ee, 10);
- bb = RL(bb + F3(cc,dd,ee) + X[ 1] + unchecked((int) 0x6d703ef3), 15) + aa; dd = RL(dd, 10);
- aa = RL(aa + F3(bb,cc,dd) + X[ 3] + unchecked((int) 0x6d703ef3), 11) + ee; cc = RL(cc, 10);
- ee = RL(ee + F3(aa,bb,cc) + X[ 7] + unchecked((int) 0x6d703ef3), 8) + dd; bb = RL(bb, 10);
- dd = RL(dd + F3(ee,aa,bb) + X[14] + unchecked((int) 0x6d703ef3), 6) + cc; aa = RL(aa, 10);
- cc = RL(cc + F3(dd,ee,aa) + X[ 6] + unchecked((int) 0x6d703ef3), 6) + bb; ee = RL(ee, 10);
- bb = RL(bb + F3(cc,dd,ee) + X[ 9] + unchecked((int) 0x6d703ef3), 14) + aa; dd = RL(dd, 10);
- aa = RL(aa + F3(bb,cc,dd) + X[11] + unchecked((int) 0x6d703ef3), 12) + ee; cc = RL(cc, 10);
- ee = RL(ee + F3(aa,bb,cc) + X[ 8] + unchecked((int) 0x6d703ef3), 13) + dd; bb = RL(bb, 10);
- dd = RL(dd + F3(ee,aa,bb) + X[12] + unchecked((int) 0x6d703ef3), 5) + cc; aa = RL(aa, 10);
- cc = RL(cc + F3(dd,ee,aa) + X[ 2] + unchecked((int) 0x6d703ef3), 14) + bb; ee = RL(ee, 10);
- bb = RL(bb + F3(cc,dd,ee) + X[10] + unchecked((int) 0x6d703ef3), 13) + aa; dd = RL(dd, 10);
- aa = RL(aa + F3(bb,cc,dd) + X[ 0] + unchecked((int) 0x6d703ef3), 13) + ee; cc = RL(cc, 10);
- ee = RL(ee + F3(aa,bb,cc) + X[ 4] + unchecked((int) 0x6d703ef3), 7) + dd; bb = RL(bb, 10);
- dd = RL(dd + F3(ee,aa,bb) + X[13] + unchecked((int) 0x6d703ef3), 5) + cc; aa = RL(aa, 10);
-
- //
- // Rounds 48-63
- //
- // left
- c = RL(c + F4(d,e,a) + X[ 1] + unchecked((int) 0x8f1bbcdc), 11) + b; e = RL(e, 10);
- b = RL(b + F4(c,d,e) + X[ 9] + unchecked((int) 0x8f1bbcdc), 12) + a; d = RL(d, 10);
- a = RL(a + F4(b,c,d) + X[11] + unchecked((int) 0x8f1bbcdc), 14) + e; c = RL(c, 10);
- e = RL(e + F4(a,b,c) + X[10] + unchecked((int) 0x8f1bbcdc), 15) + d; b = RL(b, 10);
- d = RL(d + F4(e,a,b) + X[ 0] + unchecked((int) 0x8f1bbcdc), 14) + c; a = RL(a, 10);
- c = RL(c + F4(d,e,a) + X[ 8] + unchecked((int) 0x8f1bbcdc), 15) + b; e = RL(e, 10);
- b = RL(b + F4(c,d,e) + X[12] + unchecked((int) 0x8f1bbcdc), 9) + a; d = RL(d, 10);
- a = RL(a + F4(b,c,d) + X[ 4] + unchecked((int) 0x8f1bbcdc), 8) + e; c = RL(c, 10);
- e = RL(e + F4(a,b,c) + X[13] + unchecked((int) 0x8f1bbcdc), 9) + d; b = RL(b, 10);
- d = RL(d + F4(e,a,b) + X[ 3] + unchecked((int) 0x8f1bbcdc), 14) + c; a = RL(a, 10);
- c = RL(c + F4(d,e,a) + X[ 7] + unchecked((int) 0x8f1bbcdc), 5) + b; e = RL(e, 10);
- b = RL(b + F4(c,d,e) + X[15] + unchecked((int) 0x8f1bbcdc), 6) + a; d = RL(d, 10);
- a = RL(a + F4(b,c,d) + X[14] + unchecked((int) 0x8f1bbcdc), 8) + e; c = RL(c, 10);
- e = RL(e + F4(a,b,c) + X[ 5] + unchecked((int) 0x8f1bbcdc), 6) + d; b = RL(b, 10);
- d = RL(d + F4(e,a,b) + X[ 6] + unchecked((int) 0x8f1bbcdc), 5) + c; a = RL(a, 10);
- c = RL(c + F4(d,e,a) + X[ 2] + unchecked((int) 0x8f1bbcdc), 12) + b; e = RL(e, 10);
-
- // right
- cc = RL(cc + F2(dd,ee,aa) + X[ 8] + unchecked((int) 0x7a6d76e9), 15) + bb; ee = RL(ee, 10);
- bb = RL(bb + F2(cc,dd,ee) + X[ 6] + unchecked((int) 0x7a6d76e9), 5) + aa; dd = RL(dd, 10);
- aa = RL(aa + F2(bb,cc,dd) + X[ 4] + unchecked((int) 0x7a6d76e9), 8) + ee; cc = RL(cc, 10);
- ee = RL(ee + F2(aa,bb,cc) + X[ 1] + unchecked((int) 0x7a6d76e9), 11) + dd; bb = RL(bb, 10);
- dd = RL(dd + F2(ee,aa,bb) + X[ 3] + unchecked((int) 0x7a6d76e9), 14) + cc; aa = RL(aa, 10);
- cc = RL(cc + F2(dd,ee,aa) + X[11] + unchecked((int) 0x7a6d76e9), 14) + bb; ee = RL(ee, 10);
- bb = RL(bb + F2(cc,dd,ee) + X[15] + unchecked((int) 0x7a6d76e9), 6) + aa; dd = RL(dd, 10);
- aa = RL(aa + F2(bb,cc,dd) + X[ 0] + unchecked((int) 0x7a6d76e9), 14) + ee; cc = RL(cc, 10);
- ee = RL(ee + F2(aa,bb,cc) + X[ 5] + unchecked((int) 0x7a6d76e9), 6) + dd; bb = RL(bb, 10);
- dd = RL(dd + F2(ee,aa,bb) + X[12] + unchecked((int) 0x7a6d76e9), 9) + cc; aa = RL(aa, 10);
- cc = RL(cc + F2(dd,ee,aa) + X[ 2] + unchecked((int) 0x7a6d76e9), 12) + bb; ee = RL(ee, 10);
- bb = RL(bb + F2(cc,dd,ee) + X[13] + unchecked((int) 0x7a6d76e9), 9) + aa; dd = RL(dd, 10);
- aa = RL(aa + F2(bb,cc,dd) + X[ 9] + unchecked((int) 0x7a6d76e9), 12) + ee; cc = RL(cc, 10);
- ee = RL(ee + F2(aa,bb,cc) + X[ 7] + unchecked((int) 0x7a6d76e9), 5) + dd; bb = RL(bb, 10);
- dd = RL(dd + F2(ee,aa,bb) + X[10] + unchecked((int) 0x7a6d76e9), 15) + cc; aa = RL(aa, 10);
- cc = RL(cc + F2(dd,ee,aa) + X[14] + unchecked((int) 0x7a6d76e9), 8) + bb; ee = RL(ee, 10);
-
- //
- // Rounds 64-79
- //
- // left
- b = RL(b + F5(c,d,e) + X[ 4] + unchecked((int) 0xa953fd4e), 9) + a; d = RL(d, 10);
- a = RL(a + F5(b,c,d) + X[ 0] + unchecked((int) 0xa953fd4e), 15) + e; c = RL(c, 10);
- e = RL(e + F5(a,b,c) + X[ 5] + unchecked((int) 0xa953fd4e), 5) + d; b = RL(b, 10);
- d = RL(d + F5(e,a,b) + X[ 9] + unchecked((int) 0xa953fd4e), 11) + c; a = RL(a, 10);
- c = RL(c + F5(d,e,a) + X[ 7] + unchecked((int) 0xa953fd4e), 6) + b; e = RL(e, 10);
- b = RL(b + F5(c,d,e) + X[12] + unchecked((int) 0xa953fd4e), 8) + a; d = RL(d, 10);
- a = RL(a + F5(b,c,d) + X[ 2] + unchecked((int) 0xa953fd4e), 13) + e; c = RL(c, 10);
- e = RL(e + F5(a,b,c) + X[10] + unchecked((int) 0xa953fd4e), 12) + d; b = RL(b, 10);
- d = RL(d + F5(e,a,b) + X[14] + unchecked((int) 0xa953fd4e), 5) + c; a = RL(a, 10);
- c = RL(c + F5(d,e,a) + X[ 1] + unchecked((int) 0xa953fd4e), 12) + b; e = RL(e, 10);
- b = RL(b + F5(c,d,e) + X[ 3] + unchecked((int) 0xa953fd4e), 13) + a; d = RL(d, 10);
- a = RL(a + F5(b,c,d) + X[ 8] + unchecked((int) 0xa953fd4e), 14) + e; c = RL(c, 10);
- e = RL(e + F5(a,b,c) + X[11] + unchecked((int) 0xa953fd4e), 11) + d; b = RL(b, 10);
- d = RL(d + F5(e,a,b) + X[ 6] + unchecked((int) 0xa953fd4e), 8) + c; a = RL(a, 10);
- c = RL(c + F5(d,e,a) + X[15] + unchecked((int) 0xa953fd4e), 5) + b; e = RL(e, 10);
- b = RL(b + F5(c,d,e) + X[13] + unchecked((int) 0xa953fd4e), 6) + a; d = RL(d, 10);
-
- // right
- bb = RL(bb + F1(cc,dd,ee) + X[12], 8) + aa; dd = RL(dd, 10);
- aa = RL(aa + F1(bb,cc,dd) + X[15], 5) + ee; cc = RL(cc, 10);
- ee = RL(ee + F1(aa,bb,cc) + X[10], 12) + dd; bb = RL(bb, 10);
- dd = RL(dd + F1(ee,aa,bb) + X[ 4], 9) + cc; aa = RL(aa, 10);
- cc = RL(cc + F1(dd,ee,aa) + X[ 1], 12) + bb; ee = RL(ee, 10);
- bb = RL(bb + F1(cc,dd,ee) + X[ 5], 5) + aa; dd = RL(dd, 10);
- aa = RL(aa + F1(bb,cc,dd) + X[ 8], 14) + ee; cc = RL(cc, 10);
- ee = RL(ee + F1(aa,bb,cc) + X[ 7], 6) + dd; bb = RL(bb, 10);
- dd = RL(dd + F1(ee,aa,bb) + X[ 6], 8) + cc; aa = RL(aa, 10);
- cc = RL(cc + F1(dd,ee,aa) + X[ 2], 13) + bb; ee = RL(ee, 10);
- bb = RL(bb + F1(cc,dd,ee) + X[13], 6) + aa; dd = RL(dd, 10);
- aa = RL(aa + F1(bb,cc,dd) + X[14], 5) + ee; cc = RL(cc, 10);
- ee = RL(ee + F1(aa,bb,cc) + X[ 0], 15) + dd; bb = RL(bb, 10);
- dd = RL(dd + F1(ee,aa,bb) + X[ 3], 13) + cc; aa = RL(aa, 10);
- cc = RL(cc + F1(dd,ee,aa) + X[ 9], 11) + bb; ee = RL(ee, 10);
- bb = RL(bb + F1(cc,dd,ee) + X[11], 11) + aa; dd = RL(dd, 10);
-
- dd += c + H1;
- H1 = H2 + d + ee;
- H2 = H3 + e + aa;
- H3 = H4 + a + bb;
- H4 = H0 + b + cc;
- H0 = dd;
-
- //
- // reset the offset and clean out the word buffer.
- //
- xOff = 0;
- for (int i = 0; i != X.Length; i++)
- {
- X[i] = 0;
- }
- }
-
- public override IMemoable Copy()
- {
- return new RipeMD160Digest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- RipeMD160Digest d = (RipeMD160Digest)other;
-
- CopyIn(d);
- }
-
- }
-
-}
diff --git a/BCCrypto/src/crypto/digests/RipeMD256Digest.cs b/BCCrypto/src/crypto/digests/RipeMD256Digest.cs
deleted file mode 100644
index 3062757..0000000
--- a/BCCrypto/src/crypto/digests/RipeMD256Digest.cs
+++ /dev/null
@@ -1,430 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- ///
- /// Implementation of RipeMD256.
- /// Note: this algorithm offers the same level of security as RipeMD128.
- ///
- public class RipeMD256Digest
- : GeneralDigest
- {
- public override string AlgorithmName
- {
- get { return "RIPEMD256"; }
- }
-
- public override int GetDigestSize()
- {
- return DigestLength;
- }
-
- private const int DigestLength = 32;
-
- private int H0, H1, H2, H3, H4, H5, H6, H7; // IV's
-
- private int[] X = new int[16];
- private int xOff;
-
- /// Standard constructor
- public RipeMD256Digest()
- {
- Reset();
- }
-
- /// Copy constructor. This will copy the state of the provided
- /// message digest.
- ///
- public RipeMD256Digest(RipeMD256Digest t):base(t)
- {
- CopyIn(t);
- }
-
- private void CopyIn(RipeMD256Digest t)
- {
- base.CopyIn(t);
-
- H0 = t.H0;
- H1 = t.H1;
- H2 = t.H2;
- H3 = t.H3;
- H4 = t.H4;
- H5 = t.H5;
- H6 = t.H6;
- H7 = t.H7;
-
- Array.Copy(t.X, 0, X, 0, t.X.Length);
- xOff = t.xOff;
- }
-
- internal override void ProcessWord(
- byte[] input,
- int inOff)
- {
- X[xOff++] = (input[inOff] & 0xff) | ((input[inOff + 1] & 0xff) << 8)
- | ((input[inOff + 2] & 0xff) << 16) | ((input[inOff + 3] & 0xff) << 24);
-
- if (xOff == 16)
- {
- ProcessBlock();
- }
- }
-
- internal override void ProcessLength(
- long bitLength)
- {
- if (xOff > 14)
- {
- ProcessBlock();
- }
-
- X[14] = (int)(bitLength & 0xffffffff);
- X[15] = (int)((ulong)bitLength >> 32);
- }
-
- private void UnpackWord(
- int word,
- byte[] outBytes,
- int outOff)
- {
- outBytes[outOff] = (byte)(uint)word;
- outBytes[outOff + 1] = (byte)((uint)word >> 8);
- outBytes[outOff + 2] = (byte)((uint)word >> 16);
- outBytes[outOff + 3] = (byte)((uint)word >> 24);
- }
-
- public override int DoFinal(byte[] output, int outOff)
- {
- Finish();
-
- UnpackWord(H0, output, outOff);
- UnpackWord(H1, output, outOff + 4);
- UnpackWord(H2, output, outOff + 8);
- UnpackWord(H3, output, outOff + 12);
- UnpackWord(H4, output, outOff + 16);
- UnpackWord(H5, output, outOff + 20);
- UnpackWord(H6, output, outOff + 24);
- UnpackWord(H7, output, outOff + 28);
-
- Reset();
-
- return DigestLength;
- }
-
- /// reset the chaining variables to the IV values.
- public override void Reset()
- {
- base.Reset();
-
- H0 = unchecked((int)0x67452301);
- H1 = unchecked((int)0xefcdab89);
- H2 = unchecked((int)0x98badcfe);
- H3 = unchecked((int)0x10325476);
- H4 = unchecked((int)0x76543210);
- H5 = unchecked((int)0xFEDCBA98);
- H6 = unchecked((int)0x89ABCDEF);
- H7 = unchecked((int)0x01234567);
-
- xOff = 0;
-
- for (int i = 0; i != X.Length; i++)
- {
- X[i] = 0;
- }
- }
-
- /*
- * rotate int x left n bits.
- */
- private int RL(
- int x,
- int n)
- {
- return (x << n) | (int)((uint)x >> (32 - n));
- }
-
- /*
- * f1,f2,f3,f4 are the basic RipeMD128 functions.
- */
-
- /*
- * F
- */
- private int F1(int x, int y, int z)
- {
- return x ^ y ^ z;
- }
-
- /*
- * G
- */
- private int F2(int x, int y, int z)
- {
- return (x & y) | (~ x & z);
- }
-
- /*
- * H
- */
- private int F3(int x, int y, int z)
- {
- return (x | ~ y) ^ z;
- }
-
- /*
- * I
- */
- private int F4(int x, int y, int z)
- {
- return (x & z) | (y & ~ z);
- }
-
- private int F1(int a, int b, int c, int d, int x, int s)
- {
- return RL(a + F1(b, c, d) + x, s);
- }
-
- private int F2(int a, int b, int c, int d, int x, int s)
- {
- return RL(a + F2(b, c, d) + x + unchecked((int)0x5a827999), s);
- }
-
- private int F3(int a, int b, int c, int d, int x, int s)
- {
- return RL(a + F3(b, c, d) + x + unchecked((int)0x6ed9eba1), s);
- }
-
- private int F4(int a, int b, int c, int d, int x, int s)
- {
- return RL(a + F4(b, c, d) + x + unchecked((int)0x8f1bbcdc), s);
- }
-
- private int FF1(int a, int b, int c, int d, int x, int s)
- {
- return RL(a + F1(b, c, d) + x, s);
- }
-
- private int FF2(int a, int b, int c, int d, int x, int s)
- {
- return RL(a + F2(b, c, d) + x + unchecked((int)0x6d703ef3), s);
- }
-
- private int FF3(int a, int b, int c, int d, int x, int s)
- {
- return RL(a + F3(b, c, d) + x + unchecked((int)0x5c4dd124), s);
- }
-
- private int FF4(int a, int b, int c, int d, int x, int s)
- {
- return RL(a + F4(b, c, d) + x + unchecked((int)0x50a28be6), s);
- }
-
- internal override void ProcessBlock()
- {
- int a, aa;
- int b, bb;
- int c, cc;
- int d, dd;
- int t;
-
- a = H0;
- b = H1;
- c = H2;
- d = H3;
- aa = H4;
- bb = H5;
- cc = H6;
- dd = H7;
-
- //
- // Round 1
- //
-
- a = F1(a, b, c, d, X[0], 11);
- d = F1(d, a, b, c, X[1], 14);
- c = F1(c, d, a, b, X[2], 15);
- b = F1(b, c, d, a, X[3], 12);
- a = F1(a, b, c, d, X[4], 5);
- d = F1(d, a, b, c, X[5], 8);
- c = F1(c, d, a, b, X[6], 7);
- b = F1(b, c, d, a, X[7], 9);
- a = F1(a, b, c, d, X[8], 11);
- d = F1(d, a, b, c, X[9], 13);
- c = F1(c, d, a, b, X[10], 14);
- b = F1(b, c, d, a, X[11], 15);
- a = F1(a, b, c, d, X[12], 6);
- d = F1(d, a, b, c, X[13], 7);
- c = F1(c, d, a, b, X[14], 9);
- b = F1(b, c, d, a, X[15], 8);
-
- aa = FF4(aa, bb, cc, dd, X[5], 8);
- dd = FF4(dd, aa, bb, cc, X[14], 9);
- cc = FF4(cc, dd, aa, bb, X[7], 9);
- bb = FF4(bb, cc, dd, aa, X[0], 11);
- aa = FF4(aa, bb, cc, dd, X[9], 13);
- dd = FF4(dd, aa, bb, cc, X[2], 15);
- cc = FF4(cc, dd, aa, bb, X[11], 15);
- bb = FF4(bb, cc, dd, aa, X[4], 5);
- aa = FF4(aa, bb, cc, dd, X[13], 7);
- dd = FF4(dd, aa, bb, cc, X[6], 7);
- cc = FF4(cc, dd, aa, bb, X[15], 8);
- bb = FF4(bb, cc, dd, aa, X[8], 11);
- aa = FF4(aa, bb, cc, dd, X[1], 14);
- dd = FF4(dd, aa, bb, cc, X[10], 14);
- cc = FF4(cc, dd, aa, bb, X[3], 12);
- bb = FF4(bb, cc, dd, aa, X[12], 6);
-
- t = a; a = aa; aa = t;
-
- //
- // Round 2
- //
- a = F2(a, b, c, d, X[7], 7);
- d = F2(d, a, b, c, X[4], 6);
- c = F2(c, d, a, b, X[13], 8);
- b = F2(b, c, d, a, X[1], 13);
- a = F2(a, b, c, d, X[10], 11);
- d = F2(d, a, b, c, X[6], 9);
- c = F2(c, d, a, b, X[15], 7);
- b = F2(b, c, d, a, X[3], 15);
- a = F2(a, b, c, d, X[12], 7);
- d = F2(d, a, b, c, X[0], 12);
- c = F2(c, d, a, b, X[9], 15);
- b = F2(b, c, d, a, X[5], 9);
- a = F2(a, b, c, d, X[2], 11);
- d = F2(d, a, b, c, X[14], 7);
- c = F2(c, d, a, b, X[11], 13);
- b = F2(b, c, d, a, X[8], 12);
-
- aa = FF3(aa, bb, cc, dd, X[6], 9);
- dd = FF3(dd, aa, bb, cc, X[11], 13);
- cc = FF3(cc, dd, aa, bb, X[3], 15);
- bb = FF3(bb, cc, dd, aa, X[7], 7);
- aa = FF3(aa, bb, cc, dd, X[0], 12);
- dd = FF3(dd, aa, bb, cc, X[13], 8);
- cc = FF3(cc, dd, aa, bb, X[5], 9);
- bb = FF3(bb, cc, dd, aa, X[10], 11);
- aa = FF3(aa, bb, cc, dd, X[14], 7);
- dd = FF3(dd, aa, bb, cc, X[15], 7);
- cc = FF3(cc, dd, aa, bb, X[8], 12);
- bb = FF3(bb, cc, dd, aa, X[12], 7);
- aa = FF3(aa, bb, cc, dd, X[4], 6);
- dd = FF3(dd, aa, bb, cc, X[9], 15);
- cc = FF3(cc, dd, aa, bb, X[1], 13);
- bb = FF3(bb, cc, dd, aa, X[2], 11);
-
- t = b; b = bb; bb = t;
-
- //
- // Round 3
- //
- a = F3(a, b, c, d, X[3], 11);
- d = F3(d, a, b, c, X[10], 13);
- c = F3(c, d, a, b, X[14], 6);
- b = F3(b, c, d, a, X[4], 7);
- a = F3(a, b, c, d, X[9], 14);
- d = F3(d, a, b, c, X[15], 9);
- c = F3(c, d, a, b, X[8], 13);
- b = F3(b, c, d, a, X[1], 15);
- a = F3(a, b, c, d, X[2], 14);
- d = F3(d, a, b, c, X[7], 8);
- c = F3(c, d, a, b, X[0], 13);
- b = F3(b, c, d, a, X[6], 6);
- a = F3(a, b, c, d, X[13], 5);
- d = F3(d, a, b, c, X[11], 12);
- c = F3(c, d, a, b, X[5], 7);
- b = F3(b, c, d, a, X[12], 5);
-
- aa = FF2(aa, bb, cc, dd, X[15], 9);
- dd = FF2(dd, aa, bb, cc, X[5], 7);
- cc = FF2(cc, dd, aa, bb, X[1], 15);
- bb = FF2(bb, cc, dd, aa, X[3], 11);
- aa = FF2(aa, bb, cc, dd, X[7], 8);
- dd = FF2(dd, aa, bb, cc, X[14], 6);
- cc = FF2(cc, dd, aa, bb, X[6], 6);
- bb = FF2(bb, cc, dd, aa, X[9], 14);
- aa = FF2(aa, bb, cc, dd, X[11], 12);
- dd = FF2(dd, aa, bb, cc, X[8], 13);
- cc = FF2(cc, dd, aa, bb, X[12], 5);
- bb = FF2(bb, cc, dd, aa, X[2], 14);
- aa = FF2(aa, bb, cc, dd, X[10], 13);
- dd = FF2(dd, aa, bb, cc, X[0], 13);
- cc = FF2(cc, dd, aa, bb, X[4], 7);
- bb = FF2(bb, cc, dd, aa, X[13], 5);
-
- t = c; c = cc; cc = t;
-
- //
- // Round 4
- //
- a = F4(a, b, c, d, X[1], 11);
- d = F4(d, a, b, c, X[9], 12);
- c = F4(c, d, a, b, X[11], 14);
- b = F4(b, c, d, a, X[10], 15);
- a = F4(a, b, c, d, X[0], 14);
- d = F4(d, a, b, c, X[8], 15);
- c = F4(c, d, a, b, X[12], 9);
- b = F4(b, c, d, a, X[4], 8);
- a = F4(a, b, c, d, X[13], 9);
- d = F4(d, a, b, c, X[3], 14);
- c = F4(c, d, a, b, X[7], 5);
- b = F4(b, c, d, a, X[15], 6);
- a = F4(a, b, c, d, X[14], 8);
- d = F4(d, a, b, c, X[5], 6);
- c = F4(c, d, a, b, X[6], 5);
- b = F4(b, c, d, a, X[2], 12);
-
- aa = FF1(aa, bb, cc, dd, X[8], 15);
- dd = FF1(dd, aa, bb, cc, X[6], 5);
- cc = FF1(cc, dd, aa, bb, X[4], 8);
- bb = FF1(bb, cc, dd, aa, X[1], 11);
- aa = FF1(aa, bb, cc, dd, X[3], 14);
- dd = FF1(dd, aa, bb, cc, X[11], 14);
- cc = FF1(cc, dd, aa, bb, X[15], 6);
- bb = FF1(bb, cc, dd, aa, X[0], 14);
- aa = FF1(aa, bb, cc, dd, X[5], 6);
- dd = FF1(dd, aa, bb, cc, X[12], 9);
- cc = FF1(cc, dd, aa, bb, X[2], 12);
- bb = FF1(bb, cc, dd, aa, X[13], 9);
- aa = FF1(aa, bb, cc, dd, X[9], 12);
- dd = FF1(dd, aa, bb, cc, X[7], 5);
- cc = FF1(cc, dd, aa, bb, X[10], 15);
- bb = FF1(bb, cc, dd, aa, X[14], 8);
-
- t = d; d = dd; dd = t;
-
- H0 += a;
- H1 += b;
- H2 += c;
- H3 += d;
- H4 += aa;
- H5 += bb;
- H6 += cc;
- H7 += dd;
-
- //
- // reset the offset and clean out the word buffer.
- //
- xOff = 0;
- for (int i = 0; i != X.Length; i++)
- {
- X[i] = 0;
- }
- }
-
- public override IMemoable Copy()
- {
- return new RipeMD256Digest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- RipeMD256Digest d = (RipeMD256Digest)other;
-
- CopyIn(d);
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/digests/RipeMD320Digest.cs b/BCCrypto/src/crypto/digests/RipeMD320Digest.cs
deleted file mode 100644
index 767d74d..0000000
--- a/BCCrypto/src/crypto/digests/RipeMD320Digest.cs
+++ /dev/null
@@ -1,459 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- ///
- /// Implementation of RipeMD 320.
- /// Note: this algorithm offers the same level of security as RipeMD160.
- ///
- public class RipeMD320Digest
- : GeneralDigest
- {
- public override string AlgorithmName
- {
- get { return "RIPEMD320"; }
- }
-
- public override int GetDigestSize()
- {
- return DigestLength;
- }
-
- private const int DigestLength = 40;
-
- private int H0, H1, H2, H3, H4, H5, H6, H7, H8, H9; // IV's
-
- private int[] X = new int[16];
- private int xOff;
-
- /// Standard constructor
- public RipeMD320Digest()
- {
- Reset();
- }
-
- /// Copy constructor. This will copy the state of the provided
- /// message digest.
- ///
- public RipeMD320Digest(RipeMD320Digest t)
- : base(t)
- {
- CopyIn(t);
- }
-
- private void CopyIn(RipeMD320Digest t)
- {
- base.CopyIn(t);
-
- H0 = t.H0;
- H1 = t.H1;
- H2 = t.H2;
- H3 = t.H3;
- H4 = t.H4;
- H5 = t.H5;
- H6 = t.H6;
- H7 = t.H7;
- H8 = t.H8;
- H9 = t.H9;
-
- Array.Copy(t.X, 0, X, 0, t.X.Length);
- xOff = t.xOff;
- }
-
- internal override void ProcessWord(
- byte[] input,
- int inOff)
- {
- X[xOff++] = (input[inOff] & 0xff) | ((input[inOff + 1] & 0xff) << 8)
- | ((input[inOff + 2] & 0xff) << 16) | ((input[inOff + 3] & 0xff) << 24);
-
- if (xOff == 16)
- {
- ProcessBlock();
- }
- }
-
- internal override void ProcessLength(
- long bitLength)
- {
- if (xOff > 14)
- {
- ProcessBlock();
- }
-
- X[14] = (int)(bitLength & 0xffffffff);
- X[15] = (int)((ulong)bitLength >> 32);
- }
-
- private void UnpackWord(
- int word,
- byte[] outBytes,
- int outOff)
- {
- outBytes[outOff] = (byte)word;
- outBytes[outOff + 1] = (byte)((uint)word >> 8);
- outBytes[outOff + 2] = (byte)((uint)word >> 16);
- outBytes[outOff + 3] = (byte)((uint)word >> 24);
- }
-
- public override int DoFinal(byte[] output, int outOff)
- {
- Finish();
-
- UnpackWord(H0, output, outOff);
- UnpackWord(H1, output, outOff + 4);
- UnpackWord(H2, output, outOff + 8);
- UnpackWord(H3, output, outOff + 12);
- UnpackWord(H4, output, outOff + 16);
- UnpackWord(H5, output, outOff + 20);
- UnpackWord(H6, output, outOff + 24);
- UnpackWord(H7, output, outOff + 28);
- UnpackWord(H8, output, outOff + 32);
- UnpackWord(H9, output, outOff + 36);
-
- Reset();
-
- return DigestLength;
- }
-
- /// reset the chaining variables to the IV values.
- public override void Reset()
- {
- base.Reset();
-
- H0 = unchecked((int) 0x67452301);
- H1 = unchecked((int) 0xefcdab89);
- H2 = unchecked((int) 0x98badcfe);
- H3 = unchecked((int) 0x10325476);
- H4 = unchecked((int) 0xc3d2e1f0);
- H5 = unchecked((int) 0x76543210);
- H6 = unchecked((int) 0xFEDCBA98);
- H7 = unchecked((int) 0x89ABCDEF);
- H8 = unchecked((int) 0x01234567);
- H9 = unchecked((int) 0x3C2D1E0F);
-
- xOff = 0;
-
- for (int i = 0; i != X.Length; i++)
- {
- X[i] = 0;
- }
- }
-
- /*
- * rotate int x left n bits.
- */
- private int RL(
- int x,
- int n)
- {
- return (x << n) | (int)(((uint)x) >> (32 - n));
- }
-
- /*
- * f1,f2,f3,f4,f5 are the basic RipeMD160 functions.
- */
-
- /*
- * rounds 0-15
- */
- private int F1(int x, int y, int z)
- {
- return x ^ y ^ z;
- }
-
- /*
- * rounds 16-31
- */
- private int F2(int x, int y, int z)
- {
- return (x & y) | (~ x & z);
- }
-
- /*
- * rounds 32-47
- */
- private int F3(int x, int y, int z)
- {
- return (x | ~ y) ^ z;
- }
-
- /*
- * rounds 48-63
- */
- private int F4(int x, int y, int z)
- {
- return (x & z) | (y & ~ z);
- }
-
- /*
- * rounds 64-79
- */
- private int F5(int x, int y, int z)
- {
- return x ^ (y | ~z);
- }
-
- internal override void ProcessBlock()
- {
- int a, aa;
- int b, bb;
- int c, cc;
- int d, dd;
- int e, ee;
- int t;
-
- a = H0;
- b = H1;
- c = H2;
- d = H3;
- e = H4;
- aa = H5;
- bb = H6;
- cc = H7;
- dd = H8;
- ee = H9;
-
- //
- // Rounds 1 - 16
- //
- // left
- a = RL(a + F1(b, c, d) + X[0], 11) + e; c = RL(c, 10);
- e = RL(e + F1(a, b, c) + X[1], 14) + d; b = RL(b, 10);
- d = RL(d + F1(e, a, b) + X[2], 15) + c; a = RL(a, 10);
- c = RL(c + F1(d, e, a) + X[3], 12) + b; e = RL(e, 10);
- b = RL(b + F1(c, d, e) + X[4], 5) + a; d = RL(d, 10);
- a = RL(a + F1(b, c, d) + X[5], 8) + e; c = RL(c, 10);
- e = RL(e + F1(a, b, c) + X[6], 7) + d; b = RL(b, 10);
- d = RL(d + F1(e, a, b) + X[7], 9) + c; a = RL(a, 10);
- c = RL(c + F1(d, e, a) + X[8], 11) + b; e = RL(e, 10);
- b = RL(b + F1(c, d, e) + X[9], 13) + a; d = RL(d, 10);
- a = RL(a + F1(b, c, d) + X[10], 14) + e; c = RL(c, 10);
- e = RL(e + F1(a, b, c) + X[11], 15) + d; b = RL(b, 10);
- d = RL(d + F1(e, a, b) + X[12], 6) + c; a = RL(a, 10);
- c = RL(c + F1(d, e, a) + X[13], 7) + b; e = RL(e, 10);
- b = RL(b + F1(c, d, e) + X[14], 9) + a; d = RL(d, 10);
- a = RL(a + F1(b, c, d) + X[15], 8) + e; c = RL(c, 10);
-
- // right
- aa = RL(aa + F5(bb, cc, dd) + X[5] + unchecked((int)0x50a28be6), 8) + ee; cc = RL(cc, 10);
- ee = RL(ee + F5(aa, bb, cc) + X[14] + unchecked((int)0x50a28be6), 9) + dd; bb = RL(bb, 10);
- dd = RL(dd + F5(ee, aa, bb) + X[7] + unchecked((int)0x50a28be6), 9) + cc; aa = RL(aa, 10);
- cc = RL(cc + F5(dd, ee, aa) + X[0] + unchecked((int)0x50a28be6), 11) + bb; ee = RL(ee, 10);
- bb = RL(bb + F5(cc, dd, ee) + X[9] + unchecked((int)0x50a28be6), 13) + aa; dd = RL(dd, 10);
- aa = RL(aa + F5(bb, cc, dd) + X[2] + unchecked((int)0x50a28be6), 15) + ee; cc = RL(cc, 10);
- ee = RL(ee + F5(aa, bb, cc) + X[11] + unchecked((int)0x50a28be6), 15) + dd; bb = RL(bb, 10);
- dd = RL(dd + F5(ee, aa, bb) + X[4] + unchecked((int)0x50a28be6), 5) + cc; aa = RL(aa, 10);
- cc = RL(cc + F5(dd, ee, aa) + X[13] + unchecked((int)0x50a28be6), 7) + bb; ee = RL(ee, 10);
- bb = RL(bb + F5(cc, dd, ee) + X[6] + unchecked((int)0x50a28be6), 7) + aa; dd = RL(dd, 10);
- aa = RL(aa + F5(bb, cc, dd) + X[15] + unchecked((int)0x50a28be6), 8) + ee; cc = RL(cc, 10);
- ee = RL(ee + F5(aa, bb, cc) + X[8] + unchecked((int)0x50a28be6), 11) + dd; bb = RL(bb, 10);
- dd = RL(dd + F5(ee, aa, bb) + X[1] + unchecked((int)0x50a28be6), 14) + cc; aa = RL(aa, 10);
- cc = RL(cc + F5(dd, ee, aa) + X[10] + unchecked((int)0x50a28be6), 14) + bb; ee = RL(ee, 10);
- bb = RL(bb + F5(cc, dd, ee) + X[3] + unchecked((int)0x50a28be6), 12) + aa; dd = RL(dd, 10);
- aa = RL(aa + F5(bb, cc, dd) + X[12] + unchecked((int)0x50a28be6), 6) + ee; cc = RL(cc, 10);
-
- t = a; a = aa; aa = t;
- //
- // Rounds 16-31
- //
- // left
- e = RL(e + F2(a, b, c) + X[7] + unchecked((int)0x5a827999), 7) + d; b = RL(b, 10);
- d = RL(d + F2(e, a, b) + X[4] + unchecked((int)0x5a827999), 6) + c; a = RL(a, 10);
- c = RL(c + F2(d, e, a) + X[13] + unchecked((int)0x5a827999), 8) + b; e = RL(e, 10);
- b = RL(b + F2(c, d, e) + X[1] + unchecked((int)0x5a827999), 13) + a; d = RL(d, 10);
- a = RL(a + F2(b, c, d) + X[10] + unchecked((int)0x5a827999), 11) + e; c = RL(c, 10);
- e = RL(e + F2(a, b, c) + X[6] + unchecked((int)0x5a827999), 9) + d; b = RL(b, 10);
- d = RL(d + F2(e, a, b) + X[15] + unchecked((int)0x5a827999), 7) + c; a = RL(a, 10);
- c = RL(c + F2(d, e, a) + X[3] + unchecked((int)0x5a827999), 15) + b; e = RL(e, 10);
- b = RL(b + F2(c, d, e) + X[12] + unchecked((int)0x5a827999), 7) + a; d = RL(d, 10);
- a = RL(a + F2(b, c, d) + X[0] + unchecked((int)0x5a827999), 12) + e; c = RL(c, 10);
- e = RL(e + F2(a, b, c) + X[9] + unchecked((int)0x5a827999), 15) + d; b = RL(b, 10);
- d = RL(d + F2(e, a, b) + X[5] + unchecked((int)0x5a827999), 9) + c; a = RL(a, 10);
- c = RL(c + F2(d, e, a) + X[2] + unchecked((int)0x5a827999), 11) + b; e = RL(e, 10);
- b = RL(b + F2(c, d, e) + X[14] + unchecked((int)0x5a827999), 7) + a; d = RL(d, 10);
- a = RL(a + F2(b, c, d) + X[11] + unchecked((int)0x5a827999), 13) + e; c = RL(c, 10);
- e = RL(e + F2(a, b, c) + X[8] + unchecked((int)0x5a827999), 12) + d; b = RL(b, 10);
-
- // right
- ee = RL(ee + F4(aa, bb, cc) + X[6] + unchecked((int)0x5c4dd124), 9) + dd; bb = RL(bb, 10);
- dd = RL(dd + F4(ee, aa, bb) + X[11] + unchecked((int)0x5c4dd124), 13) + cc; aa = RL(aa, 10);
- cc = RL(cc + F4(dd, ee, aa) + X[3] + unchecked((int)0x5c4dd124), 15) + bb; ee = RL(ee, 10);
- bb = RL(bb + F4(cc, dd, ee) + X[7] + unchecked((int)0x5c4dd124), 7) + aa; dd = RL(dd, 10);
- aa = RL(aa + F4(bb, cc, dd) + X[0] + unchecked((int)0x5c4dd124), 12) + ee; cc = RL(cc, 10);
- ee = RL(ee + F4(aa, bb, cc) + X[13] + unchecked((int)0x5c4dd124), 8) + dd; bb = RL(bb, 10);
- dd = RL(dd + F4(ee, aa, bb) + X[5] + unchecked((int)0x5c4dd124), 9) + cc; aa = RL(aa, 10);
- cc = RL(cc + F4(dd, ee, aa) + X[10] + unchecked((int)0x5c4dd124), 11) + bb; ee = RL(ee, 10);
- bb = RL(bb + F4(cc, dd, ee) + X[14] + unchecked((int)0x5c4dd124), 7) + aa; dd = RL(dd, 10);
- aa = RL(aa + F4(bb, cc, dd) + X[15] + unchecked((int)0x5c4dd124), 7) + ee; cc = RL(cc, 10);
- ee = RL(ee + F4(aa, bb, cc) + X[8] + unchecked((int)0x5c4dd124), 12) + dd; bb = RL(bb, 10);
- dd = RL(dd + F4(ee, aa, bb) + X[12] + unchecked((int)0x5c4dd124), 7) + cc; aa = RL(aa, 10);
- cc = RL(cc + F4(dd, ee, aa) + X[4] + unchecked((int)0x5c4dd124), 6) + bb; ee = RL(ee, 10);
- bb = RL(bb + F4(cc, dd, ee) + X[9] + unchecked((int)0x5c4dd124), 15) + aa; dd = RL(dd, 10);
- aa = RL(aa + F4(bb, cc, dd) + X[1] + unchecked((int)0x5c4dd124), 13) + ee; cc = RL(cc, 10);
- ee = RL(ee + F4(aa, bb, cc) + X[2] + unchecked((int)0x5c4dd124), 11) + dd; bb = RL(bb, 10);
-
- t = b; b = bb; bb = t;
-
- //
- // Rounds 32-47
- //
- // left
- d = RL(d + F3(e, a, b) + X[3] + unchecked((int)0x6ed9eba1), 11) + c; a = RL(a, 10);
- c = RL(c + F3(d, e, a) + X[10] + unchecked((int)0x6ed9eba1), 13) + b; e = RL(e, 10);
- b = RL(b + F3(c, d, e) + X[14] + unchecked((int)0x6ed9eba1), 6) + a; d = RL(d, 10);
- a = RL(a + F3(b, c, d) + X[4] + unchecked((int)0x6ed9eba1), 7) + e; c = RL(c, 10);
- e = RL(e + F3(a, b, c) + X[9] + unchecked((int)0x6ed9eba1), 14) + d; b = RL(b, 10);
- d = RL(d + F3(e, a, b) + X[15] + unchecked((int)0x6ed9eba1), 9) + c; a = RL(a, 10);
- c = RL(c + F3(d, e, a) + X[8] + unchecked((int)0x6ed9eba1), 13) + b; e = RL(e, 10);
- b = RL(b + F3(c, d, e) + X[1] + unchecked((int)0x6ed9eba1), 15) + a; d = RL(d, 10);
- a = RL(a + F3(b, c, d) + X[2] + unchecked((int)0x6ed9eba1), 14) + e; c = RL(c, 10);
- e = RL(e + F3(a, b, c) + X[7] + unchecked((int)0x6ed9eba1), 8) + d; b = RL(b, 10);
- d = RL(d + F3(e, a, b) + X[0] + unchecked((int)0x6ed9eba1), 13) + c; a = RL(a, 10);
- c = RL(c + F3(d, e, a) + X[6] + unchecked((int)0x6ed9eba1), 6) + b; e = RL(e, 10);
- b = RL(b + F3(c, d, e) + X[13] + unchecked((int)0x6ed9eba1), 5) + a; d = RL(d, 10);
- a = RL(a + F3(b, c, d) + X[11] + unchecked((int)0x6ed9eba1), 12) + e; c = RL(c, 10);
- e = RL(e + F3(a, b, c) + X[5] + unchecked((int)0x6ed9eba1), 7) + d; b = RL(b, 10);
- d = RL(d + F3(e, a, b) + X[12] + unchecked((int)0x6ed9eba1), 5) + c; a = RL(a, 10);
-
- // right
- dd = RL(dd + F3(ee, aa, bb) + X[15] + unchecked((int)0x6d703ef3), 9) + cc; aa = RL(aa, 10);
- cc = RL(cc + F3(dd, ee, aa) + X[5] + unchecked((int)0x6d703ef3), 7) + bb; ee = RL(ee, 10);
- bb = RL(bb + F3(cc, dd, ee) + X[1] + unchecked((int)0x6d703ef3), 15) + aa; dd = RL(dd, 10);
- aa = RL(aa + F3(bb, cc, dd) + X[3] + unchecked((int)0x6d703ef3), 11) + ee; cc = RL(cc, 10);
- ee = RL(ee + F3(aa, bb, cc) + X[7] + unchecked((int)0x6d703ef3), 8) + dd; bb = RL(bb, 10);
- dd = RL(dd + F3(ee, aa, bb) + X[14] + unchecked((int)0x6d703ef3), 6) + cc; aa = RL(aa, 10);
- cc = RL(cc + F3(dd, ee, aa) + X[6] + unchecked((int)0x6d703ef3), 6) + bb; ee = RL(ee, 10);
- bb = RL(bb + F3(cc, dd, ee) + X[9] + unchecked((int)0x6d703ef3), 14) + aa; dd = RL(dd, 10);
- aa = RL(aa + F3(bb, cc, dd) + X[11] + unchecked((int)0x6d703ef3), 12) + ee; cc = RL(cc, 10);
- ee = RL(ee + F3(aa, bb, cc) + X[8] + unchecked((int)0x6d703ef3), 13) + dd; bb = RL(bb, 10);
- dd = RL(dd + F3(ee, aa, bb) + X[12] + unchecked((int)0x6d703ef3), 5) + cc; aa = RL(aa, 10);
- cc = RL(cc + F3(dd, ee, aa) + X[2] + unchecked((int)0x6d703ef3), 14) + bb; ee = RL(ee, 10);
- bb = RL(bb + F3(cc, dd, ee) + X[10] + unchecked((int)0x6d703ef3), 13) + aa; dd = RL(dd, 10);
- aa = RL(aa + F3(bb, cc, dd) + X[0] + unchecked((int)0x6d703ef3), 13) + ee; cc = RL(cc, 10);
- ee = RL(ee + F3(aa, bb, cc) + X[4] + unchecked((int)0x6d703ef3), 7) + dd; bb = RL(bb, 10);
- dd = RL(dd + F3(ee, aa, bb) + X[13] + unchecked((int)0x6d703ef3), 5) + cc; aa = RL(aa, 10);
-
- t = c; c = cc; cc = t;
-
- //
- // Rounds 48-63
- //
- // left
- c = RL(c + F4(d, e, a) + X[1] + unchecked((int)0x8f1bbcdc), 11) + b; e = RL(e, 10);
- b = RL(b + F4(c, d, e) + X[9] + unchecked((int)0x8f1bbcdc), 12) + a; d = RL(d, 10);
- a = RL(a + F4(b, c, d) + X[11] + unchecked((int)0x8f1bbcdc), 14) + e; c = RL(c, 10);
- e = RL(e + F4(a, b, c) + X[10] + unchecked((int)0x8f1bbcdc), 15) + d; b = RL(b, 10);
- d = RL(d + F4(e, a, b) + X[0] + unchecked((int)0x8f1bbcdc), 14) + c; a = RL(a, 10);
- c = RL(c + F4(d, e, a) + X[8] + unchecked((int)0x8f1bbcdc), 15) + b; e = RL(e, 10);
- b = RL(b + F4(c, d, e) + X[12] + unchecked((int)0x8f1bbcdc), 9) + a; d = RL(d, 10);
- a = RL(a + F4(b, c, d) + X[4] + unchecked((int)0x8f1bbcdc), 8) + e; c = RL(c, 10);
- e = RL(e + F4(a, b, c) + X[13] + unchecked((int)0x8f1bbcdc), 9) + d; b = RL(b, 10);
- d = RL(d + F4(e, a, b) + X[3] + unchecked((int)0x8f1bbcdc), 14) + c; a = RL(a, 10);
- c = RL(c + F4(d, e, a) + X[7] + unchecked((int)0x8f1bbcdc), 5) + b; e = RL(e, 10);
- b = RL(b + F4(c, d, e) + X[15] + unchecked((int)0x8f1bbcdc), 6) + a; d = RL(d, 10);
- a = RL(a + F4(b, c, d) + X[14] + unchecked((int)0x8f1bbcdc), 8) + e; c = RL(c, 10);
- e = RL(e + F4(a, b, c) + X[5] + unchecked((int)0x8f1bbcdc), 6) + d; b = RL(b, 10);
- d = RL(d + F4(e, a, b) + X[6] + unchecked((int)0x8f1bbcdc), 5) + c; a = RL(a, 10);
- c = RL(c + F4(d, e, a) + X[2] + unchecked((int)0x8f1bbcdc), 12) + b; e = RL(e, 10);
-
- // right
- cc = RL(cc + F2(dd, ee, aa) + X[8] + unchecked((int)0x7a6d76e9), 15) + bb; ee = RL(ee, 10);
- bb = RL(bb + F2(cc, dd, ee) + X[6] + unchecked((int)0x7a6d76e9), 5) + aa; dd = RL(dd, 10);
- aa = RL(aa + F2(bb, cc, dd) + X[4] + unchecked((int)0x7a6d76e9), 8) + ee; cc = RL(cc, 10);
- ee = RL(ee + F2(aa, bb, cc) + X[1] + unchecked((int)0x7a6d76e9), 11) + dd; bb = RL(bb, 10);
- dd = RL(dd + F2(ee, aa, bb) + X[3] + unchecked((int)0x7a6d76e9), 14) + cc; aa = RL(aa, 10);
- cc = RL(cc + F2(dd, ee, aa) + X[11] + unchecked((int)0x7a6d76e9), 14) + bb; ee = RL(ee, 10);
- bb = RL(bb + F2(cc, dd, ee) + X[15] + unchecked((int)0x7a6d76e9), 6) + aa; dd = RL(dd, 10);
- aa = RL(aa + F2(bb, cc, dd) + X[0] + unchecked((int)0x7a6d76e9), 14) + ee; cc = RL(cc, 10);
- ee = RL(ee + F2(aa, bb, cc) + X[5] + unchecked((int)0x7a6d76e9), 6) + dd; bb = RL(bb, 10);
- dd = RL(dd + F2(ee, aa, bb) + X[12] + unchecked((int)0x7a6d76e9), 9) + cc; aa = RL(aa, 10);
- cc = RL(cc + F2(dd, ee, aa) + X[2] + unchecked((int)0x7a6d76e9), 12) + bb; ee = RL(ee, 10);
- bb = RL(bb + F2(cc, dd, ee) + X[13] + unchecked((int)0x7a6d76e9), 9) + aa; dd = RL(dd, 10);
- aa = RL(aa + F2(bb, cc, dd) + X[9] + unchecked((int)0x7a6d76e9), 12) + ee; cc = RL(cc, 10);
- ee = RL(ee + F2(aa, bb, cc) + X[7] + unchecked((int)0x7a6d76e9), 5) + dd; bb = RL(bb, 10);
- dd = RL(dd + F2(ee, aa, bb) + X[10] + unchecked((int)0x7a6d76e9), 15) + cc; aa = RL(aa, 10);
- cc = RL(cc + F2(dd, ee, aa) + X[14] + unchecked((int)0x7a6d76e9), 8) + bb; ee = RL(ee, 10);
-
- t = d; d = dd; dd = t;
-
- //
- // Rounds 64-79
- //
- // left
- b = RL(b + F5(c, d, e) + X[4] + unchecked((int)0xa953fd4e), 9) + a; d = RL(d, 10);
- a = RL(a + F5(b, c, d) + X[0] + unchecked((int)0xa953fd4e), 15) + e; c = RL(c, 10);
- e = RL(e + F5(a, b, c) + X[5] + unchecked((int)0xa953fd4e), 5) + d; b = RL(b, 10);
- d = RL(d + F5(e, a, b) + X[9] + unchecked((int)0xa953fd4e), 11) + c; a = RL(a, 10);
- c = RL(c + F5(d, e, a) + X[7] + unchecked((int)0xa953fd4e), 6) + b; e = RL(e, 10);
- b = RL(b + F5(c, d, e) + X[12] + unchecked((int)0xa953fd4e), 8) + a; d = RL(d, 10);
- a = RL(a + F5(b, c, d) + X[2] + unchecked((int)0xa953fd4e), 13) + e; c = RL(c, 10);
- e = RL(e + F5(a, b, c) + X[10] + unchecked((int)0xa953fd4e), 12) + d; b = RL(b, 10);
- d = RL(d + F5(e, a, b) + X[14] + unchecked((int)0xa953fd4e), 5) + c; a = RL(a, 10);
- c = RL(c + F5(d, e, a) + X[1] + unchecked((int)0xa953fd4e), 12) + b; e = RL(e, 10);
- b = RL(b + F5(c, d, e) + X[3] + unchecked((int)0xa953fd4e), 13) + a; d = RL(d, 10);
- a = RL(a + F5(b, c, d) + X[8] + unchecked((int)0xa953fd4e), 14) + e; c = RL(c, 10);
- e = RL(e + F5(a, b, c) + X[11] + unchecked((int)0xa953fd4e), 11) + d; b = RL(b, 10);
- d = RL(d + F5(e, a, b) + X[6] + unchecked((int)0xa953fd4e), 8) + c; a = RL(a, 10);
- c = RL(c + F5(d, e, a) + X[15] + unchecked((int)0xa953fd4e), 5) + b; e = RL(e, 10);
- b = RL(b + F5(c, d, e) + X[13] + unchecked((int)0xa953fd4e), 6) + a; d = RL(d, 10);
-
- // right
- bb = RL(bb + F1(cc, dd, ee) + X[12], 8) + aa; dd = RL(dd, 10);
- aa = RL(aa + F1(bb, cc, dd) + X[15], 5) + ee; cc = RL(cc, 10);
- ee = RL(ee + F1(aa, bb, cc) + X[10], 12) + dd; bb = RL(bb, 10);
- dd = RL(dd + F1(ee, aa, bb) + X[4], 9) + cc; aa = RL(aa, 10);
- cc = RL(cc + F1(dd, ee, aa) + X[1], 12) + bb; ee = RL(ee, 10);
- bb = RL(bb + F1(cc, dd, ee) + X[5], 5) + aa; dd = RL(dd, 10);
- aa = RL(aa + F1(bb, cc, dd) + X[8], 14) + ee; cc = RL(cc, 10);
- ee = RL(ee + F1(aa, bb, cc) + X[7], 6) + dd; bb = RL(bb, 10);
- dd = RL(dd + F1(ee, aa, bb) + X[6], 8) + cc; aa = RL(aa, 10);
- cc = RL(cc + F1(dd, ee, aa) + X[2], 13) + bb; ee = RL(ee, 10);
- bb = RL(bb + F1(cc, dd, ee) + X[13], 6) + aa; dd = RL(dd, 10);
- aa = RL(aa + F1(bb, cc, dd) + X[14], 5) + ee; cc = RL(cc, 10);
- ee = RL(ee + F1(aa, bb, cc) + X[0], 15) + dd; bb = RL(bb, 10);
- dd = RL(dd + F1(ee, aa, bb) + X[3], 13) + cc; aa = RL(aa, 10);
- cc = RL(cc + F1(dd, ee, aa) + X[9], 11) + bb; ee = RL(ee, 10);
- bb = RL(bb + F1(cc, dd, ee) + X[11], 11) + aa; dd = RL(dd, 10);
-
- //
- // do (e, ee) swap as part of assignment.
- //
-
- H0 += a;
- H1 += b;
- H2 += c;
- H3 += d;
- H4 += ee;
- H5 += aa;
- H6 += bb;
- H7 += cc;
- H8 += dd;
- H9 += e;
-
- //
- // reset the offset and clean out the word buffer.
- //
- xOff = 0;
- for (int i = 0; i != X.Length; i++)
- {
- X[i] = 0;
- }
- }
-
- public override IMemoable Copy()
- {
- return new RipeMD320Digest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- RipeMD320Digest d = (RipeMD320Digest)other;
-
- CopyIn(d);
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/digests/SHA3Digest.cs b/BCCrypto/src/crypto/digests/SHA3Digest.cs
deleted file mode 100644
index 4683af5..0000000
--- a/BCCrypto/src/crypto/digests/SHA3Digest.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- ///
- /// Implementation of SHA-3 based on following KeccakNISTInterface.c from http://keccak.noekeon.org/
- ///
- ///
- /// Following the naming conventions used in the C source code to enable easy review of the implementation.
- ///
- public class Sha3Digest
- : KeccakDigest
- {
- private static int CheckBitLength(int bitLength)
- {
- switch (bitLength)
- {
- case 224:
- case 256:
- case 384:
- case 512:
- return bitLength;
- default:
- throw new ArgumentException(bitLength + " not supported for SHA-3", "bitLength");
- }
- }
-
- public Sha3Digest()
- : this(256)
- {
- }
-
- public Sha3Digest(int bitLength)
- : base(CheckBitLength(bitLength))
- {
- }
-
- public Sha3Digest(Sha3Digest source)
- : base(source)
- {
- }
-
- public override string AlgorithmName
- {
- get { return "SHA3-" + fixedOutputLength; }
- }
-
- public override int DoFinal(byte[] output, int outOff)
- {
- AbsorbBits(0x02, 2);
-
- return base.DoFinal(output, outOff);
- }
-
- /*
- * TODO Possible API change to support partial-byte suffixes.
- */
- protected override int DoFinal(byte[] output, int outOff, byte partialByte, int partialBits)
- {
- if (partialBits < 0 || partialBits > 7)
- throw new ArgumentException("must be in the range [0,7]", "partialBits");
-
- int finalInput = (partialByte & ((1 << partialBits) - 1)) | (0x02 << partialBits);
- Debug.Assert(finalInput >= 0);
- int finalBits = partialBits + 2;
-
- if (finalBits >= 8)
- {
- Absorb(new byte[]{ (byte)finalInput }, 0, 1);
- finalBits -= 8;
- finalInput >>= 8;
- }
-
- return base.DoFinal(output, outOff, (byte)finalInput, finalBits);
- }
-
- public override IMemoable Copy()
- {
- return new Sha3Digest(this);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/digests/SM3Digest.cs b/BCCrypto/src/crypto/digests/SM3Digest.cs
deleted file mode 100644
index d81b2dd..0000000
--- a/BCCrypto/src/crypto/digests/SM3Digest.cs
+++ /dev/null
@@ -1,328 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
-
- ///
- /// Implementation of Chinese SM3 digest as described at
- /// http://tools.ietf.org/html/draft-shen-sm3-hash-00
- /// and at .... ( Chinese PDF )
- ///
- ///
- /// The specification says "process a bit stream",
- /// but this is written to process bytes in blocks of 4,
- /// meaning this will process 32-bit word groups.
- /// But so do also most other digest specifications,
- /// including the SHA-256 which was a origin for
- /// this specification.
- ///
- public class SM3Digest
- : GeneralDigest
- {
- private const int DIGEST_LENGTH = 32; // bytes
- private const int BLOCK_SIZE = 64 / 4; // of 32 bit ints (16 ints)
-
- private uint[] V = new uint[DIGEST_LENGTH / 4]; // in 32 bit ints (8 ints)
- private uint[] inwords = new uint[BLOCK_SIZE];
- private int xOff;
-
- // Work-bufs used within processBlock()
- private uint[] W = new uint[68];
- private uint[] W1 = new uint[64];
-
- // Round constant T for processBlock() which is 32 bit integer rolled left up to (63 MOD 32) bit positions.
- private static readonly uint[] T = new uint[64];
-
- static SM3Digest()
- {
- for (int i = 0; i < 16; ++i)
- {
- uint t = 0x79CC4519;
- T[i] = (t << i) | (t >> (32 - i));
- }
- for (int i = 16; i < 64; ++i)
- {
- int n = i % 32;
- uint t = 0x7A879D8A;
- T[i] = (t << n) | (t >> (32 - n));
- }
- }
-
-
- ///
- /// Standard constructor
- ///
- public SM3Digest()
- {
- Reset();
- }
-
- ///
- /// Copy constructor. This will copy the state of the provided
- /// message digest.
- ///
- public SM3Digest(SM3Digest t)
- : base(t)
- {
- CopyIn(t);
- }
-
- private void CopyIn(SM3Digest t)
- {
- Array.Copy(t.V, 0, this.V, 0, this.V.Length);
- Array.Copy(t.inwords, 0, this.inwords, 0, this.inwords.Length);
- xOff = t.xOff;
- }
-
- public override string AlgorithmName
- {
- get { return "SM3"; }
- }
-
- public override int GetDigestSize()
- {
- return DIGEST_LENGTH;
- }
-
- public override IMemoable Copy()
- {
- return new SM3Digest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- SM3Digest d = (SM3Digest)other;
-
- base.CopyIn(d);
- CopyIn(d);
- }
-
- ///
- /// reset the chaining variables
- ///
- public override void Reset()
- {
- base.Reset();
-
- this.V[0] = 0x7380166F;
- this.V[1] = 0x4914B2B9;
- this.V[2] = 0x172442D7;
- this.V[3] = 0xDA8A0600;
- this.V[4] = 0xA96F30BC;
- this.V[5] = 0x163138AA;
- this.V[6] = 0xE38DEE4D;
- this.V[7] = 0xB0FB0E4E;
-
- this.xOff = 0;
- }
-
-
- public override int DoFinal(byte[] output, int outOff)
- {
- Finish();
-
- Pack.UInt32_To_BE(this.V[0], output, outOff + 0);
- Pack.UInt32_To_BE(this.V[1], output, outOff + 4);
- Pack.UInt32_To_BE(this.V[2], output, outOff + 8);
- Pack.UInt32_To_BE(this.V[3], output, outOff + 12);
- Pack.UInt32_To_BE(this.V[4], output, outOff + 16);
- Pack.UInt32_To_BE(this.V[5], output, outOff + 20);
- Pack.UInt32_To_BE(this.V[6], output, outOff + 24);
- Pack.UInt32_To_BE(this.V[7], output, outOff + 28);
-
- Reset();
-
- return DIGEST_LENGTH;
- }
-
-
- internal override void ProcessWord(byte[] input,
- int inOff)
- {
- uint n = Pack.BE_To_UInt32(input, inOff);
- this.inwords[this.xOff] = n;
- ++this.xOff;
-
- if (this.xOff >= 16)
- {
- ProcessBlock();
- }
- }
-
- internal override void ProcessLength(long bitLength)
- {
- if (this.xOff > (BLOCK_SIZE - 2))
- {
- // xOff == 15 --> can't fit the 64 bit length field at tail..
- this.inwords[this.xOff] = 0; // fill with zero
- ++this.xOff;
-
- ProcessBlock();
- }
- // Fill with zero words, until reach 2nd to last slot
- while (this.xOff < (BLOCK_SIZE - 2))
- {
- this.inwords[this.xOff] = 0;
- ++this.xOff;
- }
-
- // Store input data length in BITS
- this.inwords[this.xOff++] = (uint)(bitLength >> 32);
- this.inwords[this.xOff++] = (uint)(bitLength);
- }
-
- /*
-
- 3.4.2. Constants
-
-
- Tj = 79cc4519 when 0 < = j < = 15
- Tj = 7a879d8a when 16 < = j < = 63
-
- 3.4.3. Boolean function
-
-
- FFj(X;Y;Z) = X XOR Y XOR Z when 0 < = j < = 15
- = (X AND Y) OR (X AND Z) OR (Y AND Z) when 16 < = j < = 63
-
- GGj(X;Y;Z) = X XOR Y XOR Z when 0 < = j < = 15
- = (X AND Y) OR (NOT X AND Z) when 16 < = j < = 63
-
- The X, Y, Z in the fomular are words!GBP
-
- 3.4.4. Permutation function
-
-
- P0(X) = X XOR (X <<< 9) XOR (X <<< 17) ## ROLL, not SHIFT
- P1(X) = X XOR (X <<< 15) XOR (X <<< 23) ## ROLL, not SHIFT
-
- The X in the fomular are a word.
-
- ----------
-
- Each ROLL converted to Java expression:
-
- ROLL 9 : ((x << 9) | (x >> (32-9))))
- ROLL 17 : ((x << 17) | (x >> (32-17)))
- ROLL 15 : ((x << 15) | (x >> (32-15)))
- ROLL 23 : ((x << 23) | (x >> (32-23)))
-
- */
-
- private uint P0(uint x)
- {
- uint r9 = ((x << 9) | (x >> (32 - 9)));
- uint r17 = ((x << 17) | (x >> (32 - 17)));
- return (x ^ r9 ^ r17);
- }
-
- private uint P1(uint x)
- {
- uint r15 = ((x << 15) | (x >> (32 - 15)));
- uint r23 = ((x << 23) | (x >> (32 - 23)));
- return (x ^ r15 ^ r23);
- }
-
- private uint FF0(uint x, uint y, uint z)
- {
- return (x ^ y ^ z);
- }
-
- private uint FF1(uint x, uint y, uint z)
- {
- return ((x & y) | (x & z) | (y & z));
- }
-
- private uint GG0(uint x, uint y, uint z)
- {
- return (x ^ y ^ z);
- }
-
- private uint GG1(uint x, uint y, uint z)
- {
- return ((x & y) | ((~x) & z));
- }
-
-
- internal override void ProcessBlock()
- {
- for (int j = 0; j < 16; ++j)
- {
- this.W[j] = this.inwords[j];
- }
- for (int j = 16; j < 68; ++j)
- {
- uint wj3 = this.W[j - 3];
- uint r15 = ((wj3 << 15) | (wj3 >> (32 - 15)));
- uint wj13 = this.W[j - 13];
- uint r7 = ((wj13 << 7) | (wj13 >> (32 - 7)));
- this.W[j] = P1(this.W[j - 16] ^ this.W[j - 9] ^ r15) ^ r7 ^ this.W[j - 6];
- }
- for (int j = 0; j < 64; ++j)
- {
- this.W1[j] = this.W[j] ^ this.W[j + 4];
- }
-
- uint A = this.V[0];
- uint B = this.V[1];
- uint C = this.V[2];
- uint D = this.V[3];
- uint E = this.V[4];
- uint F = this.V[5];
- uint G = this.V[6];
- uint H = this.V[7];
-
-
- for (int j = 0; j < 16; ++j)
- {
- uint a12 = ((A << 12) | (A >> (32 - 12)));
- uint s1_ = a12 + E + T[j];
- uint SS1 = ((s1_ << 7) | (s1_ >> (32 - 7)));
- uint SS2 = SS1 ^ a12;
- uint TT1 = FF0(A, B, C) + D + SS2 + this.W1[j];
- uint TT2 = GG0(E, F, G) + H + SS1 + this.W[j];
- D = C;
- C = ((B << 9) | (B >> (32 - 9)));
- B = A;
- A = TT1;
- H = G;
- G = ((F << 19) | (F >> (32 - 19)));
- F = E;
- E = P0(TT2);
- }
-
- // Different FF,GG functions on rounds 16..63
- for (int j = 16; j < 64; ++j)
- {
- uint a12 = ((A << 12) | (A >> (32 - 12)));
- uint s1_ = a12 + E + T[j];
- uint SS1 = ((s1_ << 7) | (s1_ >> (32 - 7)));
- uint SS2 = SS1 ^ a12;
- uint TT1 = FF1(A, B, C) + D + SS2 + this.W1[j];
- uint TT2 = GG1(E, F, G) + H + SS1 + this.W[j];
- D = C;
- C = ((B << 9) | (B >> (32 - 9)));
- B = A;
- A = TT1;
- H = G;
- G = ((F << 19) | (F >> (32 - 19)));
- F = E;
- E = P0(TT2);
- }
-
- this.V[0] ^= A;
- this.V[1] ^= B;
- this.V[2] ^= C;
- this.V[3] ^= D;
- this.V[4] ^= E;
- this.V[5] ^= F;
- this.V[6] ^= G;
- this.V[7] ^= H;
-
- this.xOff = 0;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/digests/Sha1Digest.cs b/BCCrypto/src/crypto/digests/Sha1Digest.cs
deleted file mode 100644
index 60ec651..0000000
--- a/BCCrypto/src/crypto/digests/Sha1Digest.cs
+++ /dev/null
@@ -1,284 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
-
- /**
- * implementation of SHA-1 as outlined in "Handbook of Applied Cryptography", pages 346 - 349.
- *
- * It is interesting to ponder why the, apart from the extra IV, the other difference here from MD5
- * is the "endianness" of the word processing!
- */
- public class Sha1Digest
- : GeneralDigest
- {
- private const int DigestLength = 20;
-
- private uint H1, H2, H3, H4, H5;
-
- private uint[] X = new uint[80];
- private int xOff;
-
- public Sha1Digest()
- {
- Reset();
- }
-
- /**
- * Copy constructor. This will copy the state of the provided
- * message digest.
- */
- public Sha1Digest(Sha1Digest t)
- : base(t)
- {
- CopyIn(t);
- }
-
- private void CopyIn(Sha1Digest t)
- {
- base.CopyIn(t);
-
- H1 = t.H1;
- H2 = t.H2;
- H3 = t.H3;
- H4 = t.H4;
- H5 = t.H5;
-
- Array.Copy(t.X, 0, X, 0, t.X.Length);
- xOff = t.xOff;
- }
-
- public override string AlgorithmName
- {
- get { return "SHA-1"; }
- }
-
- public override int GetDigestSize()
- {
- return DigestLength;
- }
-
- internal override void ProcessWord(
- byte[] input,
- int inOff)
- {
- X[xOff] = Pack.BE_To_UInt32(input, inOff);
-
- if (++xOff == 16)
- {
- ProcessBlock();
- }
- }
-
- internal override void ProcessLength(long bitLength)
- {
- if (xOff > 14)
- {
- ProcessBlock();
- }
-
- X[14] = (uint)((ulong)bitLength >> 32);
- X[15] = (uint)((ulong)bitLength);
- }
-
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- Finish();
-
- Pack.UInt32_To_BE(H1, output, outOff);
- Pack.UInt32_To_BE(H2, output, outOff + 4);
- Pack.UInt32_To_BE(H3, output, outOff + 8);
- Pack.UInt32_To_BE(H4, output, outOff + 12);
- Pack.UInt32_To_BE(H5, output, outOff + 16);
-
- Reset();
-
- return DigestLength;
- }
-
- /**
- * reset the chaining variables
- */
- public override void Reset()
- {
- base.Reset();
-
- H1 = 0x67452301;
- H2 = 0xefcdab89;
- H3 = 0x98badcfe;
- H4 = 0x10325476;
- H5 = 0xc3d2e1f0;
-
- xOff = 0;
- Array.Clear(X, 0, X.Length);
- }
-
- //
- // Additive constants
- //
- private const uint Y1 = 0x5a827999;
- private const uint Y2 = 0x6ed9eba1;
- private const uint Y3 = 0x8f1bbcdc;
- private const uint Y4 = 0xca62c1d6;
-
- private static uint F(uint u, uint v, uint w)
- {
- return (u & v) | (~u & w);
- }
-
- private static uint H(uint u, uint v, uint w)
- {
- return u ^ v ^ w;
- }
-
- private static uint G(uint u, uint v, uint w)
- {
- return (u & v) | (u & w) | (v & w);
- }
-
- internal override void ProcessBlock()
- {
- //
- // expand 16 word block into 80 word block.
- //
- for (int i = 16; i < 80; i++)
- {
- uint t = X[i - 3] ^ X[i - 8] ^ X[i - 14] ^ X[i - 16];
- X[i] = t << 1 | t >> 31;
- }
-
- //
- // set up working variables.
- //
- uint A = H1;
- uint B = H2;
- uint C = H3;
- uint D = H4;
- uint E = H5;
-
- //
- // round 1
- //
- int idx = 0;
-
- for (int j = 0; j < 4; j++)
- {
- // E = rotateLeft(A, 5) + F(B, C, D) + E + X[idx++] + Y1
- // B = rotateLeft(B, 30)
- E += (A << 5 | (A >> 27)) + F(B, C, D) + X[idx++] + Y1;
- B = B << 30 | (B >> 2);
-
- D += (E << 5 | (E >> 27)) + F(A, B, C) + X[idx++] + Y1;
- A = A << 30 | (A >> 2);
-
- C += (D << 5 | (D >> 27)) + F(E, A, B) + X[idx++] + Y1;
- E = E << 30 | (E >> 2);
-
- B += (C << 5 | (C >> 27)) + F(D, E, A) + X[idx++] + Y1;
- D = D << 30 | (D >> 2);
-
- A += (B << 5 | (B >> 27)) + F(C, D, E) + X[idx++] + Y1;
- C = C << 30 | (C >> 2);
- }
-
- //
- // round 2
- //
- for (int j = 0; j < 4; j++)
- {
- // E = rotateLeft(A, 5) + H(B, C, D) + E + X[idx++] + Y2
- // B = rotateLeft(B, 30)
- E += (A << 5 | (A >> 27)) + H(B, C, D) + X[idx++] + Y2;
- B = B << 30 | (B >> 2);
-
- D += (E << 5 | (E >> 27)) + H(A, B, C) + X[idx++] + Y2;
- A = A << 30 | (A >> 2);
-
- C += (D << 5 | (D >> 27)) + H(E, A, B) + X[idx++] + Y2;
- E = E << 30 | (E >> 2);
-
- B += (C << 5 | (C >> 27)) + H(D, E, A) + X[idx++] + Y2;
- D = D << 30 | (D >> 2);
-
- A += (B << 5 | (B >> 27)) + H(C, D, E) + X[idx++] + Y2;
- C = C << 30 | (C >> 2);
- }
-
- //
- // round 3
- //
- for (int j = 0; j < 4; j++)
- {
- // E = rotateLeft(A, 5) + G(B, C, D) + E + X[idx++] + Y3
- // B = rotateLeft(B, 30)
- E += (A << 5 | (A >> 27)) + G(B, C, D) + X[idx++] + Y3;
- B = B << 30 | (B >> 2);
-
- D += (E << 5 | (E >> 27)) + G(A, B, C) + X[idx++] + Y3;
- A = A << 30 | (A >> 2);
-
- C += (D << 5 | (D >> 27)) + G(E, A, B) + X[idx++] + Y3;
- E = E << 30 | (E >> 2);
-
- B += (C << 5 | (C >> 27)) + G(D, E, A) + X[idx++] + Y3;
- D = D << 30 | (D >> 2);
-
- A += (B << 5 | (B >> 27)) + G(C, D, E) + X[idx++] + Y3;
- C = C << 30 | (C >> 2);
- }
-
- //
- // round 4
- //
- for (int j = 0; j < 4; j++)
- {
- // E = rotateLeft(A, 5) + H(B, C, D) + E + X[idx++] + Y4
- // B = rotateLeft(B, 30)
- E += (A << 5 | (A >> 27)) + H(B, C, D) + X[idx++] + Y4;
- B = B << 30 | (B >> 2);
-
- D += (E << 5 | (E >> 27)) + H(A, B, C) + X[idx++] + Y4;
- A = A << 30 | (A >> 2);
-
- C += (D << 5 | (D >> 27)) + H(E, A, B) + X[idx++] + Y4;
- E = E << 30 | (E >> 2);
-
- B += (C << 5 | (C >> 27)) + H(D, E, A) + X[idx++] + Y4;
- D = D << 30 | (D >> 2);
-
- A += (B << 5 | (B >> 27)) + H(C, D, E) + X[idx++] + Y4;
- C = C << 30 | (C >> 2);
- }
-
- H1 += A;
- H2 += B;
- H3 += C;
- H4 += D;
- H5 += E;
-
- //
- // reset start of the buffer.
- //
- xOff = 0;
- Array.Clear(X, 0, 16);
- }
-
- public override IMemoable Copy()
- {
- return new Sha1Digest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- Sha1Digest d = (Sha1Digest)other;
-
- CopyIn(d);
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/digests/Sha224Digest.cs b/BCCrypto/src/crypto/digests/Sha224Digest.cs
deleted file mode 100644
index b4e8537..0000000
--- a/BCCrypto/src/crypto/digests/Sha224Digest.cs
+++ /dev/null
@@ -1,289 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * SHA-224 as described in RFC 3874
- *
- * block word digest
- * SHA-1 512 32 160
- * SHA-224 512 32 224
- * SHA-256 512 32 256
- * SHA-384 1024 64 384
- * SHA-512 1024 64 512
- *
- */
- public class Sha224Digest
- : GeneralDigest
- {
- private const int DigestLength = 28;
-
- private uint H1, H2, H3, H4, H5, H6, H7, H8;
-
- private uint[] X = new uint[64];
- private int xOff;
-
- /**
- * Standard constructor
- */
- public Sha224Digest()
- {
- Reset();
- }
-
- /**
- * Copy constructor. This will copy the state of the provided
- * message digest.
- */
- public Sha224Digest(
- Sha224Digest t)
- : base(t)
- {
- CopyIn(t);
- }
-
- private void CopyIn(Sha224Digest t)
- {
- base.CopyIn(t);
-
- H1 = t.H1;
- H2 = t.H2;
- H3 = t.H3;
- H4 = t.H4;
- H5 = t.H5;
- H6 = t.H6;
- H7 = t.H7;
- H8 = t.H8;
-
- Array.Copy(t.X, 0, X, 0, t.X.Length);
- xOff = t.xOff;
- }
-
- public override string AlgorithmName
- {
- get { return "SHA-224"; }
- }
-
- public override int GetDigestSize()
- {
- return DigestLength;
- }
-
- internal override void ProcessWord(
- byte[] input,
- int inOff)
- {
- X[xOff] = Pack.BE_To_UInt32(input, inOff);
-
- if (++xOff == 16)
- {
- ProcessBlock();
- }
- }
-
- internal override void ProcessLength(
- long bitLength)
- {
- if (xOff > 14)
- {
- ProcessBlock();
- }
-
- X[14] = (uint)((ulong)bitLength >> 32);
- X[15] = (uint)((ulong)bitLength);
- }
-
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- Finish();
-
- Pack.UInt32_To_BE(H1, output, outOff);
- Pack.UInt32_To_BE(H2, output, outOff + 4);
- Pack.UInt32_To_BE(H3, output, outOff + 8);
- Pack.UInt32_To_BE(H4, output, outOff + 12);
- Pack.UInt32_To_BE(H5, output, outOff + 16);
- Pack.UInt32_To_BE(H6, output, outOff + 20);
- Pack.UInt32_To_BE(H7, output, outOff + 24);
-
- Reset();
-
- return DigestLength;
- }
-
- /**
- * reset the chaining variables
- */
- public override void Reset()
- {
- base.Reset();
-
- /* SHA-224 initial hash value
- */
- H1 = 0xc1059ed8;
- H2 = 0x367cd507;
- H3 = 0x3070dd17;
- H4 = 0xf70e5939;
- H5 = 0xffc00b31;
- H6 = 0x68581511;
- H7 = 0x64f98fa7;
- H8 = 0xbefa4fa4;
-
- xOff = 0;
- Array.Clear(X, 0, X.Length);
- }
-
- internal override void ProcessBlock()
- {
- //
- // expand 16 word block into 64 word blocks.
- //
- for (int ti = 16; ti <= 63; ti++)
- {
- X[ti] = Theta1(X[ti - 2]) + X[ti - 7] + Theta0(X[ti - 15]) + X[ti - 16];
- }
-
- //
- // set up working variables.
- //
- uint a = H1;
- uint b = H2;
- uint c = H3;
- uint d = H4;
- uint e = H5;
- uint f = H6;
- uint g = H7;
- uint h = H8;
-
- int t = 0;
- for(int i = 0; i < 8; i ++)
- {
- // t = 8 * i
- h += Sum1(e) + Ch(e, f, g) + K[t] + X[t];
- d += h;
- h += Sum0(a) + Maj(a, b, c);
- ++t;
-
- // t = 8 * i + 1
- g += Sum1(d) + Ch(d, e, f) + K[t] + X[t];
- c += g;
- g += Sum0(h) + Maj(h, a, b);
- ++t;
-
- // t = 8 * i + 2
- f += Sum1(c) + Ch(c, d, e) + K[t] + X[t];
- b += f;
- f += Sum0(g) + Maj(g, h, a);
- ++t;
-
- // t = 8 * i + 3
- e += Sum1(b) + Ch(b, c, d) + K[t] + X[t];
- a += e;
- e += Sum0(f) + Maj(f, g, h);
- ++t;
-
- // t = 8 * i + 4
- d += Sum1(a) + Ch(a, b, c) + K[t] + X[t];
- h += d;
- d += Sum0(e) + Maj(e, f, g);
- ++t;
-
- // t = 8 * i + 5
- c += Sum1(h) + Ch(h, a, b) + K[t] + X[t];
- g += c;
- c += Sum0(d) + Maj(d, e, f);
- ++t;
-
- // t = 8 * i + 6
- b += Sum1(g) + Ch(g, h, a) + K[t] + X[t];
- f += b;
- b += Sum0(c) + Maj(c, d, e);
- ++t;
-
- // t = 8 * i + 7
- a += Sum1(f) + Ch(f, g, h) + K[t] + X[t];
- e += a;
- a += Sum0(b) + Maj(b, c, d);
- ++t;
- }
-
- H1 += a;
- H2 += b;
- H3 += c;
- H4 += d;
- H5 += e;
- H6 += f;
- H7 += g;
- H8 += h;
-
- //
- // reset the offset and clean out the word buffer.
- //
- xOff = 0;
- Array.Clear(X, 0, 16);
- }
-
- /* SHA-224 functions */
- private static uint Ch(uint x, uint y, uint z)
- {
- return (x & y) ^ (~x & z);
- }
-
- private static uint Maj(uint x, uint y, uint z)
- {
- return (x & y) ^ (x & z) ^ (y & z);
- }
-
- private static uint Sum0(uint x)
- {
- return ((x >> 2) | (x << 30)) ^ ((x >> 13) | (x << 19)) ^ ((x >> 22) | (x << 10));
- }
-
- private static uint Sum1(uint x)
- {
- return ((x >> 6) | (x << 26)) ^ ((x >> 11) | (x << 21)) ^ ((x >> 25) | (x << 7));
- }
-
- private static uint Theta0(uint x)
- {
- return ((x >> 7) | (x << 25)) ^ ((x >> 18) | (x << 14)) ^ (x >> 3);
- }
-
- private static uint Theta1(uint x)
- {
- return ((x >> 17) | (x << 15)) ^ ((x >> 19) | (x << 13)) ^ (x >> 10);
- }
-
- /* SHA-224 Constants
- * (represent the first 32 bits of the fractional parts of the
- * cube roots of the first sixty-four prime numbers)
- */
- internal static readonly uint[] K = {
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
- 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
- 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
- 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
- 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
- 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
- 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
- 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
- };
-
- public override IMemoable Copy()
- {
- return new Sha224Digest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- Sha224Digest d = (Sha224Digest)other;
-
- CopyIn(d);
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/digests/Sha256Digest.cs b/BCCrypto/src/crypto/digests/Sha256Digest.cs
deleted file mode 100644
index 98e10a3..0000000
--- a/BCCrypto/src/crypto/digests/Sha256Digest.cs
+++ /dev/null
@@ -1,330 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * Draft FIPS 180-2 implementation of SHA-256. Note: As this is
- * based on a draft this implementation is subject to change.
- *
- *
- * block word digest
- * SHA-1 512 32 160
- * SHA-256 512 32 256
- * SHA-384 1024 64 384
- * SHA-512 1024 64 512
- *
- */
- public class Sha256Digest
- : GeneralDigest
- {
- private const int DigestLength = 32;
-
- private uint H1, H2, H3, H4, H5, H6, H7, H8;
- private uint[] X = new uint[64];
- private int xOff;
-
- public Sha256Digest()
- {
- initHs();
- }
-
- /**
- * Copy constructor. This will copy the state of the provided
- * message digest.
- */
- public Sha256Digest(Sha256Digest t) : base(t)
- {
- CopyIn(t);
- }
-
- private void CopyIn(Sha256Digest t)
- {
- base.CopyIn(t);
-
- H1 = t.H1;
- H2 = t.H2;
- H3 = t.H3;
- H4 = t.H4;
- H5 = t.H5;
- H6 = t.H6;
- H7 = t.H7;
- H8 = t.H8;
-
- Array.Copy(t.X, 0, X, 0, t.X.Length);
- xOff = t.xOff;
- }
-
- public override string AlgorithmName
- {
- get { return "SHA-256"; }
- }
-
- public override int GetDigestSize()
- {
- return DigestLength;
- }
-
- internal override void ProcessWord(
- byte[] input,
- int inOff)
- {
- X[xOff] = Pack.BE_To_UInt32(input, inOff);
-
- if (++xOff == 16)
- {
- ProcessBlock();
- }
- }
-
- internal override void ProcessLength(
- long bitLength)
- {
- if (xOff > 14)
- {
- ProcessBlock();
- }
-
- X[14] = (uint)((ulong)bitLength >> 32);
- X[15] = (uint)((ulong)bitLength);
- }
-
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- Finish();
-
- Pack.UInt32_To_BE((uint)H1, output, outOff);
- Pack.UInt32_To_BE((uint)H2, output, outOff + 4);
- Pack.UInt32_To_BE((uint)H3, output, outOff + 8);
- Pack.UInt32_To_BE((uint)H4, output, outOff + 12);
- Pack.UInt32_To_BE((uint)H5, output, outOff + 16);
- Pack.UInt32_To_BE((uint)H6, output, outOff + 20);
- Pack.UInt32_To_BE((uint)H7, output, outOff + 24);
- Pack.UInt32_To_BE((uint)H8, output, outOff + 28);
-
- Reset();
-
- return DigestLength;
- }
-
- /**
- * reset the chaining variables
- */
- public override void Reset()
- {
- base.Reset();
-
- initHs();
-
- xOff = 0;
- Array.Clear(X, 0, X.Length);
- }
-
- private void initHs()
- {
- /* SHA-256 initial hash value
- * The first 32 bits of the fractional parts of the square roots
- * of the first eight prime numbers
- */
- H1 = 0x6a09e667;
- H2 = 0xbb67ae85;
- H3 = 0x3c6ef372;
- H4 = 0xa54ff53a;
- H5 = 0x510e527f;
- H6 = 0x9b05688c;
- H7 = 0x1f83d9ab;
- H8 = 0x5be0cd19;
- }
-
- internal override void ProcessBlock()
- {
- //
- // expand 16 word block into 64 word blocks.
- //
- for (int ti = 16; ti <= 63; ti++)
- {
- X[ti] = Theta1(X[ti - 2]) + X[ti - 7] + Theta0(X[ti - 15]) + X[ti - 16];
- }
-
- //
- // set up working variables.
- //
- uint a = H1;
- uint b = H2;
- uint c = H3;
- uint d = H4;
- uint e = H5;
- uint f = H6;
- uint g = H7;
- uint h = H8;
-
- int t = 0;
- for(int i = 0; i < 8; ++i)
- {
- // t = 8 * i
- h += Sum1Ch(e, f, g) + K[t] + X[t];
- d += h;
- h += Sum0Maj(a, b, c);
- ++t;
-
- // t = 8 * i + 1
- g += Sum1Ch(d, e, f) + K[t] + X[t];
- c += g;
- g += Sum0Maj(h, a, b);
- ++t;
-
- // t = 8 * i + 2
- f += Sum1Ch(c, d, e) + K[t] + X[t];
- b += f;
- f += Sum0Maj(g, h, a);
- ++t;
-
- // t = 8 * i + 3
- e += Sum1Ch(b, c, d) + K[t] + X[t];
- a += e;
- e += Sum0Maj(f, g, h);
- ++t;
-
- // t = 8 * i + 4
- d += Sum1Ch(a, b, c) + K[t] + X[t];
- h += d;
- d += Sum0Maj(e, f, g);
- ++t;
-
- // t = 8 * i + 5
- c += Sum1Ch(h, a, b) + K[t] + X[t];
- g += c;
- c += Sum0Maj(d, e, f);
- ++t;
-
- // t = 8 * i + 6
- b += Sum1Ch(g, h, a) + K[t] + X[t];
- f += b;
- b += Sum0Maj(c, d, e);
- ++t;
-
- // t = 8 * i + 7
- a += Sum1Ch(f, g, h) + K[t] + X[t];
- e += a;
- a += Sum0Maj(b, c, d);
- ++t;
- }
-
- H1 += a;
- H2 += b;
- H3 += c;
- H4 += d;
- H5 += e;
- H6 += f;
- H7 += g;
- H8 += h;
-
- //
- // reset the offset and clean out the word buffer.
- //
- xOff = 0;
- Array.Clear(X, 0, 16);
- }
-
- private static uint Sum1Ch(
- uint x,
- uint y,
- uint z)
- {
-// return Sum1(x) + Ch(x, y, z);
- return (((x >> 6) | (x << 26)) ^ ((x >> 11) | (x << 21)) ^ ((x >> 25) | (x << 7)))
- + ((x & y) ^ ((~x) & z));
- }
-
- private static uint Sum0Maj(
- uint x,
- uint y,
- uint z)
- {
-// return Sum0(x) + Maj(x, y, z);
- return (((x >> 2) | (x << 30)) ^ ((x >> 13) | (x << 19)) ^ ((x >> 22) | (x << 10)))
- + ((x & y) ^ (x & z) ^ (y & z));
- }
-
-// /* SHA-256 functions */
-// private static uint Ch(
-// uint x,
-// uint y,
-// uint z)
-// {
-// return ((x & y) ^ ((~x) & z));
-// }
-//
-// private static uint Maj(
-// uint x,
-// uint y,
-// uint z)
-// {
-// return ((x & y) ^ (x & z) ^ (y & z));
-// }
-//
-// private static uint Sum0(
-// uint x)
-// {
-// return ((x >> 2) | (x << 30)) ^ ((x >> 13) | (x << 19)) ^ ((x >> 22) | (x << 10));
-// }
-//
-// private static uint Sum1(
-// uint x)
-// {
-// return ((x >> 6) | (x << 26)) ^ ((x >> 11) | (x << 21)) ^ ((x >> 25) | (x << 7));
-// }
-
- private static uint Theta0(
- uint x)
- {
- return ((x >> 7) | (x << 25)) ^ ((x >> 18) | (x << 14)) ^ (x >> 3);
- }
-
- private static uint Theta1(
- uint x)
- {
- return ((x >> 17) | (x << 15)) ^ ((x >> 19) | (x << 13)) ^ (x >> 10);
- }
-
- /* SHA-256 Constants
- * (represent the first 32 bits of the fractional parts of the
- * cube roots of the first sixty-four prime numbers)
- */
- private static readonly uint[] K = {
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
- 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
- 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
- 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
- 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
- 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
- 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
- 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
- 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
- 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
- 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
- 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
- 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
- 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
- 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
- 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
- };
-
- public override IMemoable Copy()
- {
- return new Sha256Digest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- Sha256Digest d = (Sha256Digest)other;
-
- CopyIn(d);
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/digests/Sha384Digest.cs b/BCCrypto/src/crypto/digests/Sha384Digest.cs
deleted file mode 100644
index e6c9a9a..0000000
--- a/BCCrypto/src/crypto/digests/Sha384Digest.cs
+++ /dev/null
@@ -1,101 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * Draft FIPS 180-2 implementation of SHA-384. Note: As this is
- * based on a draft this implementation is subject to change.
- *
- *
- * block word digest
- * SHA-1 512 32 160
- * SHA-256 512 32 256
- * SHA-384 1024 64 384
- * SHA-512 1024 64 512
- *
- */
- public class Sha384Digest
- : LongDigest
- {
- private const int DigestLength = 48;
-
- public Sha384Digest()
- {
- }
-
- /**
- * Copy constructor. This will copy the state of the provided
- * message digest.
- */
- public Sha384Digest(
- Sha384Digest t)
- : base(t)
- {
- }
-
- public override string AlgorithmName
- {
- get { return "SHA-384"; }
- }
-
- public override int GetDigestSize()
- {
- return DigestLength;
- }
-
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- Finish();
-
- Pack.UInt64_To_BE(H1, output, outOff);
- Pack.UInt64_To_BE(H2, output, outOff + 8);
- Pack.UInt64_To_BE(H3, output, outOff + 16);
- Pack.UInt64_To_BE(H4, output, outOff + 24);
- Pack.UInt64_To_BE(H5, output, outOff + 32);
- Pack.UInt64_To_BE(H6, output, outOff + 40);
-
- Reset();
-
- return DigestLength;
- }
-
- /**
- * reset the chaining variables
- */
- public override void Reset()
- {
- base.Reset();
-
- /* SHA-384 initial hash value
- * The first 64 bits of the fractional parts of the square roots
- * of the 9th through 16th prime numbers
- */
- H1 = 0xcbbb9d5dc1059ed8;
- H2 = 0x629a292a367cd507;
- H3 = 0x9159015a3070dd17;
- H4 = 0x152fecd8f70e5939;
- H5 = 0x67332667ffc00b31;
- H6 = 0x8eb44a8768581511;
- H7 = 0xdb0c2e0d64f98fa7;
- H8 = 0x47b5481dbefa4fa4;
- }
-
- public override IMemoable Copy()
- {
- return new Sha384Digest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- Sha384Digest d = (Sha384Digest)other;
-
- CopyIn(d);
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/digests/Sha512Digest.cs b/BCCrypto/src/crypto/digests/Sha512Digest.cs
deleted file mode 100644
index 2a0964f..0000000
--- a/BCCrypto/src/crypto/digests/Sha512Digest.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * Draft FIPS 180-2 implementation of SHA-512. Note: As this is
- * based on a draft this implementation is subject to change.
- *
- *
- * block word digest
- * SHA-1 512 32 160
- * SHA-256 512 32 256
- * SHA-384 1024 64 384
- * SHA-512 1024 64 512
- *
- */
- public class Sha512Digest
- : LongDigest
- {
- private const int DigestLength = 64;
-
- public Sha512Digest()
- {
- }
-
- /**
- * Copy constructor. This will copy the state of the provided
- * message digest.
- */
- public Sha512Digest(
- Sha512Digest t)
- : base(t)
- {
- }
-
- public override string AlgorithmName
- {
- get { return "SHA-512"; }
- }
-
- public override int GetDigestSize()
- {
- return DigestLength;
- }
-
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- Finish();
-
- Pack.UInt64_To_BE(H1, output, outOff);
- Pack.UInt64_To_BE(H2, output, outOff + 8);
- Pack.UInt64_To_BE(H3, output, outOff + 16);
- Pack.UInt64_To_BE(H4, output, outOff + 24);
- Pack.UInt64_To_BE(H5, output, outOff + 32);
- Pack.UInt64_To_BE(H6, output, outOff + 40);
- Pack.UInt64_To_BE(H7, output, outOff + 48);
- Pack.UInt64_To_BE(H8, output, outOff + 56);
-
- Reset();
-
- return DigestLength;
-
- }
-
- /**
- * reset the chaining variables
- */
- public override void Reset()
- {
- base.Reset();
-
- /* SHA-512 initial hash value
- * The first 64 bits of the fractional parts of the square roots
- * of the first eight prime numbers
- */
- H1 = 0x6a09e667f3bcc908;
- H2 = 0xbb67ae8584caa73b;
- H3 = 0x3c6ef372fe94f82b;
- H4 = 0xa54ff53a5f1d36f1;
- H5 = 0x510e527fade682d1;
- H6 = 0x9b05688c2b3e6c1f;
- H7 = 0x1f83d9abfb41bd6b;
- H8 = 0x5be0cd19137e2179;
- }
-
- public override IMemoable Copy()
- {
- return new Sha512Digest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- Sha512Digest d = (Sha512Digest)other;
-
- CopyIn(d);
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/digests/Sha512tDigest.cs b/BCCrypto/src/crypto/digests/Sha512tDigest.cs
deleted file mode 100644
index 2caefa7..0000000
--- a/BCCrypto/src/crypto/digests/Sha512tDigest.cs
+++ /dev/null
@@ -1,200 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * FIPS 180-4 implementation of SHA-512/t
- */
- public class Sha512tDigest
- : LongDigest
- {
- private const ulong A5 = 0xa5a5a5a5a5a5a5a5UL;
-
- private readonly int digestLength;
-
- private ulong H1t, H2t, H3t, H4t, H5t, H6t, H7t, H8t;
-
- /**
- * Standard constructor
- */
- public Sha512tDigest(int bitLength)
- {
- if (bitLength >= 512)
- throw new ArgumentException("cannot be >= 512", "bitLength");
- if (bitLength % 8 != 0)
- throw new ArgumentException("needs to be a multiple of 8", "bitLength");
- if (bitLength == 384)
- throw new ArgumentException("cannot be 384 use SHA384 instead", "bitLength");
-
- this.digestLength = bitLength / 8;
-
- tIvGenerate(digestLength * 8);
-
- Reset();
- }
-
- /**
- * Copy constructor. This will copy the state of the provided
- * message digest.
- */
- public Sha512tDigest(Sha512tDigest t)
- : base(t)
- {
- this.digestLength = t.digestLength;
-
- Reset(t);
- }
-
- public override string AlgorithmName
- {
- get { return "SHA-512/" + (digestLength * 8); }
- }
-
- public override int GetDigestSize()
- {
- return digestLength;
- }
-
- public override int DoFinal(byte[] output, int outOff)
- {
- Finish();
-
- UInt64_To_BE(H1, output, outOff, digestLength);
- UInt64_To_BE(H2, output, outOff + 8, digestLength - 8);
- UInt64_To_BE(H3, output, outOff + 16, digestLength - 16);
- UInt64_To_BE(H4, output, outOff + 24, digestLength - 24);
- UInt64_To_BE(H5, output, outOff + 32, digestLength - 32);
- UInt64_To_BE(H6, output, outOff + 40, digestLength - 40);
- UInt64_To_BE(H7, output, outOff + 48, digestLength - 48);
- UInt64_To_BE(H8, output, outOff + 56, digestLength - 56);
-
- Reset();
-
- return digestLength;
- }
-
- /**
- * reset the chaining variables
- */
- public override void Reset()
- {
- base.Reset();
-
- /*
- * initial hash values use the iv generation algorithm for t.
- */
- H1 = H1t;
- H2 = H2t;
- H3 = H3t;
- H4 = H4t;
- H5 = H5t;
- H6 = H6t;
- H7 = H7t;
- H8 = H8t;
- }
-
- private void tIvGenerate(int bitLength)
- {
- H1 = 0x6a09e667f3bcc908UL ^ A5;
- H2 = 0xbb67ae8584caa73bUL ^ A5;
- H3 = 0x3c6ef372fe94f82bUL ^ A5;
- H4 = 0xa54ff53a5f1d36f1UL ^ A5;
- H5 = 0x510e527fade682d1UL ^ A5;
- H6 = 0x9b05688c2b3e6c1fUL ^ A5;
- H7 = 0x1f83d9abfb41bd6bUL ^ A5;
- H8 = 0x5be0cd19137e2179UL ^ A5;
-
- Update(0x53);
- Update(0x48);
- Update(0x41);
- Update(0x2D);
- Update(0x35);
- Update(0x31);
- Update(0x32);
- Update(0x2F);
-
- if (bitLength > 100)
- {
- Update((byte)(bitLength / 100 + 0x30));
- bitLength = bitLength % 100;
- Update((byte)(bitLength / 10 + 0x30));
- bitLength = bitLength % 10;
- Update((byte)(bitLength + 0x30));
- }
- else if (bitLength > 10)
- {
- Update((byte)(bitLength / 10 + 0x30));
- bitLength = bitLength % 10;
- Update((byte)(bitLength + 0x30));
- }
- else
- {
- Update((byte)(bitLength + 0x30));
- }
-
- Finish();
-
- H1t = H1;
- H2t = H2;
- H3t = H3;
- H4t = H4;
- H5t = H5;
- H6t = H6;
- H7t = H7;
- H8t = H8;
- }
-
- private static void UInt64_To_BE(ulong n, byte[] bs, int off, int max)
- {
- if (max > 0)
- {
- UInt32_To_BE((uint)(n >> 32), bs, off, max);
-
- if (max > 4)
- {
- UInt32_To_BE((uint)n, bs, off + 4, max - 4);
- }
- }
- }
-
- private static void UInt32_To_BE(uint n, byte[] bs, int off, int max)
- {
- int num = System.Math.Min(4, max);
- while (--num >= 0)
- {
- int shift = 8 * (3 - num);
- bs[off + num] = (byte)(n >> shift);
- }
- }
-
- public override IMemoable Copy()
- {
- return new Sha512tDigest(this);
- }
-
- public override void Reset(IMemoable other)
- {
- Sha512tDigest t = (Sha512tDigest)other;
-
- if (this.digestLength != t.digestLength)
- {
- throw new MemoableResetException("digestLength inappropriate in other");
- }
-
- base.CopyIn(t);
-
- this.H1t = t.H1t;
- this.H2t = t.H2t;
- this.H3t = t.H3t;
- this.H4t = t.H4t;
- this.H5t = t.H5t;
- this.H6t = t.H6t;
- this.H7t = t.H7t;
- this.H8t = t.H8t;
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/digests/ShakeDigest.cs b/BCCrypto/src/crypto/digests/ShakeDigest.cs
deleted file mode 100644
index 13e8838..0000000
--- a/BCCrypto/src/crypto/digests/ShakeDigest.cs
+++ /dev/null
@@ -1,119 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- ///
- /// Implementation of SHAKE based on following KeccakNISTInterface.c from http://keccak.noekeon.org/
- ///
- ///
- /// Following the naming conventions used in the C source code to enable easy review of the implementation.
- ///
- public class ShakeDigest
- : KeccakDigest, IXof
- {
- private static int CheckBitLength(int bitLength)
- {
- switch (bitLength)
- {
- case 128:
- case 256:
- return bitLength;
- default:
- throw new ArgumentException(bitLength + " not supported for SHAKE", "bitLength");
- }
- }
-
- public ShakeDigest()
- : this(128)
- {
- }
-
- public ShakeDigest(int bitLength)
- : base(CheckBitLength(bitLength))
- {
- }
-
- public ShakeDigest(ShakeDigest source)
- : base(source)
- {
- }
-
- public override string AlgorithmName
- {
- get { return "SHAKE" + fixedOutputLength; }
- }
-
- public override int DoFinal(byte[] output, int outOff)
- {
- return DoFinal(output, outOff, GetDigestSize());
- }
-
- public virtual int DoFinal(byte[] output, int outOff, int outLen)
- {
- DoOutput(output, outOff, outLen);
-
- Reset();
-
- return outLen;
- }
-
- public virtual int DoOutput(byte[] output, int outOff, int outLen)
- {
- if (!squeezing)
- {
- AbsorbBits(0x0F, 4);
- }
-
- Squeeze(output, outOff, outLen);
-
- return outLen;
- }
-
- /*
- * TODO Possible API change to support partial-byte suffixes.
- */
- protected override int DoFinal(byte[] output, int outOff, byte partialByte, int partialBits)
- {
- return DoFinal(output, outOff, GetDigestSize(), partialByte, partialBits);
- }
-
- /*
- * TODO Possible API change to support partial-byte suffixes.
- */
- protected virtual int DoFinal(byte[] output, int outOff, int outLen, byte partialByte, int partialBits)
- {
- if (partialBits < 0 || partialBits > 7)
- throw new ArgumentException("must be in the range [0,7]", "partialBits");
-
- int finalInput = (partialByte & ((1 << partialBits) - 1)) | (0x0F << partialBits);
- Debug.Assert(finalInput >= 0);
- int finalBits = partialBits + 4;
-
- if (finalBits >= 8)
- {
- Absorb(new byte[]{ (byte)finalInput }, 0, 1);
- finalBits -= 8;
- finalInput >>= 8;
- }
-
- if (finalBits > 0)
- {
- AbsorbBits(finalInput, finalBits);
- }
-
- Squeeze(output, outOff, outLen);
-
- Reset();
-
- return outLen;
- }
-
- public override IMemoable Copy()
- {
- return new ShakeDigest(this);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/digests/ShortenedDigest.cs b/BCCrypto/src/crypto/digests/ShortenedDigest.cs
deleted file mode 100644
index 9e4d99e..0000000
--- a/BCCrypto/src/crypto/digests/ShortenedDigest.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * Wrapper class that reduces the output length of a particular digest to
- * only the first n bytes of the digest function.
- */
- public class ShortenedDigest
- : IDigest
- {
- private IDigest baseDigest;
- private int length;
-
- /**
- * Base constructor.
- *
- * @param baseDigest underlying digest to use.
- * @param length length in bytes of the output of doFinal.
- * @exception ArgumentException if baseDigest is null, or length is greater than baseDigest.GetDigestSize().
- */
- public ShortenedDigest(
- IDigest baseDigest,
- int length)
- {
- if (baseDigest == null)
- {
- throw new ArgumentNullException("baseDigest");
- }
-
- if (length > baseDigest.GetDigestSize())
- {
- throw new ArgumentException("baseDigest output not large enough to support length");
- }
-
- this.baseDigest = baseDigest;
- this.length = length;
- }
-
- public string AlgorithmName
- {
- get { return baseDigest.AlgorithmName + "(" + length * 8 + ")"; }
- }
-
- public int GetDigestSize()
- {
- return length;
- }
-
- public void Update(byte input)
- {
- baseDigest.Update(input);
- }
-
- public void BlockUpdate(byte[] input, int inOff, int length)
- {
- baseDigest.BlockUpdate(input, inOff, length);
- }
-
- public int DoFinal(byte[] output, int outOff)
- {
- byte[] tmp = new byte[baseDigest.GetDigestSize()];
-
- baseDigest.DoFinal(tmp, 0);
-
- Array.Copy(tmp, 0, output, outOff, length);
-
- return length;
- }
-
- public void Reset()
- {
- baseDigest.Reset();
- }
-
- public int GetByteLength()
- {
- return baseDigest.GetByteLength();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/digests/SkeinDigest.cs b/BCCrypto/src/crypto/digests/SkeinDigest.cs
deleted file mode 100644
index f826ce5..0000000
--- a/BCCrypto/src/crypto/digests/SkeinDigest.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
-
- ///
- /// Implementation of the Skein parameterised hash function in 256, 512 and 1024 bit block sizes,
- /// based on the Threefish tweakable block cipher.
- ///
- ///
- /// This is the 1.3 version of Skein defined in the Skein hash function submission to the NIST SHA-3
- /// competition in October 2010.
- ///
- /// Skein was designed by Niels Ferguson - Stefan Lucks - Bruce Schneier - Doug Whiting - Mihir
- /// Bellare - Tadayoshi Kohno - Jon Callas - Jesse Walker.
- ///
- ///
- ///
- public class SkeinDigest
- : IDigest, IMemoable
- {
- ///
- /// 256 bit block size - Skein-256
- ///
- public const int SKEIN_256 = SkeinEngine.SKEIN_256;
- ///
- /// 512 bit block size - Skein-512
- ///
- public const int SKEIN_512 = SkeinEngine.SKEIN_512;
- ///
- /// 1024 bit block size - Skein-1024
- ///
- public const int SKEIN_1024 = SkeinEngine.SKEIN_1024;
-
- private readonly SkeinEngine engine;
-
- ///
- /// Constructs a Skein digest with an internal state size and output size.
- ///
- /// the internal state size in bits - one of or
- /// .
- /// the output/digest size to produce in bits, which must be an integral number of
- /// bytes.
- public SkeinDigest(int stateSizeBits, int digestSizeBits)
- {
- this.engine = new SkeinEngine(stateSizeBits, digestSizeBits);
- Init(null);
- }
-
- public SkeinDigest(SkeinDigest digest)
- {
- this.engine = new SkeinEngine(digest.engine);
- }
-
- public void Reset(IMemoable other)
- {
- SkeinDigest d = (SkeinDigest)other;
- engine.Reset(d.engine);
- }
-
- public IMemoable Copy()
- {
- return new SkeinDigest(this);
- }
-
- public String AlgorithmName
- {
- get { return "Skein-" + (engine.BlockSize * 8) + "-" + (engine.OutputSize * 8); }
- }
-
- public int GetDigestSize()
- {
- return engine.OutputSize;
- }
-
- public int GetByteLength()
- {
- return engine.BlockSize;
- }
-
- ///
- /// Optionally initialises the Skein digest with the provided parameters.
- ///
- /// See for details on the parameterisation of the Skein hash function.
- /// the parameters to apply to this engine, or null to use no parameters.
- public void Init(SkeinParameters parameters)
- {
- engine.Init(parameters);
- }
-
- public void Reset()
- {
- engine.Reset();
- }
-
- public void Update(byte inByte)
- {
- engine.Update(inByte);
- }
-
- public void BlockUpdate(byte[] inBytes, int inOff, int len)
- {
- engine.Update(inBytes, inOff, len);
- }
-
- public int DoFinal(byte[] outBytes, int outOff)
- {
- return engine.DoFinal(outBytes, outOff);
- }
-
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/crypto/digests/SkeinEngine.cs b/BCCrypto/src/crypto/digests/SkeinEngine.cs
deleted file mode 100644
index cfedfad..0000000
--- a/BCCrypto/src/crypto/digests/SkeinEngine.cs
+++ /dev/null
@@ -1,804 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
-
- ///
- /// Implementation of the Skein family of parameterised hash functions in 256, 512 and 1024 bit block
- /// sizes, based on the Threefish tweakable block cipher.
- ///
- ///
- /// This is the 1.3 version of Skein defined in the Skein hash function submission to the NIST SHA-3
- /// competition in October 2010.
- ///
- /// Skein was designed by Niels Ferguson - Stefan Lucks - Bruce Schneier - Doug Whiting - Mihir
- /// Bellare - Tadayoshi Kohno - Jon Callas - Jesse Walker.
- ///
- /// This implementation is the basis for and , implementing the
- /// parameter based configuration system that allows Skein to be adapted to multiple applications.
- /// Initialising the engine with allows standard and arbitrary parameters to
- /// be applied during the Skein hash function.
- ///
- /// Implemented:
- ///
- /// 256, 512 and 1024 bit internal states.
- /// Full 96 bit input length.
- /// Parameters defined in the Skein specification, and arbitrary other pre and post message
- /// parameters.
- /// Arbitrary output size in 1 byte intervals.
- ///
- ///
- /// Not implemented:
- ///
- /// Sub-byte length input (bit padding).
- /// Tree hashing.
- ///
- ///
- ///
- public class SkeinEngine
- : IMemoable
- {
- ///
- /// 256 bit block size - Skein-256
- ///
- public const int SKEIN_256 = ThreefishEngine.BLOCKSIZE_256;
- ///
- /// 512 bit block size - Skein-512
- ///
- public const int SKEIN_512 = ThreefishEngine.BLOCKSIZE_512;
- ///
- /// 1024 bit block size - Skein-1024
- ///
- public const int SKEIN_1024 = ThreefishEngine.BLOCKSIZE_1024;
-
- // Minimal at present, but more complex when tree hashing is implemented
- private class Configuration
- {
- private byte[] bytes = new byte[32];
-
- public Configuration(long outputSizeBits)
- {
- // 0..3 = ASCII SHA3
- bytes[0] = (byte)'S';
- bytes[1] = (byte)'H';
- bytes[2] = (byte)'A';
- bytes[3] = (byte)'3';
-
- // 4..5 = version number in LSB order
- bytes[4] = 1;
- bytes[5] = 0;
-
- // 8..15 = output length
- ThreefishEngine.WordToBytes((ulong)outputSizeBits, bytes, 8);
- }
-
- public byte[] Bytes
- {
- get { return bytes; }
- }
-
- }
-
- public class Parameter
- {
- private int type;
- private byte[] value;
-
- public Parameter(int type, byte[] value)
- {
- this.type = type;
- this.value = value;
- }
-
- public int Type
- {
- get { return type; }
- }
-
- public byte[] Value
- {
- get { return value; }
- }
-
- }
-
- /**
- * The parameter type for the Skein key.
- */
- private const int PARAM_TYPE_KEY = 0;
-
- /**
- * The parameter type for the Skein configuration block.
- */
- private const int PARAM_TYPE_CONFIG = 4;
-
- /**
- * The parameter type for the message.
- */
- private const int PARAM_TYPE_MESSAGE = 48;
-
- /**
- * The parameter type for the output transformation.
- */
- private const int PARAM_TYPE_OUTPUT = 63;
-
- /**
- * Precalculated UBI(CFG) states for common state/output combinations without key or other
- * pre-message params.
- */
- private static readonly IDictionary INITIAL_STATES = Platform.CreateHashtable();
-
- static SkeinEngine()
- {
- // From Appendix C of the Skein 1.3 NIST submission
- InitialState(SKEIN_256, 128, new ulong[]{
- 0xe1111906964d7260UL,
- 0x883daaa77c8d811cUL,
- 0x10080df491960f7aUL,
- 0xccf7dde5b45bc1c2UL});
-
- InitialState(SKEIN_256, 160, new ulong[]{
- 0x1420231472825e98UL,
- 0x2ac4e9a25a77e590UL,
- 0xd47a58568838d63eUL,
- 0x2dd2e4968586ab7dUL});
-
- InitialState(SKEIN_256, 224, new ulong[]{
- 0xc6098a8c9ae5ea0bUL,
- 0x876d568608c5191cUL,
- 0x99cb88d7d7f53884UL,
- 0x384bddb1aeddb5deUL});
-
- InitialState(SKEIN_256, 256, new ulong[]{
- 0xfc9da860d048b449UL,
- 0x2fca66479fa7d833UL,
- 0xb33bc3896656840fUL,
- 0x6a54e920fde8da69UL});
-
- InitialState(SKEIN_512, 128, new ulong[]{
- 0xa8bc7bf36fbf9f52UL,
- 0x1e9872cebd1af0aaUL,
- 0x309b1790b32190d3UL,
- 0xbcfbb8543f94805cUL,
- 0x0da61bcd6e31b11bUL,
- 0x1a18ebead46a32e3UL,
- 0xa2cc5b18ce84aa82UL,
- 0x6982ab289d46982dUL});
-
- InitialState(SKEIN_512, 160, new ulong[]{
- 0x28b81a2ae013bd91UL,
- 0xc2f11668b5bdf78fUL,
- 0x1760d8f3f6a56f12UL,
- 0x4fb747588239904fUL,
- 0x21ede07f7eaf5056UL,
- 0xd908922e63ed70b8UL,
- 0xb8ec76ffeccb52faUL,
- 0x01a47bb8a3f27a6eUL});
-
- InitialState(SKEIN_512, 224, new ulong[]{
- 0xccd0616248677224UL,
- 0xcba65cf3a92339efUL,
- 0x8ccd69d652ff4b64UL,
- 0x398aed7b3ab890b4UL,
- 0x0f59d1b1457d2bd0UL,
- 0x6776fe6575d4eb3dUL,
- 0x99fbc70e997413e9UL,
- 0x9e2cfccfe1c41ef7UL});
-
- InitialState(SKEIN_512, 384, new ulong[]{
- 0xa3f6c6bf3a75ef5fUL,
- 0xb0fef9ccfd84faa4UL,
- 0x9d77dd663d770cfeUL,
- 0xd798cbf3b468fddaUL,
- 0x1bc4a6668a0e4465UL,
- 0x7ed7d434e5807407UL,
- 0x548fc1acd4ec44d6UL,
- 0x266e17546aa18ff8UL});
-
- InitialState(SKEIN_512, 512, new ulong[]{
- 0x4903adff749c51ceUL,
- 0x0d95de399746df03UL,
- 0x8fd1934127c79bceUL,
- 0x9a255629ff352cb1UL,
- 0x5db62599df6ca7b0UL,
- 0xeabe394ca9d5c3f4UL,
- 0x991112c71a75b523UL,
- 0xae18a40b660fcc33UL});
- }
-
- private static void InitialState(int blockSize, int outputSize, ulong[] state)
- {
- INITIAL_STATES.Add(VariantIdentifier(blockSize / 8, outputSize / 8), state);
- }
-
- private static int VariantIdentifier(int blockSizeBytes, int outputSizeBytes)
- {
- return (outputSizeBytes << 16) | blockSizeBytes;
- }
-
- private class UbiTweak
- {
- /**
- * Point at which position might overflow long, so switch to add with carry logic
- */
- private const ulong LOW_RANGE = UInt64.MaxValue - UInt32.MaxValue;
-
- /**
- * Bit 127 = final
- */
- private const ulong T1_FINAL = 1UL << 63;
-
- /**
- * Bit 126 = first
- */
- private const ulong T1_FIRST = 1UL << 62;
-
- /**
- * UBI uses a 128 bit tweak
- */
- private ulong[] tweak = new ulong[2];
-
- /**
- * Whether 64 bit position exceeded
- */
- private bool extendedPosition;
-
- public UbiTweak()
- {
- Reset();
- }
-
- public void Reset(UbiTweak tweak)
- {
- this.tweak = Arrays.Clone(tweak.tweak, this.tweak);
- this.extendedPosition = tweak.extendedPosition;
- }
-
- public void Reset()
- {
- tweak[0] = 0;
- tweak[1] = 0;
- extendedPosition = false;
- First = true;
- }
-
- public uint Type
- {
- get
- {
- return (uint)((tweak[1] >> 56) & 0x3FUL);
- }
-
- set
- {
- // Bits 120..125 = type
- tweak[1] = (tweak[1] & 0xFFFFFFC000000000UL) | ((value & 0x3FUL) << 56);
- }
- }
-
- public bool First
- {
- get
- {
- return ((tweak[1] & T1_FIRST) != 0);
- }
- set
- {
- if (value)
- {
- tweak[1] |= T1_FIRST;
- }
- else
- {
- tweak[1] &= ~T1_FIRST;
- }
- }
- }
-
- public bool Final
- {
- get
- {
- return ((tweak[1] & T1_FINAL) != 0);
- }
- set
- {
- if (value)
- {
- tweak[1] |= T1_FINAL;
- }
- else
- {
- tweak[1] &= ~T1_FINAL;
- }
- }
- }
-
- /**
- * Advances the position in the tweak by the specified value.
- */
- public void AdvancePosition(int advance)
- {
- // Bits 0..95 = position
- if (extendedPosition)
- {
- ulong[] parts = new ulong[3];
- parts[0] = tweak[0] & 0xFFFFFFFFUL;
- parts[1] = (tweak[0] >> 32) & 0xFFFFFFFFUL;
- parts[2] = tweak[1] & 0xFFFFFFFFUL;
-
- ulong carry = (ulong)advance;
- for (int i = 0; i < parts.Length; i++)
- {
- carry += parts[i];
- parts[i] = carry;
- carry >>= 32;
- }
- tweak[0] = ((parts[1] & 0xFFFFFFFFUL) << 32) | (parts[0] & 0xFFFFFFFFUL);
- tweak[1] = (tweak[1] & 0xFFFFFFFF00000000UL) | (parts[2] & 0xFFFFFFFFUL);
- }
- else
- {
- ulong position = tweak[0];
- position += (uint)advance;
- tweak[0] = position;
- if (position > LOW_RANGE)
- {
- extendedPosition = true;
- }
- }
- }
-
- public ulong[] GetWords()
- {
- return tweak;
- }
-
- public override string ToString()
- {
- return Type + " first: " + First + ", final: " + Final;
- }
-
- }
-
- /**
- * The Unique Block Iteration chaining mode.
- */
- // TODO: This might be better as methods...
- private class UBI
- {
- private readonly UbiTweak tweak = new UbiTweak();
-
- private readonly SkeinEngine engine;
-
- /**
- * Buffer for the current block of message data
- */
- private byte[] currentBlock;
-
- /**
- * Offset into the current message block
- */
- private int currentOffset;
-
- /**
- * Buffer for message words for feedback into encrypted block
- */
- private ulong[] message;
-
- public UBI(SkeinEngine engine, int blockSize)
- {
- this.engine = engine;
- currentBlock = new byte[blockSize];
- message = new ulong[currentBlock.Length / 8];
- }
-
- public void Reset(UBI ubi)
- {
- currentBlock = Arrays.Clone(ubi.currentBlock, currentBlock);
- currentOffset = ubi.currentOffset;
- message = Arrays.Clone(ubi.message, this.message);
- tweak.Reset(ubi.tweak);
- }
-
- public void Reset(int type)
- {
- tweak.Reset();
- tweak.Type = (uint)type;
- currentOffset = 0;
- }
-
- public void Update(byte[] value, int offset, int len, ulong[] output)
- {
- /*
- * Buffer complete blocks for the underlying Threefish cipher, only flushing when there
- * are subsequent bytes (last block must be processed in doFinal() with final=true set).
- */
- int copied = 0;
- while (len > copied)
- {
- if (currentOffset == currentBlock.Length)
- {
- ProcessBlock(output);
- tweak.First = false;
- currentOffset = 0;
- }
-
- int toCopy = System.Math.Min((len - copied), currentBlock.Length - currentOffset);
- Array.Copy(value, offset + copied, currentBlock, currentOffset, toCopy);
- copied += toCopy;
- currentOffset += toCopy;
- tweak.AdvancePosition(toCopy);
- }
- }
-
- private void ProcessBlock(ulong[] output)
- {
- engine.threefish.Init(true, engine.chain, tweak.GetWords());
- for (int i = 0; i < message.Length; i++)
- {
- message[i] = ThreefishEngine.BytesToWord(currentBlock, i * 8);
- }
-
- engine.threefish.ProcessBlock(message, output);
-
- for (int i = 0; i < output.Length; i++)
- {
- output[i] ^= message[i];
- }
- }
-
- public void DoFinal(ulong[] output)
- {
- // Pad remainder of current block with zeroes
- for (int i = currentOffset; i < currentBlock.Length; i++)
- {
- currentBlock[i] = 0;
- }
-
- tweak.Final = true;
- ProcessBlock(output);
- }
-
- }
-
- /**
- * Underlying Threefish tweakable block cipher
- */
- private readonly ThreefishEngine threefish;
-
- /**
- * Size of the digest output, in bytes
- */
- private readonly int outputSizeBytes;
-
- /**
- * The current chaining/state value
- */
- private ulong[] chain;
-
- /**
- * The initial state value
- */
- private ulong[] initialState;
-
- /**
- * The (optional) key parameter
- */
- private byte[] key;
-
- /**
- * Parameters to apply prior to the message
- */
- private Parameter[] preMessageParameters;
-
- /**
- * Parameters to apply after the message, but prior to output
- */
- private Parameter[] postMessageParameters;
-
- /**
- * The current UBI operation
- */
- private readonly UBI ubi;
-
- /**
- * Buffer for single byte update method
- */
- private readonly byte[] singleByte = new byte[1];
-
- ///
- /// Constructs a Skein digest with an internal state size and output size.
- ///
- /// the internal state size in bits - one of or
- /// .
- /// the output/digest size to produce in bits, which must be an integral number of
- /// bytes.
- public SkeinEngine(int blockSizeBits, int outputSizeBits)
- {
- if (outputSizeBits % 8 != 0)
- {
- throw new ArgumentException("Output size must be a multiple of 8 bits. :" + outputSizeBits);
- }
- // TODO: Prevent digest sizes > block size?
- this.outputSizeBytes = outputSizeBits / 8;
-
- this.threefish = new ThreefishEngine(blockSizeBits);
- this.ubi = new UBI(this,threefish.GetBlockSize());
- }
-
- ///
- /// Creates a SkeinEngine as an exact copy of an existing instance.
- ///
- public SkeinEngine(SkeinEngine engine)
- : this(engine.BlockSize * 8, engine.OutputSize * 8)
- {
- CopyIn(engine);
- }
-
- private void CopyIn(SkeinEngine engine)
- {
- this.ubi.Reset(engine.ubi);
- this.chain = Arrays.Clone(engine.chain, this.chain);
- this.initialState = Arrays.Clone(engine.initialState, this.initialState);
- this.key = Arrays.Clone(engine.key, this.key);
- this.preMessageParameters = Clone(engine.preMessageParameters, this.preMessageParameters);
- this.postMessageParameters = Clone(engine.postMessageParameters, this.postMessageParameters);
- }
-
- private static Parameter[] Clone(Parameter[] data, Parameter[] existing)
- {
- if (data == null)
- {
- return null;
- }
- if ((existing == null) || (existing.Length != data.Length))
- {
- existing = new Parameter[data.Length];
- }
- Array.Copy(data, 0, existing, 0, existing.Length);
- return existing;
- }
-
- public IMemoable Copy()
- {
- return new SkeinEngine(this);
- }
-
- public void Reset(IMemoable other)
- {
- SkeinEngine s = (SkeinEngine)other;
- if ((BlockSize != s.BlockSize) || (outputSizeBytes != s.outputSizeBytes))
- {
- throw new MemoableResetException("Incompatible parameters in provided SkeinEngine.");
- }
- CopyIn(s);
- }
-
- public int OutputSize
- {
- get { return outputSizeBytes; }
- }
-
- public int BlockSize
- {
- get { return threefish.GetBlockSize (); }
- }
-
- ///
- /// Initialises the Skein engine with the provided parameters. See for
- /// details on the parameterisation of the Skein hash function.
- ///
- /// the parameters to apply to this engine, or null to use no parameters.
- public void Init(SkeinParameters parameters)
- {
- this.chain = null;
- this.key = null;
- this.preMessageParameters = null;
- this.postMessageParameters = null;
-
- if (parameters != null)
- {
- byte[] key = parameters.GetKey();
- if (key.Length < 16)
- {
- throw new ArgumentException("Skein key must be at least 128 bits.");
- }
- InitParams(parameters.GetParameters());
- }
- CreateInitialState();
-
- // Initialise message block
- UbiInit(PARAM_TYPE_MESSAGE);
- }
-
- private void InitParams(IDictionary parameters)
- {
- IEnumerator keys = parameters.Keys.GetEnumerator();
- IList pre = Platform.CreateArrayList();
- IList post = Platform.CreateArrayList();
-
- while (keys.MoveNext())
- {
- int type = (int)keys.Current;
- byte[] value = (byte[])parameters[type];
-
- if (type == PARAM_TYPE_KEY)
- {
- this.key = value;
- }
- else if (type < PARAM_TYPE_MESSAGE)
- {
- pre.Add(new Parameter(type, value));
- }
- else
- {
- post.Add(new Parameter(type, value));
- }
- }
- preMessageParameters = new Parameter[pre.Count];
- pre.CopyTo(preMessageParameters, 0);
- Array.Sort(preMessageParameters);
-
- postMessageParameters = new Parameter[post.Count];
- post.CopyTo(postMessageParameters, 0);
- Array.Sort(postMessageParameters);
- }
-
- /**
- * Calculate the initial (pre message block) chaining state.
- */
- private void CreateInitialState()
- {
- ulong[] precalc = (ulong[])INITIAL_STATES[VariantIdentifier(BlockSize, OutputSize)];
- if ((key == null) && (precalc != null))
- {
- // Precalculated UBI(CFG)
- chain = Arrays.Clone(precalc);
- }
- else
- {
- // Blank initial state
- chain = new ulong[BlockSize / 8];
-
- // Process key block
- if (key != null)
- {
- UbiComplete(SkeinParameters.PARAM_TYPE_KEY, key);
- }
-
- // Process configuration block
- UbiComplete(PARAM_TYPE_CONFIG, new Configuration(outputSizeBytes * 8).Bytes);
- }
-
- // Process additional pre-message parameters
- if (preMessageParameters != null)
- {
- for (int i = 0; i < preMessageParameters.Length; i++)
- {
- Parameter param = preMessageParameters[i];
- UbiComplete(param.Type, param.Value);
- }
- }
- initialState = Arrays.Clone(chain);
- }
-
- ///
- /// Reset the engine to the initial state (with the key and any pre-message parameters , ready to
- /// accept message input.
- ///
- public void Reset()
- {
- Array.Copy(initialState, 0, chain, 0, chain.Length);
-
- UbiInit(PARAM_TYPE_MESSAGE);
- }
-
- private void UbiComplete(int type, byte[] value)
- {
- UbiInit(type);
- this.ubi.Update(value, 0, value.Length, chain);
- UbiFinal();
- }
-
- private void UbiInit(int type)
- {
- this.ubi.Reset(type);
- }
-
- private void UbiFinal()
- {
- ubi.DoFinal(chain);
- }
-
- private void CheckInitialised()
- {
- if (this.ubi == null)
- {
- throw new ArgumentException("Skein engine is not initialised.");
- }
- }
-
- public void Update(byte inByte)
- {
- singleByte[0] = inByte;
- Update(singleByte, 0, 1);
- }
-
- public void Update(byte[] inBytes, int inOff, int len)
- {
- CheckInitialised();
- ubi.Update(inBytes, inOff, len, chain);
- }
-
- public int DoFinal(byte[] outBytes, int outOff)
- {
- CheckInitialised();
- if (outBytes.Length < (outOff + outputSizeBytes))
- {
- throw new DataLengthException("Output buffer is too short to hold output");
- }
-
- // Finalise message block
- UbiFinal();
-
- // Process additional post-message parameters
- if (postMessageParameters != null)
- {
- for (int i = 0; i < postMessageParameters.Length; i++)
- {
- Parameter param = postMessageParameters[i];
- UbiComplete(param.Type, param.Value);
- }
- }
-
- // Perform the output transform
- int blockSize = BlockSize;
- int blocksRequired = ((outputSizeBytes + blockSize - 1) / blockSize);
- for (int i = 0; i < blocksRequired; i++)
- {
- int toWrite = System.Math.Min(blockSize, outputSizeBytes - (i * blockSize));
- Output((ulong)i, outBytes, outOff + (i * blockSize), toWrite);
- }
-
- Reset();
-
- return outputSizeBytes;
- }
-
- private void Output(ulong outputSequence, byte[] outBytes, int outOff, int outputBytes)
- {
- byte[] currentBytes = new byte[8];
- ThreefishEngine.WordToBytes(outputSequence, currentBytes, 0);
-
- // Output is a sequence of UBI invocations all of which use and preserve the pre-output
- // state
- ulong[] outputWords = new ulong[chain.Length];
- UbiInit(PARAM_TYPE_OUTPUT);
- this.ubi.Update(currentBytes, 0, currentBytes.Length, outputWords);
- ubi.DoFinal(outputWords);
-
- int wordsRequired = ((outputBytes + 8 - 1) / 8);
- for (int i = 0; i < wordsRequired; i++)
- {
- int toWrite = System.Math.Min(8, outputBytes - (i * 8));
- if (toWrite == 8)
- {
- ThreefishEngine.WordToBytes(outputWords[i], outBytes, outOff + (i * 8));
- }
- else
- {
- ThreefishEngine.WordToBytes(outputWords[i], currentBytes, 0);
- Array.Copy(currentBytes, 0, outBytes, outOff + (i * 8), toWrite);
- }
- }
- }
-
- }
-}
-
diff --git a/BCCrypto/src/crypto/digests/TigerDigest.cs b/BCCrypto/src/crypto/digests/TigerDigest.cs
deleted file mode 100644
index 059232d..0000000
--- a/BCCrypto/src/crypto/digests/TigerDigest.cs
+++ /dev/null
@@ -1,883 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * implementation of Tiger based on:
- *
- * http://www.cs.technion.ac.il/~biham/Reports/Tiger
- */
- public class TigerDigest
- : IDigest, IMemoable
- {
- private const int MyByteLength = 64;
-
- /*
- * S-Boxes.
- */
- private static readonly long[] t1 = {
- unchecked((long) 0x02AAB17CF7E90C5EL) /* 0 */, unchecked((long) 0xAC424B03E243A8ECL) /* 1 */,
- unchecked((long) 0x72CD5BE30DD5FCD3L) /* 2 */, unchecked((long) 0x6D019B93F6F97F3AL) /* 3 */,
- unchecked((long) 0xCD9978FFD21F9193L) /* 4 */, unchecked((long) 0x7573A1C9708029E2L) /* 5 */,
- unchecked((long) 0xB164326B922A83C3L) /* 6 */, unchecked((long) 0x46883EEE04915870L) /* 7 */,
- unchecked((long) 0xEAACE3057103ECE6L) /* 8 */, unchecked((long) 0xC54169B808A3535CL) /* 9 */,
- unchecked((long) 0x4CE754918DDEC47CL) /* 10 */, unchecked((long) 0x0AA2F4DFDC0DF40CL) /* 11 */,
- unchecked((long) 0x10B76F18A74DBEFAL) /* 12 */, unchecked((long) 0xC6CCB6235AD1AB6AL) /* 13 */,
- unchecked((long) 0x13726121572FE2FFL) /* 14 */, unchecked((long) 0x1A488C6F199D921EL) /* 15 */,
- unchecked((long) 0x4BC9F9F4DA0007CAL) /* 16 */, unchecked((long) 0x26F5E6F6E85241C7L) /* 17 */,
- unchecked((long) 0x859079DBEA5947B6L) /* 18 */, unchecked((long) 0x4F1885C5C99E8C92L) /* 19 */,
- unchecked((long) 0xD78E761EA96F864BL) /* 20 */, unchecked((long) 0x8E36428C52B5C17DL) /* 21 */,
- unchecked((long) 0x69CF6827373063C1L) /* 22 */, unchecked((long) 0xB607C93D9BB4C56EL) /* 23 */,
- unchecked((long) 0x7D820E760E76B5EAL) /* 24 */, unchecked((long) 0x645C9CC6F07FDC42L) /* 25 */,
- unchecked((long) 0xBF38A078243342E0L) /* 26 */, unchecked((long) 0x5F6B343C9D2E7D04L) /* 27 */,
- unchecked((long) 0xF2C28AEB600B0EC6L) /* 28 */, unchecked((long) 0x6C0ED85F7254BCACL) /* 29 */,
- unchecked((long) 0x71592281A4DB4FE5L) /* 30 */, unchecked((long) 0x1967FA69CE0FED9FL) /* 31 */,
- unchecked((long) 0xFD5293F8B96545DBL) /* 32 */, unchecked((long) 0xC879E9D7F2A7600BL) /* 33 */,
- unchecked((long) 0x860248920193194EL) /* 34 */, unchecked((long) 0xA4F9533B2D9CC0B3L) /* 35 */,
- unchecked((long) 0x9053836C15957613L) /* 36 */, unchecked((long) 0xDB6DCF8AFC357BF1L) /* 37 */,
- unchecked((long) 0x18BEEA7A7A370F57L) /* 38 */, unchecked((long) 0x037117CA50B99066L) /* 39 */,
- unchecked((long) 0x6AB30A9774424A35L) /* 40 */, unchecked((long) 0xF4E92F02E325249BL) /* 41 */,
- unchecked((long) 0x7739DB07061CCAE1L) /* 42 */, unchecked((long) 0xD8F3B49CECA42A05L) /* 43 */,
- unchecked((long) 0xBD56BE3F51382F73L) /* 44 */, unchecked((long) 0x45FAED5843B0BB28L) /* 45 */,
- unchecked((long) 0x1C813D5C11BF1F83L) /* 46 */, unchecked((long) 0x8AF0E4B6D75FA169L) /* 47 */,
- unchecked((long) 0x33EE18A487AD9999L) /* 48 */, unchecked((long) 0x3C26E8EAB1C94410L) /* 49 */,
- unchecked((long) 0xB510102BC0A822F9L) /* 50 */, unchecked((long) 0x141EEF310CE6123BL) /* 51 */,
- unchecked((long) 0xFC65B90059DDB154L) /* 52 */, unchecked((long) 0xE0158640C5E0E607L) /* 53 */,
- unchecked((long) 0x884E079826C3A3CFL) /* 54 */, unchecked((long) 0x930D0D9523C535FDL) /* 55 */,
- unchecked((long) 0x35638D754E9A2B00L) /* 56 */, unchecked((long) 0x4085FCCF40469DD5L) /* 57 */,
- unchecked((long) 0xC4B17AD28BE23A4CL) /* 58 */, unchecked((long) 0xCAB2F0FC6A3E6A2EL) /* 59 */,
- unchecked((long) 0x2860971A6B943FCDL) /* 60 */, unchecked((long) 0x3DDE6EE212E30446L) /* 61 */,
- unchecked((long) 0x6222F32AE01765AEL) /* 62 */, unchecked((long) 0x5D550BB5478308FEL) /* 63 */,
- unchecked((long) 0xA9EFA98DA0EDA22AL) /* 64 */, unchecked((long) 0xC351A71686C40DA7L) /* 65 */,
- unchecked((long) 0x1105586D9C867C84L) /* 66 */, unchecked((long) 0xDCFFEE85FDA22853L) /* 67 */,
- unchecked((long) 0xCCFBD0262C5EEF76L) /* 68 */, unchecked((long) 0xBAF294CB8990D201L) /* 69 */,
- unchecked((long) 0xE69464F52AFAD975L) /* 70 */, unchecked((long) 0x94B013AFDF133E14L) /* 71 */,
- unchecked((long) 0x06A7D1A32823C958L) /* 72 */, unchecked((long) 0x6F95FE5130F61119L) /* 73 */,
- unchecked((long) 0xD92AB34E462C06C0L) /* 74 */, unchecked((long) 0xED7BDE33887C71D2L) /* 75 */,
- unchecked((long) 0x79746D6E6518393EL) /* 76 */, unchecked((long) 0x5BA419385D713329L) /* 77 */,
- unchecked((long) 0x7C1BA6B948A97564L) /* 78 */, unchecked((long) 0x31987C197BFDAC67L) /* 79 */,
- unchecked((long) 0xDE6C23C44B053D02L) /* 80 */, unchecked((long) 0x581C49FED002D64DL) /* 81 */,
- unchecked((long) 0xDD474D6338261571L) /* 82 */, unchecked((long) 0xAA4546C3E473D062L) /* 83 */,
- unchecked((long) 0x928FCE349455F860L) /* 84 */, unchecked((long) 0x48161BBACAAB94D9L) /* 85 */,
- unchecked((long) 0x63912430770E6F68L) /* 86 */, unchecked((long) 0x6EC8A5E602C6641CL) /* 87 */,
- unchecked((long) 0x87282515337DDD2BL) /* 88 */, unchecked((long) 0x2CDA6B42034B701BL) /* 89 */,
- unchecked((long) 0xB03D37C181CB096DL) /* 90 */, unchecked((long) 0xE108438266C71C6FL) /* 91 */,
- unchecked((long) 0x2B3180C7EB51B255L) /* 92 */, unchecked((long) 0xDF92B82F96C08BBCL) /* 93 */,
- unchecked((long) 0x5C68C8C0A632F3BAL) /* 94 */, unchecked((long) 0x5504CC861C3D0556L) /* 95 */,
- unchecked((long) 0xABBFA4E55FB26B8FL) /* 96 */, unchecked((long) 0x41848B0AB3BACEB4L) /* 97 */,
- unchecked((long) 0xB334A273AA445D32L) /* 98 */, unchecked((long) 0xBCA696F0A85AD881L) /* 99 */,
- unchecked((long) 0x24F6EC65B528D56CL) /* 100 */, unchecked((long) 0x0CE1512E90F4524AL) /* 101 */,
- unchecked((long) 0x4E9DD79D5506D35AL) /* 102 */, unchecked((long) 0x258905FAC6CE9779L) /* 103 */,
- unchecked((long) 0x2019295B3E109B33L) /* 104 */, unchecked((long) 0xF8A9478B73A054CCL) /* 105 */,
- unchecked((long) 0x2924F2F934417EB0L) /* 106 */, unchecked((long) 0x3993357D536D1BC4L) /* 107 */,
- unchecked((long) 0x38A81AC21DB6FF8BL) /* 108 */, unchecked((long) 0x47C4FBF17D6016BFL) /* 109 */,
- unchecked((long) 0x1E0FAADD7667E3F5L) /* 110 */, unchecked((long) 0x7ABCFF62938BEB96L) /* 111 */,
- unchecked((long) 0xA78DAD948FC179C9L) /* 112 */, unchecked((long) 0x8F1F98B72911E50DL) /* 113 */,
- unchecked((long) 0x61E48EAE27121A91L) /* 114 */, unchecked((long) 0x4D62F7AD31859808L) /* 115 */,
- unchecked((long) 0xECEBA345EF5CEAEBL) /* 116 */, unchecked((long) 0xF5CEB25EBC9684CEL) /* 117 */,
- unchecked((long) 0xF633E20CB7F76221L) /* 118 */, unchecked((long) 0xA32CDF06AB8293E4L) /* 119 */,
- unchecked((long) 0x985A202CA5EE2CA4L) /* 120 */, unchecked((long) 0xCF0B8447CC8A8FB1L) /* 121 */,
- unchecked((long) 0x9F765244979859A3L) /* 122 */, unchecked((long) 0xA8D516B1A1240017L) /* 123 */,
- unchecked((long) 0x0BD7BA3EBB5DC726L) /* 124 */, unchecked((long) 0xE54BCA55B86ADB39L) /* 125 */,
- unchecked((long) 0x1D7A3AFD6C478063L) /* 126 */, unchecked((long) 0x519EC608E7669EDDL) /* 127 */,
- unchecked((long) 0x0E5715A2D149AA23L) /* 128 */, unchecked((long) 0x177D4571848FF194L) /* 129 */,
- unchecked((long) 0xEEB55F3241014C22L) /* 130 */, unchecked((long) 0x0F5E5CA13A6E2EC2L) /* 131 */,
- unchecked((long) 0x8029927B75F5C361L) /* 132 */, unchecked((long) 0xAD139FABC3D6E436L) /* 133 */,
- unchecked((long) 0x0D5DF1A94CCF402FL) /* 134 */, unchecked((long) 0x3E8BD948BEA5DFC8L) /* 135 */,
- unchecked((long) 0xA5A0D357BD3FF77EL) /* 136 */, unchecked((long) 0xA2D12E251F74F645L) /* 137 */,
- unchecked((long) 0x66FD9E525E81A082L) /* 138 */, unchecked((long) 0x2E0C90CE7F687A49L) /* 139 */,
- unchecked((long) 0xC2E8BCBEBA973BC5L) /* 140 */, unchecked((long) 0x000001BCE509745FL) /* 141 */,
- unchecked((long) 0x423777BBE6DAB3D6L) /* 142 */, unchecked((long) 0xD1661C7EAEF06EB5L) /* 143 */,
- unchecked((long) 0xA1781F354DAACFD8L) /* 144 */, unchecked((long) 0x2D11284A2B16AFFCL) /* 145 */,
- unchecked((long) 0xF1FC4F67FA891D1FL) /* 146 */, unchecked((long) 0x73ECC25DCB920ADAL) /* 147 */,
- unchecked((long) 0xAE610C22C2A12651L) /* 148 */, unchecked((long) 0x96E0A810D356B78AL) /* 149 */,
- unchecked((long) 0x5A9A381F2FE7870FL) /* 150 */, unchecked((long) 0xD5AD62EDE94E5530L) /* 151 */,
- unchecked((long) 0xD225E5E8368D1427L) /* 152 */, unchecked((long) 0x65977B70C7AF4631L) /* 153 */,
- unchecked((long) 0x99F889B2DE39D74FL) /* 154 */, unchecked((long) 0x233F30BF54E1D143L) /* 155 */,
- unchecked((long) 0x9A9675D3D9A63C97L) /* 156 */, unchecked((long) 0x5470554FF334F9A8L) /* 157 */,
- unchecked((long) 0x166ACB744A4F5688L) /* 158 */, unchecked((long) 0x70C74CAAB2E4AEADL) /* 159 */,
- unchecked((long) 0xF0D091646F294D12L) /* 160 */, unchecked((long) 0x57B82A89684031D1L) /* 161 */,
- unchecked((long) 0xEFD95A5A61BE0B6BL) /* 162 */, unchecked((long) 0x2FBD12E969F2F29AL) /* 163 */,
- unchecked((long) 0x9BD37013FEFF9FE8L) /* 164 */, unchecked((long) 0x3F9B0404D6085A06L) /* 165 */,
- unchecked((long) 0x4940C1F3166CFE15L) /* 166 */, unchecked((long) 0x09542C4DCDF3DEFBL) /* 167 */,
- unchecked((long) 0xB4C5218385CD5CE3L) /* 168 */, unchecked((long) 0xC935B7DC4462A641L) /* 169 */,
- unchecked((long) 0x3417F8A68ED3B63FL) /* 170 */, unchecked((long) 0xB80959295B215B40L) /* 171 */,
- unchecked((long) 0xF99CDAEF3B8C8572L) /* 172 */, unchecked((long) 0x018C0614F8FCB95DL) /* 173 */,
- unchecked((long) 0x1B14ACCD1A3ACDF3L) /* 174 */, unchecked((long) 0x84D471F200BB732DL) /* 175 */,
- unchecked((long) 0xC1A3110E95E8DA16L) /* 176 */, unchecked((long) 0x430A7220BF1A82B8L) /* 177 */,
- unchecked((long) 0xB77E090D39DF210EL) /* 178 */, unchecked((long) 0x5EF4BD9F3CD05E9DL) /* 179 */,
- unchecked((long) 0x9D4FF6DA7E57A444L) /* 180 */, unchecked((long) 0xDA1D60E183D4A5F8L) /* 181 */,
- unchecked((long) 0xB287C38417998E47L) /* 182 */, unchecked((long) 0xFE3EDC121BB31886L) /* 183 */,
- unchecked((long) 0xC7FE3CCC980CCBEFL) /* 184 */, unchecked((long) 0xE46FB590189BFD03L) /* 185 */,
- unchecked((long) 0x3732FD469A4C57DCL) /* 186 */, unchecked((long) 0x7EF700A07CF1AD65L) /* 187 */,
- unchecked((long) 0x59C64468A31D8859L) /* 188 */, unchecked((long) 0x762FB0B4D45B61F6L) /* 189 */,
- unchecked((long) 0x155BAED099047718L) /* 190 */, unchecked((long) 0x68755E4C3D50BAA6L) /* 191 */,
- unchecked((long) 0xE9214E7F22D8B4DFL) /* 192 */, unchecked((long) 0x2ADDBF532EAC95F4L) /* 193 */,
- unchecked((long) 0x32AE3909B4BD0109L) /* 194 */, unchecked((long) 0x834DF537B08E3450L) /* 195 */,
- unchecked((long) 0xFA209DA84220728DL) /* 196 */, unchecked((long) 0x9E691D9B9EFE23F7L) /* 197 */,
- unchecked((long) 0x0446D288C4AE8D7FL) /* 198 */, unchecked((long) 0x7B4CC524E169785BL) /* 199 */,
- unchecked((long) 0x21D87F0135CA1385L) /* 200 */, unchecked((long) 0xCEBB400F137B8AA5L) /* 201 */,
- unchecked((long) 0x272E2B66580796BEL) /* 202 */, unchecked((long) 0x3612264125C2B0DEL) /* 203 */,
- unchecked((long) 0x057702BDAD1EFBB2L) /* 204 */, unchecked((long) 0xD4BABB8EACF84BE9L) /* 205 */,
- unchecked((long) 0x91583139641BC67BL) /* 206 */, unchecked((long) 0x8BDC2DE08036E024L) /* 207 */,
- unchecked((long) 0x603C8156F49F68EDL) /* 208 */, unchecked((long) 0xF7D236F7DBEF5111L) /* 209 */,
- unchecked((long) 0x9727C4598AD21E80L) /* 210 */, unchecked((long) 0xA08A0896670A5FD7L) /* 211 */,
- unchecked((long) 0xCB4A8F4309EBA9CBL) /* 212 */, unchecked((long) 0x81AF564B0F7036A1L) /* 213 */,
- unchecked((long) 0xC0B99AA778199ABDL) /* 214 */, unchecked((long) 0x959F1EC83FC8E952L) /* 215 */,
- unchecked((long) 0x8C505077794A81B9L) /* 216 */, unchecked((long) 0x3ACAAF8F056338F0L) /* 217 */,
- unchecked((long) 0x07B43F50627A6778L) /* 218 */, unchecked((long) 0x4A44AB49F5ECCC77L) /* 219 */,
- unchecked((long) 0x3BC3D6E4B679EE98L) /* 220 */, unchecked((long) 0x9CC0D4D1CF14108CL) /* 221 */,
- unchecked((long) 0x4406C00B206BC8A0L) /* 222 */, unchecked((long) 0x82A18854C8D72D89L) /* 223 */,
- unchecked((long) 0x67E366B35C3C432CL) /* 224 */, unchecked((long) 0xB923DD61102B37F2L) /* 225 */,
- unchecked((long) 0x56AB2779D884271DL) /* 226 */, unchecked((long) 0xBE83E1B0FF1525AFL) /* 227 */,
- unchecked((long) 0xFB7C65D4217E49A9L) /* 228 */, unchecked((long) 0x6BDBE0E76D48E7D4L) /* 229 */,
- unchecked((long) 0x08DF828745D9179EL) /* 230 */, unchecked((long) 0x22EA6A9ADD53BD34L) /* 231 */,
- unchecked((long) 0xE36E141C5622200AL) /* 232 */, unchecked((long) 0x7F805D1B8CB750EEL) /* 233 */,
- unchecked((long) 0xAFE5C7A59F58E837L) /* 234 */, unchecked((long) 0xE27F996A4FB1C23CL) /* 235 */,
- unchecked((long) 0xD3867DFB0775F0D0L) /* 236 */, unchecked((long) 0xD0E673DE6E88891AL) /* 237 */,
- unchecked((long) 0x123AEB9EAFB86C25L) /* 238 */, unchecked((long) 0x30F1D5D5C145B895L) /* 239 */,
- unchecked((long) 0xBB434A2DEE7269E7L) /* 240 */, unchecked((long) 0x78CB67ECF931FA38L) /* 241 */,
- unchecked((long) 0xF33B0372323BBF9CL) /* 242 */, unchecked((long) 0x52D66336FB279C74L) /* 243 */,
- unchecked((long) 0x505F33AC0AFB4EAAL) /* 244 */, unchecked((long) 0xE8A5CD99A2CCE187L) /* 245 */,
- unchecked((long) 0x534974801E2D30BBL) /* 246 */, unchecked((long) 0x8D2D5711D5876D90L) /* 247 */,
- unchecked((long) 0x1F1A412891BC038EL) /* 248 */, unchecked((long) 0xD6E2E71D82E56648L) /* 249 */,
- unchecked((long) 0x74036C3A497732B7L) /* 250 */, unchecked((long) 0x89B67ED96361F5ABL) /* 251 */,
- unchecked((long) 0xFFED95D8F1EA02A2L) /* 252 */, unchecked((long) 0xE72B3BD61464D43DL) /* 253 */,
- unchecked((long) 0xA6300F170BDC4820L) /* 254 */, unchecked((long) 0xEBC18760ED78A77AL) /* 255 */,
- };
-
- private static readonly long[] t2 = {
- unchecked((long) 0xE6A6BE5A05A12138L) /* 256 */, unchecked((long) 0xB5A122A5B4F87C98L) /* 257 */,
- unchecked((long) 0x563C6089140B6990L) /* 258 */, unchecked((long) 0x4C46CB2E391F5DD5L) /* 259 */,
- unchecked((long) 0xD932ADDBC9B79434L) /* 260 */, unchecked((long) 0x08EA70E42015AFF5L) /* 261 */,
- unchecked((long) 0xD765A6673E478CF1L) /* 262 */, unchecked((long) 0xC4FB757EAB278D99L) /* 263 */,
- unchecked((long) 0xDF11C6862D6E0692L) /* 264 */, unchecked((long) 0xDDEB84F10D7F3B16L) /* 265 */,
- unchecked((long) 0x6F2EF604A665EA04L) /* 266 */, unchecked((long) 0x4A8E0F0FF0E0DFB3L) /* 267 */,
- unchecked((long) 0xA5EDEEF83DBCBA51L) /* 268 */, unchecked((long) 0xFC4F0A2A0EA4371EL) /* 269 */,
- unchecked((long) 0xE83E1DA85CB38429L) /* 270 */, unchecked((long) 0xDC8FF882BA1B1CE2L) /* 271 */,
- unchecked((long) 0xCD45505E8353E80DL) /* 272 */, unchecked((long) 0x18D19A00D4DB0717L) /* 273 */,
- unchecked((long) 0x34A0CFEDA5F38101L) /* 274 */, unchecked((long) 0x0BE77E518887CAF2L) /* 275 */,
- unchecked((long) 0x1E341438B3C45136L) /* 276 */, unchecked((long) 0xE05797F49089CCF9L) /* 277 */,
- unchecked((long) 0xFFD23F9DF2591D14L) /* 278 */, unchecked((long) 0x543DDA228595C5CDL) /* 279 */,
- unchecked((long) 0x661F81FD99052A33L) /* 280 */, unchecked((long) 0x8736E641DB0F7B76L) /* 281 */,
- unchecked((long) 0x15227725418E5307L) /* 282 */, unchecked((long) 0xE25F7F46162EB2FAL) /* 283 */,
- unchecked((long) 0x48A8B2126C13D9FEL) /* 284 */, unchecked((long) 0xAFDC541792E76EEAL) /* 285 */,
- unchecked((long) 0x03D912BFC6D1898FL) /* 286 */, unchecked((long) 0x31B1AAFA1B83F51BL) /* 287 */,
- unchecked((long) 0xF1AC2796E42AB7D9L) /* 288 */, unchecked((long) 0x40A3A7D7FCD2EBACL) /* 289 */,
- unchecked((long) 0x1056136D0AFBBCC5L) /* 290 */, unchecked((long) 0x7889E1DD9A6D0C85L) /* 291 */,
- unchecked((long) 0xD33525782A7974AAL) /* 292 */, unchecked((long) 0xA7E25D09078AC09BL) /* 293 */,
- unchecked((long) 0xBD4138B3EAC6EDD0L) /* 294 */, unchecked((long) 0x920ABFBE71EB9E70L) /* 295 */,
- unchecked((long) 0xA2A5D0F54FC2625CL) /* 296 */, unchecked((long) 0xC054E36B0B1290A3L) /* 297 */,
- unchecked((long) 0xF6DD59FF62FE932BL) /* 298 */, unchecked((long) 0x3537354511A8AC7DL) /* 299 */,
- unchecked((long) 0xCA845E9172FADCD4L) /* 300 */, unchecked((long) 0x84F82B60329D20DCL) /* 301 */,
- unchecked((long) 0x79C62CE1CD672F18L) /* 302 */, unchecked((long) 0x8B09A2ADD124642CL) /* 303 */,
- unchecked((long) 0xD0C1E96A19D9E726L) /* 304 */, unchecked((long) 0x5A786A9B4BA9500CL) /* 305 */,
- unchecked((long) 0x0E020336634C43F3L) /* 306 */, unchecked((long) 0xC17B474AEB66D822L) /* 307 */,
- unchecked((long) 0x6A731AE3EC9BAAC2L) /* 308 */, unchecked((long) 0x8226667AE0840258L) /* 309 */,
- unchecked((long) 0x67D4567691CAECA5L) /* 310 */, unchecked((long) 0x1D94155C4875ADB5L) /* 311 */,
- unchecked((long) 0x6D00FD985B813FDFL) /* 312 */, unchecked((long) 0x51286EFCB774CD06L) /* 313 */,
- unchecked((long) 0x5E8834471FA744AFL) /* 314 */, unchecked((long) 0xF72CA0AEE761AE2EL) /* 315 */,
- unchecked((long) 0xBE40E4CDAEE8E09AL) /* 316 */, unchecked((long) 0xE9970BBB5118F665L) /* 317 */,
- unchecked((long) 0x726E4BEB33DF1964L) /* 318 */, unchecked((long) 0x703B000729199762L) /* 319 */,
- unchecked((long) 0x4631D816F5EF30A7L) /* 320 */, unchecked((long) 0xB880B5B51504A6BEL) /* 321 */,
- unchecked((long) 0x641793C37ED84B6CL) /* 322 */, unchecked((long) 0x7B21ED77F6E97D96L) /* 323 */,
- unchecked((long) 0x776306312EF96B73L) /* 324 */, unchecked((long) 0xAE528948E86FF3F4L) /* 325 */,
- unchecked((long) 0x53DBD7F286A3F8F8L) /* 326 */, unchecked((long) 0x16CADCE74CFC1063L) /* 327 */,
- unchecked((long) 0x005C19BDFA52C6DDL) /* 328 */, unchecked((long) 0x68868F5D64D46AD3L) /* 329 */,
- unchecked((long) 0x3A9D512CCF1E186AL) /* 330 */, unchecked((long) 0x367E62C2385660AEL) /* 331 */,
- unchecked((long) 0xE359E7EA77DCB1D7L) /* 332 */, unchecked((long) 0x526C0773749ABE6EL) /* 333 */,
- unchecked((long) 0x735AE5F9D09F734BL) /* 334 */, unchecked((long) 0x493FC7CC8A558BA8L) /* 335 */,
- unchecked((long) 0xB0B9C1533041AB45L) /* 336 */, unchecked((long) 0x321958BA470A59BDL) /* 337 */,
- unchecked((long) 0x852DB00B5F46C393L) /* 338 */, unchecked((long) 0x91209B2BD336B0E5L) /* 339 */,
- unchecked((long) 0x6E604F7D659EF19FL) /* 340 */, unchecked((long) 0xB99A8AE2782CCB24L) /* 341 */,
- unchecked((long) 0xCCF52AB6C814C4C7L) /* 342 */, unchecked((long) 0x4727D9AFBE11727BL) /* 343 */,
- unchecked((long) 0x7E950D0C0121B34DL) /* 344 */, unchecked((long) 0x756F435670AD471FL) /* 345 */,
- unchecked((long) 0xF5ADD442615A6849L) /* 346 */, unchecked((long) 0x4E87E09980B9957AL) /* 347 */,
- unchecked((long) 0x2ACFA1DF50AEE355L) /* 348 */, unchecked((long) 0xD898263AFD2FD556L) /* 349 */,
- unchecked((long) 0xC8F4924DD80C8FD6L) /* 350 */, unchecked((long) 0xCF99CA3D754A173AL) /* 351 */,
- unchecked((long) 0xFE477BACAF91BF3CL) /* 352 */, unchecked((long) 0xED5371F6D690C12DL) /* 353 */,
- unchecked((long) 0x831A5C285E687094L) /* 354 */, unchecked((long) 0xC5D3C90A3708A0A4L) /* 355 */,
- unchecked((long) 0x0F7F903717D06580L) /* 356 */, unchecked((long) 0x19F9BB13B8FDF27FL) /* 357 */,
- unchecked((long) 0xB1BD6F1B4D502843L) /* 358 */, unchecked((long) 0x1C761BA38FFF4012L) /* 359 */,
- unchecked((long) 0x0D1530C4E2E21F3BL) /* 360 */, unchecked((long) 0x8943CE69A7372C8AL) /* 361 */,
- unchecked((long) 0xE5184E11FEB5CE66L) /* 362 */, unchecked((long) 0x618BDB80BD736621L) /* 363 */,
- unchecked((long) 0x7D29BAD68B574D0BL) /* 364 */, unchecked((long) 0x81BB613E25E6FE5BL) /* 365 */,
- unchecked((long) 0x071C9C10BC07913FL) /* 366 */, unchecked((long) 0xC7BEEB7909AC2D97L) /* 367 */,
- unchecked((long) 0xC3E58D353BC5D757L) /* 368 */, unchecked((long) 0xEB017892F38F61E8L) /* 369 */,
- unchecked((long) 0xD4EFFB9C9B1CC21AL) /* 370 */, unchecked((long) 0x99727D26F494F7ABL) /* 371 */,
- unchecked((long) 0xA3E063A2956B3E03L) /* 372 */, unchecked((long) 0x9D4A8B9A4AA09C30L) /* 373 */,
- unchecked((long) 0x3F6AB7D500090FB4L) /* 374 */, unchecked((long) 0x9CC0F2A057268AC0L) /* 375 */,
- unchecked((long) 0x3DEE9D2DEDBF42D1L) /* 376 */, unchecked((long) 0x330F49C87960A972L) /* 377 */,
- unchecked((long) 0xC6B2720287421B41L) /* 378 */, unchecked((long) 0x0AC59EC07C00369CL) /* 379 */,
- unchecked((long) 0xEF4EAC49CB353425L) /* 380 */, unchecked((long) 0xF450244EEF0129D8L) /* 381 */,
- unchecked((long) 0x8ACC46E5CAF4DEB6L) /* 382 */, unchecked((long) 0x2FFEAB63989263F7L) /* 383 */,
- unchecked((long) 0x8F7CB9FE5D7A4578L) /* 384 */, unchecked((long) 0x5BD8F7644E634635L) /* 385 */,
- unchecked((long) 0x427A7315BF2DC900L) /* 386 */, unchecked((long) 0x17D0C4AA2125261CL) /* 387 */,
- unchecked((long) 0x3992486C93518E50L) /* 388 */, unchecked((long) 0xB4CBFEE0A2D7D4C3L) /* 389 */,
- unchecked((long) 0x7C75D6202C5DDD8DL) /* 390 */, unchecked((long) 0xDBC295D8E35B6C61L) /* 391 */,
- unchecked((long) 0x60B369D302032B19L) /* 392 */, unchecked((long) 0xCE42685FDCE44132L) /* 393 */,
- unchecked((long) 0x06F3DDB9DDF65610L) /* 394 */, unchecked((long) 0x8EA4D21DB5E148F0L) /* 395 */,
- unchecked((long) 0x20B0FCE62FCD496FL) /* 396 */, unchecked((long) 0x2C1B912358B0EE31L) /* 397 */,
- unchecked((long) 0xB28317B818F5A308L) /* 398 */, unchecked((long) 0xA89C1E189CA6D2CFL) /* 399 */,
- unchecked((long) 0x0C6B18576AAADBC8L) /* 400 */, unchecked((long) 0xB65DEAA91299FAE3L) /* 401 */,
- unchecked((long) 0xFB2B794B7F1027E7L) /* 402 */, unchecked((long) 0x04E4317F443B5BEBL) /* 403 */,
- unchecked((long) 0x4B852D325939D0A6L) /* 404 */, unchecked((long) 0xD5AE6BEEFB207FFCL) /* 405 */,
- unchecked((long) 0x309682B281C7D374L) /* 406 */, unchecked((long) 0xBAE309A194C3B475L) /* 407 */,
- unchecked((long) 0x8CC3F97B13B49F05L) /* 408 */, unchecked((long) 0x98A9422FF8293967L) /* 409 */,
- unchecked((long) 0x244B16B01076FF7CL) /* 410 */, unchecked((long) 0xF8BF571C663D67EEL) /* 411 */,
- unchecked((long) 0x1F0D6758EEE30DA1L) /* 412 */, unchecked((long) 0xC9B611D97ADEB9B7L) /* 413 */,
- unchecked((long) 0xB7AFD5887B6C57A2L) /* 414 */, unchecked((long) 0x6290AE846B984FE1L) /* 415 */,
- unchecked((long) 0x94DF4CDEACC1A5FDL) /* 416 */, unchecked((long) 0x058A5BD1C5483AFFL) /* 417 */,
- unchecked((long) 0x63166CC142BA3C37L) /* 418 */, unchecked((long) 0x8DB8526EB2F76F40L) /* 419 */,
- unchecked((long) 0xE10880036F0D6D4EL) /* 420 */, unchecked((long) 0x9E0523C9971D311DL) /* 421 */,
- unchecked((long) 0x45EC2824CC7CD691L) /* 422 */, unchecked((long) 0x575B8359E62382C9L) /* 423 */,
- unchecked((long) 0xFA9E400DC4889995L) /* 424 */, unchecked((long) 0xD1823ECB45721568L) /* 425 */,
- unchecked((long) 0xDAFD983B8206082FL) /* 426 */, unchecked((long) 0xAA7D29082386A8CBL) /* 427 */,
- unchecked((long) 0x269FCD4403B87588L) /* 428 */, unchecked((long) 0x1B91F5F728BDD1E0L) /* 429 */,
- unchecked((long) 0xE4669F39040201F6L) /* 430 */, unchecked((long) 0x7A1D7C218CF04ADEL) /* 431 */,
- unchecked((long) 0x65623C29D79CE5CEL) /* 432 */, unchecked((long) 0x2368449096C00BB1L) /* 433 */,
- unchecked((long) 0xAB9BF1879DA503BAL) /* 434 */, unchecked((long) 0xBC23ECB1A458058EL) /* 435 */,
- unchecked((long) 0x9A58DF01BB401ECCL) /* 436 */, unchecked((long) 0xA070E868A85F143DL) /* 437 */,
- unchecked((long) 0x4FF188307DF2239EL) /* 438 */, unchecked((long) 0x14D565B41A641183L) /* 439 */,
- unchecked((long) 0xEE13337452701602L) /* 440 */, unchecked((long) 0x950E3DCF3F285E09L) /* 441 */,
- unchecked((long) 0x59930254B9C80953L) /* 442 */, unchecked((long) 0x3BF299408930DA6DL) /* 443 */,
- unchecked((long) 0xA955943F53691387L) /* 444 */, unchecked((long) 0xA15EDECAA9CB8784L) /* 445 */,
- unchecked((long) 0x29142127352BE9A0L) /* 446 */, unchecked((long) 0x76F0371FFF4E7AFBL) /* 447 */,
- unchecked((long) 0x0239F450274F2228L) /* 448 */, unchecked((long) 0xBB073AF01D5E868BL) /* 449 */,
- unchecked((long) 0xBFC80571C10E96C1L) /* 450 */, unchecked((long) 0xD267088568222E23L) /* 451 */,
- unchecked((long) 0x9671A3D48E80B5B0L) /* 452 */, unchecked((long) 0x55B5D38AE193BB81L) /* 453 */,
- unchecked((long) 0x693AE2D0A18B04B8L) /* 454 */, unchecked((long) 0x5C48B4ECADD5335FL) /* 455 */,
- unchecked((long) 0xFD743B194916A1CAL) /* 456 */, unchecked((long) 0x2577018134BE98C4L) /* 457 */,
- unchecked((long) 0xE77987E83C54A4ADL) /* 458 */, unchecked((long) 0x28E11014DA33E1B9L) /* 459 */,
- unchecked((long) 0x270CC59E226AA213L) /* 460 */, unchecked((long) 0x71495F756D1A5F60L) /* 461 */,
- unchecked((long) 0x9BE853FB60AFEF77L) /* 462 */, unchecked((long) 0xADC786A7F7443DBFL) /* 463 */,
- unchecked((long) 0x0904456173B29A82L) /* 464 */, unchecked((long) 0x58BC7A66C232BD5EL) /* 465 */,
- unchecked((long) 0xF306558C673AC8B2L) /* 466 */, unchecked((long) 0x41F639C6B6C9772AL) /* 467 */,
- unchecked((long) 0x216DEFE99FDA35DAL) /* 468 */, unchecked((long) 0x11640CC71C7BE615L) /* 469 */,
- unchecked((long) 0x93C43694565C5527L) /* 470 */, unchecked((long) 0xEA038E6246777839L) /* 471 */,
- unchecked((long) 0xF9ABF3CE5A3E2469L) /* 472 */, unchecked((long) 0x741E768D0FD312D2L) /* 473 */,
- unchecked((long) 0x0144B883CED652C6L) /* 474 */, unchecked((long) 0xC20B5A5BA33F8552L) /* 475 */,
- unchecked((long) 0x1AE69633C3435A9DL) /* 476 */, unchecked((long) 0x97A28CA4088CFDECL) /* 477 */,
- unchecked((long) 0x8824A43C1E96F420L) /* 478 */, unchecked((long) 0x37612FA66EEEA746L) /* 479 */,
- unchecked((long) 0x6B4CB165F9CF0E5AL) /* 480 */, unchecked((long) 0x43AA1C06A0ABFB4AL) /* 481 */,
- unchecked((long) 0x7F4DC26FF162796BL) /* 482 */, unchecked((long) 0x6CBACC8E54ED9B0FL) /* 483 */,
- unchecked((long) 0xA6B7FFEFD2BB253EL) /* 484 */, unchecked((long) 0x2E25BC95B0A29D4FL) /* 485 */,
- unchecked((long) 0x86D6A58BDEF1388CL) /* 486 */, unchecked((long) 0xDED74AC576B6F054L) /* 487 */,
- unchecked((long) 0x8030BDBC2B45805DL) /* 488 */, unchecked((long) 0x3C81AF70E94D9289L) /* 489 */,
- unchecked((long) 0x3EFF6DDA9E3100DBL) /* 490 */, unchecked((long) 0xB38DC39FDFCC8847L) /* 491 */,
- unchecked((long) 0x123885528D17B87EL) /* 492 */, unchecked((long) 0xF2DA0ED240B1B642L) /* 493 */,
- unchecked((long) 0x44CEFADCD54BF9A9L) /* 494 */, unchecked((long) 0x1312200E433C7EE6L) /* 495 */,
- unchecked((long) 0x9FFCC84F3A78C748L) /* 496 */, unchecked((long) 0xF0CD1F72248576BBL) /* 497 */,
- unchecked((long) 0xEC6974053638CFE4L) /* 498 */, unchecked((long) 0x2BA7B67C0CEC4E4CL) /* 499 */,
- unchecked((long) 0xAC2F4DF3E5CE32EDL) /* 500 */, unchecked((long) 0xCB33D14326EA4C11L) /* 501 */,
- unchecked((long) 0xA4E9044CC77E58BCL) /* 502 */, unchecked((long) 0x5F513293D934FCEFL) /* 503 */,
- unchecked((long) 0x5DC9645506E55444L) /* 504 */, unchecked((long) 0x50DE418F317DE40AL) /* 505 */,
- unchecked((long) 0x388CB31A69DDE259L) /* 506 */, unchecked((long) 0x2DB4A83455820A86L) /* 507 */,
- unchecked((long) 0x9010A91E84711AE9L) /* 508 */, unchecked((long) 0x4DF7F0B7B1498371L) /* 509 */,
- unchecked((long) 0xD62A2EABC0977179L) /* 510 */, unchecked((long) 0x22FAC097AA8D5C0EL) /* 511 */,
- };
-
- private static readonly long[] t3 = {
- unchecked((long) 0xF49FCC2FF1DAF39BL) /* 512 */, unchecked((long) 0x487FD5C66FF29281L) /* 513 */,
- unchecked((long) 0xE8A30667FCDCA83FL) /* 514 */, unchecked((long) 0x2C9B4BE3D2FCCE63L) /* 515 */,
- unchecked((long) 0xDA3FF74B93FBBBC2L) /* 516 */, unchecked((long) 0x2FA165D2FE70BA66L) /* 517 */,
- unchecked((long) 0xA103E279970E93D4L) /* 518 */, unchecked((long) 0xBECDEC77B0E45E71L) /* 519 */,
- unchecked((long) 0xCFB41E723985E497L) /* 520 */, unchecked((long) 0xB70AAA025EF75017L) /* 521 */,
- unchecked((long) 0xD42309F03840B8E0L) /* 522 */, unchecked((long) 0x8EFC1AD035898579L) /* 523 */,
- unchecked((long) 0x96C6920BE2B2ABC5L) /* 524 */, unchecked((long) 0x66AF4163375A9172L) /* 525 */,
- unchecked((long) 0x2174ABDCCA7127FBL) /* 526 */, unchecked((long) 0xB33CCEA64A72FF41L) /* 527 */,
- unchecked((long) 0xF04A4933083066A5L) /* 528 */, unchecked((long) 0x8D970ACDD7289AF5L) /* 529 */,
- unchecked((long) 0x8F96E8E031C8C25EL) /* 530 */, unchecked((long) 0xF3FEC02276875D47L) /* 531 */,
- unchecked((long) 0xEC7BF310056190DDL) /* 532 */, unchecked((long) 0xF5ADB0AEBB0F1491L) /* 533 */,
- unchecked((long) 0x9B50F8850FD58892L) /* 534 */, unchecked((long) 0x4975488358B74DE8L) /* 535 */,
- unchecked((long) 0xA3354FF691531C61L) /* 536 */, unchecked((long) 0x0702BBE481D2C6EEL) /* 537 */,
- unchecked((long) 0x89FB24057DEDED98L) /* 538 */, unchecked((long) 0xAC3075138596E902L) /* 539 */,
- unchecked((long) 0x1D2D3580172772EDL) /* 540 */, unchecked((long) 0xEB738FC28E6BC30DL) /* 541 */,
- unchecked((long) 0x5854EF8F63044326L) /* 542 */, unchecked((long) 0x9E5C52325ADD3BBEL) /* 543 */,
- unchecked((long) 0x90AA53CF325C4623L) /* 544 */, unchecked((long) 0xC1D24D51349DD067L) /* 545 */,
- unchecked((long) 0x2051CFEEA69EA624L) /* 546 */, unchecked((long) 0x13220F0A862E7E4FL) /* 547 */,
- unchecked((long) 0xCE39399404E04864L) /* 548 */, unchecked((long) 0xD9C42CA47086FCB7L) /* 549 */,
- unchecked((long) 0x685AD2238A03E7CCL) /* 550 */, unchecked((long) 0x066484B2AB2FF1DBL) /* 551 */,
- unchecked((long) 0xFE9D5D70EFBF79ECL) /* 552 */, unchecked((long) 0x5B13B9DD9C481854L) /* 553 */,
- unchecked((long) 0x15F0D475ED1509ADL) /* 554 */, unchecked((long) 0x0BEBCD060EC79851L) /* 555 */,
- unchecked((long) 0xD58C6791183AB7F8L) /* 556 */, unchecked((long) 0xD1187C5052F3EEE4L) /* 557 */,
- unchecked((long) 0xC95D1192E54E82FFL) /* 558 */, unchecked((long) 0x86EEA14CB9AC6CA2L) /* 559 */,
- unchecked((long) 0x3485BEB153677D5DL) /* 560 */, unchecked((long) 0xDD191D781F8C492AL) /* 561 */,
- unchecked((long) 0xF60866BAA784EBF9L) /* 562 */, unchecked((long) 0x518F643BA2D08C74L) /* 563 */,
- unchecked((long) 0x8852E956E1087C22L) /* 564 */, unchecked((long) 0xA768CB8DC410AE8DL) /* 565 */,
- unchecked((long) 0x38047726BFEC8E1AL) /* 566 */, unchecked((long) 0xA67738B4CD3B45AAL) /* 567 */,
- unchecked((long) 0xAD16691CEC0DDE19L) /* 568 */, unchecked((long) 0xC6D4319380462E07L) /* 569 */,
- unchecked((long) 0xC5A5876D0BA61938L) /* 570 */, unchecked((long) 0x16B9FA1FA58FD840L) /* 571 */,
- unchecked((long) 0x188AB1173CA74F18L) /* 572 */, unchecked((long) 0xABDA2F98C99C021FL) /* 573 */,
- unchecked((long) 0x3E0580AB134AE816L) /* 574 */, unchecked((long) 0x5F3B05B773645ABBL) /* 575 */,
- unchecked((long) 0x2501A2BE5575F2F6L) /* 576 */, unchecked((long) 0x1B2F74004E7E8BA9L) /* 577 */,
- unchecked((long) 0x1CD7580371E8D953L) /* 578 */, unchecked((long) 0x7F6ED89562764E30L) /* 579 */,
- unchecked((long) 0xB15926FF596F003DL) /* 580 */, unchecked((long) 0x9F65293DA8C5D6B9L) /* 581 */,
- unchecked((long) 0x6ECEF04DD690F84CL) /* 582 */, unchecked((long) 0x4782275FFF33AF88L) /* 583 */,
- unchecked((long) 0xE41433083F820801L) /* 584 */, unchecked((long) 0xFD0DFE409A1AF9B5L) /* 585 */,
- unchecked((long) 0x4325A3342CDB396BL) /* 586 */, unchecked((long) 0x8AE77E62B301B252L) /* 587 */,
- unchecked((long) 0xC36F9E9F6655615AL) /* 588 */, unchecked((long) 0x85455A2D92D32C09L) /* 589 */,
- unchecked((long) 0xF2C7DEA949477485L) /* 590 */, unchecked((long) 0x63CFB4C133A39EBAL) /* 591 */,
- unchecked((long) 0x83B040CC6EBC5462L) /* 592 */, unchecked((long) 0x3B9454C8FDB326B0L) /* 593 */,
- unchecked((long) 0x56F56A9E87FFD78CL) /* 594 */, unchecked((long) 0x2DC2940D99F42BC6L) /* 595 */,
- unchecked((long) 0x98F7DF096B096E2DL) /* 596 */, unchecked((long) 0x19A6E01E3AD852BFL) /* 597 */,
- unchecked((long) 0x42A99CCBDBD4B40BL) /* 598 */, unchecked((long) 0xA59998AF45E9C559L) /* 599 */,
- unchecked((long) 0x366295E807D93186L) /* 600 */, unchecked((long) 0x6B48181BFAA1F773L) /* 601 */,
- unchecked((long) 0x1FEC57E2157A0A1DL) /* 602 */, unchecked((long) 0x4667446AF6201AD5L) /* 603 */,
- unchecked((long) 0xE615EBCACFB0F075L) /* 604 */, unchecked((long) 0xB8F31F4F68290778L) /* 605 */,
- unchecked((long) 0x22713ED6CE22D11EL) /* 606 */, unchecked((long) 0x3057C1A72EC3C93BL) /* 607 */,
- unchecked((long) 0xCB46ACC37C3F1F2FL) /* 608 */, unchecked((long) 0xDBB893FD02AAF50EL) /* 609 */,
- unchecked((long) 0x331FD92E600B9FCFL) /* 610 */, unchecked((long) 0xA498F96148EA3AD6L) /* 611 */,
- unchecked((long) 0xA8D8426E8B6A83EAL) /* 612 */, unchecked((long) 0xA089B274B7735CDCL) /* 613 */,
- unchecked((long) 0x87F6B3731E524A11L) /* 614 */, unchecked((long) 0x118808E5CBC96749L) /* 615 */,
- unchecked((long) 0x9906E4C7B19BD394L) /* 616 */, unchecked((long) 0xAFED7F7E9B24A20CL) /* 617 */,
- unchecked((long) 0x6509EADEEB3644A7L) /* 618 */, unchecked((long) 0x6C1EF1D3E8EF0EDEL) /* 619 */,
- unchecked((long) 0xB9C97D43E9798FB4L) /* 620 */, unchecked((long) 0xA2F2D784740C28A3L) /* 621 */,
- unchecked((long) 0x7B8496476197566FL) /* 622 */, unchecked((long) 0x7A5BE3E6B65F069DL) /* 623 */,
- unchecked((long) 0xF96330ED78BE6F10L) /* 624 */, unchecked((long) 0xEEE60DE77A076A15L) /* 625 */,
- unchecked((long) 0x2B4BEE4AA08B9BD0L) /* 626 */, unchecked((long) 0x6A56A63EC7B8894EL) /* 627 */,
- unchecked((long) 0x02121359BA34FEF4L) /* 628 */, unchecked((long) 0x4CBF99F8283703FCL) /* 629 */,
- unchecked((long) 0x398071350CAF30C8L) /* 630 */, unchecked((long) 0xD0A77A89F017687AL) /* 631 */,
- unchecked((long) 0xF1C1A9EB9E423569L) /* 632 */, unchecked((long) 0x8C7976282DEE8199L) /* 633 */,
- unchecked((long) 0x5D1737A5DD1F7ABDL) /* 634 */, unchecked((long) 0x4F53433C09A9FA80L) /* 635 */,
- unchecked((long) 0xFA8B0C53DF7CA1D9L) /* 636 */, unchecked((long) 0x3FD9DCBC886CCB77L) /* 637 */,
- unchecked((long) 0xC040917CA91B4720L) /* 638 */, unchecked((long) 0x7DD00142F9D1DCDFL) /* 639 */,
- unchecked((long) 0x8476FC1D4F387B58L) /* 640 */, unchecked((long) 0x23F8E7C5F3316503L) /* 641 */,
- unchecked((long) 0x032A2244E7E37339L) /* 642 */, unchecked((long) 0x5C87A5D750F5A74BL) /* 643 */,
- unchecked((long) 0x082B4CC43698992EL) /* 644 */, unchecked((long) 0xDF917BECB858F63CL) /* 645 */,
- unchecked((long) 0x3270B8FC5BF86DDAL) /* 646 */, unchecked((long) 0x10AE72BB29B5DD76L) /* 647 */,
- unchecked((long) 0x576AC94E7700362BL) /* 648 */, unchecked((long) 0x1AD112DAC61EFB8FL) /* 649 */,
- unchecked((long) 0x691BC30EC5FAA427L) /* 650 */, unchecked((long) 0xFF246311CC327143L) /* 651 */,
- unchecked((long) 0x3142368E30E53206L) /* 652 */, unchecked((long) 0x71380E31E02CA396L) /* 653 */,
- unchecked((long) 0x958D5C960AAD76F1L) /* 654 */, unchecked((long) 0xF8D6F430C16DA536L) /* 655 */,
- unchecked((long) 0xC8FFD13F1BE7E1D2L) /* 656 */, unchecked((long) 0x7578AE66004DDBE1L) /* 657 */,
- unchecked((long) 0x05833F01067BE646L) /* 658 */, unchecked((long) 0xBB34B5AD3BFE586DL) /* 659 */,
- unchecked((long) 0x095F34C9A12B97F0L) /* 660 */, unchecked((long) 0x247AB64525D60CA8L) /* 661 */,
- unchecked((long) 0xDCDBC6F3017477D1L) /* 662 */, unchecked((long) 0x4A2E14D4DECAD24DL) /* 663 */,
- unchecked((long) 0xBDB5E6D9BE0A1EEBL) /* 664 */, unchecked((long) 0x2A7E70F7794301ABL) /* 665 */,
- unchecked((long) 0xDEF42D8A270540FDL) /* 666 */, unchecked((long) 0x01078EC0A34C22C1L) /* 667 */,
- unchecked((long) 0xE5DE511AF4C16387L) /* 668 */, unchecked((long) 0x7EBB3A52BD9A330AL) /* 669 */,
- unchecked((long) 0x77697857AA7D6435L) /* 670 */, unchecked((long) 0x004E831603AE4C32L) /* 671 */,
- unchecked((long) 0xE7A21020AD78E312L) /* 672 */, unchecked((long) 0x9D41A70C6AB420F2L) /* 673 */,
- unchecked((long) 0x28E06C18EA1141E6L) /* 674 */, unchecked((long) 0xD2B28CBD984F6B28L) /* 675 */,
- unchecked((long) 0x26B75F6C446E9D83L) /* 676 */, unchecked((long) 0xBA47568C4D418D7FL) /* 677 */,
- unchecked((long) 0xD80BADBFE6183D8EL) /* 678 */, unchecked((long) 0x0E206D7F5F166044L) /* 679 */,
- unchecked((long) 0xE258A43911CBCA3EL) /* 680 */, unchecked((long) 0x723A1746B21DC0BCL) /* 681 */,
- unchecked((long) 0xC7CAA854F5D7CDD3L) /* 682 */, unchecked((long) 0x7CAC32883D261D9CL) /* 683 */,
- unchecked((long) 0x7690C26423BA942CL) /* 684 */, unchecked((long) 0x17E55524478042B8L) /* 685 */,
- unchecked((long) 0xE0BE477656A2389FL) /* 686 */, unchecked((long) 0x4D289B5E67AB2DA0L) /* 687 */,
- unchecked((long) 0x44862B9C8FBBFD31L) /* 688 */, unchecked((long) 0xB47CC8049D141365L) /* 689 */,
- unchecked((long) 0x822C1B362B91C793L) /* 690 */, unchecked((long) 0x4EB14655FB13DFD8L) /* 691 */,
- unchecked((long) 0x1ECBBA0714E2A97BL) /* 692 */, unchecked((long) 0x6143459D5CDE5F14L) /* 693 */,
- unchecked((long) 0x53A8FBF1D5F0AC89L) /* 694 */, unchecked((long) 0x97EA04D81C5E5B00L) /* 695 */,
- unchecked((long) 0x622181A8D4FDB3F3L) /* 696 */, unchecked((long) 0xE9BCD341572A1208L) /* 697 */,
- unchecked((long) 0x1411258643CCE58AL) /* 698 */, unchecked((long) 0x9144C5FEA4C6E0A4L) /* 699 */,
- unchecked((long) 0x0D33D06565CF620FL) /* 700 */, unchecked((long) 0x54A48D489F219CA1L) /* 701 */,
- unchecked((long) 0xC43E5EAC6D63C821L) /* 702 */, unchecked((long) 0xA9728B3A72770DAFL) /* 703 */,
- unchecked((long) 0xD7934E7B20DF87EFL) /* 704 */, unchecked((long) 0xE35503B61A3E86E5L) /* 705 */,
- unchecked((long) 0xCAE321FBC819D504L) /* 706 */, unchecked((long) 0x129A50B3AC60BFA6L) /* 707 */,
- unchecked((long) 0xCD5E68EA7E9FB6C3L) /* 708 */, unchecked((long) 0xB01C90199483B1C7L) /* 709 */,
- unchecked((long) 0x3DE93CD5C295376CL) /* 710 */, unchecked((long) 0xAED52EDF2AB9AD13L) /* 711 */,
- unchecked((long) 0x2E60F512C0A07884L) /* 712 */, unchecked((long) 0xBC3D86A3E36210C9L) /* 713 */,
- unchecked((long) 0x35269D9B163951CEL) /* 714 */, unchecked((long) 0x0C7D6E2AD0CDB5FAL) /* 715 */,
- unchecked((long) 0x59E86297D87F5733L) /* 716 */, unchecked((long) 0x298EF221898DB0E7L) /* 717 */,
- unchecked((long) 0x55000029D1A5AA7EL) /* 718 */, unchecked((long) 0x8BC08AE1B5061B45L) /* 719 */,
- unchecked((long) 0xC2C31C2B6C92703AL) /* 720 */, unchecked((long) 0x94CC596BAF25EF42L) /* 721 */,
- unchecked((long) 0x0A1D73DB22540456L) /* 722 */, unchecked((long) 0x04B6A0F9D9C4179AL) /* 723 */,
- unchecked((long) 0xEFFDAFA2AE3D3C60L) /* 724 */, unchecked((long) 0xF7C8075BB49496C4L) /* 725 */,
- unchecked((long) 0x9CC5C7141D1CD4E3L) /* 726 */, unchecked((long) 0x78BD1638218E5534L) /* 727 */,
- unchecked((long) 0xB2F11568F850246AL) /* 728 */, unchecked((long) 0xEDFABCFA9502BC29L) /* 729 */,
- unchecked((long) 0x796CE5F2DA23051BL) /* 730 */, unchecked((long) 0xAAE128B0DC93537CL) /* 731 */,
- unchecked((long) 0x3A493DA0EE4B29AEL) /* 732 */, unchecked((long) 0xB5DF6B2C416895D7L) /* 733 */,
- unchecked((long) 0xFCABBD25122D7F37L) /* 734 */, unchecked((long) 0x70810B58105DC4B1L) /* 735 */,
- unchecked((long) 0xE10FDD37F7882A90L) /* 736 */, unchecked((long) 0x524DCAB5518A3F5CL) /* 737 */,
- unchecked((long) 0x3C9E85878451255BL) /* 738 */, unchecked((long) 0x4029828119BD34E2L) /* 739 */,
- unchecked((long) 0x74A05B6F5D3CECCBL) /* 740 */, unchecked((long) 0xB610021542E13ECAL) /* 741 */,
- unchecked((long) 0x0FF979D12F59E2ACL) /* 742 */, unchecked((long) 0x6037DA27E4F9CC50L) /* 743 */,
- unchecked((long) 0x5E92975A0DF1847DL) /* 744 */, unchecked((long) 0xD66DE190D3E623FEL) /* 745 */,
- unchecked((long) 0x5032D6B87B568048L) /* 746 */, unchecked((long) 0x9A36B7CE8235216EL) /* 747 */,
- unchecked((long) 0x80272A7A24F64B4AL) /* 748 */, unchecked((long) 0x93EFED8B8C6916F7L) /* 749 */,
- unchecked((long) 0x37DDBFF44CCE1555L) /* 750 */, unchecked((long) 0x4B95DB5D4B99BD25L) /* 751 */,
- unchecked((long) 0x92D3FDA169812FC0L) /* 752 */, unchecked((long) 0xFB1A4A9A90660BB6L) /* 753 */,
- unchecked((long) 0x730C196946A4B9B2L) /* 754 */, unchecked((long) 0x81E289AA7F49DA68L) /* 755 */,
- unchecked((long) 0x64669A0F83B1A05FL) /* 756 */, unchecked((long) 0x27B3FF7D9644F48BL) /* 757 */,
- unchecked((long) 0xCC6B615C8DB675B3L) /* 758 */, unchecked((long) 0x674F20B9BCEBBE95L) /* 759 */,
- unchecked((long) 0x6F31238275655982L) /* 760 */, unchecked((long) 0x5AE488713E45CF05L) /* 761 */,
- unchecked((long) 0xBF619F9954C21157L) /* 762 */, unchecked((long) 0xEABAC46040A8EAE9L) /* 763 */,
- unchecked((long) 0x454C6FE9F2C0C1CDL) /* 764 */, unchecked((long) 0x419CF6496412691CL) /* 765 */,
- unchecked((long) 0xD3DC3BEF265B0F70L) /* 766 */, unchecked((long) 0x6D0E60F5C3578A9EL) /* 767 */,
- };
-
- private static readonly long[] t4 = {
- unchecked((long) 0x5B0E608526323C55L) /* 768 */, unchecked((long) 0x1A46C1A9FA1B59F5L) /* 769 */,
- unchecked((long) 0xA9E245A17C4C8FFAL) /* 770 */, unchecked((long) 0x65CA5159DB2955D7L) /* 771 */,
- unchecked((long) 0x05DB0A76CE35AFC2L) /* 772 */, unchecked((long) 0x81EAC77EA9113D45L) /* 773 */,
- unchecked((long) 0x528EF88AB6AC0A0DL) /* 774 */, unchecked((long) 0xA09EA253597BE3FFL) /* 775 */,
- unchecked((long) 0x430DDFB3AC48CD56L) /* 776 */, unchecked((long) 0xC4B3A67AF45CE46FL) /* 777 */,
- unchecked((long) 0x4ECECFD8FBE2D05EL) /* 778 */, unchecked((long) 0x3EF56F10B39935F0L) /* 779 */,
- unchecked((long) 0x0B22D6829CD619C6L) /* 780 */, unchecked((long) 0x17FD460A74DF2069L) /* 781 */,
- unchecked((long) 0x6CF8CC8E8510ED40L) /* 782 */, unchecked((long) 0xD6C824BF3A6ECAA7L) /* 783 */,
- unchecked((long) 0x61243D581A817049L) /* 784 */, unchecked((long) 0x048BACB6BBC163A2L) /* 785 */,
- unchecked((long) 0xD9A38AC27D44CC32L) /* 786 */, unchecked((long) 0x7FDDFF5BAAF410ABL) /* 787 */,
- unchecked((long) 0xAD6D495AA804824BL) /* 788 */, unchecked((long) 0xE1A6A74F2D8C9F94L) /* 789 */,
- unchecked((long) 0xD4F7851235DEE8E3L) /* 790 */, unchecked((long) 0xFD4B7F886540D893L) /* 791 */,
- unchecked((long) 0x247C20042AA4BFDAL) /* 792 */, unchecked((long) 0x096EA1C517D1327CL) /* 793 */,
- unchecked((long) 0xD56966B4361A6685L) /* 794 */, unchecked((long) 0x277DA5C31221057DL) /* 795 */,
- unchecked((long) 0x94D59893A43ACFF7L) /* 796 */, unchecked((long) 0x64F0C51CCDC02281L) /* 797 */,
- unchecked((long) 0x3D33BCC4FF6189DBL) /* 798 */, unchecked((long) 0xE005CB184CE66AF1L) /* 799 */,
- unchecked((long) 0xFF5CCD1D1DB99BEAL) /* 800 */, unchecked((long) 0xB0B854A7FE42980FL) /* 801 */,
- unchecked((long) 0x7BD46A6A718D4B9FL) /* 802 */, unchecked((long) 0xD10FA8CC22A5FD8CL) /* 803 */,
- unchecked((long) 0xD31484952BE4BD31L) /* 804 */, unchecked((long) 0xC7FA975FCB243847L) /* 805 */,
- unchecked((long) 0x4886ED1E5846C407L) /* 806 */, unchecked((long) 0x28CDDB791EB70B04L) /* 807 */,
- unchecked((long) 0xC2B00BE2F573417FL) /* 808 */, unchecked((long) 0x5C9590452180F877L) /* 809 */,
- unchecked((long) 0x7A6BDDFFF370EB00L) /* 810 */, unchecked((long) 0xCE509E38D6D9D6A4L) /* 811 */,
- unchecked((long) 0xEBEB0F00647FA702L) /* 812 */, unchecked((long) 0x1DCC06CF76606F06L) /* 813 */,
- unchecked((long) 0xE4D9F28BA286FF0AL) /* 814 */, unchecked((long) 0xD85A305DC918C262L) /* 815 */,
- unchecked((long) 0x475B1D8732225F54L) /* 816 */, unchecked((long) 0x2D4FB51668CCB5FEL) /* 817 */,
- unchecked((long) 0xA679B9D9D72BBA20L) /* 818 */, unchecked((long) 0x53841C0D912D43A5L) /* 819 */,
- unchecked((long) 0x3B7EAA48BF12A4E8L) /* 820 */, unchecked((long) 0x781E0E47F22F1DDFL) /* 821 */,
- unchecked((long) 0xEFF20CE60AB50973L) /* 822 */, unchecked((long) 0x20D261D19DFFB742L) /* 823 */,
- unchecked((long) 0x16A12B03062A2E39L) /* 824 */, unchecked((long) 0x1960EB2239650495L) /* 825 */,
- unchecked((long) 0x251C16FED50EB8B8L) /* 826 */, unchecked((long) 0x9AC0C330F826016EL) /* 827 */,
- unchecked((long) 0xED152665953E7671L) /* 828 */, unchecked((long) 0x02D63194A6369570L) /* 829 */,
- unchecked((long) 0x5074F08394B1C987L) /* 830 */, unchecked((long) 0x70BA598C90B25CE1L) /* 831 */,
- unchecked((long) 0x794A15810B9742F6L) /* 832 */, unchecked((long) 0x0D5925E9FCAF8C6CL) /* 833 */,
- unchecked((long) 0x3067716CD868744EL) /* 834 */, unchecked((long) 0x910AB077E8D7731BL) /* 835 */,
- unchecked((long) 0x6A61BBDB5AC42F61L) /* 836 */, unchecked((long) 0x93513EFBF0851567L) /* 837 */,
- unchecked((long) 0xF494724B9E83E9D5L) /* 838 */, unchecked((long) 0xE887E1985C09648DL) /* 839 */,
- unchecked((long) 0x34B1D3C675370CFDL) /* 840 */, unchecked((long) 0xDC35E433BC0D255DL) /* 841 */,
- unchecked((long) 0xD0AAB84234131BE0L) /* 842 */, unchecked((long) 0x08042A50B48B7EAFL) /* 843 */,
- unchecked((long) 0x9997C4EE44A3AB35L) /* 844 */, unchecked((long) 0x829A7B49201799D0L) /* 845 */,
- unchecked((long) 0x263B8307B7C54441L) /* 846 */, unchecked((long) 0x752F95F4FD6A6CA6L) /* 847 */,
- unchecked((long) 0x927217402C08C6E5L) /* 848 */, unchecked((long) 0x2A8AB754A795D9EEL) /* 849 */,
- unchecked((long) 0xA442F7552F72943DL) /* 850 */, unchecked((long) 0x2C31334E19781208L) /* 851 */,
- unchecked((long) 0x4FA98D7CEAEE6291L) /* 852 */, unchecked((long) 0x55C3862F665DB309L) /* 853 */,
- unchecked((long) 0xBD0610175D53B1F3L) /* 854 */, unchecked((long) 0x46FE6CB840413F27L) /* 855 */,
- unchecked((long) 0x3FE03792DF0CFA59L) /* 856 */, unchecked((long) 0xCFE700372EB85E8FL) /* 857 */,
- unchecked((long) 0xA7BE29E7ADBCE118L) /* 858 */, unchecked((long) 0xE544EE5CDE8431DDL) /* 859 */,
- unchecked((long) 0x8A781B1B41F1873EL) /* 860 */, unchecked((long) 0xA5C94C78A0D2F0E7L) /* 861 */,
- unchecked((long) 0x39412E2877B60728L) /* 862 */, unchecked((long) 0xA1265EF3AFC9A62CL) /* 863 */,
- unchecked((long) 0xBCC2770C6A2506C5L) /* 864 */, unchecked((long) 0x3AB66DD5DCE1CE12L) /* 865 */,
- unchecked((long) 0xE65499D04A675B37L) /* 866 */, unchecked((long) 0x7D8F523481BFD216L) /* 867 */,
- unchecked((long) 0x0F6F64FCEC15F389L) /* 868 */, unchecked((long) 0x74EFBE618B5B13C8L) /* 869 */,
- unchecked((long) 0xACDC82B714273E1DL) /* 870 */, unchecked((long) 0xDD40BFE003199D17L) /* 871 */,
- unchecked((long) 0x37E99257E7E061F8L) /* 872 */, unchecked((long) 0xFA52626904775AAAL) /* 873 */,
- unchecked((long) 0x8BBBF63A463D56F9L) /* 874 */, unchecked((long) 0xF0013F1543A26E64L) /* 875 */,
- unchecked((long) 0xA8307E9F879EC898L) /* 876 */, unchecked((long) 0xCC4C27A4150177CCL) /* 877 */,
- unchecked((long) 0x1B432F2CCA1D3348L) /* 878 */, unchecked((long) 0xDE1D1F8F9F6FA013L) /* 879 */,
- unchecked((long) 0x606602A047A7DDD6L) /* 880 */, unchecked((long) 0xD237AB64CC1CB2C7L) /* 881 */,
- unchecked((long) 0x9B938E7225FCD1D3L) /* 882 */, unchecked((long) 0xEC4E03708E0FF476L) /* 883 */,
- unchecked((long) 0xFEB2FBDA3D03C12DL) /* 884 */, unchecked((long) 0xAE0BCED2EE43889AL) /* 885 */,
- unchecked((long) 0x22CB8923EBFB4F43L) /* 886 */, unchecked((long) 0x69360D013CF7396DL) /* 887 */,
- unchecked((long) 0x855E3602D2D4E022L) /* 888 */, unchecked((long) 0x073805BAD01F784CL) /* 889 */,
- unchecked((long) 0x33E17A133852F546L) /* 890 */, unchecked((long) 0xDF4874058AC7B638L) /* 891 */,
- unchecked((long) 0xBA92B29C678AA14AL) /* 892 */, unchecked((long) 0x0CE89FC76CFAADCDL) /* 893 */,
- unchecked((long) 0x5F9D4E0908339E34L) /* 894 */, unchecked((long) 0xF1AFE9291F5923B9L) /* 895 */,
- unchecked((long) 0x6E3480F60F4A265FL) /* 896 */, unchecked((long) 0xEEBF3A2AB29B841CL) /* 897 */,
- unchecked((long) 0xE21938A88F91B4ADL) /* 898 */, unchecked((long) 0x57DFEFF845C6D3C3L) /* 899 */,
- unchecked((long) 0x2F006B0BF62CAAF2L) /* 900 */, unchecked((long) 0x62F479EF6F75EE78L) /* 901 */,
- unchecked((long) 0x11A55AD41C8916A9L) /* 902 */, unchecked((long) 0xF229D29084FED453L) /* 903 */,
- unchecked((long) 0x42F1C27B16B000E6L) /* 904 */, unchecked((long) 0x2B1F76749823C074L) /* 905 */,
- unchecked((long) 0x4B76ECA3C2745360L) /* 906 */, unchecked((long) 0x8C98F463B91691BDL) /* 907 */,
- unchecked((long) 0x14BCC93CF1ADE66AL) /* 908 */, unchecked((long) 0x8885213E6D458397L) /* 909 */,
- unchecked((long) 0x8E177DF0274D4711L) /* 910 */, unchecked((long) 0xB49B73B5503F2951L) /* 911 */,
- unchecked((long) 0x10168168C3F96B6BL) /* 912 */, unchecked((long) 0x0E3D963B63CAB0AEL) /* 913 */,
- unchecked((long) 0x8DFC4B5655A1DB14L) /* 914 */, unchecked((long) 0xF789F1356E14DE5CL) /* 915 */,
- unchecked((long) 0x683E68AF4E51DAC1L) /* 916 */, unchecked((long) 0xC9A84F9D8D4B0FD9L) /* 917 */,
- unchecked((long) 0x3691E03F52A0F9D1L) /* 918 */, unchecked((long) 0x5ED86E46E1878E80L) /* 919 */,
- unchecked((long) 0x3C711A0E99D07150L) /* 920 */, unchecked((long) 0x5A0865B20C4E9310L) /* 921 */,
- unchecked((long) 0x56FBFC1FE4F0682EL) /* 922 */, unchecked((long) 0xEA8D5DE3105EDF9BL) /* 923 */,
- unchecked((long) 0x71ABFDB12379187AL) /* 924 */, unchecked((long) 0x2EB99DE1BEE77B9CL) /* 925 */,
- unchecked((long) 0x21ECC0EA33CF4523L) /* 926 */, unchecked((long) 0x59A4D7521805C7A1L) /* 927 */,
- unchecked((long) 0x3896F5EB56AE7C72L) /* 928 */, unchecked((long) 0xAA638F3DB18F75DCL) /* 929 */,
- unchecked((long) 0x9F39358DABE9808EL) /* 930 */, unchecked((long) 0xB7DEFA91C00B72ACL) /* 931 */,
- unchecked((long) 0x6B5541FD62492D92L) /* 932 */, unchecked((long) 0x6DC6DEE8F92E4D5BL) /* 933 */,
- unchecked((long) 0x353F57ABC4BEEA7EL) /* 934 */, unchecked((long) 0x735769D6DA5690CEL) /* 935 */,
- unchecked((long) 0x0A234AA642391484L) /* 936 */, unchecked((long) 0xF6F9508028F80D9DL) /* 937 */,
- unchecked((long) 0xB8E319A27AB3F215L) /* 938 */, unchecked((long) 0x31AD9C1151341A4DL) /* 939 */,
- unchecked((long) 0x773C22A57BEF5805L) /* 940 */, unchecked((long) 0x45C7561A07968633L) /* 941 */,
- unchecked((long) 0xF913DA9E249DBE36L) /* 942 */, unchecked((long) 0xDA652D9B78A64C68L) /* 943 */,
- unchecked((long) 0x4C27A97F3BC334EFL) /* 944 */, unchecked((long) 0x76621220E66B17F4L) /* 945 */,
- unchecked((long) 0x967743899ACD7D0BL) /* 946 */, unchecked((long) 0xF3EE5BCAE0ED6782L) /* 947 */,
- unchecked((long) 0x409F753600C879FCL) /* 948 */, unchecked((long) 0x06D09A39B5926DB6L) /* 949 */,
- unchecked((long) 0x6F83AEB0317AC588L) /* 950 */, unchecked((long) 0x01E6CA4A86381F21L) /* 951 */,
- unchecked((long) 0x66FF3462D19F3025L) /* 952 */, unchecked((long) 0x72207C24DDFD3BFBL) /* 953 */,
- unchecked((long) 0x4AF6B6D3E2ECE2EBL) /* 954 */, unchecked((long) 0x9C994DBEC7EA08DEL) /* 955 */,
- unchecked((long) 0x49ACE597B09A8BC4L) /* 956 */, unchecked((long) 0xB38C4766CF0797BAL) /* 957 */,
- unchecked((long) 0x131B9373C57C2A75L) /* 958 */, unchecked((long) 0xB1822CCE61931E58L) /* 959 */,
- unchecked((long) 0x9D7555B909BA1C0CL) /* 960 */, unchecked((long) 0x127FAFDD937D11D2L) /* 961 */,
- unchecked((long) 0x29DA3BADC66D92E4L) /* 962 */, unchecked((long) 0xA2C1D57154C2ECBCL) /* 963 */,
- unchecked((long) 0x58C5134D82F6FE24L) /* 964 */, unchecked((long) 0x1C3AE3515B62274FL) /* 965 */,
- unchecked((long) 0xE907C82E01CB8126L) /* 966 */, unchecked((long) 0xF8ED091913E37FCBL) /* 967 */,
- unchecked((long) 0x3249D8F9C80046C9L) /* 968 */, unchecked((long) 0x80CF9BEDE388FB63L) /* 969 */,
- unchecked((long) 0x1881539A116CF19EL) /* 970 */, unchecked((long) 0x5103F3F76BD52457L) /* 971 */,
- unchecked((long) 0x15B7E6F5AE47F7A8L) /* 972 */, unchecked((long) 0xDBD7C6DED47E9CCFL) /* 973 */,
- unchecked((long) 0x44E55C410228BB1AL) /* 974 */, unchecked((long) 0xB647D4255EDB4E99L) /* 975 */,
- unchecked((long) 0x5D11882BB8AAFC30L) /* 976 */, unchecked((long) 0xF5098BBB29D3212AL) /* 977 */,
- unchecked((long) 0x8FB5EA14E90296B3L) /* 978 */, unchecked((long) 0x677B942157DD025AL) /* 979 */,
- unchecked((long) 0xFB58E7C0A390ACB5L) /* 980 */, unchecked((long) 0x89D3674C83BD4A01L) /* 981 */,
- unchecked((long) 0x9E2DA4DF4BF3B93BL) /* 982 */, unchecked((long) 0xFCC41E328CAB4829L) /* 983 */,
- unchecked((long) 0x03F38C96BA582C52L) /* 984 */, unchecked((long) 0xCAD1BDBD7FD85DB2L) /* 985 */,
- unchecked((long) 0xBBB442C16082AE83L) /* 986 */, unchecked((long) 0xB95FE86BA5DA9AB0L) /* 987 */,
- unchecked((long) 0xB22E04673771A93FL) /* 988 */, unchecked((long) 0x845358C9493152D8L) /* 989 */,
- unchecked((long) 0xBE2A488697B4541EL) /* 990 */, unchecked((long) 0x95A2DC2DD38E6966L) /* 991 */,
- unchecked((long) 0xC02C11AC923C852BL) /* 992 */, unchecked((long) 0x2388B1990DF2A87BL) /* 993 */,
- unchecked((long) 0x7C8008FA1B4F37BEL) /* 994 */, unchecked((long) 0x1F70D0C84D54E503L) /* 995 */,
- unchecked((long) 0x5490ADEC7ECE57D4L) /* 996 */, unchecked((long) 0x002B3C27D9063A3AL) /* 997 */,
- unchecked((long) 0x7EAEA3848030A2BFL) /* 998 */, unchecked((long) 0xC602326DED2003C0L) /* 999 */,
- unchecked((long) 0x83A7287D69A94086L) /* 1000 */, unchecked((long) 0xC57A5FCB30F57A8AL) /* 1001 */,
- unchecked((long) 0xB56844E479EBE779L) /* 1002 */, unchecked((long) 0xA373B40F05DCBCE9L) /* 1003 */,
- unchecked((long) 0xD71A786E88570EE2L) /* 1004 */, unchecked((long) 0x879CBACDBDE8F6A0L) /* 1005 */,
- unchecked((long) 0x976AD1BCC164A32FL) /* 1006 */, unchecked((long) 0xAB21E25E9666D78BL) /* 1007 */,
- unchecked((long) 0x901063AAE5E5C33CL) /* 1008 */, unchecked((long) 0x9818B34448698D90L) /* 1009 */,
- unchecked((long) 0xE36487AE3E1E8ABBL) /* 1010 */, unchecked((long) 0xAFBDF931893BDCB4L) /* 1011 */,
- unchecked((long) 0x6345A0DC5FBBD519L) /* 1012 */, unchecked((long) 0x8628FE269B9465CAL) /* 1013 */,
- unchecked((long) 0x1E5D01603F9C51ECL) /* 1014 */, unchecked((long) 0x4DE44006A15049B7L) /* 1015 */,
- unchecked((long) 0xBF6C70E5F776CBB1L) /* 1016 */, unchecked((long) 0x411218F2EF552BEDL) /* 1017 */,
- unchecked((long) 0xCB0C0708705A36A3L) /* 1018 */, unchecked((long) 0xE74D14754F986044L) /* 1019 */,
- unchecked((long) 0xCD56D9430EA8280EL) /* 1020 */, unchecked((long) 0xC12591D7535F5065L) /* 1021 */,
- unchecked((long) 0xC83223F1720AEF96L) /* 1022 */, unchecked((long) 0xC3A0396F7363A51FL) /* 1023 */
- };
-
- private const int DigestLength = 24;
-
- //
- // registers
- //
- private long a, b, c;
- private long byteCount;
-
- //
- // buffers
- //
- private byte[] Buffer = new byte[8];
- private int bOff;
-
- private long[] x = new long[8];
- private int xOff;
-
- /**
- * Standard constructor
- */
- public TigerDigest()
- {
- Reset();
- }
-
- /**
- * Copy constructor. This will copy the state of the provided
- * message digest.
- */
- public TigerDigest(TigerDigest t)
- {
- Reset(t);
- }
-
- public string AlgorithmName
- {
- get { return "Tiger"; }
- }
-
- public int GetDigestSize()
- {
- return DigestLength;
- }
-
- public int GetByteLength()
- {
- return MyByteLength;
- }
-
- private void ProcessWord(
- byte[] b,
- int off)
- {
- x[xOff++] = ((long)(b[off + 7] & 0xff) << 56)
- | ((long)(b[off + 6] & 0xff) << 48)
- | ((long)(b[off + 5] & 0xff) << 40)
- | ((long)(b[off + 4] & 0xff) << 32)
- | ((long)(b[off + 3] & 0xff) << 24)
- | ((long)(b[off + 2] & 0xff) << 16)
- | ((long)(b[off + 1] & 0xff) << 8)
- | ((uint)(b[off + 0] & 0xff));
-
- if (xOff == x.Length)
- {
- ProcessBlock();
- }
-
- bOff = 0;
- }
-
- public void Update(
- byte input)
- {
- Buffer[bOff++] = input;
-
- if (bOff == Buffer.Length)
- {
- ProcessWord(Buffer, 0);
- }
-
- byteCount++;
- }
-
- public void BlockUpdate(
- byte[] input,
- int inOff,
- int length)
- {
- //
- // fill the current word
- //
- while ((bOff != 0) && (length > 0))
- {
- Update(input[inOff]);
-
- inOff++;
- length--;
- }
-
- //
- // process whole words.
- //
- while (length > 8)
- {
- ProcessWord(input, inOff);
-
- inOff += 8;
- length -= 8;
- byteCount += 8;
- }
-
- //
- // load in the remainder.
- //
- while (length > 0)
- {
- Update(input[inOff]);
-
- inOff++;
- length--;
- }
- }
-
- private void RoundABC(
- long x,
- long mul)
- {
- c ^= x ;
- a -= t1[(int)c & 0xff] ^ t2[(int)(c >> 16) & 0xff]
- ^ t3[(int)(c >> 32) & 0xff] ^ t4[(int)(c >> 48) & 0xff];
- b += t4[(int)(c >> 8) & 0xff] ^ t3[(int)(c >> 24) & 0xff]
- ^ t2[(int)(c >> 40) & 0xff] ^ t1[(int)(c >> 56) & 0xff];
- b *= mul;
- }
-
- private void RoundBCA(
- long x,
- long mul)
- {
- a ^= x ;
- b -= t1[(int)a & 0xff] ^ t2[(int)(a >> 16) & 0xff]
- ^ t3[(int)(a >> 32) & 0xff] ^ t4[(int)(a >> 48) & 0xff];
- c += t4[(int)(a >> 8) & 0xff] ^ t3[(int)(a >> 24) & 0xff]
- ^ t2[(int)(a >> 40) & 0xff] ^ t1[(int)(a >> 56) & 0xff];
- c *= mul;
- }
-
- private void RoundCAB(
- long x,
- long mul)
- {
- b ^= x ;
- c -= t1[(int)b & 0xff] ^ t2[(int)(b >> 16) & 0xff]
- ^ t3[(int)(b >> 32) & 0xff] ^ t4[(int)(b >> 48) & 0xff];
- a += t4[(int)(b >> 8) & 0xff] ^ t3[(int)(b >> 24) & 0xff]
- ^ t2[(int)(b >> 40) & 0xff] ^ t1[(int)(b >> 56) & 0xff];
- a *= mul;
- }
-
- private void KeySchedule()
- {
- x[0] -= x[7] ^ unchecked ((long) 0xA5A5A5A5A5A5A5A5L);
- x[1] ^= x[0];
- x[2] += x[1];
- x[3] -= x[2] ^ ((~x[1]) << 19);
- x[4] ^= x[3];
- x[5] += x[4];
- x[6] -= x[5] ^ (long) ((ulong) (~x[4]) >> 23);
- x[7] ^= x[6];
- x[0] += x[7];
- x[1] -= x[0] ^ ((~x[7]) << 19);
- x[2] ^= x[1];
- x[3] += x[2];
- x[4] -= x[3] ^ (long) ((ulong) (~x[2]) >> 23);
- x[5] ^= x[4];
- x[6] += x[5];
- x[7] -= x[6] ^ 0x0123456789ABCDEFL;
- }
-
- private void ProcessBlock()
- {
- //
- // save abc
- //
- long aa = a;
- long bb = b;
- long cc = c;
-
- //
- // rounds and schedule
- //
- RoundABC(x[0], 5);
- RoundBCA(x[1], 5);
- RoundCAB(x[2], 5);
- RoundABC(x[3], 5);
- RoundBCA(x[4], 5);
- RoundCAB(x[5], 5);
- RoundABC(x[6], 5);
- RoundBCA(x[7], 5);
-
- KeySchedule();
-
- RoundCAB(x[0], 7);
- RoundABC(x[1], 7);
- RoundBCA(x[2], 7);
- RoundCAB(x[3], 7);
- RoundABC(x[4], 7);
- RoundBCA(x[5], 7);
- RoundCAB(x[6], 7);
- RoundABC(x[7], 7);
-
- KeySchedule();
-
- RoundBCA(x[0], 9);
- RoundCAB(x[1], 9);
- RoundABC(x[2], 9);
- RoundBCA(x[3], 9);
- RoundCAB(x[4], 9);
- RoundABC(x[5], 9);
- RoundBCA(x[6], 9);
- RoundCAB(x[7], 9);
-
- //
- // feed forward
- //
- a ^= aa;
- b -= bb;
- c += cc;
-
- //
- // clear the x buffer
- //
- xOff = 0;
- for (int i = 0; i != x.Length; i++)
- {
- x[i] = 0;
- }
- }
-
- private void UnpackWord(
- long r,
- byte[] output,
- int outOff)
- {
- output[outOff + 7] = (byte)(r >> 56);
- output[outOff + 6] = (byte)(r >> 48);
- output[outOff + 5] = (byte)(r >> 40);
- output[outOff + 4] = (byte)(r >> 32);
- output[outOff + 3] = (byte)(r >> 24);
- output[outOff + 2] = (byte)(r >> 16);
- output[outOff + 1] = (byte)(r >> 8);
- output[outOff] = (byte)r;
- }
-
- private void ProcessLength(
- long bitLength)
- {
- x[7] = bitLength;
- }
-
- private void Finish()
- {
- long bitLength = (byteCount << 3);
-
- Update((byte)0x01);
-
- while (bOff != 0)
- {
- Update((byte)0);
- }
-
- ProcessLength(bitLength);
-
- ProcessBlock();
- }
-
- public int DoFinal(
- byte[] output,
- int outOff)
- {
- Finish();
-
- UnpackWord(a, output, outOff);
- UnpackWord(b, output, outOff + 8);
- UnpackWord(c, output, outOff + 16);
-
- Reset();
-
- return DigestLength;
- }
-
- /**
- * reset the chaining variables
- */
- public void Reset()
- {
- a = unchecked((long) 0x0123456789ABCDEFL);
- b = unchecked((long) 0xFEDCBA9876543210L);
- c = unchecked((long) 0xF096A5B4C3B2E187L);
-
- xOff = 0;
- for (int i = 0; i != x.Length; i++)
- {
- x[i] = 0;
- }
-
- bOff = 0;
- for (int i = 0; i != Buffer.Length; i++)
- {
- Buffer[i] = 0;
- }
-
- byteCount = 0;
- }
-
- public IMemoable Copy()
- {
- return new TigerDigest(this);
- }
-
- public void Reset(IMemoable other)
- {
- TigerDigest t = (TigerDigest)other;
-
- a = t.a;
- b = t.b;
- c = t.c;
-
- Array.Copy(t.x, 0, x, 0, t.x.Length);
- xOff = t.xOff;
-
- Array.Copy(t.Buffer, 0, Buffer, 0, t.Buffer.Length);
- bOff = t.bOff;
-
- byteCount = t.byteCount;
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/digests/WhirlpoolDigest.cs b/BCCrypto/src/crypto/digests/WhirlpoolDigest.cs
deleted file mode 100644
index 55b7120..0000000
--- a/BCCrypto/src/crypto/digests/WhirlpoolDigest.cs
+++ /dev/null
@@ -1,413 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Digests
-{
- /**
- * Implementation of WhirlpoolDigest, based on Java source published by Barreto
- * and Rijmen.
- *
- */
- public sealed class WhirlpoolDigest
- : IDigest, IMemoable
- {
- private const int BYTE_LENGTH = 64;
-
- private const int DIGEST_LENGTH_BYTES = 512 / 8;
- private const int ROUNDS = 10;
- private const int REDUCTION_POLYNOMIAL = 0x011d; // 2^8 + 2^4 + 2^3 + 2 + 1;
-
- private static readonly int[] SBOX =
- {
- 0x18, 0x23, 0xc6, 0xe8, 0x87, 0xb8, 0x01, 0x4f, 0x36, 0xa6, 0xd2, 0xf5, 0x79, 0x6f, 0x91, 0x52,
- 0x60, 0xbc, 0x9b, 0x8e, 0xa3, 0x0c, 0x7b, 0x35, 0x1d, 0xe0, 0xd7, 0xc2, 0x2e, 0x4b, 0xfe, 0x57,
- 0x15, 0x77, 0x37, 0xe5, 0x9f, 0xf0, 0x4a, 0xda, 0x58, 0xc9, 0x29, 0x0a, 0xb1, 0xa0, 0x6b, 0x85,
- 0xbd, 0x5d, 0x10, 0xf4, 0xcb, 0x3e, 0x05, 0x67, 0xe4, 0x27, 0x41, 0x8b, 0xa7, 0x7d, 0x95, 0xd8,
- 0xfb, 0xee, 0x7c, 0x66, 0xdd, 0x17, 0x47, 0x9e, 0xca, 0x2d, 0xbf, 0x07, 0xad, 0x5a, 0x83, 0x33,
- 0x63, 0x02, 0xaa, 0x71, 0xc8, 0x19, 0x49, 0xd9, 0xf2, 0xe3, 0x5b, 0x88, 0x9a, 0x26, 0x32, 0xb0,
- 0xe9, 0x0f, 0xd5, 0x80, 0xbe, 0xcd, 0x34, 0x48, 0xff, 0x7a, 0x90, 0x5f, 0x20, 0x68, 0x1a, 0xae,
- 0xb4, 0x54, 0x93, 0x22, 0x64, 0xf1, 0x73, 0x12, 0x40, 0x08, 0xc3, 0xec, 0xdb, 0xa1, 0x8d, 0x3d,
- 0x97, 0x00, 0xcf, 0x2b, 0x76, 0x82, 0xd6, 0x1b, 0xb5, 0xaf, 0x6a, 0x50, 0x45, 0xf3, 0x30, 0xef,
- 0x3f, 0x55, 0xa2, 0xea, 0x65, 0xba, 0x2f, 0xc0, 0xde, 0x1c, 0xfd, 0x4d, 0x92, 0x75, 0x06, 0x8a,
- 0xb2, 0xe6, 0x0e, 0x1f, 0x62, 0xd4, 0xa8, 0x96, 0xf9, 0xc5, 0x25, 0x59, 0x84, 0x72, 0x39, 0x4c,
- 0x5e, 0x78, 0x38, 0x8c, 0xd1, 0xa5, 0xe2, 0x61, 0xb3, 0x21, 0x9c, 0x1e, 0x43, 0xc7, 0xfc, 0x04,
- 0x51, 0x99, 0x6d, 0x0d, 0xfa, 0xdf, 0x7e, 0x24, 0x3b, 0xab, 0xce, 0x11, 0x8f, 0x4e, 0xb7, 0xeb,
- 0x3c, 0x81, 0x94, 0xf7, 0xb9, 0x13, 0x2c, 0xd3, 0xe7, 0x6e, 0xc4, 0x03, 0x56, 0x44, 0x7f, 0xa9,
- 0x2a, 0xbb, 0xc1, 0x53, 0xdc, 0x0b, 0x9d, 0x6c, 0x31, 0x74, 0xf6, 0x46, 0xac, 0x89, 0x14, 0xe1,
- 0x16, 0x3a, 0x69, 0x09, 0x70, 0xb6, 0xd0, 0xed, 0xcc, 0x42, 0x98, 0xa4, 0x28, 0x5c, 0xf8, 0x86
- };
-
- private static readonly long[] C0 = new long[256];
- private static readonly long[] C1 = new long[256];
- private static readonly long[] C2 = new long[256];
- private static readonly long[] C3 = new long[256];
- private static readonly long[] C4 = new long[256];
- private static readonly long[] C5 = new long[256];
- private static readonly long[] C6 = new long[256];
- private static readonly long[] C7 = new long[256];
-
- private readonly long[] _rc = new long[ROUNDS + 1];
-
- /*
- * increment() can be implemented in this way using 2 arrays or
- * by having some temporary variables that are used to set the
- * value provided by EIGHT[i] and carry within the loop.
- *
- * not having done any timing, this seems likely to be faster
- * at the slight expense of 32*(sizeof short) bytes
- */
- private static readonly short[] EIGHT = new short[BITCOUNT_ARRAY_SIZE];
-
- static WhirlpoolDigest()
- {
- EIGHT[BITCOUNT_ARRAY_SIZE - 1] = 8;
-
- for (int i = 0; i < 256; i++)
- {
- int v1 = SBOX[i];
- int v2 = maskWithReductionPolynomial(v1 << 1);
- int v4 = maskWithReductionPolynomial(v2 << 1);
- int v5 = v4 ^ v1;
- int v8 = maskWithReductionPolynomial(v4 << 1);
- int v9 = v8 ^ v1;
-
- C0[i] = packIntoLong(v1, v1, v4, v1, v8, v5, v2, v9);
- C1[i] = packIntoLong(v9, v1, v1, v4, v1, v8, v5, v2);
- C2[i] = packIntoLong(v2, v9, v1, v1, v4, v1, v8, v5);
- C3[i] = packIntoLong(v5, v2, v9, v1, v1, v4, v1, v8);
- C4[i] = packIntoLong(v8, v5, v2, v9, v1, v1, v4, v1);
- C5[i] = packIntoLong(v1, v8, v5, v2, v9, v1, v1, v4);
- C6[i] = packIntoLong(v4, v1, v8, v5, v2, v9, v1, v1);
- C7[i] = packIntoLong(v1, v4, v1, v8, v5, v2, v9, v1);
- }
- }
-
- public WhirlpoolDigest()
- {
- _rc[0] = 0L;
- for (int r = 1; r <= ROUNDS; r++)
- {
- int i = 8 * (r - 1);
- _rc[r] = (long)((ulong)C0[i] & 0xff00000000000000L) ^
- (C1[i + 1] & (long) 0x00ff000000000000L) ^
- (C2[i + 2] & (long) 0x0000ff0000000000L) ^
- (C3[i + 3] & (long) 0x000000ff00000000L) ^
- (C4[i + 4] & (long) 0x00000000ff000000L) ^
- (C5[i + 5] & (long) 0x0000000000ff0000L) ^
- (C6[i + 6] & (long) 0x000000000000ff00L) ^
- (C7[i + 7] & (long) 0x00000000000000ffL);
- }
- }
-
- private static long packIntoLong(int b7, int b6, int b5, int b4, int b3, int b2, int b1, int b0)
- {
- return
- ((long)b7 << 56) ^
- ((long)b6 << 48) ^
- ((long)b5 << 40) ^
- ((long)b4 << 32) ^
- ((long)b3 << 24) ^
- ((long)b2 << 16) ^
- ((long)b1 << 8) ^
- b0;
- }
-
- /*
- * int's are used to prevent sign extension. The values that are really being used are
- * actually just 0..255
- */
- private static int maskWithReductionPolynomial(int input)
- {
- int rv = input;
- if (rv >= 0x100L) // high bit set
- {
- rv ^= REDUCTION_POLYNOMIAL; // reduced by the polynomial
- }
- return rv;
- }
-
- // --------------------------------------------------------------------------------------//
-
- // -- buffer information --
- private const int BITCOUNT_ARRAY_SIZE = 32;
- private byte[] _buffer = new byte[64];
- private int _bufferPos;
- private short[] _bitCount = new short[BITCOUNT_ARRAY_SIZE];
-
- // -- internal hash state --
- private long[] _hash = new long[8];
- private long[] _K = new long[8]; // the round key
- private long[] _L = new long[8];
- private long[] _block = new long[8]; // mu (buffer)
- private long[] _state = new long[8]; // the current "cipher" state
-
-
-
- /**
- * Copy constructor. This will copy the state of the provided message
- * digest.
- */
- public WhirlpoolDigest(WhirlpoolDigest originalDigest)
- {
- Reset(originalDigest);
- }
-
- public string AlgorithmName
- {
- get { return "Whirlpool"; }
- }
-
- public int GetDigestSize()
- {
- return DIGEST_LENGTH_BYTES;
- }
-
- public int DoFinal(byte[] output, int outOff)
- {
- // sets output[outOff] .. output[outOff+DIGEST_LENGTH_BYTES]
- finish();
-
- for (int i = 0; i < 8; i++)
- {
- convertLongToByteArray(_hash[i], output, outOff + (i * 8));
- }
-
- Reset();
-
- return GetDigestSize();
- }
-
- /**
- * Reset the chaining variables
- */
- public void Reset()
- {
- // set variables to null, blank, whatever
- _bufferPos = 0;
- Array.Clear(_bitCount, 0, _bitCount.Length);
- Array.Clear(_buffer, 0, _buffer.Length);
- Array.Clear(_hash, 0, _hash.Length);
- Array.Clear(_K, 0, _K.Length);
- Array.Clear(_L, 0, _L.Length);
- Array.Clear(_block, 0, _block.Length);
- Array.Clear(_state, 0, _state.Length);
- }
-
- // this takes a buffer of information and fills the block
- private void processFilledBuffer()
- {
- // copies into the block...
- for (int i = 0; i < _state.Length; i++)
- {
- _block[i] = bytesToLongFromBuffer(_buffer, i * 8);
- }
- processBlock();
- _bufferPos = 0;
- Array.Clear(_buffer, 0, _buffer.Length);
- }
-
- private static long bytesToLongFromBuffer(byte[] buffer, int startPos)
- {
- long rv = (((buffer[startPos + 0] & 0xffL) << 56) |
- ((buffer[startPos + 1] & 0xffL) << 48) |
- ((buffer[startPos + 2] & 0xffL) << 40) |
- ((buffer[startPos + 3] & 0xffL) << 32) |
- ((buffer[startPos + 4] & 0xffL) << 24) |
- ((buffer[startPos + 5] & 0xffL) << 16) |
- ((buffer[startPos + 6] & 0xffL) << 8) |
- ((buffer[startPos + 7]) & 0xffL));
-
- return rv;
- }
-
- private static void convertLongToByteArray(long inputLong, byte[] outputArray, int offSet)
- {
- for (int i = 0; i < 8; i++)
- {
- outputArray[offSet + i] = (byte)((inputLong >> (56 - (i * 8))) & 0xff);
- }
- }
-
- private void processBlock()
- {
- // buffer contents have been transferred to the _block[] array via
- // processFilledBuffer
-
- // compute and apply K^0
- for (int i = 0; i < 8; i++)
- {
- _state[i] = _block[i] ^ (_K[i] = _hash[i]);
- }
-
- // iterate over the rounds
- for (int round = 1; round <= ROUNDS; round++)
- {
- for (int i = 0; i < 8; i++)
- {
- _L[i] = 0;
- _L[i] ^= C0[(int)(_K[(i - 0) & 7] >> 56) & 0xff];
- _L[i] ^= C1[(int)(_K[(i - 1) & 7] >> 48) & 0xff];
- _L[i] ^= C2[(int)(_K[(i - 2) & 7] >> 40) & 0xff];
- _L[i] ^= C3[(int)(_K[(i - 3) & 7] >> 32) & 0xff];
- _L[i] ^= C4[(int)(_K[(i - 4) & 7] >> 24) & 0xff];
- _L[i] ^= C5[(int)(_K[(i - 5) & 7] >> 16) & 0xff];
- _L[i] ^= C6[(int)(_K[(i - 6) & 7] >> 8) & 0xff];
- _L[i] ^= C7[(int)(_K[(i - 7) & 7]) & 0xff];
- }
-
- Array.Copy(_L, 0, _K, 0, _K.Length);
-
- _K[0] ^= _rc[round];
-
- // apply the round transformation
- for (int i = 0; i < 8; i++)
- {
- _L[i] = _K[i];
-
- _L[i] ^= C0[(int)(_state[(i - 0) & 7] >> 56) & 0xff];
- _L[i] ^= C1[(int)(_state[(i - 1) & 7] >> 48) & 0xff];
- _L[i] ^= C2[(int)(_state[(i - 2) & 7] >> 40) & 0xff];
- _L[i] ^= C3[(int)(_state[(i - 3) & 7] >> 32) & 0xff];
- _L[i] ^= C4[(int)(_state[(i - 4) & 7] >> 24) & 0xff];
- _L[i] ^= C5[(int)(_state[(i - 5) & 7] >> 16) & 0xff];
- _L[i] ^= C6[(int)(_state[(i - 6) & 7] >> 8) & 0xff];
- _L[i] ^= C7[(int)(_state[(i - 7) & 7]) & 0xff];
- }
-
- // save the current state
- Array.Copy(_L, 0, _state, 0, _state.Length);
- }
-
- // apply Miuaguchi-Preneel compression
- for (int i = 0; i < 8; i++)
- {
- _hash[i] ^= _state[i] ^ _block[i];
- }
-
- }
-
- public void Update(byte input)
- {
- _buffer[_bufferPos] = input;
-
- //Console.WriteLine("adding to buffer = "+_buffer[_bufferPos]);
-
- ++_bufferPos;
-
- if (_bufferPos == _buffer.Length)
- {
- processFilledBuffer();
- }
-
- increment();
- }
-
- private void increment()
- {
- int carry = 0;
- for (int i = _bitCount.Length - 1; i >= 0; i--)
- {
- int sum = (_bitCount[i] & 0xff) + EIGHT[i] + carry;
-
- carry = sum >> 8;
- _bitCount[i] = (short)(sum & 0xff);
- }
- }
-
- public void BlockUpdate(byte[] input, int inOff, int length)
- {
- while (length > 0)
- {
- Update(input[inOff]);
- ++inOff;
- --length;
- }
-
- }
-
- private void finish()
- {
- /*
- * this makes a copy of the current bit length. at the expense of an
- * object creation of 32 bytes rather than providing a _stopCounting
- * boolean which was the alternative I could think of.
- */
- byte[] bitLength = copyBitLength();
-
- _buffer[_bufferPos++] |= 0x80;
-
- if (_bufferPos == _buffer.Length)
- {
- processFilledBuffer();
- }
-
- /*
- * Final block contains
- * [ ... data .... ][0][0][0][ length ]
- *
- * if [ length ] cannot fit. Need to create a new block.
- */
- if (_bufferPos > 32)
- {
- while (_bufferPos != 0)
- {
- Update((byte)0);
- }
- }
-
- while (_bufferPos <= 32)
- {
- Update((byte)0);
- }
-
- // copy the length information to the final 32 bytes of the
- // 64 byte block....
- Array.Copy(bitLength, 0, _buffer, 32, bitLength.Length);
-
- processFilledBuffer();
- }
-
- private byte[] copyBitLength()
- {
- byte[] rv = new byte[BITCOUNT_ARRAY_SIZE];
- for (int i = 0; i < rv.Length; i++)
- {
- rv[i] = (byte)(_bitCount[i] & 0xff);
- }
- return rv;
- }
-
- public int GetByteLength()
- {
- return BYTE_LENGTH;
- }
-
- public IMemoable Copy()
- {
- return new WhirlpoolDigest(this);
- }
-
- public void Reset(IMemoable other)
- {
- WhirlpoolDigest originalDigest = (WhirlpoolDigest)other;
-
- Array.Copy(originalDigest._rc, 0, _rc, 0, _rc.Length);
-
- Array.Copy(originalDigest._buffer, 0, _buffer, 0, _buffer.Length);
-
- this._bufferPos = originalDigest._bufferPos;
- Array.Copy(originalDigest._bitCount, 0, _bitCount, 0, _bitCount.Length);
-
- // -- internal hash state --
- Array.Copy(originalDigest._hash, 0, _hash, 0, _hash.Length);
- Array.Copy(originalDigest._K, 0, _K, 0, _K.Length);
- Array.Copy(originalDigest._L, 0, _L, 0, _L.Length);
- Array.Copy(originalDigest._block, 0, _block, 0, _block.Length);
- Array.Copy(originalDigest._state, 0, _state, 0, _state.Length);
- }
-
-
- }
-}
diff --git a/BCCrypto/src/crypto/ec/CustomNamedCurves.cs b/BCCrypto/src/crypto/ec/CustomNamedCurves.cs
deleted file mode 100644
index 4b7600e..0000000
--- a/BCCrypto/src/crypto/ec/CustomNamedCurves.cs
+++ /dev/null
@@ -1,913 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.GM;
-using Org.BouncyCastle.Asn1.Sec;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Math.EC.Custom.Djb;
-using Org.BouncyCastle.Math.EC.Custom.GM;
-using Org.BouncyCastle.Math.EC.Custom.Sec;
-using Org.BouncyCastle.Math.EC.Endo;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Crypto.EC
-{
- public sealed class CustomNamedCurves
- {
- private CustomNamedCurves()
- {
- }
-
- private static BigInteger FromHex(string hex)
- {
- return new BigInteger(1, Hex.Decode(hex));
- }
-
- private static ECCurve ConfigureCurve(ECCurve curve)
- {
- return curve;
- }
-
- private static ECCurve ConfigureCurveGlv(ECCurve c, GlvTypeBParameters p)
- {
- return c.Configure().SetEndomorphism(new GlvTypeBEndomorphism(c, p)).Create();
- }
-
- /*
- * curve25519
- */
- internal class Curve25519Holder
- : X9ECParametersHolder
- {
- private Curve25519Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new Curve25519Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = null;
- ECCurve curve = ConfigureCurve(new Curve25519());
-
- /*
- * NOTE: Curve25519 was specified in Montgomery form. Rewriting in Weierstrass form
- * involves substitution of variables, so the base-point x coordinate is 9 + (486662 / 3).
- *
- * The Curve25519 paper doesn't say which of the two possible y values the base
- * point has. The choice here is guided by language in the Ed25519 paper.
- *
- * (The other possible y value is 5F51E65E475F794B1FE122D388B72EB36DC2B28192839E4DD6163A5D81312C14)
- */
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD245A"
- + "20AE19A1B8A086B4E01EDD2C7748D14C923D4D7E6D7C61B229E9C5A27ECED3D9"));
-
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- }
-
- /*
- * secp128r1
- */
- internal class SecP128R1Holder
- : X9ECParametersHolder
- {
- private SecP128R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecP128R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("000E0D4D696E6768756151750CC03A4473D03679");
- ECCurve curve = ConfigureCurve(new SecP128R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "161FF7528B899B2D0C28607CA52C5B86"
- + "CF5AC8395BAFEB13C02DA292DDED7A83"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * secp160k1
- */
- internal class SecP160K1Holder
- : X9ECParametersHolder
- {
- private SecP160K1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecP160K1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = null;
- GlvTypeBParameters glv = new GlvTypeBParameters(
- new BigInteger("9ba48cba5ebcb9b6bd33b92830b2a2e0e192f10a", 16),
- new BigInteger("c39c6c3b3a36d7701b9c71a1f5804ae5d0003f4", 16),
- new BigInteger[]{
- new BigInteger("9162fbe73984472a0a9e", 16),
- new BigInteger("-96341f1138933bc2f505", 16) },
- new BigInteger[]{
- new BigInteger("127971af8721782ecffa3", 16),
- new BigInteger("9162fbe73984472a0a9e", 16) },
- new BigInteger("9162fbe73984472a0a9d0590", 16),
- new BigInteger("96341f1138933bc2f503fd44", 16),
- 176);
- ECCurve curve = ConfigureCurveGlv(new SecP160K1Curve(), glv);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB"
- + "938CF935318FDCED6BC28286531733C3F03C4FEE"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * secp160r1
- */
- internal class SecP160R1Holder
- : X9ECParametersHolder
- {
- private SecP160R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecP160R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("1053CDE42C14D696E67687561517533BF3F83345");
- ECCurve curve = ConfigureCurve(new SecP160R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "4A96B5688EF573284664698968C38BB913CBFC82"
- + "23A628553168947D59DCC912042351377AC5FB32"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * secp160r2
- */
- internal class SecP160R2Holder
- : X9ECParametersHolder
- {
- private SecP160R2Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecP160R2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("B99B99B099B323E02709A4D696E6768756151751");
- ECCurve curve = ConfigureCurve(new SecP160R2Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "52DCB034293A117E1F4FF11B30F7199D3144CE6D"
- + "FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * secp192k1
- */
- internal class SecP192K1Holder
- : X9ECParametersHolder
- {
- private SecP192K1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecP192K1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = null;
- GlvTypeBParameters glv = new GlvTypeBParameters(
- new BigInteger("bb85691939b869c1d087f601554b96b80cb4f55b35f433c2", 16),
- new BigInteger("3d84f26c12238d7b4f3d516613c1759033b1a5800175d0b1", 16),
- new BigInteger[]{
- new BigInteger("71169be7330b3038edb025f1", 16),
- new BigInteger("-b3fb3400dec5c4adceb8655c", 16) },
- new BigInteger[]{
- new BigInteger("12511cfe811d0f4e6bc688b4d", 16),
- new BigInteger("71169be7330b3038edb025f1", 16) },
- new BigInteger("71169be7330b3038edb025f1d0f9", 16),
- new BigInteger("b3fb3400dec5c4adceb8655d4c94", 16),
- 208);
- ECCurve curve = ConfigureCurveGlv(new SecP192K1Curve(), glv);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D"
- + "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- }
-
- /*
- * secp192r1
- */
- internal class SecP192R1Holder
- : X9ECParametersHolder
- {
- private SecP192R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecP192R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("3045AE6FC8422F64ED579528D38120EAE12196D5");
- ECCurve curve = ConfigureCurve(new SecP192R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012"
- + "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- }
-
- /*
- * secp224k1
- */
- internal class SecP224K1Holder
- : X9ECParametersHolder
- {
- private SecP224K1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecP224K1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = null;
- GlvTypeBParameters glv = new GlvTypeBParameters(
- new BigInteger("fe0e87005b4e83761908c5131d552a850b3f58b749c37cf5b84d6768", 16),
- new BigInteger("60dcd2104c4cbc0be6eeefc2bdd610739ec34e317f9b33046c9e4788", 16),
- new BigInteger[]{
- new BigInteger("6b8cf07d4ca75c88957d9d670591", 16),
- new BigInteger("-b8adf1378a6eb73409fa6c9c637d", 16) },
- new BigInteger[]{
- new BigInteger("1243ae1b4d71613bc9f780a03690e", 16),
- new BigInteger("6b8cf07d4ca75c88957d9d670591", 16) },
- new BigInteger("6b8cf07d4ca75c88957d9d67059037a4", 16),
- new BigInteger("b8adf1378a6eb73409fa6c9c637ba7f5", 16),
- 240);
- ECCurve curve = ConfigureCurveGlv(new SecP224K1Curve(), glv);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C"
- + "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- }
-
- /*
- * secp224r1
- */
- internal class SecP224R1Holder
- : X9ECParametersHolder
- {
- private SecP224R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecP224R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("BD71344799D5C7FCDC45B59FA3B9AB8F6A948BC5");
- ECCurve curve = ConfigureCurve(new SecP224R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21"
- + "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- }
-
- /*
- * secp256k1
- */
- internal class SecP256K1Holder
- : X9ECParametersHolder
- {
- private SecP256K1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new SecP256K1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = null;
- GlvTypeBParameters glv = new GlvTypeBParameters(
- new BigInteger("7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee", 16),
- new BigInteger("5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72", 16),
- new BigInteger[]{
- new BigInteger("3086d221a7d46bcde86c90e49284eb15", 16),
- new BigInteger("-e4437ed6010e88286f547fa90abfe4c3", 16) },
- new BigInteger[]{
- new BigInteger("114ca50f7a8e2f3f657c1108d9d44cfd8", 16),
- new BigInteger("3086d221a7d46bcde86c90e49284eb15", 16) },
- new BigInteger("3086d221a7d46bcde86c90e49284eb153dab", 16),
- new BigInteger("e4437ed6010e88286f547fa90abfe4c42212", 16),
- 272);
- ECCurve curve = ConfigureCurveGlv(new SecP256K1Curve(), glv);
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"
- + "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- }
-
- /*
- * secp256r1
- */
- internal class SecP256R1Holder
- : X9ECParametersHolder
- {
- private SecP256R1Holder() {}
-
- internal static readonly X9ECParametersHolder Instance = new SecP256R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("C49D360886E704936A6678E1139D26B7819F7E90");
- ECCurve curve = ConfigureCurve(new SecP256R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"
- + "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- }
-
- /*
- * secp384r1
- */
- internal class SecP384R1Holder
- : X9ECParametersHolder
- {
- private SecP384R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecP384R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("A335926AA319A27A1D00896A6773A4827ACDAC73");
- ECCurve curve = ConfigureCurve(new SecP384R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7"
- + "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- }
-
- /*
- * secp521r1
- */
- internal class SecP521R1Holder
- : X9ECParametersHolder
- {
- private SecP521R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecP521R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("D09E8800291CB85396CC6717393284AAA0DA64BA");
- ECCurve curve = ConfigureCurve(new SecP521R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66"
- + "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- }
-
- /*
- * sect113r1
- */
- internal class SecT113R1Holder
- : X9ECParametersHolder
- {
- private SecT113R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT113R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("10E723AB14D696E6768756151756FEBF8FCB49A9");
- ECCurve curve = ConfigureCurve(new SecT113R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "009D73616F35F4AB1407D73562C10F"
- + "00A52830277958EE84D1315ED31886"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect113r2
- */
- internal class SecT113R2Holder
- : X9ECParametersHolder
- {
- private SecT113R2Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT113R2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("10C0FB15760860DEF1EEF4D696E676875615175D");
- ECCurve curve = ConfigureCurve(new SecT113R2Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "01A57A6A7B26CA5EF52FCDB8164797"
- + "00B3ADC94ED1FE674C06E695BABA1D"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect131r1
- */
- internal class SecT131R1Holder
- : X9ECParametersHolder
- {
- private SecT131R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT131R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("4D696E676875615175985BD3ADBADA21B43A97E2");
- ECCurve curve = ConfigureCurve(new SecT131R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "0081BAF91FDF9833C40F9C181343638399"
- + "078C6E7EA38C001F73C8134B1B4EF9E150"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect131r2
- */
- internal class SecT131R2Holder
- : X9ECParametersHolder
- {
- private SecT131R2Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT131R2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("985BD3ADBAD4D696E676875615175A21B43A97E3");
- ECCurve curve = ConfigureCurve(new SecT131R2Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "0356DCD8F2F95031AD652D23951BB366A8"
- + "0648F06D867940A5366D9E265DE9EB240F"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect163k1
- */
- internal class SecT163K1Holder
- : X9ECParametersHolder
- {
- private SecT163K1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT163K1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = null;
- ECCurve curve = ConfigureCurve(new SecT163K1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8"
- + "0289070FB05D38FF58321F2E800536D538CCDAA3D9"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect163r1
- */
- internal class SecT163R1Holder
- : X9ECParametersHolder
- {
- private SecT163R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT163R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("24B7B137C8A14D696E6768756151756FD0DA2E5C");
- ECCurve curve = ConfigureCurve(new SecT163R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "0369979697AB43897789566789567F787A7876A654"
- + "00435EDB42EFAFB2989D51FEFCE3C80988F41FF883"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect163r2
- */
- internal class SecT163R2Holder
- : X9ECParametersHolder
- {
- private SecT163R2Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT163R2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("85E25BFE5C86226CDB12016F7553F9D0E693A268");
- ECCurve curve = ConfigureCurve(new SecT163R2Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "03F0EBA16286A2D57EA0991168D4994637E8343E36"
- + "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect193r1
- */
- internal class SecT193R1Holder
- : X9ECParametersHolder
- {
- private SecT193R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT193R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("103FAEC74D696E676875615175777FC5B191EF30");
- ECCurve curve = ConfigureCurve(new SecT193R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1"
- + "0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect193r2
- */
- internal class SecT193R2Holder
- : X9ECParametersHolder
- {
- private SecT193R2Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT193R2Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("10B7B4D696E676875615175137C8A16FD0DA2211");
- ECCurve curve = ConfigureCurve(new SecT193R2Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F"
- + "01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect233k1
- */
- internal class SecT233K1Holder
- : X9ECParametersHolder
- {
- private SecT233K1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT233K1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = null;
- ECCurve curve = ConfigureCurve(new SecT233K1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126"
- + "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect233r1
- */
- internal class SecT233R1Holder
- : X9ECParametersHolder
- {
- private SecT233R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT233R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("74D59FF07F6B413D0EA14B344B20A2DB049B50C3");
- ECCurve curve = ConfigureCurve(new SecT233R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B"
- + "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect239k1
- */
- internal class SecT239K1Holder
- : X9ECParametersHolder
- {
- private SecT239K1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT239K1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = null;
- ECCurve curve = ConfigureCurve(new SecT239K1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC"
- + "76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect283k1
- */
- internal class SecT283K1Holder
- : X9ECParametersHolder
- {
- private SecT283K1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT283K1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = null;
- ECCurve curve = ConfigureCurve(new SecT283K1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836"
- + "01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect283r1
- */
- internal class SecT283R1Holder
- : X9ECParametersHolder
- {
- private SecT283R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT283R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("77E2B07370EB0F832A6DD5B62DFC88CD06BB84BE");
- ECCurve curve = ConfigureCurve(new SecT283R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053"
- + "03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect409k1
- */
- internal class SecT409K1Holder
- : X9ECParametersHolder
- {
- private SecT409K1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT409K1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = null;
- ECCurve curve = ConfigureCurve(new SecT409K1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746"
- + "01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect409r1
- */
- internal class SecT409R1Holder
- : X9ECParametersHolder
- {
- private SecT409R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT409R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("4099B5A457F9D69F79213D094C4BCD4D4262210B");
- ECCurve curve = ConfigureCurve(new SecT409R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7"
- + "0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect571k1
- */
- internal class SecT571K1Holder
- : X9ECParametersHolder
- {
- private SecT571K1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT571K1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = null;
- ECCurve curve = ConfigureCurve(new SecT571K1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972"
- + "0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sect571r1
- */
- internal class SecT571R1Holder
- : X9ECParametersHolder
- {
- private SecT571R1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SecT571R1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = Hex.Decode("2AA058F73A0E33AB486B0F610410C53A7F132310");
- ECCurve curve = ConfigureCurve(new SecT571R1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19"
- + "037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- };
-
- /*
- * sm2p256v1
- */
- internal class SM2P256V1Holder
- : X9ECParametersHolder
- {
- private SM2P256V1Holder() { }
-
- internal static readonly X9ECParametersHolder Instance = new SM2P256V1Holder();
-
- protected override X9ECParameters CreateParameters()
- {
- byte[] S = null;
- ECCurve curve = ConfigureCurve(new SM2P256V1Curve());
- X9ECPoint G = new X9ECPoint(curve, Hex.Decode("04"
- + "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7"
- + "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"));
- return new X9ECParameters(curve, G, curve.Order, curve.Cofactor, S);
- }
- }
-
-
- private static readonly IDictionary nameToCurve = Platform.CreateHashtable();
- private static readonly IDictionary nameToOid = Platform.CreateHashtable();
- private static readonly IDictionary oidToCurve = Platform.CreateHashtable();
- private static readonly IDictionary oidToName = Platform.CreateHashtable();
- private static readonly IList names = Platform.CreateArrayList();
-
- private static void DefineCurve(string name, X9ECParametersHolder holder)
- {
- names.Add(name);
- name = Platform.ToUpperInvariant(name);
- nameToCurve.Add(name, holder);
- }
-
- private static void DefineCurveWithOid(string name, DerObjectIdentifier oid, X9ECParametersHolder holder)
- {
- names.Add(name);
- oidToName.Add(oid, name);
- oidToCurve.Add(oid, holder);
- name = Platform.ToUpperInvariant(name);
- nameToOid.Add(name, oid);
- nameToCurve.Add(name, holder);
- }
-
- private static void DefineCurveAlias(string name, DerObjectIdentifier oid)
- {
- object curve = oidToCurve[oid];
- if (curve == null)
- throw new InvalidOperationException();
-
- name = Platform.ToUpperInvariant(name);
- nameToOid.Add(name, oid);
- nameToCurve.Add(name, curve);
- }
-
- static CustomNamedCurves()
- {
- DefineCurve("curve25519", Curve25519Holder.Instance);
-
- //DefineCurveWithOid("secp112r1", SecObjectIdentifiers.SecP112r1, SecP112R1Holder.Instance);
- //DefineCurveWithOid("secp112r2", SecObjectIdentifiers.SecP112r2, SecP112R2Holder.Instance);
- DefineCurveWithOid("secp128r1", SecObjectIdentifiers.SecP128r1, SecP128R1Holder.Instance);
- //DefineCurveWithOid("secp128r2", SecObjectIdentifiers.SecP128r2, SecP128R2Holder.Instance);
- DefineCurveWithOid("secp160k1", SecObjectIdentifiers.SecP160k1, SecP160K1Holder.Instance);
- DefineCurveWithOid("secp160r1", SecObjectIdentifiers.SecP160r1, SecP160R1Holder.Instance);
- DefineCurveWithOid("secp160r2", SecObjectIdentifiers.SecP160r2, SecP160R2Holder.Instance);
- DefineCurveWithOid("secp192k1", SecObjectIdentifiers.SecP192k1, SecP192K1Holder.Instance);
- DefineCurveWithOid("secp192r1", SecObjectIdentifiers.SecP192r1, SecP192R1Holder.Instance);
- DefineCurveWithOid("secp224k1", SecObjectIdentifiers.SecP224k1, SecP224K1Holder.Instance);
- DefineCurveWithOid("secp224r1", SecObjectIdentifiers.SecP224r1, SecP224R1Holder.Instance);
- DefineCurveWithOid("secp256k1", SecObjectIdentifiers.SecP256k1, SecP256K1Holder.Instance);
- DefineCurveWithOid("secp256r1", SecObjectIdentifiers.SecP256r1, SecP256R1Holder.Instance);
- DefineCurveWithOid("secp384r1", SecObjectIdentifiers.SecP384r1, SecP384R1Holder.Instance);
- DefineCurveWithOid("secp521r1", SecObjectIdentifiers.SecP521r1, SecP521R1Holder.Instance);
-
- DefineCurveWithOid("sect113r1", SecObjectIdentifiers.SecT113r1, SecT113R1Holder.Instance);
- DefineCurveWithOid("sect113r2", SecObjectIdentifiers.SecT113r2, SecT113R2Holder.Instance);
- DefineCurveWithOid("sect131r1", SecObjectIdentifiers.SecT131r1, SecT131R1Holder.Instance);
- DefineCurveWithOid("sect131r2", SecObjectIdentifiers.SecT131r2, SecT131R2Holder.Instance);
- DefineCurveWithOid("sect163k1", SecObjectIdentifiers.SecT163k1, SecT163K1Holder.Instance);
- DefineCurveWithOid("sect163r1", SecObjectIdentifiers.SecT163r1, SecT163R1Holder.Instance);
- DefineCurveWithOid("sect163r2", SecObjectIdentifiers.SecT163r2, SecT163R2Holder.Instance);
- DefineCurveWithOid("sect193r1", SecObjectIdentifiers.SecT193r1, SecT193R1Holder.Instance);
- DefineCurveWithOid("sect193r2", SecObjectIdentifiers.SecT193r2, SecT193R2Holder.Instance);
- DefineCurveWithOid("sect233k1", SecObjectIdentifiers.SecT233k1, SecT233K1Holder.Instance);
- DefineCurveWithOid("sect233r1", SecObjectIdentifiers.SecT233r1, SecT233R1Holder.Instance);
- DefineCurveWithOid("sect239k1", SecObjectIdentifiers.SecT239k1, SecT239K1Holder.Instance);
- DefineCurveWithOid("sect283k1", SecObjectIdentifiers.SecT283k1, SecT283K1Holder.Instance);
- DefineCurveWithOid("sect283r1", SecObjectIdentifiers.SecT283r1, SecT283R1Holder.Instance);
- DefineCurveWithOid("sect409k1", SecObjectIdentifiers.SecT409k1, SecT409K1Holder.Instance);
- DefineCurveWithOid("sect409r1", SecObjectIdentifiers.SecT409r1, SecT409R1Holder.Instance);
- DefineCurveWithOid("sect571k1", SecObjectIdentifiers.SecT571k1, SecT571K1Holder.Instance);
- DefineCurveWithOid("sect571r1", SecObjectIdentifiers.SecT571r1, SecT571R1Holder.Instance);
-
- DefineCurveWithOid("sm2p256v1", GMObjectIdentifiers.sm2p256v1, SM2P256V1Holder.Instance);
-
- DefineCurveAlias("B-163", SecObjectIdentifiers.SecT163r2);
- DefineCurveAlias("B-233", SecObjectIdentifiers.SecT233r1);
- DefineCurveAlias("B-283", SecObjectIdentifiers.SecT283r1);
- DefineCurveAlias("B-409", SecObjectIdentifiers.SecT409r1);
- DefineCurveAlias("B-571", SecObjectIdentifiers.SecT571r1);
-
- DefineCurveAlias("K-163", SecObjectIdentifiers.SecT163k1);
- DefineCurveAlias("K-233", SecObjectIdentifiers.SecT233k1);
- DefineCurveAlias("K-283", SecObjectIdentifiers.SecT283k1);
- DefineCurveAlias("K-409", SecObjectIdentifiers.SecT409k1);
- DefineCurveAlias("K-571", SecObjectIdentifiers.SecT571k1);
-
- DefineCurveAlias("P-192", SecObjectIdentifiers.SecP192r1);
- DefineCurveAlias("P-224", SecObjectIdentifiers.SecP224r1);
- DefineCurveAlias("P-256", SecObjectIdentifiers.SecP256r1);
- DefineCurveAlias("P-384", SecObjectIdentifiers.SecP384r1);
- DefineCurveAlias("P-521", SecObjectIdentifiers.SecP521r1);
- }
-
- public static X9ECParameters GetByName(string name)
- {
- X9ECParametersHolder holder = (X9ECParametersHolder)nameToCurve[Platform.ToUpperInvariant(name)];
- return holder == null ? null : holder.Parameters;
- }
-
- /**
- * return the X9ECParameters object for the named curve represented by
- * the passed in object identifier. Null if the curve isn't present.
- *
- * @param oid an object identifier representing a named curve, if present.
- */
- public static X9ECParameters GetByOid(DerObjectIdentifier oid)
- {
- X9ECParametersHolder holder = (X9ECParametersHolder)oidToCurve[oid];
- return holder == null ? null : holder.Parameters;
- }
-
- /**
- * return the object identifier signified by the passed in name. Null
- * if there is no object identifier associated with name.
- *
- * @return the object identifier associated with name, if present.
- */
- public static DerObjectIdentifier GetOid(string name)
- {
- return (DerObjectIdentifier)nameToOid[Platform.ToUpperInvariant(name)];
- }
-
- /**
- * return the named curve name represented by the given object identifier.
- */
- public static string GetName(DerObjectIdentifier oid)
- {
- return (string)oidToName[oid];
- }
-
- /**
- * returns an enumeration containing the name strings for curves
- * contained in this structure.
- */
- public static IEnumerable Names
- {
- get { return new EnumerableProxy(names); }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/encodings/ISO9796d1Encoding.cs b/BCCrypto/src/crypto/encodings/ISO9796d1Encoding.cs
deleted file mode 100644
index 30e9883..0000000
--- a/BCCrypto/src/crypto/encodings/ISO9796d1Encoding.cs
+++ /dev/null
@@ -1,273 +0,0 @@
-using System;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Encodings
-{
- /**
- * ISO 9796-1 padding. Note in the light of recent results you should
- * only use this with RSA (rather than the "simpler" Rabin keys) and you
- * should never use it with anything other than a hash (ie. even if the
- * message is small don't sign the message, sign it's hash) or some "random"
- * value. See your favorite search engine for details.
- */
- public class ISO9796d1Encoding
- : IAsymmetricBlockCipher
- {
- private static readonly BigInteger Sixteen = BigInteger.ValueOf(16);
- private static readonly BigInteger Six = BigInteger.ValueOf(6);
-
- private static readonly byte[] shadows = { 0xe, 0x3, 0x5, 0x8, 0x9, 0x4, 0x2, 0xf,
- 0x0, 0xd, 0xb, 0x6, 0x7, 0xa, 0xc, 0x1 };
- private static readonly byte[] inverse = { 0x8, 0xf, 0x6, 0x1, 0x5, 0x2, 0xb, 0xc,
- 0x3, 0x4, 0xd, 0xa, 0xe, 0x9, 0x0, 0x7 };
-
- private readonly IAsymmetricBlockCipher engine;
- private bool forEncryption;
- private int bitSize;
- private int padBits = 0;
- private BigInteger modulus;
-
- public ISO9796d1Encoding(
- IAsymmetricBlockCipher cipher)
- {
- this.engine = cipher;
- }
-
- public string AlgorithmName
- {
- get { return engine.AlgorithmName + "/ISO9796-1Padding"; }
- }
-
- public IAsymmetricBlockCipher GetUnderlyingCipher()
- {
- return engine;
- }
-
- public void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- RsaKeyParameters kParam;
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom)parameters;
- kParam = (RsaKeyParameters)rParam.Parameters;
- }
- else
- {
- kParam = (RsaKeyParameters)parameters;
- }
-
- engine.Init(forEncryption, parameters);
-
- modulus = kParam.Modulus;
- bitSize = modulus.BitLength;
-
- this.forEncryption = forEncryption;
- }
-
- /**
- * return the input block size. The largest message we can process
- * is (key_size_in_bits + 3)/16, which in our world comes to
- * key_size_in_bytes / 2.
- */
- public int GetInputBlockSize()
- {
- int baseBlockSize = engine.GetInputBlockSize();
-
- if (forEncryption)
- {
- return (baseBlockSize + 1) / 2;
- }
- else
- {
- return baseBlockSize;
- }
- }
-
- /**
- * return the maximum possible size for the output.
- */
- public int GetOutputBlockSize()
- {
- int baseBlockSize = engine.GetOutputBlockSize();
-
- if (forEncryption)
- {
- return baseBlockSize;
- }
- else
- {
- return (baseBlockSize + 1) / 2;
- }
- }
-
- /**
- * set the number of bits in the next message to be treated as
- * pad bits.
- */
- public void SetPadBits(
- int padBits)
- {
- if (padBits > 7)
- {
- throw new ArgumentException("padBits > 7");
- }
-
- this.padBits = padBits;
- }
-
- /**
- * retrieve the number of pad bits in the last decoded message.
- */
- public int GetPadBits()
- {
- return padBits;
- }
-
- public byte[] ProcessBlock(
- byte[] input,
- int inOff,
- int length)
- {
- if (forEncryption)
- {
- return EncodeBlock(input, inOff, length);
- }
- else
- {
- return DecodeBlock(input, inOff, length);
- }
- }
-
- private byte[] EncodeBlock(
- byte[] input,
- int inOff,
- int inLen)
- {
- byte[] block = new byte[(bitSize + 7) / 8];
- int r = padBits + 1;
- int z = inLen;
- int t = (bitSize + 13) / 16;
-
- for (int i = 0; i < t; i += z)
- {
- if (i > t - z)
- {
- Array.Copy(input, inOff + inLen - (t - i),
- block, block.Length - t, t - i);
- }
- else
- {
- Array.Copy(input, inOff, block, block.Length - (i + z), z);
- }
- }
-
- for (int i = block.Length - 2 * t; i != block.Length; i += 2)
- {
- byte val = block[block.Length - t + i / 2];
-
- block[i] = (byte)((shadows[(uint) (val & 0xff) >> 4] << 4)
- | shadows[val & 0x0f]);
- block[i + 1] = val;
- }
-
- block[block.Length - 2 * z] ^= (byte) r;
- block[block.Length - 1] = (byte)((block[block.Length - 1] << 4) | 0x06);
-
- int maxBit = (8 - (bitSize - 1) % 8);
- int offSet = 0;
-
- if (maxBit != 8)
- {
- block[0] &= (byte) ((ushort) 0xff >> maxBit);
- block[0] |= (byte) ((ushort) 0x80 >> maxBit);
- }
- else
- {
- block[0] = 0x00;
- block[1] |= 0x80;
- offSet = 1;
- }
-
- return engine.ProcessBlock(block, offSet, block.Length - offSet);
- }
-
- /**
- * @exception InvalidCipherTextException if the decrypted block is not a valid ISO 9796 bit string
- */
- private byte[] DecodeBlock(
- byte[] input,
- int inOff,
- int inLen)
- {
- byte[] block = engine.ProcessBlock(input, inOff, inLen);
- int r = 1;
- int t = (bitSize + 13) / 16;
-
- BigInteger iS = new BigInteger(1, block);
- BigInteger iR;
- if (iS.Mod(Sixteen).Equals(Six))
- {
- iR = iS;
- }
- else
- {
- iR = modulus.Subtract(iS);
-
- if (!iR.Mod(Sixteen).Equals(Six))
- throw new InvalidCipherTextException("resulting integer iS or (modulus - iS) is not congruent to 6 mod 16");
- }
-
- block = iR.ToByteArrayUnsigned();
-
- if ((block[block.Length - 1] & 0x0f) != 0x6)
- throw new InvalidCipherTextException("invalid forcing byte in block");
-
- block[block.Length - 1] =
- (byte)(((ushort)(block[block.Length - 1] & 0xff) >> 4)
- | ((inverse[(block[block.Length - 2] & 0xff) >> 4]) << 4));
-
- block[0] = (byte)((shadows[(uint) (block[1] & 0xff) >> 4] << 4)
- | shadows[block[1] & 0x0f]);
-
- bool boundaryFound = false;
- int boundary = 0;
-
- for (int i = block.Length - 1; i >= block.Length - 2 * t; i -= 2)
- {
- int val = ((shadows[(uint) (block[i] & 0xff) >> 4] << 4)
- | shadows[block[i] & 0x0f]);
-
- if (((block[i - 1] ^ val) & 0xff) != 0)
- {
- if (!boundaryFound)
- {
- boundaryFound = true;
- r = (block[i - 1] ^ val) & 0xff;
- boundary = i - 1;
- }
- else
- {
- throw new InvalidCipherTextException("invalid tsums in block");
- }
- }
- }
-
- block[boundary] = 0;
-
- byte[] nblock = new byte[(block.Length - boundary) / 2];
-
- for (int i = 0; i < nblock.Length; i++)
- {
- nblock[i] = block[2 * i + boundary + 1];
- }
-
- padBits = r - 1;
-
- return nblock;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/encodings/OaepEncoding.cs b/BCCrypto/src/crypto/encodings/OaepEncoding.cs
deleted file mode 100644
index 287876f..0000000
--- a/BCCrypto/src/crypto/encodings/OaepEncoding.cs
+++ /dev/null
@@ -1,345 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Encodings
-{
- /**
- * Optimal Asymmetric Encryption Padding (OAEP) - see PKCS 1 V 2.
- */
- public class OaepEncoding
- : IAsymmetricBlockCipher
- {
- private byte[] defHash;
- private IDigest mgf1Hash;
-
- private IAsymmetricBlockCipher engine;
- private SecureRandom random;
- private bool forEncryption;
-
- public OaepEncoding(
- IAsymmetricBlockCipher cipher)
- : this(cipher, new Sha1Digest(), null)
- {
- }
-
- public OaepEncoding(
- IAsymmetricBlockCipher cipher,
- IDigest hash)
- : this(cipher, hash, null)
- {
- }
-
- public OaepEncoding(
- IAsymmetricBlockCipher cipher,
- IDigest hash,
- byte[] encodingParams)
- : this(cipher, hash, hash, encodingParams)
- {
- }
-
- public OaepEncoding(
- IAsymmetricBlockCipher cipher,
- IDigest hash,
- IDigest mgf1Hash,
- byte[] encodingParams)
- {
- this.engine = cipher;
- this.mgf1Hash = mgf1Hash;
- this.defHash = new byte[hash.GetDigestSize()];
-
- hash.Reset();
-
- if (encodingParams != null)
- {
- hash.BlockUpdate(encodingParams, 0, encodingParams.Length);
- }
-
- hash.DoFinal(defHash, 0);
- }
-
- public IAsymmetricBlockCipher GetUnderlyingCipher()
- {
- return engine;
- }
-
- public string AlgorithmName
- {
- get { return engine.AlgorithmName + "/OAEPPadding"; }
- }
-
- public void Init(
- bool forEncryption,
- ICipherParameters param)
- {
- if (param is ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom)param;
- this.random = rParam.Random;
- }
- else
- {
- this.random = new SecureRandom();
- }
-
- engine.Init(forEncryption, param);
-
- this.forEncryption = forEncryption;
- }
-
- public int GetInputBlockSize()
- {
- int baseBlockSize = engine.GetInputBlockSize();
-
- if (forEncryption)
- {
- return baseBlockSize - 1 - 2 * defHash.Length;
- }
- else
- {
- return baseBlockSize;
- }
- }
-
- public int GetOutputBlockSize()
- {
- int baseBlockSize = engine.GetOutputBlockSize();
-
- if (forEncryption)
- {
- return baseBlockSize;
- }
- else
- {
- return baseBlockSize - 1 - 2 * defHash.Length;
- }
- }
-
- public byte[] ProcessBlock(
- byte[] inBytes,
- int inOff,
- int inLen)
- {
- if (forEncryption)
- {
- return EncodeBlock(inBytes, inOff, inLen);
- }
- else
- {
- return DecodeBlock(inBytes, inOff, inLen);
- }
- }
-
- private byte[] EncodeBlock(
- byte[] inBytes,
- int inOff,
- int inLen)
- {
- Check.DataLength(inLen > GetInputBlockSize(), "input data too long");
-
- byte[] block = new byte[GetInputBlockSize() + 1 + 2 * defHash.Length];
-
- //
- // copy in the message
- //
- Array.Copy(inBytes, inOff, block, block.Length - inLen, inLen);
-
- //
- // add sentinel
- //
- block[block.Length - inLen - 1] = 0x01;
-
- //
- // as the block is already zeroed - there's no need to add PS (the >= 0 pad of 0)
- //
-
- //
- // add the hash of the encoding params.
- //
- Array.Copy(defHash, 0, block, defHash.Length, defHash.Length);
-
- //
- // generate the seed.
- //
- byte[] seed = SecureRandom.GetNextBytes(random, defHash.Length);
-
- //
- // mask the message block.
- //
- byte[] mask = maskGeneratorFunction1(seed, 0, seed.Length, block.Length - defHash.Length);
-
- for (int i = defHash.Length; i != block.Length; i++)
- {
- block[i] ^= mask[i - defHash.Length];
- }
-
- //
- // add in the seed
- //
- Array.Copy(seed, 0, block, 0, defHash.Length);
-
- //
- // mask the seed.
- //
- mask = maskGeneratorFunction1(
- block, defHash.Length, block.Length - defHash.Length, defHash.Length);
-
- for (int i = 0; i != defHash.Length; i++)
- {
- block[i] ^= mask[i];
- }
-
- return engine.ProcessBlock(block, 0, block.Length);
- }
-
- /**
- * @exception InvalidCipherTextException if the decrypted block turns out to
- * be badly formatted.
- */
- private byte[] DecodeBlock(
- byte[] inBytes,
- int inOff,
- int inLen)
- {
- byte[] data = engine.ProcessBlock(inBytes, inOff, inLen);
- byte[] block = new byte[engine.GetOutputBlockSize()];
-
- //
- // as we may have zeros in our leading bytes for the block we produced
- // on encryption, we need to make sure our decrypted block comes back
- // the same size.
- //
-
- Array.Copy(data, 0, block, block.Length - data.Length, data.Length);
-
- bool shortData = (block.Length < (2 * defHash.Length) + 1);
-
- //
- // unmask the seed.
- //
- byte[] mask = maskGeneratorFunction1(
- block, defHash.Length, block.Length - defHash.Length, defHash.Length);
-
- for (int i = 0; i != defHash.Length; i++)
- {
- block[i] ^= mask[i];
- }
-
- //
- // unmask the message block.
- //
- mask = maskGeneratorFunction1(block, 0, defHash.Length, block.Length - defHash.Length);
-
- for (int i = defHash.Length; i != block.Length; i++)
- {
- block[i] ^= mask[i - defHash.Length];
- }
-
- //
- // check the hash of the encoding params.
- // long check to try to avoid this been a source of a timing attack.
- //
- bool defHashWrong = false;
-
- for (int i = 0; i != defHash.Length; i++)
- {
- if (defHash[i] != block[defHash.Length + i])
- {
- defHashWrong = true;
- }
- }
-
- //
- // find the data block
- //
- int start = block.Length;
-
- for (int index = 2 * defHash.Length; index != block.Length; index++)
- {
- if (block[index] != 0 & start == block.Length)
- {
- start = index;
- }
- }
-
- bool dataStartWrong = (start > (block.Length - 1) | block[start] != 1);
-
- start++;
-
- if (defHashWrong | shortData | dataStartWrong)
- {
- Arrays.Fill(block, 0);
- throw new InvalidCipherTextException("data wrong");
- }
-
- //
- // extract the data block
- //
- byte[] output = new byte[block.Length - start];
-
- Array.Copy(block, start, output, 0, output.Length);
-
- return output;
- }
-
- /**
- * int to octet string.
- */
- private void ItoOSP(
- int i,
- byte[] sp)
- {
- sp[0] = (byte)((uint)i >> 24);
- sp[1] = (byte)((uint)i >> 16);
- sp[2] = (byte)((uint)i >> 8);
- sp[3] = (byte)((uint)i >> 0);
- }
-
- /**
- * mask generator function, as described in PKCS1v2.
- */
- private byte[] maskGeneratorFunction1(
- byte[] Z,
- int zOff,
- int zLen,
- int length)
- {
- byte[] mask = new byte[length];
- byte[] hashBuf = new byte[mgf1Hash.GetDigestSize()];
- byte[] C = new byte[4];
- int counter = 0;
-
- mgf1Hash.Reset();
-
- while (counter < (length / hashBuf.Length))
- {
- ItoOSP(counter, C);
-
- mgf1Hash.BlockUpdate(Z, zOff, zLen);
- mgf1Hash.BlockUpdate(C, 0, C.Length);
- mgf1Hash.DoFinal(hashBuf, 0);
-
- Array.Copy(hashBuf, 0, mask, counter * hashBuf.Length, hashBuf.Length);
-
- counter++;
- }
-
- if ((counter * hashBuf.Length) < length)
- {
- ItoOSP(counter, C);
-
- mgf1Hash.BlockUpdate(Z, zOff, zLen);
- mgf1Hash.BlockUpdate(C, 0, C.Length);
- mgf1Hash.DoFinal(hashBuf, 0);
-
- Array.Copy(hashBuf, 0, mask, counter * hashBuf.Length, mask.Length - (counter * hashBuf.Length));
- }
-
- return mask;
- }
- }
-}
-
diff --git a/BCCrypto/src/crypto/encodings/Pkcs1Encoding.cs b/BCCrypto/src/crypto/encodings/Pkcs1Encoding.cs
deleted file mode 100644
index b2d60fe..0000000
--- a/BCCrypto/src/crypto/encodings/Pkcs1Encoding.cs
+++ /dev/null
@@ -1,384 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Encodings
-{
- /**
- * this does your basic Pkcs 1 v1.5 padding - whether or not you should be using this
- * depends on your application - see Pkcs1 Version 2 for details.
- */
- public class Pkcs1Encoding
- : IAsymmetricBlockCipher
- {
- /**
- * some providers fail to include the leading zero in PKCS1 encoded blocks. If you need to
- * work with one of these set the system property Org.BouncyCastle.Pkcs1.Strict to false.
- */
- public const string StrictLengthEnabledProperty = "Org.BouncyCastle.Pkcs1.Strict";
-
- private const int HeaderLength = 10;
-
- /**
- * The same effect can be achieved by setting the static property directly
- *
- * The static property is checked during construction of the encoding object, it is set to
- * true by default.
- *
- */
- public static bool StrictLengthEnabled
- {
- get { return strictLengthEnabled[0]; }
- set { strictLengthEnabled[0] = value; }
- }
-
- private static readonly bool[] strictLengthEnabled;
-
- static Pkcs1Encoding()
- {
- string strictProperty = Platform.GetEnvironmentVariable(StrictLengthEnabledProperty);
-
- strictLengthEnabled = new bool[]{ strictProperty == null || strictProperty.Equals("true")};
- }
-
-
- private SecureRandom random;
- private IAsymmetricBlockCipher engine;
- private bool forEncryption;
- private bool forPrivateKey;
- private bool useStrictLength;
- private int pLen = -1;
- private byte[] fallback = null;
- private byte[] blockBuffer = null;
-
- /**
- * Basic constructor.
- *
- * @param cipher
- */
- public Pkcs1Encoding(
- IAsymmetricBlockCipher cipher)
- {
- this.engine = cipher;
- this.useStrictLength = StrictLengthEnabled;
- }
-
- /**
- * Constructor for decryption with a fixed plaintext length.
- *
- * @param cipher The cipher to use for cryptographic operation.
- * @param pLen Length of the expected plaintext.
- */
- public Pkcs1Encoding(IAsymmetricBlockCipher cipher, int pLen)
- {
- this.engine = cipher;
- this.useStrictLength = StrictLengthEnabled;
- this.pLen = pLen;
- }
-
- /**
- * Constructor for decryption with a fixed plaintext length and a fallback
- * value that is returned, if the padding is incorrect.
- *
- * @param cipher
- * The cipher to use for cryptographic operation.
- * @param fallback
- * The fallback value, we don't to a arraycopy here.
- */
- public Pkcs1Encoding(IAsymmetricBlockCipher cipher, byte[] fallback)
- {
- this.engine = cipher;
- this.useStrictLength = StrictLengthEnabled;
- this.fallback = fallback;
- this.pLen = fallback.Length;
- }
-
- public IAsymmetricBlockCipher GetUnderlyingCipher()
- {
- return engine;
- }
-
- public string AlgorithmName
- {
- get { return engine.AlgorithmName + "/PKCS1Padding"; }
- }
-
- public void Init(bool forEncryption, ICipherParameters parameters)
- {
- AsymmetricKeyParameter kParam;
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom)parameters;
-
- this.random = rParam.Random;
- kParam = (AsymmetricKeyParameter)rParam.Parameters;
- }
- else
- {
- this.random = new SecureRandom();
- kParam = (AsymmetricKeyParameter)parameters;
- }
-
- engine.Init(forEncryption, parameters);
-
- this.forPrivateKey = kParam.IsPrivate;
- this.forEncryption = forEncryption;
- this.blockBuffer = new byte[engine.GetOutputBlockSize()];
-
- if (pLen > 0 && fallback == null && random == null)
- throw new ArgumentException("encoder requires random");
- }
-
- public int GetInputBlockSize()
- {
- int baseBlockSize = engine.GetInputBlockSize();
-
- return forEncryption
- ? baseBlockSize - HeaderLength
- : baseBlockSize;
- }
-
- public int GetOutputBlockSize()
- {
- int baseBlockSize = engine.GetOutputBlockSize();
-
- return forEncryption
- ? baseBlockSize
- : baseBlockSize - HeaderLength;
- }
-
- public byte[] ProcessBlock(
- byte[] input,
- int inOff,
- int length)
- {
- return forEncryption
- ? EncodeBlock(input, inOff, length)
- : DecodeBlock(input, inOff, length);
- }
-
- private byte[] EncodeBlock(
- byte[] input,
- int inOff,
- int inLen)
- {
- if (inLen > GetInputBlockSize())
- throw new ArgumentException("input data too large", "inLen");
-
- byte[] block = new byte[engine.GetInputBlockSize()];
-
- if (forPrivateKey)
- {
- block[0] = 0x01; // type code 1
-
- for (int i = 1; i != block.Length - inLen - 1; i++)
- {
- block[i] = (byte)0xFF;
- }
- }
- else
- {
- random.NextBytes(block); // random fill
-
- block[0] = 0x02; // type code 2
-
- //
- // a zero byte marks the end of the padding, so all
- // the pad bytes must be non-zero.
- //
- for (int i = 1; i != block.Length - inLen - 1; i++)
- {
- while (block[i] == 0)
- {
- block[i] = (byte)random.NextInt();
- }
- }
- }
-
- block[block.Length - inLen - 1] = 0x00; // mark the end of the padding
- Array.Copy(input, inOff, block, block.Length - inLen, inLen);
-
- return engine.ProcessBlock(block, 0, block.Length);
- }
-
- /**
- * Checks if the argument is a correctly PKCS#1.5 encoded Plaintext
- * for encryption.
- *
- * @param encoded The Plaintext.
- * @param pLen Expected length of the plaintext.
- * @return Either 0, if the encoding is correct, or -1, if it is incorrect.
- */
- private static int CheckPkcs1Encoding(byte[] encoded, int pLen)
- {
- int correct = 0;
- /*
- * Check if the first two bytes are 0 2
- */
- correct |= (encoded[0] ^ 2);
-
- /*
- * Now the padding check, check for no 0 byte in the padding
- */
- int plen = encoded.Length - (
- pLen /* Lenght of the PMS */
- + 1 /* Final 0-byte before PMS */
- );
-
- for (int i = 1; i < plen; i++)
- {
- int tmp = encoded[i];
- tmp |= tmp >> 1;
- tmp |= tmp >> 2;
- tmp |= tmp >> 4;
- correct |= (tmp & 1) - 1;
- }
-
- /*
- * Make sure the padding ends with a 0 byte.
- */
- correct |= encoded[encoded.Length - (pLen + 1)];
-
- /*
- * Return 0 or 1, depending on the result.
- */
- correct |= correct >> 1;
- correct |= correct >> 2;
- correct |= correct >> 4;
- return ~((correct & 1) - 1);
- }
-
- /**
- * Decode PKCS#1.5 encoding, and return a random value if the padding is not correct.
- *
- * @param in The encrypted block.
- * @param inOff Offset in the encrypted block.
- * @param inLen Length of the encrypted block.
- * @param pLen Length of the desired output.
- * @return The plaintext without padding, or a random value if the padding was incorrect.
- * @throws InvalidCipherTextException
- */
- private byte[] DecodeBlockOrRandom(byte[] input, int inOff, int inLen)
- {
- if (!forPrivateKey)
- throw new InvalidCipherTextException("sorry, this method is only for decryption, not for signing");
-
- byte[] block = engine.ProcessBlock(input, inOff, inLen);
- byte[] random;
- if (this.fallback == null)
- {
- random = new byte[this.pLen];
- this.random.NextBytes(random);
- }
- else
- {
- random = fallback;
- }
-
- byte[] data = (useStrictLength & (block.Length != engine.GetOutputBlockSize())) ? blockBuffer : block;
-
- /*
- * Check the padding.
- */
- int correct = CheckPkcs1Encoding(data, this.pLen);
-
- /*
- * Now, to a constant time constant memory copy of the decrypted value
- * or the random value, depending on the validity of the padding.
- */
- byte[] result = new byte[this.pLen];
- for (int i = 0; i < this.pLen; i++)
- {
- result[i] = (byte)((data[i + (data.Length - pLen)] & (~correct)) | (random[i] & correct));
- }
-
- Arrays.Fill(data, 0);
-
- return result;
- }
-
- /**
- * @exception InvalidCipherTextException if the decrypted block is not in Pkcs1 format.
- */
- private byte[] DecodeBlock(
- byte[] input,
- int inOff,
- int inLen)
- {
- /*
- * If the length of the expected plaintext is known, we use a constant-time decryption.
- * If the decryption fails, we return a random value.
- */
- if (this.pLen != -1)
- {
- return this.DecodeBlockOrRandom(input, inOff, inLen);
- }
-
- byte[] block = engine.ProcessBlock(input, inOff, inLen);
- bool incorrectLength = (useStrictLength & (block.Length != engine.GetOutputBlockSize()));
-
- byte[] data;
- if (block.Length < GetOutputBlockSize())
- {
- data = blockBuffer;
- }
- else
- {
- data = block;
- }
-
- byte expectedType = (byte)(forPrivateKey ? 2 : 1);
- byte type = data[0];
-
- bool badType = (type != expectedType);
-
- //
- // find and extract the message block.
- //
- int start = FindStart(type, data);
-
- start++; // data should start at the next byte
-
- if (badType | (start < HeaderLength))
- {
- Arrays.Fill(data, 0);
- throw new InvalidCipherTextException("block incorrect");
- }
-
- // if we get this far, it's likely to be a genuine encoding error
- if (incorrectLength)
- {
- Arrays.Fill(data, 0);
- throw new InvalidCipherTextException("block incorrect size");
- }
-
- byte[] result = new byte[data.Length - start];
-
- Array.Copy(data, start, result, 0, result.Length);
-
- return result;
- }
-
- private int FindStart(byte type, byte[] block)
- {
- int start = -1;
- bool padErr = false;
-
- for (int i = 1; i != block.Length; i++)
- {
- byte pad = block[i];
-
- if (pad == 0 & start < 0)
- {
- start = i;
- }
- padErr |= ((type == 1) & (start < 0) & (pad != (byte)0xff));
- }
-
- return padErr ? -1 : start;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/AesEngine.cs b/BCCrypto/src/crypto/engines/AesEngine.cs
deleted file mode 100644
index 91bdf69..0000000
--- a/BCCrypto/src/crypto/engines/AesEngine.cs
+++ /dev/null
@@ -1,610 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * an implementation of the AES (Rijndael), from FIPS-197.
- *
- * For further details see: http://csrc.nist.gov/encryption/aes/ .
- *
- * This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at
- * http://fp.gladman.plus.com/cryptography_technology/rijndael/
- *
- * There are three levels of tradeoff of speed vs memory
- * Because java has no preprocessor, they are written as three separate classes from which to choose
- *
- * The fastest uses 8Kbytes of static tables to precompute round calculations, 4 256 word tables for encryption
- * and 4 for decryption.
- *
- * The middle performance version uses only one 256 word table for each, for a total of 2Kbytes,
- * adding 12 rotate operations per round to compute the values contained in the other tables from
- * the contents of the first.
- *
- * The slowest version uses no static tables at all and computes the values in each round.
- *
- *
- * This file contains the middle performance version with 2Kbytes of static tables for round precomputation.
- *
- */
- public class AesEngine
- : IBlockCipher
- {
- // The S box
- private static readonly byte[] S =
- {
- 99, 124, 119, 123, 242, 107, 111, 197,
- 48, 1, 103, 43, 254, 215, 171, 118,
- 202, 130, 201, 125, 250, 89, 71, 240,
- 173, 212, 162, 175, 156, 164, 114, 192,
- 183, 253, 147, 38, 54, 63, 247, 204,
- 52, 165, 229, 241, 113, 216, 49, 21,
- 4, 199, 35, 195, 24, 150, 5, 154,
- 7, 18, 128, 226, 235, 39, 178, 117,
- 9, 131, 44, 26, 27, 110, 90, 160,
- 82, 59, 214, 179, 41, 227, 47, 132,
- 83, 209, 0, 237, 32, 252, 177, 91,
- 106, 203, 190, 57, 74, 76, 88, 207,
- 208, 239, 170, 251, 67, 77, 51, 133,
- 69, 249, 2, 127, 80, 60, 159, 168,
- 81, 163, 64, 143, 146, 157, 56, 245,
- 188, 182, 218, 33, 16, 255, 243, 210,
- 205, 12, 19, 236, 95, 151, 68, 23,
- 196, 167, 126, 61, 100, 93, 25, 115,
- 96, 129, 79, 220, 34, 42, 144, 136,
- 70, 238, 184, 20, 222, 94, 11, 219,
- 224, 50, 58, 10, 73, 6, 36, 92,
- 194, 211, 172, 98, 145, 149, 228, 121,
- 231, 200, 55, 109, 141, 213, 78, 169,
- 108, 86, 244, 234, 101, 122, 174, 8,
- 186, 120, 37, 46, 28, 166, 180, 198,
- 232, 221, 116, 31, 75, 189, 139, 138,
- 112, 62, 181, 102, 72, 3, 246, 14,
- 97, 53, 87, 185, 134, 193, 29, 158,
- 225, 248, 152, 17, 105, 217, 142, 148,
- 155, 30, 135, 233, 206, 85, 40, 223,
- 140, 161, 137, 13, 191, 230, 66, 104,
- 65, 153, 45, 15, 176, 84, 187, 22,
- };
-
- // The inverse S-box
- private static readonly byte[] Si =
- {
- 82, 9, 106, 213, 48, 54, 165, 56,
- 191, 64, 163, 158, 129, 243, 215, 251,
- 124, 227, 57, 130, 155, 47, 255, 135,
- 52, 142, 67, 68, 196, 222, 233, 203,
- 84, 123, 148, 50, 166, 194, 35, 61,
- 238, 76, 149, 11, 66, 250, 195, 78,
- 8, 46, 161, 102, 40, 217, 36, 178,
- 118, 91, 162, 73, 109, 139, 209, 37,
- 114, 248, 246, 100, 134, 104, 152, 22,
- 212, 164, 92, 204, 93, 101, 182, 146,
- 108, 112, 72, 80, 253, 237, 185, 218,
- 94, 21, 70, 87, 167, 141, 157, 132,
- 144, 216, 171, 0, 140, 188, 211, 10,
- 247, 228, 88, 5, 184, 179, 69, 6,
- 208, 44, 30, 143, 202, 63, 15, 2,
- 193, 175, 189, 3, 1, 19, 138, 107,
- 58, 145, 17, 65, 79, 103, 220, 234,
- 151, 242, 207, 206, 240, 180, 230, 115,
- 150, 172, 116, 34, 231, 173, 53, 133,
- 226, 249, 55, 232, 28, 117, 223, 110,
- 71, 241, 26, 113, 29, 41, 197, 137,
- 111, 183, 98, 14, 170, 24, 190, 27,
- 252, 86, 62, 75, 198, 210, 121, 32,
- 154, 219, 192, 254, 120, 205, 90, 244,
- 31, 221, 168, 51, 136, 7, 199, 49,
- 177, 18, 16, 89, 39, 128, 236, 95,
- 96, 81, 127, 169, 25, 181, 74, 13,
- 45, 229, 122, 159, 147, 201, 156, 239,
- 160, 224, 59, 77, 174, 42, 245, 176,
- 200, 235, 187, 60, 131, 83, 153, 97,
- 23, 43, 4, 126, 186, 119, 214, 38,
- 225, 105, 20, 99, 85, 33, 12, 125,
- };
-
- // vector used in calculating key schedule (powers of x in GF(256))
- private static readonly byte[] rcon =
- {
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
- 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91
- };
-
- // precomputation tables of calculations for rounds
- private static readonly uint[] T0 =
- {
- 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, 0x0df2f2ff,
- 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, 0x50303060, 0x03010102,
- 0xa96767ce, 0x7d2b2b56, 0x19fefee7, 0x62d7d7b5, 0xe6abab4d,
- 0x9a7676ec, 0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa,
- 0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb, 0xecadad41,
- 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, 0xbf9c9c23, 0xf7a4a453,
- 0x967272e4, 0x5bc0c09b, 0xc2b7b775, 0x1cfdfde1, 0xae93933d,
- 0x6a26264c, 0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83,
- 0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9, 0x937171e2,
- 0x73d8d8ab, 0x53313162, 0x3f15152a, 0x0c040408, 0x52c7c795,
- 0x65232346, 0x5ec3c39d, 0x28181830, 0xa1969637, 0x0f05050a,
- 0xb59a9a2f, 0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df,
- 0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, 0x1b090912,
- 0x9e83831d, 0x742c2c58, 0x2e1a1a34, 0x2d1b1b36, 0xb26e6edc,
- 0xee5a5ab4, 0xfba0a05b, 0xf65252a4, 0x4d3b3b76, 0x61d6d6b7,
- 0xceb3b37d, 0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413,
- 0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1, 0x60202040,
- 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6, 0xbe6a6ad4, 0x46cbcb8d,
- 0xd9bebe67, 0x4b393972, 0xde4a4a94, 0xd44c4c98, 0xe85858b0,
- 0x4acfcf85, 0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed,
- 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, 0xcf45458a,
- 0x10f9f9e9, 0x06020204, 0x817f7ffe, 0xf05050a0, 0x443c3c78,
- 0xba9f9f25, 0xe3a8a84b, 0xf35151a2, 0xfea3a35d, 0xc0404080,
- 0x8a8f8f05, 0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1,
- 0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, 0x30101020,
- 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf, 0x4ccdcd81, 0x140c0c18,
- 0x35131326, 0x2fececc3, 0xe15f5fbe, 0xa2979735, 0xcc444488,
- 0x3917172e, 0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a,
- 0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6, 0xa06060c0,
- 0x98818119, 0xd14f4f9e, 0x7fdcdca3, 0x66222244, 0x7e2a2a54,
- 0xab90903b, 0x8388880b, 0xca46468c, 0x29eeeec7, 0xd3b8b86b,
- 0x3c141428, 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad,
- 0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, 0xdb494992,
- 0x0a06060c, 0x6c242448, 0xe45c5cb8, 0x5dc2c29f, 0x6ed3d3bd,
- 0xefacac43, 0xa66262c4, 0xa8919139, 0xa4959531, 0x37e4e4d3,
- 0x8b7979f2, 0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda,
- 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, 0xb46c6cd8,
- 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf, 0xaf6565ca, 0x8e7a7af4,
- 0xe9aeae47, 0x18080810, 0xd5baba6f, 0x887878f0, 0x6f25254a,
- 0x722e2e5c, 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697,
- 0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, 0xdd4b4b96,
- 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, 0x907070e0, 0x423e3e7c,
- 0xc4b5b571, 0xaa6666cc, 0xd8484890, 0x05030306, 0x01f6f6f7,
- 0x120e0e1c, 0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969,
- 0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27, 0x38e1e1d9,
- 0x13f8f8eb, 0xb398982b, 0x33111122, 0xbb6969d2, 0x70d9d9a9,
- 0x898e8e07, 0xa7949433, 0xb69b9b2d, 0x221e1e3c, 0x92878715,
- 0x20e9e9c9, 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5,
- 0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, 0xdabfbf65,
- 0x31e6e6d7, 0xc6424284, 0xb86868d0, 0xc3414182, 0xb0999929,
- 0x772d2d5a, 0x110f0f1e, 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d,
- 0x3a16162c
- };
-
- private static readonly uint[] Tinv0 =
- {
- 0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a, 0xcb6bab3b,
- 0xf1459d1f, 0xab58faac, 0x9303e34b, 0x55fa3020, 0xf66d76ad,
- 0x9176cc88, 0x254c02f5, 0xfcd7e54f, 0xd7cb2ac5, 0x80443526,
- 0x8fa362b5, 0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d,
- 0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b, 0xe75f8f03,
- 0x959c9215, 0xeb7a6dbf, 0xda595295, 0x2d83bed4, 0xd3217458,
- 0x2969e049, 0x44c8c98e, 0x6a89c275, 0x78798ef4, 0x6b3e5899,
- 0xdd71b927, 0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d,
- 0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362, 0xe07764b1,
- 0x84ae6bbb, 0x1ca081fe, 0x942b08f9, 0x58684870, 0x19fd458f,
- 0x876cde94, 0xb7f87b52, 0x23d373ab, 0xe2024b72, 0x578f1fe3,
- 0x2aab5566, 0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3,
- 0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed, 0x2b1ccf8a,
- 0x92b479a7, 0xf0f207f3, 0xa1e2694e, 0xcdf4da65, 0xd5be0506,
- 0x1f6234d1, 0x8afea6c4, 0x9d532e34, 0xa055f3a2, 0x32e18a05,
- 0x75ebf6a4, 0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd,
- 0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d, 0xb58d5491,
- 0x055dc471, 0x6fd40604, 0xff155060, 0x24fb9819, 0x97e9bdd6,
- 0xcc434089, 0x779ed967, 0xbd42e8b0, 0x888b8907, 0x385b19e7,
- 0xdbeec879, 0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000,
- 0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c, 0xfbff0efd,
- 0x5638850f, 0x1ed5ae3d, 0x27392d36, 0x64d90f0a, 0x21a65c68,
- 0xd1545b9b, 0x3a2e3624, 0xb1670a0c, 0x0fe75793, 0xd296eeb4,
- 0x9e919b1b, 0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c,
- 0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12, 0x0b0d090e,
- 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14, 0x8519f157, 0x4c0775af,
- 0xbbdd99ee, 0xfd607fa3, 0x9f2601f7, 0xbcf5725c, 0xc53b6644,
- 0x347efb5b, 0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8,
- 0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684, 0x7d244a85,
- 0xf83dbbd2, 0x1132f9ae, 0x6da129c7, 0x4b2f9e1d, 0xf330b2dc,
- 0xec52860d, 0xd0e3c177, 0x6c16b32b, 0x99b970a9, 0xfa489411,
- 0x2264e947, 0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322,
- 0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498, 0xcf81f5a6,
- 0x28de7aa5, 0x268eb7da, 0xa4bfad3f, 0xe49d3a2c, 0x0d927850,
- 0x9bcc5f6a, 0x62467e54, 0xc2138df6, 0xe8b8d890, 0x5ef7392e,
- 0xf5afc382, 0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf,
- 0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb, 0x097826cd,
- 0xf418596e, 0x01b79aec, 0xa89a4f83, 0x656e95e6, 0x7ee6ffaa,
- 0x08cfbc21, 0xe6e815ef, 0xd99be7ba, 0xce366f4a, 0xd4099fea,
- 0xd67cb029, 0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235,
- 0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733, 0x4a9804f1,
- 0xf7daec41, 0x0e50cd7f, 0x2ff69117, 0x8dd64d76, 0x4db0ef43,
- 0x544daacc, 0xdf0496e4, 0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1,
- 0x7f516546, 0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb,
- 0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d, 0x8c61d79a,
- 0x7a0ca137, 0x8e14f859, 0x893c13eb, 0xee27a9ce, 0x35c961b7,
- 0xede51ce1, 0x3cb1477a, 0x59dfd29c, 0x3f73f255, 0x79ce1418,
- 0xbf37c773, 0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478,
- 0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2, 0x72c31d16,
- 0x0c25e2bc, 0x8b493c28, 0x41950dff, 0x7101a839, 0xdeb30c08,
- 0x9ce4b4d8, 0x90c15664, 0x6184cb7b, 0x70b632d5, 0x745c6c48,
- 0x4257b8d0
- };
-
- private static uint Shift(uint r, int shift)
- {
- return (r >> shift) | (r << (32 - shift));
- }
-
- /* multiply four bytes in GF(2^8) by 'x' {02} in parallel */
-
- private const uint m1 = 0x80808080;
- private const uint m2 = 0x7f7f7f7f;
- private const uint m3 = 0x0000001b;
- private const uint m4 = 0xC0C0C0C0;
- private const uint m5 = 0x3f3f3f3f;
-
- private static uint FFmulX(uint x)
- {
- return ((x & m2) << 1) ^ (((x & m1) >> 7) * m3);
- }
-
- private static uint FFmulX2(uint x)
- {
- uint t0 = (x & m5) << 2;
- uint t1 = (x & m4);
- t1 ^= (t1 >> 1);
- return t0 ^ (t1 >> 2) ^ (t1 >> 5);
- }
-
- /*
- The following defines provide alternative definitions of FFmulX that might
- give improved performance if a fast 32-bit multiply is not available.
-
- private int FFmulX(int x) { int u = x & m1; u |= (u >> 1); return ((x & m2) << 1) ^ ((u >>> 3) | (u >>> 6)); }
- private static final int m4 = 0x1b1b1b1b;
- private int FFmulX(int x) { int u = x & m1; return ((x & m2) << 1) ^ ((u - (u >>> 7)) & m4); }
-
- */
-
- private static uint Inv_Mcol(uint x)
- {
- uint t0, t1;
- t0 = x;
- t1 = t0 ^ Shift(t0, 8);
- t0 ^= FFmulX(t1);
- t1 ^= FFmulX2(t0);
- t0 ^= t1 ^ Shift(t1, 16);
- return t0;
- }
-
- private static uint SubWord(uint x)
- {
- return (uint)S[x&255]
- | (((uint)S[(x>>8)&255]) << 8)
- | (((uint)S[(x>>16)&255]) << 16)
- | (((uint)S[(x>>24)&255]) << 24);
- }
-
- /**
- * Calculate the necessary round keys
- * The number of calculations depends on key size and block size
- * AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits
- * This code is written assuming those are the only possible values
- */
- private uint[][] GenerateWorkingKey(byte[] key, bool forEncryption)
- {
- int keyLen = key.Length;
- if (keyLen < 16 || keyLen > 32 || (keyLen & 7) != 0)
- throw new ArgumentException("Key length not 128/192/256 bits.");
-
- int KC = keyLen >> 2;
- this.ROUNDS = KC + 6; // This is not always true for the generalized Rijndael that allows larger block sizes
-
- uint[][] W = new uint[ROUNDS + 1][]; // 4 words in a block
- for (int i = 0; i <= ROUNDS; ++i)
- {
- W[i] = new uint[4];
- }
-
- switch (KC)
- {
- case 4:
- {
- uint t0 = Pack.LE_To_UInt32(key, 0); W[0][0] = t0;
- uint t1 = Pack.LE_To_UInt32(key, 4); W[0][1] = t1;
- uint t2 = Pack.LE_To_UInt32(key, 8); W[0][2] = t2;
- uint t3 = Pack.LE_To_UInt32(key, 12); W[0][3] = t3;
-
- for (int i = 1; i <= 10; ++i)
- {
- uint u = SubWord(Shift(t3, 8)) ^ rcon[i - 1];
- t0 ^= u; W[i][0] = t0;
- t1 ^= t0; W[i][1] = t1;
- t2 ^= t1; W[i][2] = t2;
- t3 ^= t2; W[i][3] = t3;
- }
-
- break;
- }
- case 6:
- {
- uint t0 = Pack.LE_To_UInt32(key, 0); W[0][0] = t0;
- uint t1 = Pack.LE_To_UInt32(key, 4); W[0][1] = t1;
- uint t2 = Pack.LE_To_UInt32(key, 8); W[0][2] = t2;
- uint t3 = Pack.LE_To_UInt32(key, 12); W[0][3] = t3;
- uint t4 = Pack.LE_To_UInt32(key, 16); W[1][0] = t4;
- uint t5 = Pack.LE_To_UInt32(key, 20); W[1][1] = t5;
-
- uint rcon = 1;
- uint u = SubWord(Shift(t5, 8)) ^ rcon; rcon <<= 1;
- t0 ^= u; W[1][2] = t0;
- t1 ^= t0; W[1][3] = t1;
- t2 ^= t1; W[2][0] = t2;
- t3 ^= t2; W[2][1] = t3;
- t4 ^= t3; W[2][2] = t4;
- t5 ^= t4; W[2][3] = t5;
-
- for (int i = 3; i < 12; i += 3)
- {
- u = SubWord(Shift(t5, 8)) ^ rcon; rcon <<= 1;
- t0 ^= u; W[i ][0] = t0;
- t1 ^= t0; W[i ][1] = t1;
- t2 ^= t1; W[i ][2] = t2;
- t3 ^= t2; W[i ][3] = t3;
- t4 ^= t3; W[i + 1][0] = t4;
- t5 ^= t4; W[i + 1][1] = t5;
- u = SubWord(Shift(t5, 8)) ^ rcon; rcon <<= 1;
- t0 ^= u; W[i + 1][2] = t0;
- t1 ^= t0; W[i + 1][3] = t1;
- t2 ^= t1; W[i + 2][0] = t2;
- t3 ^= t2; W[i + 2][1] = t3;
- t4 ^= t3; W[i + 2][2] = t4;
- t5 ^= t4; W[i + 2][3] = t5;
- }
-
- u = SubWord(Shift(t5, 8)) ^ rcon;
- t0 ^= u; W[12][0] = t0;
- t1 ^= t0; W[12][1] = t1;
- t2 ^= t1; W[12][2] = t2;
- t3 ^= t2; W[12][3] = t3;
-
- break;
- }
- case 8:
- {
- uint t0 = Pack.LE_To_UInt32(key, 0); W[0][0] = t0;
- uint t1 = Pack.LE_To_UInt32(key, 4); W[0][1] = t1;
- uint t2 = Pack.LE_To_UInt32(key, 8); W[0][2] = t2;
- uint t3 = Pack.LE_To_UInt32(key, 12); W[0][3] = t3;
- uint t4 = Pack.LE_To_UInt32(key, 16); W[1][0] = t4;
- uint t5 = Pack.LE_To_UInt32(key, 20); W[1][1] = t5;
- uint t6 = Pack.LE_To_UInt32(key, 24); W[1][2] = t6;
- uint t7 = Pack.LE_To_UInt32(key, 28); W[1][3] = t7;
-
- uint u, rcon = 1;
-
- for (int i = 2; i < 14; i += 2)
- {
- u = SubWord(Shift(t7, 8)) ^ rcon; rcon <<= 1;
- t0 ^= u; W[i ][0] = t0;
- t1 ^= t0; W[i ][1] = t1;
- t2 ^= t1; W[i ][2] = t2;
- t3 ^= t2; W[i ][3] = t3;
- u = SubWord(t3);
- t4 ^= u; W[i + 1][0] = t4;
- t5 ^= t4; W[i + 1][1] = t5;
- t6 ^= t5; W[i + 1][2] = t6;
- t7 ^= t6; W[i + 1][3] = t7;
- }
-
- u = SubWord(Shift(t7, 8)) ^ rcon;
- t0 ^= u; W[14][0] = t0;
- t1 ^= t0; W[14][1] = t1;
- t2 ^= t1; W[14][2] = t2;
- t3 ^= t2; W[14][3] = t3;
-
- break;
- }
- default:
- {
- throw new InvalidOperationException("Should never get here");
- }
- }
-
- if (!forEncryption)
- {
- for (int j = 1; j < ROUNDS; j++)
- {
- uint[] w = W[j];
- for (int i = 0; i < 4; i++)
- {
- w[i] = Inv_Mcol(w[i]);
- }
- }
- }
-
- return W;
- }
-
- private int ROUNDS;
- private uint[][] WorkingKey;
- private uint C0, C1, C2, C3;
- private bool forEncryption;
-
- private byte[] s;
-
- private const int BLOCK_SIZE = 16;
-
- /**
- * default constructor - 128 bit block size.
- */
- public AesEngine()
- {
- }
-
- /**
- * initialise an AES cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- KeyParameter keyParameter = parameters as KeyParameter;
-
- if (keyParameter == null)
- throw new ArgumentException("invalid parameter passed to AES init - "
- + Platform.GetTypeName(parameters));
-
- WorkingKey = GenerateWorkingKey(keyParameter.GetKey(), forEncryption);
-
- this.forEncryption = forEncryption;
- this.s = Arrays.Clone(forEncryption ? S : Si);
- }
-
- public virtual string AlgorithmName
- {
- get { return "AES"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (WorkingKey == null)
- throw new InvalidOperationException("AES engine not initialised");
-
- Check.DataLength(input, inOff, 16, "input buffer too short");
- Check.OutputLength(output, outOff, 16, "output buffer too short");
-
- UnPackBlock(input, inOff);
-
- if (forEncryption)
- {
- EncryptBlock(WorkingKey);
- }
- else
- {
- DecryptBlock(WorkingKey);
- }
-
- PackBlock(output, outOff);
-
- return BLOCK_SIZE;
- }
-
- public virtual void Reset()
- {
- }
-
- private void UnPackBlock(
- byte[] bytes,
- int off)
- {
- C0 = Pack.LE_To_UInt32(bytes, off);
- C1 = Pack.LE_To_UInt32(bytes, off + 4);
- C2 = Pack.LE_To_UInt32(bytes, off + 8);
- C3 = Pack.LE_To_UInt32(bytes, off + 12);
- }
-
- private void PackBlock(
- byte[] bytes,
- int off)
- {
- Pack.UInt32_To_LE(C0, bytes, off);
- Pack.UInt32_To_LE(C1, bytes, off + 4);
- Pack.UInt32_To_LE(C2, bytes, off + 8);
- Pack.UInt32_To_LE(C3, bytes, off + 12);
- }
-
- private void EncryptBlock(uint[][] KW)
- {
- uint[] kw = KW[0];
- uint t0 = this.C0 ^ kw[0];
- uint t1 = this.C1 ^ kw[1];
- uint t2 = this.C2 ^ kw[2];
-
- uint r0, r1, r2, r3 = this.C3 ^ kw[3];
- int r = 1;
- while (r < ROUNDS - 1)
- {
- kw = KW[r++];
- r0 = T0[t0 & 255] ^ Shift(T0[(t1 >> 8) & 255], 24) ^ Shift(T0[(t2 >> 16) & 255], 16) ^ Shift(T0[(r3 >> 24) & 255], 8) ^ kw[0];
- r1 = T0[t1 & 255] ^ Shift(T0[(t2 >> 8) & 255], 24) ^ Shift(T0[(r3 >> 16) & 255], 16) ^ Shift(T0[(t0 >> 24) & 255], 8) ^ kw[1];
- r2 = T0[t2 & 255] ^ Shift(T0[(r3 >> 8) & 255], 24) ^ Shift(T0[(t0 >> 16) & 255], 16) ^ Shift(T0[(t1 >> 24) & 255], 8) ^ kw[2];
- r3 = T0[r3 & 255] ^ Shift(T0[(t0 >> 8) & 255], 24) ^ Shift(T0[(t1 >> 16) & 255], 16) ^ Shift(T0[(t2 >> 24) & 255], 8) ^ kw[3];
- kw = KW[r++];
- t0 = T0[r0 & 255] ^ Shift(T0[(r1 >> 8) & 255], 24) ^ Shift(T0[(r2 >> 16) & 255], 16) ^ Shift(T0[(r3 >> 24) & 255], 8) ^ kw[0];
- t1 = T0[r1 & 255] ^ Shift(T0[(r2 >> 8) & 255], 24) ^ Shift(T0[(r3 >> 16) & 255], 16) ^ Shift(T0[(r0 >> 24) & 255], 8) ^ kw[1];
- t2 = T0[r2 & 255] ^ Shift(T0[(r3 >> 8) & 255], 24) ^ Shift(T0[(r0 >> 16) & 255], 16) ^ Shift(T0[(r1 >> 24) & 255], 8) ^ kw[2];
- r3 = T0[r3 & 255] ^ Shift(T0[(r0 >> 8) & 255], 24) ^ Shift(T0[(r1 >> 16) & 255], 16) ^ Shift(T0[(r2 >> 24) & 255], 8) ^ kw[3];
- }
-
- kw = KW[r++];
- r0 = T0[t0 & 255] ^ Shift(T0[(t1 >> 8) & 255], 24) ^ Shift(T0[(t2 >> 16) & 255], 16) ^ Shift(T0[(r3 >> 24) & 255], 8) ^ kw[0];
- r1 = T0[t1 & 255] ^ Shift(T0[(t2 >> 8) & 255], 24) ^ Shift(T0[(r3 >> 16) & 255], 16) ^ Shift(T0[(t0 >> 24) & 255], 8) ^ kw[1];
- r2 = T0[t2 & 255] ^ Shift(T0[(r3 >> 8) & 255], 24) ^ Shift(T0[(t0 >> 16) & 255], 16) ^ Shift(T0[(t1 >> 24) & 255], 8) ^ kw[2];
- r3 = T0[r3 & 255] ^ Shift(T0[(t0 >> 8) & 255], 24) ^ Shift(T0[(t1 >> 16) & 255], 16) ^ Shift(T0[(t2 >> 24) & 255], 8) ^ kw[3];
-
- // the final round's table is a simple function of S so we don't use a whole other four tables for it
-
- kw = KW[r];
- this.C0 = (uint)S[r0 & 255] ^ (((uint)S[(r1 >> 8) & 255]) << 8) ^ (((uint)s[(r2 >> 16) & 255]) << 16) ^ (((uint)s[(r3 >> 24) & 255]) << 24) ^ kw[0];
- this.C1 = (uint)s[r1 & 255] ^ (((uint)S[(r2 >> 8) & 255]) << 8) ^ (((uint)S[(r3 >> 16) & 255]) << 16) ^ (((uint)s[(r0 >> 24) & 255]) << 24) ^ kw[1];
- this.C2 = (uint)s[r2 & 255] ^ (((uint)S[(r3 >> 8) & 255]) << 8) ^ (((uint)S[(r0 >> 16) & 255]) << 16) ^ (((uint)S[(r1 >> 24) & 255]) << 24) ^ kw[2];
- this.C3 = (uint)s[r3 & 255] ^ (((uint)s[(r0 >> 8) & 255]) << 8) ^ (((uint)s[(r1 >> 16) & 255]) << 16) ^ (((uint)S[(r2 >> 24) & 255]) << 24) ^ kw[3];
- }
-
- private void DecryptBlock(uint[][] KW)
- {
- uint[] kw = KW[ROUNDS];
- uint t0 = this.C0 ^ kw[0];
- uint t1 = this.C1 ^ kw[1];
- uint t2 = this.C2 ^ kw[2];
-
- uint r0, r1, r2, r3 = this.C3 ^ kw[3];
- int r = ROUNDS - 1;
- while (r > 1)
- {
- kw = KW[r--];
- r0 = Tinv0[t0 & 255] ^ Shift(Tinv0[(r3 >> 8) & 255], 24) ^ Shift(Tinv0[(t2 >> 16) & 255], 16) ^ Shift(Tinv0[(t1 >> 24) & 255], 8) ^ kw[0];
- r1 = Tinv0[t1 & 255] ^ Shift(Tinv0[(t0 >> 8) & 255], 24) ^ Shift(Tinv0[(r3 >> 16) & 255], 16) ^ Shift(Tinv0[(t2 >> 24) & 255], 8) ^ kw[1];
- r2 = Tinv0[t2 & 255] ^ Shift(Tinv0[(t1 >> 8) & 255], 24) ^ Shift(Tinv0[(t0 >> 16) & 255], 16) ^ Shift(Tinv0[(r3 >> 24) & 255], 8) ^ kw[2];
- r3 = Tinv0[r3 & 255] ^ Shift(Tinv0[(t2 >> 8) & 255], 24) ^ Shift(Tinv0[(t1 >> 16) & 255], 16) ^ Shift(Tinv0[(t0 >> 24) & 255], 8) ^ kw[3];
- kw = KW[r--];
- t0 = Tinv0[r0 & 255] ^ Shift(Tinv0[(r3 >> 8) & 255], 24) ^ Shift(Tinv0[(r2 >> 16) & 255], 16) ^ Shift(Tinv0[(r1 >> 24) & 255], 8) ^ kw[0];
- t1 = Tinv0[r1 & 255] ^ Shift(Tinv0[(r0 >> 8) & 255], 24) ^ Shift(Tinv0[(r3 >> 16) & 255], 16) ^ Shift(Tinv0[(r2 >> 24) & 255], 8) ^ kw[1];
- t2 = Tinv0[r2 & 255] ^ Shift(Tinv0[(r1 >> 8) & 255], 24) ^ Shift(Tinv0[(r0 >> 16) & 255], 16) ^ Shift(Tinv0[(r3 >> 24) & 255], 8) ^ kw[2];
- r3 = Tinv0[r3 & 255] ^ Shift(Tinv0[(r2 >> 8) & 255], 24) ^ Shift(Tinv0[(r1 >> 16) & 255], 16) ^ Shift(Tinv0[(r0 >> 24) & 255], 8) ^ kw[3];
- }
-
- kw = KW[1];
- r0 = Tinv0[t0 & 255] ^ Shift(Tinv0[(r3 >> 8) & 255], 24) ^ Shift(Tinv0[(t2 >> 16) & 255], 16) ^ Shift(Tinv0[(t1 >> 24) & 255], 8) ^ kw[0];
- r1 = Tinv0[t1 & 255] ^ Shift(Tinv0[(t0 >> 8) & 255], 24) ^ Shift(Tinv0[(r3 >> 16) & 255], 16) ^ Shift(Tinv0[(t2 >> 24) & 255], 8) ^ kw[1];
- r2 = Tinv0[t2 & 255] ^ Shift(Tinv0[(t1 >> 8) & 255], 24) ^ Shift(Tinv0[(t0 >> 16) & 255], 16) ^ Shift(Tinv0[(r3 >> 24) & 255], 8) ^ kw[2];
- r3 = Tinv0[r3 & 255] ^ Shift(Tinv0[(t2 >> 8) & 255], 24) ^ Shift(Tinv0[(t1 >> 16) & 255], 16) ^ Shift(Tinv0[(t0 >> 24) & 255], 8) ^ kw[3];
-
- // the final round's table is a simple function of Si so we don't use a whole other four tables for it
-
- kw = KW[0];
- this.C0 = (uint)Si[r0 & 255] ^ (((uint)s[(r3 >> 8) & 255]) << 8) ^ (((uint)s[(r2 >> 16) & 255]) << 16) ^ (((uint)Si[(r1 >> 24) & 255]) << 24) ^ kw[0];
- this.C1 = (uint)s[r1 & 255] ^ (((uint)s[(r0 >> 8) & 255]) << 8) ^ (((uint)Si[(r3 >> 16) & 255]) << 16) ^ (((uint)s[(r2 >> 24) & 255]) << 24) ^ kw[1];
- this.C2 = (uint)s[r2 & 255] ^ (((uint)Si[(r1 >> 8) & 255]) << 8) ^ (((uint)Si[(r0 >> 16) & 255]) << 16) ^ (((uint)s[(r3 >> 24) & 255]) << 24) ^ kw[2];
- this.C3 = (uint)Si[r3 & 255] ^ (((uint)s[(r2 >> 8) & 255]) << 8) ^ (((uint)s[(r1 >> 16) & 255]) << 16) ^ (((uint)s[(r0 >> 24) & 255]) << 24) ^ kw[3];
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/AesFastEngine.cs b/BCCrypto/src/crypto/engines/AesFastEngine.cs
deleted file mode 100644
index 9d3a86f..0000000
--- a/BCCrypto/src/crypto/engines/AesFastEngine.cs
+++ /dev/null
@@ -1,948 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * an implementation of the AES (Rijndael)), from FIPS-197.
- *
- * For further details see: http://csrc.nist.gov/encryption/aes/ .
- *
- * This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at
- * http://fp.gladman.plus.com/cryptography_technology/rijndael/
- *
- * There are three levels of tradeoff of speed vs memory
- * Because java has no preprocessor), they are written as three separate classes from which to choose
- *
- * The fastest uses 8Kbytes of static tables to precompute round calculations), 4 256 word tables for encryption
- * and 4 for decryption.
- *
- * The middle performance version uses only one 256 word table for each), for a total of 2Kbytes),
- * adding 12 rotate operations per round to compute the values contained in the other tables from
- * the contents of the first
- *
- * The slowest version uses no static tables at all and computes the values in each round
- *
- *
- * This file contains the fast version with 8Kbytes of static tables for round precomputation
- *
- */
- ///
- /// Unfortunately this class has a few side channel issues.
- /// In an environment where encryption/decryption may be closely observed it should not be used.
- ///
- [Obsolete("Use AesEngine instead")]
- public class AesFastEngine
- : IBlockCipher
- {
- // The S box
- private static readonly byte[] S =
- {
- 99, 124, 119, 123, 242, 107, 111, 197,
- 48, 1, 103, 43, 254, 215, 171, 118,
- 202, 130, 201, 125, 250, 89, 71, 240,
- 173, 212, 162, 175, 156, 164, 114, 192,
- 183, 253, 147, 38, 54, 63, 247, 204,
- 52, 165, 229, 241, 113, 216, 49, 21,
- 4, 199, 35, 195, 24, 150, 5, 154,
- 7, 18, 128, 226, 235, 39, 178, 117,
- 9, 131, 44, 26, 27, 110, 90, 160,
- 82, 59, 214, 179, 41, 227, 47, 132,
- 83, 209, 0, 237, 32, 252, 177, 91,
- 106, 203, 190, 57, 74, 76, 88, 207,
- 208, 239, 170, 251, 67, 77, 51, 133,
- 69, 249, 2, 127, 80, 60, 159, 168,
- 81, 163, 64, 143, 146, 157, 56, 245,
- 188, 182, 218, 33, 16, 255, 243, 210,
- 205, 12, 19, 236, 95, 151, 68, 23,
- 196, 167, 126, 61, 100, 93, 25, 115,
- 96, 129, 79, 220, 34, 42, 144, 136,
- 70, 238, 184, 20, 222, 94, 11, 219,
- 224, 50, 58, 10, 73, 6, 36, 92,
- 194, 211, 172, 98, 145, 149, 228, 121,
- 231, 200, 55, 109, 141, 213, 78, 169,
- 108, 86, 244, 234, 101, 122, 174, 8,
- 186, 120, 37, 46, 28, 166, 180, 198,
- 232, 221, 116, 31, 75, 189, 139, 138,
- 112, 62, 181, 102, 72, 3, 246, 14,
- 97, 53, 87, 185, 134, 193, 29, 158,
- 225, 248, 152, 17, 105, 217, 142, 148,
- 155, 30, 135, 233, 206, 85, 40, 223,
- 140, 161, 137, 13, 191, 230, 66, 104,
- 65, 153, 45, 15, 176, 84, 187, 22,
- };
-
- // The inverse S-box
- private static readonly byte[] Si =
- {
- 82, 9, 106, 213, 48, 54, 165, 56,
- 191, 64, 163, 158, 129, 243, 215, 251,
- 124, 227, 57, 130, 155, 47, 255, 135,
- 52, 142, 67, 68, 196, 222, 233, 203,
- 84, 123, 148, 50, 166, 194, 35, 61,
- 238, 76, 149, 11, 66, 250, 195, 78,
- 8, 46, 161, 102, 40, 217, 36, 178,
- 118, 91, 162, 73, 109, 139, 209, 37,
- 114, 248, 246, 100, 134, 104, 152, 22,
- 212, 164, 92, 204, 93, 101, 182, 146,
- 108, 112, 72, 80, 253, 237, 185, 218,
- 94, 21, 70, 87, 167, 141, 157, 132,
- 144, 216, 171, 0, 140, 188, 211, 10,
- 247, 228, 88, 5, 184, 179, 69, 6,
- 208, 44, 30, 143, 202, 63, 15, 2,
- 193, 175, 189, 3, 1, 19, 138, 107,
- 58, 145, 17, 65, 79, 103, 220, 234,
- 151, 242, 207, 206, 240, 180, 230, 115,
- 150, 172, 116, 34, 231, 173, 53, 133,
- 226, 249, 55, 232, 28, 117, 223, 110,
- 71, 241, 26, 113, 29, 41, 197, 137,
- 111, 183, 98, 14, 170, 24, 190, 27,
- 252, 86, 62, 75, 198, 210, 121, 32,
- 154, 219, 192, 254, 120, 205, 90, 244,
- 31, 221, 168, 51, 136, 7, 199, 49,
- 177, 18, 16, 89, 39, 128, 236, 95,
- 96, 81, 127, 169, 25, 181, 74, 13,
- 45, 229, 122, 159, 147, 201, 156, 239,
- 160, 224, 59, 77, 174, 42, 245, 176,
- 200, 235, 187, 60, 131, 83, 153, 97,
- 23, 43, 4, 126, 186, 119, 214, 38,
- 225, 105, 20, 99, 85, 33, 12, 125,
- };
-
- // vector used in calculating key schedule (powers of x in GF(256))
- private static readonly byte[] rcon =
- {
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
- 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91
- };
-
- // precomputation tables of calculations for rounds
- private static readonly uint[] T0 =
- {
- 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, 0x0df2f2ff,
- 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, 0x50303060, 0x03010102,
- 0xa96767ce, 0x7d2b2b56, 0x19fefee7, 0x62d7d7b5, 0xe6abab4d,
- 0x9a7676ec, 0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa,
- 0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb, 0xecadad41,
- 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, 0xbf9c9c23, 0xf7a4a453,
- 0x967272e4, 0x5bc0c09b, 0xc2b7b775, 0x1cfdfde1, 0xae93933d,
- 0x6a26264c, 0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83,
- 0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9, 0x937171e2,
- 0x73d8d8ab, 0x53313162, 0x3f15152a, 0x0c040408, 0x52c7c795,
- 0x65232346, 0x5ec3c39d, 0x28181830, 0xa1969637, 0x0f05050a,
- 0xb59a9a2f, 0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df,
- 0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, 0x1b090912,
- 0x9e83831d, 0x742c2c58, 0x2e1a1a34, 0x2d1b1b36, 0xb26e6edc,
- 0xee5a5ab4, 0xfba0a05b, 0xf65252a4, 0x4d3b3b76, 0x61d6d6b7,
- 0xceb3b37d, 0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413,
- 0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1, 0x60202040,
- 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6, 0xbe6a6ad4, 0x46cbcb8d,
- 0xd9bebe67, 0x4b393972, 0xde4a4a94, 0xd44c4c98, 0xe85858b0,
- 0x4acfcf85, 0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed,
- 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, 0xcf45458a,
- 0x10f9f9e9, 0x06020204, 0x817f7ffe, 0xf05050a0, 0x443c3c78,
- 0xba9f9f25, 0xe3a8a84b, 0xf35151a2, 0xfea3a35d, 0xc0404080,
- 0x8a8f8f05, 0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1,
- 0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, 0x30101020,
- 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf, 0x4ccdcd81, 0x140c0c18,
- 0x35131326, 0x2fececc3, 0xe15f5fbe, 0xa2979735, 0xcc444488,
- 0x3917172e, 0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a,
- 0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6, 0xa06060c0,
- 0x98818119, 0xd14f4f9e, 0x7fdcdca3, 0x66222244, 0x7e2a2a54,
- 0xab90903b, 0x8388880b, 0xca46468c, 0x29eeeec7, 0xd3b8b86b,
- 0x3c141428, 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad,
- 0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, 0xdb494992,
- 0x0a06060c, 0x6c242448, 0xe45c5cb8, 0x5dc2c29f, 0x6ed3d3bd,
- 0xefacac43, 0xa66262c4, 0xa8919139, 0xa4959531, 0x37e4e4d3,
- 0x8b7979f2, 0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda,
- 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, 0xb46c6cd8,
- 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf, 0xaf6565ca, 0x8e7a7af4,
- 0xe9aeae47, 0x18080810, 0xd5baba6f, 0x887878f0, 0x6f25254a,
- 0x722e2e5c, 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697,
- 0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, 0xdd4b4b96,
- 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, 0x907070e0, 0x423e3e7c,
- 0xc4b5b571, 0xaa6666cc, 0xd8484890, 0x05030306, 0x01f6f6f7,
- 0x120e0e1c, 0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969,
- 0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27, 0x38e1e1d9,
- 0x13f8f8eb, 0xb398982b, 0x33111122, 0xbb6969d2, 0x70d9d9a9,
- 0x898e8e07, 0xa7949433, 0xb69b9b2d, 0x221e1e3c, 0x92878715,
- 0x20e9e9c9, 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5,
- 0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, 0xdabfbf65,
- 0x31e6e6d7, 0xc6424284, 0xb86868d0, 0xc3414182, 0xb0999929,
- 0x772d2d5a, 0x110f0f1e, 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d,
- 0x3a16162c
- };
-
- private static readonly uint[] T1 =
- {
- 0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d, 0xf2f2ff0d,
- 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154, 0x30306050, 0x01010203,
- 0x6767cea9, 0x2b2b567d, 0xfefee719, 0xd7d7b562, 0xabab4de6,
- 0x7676ec9a, 0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87,
- 0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b, 0xadad41ec,
- 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea, 0x9c9c23bf, 0xa4a453f7,
- 0x7272e496, 0xc0c09b5b, 0xb7b775c2, 0xfdfde11c, 0x93933dae,
- 0x26264c6a, 0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f,
- 0x3434685c, 0xa5a551f4, 0xe5e5d134, 0xf1f1f908, 0x7171e293,
- 0xd8d8ab73, 0x31316253, 0x15152a3f, 0x0404080c, 0xc7c79552,
- 0x23234665, 0xc3c39d5e, 0x18183028, 0x969637a1, 0x05050a0f,
- 0x9a9a2fb5, 0x07070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d,
- 0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f, 0x0909121b,
- 0x83831d9e, 0x2c2c5874, 0x1a1a342e, 0x1b1b362d, 0x6e6edcb2,
- 0x5a5ab4ee, 0xa0a05bfb, 0x5252a4f6, 0x3b3b764d, 0xd6d6b761,
- 0xb3b37dce, 0x2929527b, 0xe3e3dd3e, 0x2f2f5e71, 0x84841397,
- 0x5353a6f5, 0xd1d1b968, 0x00000000, 0xededc12c, 0x20204060,
- 0xfcfce31f, 0xb1b179c8, 0x5b5bb6ed, 0x6a6ad4be, 0xcbcb8d46,
- 0xbebe67d9, 0x3939724b, 0x4a4a94de, 0x4c4c98d4, 0x5858b0e8,
- 0xcfcf854a, 0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16,
- 0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194, 0x45458acf,
- 0xf9f9e910, 0x02020406, 0x7f7ffe81, 0x5050a0f0, 0x3c3c7844,
- 0x9f9f25ba, 0xa8a84be3, 0x5151a2f3, 0xa3a35dfe, 0x404080c0,
- 0x8f8f058a, 0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104,
- 0xbcbc63df, 0xb6b677c1, 0xdadaaf75, 0x21214263, 0x10102030,
- 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d, 0xcdcd814c, 0x0c0c1814,
- 0x13132635, 0xececc32f, 0x5f5fbee1, 0x979735a2, 0x444488cc,
- 0x17172e39, 0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47,
- 0x6464c8ac, 0x5d5dbae7, 0x1919322b, 0x7373e695, 0x6060c0a0,
- 0x81811998, 0x4f4f9ed1, 0xdcdca37f, 0x22224466, 0x2a2a547e,
- 0x90903bab, 0x88880b83, 0x46468cca, 0xeeeec729, 0xb8b86bd3,
- 0x1414283c, 0xdedea779, 0x5e5ebce2, 0x0b0b161d, 0xdbdbad76,
- 0xe0e0db3b, 0x32326456, 0x3a3a744e, 0x0a0a141e, 0x494992db,
- 0x06060c0a, 0x2424486c, 0x5c5cb8e4, 0xc2c29f5d, 0xd3d3bd6e,
- 0xacac43ef, 0x6262c4a6, 0x919139a8, 0x959531a4, 0xe4e4d337,
- 0x7979f28b, 0xe7e7d532, 0xc8c88b43, 0x37376e59, 0x6d6ddab7,
- 0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0, 0x6c6cd8b4,
- 0x5656acfa, 0xf4f4f307, 0xeaeacf25, 0x6565caaf, 0x7a7af48e,
- 0xaeae47e9, 0x08081018, 0xbaba6fd5, 0x7878f088, 0x25254a6f,
- 0x2e2e5c72, 0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751,
- 0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21, 0x4b4b96dd,
- 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85, 0x7070e090, 0x3e3e7c42,
- 0xb5b571c4, 0x6666ccaa, 0x484890d8, 0x03030605, 0xf6f6f701,
- 0x0e0e1c12, 0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0,
- 0x86861791, 0xc1c19958, 0x1d1d3a27, 0x9e9e27b9, 0xe1e1d938,
- 0xf8f8eb13, 0x98982bb3, 0x11112233, 0x6969d2bb, 0xd9d9a970,
- 0x8e8e0789, 0x949433a7, 0x9b9b2db6, 0x1e1e3c22, 0x87871592,
- 0xe9e9c920, 0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a,
- 0x8c8c038f, 0xa1a159f8, 0x89890980, 0x0d0d1a17, 0xbfbf65da,
- 0xe6e6d731, 0x424284c6, 0x6868d0b8, 0x414182c3, 0x999929b0,
- 0x2d2d5a77, 0x0f0f1e11, 0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6,
- 0x16162c3a
- };
-
- private static readonly uint[] T2 =
- {
- 0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b, 0xf2ff0df2,
- 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5, 0x30605030, 0x01020301,
- 0x67cea967, 0x2b567d2b, 0xfee719fe, 0xd7b562d7, 0xab4de6ab,
- 0x76ec9a76, 0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d,
- 0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0, 0xad41ecad,
- 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf, 0x9c23bf9c, 0xa453f7a4,
- 0x72e49672, 0xc09b5bc0, 0xb775c2b7, 0xfde11cfd, 0x933dae93,
- 0x264c6a26, 0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc,
- 0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1, 0x71e29371,
- 0xd8ab73d8, 0x31625331, 0x152a3f15, 0x04080c04, 0xc79552c7,
- 0x23466523, 0xc39d5ec3, 0x18302818, 0x9637a196, 0x050a0f05,
- 0x9a2fb59a, 0x070e0907, 0x12243612, 0x801b9b80, 0xe2df3de2,
- 0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75, 0x09121b09,
- 0x831d9e83, 0x2c58742c, 0x1a342e1a, 0x1b362d1b, 0x6edcb26e,
- 0x5ab4ee5a, 0xa05bfba0, 0x52a4f652, 0x3b764d3b, 0xd6b761d6,
- 0xb37dceb3, 0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784,
- 0x53a6f553, 0xd1b968d1, 0x00000000, 0xedc12ced, 0x20406020,
- 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b, 0x6ad4be6a, 0xcb8d46cb,
- 0xbe67d9be, 0x39724b39, 0x4a94de4a, 0x4c98d44c, 0x58b0e858,
- 0xcf854acf, 0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb,
- 0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485, 0x458acf45,
- 0xf9e910f9, 0x02040602, 0x7ffe817f, 0x50a0f050, 0x3c78443c,
- 0x9f25ba9f, 0xa84be3a8, 0x51a2f351, 0xa35dfea3, 0x4080c040,
- 0x8f058a8f, 0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5,
- 0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321, 0x10203010,
- 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2, 0xcd814ccd, 0x0c18140c,
- 0x13263513, 0xecc32fec, 0x5fbee15f, 0x9735a297, 0x4488cc44,
- 0x172e3917, 0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d,
- 0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573, 0x60c0a060,
- 0x81199881, 0x4f9ed14f, 0xdca37fdc, 0x22446622, 0x2a547e2a,
- 0x903bab90, 0x880b8388, 0x468cca46, 0xeec729ee, 0xb86bd3b8,
- 0x14283c14, 0xdea779de, 0x5ebce25e, 0x0b161d0b, 0xdbad76db,
- 0xe0db3be0, 0x32645632, 0x3a744e3a, 0x0a141e0a, 0x4992db49,
- 0x060c0a06, 0x24486c24, 0x5cb8e45c, 0xc29f5dc2, 0xd3bd6ed3,
- 0xac43efac, 0x62c4a662, 0x9139a891, 0x9531a495, 0xe4d337e4,
- 0x79f28b79, 0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d,
- 0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9, 0x6cd8b46c,
- 0x56acfa56, 0xf4f307f4, 0xeacf25ea, 0x65caaf65, 0x7af48e7a,
- 0xae47e9ae, 0x08101808, 0xba6fd5ba, 0x78f08878, 0x254a6f25,
- 0x2e5c722e, 0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6,
- 0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f, 0x4b96dd4b,
- 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a, 0x70e09070, 0x3e7c423e,
- 0xb571c4b5, 0x66ccaa66, 0x4890d848, 0x03060503, 0xf6f701f6,
- 0x0e1c120e, 0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9,
- 0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e, 0xe1d938e1,
- 0xf8eb13f8, 0x982bb398, 0x11223311, 0x69d2bb69, 0xd9a970d9,
- 0x8e07898e, 0x9433a794, 0x9b2db69b, 0x1e3c221e, 0x87159287,
- 0xe9c920e9, 0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf,
- 0x8c038f8c, 0xa159f8a1, 0x89098089, 0x0d1a170d, 0xbf65dabf,
- 0xe6d731e6, 0x4284c642, 0x68d0b868, 0x4182c341, 0x9929b099,
- 0x2d5a772d, 0x0f1e110f, 0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb,
- 0x162c3a16
- };
-
- private static readonly uint[] T3 =
- {
- 0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b, 0xff0df2f2,
- 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5, 0x60503030, 0x02030101,
- 0xcea96767, 0x567d2b2b, 0xe719fefe, 0xb562d7d7, 0x4de6abab,
- 0xec9a7676, 0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d,
- 0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0, 0x41ecadad,
- 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf, 0x23bf9c9c, 0x53f7a4a4,
- 0xe4967272, 0x9b5bc0c0, 0x75c2b7b7, 0xe11cfdfd, 0x3dae9393,
- 0x4c6a2626, 0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc,
- 0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1, 0xe2937171,
- 0xab73d8d8, 0x62533131, 0x2a3f1515, 0x080c0404, 0x9552c7c7,
- 0x46652323, 0x9d5ec3c3, 0x30281818, 0x37a19696, 0x0a0f0505,
- 0x2fb59a9a, 0x0e090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2,
- 0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575, 0x121b0909,
- 0x1d9e8383, 0x58742c2c, 0x342e1a1a, 0x362d1b1b, 0xdcb26e6e,
- 0xb4ee5a5a, 0x5bfba0a0, 0xa4f65252, 0x764d3b3b, 0xb761d6d6,
- 0x7dceb3b3, 0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484,
- 0xa6f55353, 0xb968d1d1, 0x00000000, 0xc12ceded, 0x40602020,
- 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b, 0xd4be6a6a, 0x8d46cbcb,
- 0x67d9bebe, 0x724b3939, 0x94de4a4a, 0x98d44c4c, 0xb0e85858,
- 0x854acfcf, 0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb,
- 0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585, 0x8acf4545,
- 0xe910f9f9, 0x04060202, 0xfe817f7f, 0xa0f05050, 0x78443c3c,
- 0x25ba9f9f, 0x4be3a8a8, 0xa2f35151, 0x5dfea3a3, 0x80c04040,
- 0x058a8f8f, 0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5,
- 0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121, 0x20301010,
- 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2, 0x814ccdcd, 0x18140c0c,
- 0x26351313, 0xc32fecec, 0xbee15f5f, 0x35a29797, 0x88cc4444,
- 0x2e391717, 0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d,
- 0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373, 0xc0a06060,
- 0x19988181, 0x9ed14f4f, 0xa37fdcdc, 0x44662222, 0x547e2a2a,
- 0x3bab9090, 0x0b838888, 0x8cca4646, 0xc729eeee, 0x6bd3b8b8,
- 0x283c1414, 0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb,
- 0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a, 0x92db4949,
- 0x0c0a0606, 0x486c2424, 0xb8e45c5c, 0x9f5dc2c2, 0xbd6ed3d3,
- 0x43efacac, 0xc4a66262, 0x39a89191, 0x31a49595, 0xd337e4e4,
- 0xf28b7979, 0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d,
- 0x018c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9, 0xd8b46c6c,
- 0xacfa5656, 0xf307f4f4, 0xcf25eaea, 0xcaaf6565, 0xf48e7a7a,
- 0x47e9aeae, 0x10180808, 0x6fd5baba, 0xf0887878, 0x4a6f2525,
- 0x5c722e2e, 0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6,
- 0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f, 0x96dd4b4b,
- 0x61dcbdbd, 0x0d868b8b, 0x0f858a8a, 0xe0907070, 0x7c423e3e,
- 0x71c4b5b5, 0xccaa6666, 0x90d84848, 0x06050303, 0xf701f6f6,
- 0x1c120e0e, 0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9,
- 0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e, 0xd938e1e1,
- 0xeb13f8f8, 0x2bb39898, 0x22331111, 0xd2bb6969, 0xa970d9d9,
- 0x07898e8e, 0x33a79494, 0x2db69b9b, 0x3c221e1e, 0x15928787,
- 0xc920e9e9, 0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf,
- 0x038f8c8c, 0x59f8a1a1, 0x09808989, 0x1a170d0d, 0x65dabfbf,
- 0xd731e6e6, 0x84c64242, 0xd0b86868, 0x82c34141, 0x29b09999,
- 0x5a772d2d, 0x1e110f0f, 0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb,
- 0x2c3a1616
- };
-
- private static readonly uint[] Tinv0 =
- {
- 0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a, 0xcb6bab3b,
- 0xf1459d1f, 0xab58faac, 0x9303e34b, 0x55fa3020, 0xf66d76ad,
- 0x9176cc88, 0x254c02f5, 0xfcd7e54f, 0xd7cb2ac5, 0x80443526,
- 0x8fa362b5, 0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d,
- 0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b, 0xe75f8f03,
- 0x959c9215, 0xeb7a6dbf, 0xda595295, 0x2d83bed4, 0xd3217458,
- 0x2969e049, 0x44c8c98e, 0x6a89c275, 0x78798ef4, 0x6b3e5899,
- 0xdd71b927, 0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d,
- 0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362, 0xe07764b1,
- 0x84ae6bbb, 0x1ca081fe, 0x942b08f9, 0x58684870, 0x19fd458f,
- 0x876cde94, 0xb7f87b52, 0x23d373ab, 0xe2024b72, 0x578f1fe3,
- 0x2aab5566, 0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3,
- 0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed, 0x2b1ccf8a,
- 0x92b479a7, 0xf0f207f3, 0xa1e2694e, 0xcdf4da65, 0xd5be0506,
- 0x1f6234d1, 0x8afea6c4, 0x9d532e34, 0xa055f3a2, 0x32e18a05,
- 0x75ebf6a4, 0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd,
- 0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d, 0xb58d5491,
- 0x055dc471, 0x6fd40604, 0xff155060, 0x24fb9819, 0x97e9bdd6,
- 0xcc434089, 0x779ed967, 0xbd42e8b0, 0x888b8907, 0x385b19e7,
- 0xdbeec879, 0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000,
- 0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c, 0xfbff0efd,
- 0x5638850f, 0x1ed5ae3d, 0x27392d36, 0x64d90f0a, 0x21a65c68,
- 0xd1545b9b, 0x3a2e3624, 0xb1670a0c, 0x0fe75793, 0xd296eeb4,
- 0x9e919b1b, 0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c,
- 0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12, 0x0b0d090e,
- 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14, 0x8519f157, 0x4c0775af,
- 0xbbdd99ee, 0xfd607fa3, 0x9f2601f7, 0xbcf5725c, 0xc53b6644,
- 0x347efb5b, 0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8,
- 0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684, 0x7d244a85,
- 0xf83dbbd2, 0x1132f9ae, 0x6da129c7, 0x4b2f9e1d, 0xf330b2dc,
- 0xec52860d, 0xd0e3c177, 0x6c16b32b, 0x99b970a9, 0xfa489411,
- 0x2264e947, 0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322,
- 0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498, 0xcf81f5a6,
- 0x28de7aa5, 0x268eb7da, 0xa4bfad3f, 0xe49d3a2c, 0x0d927850,
- 0x9bcc5f6a, 0x62467e54, 0xc2138df6, 0xe8b8d890, 0x5ef7392e,
- 0xf5afc382, 0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf,
- 0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb, 0x097826cd,
- 0xf418596e, 0x01b79aec, 0xa89a4f83, 0x656e95e6, 0x7ee6ffaa,
- 0x08cfbc21, 0xe6e815ef, 0xd99be7ba, 0xce366f4a, 0xd4099fea,
- 0xd67cb029, 0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235,
- 0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733, 0x4a9804f1,
- 0xf7daec41, 0x0e50cd7f, 0x2ff69117, 0x8dd64d76, 0x4db0ef43,
- 0x544daacc, 0xdf0496e4, 0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1,
- 0x7f516546, 0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb,
- 0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d, 0x8c61d79a,
- 0x7a0ca137, 0x8e14f859, 0x893c13eb, 0xee27a9ce, 0x35c961b7,
- 0xede51ce1, 0x3cb1477a, 0x59dfd29c, 0x3f73f255, 0x79ce1418,
- 0xbf37c773, 0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478,
- 0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2, 0x72c31d16,
- 0x0c25e2bc, 0x8b493c28, 0x41950dff, 0x7101a839, 0xdeb30c08,
- 0x9ce4b4d8, 0x90c15664, 0x6184cb7b, 0x70b632d5, 0x745c6c48,
- 0x4257b8d0
- };
-
- private static readonly uint[] Tinv1 =
- {
- 0xa7f45150, 0x65417e53, 0xa4171ac3, 0x5e273a96, 0x6bab3bcb,
- 0x459d1ff1, 0x58faacab, 0x03e34b93, 0xfa302055, 0x6d76adf6,
- 0x76cc8891, 0x4c02f525, 0xd7e54ffc, 0xcb2ac5d7, 0x44352680,
- 0xa362b58f, 0x5ab1de49, 0x1bba2567, 0x0eea4598, 0xc0fe5de1,
- 0x752fc302, 0xf04c8112, 0x97468da3, 0xf9d36bc6, 0x5f8f03e7,
- 0x9c921595, 0x7a6dbfeb, 0x595295da, 0x83bed42d, 0x217458d3,
- 0x69e04929, 0xc8c98e44, 0x89c2756a, 0x798ef478, 0x3e58996b,
- 0x71b927dd, 0x4fe1beb6, 0xad88f017, 0xac20c966, 0x3ace7db4,
- 0x4adf6318, 0x311ae582, 0x33519760, 0x7f536245, 0x7764b1e0,
- 0xae6bbb84, 0xa081fe1c, 0x2b08f994, 0x68487058, 0xfd458f19,
- 0x6cde9487, 0xf87b52b7, 0xd373ab23, 0x024b72e2, 0x8f1fe357,
- 0xab55662a, 0x28ebb207, 0xc2b52f03, 0x7bc5869a, 0x0837d3a5,
- 0x872830f2, 0xa5bf23b2, 0x6a0302ba, 0x8216ed5c, 0x1ccf8a2b,
- 0xb479a792, 0xf207f3f0, 0xe2694ea1, 0xf4da65cd, 0xbe0506d5,
- 0x6234d11f, 0xfea6c48a, 0x532e349d, 0x55f3a2a0, 0xe18a0532,
- 0xebf6a475, 0xec830b39, 0xef6040aa, 0x9f715e06, 0x106ebd51,
- 0x8a213ef9, 0x06dd963d, 0x053eddae, 0xbde64d46, 0x8d5491b5,
- 0x5dc47105, 0xd406046f, 0x155060ff, 0xfb981924, 0xe9bdd697,
- 0x434089cc, 0x9ed96777, 0x42e8b0bd, 0x8b890788, 0x5b19e738,
- 0xeec879db, 0x0a7ca147, 0x0f427ce9, 0x1e84f8c9, 0x00000000,
- 0x86800983, 0xed2b3248, 0x70111eac, 0x725a6c4e, 0xff0efdfb,
- 0x38850f56, 0xd5ae3d1e, 0x392d3627, 0xd90f0a64, 0xa65c6821,
- 0x545b9bd1, 0x2e36243a, 0x670a0cb1, 0xe757930f, 0x96eeb4d2,
- 0x919b1b9e, 0xc5c0804f, 0x20dc61a2, 0x4b775a69, 0x1a121c16,
- 0xba93e20a, 0x2aa0c0e5, 0xe0223c43, 0x171b121d, 0x0d090e0b,
- 0xc78bf2ad, 0xa8b62db9, 0xa91e14c8, 0x19f15785, 0x0775af4c,
- 0xdd99eebb, 0x607fa3fd, 0x2601f79f, 0xf5725cbc, 0x3b6644c5,
- 0x7efb5b34, 0x29438b76, 0xc623cbdc, 0xfcedb668, 0xf1e4b863,
- 0xdc31d7ca, 0x85634210, 0x22971340, 0x11c68420, 0x244a857d,
- 0x3dbbd2f8, 0x32f9ae11, 0xa129c76d, 0x2f9e1d4b, 0x30b2dcf3,
- 0x52860dec, 0xe3c177d0, 0x16b32b6c, 0xb970a999, 0x489411fa,
- 0x64e94722, 0x8cfca8c4, 0x3ff0a01a, 0x2c7d56d8, 0x903322ef,
- 0x4e4987c7, 0xd138d9c1, 0xa2ca8cfe, 0x0bd49836, 0x81f5a6cf,
- 0xde7aa528, 0x8eb7da26, 0xbfad3fa4, 0x9d3a2ce4, 0x9278500d,
- 0xcc5f6a9b, 0x467e5462, 0x138df6c2, 0xb8d890e8, 0xf7392e5e,
- 0xafc382f5, 0x805d9fbe, 0x93d0697c, 0x2dd56fa9, 0x1225cfb3,
- 0x99acc83b, 0x7d1810a7, 0x639ce86e, 0xbb3bdb7b, 0x7826cd09,
- 0x18596ef4, 0xb79aec01, 0x9a4f83a8, 0x6e95e665, 0xe6ffaa7e,
- 0xcfbc2108, 0xe815efe6, 0x9be7bad9, 0x366f4ace, 0x099fead4,
- 0x7cb029d6, 0xb2a431af, 0x233f2a31, 0x94a5c630, 0x66a235c0,
- 0xbc4e7437, 0xca82fca6, 0xd090e0b0, 0xd8a73315, 0x9804f14a,
- 0xdaec41f7, 0x50cd7f0e, 0xf691172f, 0xd64d768d, 0xb0ef434d,
- 0x4daacc54, 0x0496e4df, 0xb5d19ee3, 0x886a4c1b, 0x1f2cc1b8,
- 0x5165467f, 0xea5e9d04, 0x358c015d, 0x7487fa73, 0x410bfb2e,
- 0x1d67b35a, 0xd2db9252, 0x5610e933, 0x47d66d13, 0x61d79a8c,
- 0x0ca1377a, 0x14f8598e, 0x3c13eb89, 0x27a9ceee, 0xc961b735,
- 0xe51ce1ed, 0xb1477a3c, 0xdfd29c59, 0x73f2553f, 0xce141879,
- 0x37c773bf, 0xcdf753ea, 0xaafd5f5b, 0x6f3ddf14, 0xdb447886,
- 0xf3afca81, 0xc468b93e, 0x3424382c, 0x40a3c25f, 0xc31d1672,
- 0x25e2bc0c, 0x493c288b, 0x950dff41, 0x01a83971, 0xb30c08de,
- 0xe4b4d89c, 0xc1566490, 0x84cb7b61, 0xb632d570, 0x5c6c4874,
- 0x57b8d042
- };
-
- private static readonly uint[] Tinv2 =
- {
- 0xf45150a7, 0x417e5365, 0x171ac3a4, 0x273a965e, 0xab3bcb6b,
- 0x9d1ff145, 0xfaacab58, 0xe34b9303, 0x302055fa, 0x76adf66d,
- 0xcc889176, 0x02f5254c, 0xe54ffcd7, 0x2ac5d7cb, 0x35268044,
- 0x62b58fa3, 0xb1de495a, 0xba25671b, 0xea45980e, 0xfe5de1c0,
- 0x2fc30275, 0x4c8112f0, 0x468da397, 0xd36bc6f9, 0x8f03e75f,
- 0x9215959c, 0x6dbfeb7a, 0x5295da59, 0xbed42d83, 0x7458d321,
- 0xe0492969, 0xc98e44c8, 0xc2756a89, 0x8ef47879, 0x58996b3e,
- 0xb927dd71, 0xe1beb64f, 0x88f017ad, 0x20c966ac, 0xce7db43a,
- 0xdf63184a, 0x1ae58231, 0x51976033, 0x5362457f, 0x64b1e077,
- 0x6bbb84ae, 0x81fe1ca0, 0x08f9942b, 0x48705868, 0x458f19fd,
- 0xde94876c, 0x7b52b7f8, 0x73ab23d3, 0x4b72e202, 0x1fe3578f,
- 0x55662aab, 0xebb20728, 0xb52f03c2, 0xc5869a7b, 0x37d3a508,
- 0x2830f287, 0xbf23b2a5, 0x0302ba6a, 0x16ed5c82, 0xcf8a2b1c,
- 0x79a792b4, 0x07f3f0f2, 0x694ea1e2, 0xda65cdf4, 0x0506d5be,
- 0x34d11f62, 0xa6c48afe, 0x2e349d53, 0xf3a2a055, 0x8a0532e1,
- 0xf6a475eb, 0x830b39ec, 0x6040aaef, 0x715e069f, 0x6ebd5110,
- 0x213ef98a, 0xdd963d06, 0x3eddae05, 0xe64d46bd, 0x5491b58d,
- 0xc471055d, 0x06046fd4, 0x5060ff15, 0x981924fb, 0xbdd697e9,
- 0x4089cc43, 0xd967779e, 0xe8b0bd42, 0x8907888b, 0x19e7385b,
- 0xc879dbee, 0x7ca1470a, 0x427ce90f, 0x84f8c91e, 0x00000000,
- 0x80098386, 0x2b3248ed, 0x111eac70, 0x5a6c4e72, 0x0efdfbff,
- 0x850f5638, 0xae3d1ed5, 0x2d362739, 0x0f0a64d9, 0x5c6821a6,
- 0x5b9bd154, 0x36243a2e, 0x0a0cb167, 0x57930fe7, 0xeeb4d296,
- 0x9b1b9e91, 0xc0804fc5, 0xdc61a220, 0x775a694b, 0x121c161a,
- 0x93e20aba, 0xa0c0e52a, 0x223c43e0, 0x1b121d17, 0x090e0b0d,
- 0x8bf2adc7, 0xb62db9a8, 0x1e14c8a9, 0xf1578519, 0x75af4c07,
- 0x99eebbdd, 0x7fa3fd60, 0x01f79f26, 0x725cbcf5, 0x6644c53b,
- 0xfb5b347e, 0x438b7629, 0x23cbdcc6, 0xedb668fc, 0xe4b863f1,
- 0x31d7cadc, 0x63421085, 0x97134022, 0xc6842011, 0x4a857d24,
- 0xbbd2f83d, 0xf9ae1132, 0x29c76da1, 0x9e1d4b2f, 0xb2dcf330,
- 0x860dec52, 0xc177d0e3, 0xb32b6c16, 0x70a999b9, 0x9411fa48,
- 0xe9472264, 0xfca8c48c, 0xf0a01a3f, 0x7d56d82c, 0x3322ef90,
- 0x4987c74e, 0x38d9c1d1, 0xca8cfea2, 0xd498360b, 0xf5a6cf81,
- 0x7aa528de, 0xb7da268e, 0xad3fa4bf, 0x3a2ce49d, 0x78500d92,
- 0x5f6a9bcc, 0x7e546246, 0x8df6c213, 0xd890e8b8, 0x392e5ef7,
- 0xc382f5af, 0x5d9fbe80, 0xd0697c93, 0xd56fa92d, 0x25cfb312,
- 0xacc83b99, 0x1810a77d, 0x9ce86e63, 0x3bdb7bbb, 0x26cd0978,
- 0x596ef418, 0x9aec01b7, 0x4f83a89a, 0x95e6656e, 0xffaa7ee6,
- 0xbc2108cf, 0x15efe6e8, 0xe7bad99b, 0x6f4ace36, 0x9fead409,
- 0xb029d67c, 0xa431afb2, 0x3f2a3123, 0xa5c63094, 0xa235c066,
- 0x4e7437bc, 0x82fca6ca, 0x90e0b0d0, 0xa73315d8, 0x04f14a98,
- 0xec41f7da, 0xcd7f0e50, 0x91172ff6, 0x4d768dd6, 0xef434db0,
- 0xaacc544d, 0x96e4df04, 0xd19ee3b5, 0x6a4c1b88, 0x2cc1b81f,
- 0x65467f51, 0x5e9d04ea, 0x8c015d35, 0x87fa7374, 0x0bfb2e41,
- 0x67b35a1d, 0xdb9252d2, 0x10e93356, 0xd66d1347, 0xd79a8c61,
- 0xa1377a0c, 0xf8598e14, 0x13eb893c, 0xa9ceee27, 0x61b735c9,
- 0x1ce1ede5, 0x477a3cb1, 0xd29c59df, 0xf2553f73, 0x141879ce,
- 0xc773bf37, 0xf753eacd, 0xfd5f5baa, 0x3ddf146f, 0x447886db,
- 0xafca81f3, 0x68b93ec4, 0x24382c34, 0xa3c25f40, 0x1d1672c3,
- 0xe2bc0c25, 0x3c288b49, 0x0dff4195, 0xa8397101, 0x0c08deb3,
- 0xb4d89ce4, 0x566490c1, 0xcb7b6184, 0x32d570b6, 0x6c48745c,
- 0xb8d04257
- };
-
- private static readonly uint[] Tinv3 =
- {
- 0x5150a7f4, 0x7e536541, 0x1ac3a417, 0x3a965e27, 0x3bcb6bab,
- 0x1ff1459d, 0xacab58fa, 0x4b9303e3, 0x2055fa30, 0xadf66d76,
- 0x889176cc, 0xf5254c02, 0x4ffcd7e5, 0xc5d7cb2a, 0x26804435,
- 0xb58fa362, 0xde495ab1, 0x25671bba, 0x45980eea, 0x5de1c0fe,
- 0xc302752f, 0x8112f04c, 0x8da39746, 0x6bc6f9d3, 0x03e75f8f,
- 0x15959c92, 0xbfeb7a6d, 0x95da5952, 0xd42d83be, 0x58d32174,
- 0x492969e0, 0x8e44c8c9, 0x756a89c2, 0xf478798e, 0x996b3e58,
- 0x27dd71b9, 0xbeb64fe1, 0xf017ad88, 0xc966ac20, 0x7db43ace,
- 0x63184adf, 0xe582311a, 0x97603351, 0x62457f53, 0xb1e07764,
- 0xbb84ae6b, 0xfe1ca081, 0xf9942b08, 0x70586848, 0x8f19fd45,
- 0x94876cde, 0x52b7f87b, 0xab23d373, 0x72e2024b, 0xe3578f1f,
- 0x662aab55, 0xb20728eb, 0x2f03c2b5, 0x869a7bc5, 0xd3a50837,
- 0x30f28728, 0x23b2a5bf, 0x02ba6a03, 0xed5c8216, 0x8a2b1ccf,
- 0xa792b479, 0xf3f0f207, 0x4ea1e269, 0x65cdf4da, 0x06d5be05,
- 0xd11f6234, 0xc48afea6, 0x349d532e, 0xa2a055f3, 0x0532e18a,
- 0xa475ebf6, 0x0b39ec83, 0x40aaef60, 0x5e069f71, 0xbd51106e,
- 0x3ef98a21, 0x963d06dd, 0xddae053e, 0x4d46bde6, 0x91b58d54,
- 0x71055dc4, 0x046fd406, 0x60ff1550, 0x1924fb98, 0xd697e9bd,
- 0x89cc4340, 0x67779ed9, 0xb0bd42e8, 0x07888b89, 0xe7385b19,
- 0x79dbeec8, 0xa1470a7c, 0x7ce90f42, 0xf8c91e84, 0x00000000,
- 0x09838680, 0x3248ed2b, 0x1eac7011, 0x6c4e725a, 0xfdfbff0e,
- 0x0f563885, 0x3d1ed5ae, 0x3627392d, 0x0a64d90f, 0x6821a65c,
- 0x9bd1545b, 0x243a2e36, 0x0cb1670a, 0x930fe757, 0xb4d296ee,
- 0x1b9e919b, 0x804fc5c0, 0x61a220dc, 0x5a694b77, 0x1c161a12,
- 0xe20aba93, 0xc0e52aa0, 0x3c43e022, 0x121d171b, 0x0e0b0d09,
- 0xf2adc78b, 0x2db9a8b6, 0x14c8a91e, 0x578519f1, 0xaf4c0775,
- 0xeebbdd99, 0xa3fd607f, 0xf79f2601, 0x5cbcf572, 0x44c53b66,
- 0x5b347efb, 0x8b762943, 0xcbdcc623, 0xb668fced, 0xb863f1e4,
- 0xd7cadc31, 0x42108563, 0x13402297, 0x842011c6, 0x857d244a,
- 0xd2f83dbb, 0xae1132f9, 0xc76da129, 0x1d4b2f9e, 0xdcf330b2,
- 0x0dec5286, 0x77d0e3c1, 0x2b6c16b3, 0xa999b970, 0x11fa4894,
- 0x472264e9, 0xa8c48cfc, 0xa01a3ff0, 0x56d82c7d, 0x22ef9033,
- 0x87c74e49, 0xd9c1d138, 0x8cfea2ca, 0x98360bd4, 0xa6cf81f5,
- 0xa528de7a, 0xda268eb7, 0x3fa4bfad, 0x2ce49d3a, 0x500d9278,
- 0x6a9bcc5f, 0x5462467e, 0xf6c2138d, 0x90e8b8d8, 0x2e5ef739,
- 0x82f5afc3, 0x9fbe805d, 0x697c93d0, 0x6fa92dd5, 0xcfb31225,
- 0xc83b99ac, 0x10a77d18, 0xe86e639c, 0xdb7bbb3b, 0xcd097826,
- 0x6ef41859, 0xec01b79a, 0x83a89a4f, 0xe6656e95, 0xaa7ee6ff,
- 0x2108cfbc, 0xefe6e815, 0xbad99be7, 0x4ace366f, 0xead4099f,
- 0x29d67cb0, 0x31afb2a4, 0x2a31233f, 0xc63094a5, 0x35c066a2,
- 0x7437bc4e, 0xfca6ca82, 0xe0b0d090, 0x3315d8a7, 0xf14a9804,
- 0x41f7daec, 0x7f0e50cd, 0x172ff691, 0x768dd64d, 0x434db0ef,
- 0xcc544daa, 0xe4df0496, 0x9ee3b5d1, 0x4c1b886a, 0xc1b81f2c,
- 0x467f5165, 0x9d04ea5e, 0x015d358c, 0xfa737487, 0xfb2e410b,
- 0xb35a1d67, 0x9252d2db, 0xe9335610, 0x6d1347d6, 0x9a8c61d7,
- 0x377a0ca1, 0x598e14f8, 0xeb893c13, 0xceee27a9, 0xb735c961,
- 0xe1ede51c, 0x7a3cb147, 0x9c59dfd2, 0x553f73f2, 0x1879ce14,
- 0x73bf37c7, 0x53eacdf7, 0x5f5baafd, 0xdf146f3d, 0x7886db44,
- 0xca81f3af, 0xb93ec468, 0x382c3424, 0xc25f40a3, 0x1672c31d,
- 0xbc0c25e2, 0x288b493c, 0xff41950d, 0x397101a8, 0x08deb30c,
- 0xd89ce4b4, 0x6490c156, 0x7b6184cb, 0xd570b632, 0x48745c6c,
- 0xd04257b8
- };
-
- private static uint Shift(uint r, int shift)
- {
- return (r >> shift) | (r << (32 - shift));
- }
-
- /* multiply four bytes in GF(2^8) by 'x' {02} in parallel */
-
- private const uint m1 = 0x80808080;
- private const uint m2 = 0x7f7f7f7f;
- private const uint m3 = 0x0000001b;
- private const uint m4 = 0xC0C0C0C0;
- private const uint m5 = 0x3f3f3f3f;
-
- private static uint FFmulX(uint x)
- {
- return ((x & m2) << 1) ^ (((x & m1) >> 7) * m3);
- }
-
- private static uint FFmulX2(uint x)
- {
- uint t0 = (x & m5) << 2;
- uint t1 = (x & m4);
- t1 ^= (t1 >> 1);
- return t0 ^ (t1 >> 2) ^ (t1 >> 5);
- }
-
- /*
- The following defines provide alternative definitions of FFmulX that might
- give improved performance if a fast 32-bit multiply is not available.
-
- private int FFmulX(int x) { int u = x & m1; u |= (u >> 1); return ((x & m2) << 1) ^ ((u >>> 3) | (u >>> 6)); }
- private static final int m4 = 0x1b1b1b1b;
- private int FFmulX(int x) { int u = x & m1; return ((x & m2) << 1) ^ ((u - (u >>> 7)) & m4); }
-
- */
-
- private static uint Inv_Mcol(uint x)
- {
- uint t0, t1;
- t0 = x;
- t1 = t0 ^ Shift(t0, 8);
- t0 ^= FFmulX(t1);
- t1 ^= FFmulX2(t0);
- t0 ^= t1 ^ Shift(t1, 16);
- return t0;
- }
-
- private static uint SubWord(uint x)
- {
- return (uint)S[x&255]
- | (((uint)S[(x>>8)&255]) << 8)
- | (((uint)S[(x>>16)&255]) << 16)
- | (((uint)S[(x>>24)&255]) << 24);
- }
-
- /**
- * Calculate the necessary round keys
- * The number of calculations depends on key size and block size
- * AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits
- * This code is written assuming those are the only possible values
- */
- private uint[][] GenerateWorkingKey(byte[] key, bool forEncryption)
- {
- int keyLen = key.Length;
- if (keyLen < 16 || keyLen > 32 || (keyLen & 7) != 0)
- throw new ArgumentException("Key length not 128/192/256 bits.");
-
- int KC = keyLen >> 2;
- this.ROUNDS = KC + 6; // This is not always true for the generalized Rijndael that allows larger block sizes
-
- uint[][] W = new uint[ROUNDS + 1][]; // 4 words in a block
- for (int i = 0; i <= ROUNDS; ++i)
- {
- W[i] = new uint[4];
- }
-
- switch (KC)
- {
- case 4:
- {
- uint t0 = Pack.LE_To_UInt32(key, 0); W[0][0] = t0;
- uint t1 = Pack.LE_To_UInt32(key, 4); W[0][1] = t1;
- uint t2 = Pack.LE_To_UInt32(key, 8); W[0][2] = t2;
- uint t3 = Pack.LE_To_UInt32(key, 12); W[0][3] = t3;
-
- for (int i = 1; i <= 10; ++i)
- {
- uint u = SubWord(Shift(t3, 8)) ^ rcon[i - 1];
- t0 ^= u; W[i][0] = t0;
- t1 ^= t0; W[i][1] = t1;
- t2 ^= t1; W[i][2] = t2;
- t3 ^= t2; W[i][3] = t3;
- }
-
- break;
- }
- case 6:
- {
- uint t0 = Pack.LE_To_UInt32(key, 0); W[0][0] = t0;
- uint t1 = Pack.LE_To_UInt32(key, 4); W[0][1] = t1;
- uint t2 = Pack.LE_To_UInt32(key, 8); W[0][2] = t2;
- uint t3 = Pack.LE_To_UInt32(key, 12); W[0][3] = t3;
- uint t4 = Pack.LE_To_UInt32(key, 16); W[1][0] = t4;
- uint t5 = Pack.LE_To_UInt32(key, 20); W[1][1] = t5;
-
- uint rcon = 1;
- uint u = SubWord(Shift(t5, 8)) ^ rcon; rcon <<= 1;
- t0 ^= u; W[1][2] = t0;
- t1 ^= t0; W[1][3] = t1;
- t2 ^= t1; W[2][0] = t2;
- t3 ^= t2; W[2][1] = t3;
- t4 ^= t3; W[2][2] = t4;
- t5 ^= t4; W[2][3] = t5;
-
- for (int i = 3; i < 12; i += 3)
- {
- u = SubWord(Shift(t5, 8)) ^ rcon; rcon <<= 1;
- t0 ^= u; W[i ][0] = t0;
- t1 ^= t0; W[i ][1] = t1;
- t2 ^= t1; W[i ][2] = t2;
- t3 ^= t2; W[i ][3] = t3;
- t4 ^= t3; W[i + 1][0] = t4;
- t5 ^= t4; W[i + 1][1] = t5;
- u = SubWord(Shift(t5, 8)) ^ rcon; rcon <<= 1;
- t0 ^= u; W[i + 1][2] = t0;
- t1 ^= t0; W[i + 1][3] = t1;
- t2 ^= t1; W[i + 2][0] = t2;
- t3 ^= t2; W[i + 2][1] = t3;
- t4 ^= t3; W[i + 2][2] = t4;
- t5 ^= t4; W[i + 2][3] = t5;
- }
-
- u = SubWord(Shift(t5, 8)) ^ rcon;
- t0 ^= u; W[12][0] = t0;
- t1 ^= t0; W[12][1] = t1;
- t2 ^= t1; W[12][2] = t2;
- t3 ^= t2; W[12][3] = t3;
-
- break;
- }
- case 8:
- {
- uint t0 = Pack.LE_To_UInt32(key, 0); W[0][0] = t0;
- uint t1 = Pack.LE_To_UInt32(key, 4); W[0][1] = t1;
- uint t2 = Pack.LE_To_UInt32(key, 8); W[0][2] = t2;
- uint t3 = Pack.LE_To_UInt32(key, 12); W[0][3] = t3;
- uint t4 = Pack.LE_To_UInt32(key, 16); W[1][0] = t4;
- uint t5 = Pack.LE_To_UInt32(key, 20); W[1][1] = t5;
- uint t6 = Pack.LE_To_UInt32(key, 24); W[1][2] = t6;
- uint t7 = Pack.LE_To_UInt32(key, 28); W[1][3] = t7;
-
- uint u, rcon = 1;
-
- for (int i = 2; i < 14; i += 2)
- {
- u = SubWord(Shift(t7, 8)) ^ rcon; rcon <<= 1;
- t0 ^= u; W[i ][0] = t0;
- t1 ^= t0; W[i ][1] = t1;
- t2 ^= t1; W[i ][2] = t2;
- t3 ^= t2; W[i ][3] = t3;
- u = SubWord(t3);
- t4 ^= u; W[i + 1][0] = t4;
- t5 ^= t4; W[i + 1][1] = t5;
- t6 ^= t5; W[i + 1][2] = t6;
- t7 ^= t6; W[i + 1][3] = t7;
- }
-
- u = SubWord(Shift(t7, 8)) ^ rcon;
- t0 ^= u; W[14][0] = t0;
- t1 ^= t0; W[14][1] = t1;
- t2 ^= t1; W[14][2] = t2;
- t3 ^= t2; W[14][3] = t3;
-
- break;
- }
- default:
- {
- throw new InvalidOperationException("Should never get here");
- }
- }
-
- if (!forEncryption)
- {
- for (int j = 1; j < ROUNDS; j++)
- {
- uint[] w = W[j];
- for (int i = 0; i < 4; i++)
- {
- w[i] = Inv_Mcol(w[i]);
- }
- }
- }
-
- return W;
- }
-
- private int ROUNDS;
- private uint[][] WorkingKey;
- private uint C0, C1, C2, C3;
- private bool forEncryption;
-
- private const int BLOCK_SIZE = 16;
-
- /**
- * default constructor - 128 bit block size.
- */
- public AesFastEngine()
- {
- }
-
- /**
- * initialise an AES cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- KeyParameter keyParameter = parameters as KeyParameter;
-
- if (keyParameter == null)
- throw new ArgumentException("invalid parameter passed to AES init - "
- + Platform.GetTypeName(parameters));
-
- WorkingKey = GenerateWorkingKey(keyParameter.GetKey(), forEncryption);
-
- this.forEncryption = forEncryption;
- }
-
- public virtual string AlgorithmName
- {
- get { return "AES"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (WorkingKey == null)
- throw new InvalidOperationException("AES engine not initialised");
-
- Check.DataLength(input, inOff, 16, "input buffer too short");
- Check.OutputLength(output, outOff, 16, "output buffer too short");
-
- UnPackBlock(input, inOff);
-
- if (forEncryption)
- {
- EncryptBlock(WorkingKey);
- }
- else
- {
- DecryptBlock(WorkingKey);
- }
-
- PackBlock(output, outOff);
-
- return BLOCK_SIZE;
- }
-
- public virtual void Reset()
- {
- }
-
- private void UnPackBlock(
- byte[] bytes,
- int off)
- {
- C0 = Pack.LE_To_UInt32(bytes, off);
- C1 = Pack.LE_To_UInt32(bytes, off + 4);
- C2 = Pack.LE_To_UInt32(bytes, off + 8);
- C3 = Pack.LE_To_UInt32(bytes, off + 12);
- }
-
- private void PackBlock(
- byte[] bytes,
- int off)
- {
- Pack.UInt32_To_LE(C0, bytes, off);
- Pack.UInt32_To_LE(C1, bytes, off + 4);
- Pack.UInt32_To_LE(C2, bytes, off + 8);
- Pack.UInt32_To_LE(C3, bytes, off + 12);
- }
-
- private void EncryptBlock(uint[][] KW)
- {
- uint[] kw = KW[0];
- uint t0 = this.C0 ^ kw[0];
- uint t1 = this.C1 ^ kw[1];
- uint t2 = this.C2 ^ kw[2];
-
- uint r0, r1, r2, r3 = this.C3 ^ kw[3];
- int r = 1;
- while (r < ROUNDS - 1)
- {
- kw = KW[r++];
- r0 = T0[t0 & 255] ^ T1[(t1 >> 8) & 255] ^ T2[(t2 >> 16) & 255] ^ T3[r3 >> 24] ^ kw[0];
- r1 = T0[t1 & 255] ^ T1[(t2 >> 8) & 255] ^ T2[(r3 >> 16) & 255] ^ T3[t0 >> 24] ^ kw[1];
- r2 = T0[t2 & 255] ^ T1[(r3 >> 8) & 255] ^ T2[(t0 >> 16) & 255] ^ T3[t1 >> 24] ^ kw[2];
- r3 = T0[r3 & 255] ^ T1[(t0 >> 8) & 255] ^ T2[(t1 >> 16) & 255] ^ T3[t2 >> 24] ^ kw[3];
- kw = KW[r++];
- t0 = T0[r0 & 255] ^ T1[(r1 >> 8) & 255] ^ T2[(r2 >> 16) & 255] ^ T3[r3 >> 24] ^ kw[0];
- t1 = T0[r1 & 255] ^ T1[(r2 >> 8) & 255] ^ T2[(r3 >> 16) & 255] ^ T3[r0 >> 24] ^ kw[1];
- t2 = T0[r2 & 255] ^ T1[(r3 >> 8) & 255] ^ T2[(r0 >> 16) & 255] ^ T3[r1 >> 24] ^ kw[2];
- r3 = T0[r3 & 255] ^ T1[(r0 >> 8) & 255] ^ T2[(r1 >> 16) & 255] ^ T3[r2 >> 24] ^ kw[3];
- }
-
- kw = KW[r++];
- r0 = T0[t0 & 255] ^ T1[(t1 >> 8) & 255] ^ T2[(t2 >> 16) & 255] ^ T3[r3 >> 24] ^ kw[0];
- r1 = T0[t1 & 255] ^ T1[(t2 >> 8) & 255] ^ T2[(r3 >> 16) & 255] ^ T3[t0 >> 24] ^ kw[1];
- r2 = T0[t2 & 255] ^ T1[(r3 >> 8) & 255] ^ T2[(t0 >> 16) & 255] ^ T3[t1 >> 24] ^ kw[2];
- r3 = T0[r3 & 255] ^ T1[(t0 >> 8) & 255] ^ T2[(t1 >> 16) & 255] ^ T3[t2 >> 24] ^ kw[3];
-
- // the final round's table is a simple function of S so we don't use a whole other four tables for it
-
- kw = KW[r];
- this.C0 = (uint)S[r0 & 255] ^ (((uint)S[(r1 >> 8) & 255]) << 8) ^ (((uint)S[(r2 >> 16) & 255]) << 16) ^ (((uint)S[r3 >> 24]) << 24) ^ kw[0];
- this.C1 = (uint)S[r1 & 255] ^ (((uint)S[(r2 >> 8) & 255]) << 8) ^ (((uint)S[(r3 >> 16) & 255]) << 16) ^ (((uint)S[r0 >> 24]) << 24) ^ kw[1];
- this.C2 = (uint)S[r2 & 255] ^ (((uint)S[(r3 >> 8) & 255]) << 8) ^ (((uint)S[(r0 >> 16) & 255]) << 16) ^ (((uint)S[r1 >> 24]) << 24) ^ kw[2];
- this.C3 = (uint)S[r3 & 255] ^ (((uint)S[(r0 >> 8) & 255]) << 8) ^ (((uint)S[(r1 >> 16) & 255]) << 16) ^ (((uint)S[r2 >> 24]) << 24) ^ kw[3];
- }
-
- private void DecryptBlock(uint[][] KW)
- {
- uint[] kw = KW[ROUNDS];
- uint t0 = this.C0 ^ kw[0];
- uint t1 = this.C1 ^ kw[1];
- uint t2 = this.C2 ^ kw[2];
-
- uint r0, r1, r2, r3 = this.C3 ^ kw[3];
- int r = ROUNDS - 1;
- while (r > 1)
- {
- kw = KW[r--];
- r0 = Tinv0[t0 & 255] ^ Tinv1[(r3 >> 8) & 255] ^ Tinv2[(t2 >> 16) & 255] ^ Tinv3[t1 >> 24] ^ kw[0];
- r1 = Tinv0[t1 & 255] ^ Tinv1[(t0 >> 8) & 255] ^ Tinv2[(r3 >> 16) & 255] ^ Tinv3[t2 >> 24] ^ kw[1];
- r2 = Tinv0[t2 & 255] ^ Tinv1[(t1 >> 8) & 255] ^ Tinv2[(t0 >> 16) & 255] ^ Tinv3[r3 >> 24] ^ kw[2];
- r3 = Tinv0[r3 & 255] ^ Tinv1[(t2 >> 8) & 255] ^ Tinv2[(t1 >> 16) & 255] ^ Tinv3[t0 >> 24] ^ kw[3];
- kw = KW[r--];
- t0 = Tinv0[r0 & 255] ^ Tinv1[(r3 >> 8) & 255] ^ Tinv2[(r2 >> 16) & 255] ^ Tinv3[r1 >> 24] ^ kw[0];
- t1 = Tinv0[r1 & 255] ^ Tinv1[(r0 >> 8) & 255] ^ Tinv2[(r3 >> 16) & 255] ^ Tinv3[r2 >> 24] ^ kw[1];
- t2 = Tinv0[r2 & 255] ^ Tinv1[(r1 >> 8) & 255] ^ Tinv2[(r0 >> 16) & 255] ^ Tinv3[r3 >> 24] ^ kw[2];
- r3 = Tinv0[r3 & 255] ^ Tinv1[(r2 >> 8) & 255] ^ Tinv2[(r1 >> 16) & 255] ^ Tinv3[r0 >> 24] ^ kw[3];
- }
-
- kw = KW[1];
- r0 = Tinv0[t0 & 255] ^ Tinv1[(r3 >> 8) & 255] ^ Tinv2[(t2 >> 16) & 255] ^ Tinv3[t1 >> 24] ^ kw[0];
- r1 = Tinv0[t1 & 255] ^ Tinv1[(t0 >> 8) & 255] ^ Tinv2[(r3 >> 16) & 255] ^ Tinv3[t2 >> 24] ^ kw[1];
- r2 = Tinv0[t2 & 255] ^ Tinv1[(t1 >> 8) & 255] ^ Tinv2[(t0 >> 16) & 255] ^ Tinv3[r3 >> 24] ^ kw[2];
- r3 = Tinv0[r3 & 255] ^ Tinv1[(t2 >> 8) & 255] ^ Tinv2[(t1 >> 16) & 255] ^ Tinv3[t0 >> 24] ^ kw[3];
-
- // the final round's table is a simple function of Si so we don't use a whole other four tables for it
-
- kw = KW[0];
- this.C0 = (uint)Si[r0 & 255] ^ (((uint)Si[(r3 >> 8) & 255]) << 8) ^ (((uint)Si[(r2 >> 16) & 255]) << 16) ^ (((uint)Si[r1 >> 24]) << 24) ^ kw[0];
- this.C1 = (uint)Si[r1 & 255] ^ (((uint)Si[(r0 >> 8) & 255]) << 8) ^ (((uint)Si[(r3 >> 16) & 255]) << 16) ^ (((uint)Si[r2 >> 24]) << 24) ^ kw[1];
- this.C2 = (uint)Si[r2 & 255] ^ (((uint)Si[(r1 >> 8) & 255]) << 8) ^ (((uint)Si[(r0 >> 16) & 255]) << 16) ^ (((uint)Si[r3 >> 24]) << 24) ^ kw[2];
- this.C3 = (uint)Si[r3 & 255] ^ (((uint)Si[(r2 >> 8) & 255]) << 8) ^ (((uint)Si[(r1 >> 16) & 255]) << 16) ^ (((uint)Si[r0 >> 24]) << 24) ^ kw[3];
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/AesLightEngine.cs b/BCCrypto/src/crypto/engines/AesLightEngine.cs
deleted file mode 100644
index 9cc9c34..0000000
--- a/BCCrypto/src/crypto/engines/AesLightEngine.cs
+++ /dev/null
@@ -1,504 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * an implementation of the AES (Rijndael), from FIPS-197.
- *
- * For further details see: http://csrc.nist.gov/encryption/aes/ .
- *
- * This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at
- * http://fp.gladman.plus.com/cryptography_technology/rijndael/
- *
- * There are three levels of tradeoff of speed vs memory
- * Because java has no preprocessor, they are written as three separate classes from which to choose
- *
- * The fastest uses 8Kbytes of static tables to precompute round calculations, 4 256 word tables for encryption
- * and 4 for decryption.
- *
- * The middle performance version uses only one 256 word table for each, for a total of 2Kbytes,
- * adding 12 rotate operations per round to compute the values contained in the other tables from
- * the contents of the first
- *
- * The slowest version uses no static tables at all and computes the values
- * in each round.
- *
- *
- * This file contains the slowest performance version with no static tables
- * for round precomputation, but it has the smallest foot print.
- *
- */
- public class AesLightEngine
- : IBlockCipher
- {
- // The S box
- private static readonly byte[] S =
- {
- 99, 124, 119, 123, 242, 107, 111, 197,
- 48, 1, 103, 43, 254, 215, 171, 118,
- 202, 130, 201, 125, 250, 89, 71, 240,
- 173, 212, 162, 175, 156, 164, 114, 192,
- 183, 253, 147, 38, 54, 63, 247, 204,
- 52, 165, 229, 241, 113, 216, 49, 21,
- 4, 199, 35, 195, 24, 150, 5, 154,
- 7, 18, 128, 226, 235, 39, 178, 117,
- 9, 131, 44, 26, 27, 110, 90, 160,
- 82, 59, 214, 179, 41, 227, 47, 132,
- 83, 209, 0, 237, 32, 252, 177, 91,
- 106, 203, 190, 57, 74, 76, 88, 207,
- 208, 239, 170, 251, 67, 77, 51, 133,
- 69, 249, 2, 127, 80, 60, 159, 168,
- 81, 163, 64, 143, 146, 157, 56, 245,
- 188, 182, 218, 33, 16, 255, 243, 210,
- 205, 12, 19, 236, 95, 151, 68, 23,
- 196, 167, 126, 61, 100, 93, 25, 115,
- 96, 129, 79, 220, 34, 42, 144, 136,
- 70, 238, 184, 20, 222, 94, 11, 219,
- 224, 50, 58, 10, 73, 6, 36, 92,
- 194, 211, 172, 98, 145, 149, 228, 121,
- 231, 200, 55, 109, 141, 213, 78, 169,
- 108, 86, 244, 234, 101, 122, 174, 8,
- 186, 120, 37, 46, 28, 166, 180, 198,
- 232, 221, 116, 31, 75, 189, 139, 138,
- 112, 62, 181, 102, 72, 3, 246, 14,
- 97, 53, 87, 185, 134, 193, 29, 158,
- 225, 248, 152, 17, 105, 217, 142, 148,
- 155, 30, 135, 233, 206, 85, 40, 223,
- 140, 161, 137, 13, 191, 230, 66, 104,
- 65, 153, 45, 15, 176, 84, 187, 22,
- };
-
- // The inverse S-box
- private static readonly byte[] Si =
- {
- 82, 9, 106, 213, 48, 54, 165, 56,
- 191, 64, 163, 158, 129, 243, 215, 251,
- 124, 227, 57, 130, 155, 47, 255, 135,
- 52, 142, 67, 68, 196, 222, 233, 203,
- 84, 123, 148, 50, 166, 194, 35, 61,
- 238, 76, 149, 11, 66, 250, 195, 78,
- 8, 46, 161, 102, 40, 217, 36, 178,
- 118, 91, 162, 73, 109, 139, 209, 37,
- 114, 248, 246, 100, 134, 104, 152, 22,
- 212, 164, 92, 204, 93, 101, 182, 146,
- 108, 112, 72, 80, 253, 237, 185, 218,
- 94, 21, 70, 87, 167, 141, 157, 132,
- 144, 216, 171, 0, 140, 188, 211, 10,
- 247, 228, 88, 5, 184, 179, 69, 6,
- 208, 44, 30, 143, 202, 63, 15, 2,
- 193, 175, 189, 3, 1, 19, 138, 107,
- 58, 145, 17, 65, 79, 103, 220, 234,
- 151, 242, 207, 206, 240, 180, 230, 115,
- 150, 172, 116, 34, 231, 173, 53, 133,
- 226, 249, 55, 232, 28, 117, 223, 110,
- 71, 241, 26, 113, 29, 41, 197, 137,
- 111, 183, 98, 14, 170, 24, 190, 27,
- 252, 86, 62, 75, 198, 210, 121, 32,
- 154, 219, 192, 254, 120, 205, 90, 244,
- 31, 221, 168, 51, 136, 7, 199, 49,
- 177, 18, 16, 89, 39, 128, 236, 95,
- 96, 81, 127, 169, 25, 181, 74, 13,
- 45, 229, 122, 159, 147, 201, 156, 239,
- 160, 224, 59, 77, 174, 42, 245, 176,
- 200, 235, 187, 60, 131, 83, 153, 97,
- 23, 43, 4, 126, 186, 119, 214, 38,
- 225, 105, 20, 99, 85, 33, 12, 125,
- };
-
- // vector used in calculating key schedule (powers of x in GF(256))
- private static readonly byte[] rcon =
- {
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
- 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91
- };
-
- private static uint Shift(uint r, int shift)
- {
- return (r >> shift) | (r << (32 - shift));
- }
-
- /* multiply four bytes in GF(2^8) by 'x' {02} in parallel */
-
- private const uint m1 = 0x80808080;
- private const uint m2 = 0x7f7f7f7f;
- private const uint m3 = 0x0000001b;
- private const uint m4 = 0xC0C0C0C0;
- private const uint m5 = 0x3f3f3f3f;
-
- private static uint FFmulX(uint x)
- {
- return ((x & m2) << 1) ^ (((x & m1) >> 7) * m3);
- }
-
- private static uint FFmulX2(uint x)
- {
- uint t0 = (x & m5) << 2;
- uint t1 = (x & m4);
- t1 ^= (t1 >> 1);
- return t0 ^ (t1 >> 2) ^ (t1 >> 5);
- }
-
- /*
- The following defines provide alternative definitions of FFmulX that might
- give improved performance if a fast 32-bit multiply is not available.
-
- private int FFmulX(int x) { int u = x & m1; u |= (u >> 1); return ((x & m2) << 1) ^ ((u >>> 3) | (u >>> 6)); }
- private static final int m4 = 0x1b1b1b1b;
- private int FFmulX(int x) { int u = x & m1; return ((x & m2) << 1) ^ ((u - (u >>> 7)) & m4); }
-
- */
-
- private static uint Mcol(uint x)
- {
- uint t0, t1;
- t0 = Shift(x, 8);
- t1 = x ^ t0;
- return Shift(t1, 16) ^ t0 ^ FFmulX(t1);
- }
-
- private static uint Inv_Mcol(uint x)
- {
- uint t0, t1;
- t0 = x;
- t1 = t0 ^ Shift(t0, 8);
- t0 ^= FFmulX(t1);
- t1 ^= FFmulX2(t0);
- t0 ^= t1 ^ Shift(t1, 16);
- return t0;
- }
-
- private static uint SubWord(uint x)
- {
- return (uint)S[x&255]
- | (((uint)S[(x>>8)&255]) << 8)
- | (((uint)S[(x>>16)&255]) << 16)
- | (((uint)S[(x>>24)&255]) << 24);
- }
-
- /**
- * Calculate the necessary round keys
- * The number of calculations depends on key size and block size
- * AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits
- * This code is written assuming those are the only possible values
- */
- private uint[][] GenerateWorkingKey(byte[] key, bool forEncryption)
- {
- int keyLen = key.Length;
- if (keyLen < 16 || keyLen > 32 || (keyLen & 7) != 0)
- throw new ArgumentException("Key length not 128/192/256 bits.");
-
- int KC = keyLen >> 2;
- this.ROUNDS = KC + 6; // This is not always true for the generalized Rijndael that allows larger block sizes
-
- uint[][] W = new uint[ROUNDS + 1][]; // 4 words in a block
- for (int i = 0; i <= ROUNDS; ++i)
- {
- W[i] = new uint[4];
- }
-
- switch (KC)
- {
- case 4:
- {
- uint t0 = Pack.LE_To_UInt32(key, 0); W[0][0] = t0;
- uint t1 = Pack.LE_To_UInt32(key, 4); W[0][1] = t1;
- uint t2 = Pack.LE_To_UInt32(key, 8); W[0][2] = t2;
- uint t3 = Pack.LE_To_UInt32(key, 12); W[0][3] = t3;
-
- for (int i = 1; i <= 10; ++i)
- {
- uint u = SubWord(Shift(t3, 8)) ^ rcon[i - 1];
- t0 ^= u; W[i][0] = t0;
- t1 ^= t0; W[i][1] = t1;
- t2 ^= t1; W[i][2] = t2;
- t3 ^= t2; W[i][3] = t3;
- }
-
- break;
- }
- case 6:
- {
- uint t0 = Pack.LE_To_UInt32(key, 0); W[0][0] = t0;
- uint t1 = Pack.LE_To_UInt32(key, 4); W[0][1] = t1;
- uint t2 = Pack.LE_To_UInt32(key, 8); W[0][2] = t2;
- uint t3 = Pack.LE_To_UInt32(key, 12); W[0][3] = t3;
- uint t4 = Pack.LE_To_UInt32(key, 16); W[1][0] = t4;
- uint t5 = Pack.LE_To_UInt32(key, 20); W[1][1] = t5;
-
- uint rcon = 1;
- uint u = SubWord(Shift(t5, 8)) ^ rcon; rcon <<= 1;
- t0 ^= u; W[1][2] = t0;
- t1 ^= t0; W[1][3] = t1;
- t2 ^= t1; W[2][0] = t2;
- t3 ^= t2; W[2][1] = t3;
- t4 ^= t3; W[2][2] = t4;
- t5 ^= t4; W[2][3] = t5;
-
- for (int i = 3; i < 12; i += 3)
- {
- u = SubWord(Shift(t5, 8)) ^ rcon; rcon <<= 1;
- t0 ^= u; W[i ][0] = t0;
- t1 ^= t0; W[i ][1] = t1;
- t2 ^= t1; W[i ][2] = t2;
- t3 ^= t2; W[i ][3] = t3;
- t4 ^= t3; W[i + 1][0] = t4;
- t5 ^= t4; W[i + 1][1] = t5;
- u = SubWord(Shift(t5, 8)) ^ rcon; rcon <<= 1;
- t0 ^= u; W[i + 1][2] = t0;
- t1 ^= t0; W[i + 1][3] = t1;
- t2 ^= t1; W[i + 2][0] = t2;
- t3 ^= t2; W[i + 2][1] = t3;
- t4 ^= t3; W[i + 2][2] = t4;
- t5 ^= t4; W[i + 2][3] = t5;
- }
-
- u = SubWord(Shift(t5, 8)) ^ rcon;
- t0 ^= u; W[12][0] = t0;
- t1 ^= t0; W[12][1] = t1;
- t2 ^= t1; W[12][2] = t2;
- t3 ^= t2; W[12][3] = t3;
-
- break;
- }
- case 8:
- {
- uint t0 = Pack.LE_To_UInt32(key, 0); W[0][0] = t0;
- uint t1 = Pack.LE_To_UInt32(key, 4); W[0][1] = t1;
- uint t2 = Pack.LE_To_UInt32(key, 8); W[0][2] = t2;
- uint t3 = Pack.LE_To_UInt32(key, 12); W[0][3] = t3;
- uint t4 = Pack.LE_To_UInt32(key, 16); W[1][0] = t4;
- uint t5 = Pack.LE_To_UInt32(key, 20); W[1][1] = t5;
- uint t6 = Pack.LE_To_UInt32(key, 24); W[1][2] = t6;
- uint t7 = Pack.LE_To_UInt32(key, 28); W[1][3] = t7;
-
- uint u, rcon = 1;
-
- for (int i = 2; i < 14; i += 2)
- {
- u = SubWord(Shift(t7, 8)) ^ rcon; rcon <<= 1;
- t0 ^= u; W[i ][0] = t0;
- t1 ^= t0; W[i ][1] = t1;
- t2 ^= t1; W[i ][2] = t2;
- t3 ^= t2; W[i ][3] = t3;
- u = SubWord(t3);
- t4 ^= u; W[i + 1][0] = t4;
- t5 ^= t4; W[i + 1][1] = t5;
- t6 ^= t5; W[i + 1][2] = t6;
- t7 ^= t6; W[i + 1][3] = t7;
- }
-
- u = SubWord(Shift(t7, 8)) ^ rcon;
- t0 ^= u; W[14][0] = t0;
- t1 ^= t0; W[14][1] = t1;
- t2 ^= t1; W[14][2] = t2;
- t3 ^= t2; W[14][3] = t3;
-
- break;
- }
- default:
- {
- throw new InvalidOperationException("Should never get here");
- }
- }
-
- if (!forEncryption)
- {
- for (int j = 1; j < ROUNDS; j++)
- {
- uint[] w = W[j];
- for (int i = 0; i < 4; i++)
- {
- w[i] = Inv_Mcol(w[i]);
- }
- }
- }
-
- return W;
- }
-
- private int ROUNDS;
- private uint[][] WorkingKey;
- private uint C0, C1, C2, C3;
- private bool forEncryption;
-
- private const int BLOCK_SIZE = 16;
-
- /**
- * default constructor - 128 bit block size.
- */
- public AesLightEngine()
- {
- }
-
- /**
- * initialise an AES cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- KeyParameter keyParameter = parameters as KeyParameter;
-
- if (keyParameter == null)
- throw new ArgumentException("invalid parameter passed to AES init - "
- + Platform.GetTypeName(parameters));
-
- WorkingKey = GenerateWorkingKey(keyParameter.GetKey(), forEncryption);
-
- this.forEncryption = forEncryption;
- }
-
- public virtual string AlgorithmName
- {
- get { return "AES"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (WorkingKey == null)
- throw new InvalidOperationException("AES engine not initialised");
-
- Check.DataLength(input, inOff, 16, "input buffer too short");
- Check.OutputLength(output, outOff, 16, "output buffer too short");
-
- UnPackBlock(input, inOff);
-
- if (forEncryption)
- {
- EncryptBlock(WorkingKey);
- }
- else
- {
- DecryptBlock(WorkingKey);
- }
-
- PackBlock(output, outOff);
-
- return BLOCK_SIZE;
- }
-
- public virtual void Reset()
- {
- }
-
- private void UnPackBlock(
- byte[] bytes,
- int off)
- {
- C0 = Pack.LE_To_UInt32(bytes, off);
- C1 = Pack.LE_To_UInt32(bytes, off + 4);
- C2 = Pack.LE_To_UInt32(bytes, off + 8);
- C3 = Pack.LE_To_UInt32(bytes, off + 12);
- }
-
- private void PackBlock(
- byte[] bytes,
- int off)
- {
- Pack.UInt32_To_LE(C0, bytes, off);
- Pack.UInt32_To_LE(C1, bytes, off + 4);
- Pack.UInt32_To_LE(C2, bytes, off + 8);
- Pack.UInt32_To_LE(C3, bytes, off + 12);
- }
-
- private void EncryptBlock(uint[][] KW)
- {
- uint[] kw = KW[0];
- uint t0 = this.C0 ^ kw[0];
- uint t1 = this.C1 ^ kw[1];
- uint t2 = this.C2 ^ kw[2];
-
- uint r0, r1, r2, r3 = this.C3 ^ kw[3];
- int r = 1;
- while (r < ROUNDS - 1)
- {
- kw = KW[r++];
- r0 = Mcol((uint)S[t0 & 255] ^ (((uint)S[(t1 >> 8) & 255]) << 8) ^ (((uint)S[(t2 >> 16) & 255]) << 16) ^ (((uint)S[(r3 >> 24) & 255]) << 24)) ^ kw[0];
- r1 = Mcol((uint)S[t1 & 255] ^ (((uint)S[(t2 >> 8) & 255]) << 8) ^ (((uint)S[(r3 >> 16) & 255]) << 16) ^ (((uint)S[(t0 >> 24) & 255]) << 24)) ^ kw[1];
- r2 = Mcol((uint)S[t2 & 255] ^ (((uint)S[(r3 >> 8) & 255]) << 8) ^ (((uint)S[(t0 >> 16) & 255]) << 16) ^ (((uint)S[(t1 >> 24) & 255]) << 24)) ^ kw[2];
- r3 = Mcol((uint)S[r3 & 255] ^ (((uint)S[(t0 >> 8) & 255]) << 8) ^ (((uint)S[(t1 >> 16) & 255]) << 16) ^ (((uint)S[(t2 >> 24) & 255]) << 24)) ^ kw[3];
- kw = KW[r++];
- t0 = Mcol((uint)S[r0 & 255] ^ (((uint)S[(r1 >> 8) & 255]) << 8) ^ (((uint)S[(r2 >> 16) & 255]) << 16) ^ (((uint)S[(r3 >> 24) & 255]) << 24)) ^ kw[0];
- t1 = Mcol((uint)S[r1 & 255] ^ (((uint)S[(r2 >> 8) & 255]) << 8) ^ (((uint)S[(r3 >> 16) & 255]) << 16) ^ (((uint)S[(r0 >> 24) & 255]) << 24)) ^ kw[1];
- t2 = Mcol((uint)S[r2 & 255] ^ (((uint)S[(r3 >> 8) & 255]) << 8) ^ (((uint)S[(r0 >> 16) & 255]) << 16) ^ (((uint)S[(r1 >> 24) & 255]) << 24)) ^ kw[2];
- r3 = Mcol((uint)S[r3 & 255] ^ (((uint)S[(r0 >> 8) & 255]) << 8) ^ (((uint)S[(r1 >> 16) & 255]) << 16) ^ (((uint)S[(r2 >> 24) & 255]) << 24)) ^ kw[3];
- }
-
- kw = KW[r++];
- r0 = Mcol((uint)S[t0 & 255] ^ (((uint)S[(t1 >> 8) & 255]) << 8) ^ (((uint)S[(t2 >> 16) & 255]) << 16) ^ (((uint)S[(r3 >> 24) & 255]) << 24)) ^ kw[0];
- r1 = Mcol((uint)S[t1 & 255] ^ (((uint)S[(t2 >> 8) & 255]) << 8) ^ (((uint)S[(r3 >> 16) & 255]) << 16) ^ (((uint)S[(t0 >> 24) & 255]) << 24)) ^ kw[1];
- r2 = Mcol((uint)S[t2 & 255] ^ (((uint)S[(r3 >> 8) & 255]) << 8) ^ (((uint)S[(t0 >> 16) & 255]) << 16) ^ (((uint)S[(t1 >> 24) & 255]) << 24)) ^ kw[2];
- r3 = Mcol((uint)S[r3 & 255] ^ (((uint)S[(t0 >> 8) & 255]) << 8) ^ (((uint)S[(t1 >> 16) & 255]) << 16) ^ (((uint)S[(t2 >> 24) & 255]) << 24)) ^ kw[3];
-
- // the final round is a simple function of S
-
- kw = KW[r];
- this.C0 = (uint)S[r0 & 255] ^ (((uint)S[(r1 >> 8) & 255]) << 8) ^ (((uint)S[(r2 >> 16) & 255]) << 16) ^ (((uint)S[(r3 >> 24) & 255]) << 24) ^ kw[0];
- this.C1 = (uint)S[r1 & 255] ^ (((uint)S[(r2 >> 8) & 255]) << 8) ^ (((uint)S[(r3 >> 16) & 255]) << 16) ^ (((uint)S[(r0 >> 24) & 255]) << 24) ^ kw[1];
- this.C2 = (uint)S[r2 & 255] ^ (((uint)S[(r3 >> 8) & 255]) << 8) ^ (((uint)S[(r0 >> 16) & 255]) << 16) ^ (((uint)S[(r1 >> 24) & 255]) << 24) ^ kw[2];
- this.C3 = (uint)S[r3 & 255] ^ (((uint)S[(r0 >> 8) & 255]) << 8) ^ (((uint)S[(r1 >> 16) & 255]) << 16) ^ (((uint)S[(r2 >> 24) & 255]) << 24) ^ kw[3];
- }
-
- private void DecryptBlock(uint[][] KW)
- {
- uint[] kw = KW[ROUNDS];
- uint t0 = this.C0 ^ kw[0];
- uint t1 = this.C1 ^ kw[1];
- uint t2 = this.C2 ^ kw[2];
-
- uint r0, r1, r2, r3 = this.C3 ^ kw[3];
- int r = ROUNDS - 1;
- while (r > 1)
- {
- kw = KW[r--];
- r0 = Inv_Mcol((uint)Si[t0 & 255] ^ (((uint)Si[(r3 >> 8) & 255]) << 8) ^ (((uint)Si[(t2 >> 16) & 255]) << 16) ^ ((uint)Si[(t1 >> 24) & 255] << 24)) ^ kw[0];
- r1 = Inv_Mcol((uint)Si[t1 & 255] ^ (((uint)Si[(t0 >> 8) & 255]) << 8) ^ (((uint)Si[(r3 >> 16) & 255]) << 16) ^ ((uint)Si[(t2 >> 24) & 255] << 24)) ^ kw[1];
- r2 = Inv_Mcol((uint)Si[t2 & 255] ^ (((uint)Si[(t1 >> 8) & 255]) << 8) ^ (((uint)Si[(t0 >> 16) & 255]) << 16) ^ ((uint)Si[(r3 >> 24) & 255] << 24)) ^ kw[2];
- r3 = Inv_Mcol((uint)Si[r3 & 255] ^ (((uint)Si[(t2 >> 8) & 255]) << 8) ^ (((uint)Si[(t1 >> 16) & 255]) << 16) ^ ((uint)Si[(t0 >> 24) & 255] << 24)) ^ kw[3];
- kw = KW[r--];
- t0 = Inv_Mcol((uint)Si[r0 & 255] ^ (((uint)Si[(r3 >> 8) & 255]) << 8) ^ (((uint)Si[(r2 >> 16) & 255]) << 16) ^ ((uint)Si[(r1 >> 24) & 255] << 24)) ^ kw[0];
- t1 = Inv_Mcol((uint)Si[r1 & 255] ^ (((uint)Si[(r0 >> 8) & 255]) << 8) ^ (((uint)Si[(r3 >> 16) & 255]) << 16) ^ ((uint)Si[(r2 >> 24) & 255] << 24)) ^ kw[1];
- t2 = Inv_Mcol((uint)Si[r2 & 255] ^ (((uint)Si[(r1 >> 8) & 255]) << 8) ^ (((uint)Si[(r0 >> 16) & 255]) << 16) ^ ((uint)Si[(r3 >> 24) & 255] << 24)) ^ kw[2];
- r3 = Inv_Mcol((uint)Si[r3 & 255] ^ (((uint)Si[(r2 >> 8) & 255]) << 8) ^ (((uint)Si[(r1 >> 16) & 255]) << 16) ^ ((uint)Si[(r0 >> 24) & 255] << 24)) ^ kw[3];
- }
-
- kw = KW[1];
- r0 = Inv_Mcol((uint)Si[t0 & 255] ^ (((uint)Si[(r3 >> 8) & 255]) << 8) ^ (((uint)Si[(t2 >> 16) & 255]) << 16) ^ ((uint)Si[(t1 >> 24) & 255] << 24)) ^ kw[0];
- r1 = Inv_Mcol((uint)Si[t1 & 255] ^ (((uint)Si[(t0 >> 8) & 255]) << 8) ^ (((uint)Si[(r3 >> 16) & 255]) << 16) ^ ((uint)Si[(t2 >> 24) & 255] << 24)) ^ kw[1];
- r2 = Inv_Mcol((uint)Si[t2 & 255] ^ (((uint)Si[(t1 >> 8) & 255]) << 8) ^ (((uint)Si[(t0 >> 16) & 255]) << 16) ^ ((uint)Si[(r3 >> 24) & 255] << 24)) ^ kw[2];
- r3 = Inv_Mcol((uint)Si[r3 & 255] ^ (((uint)Si[(t2 >> 8) & 255]) << 8) ^ (((uint)Si[(t1 >> 16) & 255]) << 16) ^ ((uint)Si[(t0 >> 24) & 255] << 24)) ^ kw[3];
-
- // the final round's table is a simple function of Si
-
- kw = KW[0];
- this.C0 = (uint)Si[r0 & 255] ^ (((uint)Si[(r3 >> 8) & 255]) << 8) ^ (((uint)Si[(r2 >> 16) & 255]) << 16) ^ (((uint)Si[(r1 >> 24) & 255]) << 24) ^ kw[0];
- this.C1 = (uint)Si[r1 & 255] ^ (((uint)Si[(r0 >> 8) & 255]) << 8) ^ (((uint)Si[(r3 >> 16) & 255]) << 16) ^ (((uint)Si[(r2 >> 24) & 255]) << 24) ^ kw[1];
- this.C2 = (uint)Si[r2 & 255] ^ (((uint)Si[(r1 >> 8) & 255]) << 8) ^ (((uint)Si[(r0 >> 16) & 255]) << 16) ^ (((uint)Si[(r3 >> 24) & 255]) << 24) ^ kw[2];
- this.C3 = (uint)Si[r3 & 255] ^ (((uint)Si[(r2 >> 8) & 255]) << 8) ^ (((uint)Si[(r1 >> 16) & 255]) << 16) ^ (((uint)Si[(r0 >> 24) & 255]) << 24) ^ kw[3];
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/AesWrapEngine.cs b/BCCrypto/src/crypto/engines/AesWrapEngine.cs
deleted file mode 100644
index 1ce0154..0000000
--- a/BCCrypto/src/crypto/engines/AesWrapEngine.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-namespace Org.BouncyCastle.Crypto.Engines
-{
- ///
- /// An implementation of the AES Key Wrapper from the NIST Key Wrap Specification.
- ///
- /// For further details see: http://csrc.nist.gov/encryption/kms/key-wrap.pdf .
- ///
- public class AesWrapEngine
- : Rfc3394WrapEngine
- {
- public AesWrapEngine()
- : base(new AesEngine())
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/BlowfishEngine.cs b/BCCrypto/src/crypto/engines/BlowfishEngine.cs
deleted file mode 100644
index e38f4e8..0000000
--- a/BCCrypto/src/crypto/engines/BlowfishEngine.cs
+++ /dev/null
@@ -1,553 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * A class that provides Blowfish key encryption operations,
- * such as encoding data and generating keys.
- * All the algorithms herein are from Applied Cryptography
- * and implement a simplified cryptography interface.
- */
- public sealed class BlowfishEngine
- : IBlockCipher
- {
- private readonly static uint[] KP =
- {
- 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
- 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
- 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
- 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
- 0x9216D5D9, 0x8979FB1B
- },
- KS0 =
- {
- 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
- 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
- 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
- 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
- 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
- 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
- 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
- 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
- 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
- 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
- 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
- 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
- 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
- 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
- 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
- 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
- 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
- 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
- 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
- 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
- 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
- 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
- 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
- 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
- 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
- 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
- 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
- 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
- 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
- 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
- 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
- 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
- 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
- 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
- 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
- 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
- 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
- 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
- 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
- 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
- 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
- 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
- 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
- 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
- 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
- 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
- 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
- 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
- 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
- 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
- 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
- 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
- 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
- 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
- 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
- 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
- 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
- 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
- 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
- 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
- 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
- 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
- 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
- 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A
- },
- KS1 =
- {
- 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
- 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
- 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
- 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
- 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
- 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
- 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
- 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
- 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
- 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
- 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
- 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
- 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
- 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
- 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
- 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
- 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
- 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
- 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
- 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
- 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
- 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
- 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
- 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
- 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
- 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
- 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
- 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
- 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
- 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
- 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
- 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
- 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
- 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
- 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
- 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
- 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
- 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
- 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
- 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
- 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
- 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
- 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
- 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
- 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
- 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
- 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
- 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
- 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
- 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
- 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
- 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
- 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
- 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
- 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
- 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
- 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
- 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
- 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
- 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
- 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
- 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
- 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
- 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7
- },
- KS2 =
- {
- 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
- 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
- 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
- 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
- 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
- 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
- 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
- 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
- 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
- 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
- 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
- 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
- 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
- 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
- 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
- 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
- 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
- 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
- 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
- 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
- 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
- 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
- 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
- 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
- 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
- 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
- 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
- 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
- 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
- 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
- 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
- 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
- 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
- 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
- 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
- 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
- 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
- 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
- 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
- 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
- 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
- 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
- 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
- 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
- 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
- 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
- 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
- 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
- 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
- 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
- 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
- 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
- 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
- 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
- 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
- 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
- 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
- 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
- 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
- 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
- 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
- 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
- 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
- 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0
- },
- KS3 =
- {
- 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
- 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
- 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
- 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
- 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
- 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
- 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
- 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
- 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
- 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
- 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
- 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
- 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
- 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
- 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
- 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
- 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
- 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
- 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
- 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
- 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
- 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
- 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
- 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
- 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
- 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
- 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
- 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
- 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
- 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
- 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
- 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
- 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
- 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
- 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
- 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
- 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
- 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
- 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
- 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
- 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
- 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
- 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
- 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
- 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
- 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
- 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
- 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
- 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
- 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
- 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
- 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
- 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
- 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
- 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
- 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
- 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
- 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
- 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
- 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
- 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
- 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
- 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
- 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6
- };
-
- //====================================
- // Useful constants
- //====================================
-
- private static readonly int ROUNDS = 16;
- private const int BLOCK_SIZE = 8; // bytes = 64 bits
- private static readonly int SBOX_SK = 256;
- private static readonly int P_SZ = ROUNDS+2;
-
- private readonly uint[] S0, S1, S2, S3; // the s-boxes
- private readonly uint[] P; // the p-array
-
- private bool encrypting;
-
- private byte[] workingKey;
-
- public BlowfishEngine()
- {
- S0 = new uint[SBOX_SK];
- S1 = new uint[SBOX_SK];
- S2 = new uint[SBOX_SK];
- S3 = new uint[SBOX_SK];
- P = new uint[P_SZ];
- }
-
- /**
- * initialise a Blowfish cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException("invalid parameter passed to Blowfish init - " + Platform.GetTypeName(parameters));
-
- this.encrypting = forEncryption;
- this.workingKey = ((KeyParameter)parameters).GetKey();
- SetKey(this.workingKey);
- }
-
- public string AlgorithmName
- {
- get { return "Blowfish"; }
- }
-
- public bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (workingKey == null)
- throw new InvalidOperationException("Blowfish not initialised");
-
- Check.DataLength(input, inOff, BLOCK_SIZE, "input buffer too short");
- Check.OutputLength(output, outOff, BLOCK_SIZE, "output buffer too short");
-
- if (encrypting)
- {
- EncryptBlock(input, inOff, output, outOff);
- }
- else
- {
- DecryptBlock(input, inOff, output, outOff);
- }
-
- return BLOCK_SIZE;
- }
-
- public void Reset()
- {
- }
-
- public int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- //==================================
- // Private Implementation
- //==================================
-
- private uint F(uint x)
- {
- return (((S0[x >> 24] + S1[(x >> 16) & 0xff]) ^ S2[(x >> 8) & 0xff]) + S3[x & 0xff]);
- }
-
- /**
- * apply the encryption cycle to each value pair in the table.
- */
- private void ProcessTable(
- uint xl,
- uint xr,
- uint[] table)
- {
- int size = table.Length;
-
- for (int s = 0; s < size; s += 2)
- {
- xl ^= P[0];
-
- for (int i = 1; i < ROUNDS; i += 2)
- {
- xr ^= F(xl) ^ P[i];
- xl ^= F(xr) ^ P[i + 1];
- }
-
- xr ^= P[ROUNDS + 1];
-
- table[s] = xr;
- table[s + 1] = xl;
-
- xr = xl; // end of cycle swap
- xl = table[s];
- }
- }
-
- private void SetKey(byte[] key)
- {
- /*
- * - comments are from _Applied Crypto_, Schneier, p338
- * please be careful comparing the two, AC numbers the
- * arrays from 1, the enclosed code from 0.
- *
- * (1)
- * Initialise the S-boxes and the P-array, with a fixed string
- * This string contains the hexadecimal digits of pi (3.141...)
- */
- Array.Copy(KS0, 0, S0, 0, SBOX_SK);
- Array.Copy(KS1, 0, S1, 0, SBOX_SK);
- Array.Copy(KS2, 0, S2, 0, SBOX_SK);
- Array.Copy(KS3, 0, S3, 0, SBOX_SK);
-
- Array.Copy(KP, 0, P, 0, P_SZ);
-
- /*
- * (2)
- * Now, XOR P[0] with the first 32 bits of the key, XOR P[1] with the
- * second 32-bits of the key, and so on for all bits of the key
- * (up to P[17]). Repeatedly cycle through the key bits until the
- * entire P-array has been XOR-ed with the key bits
- */
- int keyLength = key.Length;
- int keyIndex = 0;
-
- for (int i=0; i < P_SZ; i++)
- {
- // Get the 32 bits of the key, in 4 * 8 bit chunks
- uint data = 0x0000000;
- for (int j=0; j < 4; j++)
- {
- // create a 32 bit block
- data = (data << 8) | (uint)key[keyIndex++];
-
- // wrap when we get to the end of the key
- if (keyIndex >= keyLength)
- {
- keyIndex = 0;
- }
- }
- // XOR the newly created 32 bit chunk onto the P-array
- P[i] ^= data;
- }
-
- /*
- * (3)
- * Encrypt the all-zero string with the Blowfish algorithm, using
- * the subkeys described in (1) and (2)
- *
- * (4)
- * Replace P1 and P2 with the output of step (3)
- *
- * (5)
- * Encrypt the output of step(3) using the Blowfish algorithm,
- * with the modified subkeys.
- *
- * (6)
- * Replace P3 and P4 with the output of step (5)
- *
- * (7)
- * Continue the process, replacing all elements of the P-array
- * and then all four S-boxes in order, with the output of the
- * continuously changing Blowfish algorithm
- */
-
- ProcessTable(0, 0, P);
- ProcessTable(P[P_SZ - 2], P[P_SZ - 1], S0);
- ProcessTable(S0[SBOX_SK - 2], S0[SBOX_SK - 1], S1);
- ProcessTable(S1[SBOX_SK - 2], S1[SBOX_SK - 1], S2);
- ProcessTable(S2[SBOX_SK - 2], S2[SBOX_SK - 1], S3);
- }
-
- /**
- * Encrypt the given input starting at the given offset and place
- * the result in the provided buffer starting at the given offset.
- * The input will be an exact multiple of our blocksize.
- */
- private void EncryptBlock(
- byte[] src,
- int srcIndex,
- byte[] dst,
- int dstIndex)
- {
- uint xl = Pack.BE_To_UInt32(src, srcIndex);
- uint xr = Pack.BE_To_UInt32(src, srcIndex+4);
-
- xl ^= P[0];
-
- for (int i = 1; i < ROUNDS; i += 2)
- {
- xr ^= F(xl) ^ P[i];
- xl ^= F(xr) ^ P[i + 1];
- }
-
- xr ^= P[ROUNDS + 1];
-
- Pack.UInt32_To_BE(xr, dst, dstIndex);
- Pack.UInt32_To_BE(xl, dst, dstIndex + 4);
- }
-
- /**
- * Decrypt the given input starting at the given offset and place
- * the result in the provided buffer starting at the given offset.
- * The input will be an exact multiple of our blocksize.
- */
- private void DecryptBlock(
- byte[] src,
- int srcIndex,
- byte[] dst,
- int dstIndex)
- {
- uint xl = Pack.BE_To_UInt32(src, srcIndex);
- uint xr = Pack.BE_To_UInt32(src, srcIndex + 4);
-
- xl ^= P[ROUNDS + 1];
-
- for (int i = ROUNDS; i > 0 ; i -= 2)
- {
- xr ^= F(xl) ^ P[i];
- xl ^= F(xr) ^ P[i - 1];
- }
-
- xr ^= P[0];
-
- Pack.UInt32_To_BE(xr, dst, dstIndex);
- Pack.UInt32_To_BE(xl, dst, dstIndex + 4);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/CamelliaEngine.cs b/BCCrypto/src/crypto/engines/CamelliaEngine.cs
deleted file mode 100644
index 71bd1b0..0000000
--- a/BCCrypto/src/crypto/engines/CamelliaEngine.cs
+++ /dev/null
@@ -1,668 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * Camellia - based on RFC 3713.
- */
- public class CamelliaEngine
- : IBlockCipher
- {
- private bool initialised = false;
- private bool _keyIs128;
-
- private const int BLOCK_SIZE = 16;
-
- private uint[] subkey = new uint[24 * 4];
- private uint[] kw = new uint[4 * 2]; // for whitening
- private uint[] ke = new uint[6 * 2]; // for FL and FL^(-1)
- private uint[] state = new uint[4]; // for encryption and decryption
-
- private static readonly uint[] SIGMA = new uint[]{
- 0xa09e667f, 0x3bcc908b,
- 0xb67ae858, 0x4caa73b2,
- 0xc6ef372f, 0xe94f82be,
- 0x54ff53a5, 0xf1d36f1c,
- 0x10e527fa, 0xde682d1d,
- 0xb05688c2, 0xb3e6c1fd
- };
-
- /*
- *
- * S-box data
- *
- */
- private static readonly uint[] SBOX1_1110 = new uint[]{
- 0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00, 0xb3b3b300, 0x27272700,
- 0xc0c0c000, 0xe5e5e500, 0xe4e4e400, 0x85858500, 0x57575700, 0x35353500,
- 0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100, 0x23232300, 0xefefef00,
- 0x6b6b6b00, 0x93939300, 0x45454500, 0x19191900, 0xa5a5a500, 0x21212100,
- 0xededed00, 0x0e0e0e00, 0x4f4f4f00, 0x4e4e4e00, 0x1d1d1d00, 0x65656500,
- 0x92929200, 0xbdbdbd00, 0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00,
- 0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00, 0x3e3e3e00, 0x30303000,
- 0xdcdcdc00, 0x5f5f5f00, 0x5e5e5e00, 0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00,
- 0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00, 0xd5d5d500, 0x47474700,
- 0x5d5d5d00, 0x3d3d3d00, 0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600,
- 0x51515100, 0x56565600, 0x6c6c6c00, 0x4d4d4d00, 0x8b8b8b00, 0x0d0d0d00,
- 0x9a9a9a00, 0x66666600, 0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00,
- 0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000, 0xf0f0f000, 0xb1b1b100,
- 0x84848400, 0x99999900, 0xdfdfdf00, 0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200,
- 0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500, 0x6d6d6d00, 0xb7b7b700,
- 0xa9a9a900, 0x31313100, 0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700,
- 0x14141400, 0x58585800, 0x3a3a3a00, 0x61616100, 0xdedede00, 0x1b1b1b00,
- 0x11111100, 0x1c1c1c00, 0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600,
- 0x53535300, 0x18181800, 0xf2f2f200, 0x22222200, 0xfefefe00, 0x44444400,
- 0xcfcfcf00, 0xb2b2b200, 0xc3c3c300, 0xb5b5b500, 0x7a7a7a00, 0x91919100,
- 0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800, 0x60606000, 0xfcfcfc00,
- 0x69696900, 0x50505000, 0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00,
- 0xa1a1a100, 0x89898900, 0x62626200, 0x97979700, 0x54545400, 0x5b5b5b00,
- 0x1e1e1e00, 0x95959500, 0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200,
- 0x10101000, 0xc4c4c400, 0x00000000, 0x48484800, 0xa3a3a300, 0xf7f7f700,
- 0x75757500, 0xdbdbdb00, 0x8a8a8a00, 0x03030300, 0xe6e6e600, 0xdadada00,
- 0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400, 0x87878700, 0x5c5c5c00,
- 0x83838300, 0x02020200, 0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300,
- 0x73737300, 0x67676700, 0xf6f6f600, 0xf3f3f300, 0x9d9d9d00, 0x7f7f7f00,
- 0xbfbfbf00, 0xe2e2e200, 0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600,
- 0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00, 0x81818100, 0x96969600,
- 0x6f6f6f00, 0x4b4b4b00, 0x13131300, 0xbebebe00, 0x63636300, 0x2e2e2e00,
- 0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00, 0x9f9f9f00, 0x6e6e6e00,
- 0xbcbcbc00, 0x8e8e8e00, 0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600,
- 0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400, 0x59595900, 0x78787800, 0x98989800,
- 0x06060600, 0x6a6a6a00, 0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00,
- 0xd4d4d400, 0x25252500, 0xababab00, 0x42424200, 0x88888800, 0xa2a2a200,
- 0x8d8d8d00, 0xfafafa00, 0x72727200, 0x07070700, 0xb9b9b900, 0x55555500,
- 0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00, 0x36363600, 0x49494900,
- 0x2a2a2a00, 0x68686800, 0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400,
- 0x40404000, 0x28282800, 0xd3d3d300, 0x7b7b7b00, 0xbbbbbb00, 0xc9c9c900,
- 0x43434300, 0xc1c1c100, 0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400,
- 0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00
- };
-
- private static readonly uint[] SBOX4_4404 = new uint[]{
- 0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0, 0xe4e400e4, 0x57570057,
- 0xeaea00ea, 0xaeae00ae, 0x23230023, 0x6b6b006b, 0x45450045, 0xa5a500a5,
- 0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092, 0x86860086, 0xafaf00af,
- 0x7c7c007c, 0x1f1f001f, 0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b,
- 0xa6a600a6, 0x39390039, 0xd5d500d5, 0x5d5d005d, 0xd9d900d9, 0x5a5a005a,
- 0x51510051, 0x6c6c006c, 0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0,
- 0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084, 0xdfdf00df, 0xcbcb00cb,
- 0x34340034, 0x76760076, 0x6d6d006d, 0xa9a900a9, 0xd1d100d1, 0x04040004,
- 0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011, 0x32320032, 0x9c9c009c,
- 0x53530053, 0xf2f200f2, 0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a,
- 0x24240024, 0xe8e800e8, 0x60600060, 0x69690069, 0xaaaa00aa, 0xa0a000a0,
- 0xa1a100a1, 0x62620062, 0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064,
- 0x10100010, 0x00000000, 0xa3a300a3, 0x75750075, 0x8a8a008a, 0xe6e600e6,
- 0x09090009, 0xdddd00dd, 0x87870087, 0x83830083, 0xcdcd00cd, 0x90900090,
- 0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf, 0x52520052, 0xd8d800d8,
- 0xc8c800c8, 0xc6c600c6, 0x81810081, 0x6f6f006f, 0x13130013, 0x63630063,
- 0xe9e900e9, 0xa7a700a7, 0x9f9f009f, 0xbcbc00bc, 0x29290029, 0xf9f900f9,
- 0x2f2f002f, 0xb4b400b4, 0x78780078, 0x06060006, 0xe7e700e7, 0x71710071,
- 0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d, 0x72720072, 0xb9b900b9,
- 0xf8f800f8, 0xacac00ac, 0x36360036, 0x2a2a002a, 0x3c3c003c, 0xf1f100f1,
- 0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043, 0x15150015, 0xadad00ad,
- 0x77770077, 0x80800080, 0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5,
- 0x85850085, 0x35350035, 0x0c0c000c, 0x41410041, 0xefef00ef, 0x93930093,
- 0x19190019, 0x21210021, 0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd,
- 0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce, 0x30300030, 0x5f5f005f,
- 0xc5c500c5, 0x1a1a001a, 0xe1e100e1, 0xcaca00ca, 0x47470047, 0x3d3d003d,
- 0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d, 0x0d0d000d, 0x66660066,
- 0xcccc00cc, 0x2d2d002d, 0x12120012, 0x20200020, 0xb1b100b1, 0x99990099,
- 0x4c4c004c, 0xc2c200c2, 0x7e7e007e, 0x05050005, 0xb7b700b7, 0x31310031,
- 0x17170017, 0xd7d700d7, 0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c,
- 0x0f0f000f, 0x16160016, 0x18180018, 0x22220022, 0x44440044, 0xb2b200b2,
- 0xb5b500b5, 0x91910091, 0x08080008, 0xa8a800a8, 0xfcfc00fc, 0x50500050,
- 0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097, 0x5b5b005b, 0x95950095,
- 0xffff00ff, 0xd2d200d2, 0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db,
- 0x03030003, 0xdada00da, 0x3f3f003f, 0x94940094, 0x5c5c005c, 0x02020002,
- 0x4a4a004a, 0x33330033, 0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2,
- 0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b, 0x96960096, 0x4b4b004b,
- 0xbebe00be, 0x2e2e002e, 0x79790079, 0x8c8c008c, 0x6e6e006e, 0x8e8e008e,
- 0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059, 0x98980098, 0x6a6a006a,
- 0x46460046, 0xbaba00ba, 0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa,
- 0x07070007, 0x55550055, 0xeeee00ee, 0x0a0a000a, 0x49490049, 0x68680068,
- 0x38380038, 0xa4a400a4, 0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1,
- 0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e
- };
-
- private static readonly uint[] SBOX2_0222 = new uint[]{
- 0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9, 0x00676767, 0x004e4e4e,
- 0x00818181, 0x00cbcbcb, 0x00c9c9c9, 0x000b0b0b, 0x00aeaeae, 0x006a6a6a,
- 0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282, 0x00464646, 0x00dfdfdf,
- 0x00d6d6d6, 0x00272727, 0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242,
- 0x00dbdbdb, 0x001c1c1c, 0x009e9e9e, 0x009c9c9c, 0x003a3a3a, 0x00cacaca,
- 0x00252525, 0x007b7b7b, 0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f,
- 0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d, 0x007c7c7c, 0x00606060,
- 0x00b9b9b9, 0x00bebebe, 0x00bcbcbc, 0x008b8b8b, 0x00161616, 0x00343434,
- 0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595, 0x00ababab, 0x008e8e8e,
- 0x00bababa, 0x007a7a7a, 0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad,
- 0x00a2a2a2, 0x00acacac, 0x00d8d8d8, 0x009a9a9a, 0x00171717, 0x001a1a1a,
- 0x00353535, 0x00cccccc, 0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a,
- 0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040, 0x00e1e1e1, 0x00636363,
- 0x00090909, 0x00333333, 0x00bfbfbf, 0x00989898, 0x00979797, 0x00858585,
- 0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a, 0x00dadada, 0x006f6f6f,
- 0x00535353, 0x00626262, 0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf,
- 0x00282828, 0x00b0b0b0, 0x00747474, 0x00c2c2c2, 0x00bdbdbd, 0x00363636,
- 0x00222222, 0x00383838, 0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c,
- 0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444, 0x00fdfdfd, 0x00888888,
- 0x009f9f9f, 0x00656565, 0x00878787, 0x006b6b6b, 0x00f4f4f4, 0x00232323,
- 0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151, 0x00c0c0c0, 0x00f9f9f9,
- 0x00d2d2d2, 0x00a0a0a0, 0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa,
- 0x00434343, 0x00131313, 0x00c4c4c4, 0x002f2f2f, 0x00a8a8a8, 0x00b6b6b6,
- 0x003c3c3c, 0x002b2b2b, 0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5,
- 0x00202020, 0x00898989, 0x00000000, 0x00909090, 0x00474747, 0x00efefef,
- 0x00eaeaea, 0x00b7b7b7, 0x00151515, 0x00060606, 0x00cdcdcd, 0x00b5b5b5,
- 0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929, 0x000f0f0f, 0x00b8b8b8,
- 0x00070707, 0x00040404, 0x009b9b9b, 0x00949494, 0x00212121, 0x00666666,
- 0x00e6e6e6, 0x00cecece, 0x00ededed, 0x00e7e7e7, 0x003b3b3b, 0x00fefefe,
- 0x007f7f7f, 0x00c5c5c5, 0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c,
- 0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676, 0x00030303, 0x002d2d2d,
- 0x00dedede, 0x00969696, 0x00262626, 0x007d7d7d, 0x00c6c6c6, 0x005c5c5c,
- 0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919, 0x003f3f3f, 0x00dcdcdc,
- 0x00797979, 0x001d1d1d, 0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d,
- 0x005e5e5e, 0x00fbfbfb, 0x00696969, 0x00b2b2b2, 0x00f0f0f0, 0x00313131,
- 0x000c0c0c, 0x00d4d4d4, 0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575,
- 0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484, 0x00111111, 0x00454545,
- 0x001b1b1b, 0x00f5f5f5, 0x00e4e4e4, 0x000e0e0e, 0x00737373, 0x00aaaaaa,
- 0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414, 0x006c6c6c, 0x00929292,
- 0x00545454, 0x00d0d0d0, 0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949,
- 0x00808080, 0x00505050, 0x00a7a7a7, 0x00f6f6f6, 0x00777777, 0x00939393,
- 0x00868686, 0x00838383, 0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9,
- 0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d
- };
-
- private static readonly uint[] SBOX3_3033 = new uint[]{
- 0x38003838, 0x41004141, 0x16001616, 0x76007676, 0xd900d9d9, 0x93009393,
- 0x60006060, 0xf200f2f2, 0x72007272, 0xc200c2c2, 0xab00abab, 0x9a009a9a,
- 0x75007575, 0x06000606, 0x57005757, 0xa000a0a0, 0x91009191, 0xf700f7f7,
- 0xb500b5b5, 0xc900c9c9, 0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090,
- 0xf600f6f6, 0x07000707, 0xa700a7a7, 0x27002727, 0x8e008e8e, 0xb200b2b2,
- 0x49004949, 0xde00dede, 0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7,
- 0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767, 0x1f001f1f, 0x18001818,
- 0x6e006e6e, 0xaf00afaf, 0x2f002f2f, 0xe200e2e2, 0x85008585, 0x0d000d0d,
- 0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565, 0xea00eaea, 0xa300a3a3,
- 0xae00aeae, 0x9e009e9e, 0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b,
- 0xa800a8a8, 0x2b002b2b, 0x36003636, 0xa600a6a6, 0xc500c5c5, 0x86008686,
- 0x4d004d4d, 0x33003333, 0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696,
- 0x3a003a3a, 0x09000909, 0x95009595, 0x10001010, 0x78007878, 0xd800d8d8,
- 0x42004242, 0xcc00cccc, 0xef00efef, 0x26002626, 0xe500e5e5, 0x61006161,
- 0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282, 0xb600b6b6, 0xdb00dbdb,
- 0xd400d4d4, 0x98009898, 0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb,
- 0x0a000a0a, 0x2c002c2c, 0x1d001d1d, 0xb000b0b0, 0x6f006f6f, 0x8d008d8d,
- 0x88008888, 0x0e000e0e, 0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b,
- 0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111, 0x7f007f7f, 0x22002222,
- 0xe700e7e7, 0x59005959, 0xe100e1e1, 0xda00dada, 0x3d003d3d, 0xc800c8c8,
- 0x12001212, 0x04000404, 0x74007474, 0x54005454, 0x30003030, 0x7e007e7e,
- 0xb400b4b4, 0x28002828, 0x55005555, 0x68006868, 0x50005050, 0xbe00bebe,
- 0xd000d0d0, 0xc400c4c4, 0x31003131, 0xcb00cbcb, 0x2a002a2a, 0xad00adad,
- 0x0f000f0f, 0xca00caca, 0x70007070, 0xff00ffff, 0x32003232, 0x69006969,
- 0x08000808, 0x62006262, 0x00000000, 0x24002424, 0xd100d1d1, 0xfb00fbfb,
- 0xba00baba, 0xed00eded, 0x45004545, 0x81008181, 0x73007373, 0x6d006d6d,
- 0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a, 0xc300c3c3, 0x2e002e2e,
- 0xc100c1c1, 0x01000101, 0xe600e6e6, 0x25002525, 0x48004848, 0x99009999,
- 0xb900b9b9, 0xb300b3b3, 0x7b007b7b, 0xf900f9f9, 0xce00cece, 0xbf00bfbf,
- 0xdf00dfdf, 0x71007171, 0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313,
- 0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d, 0xc000c0c0, 0x4b004b4b,
- 0xb700b7b7, 0xa500a5a5, 0x89008989, 0x5f005f5f, 0xb100b1b1, 0x17001717,
- 0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646, 0xcf00cfcf, 0x37003737,
- 0x5e005e5e, 0x47004747, 0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b,
- 0x97009797, 0xfe00fefe, 0x5a005a5a, 0xac00acac, 0x3c003c3c, 0x4c004c4c,
- 0x03000303, 0x35003535, 0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d,
- 0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121, 0x44004444, 0x51005151,
- 0xc600c6c6, 0x7d007d7d, 0x39003939, 0x83008383, 0xdc00dcdc, 0xaa00aaaa,
- 0x7c007c7c, 0x77007777, 0x56005656, 0x05000505, 0x1b001b1b, 0xa400a4a4,
- 0x15001515, 0x34003434, 0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252,
- 0x20002020, 0x14001414, 0xe900e9e9, 0xbd00bdbd, 0xdd00dddd, 0xe400e4e4,
- 0xa100a1a1, 0xe000e0e0, 0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a,
- 0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f
- };
-
- private static uint rightRotate(uint x, int s)
- {
- return ((x >> s) + (x << (32 - s)));
- }
-
- private static uint leftRotate(uint x, int s)
- {
- return (x << s) + (x >> (32 - s));
- }
-
- private static void roldq(int rot, uint[] ki, int ioff, uint[] ko, int ooff)
- {
- ko[0 + ooff] = (ki[0 + ioff] << rot) | (ki[1 + ioff] >> (32 - rot));
- ko[1 + ooff] = (ki[1 + ioff] << rot) | (ki[2 + ioff] >> (32 - rot));
- ko[2 + ooff] = (ki[2 + ioff] << rot) | (ki[3 + ioff] >> (32 - rot));
- ko[3 + ooff] = (ki[3 + ioff] << rot) | (ki[0 + ioff] >> (32 - rot));
- ki[0 + ioff] = ko[0 + ooff];
- ki[1 + ioff] = ko[1 + ooff];
- ki[2 + ioff] = ko[2 + ooff];
- ki[3 + ioff] = ko[3 + ooff];
- }
-
- private static void decroldq(int rot, uint[] ki, int ioff, uint[] ko, int ooff)
- {
- ko[2 + ooff] = (ki[0 + ioff] << rot) | (ki[1 + ioff] >> (32 - rot));
- ko[3 + ooff] = (ki[1 + ioff] << rot) | (ki[2 + ioff] >> (32 - rot));
- ko[0 + ooff] = (ki[2 + ioff] << rot) | (ki[3 + ioff] >> (32 - rot));
- ko[1 + ooff] = (ki[3 + ioff] << rot) | (ki[0 + ioff] >> (32 - rot));
- ki[0 + ioff] = ko[2 + ooff];
- ki[1 + ioff] = ko[3 + ooff];
- ki[2 + ioff] = ko[0 + ooff];
- ki[3 + ioff] = ko[1 + ooff];
- }
-
- private static void roldqo32(int rot, uint[] ki, int ioff, uint[] ko, int ooff)
- {
- ko[0 + ooff] = (ki[1 + ioff] << (rot - 32)) | (ki[2 + ioff] >> (64 - rot));
- ko[1 + ooff] = (ki[2 + ioff] << (rot - 32)) | (ki[3 + ioff] >> (64 - rot));
- ko[2 + ooff] = (ki[3 + ioff] << (rot - 32)) | (ki[0 + ioff] >> (64 - rot));
- ko[3 + ooff] = (ki[0 + ioff] << (rot - 32)) | (ki[1 + ioff] >> (64 - rot));
- ki[0 + ioff] = ko[0 + ooff];
- ki[1 + ioff] = ko[1 + ooff];
- ki[2 + ioff] = ko[2 + ooff];
- ki[3 + ioff] = ko[3 + ooff];
- }
-
- private static void decroldqo32(int rot, uint[] ki, int ioff, uint[] ko, int ooff)
- {
- ko[2 + ooff] = (ki[1 + ioff] << (rot - 32)) | (ki[2 + ioff] >> (64 - rot));
- ko[3 + ooff] = (ki[2 + ioff] << (rot - 32)) | (ki[3 + ioff] >> (64 - rot));
- ko[0 + ooff] = (ki[3 + ioff] << (rot - 32)) | (ki[0 + ioff] >> (64 - rot));
- ko[1 + ooff] = (ki[0 + ioff] << (rot - 32)) | (ki[1 + ioff] >> (64 - rot));
- ki[0 + ioff] = ko[2 + ooff];
- ki[1 + ioff] = ko[3 + ooff];
- ki[2 + ioff] = ko[0 + ooff];
- ki[3 + ioff] = ko[1 + ooff];
- }
-
- private static uint bytes2uint(byte[] src, int offset)
- {
- uint word = 0;
- for (int i = 0; i < 4; i++)
- {
- word = (word << 8) + (uint)src[i + offset];
- }
- return word;
- }
-
- private static void uint2bytes(uint word, byte[] dst, int offset)
- {
- for (int i = 0; i < 4; i++)
- {
- dst[(3 - i) + offset] = (byte)word;
- word >>= 8;
- }
- }
-
- private static void camelliaF2(uint[] s, uint[] skey, int keyoff)
- {
- uint t1, t2, u, v;
-
- t1 = s[0] ^ skey[0 + keyoff];
- u = SBOX4_4404[(byte)t1];
- u ^= SBOX3_3033[(byte)(t1 >> 8)];
- u ^= SBOX2_0222[(byte)(t1 >> 16)];
- u ^= SBOX1_1110[(byte)(t1 >> 24)];
- t2 = s[1] ^ skey[1 + keyoff];
- v = SBOX1_1110[(byte)t2];
- v ^= SBOX4_4404[(byte)(t2 >> 8)];
- v ^= SBOX3_3033[(byte)(t2 >> 16)];
- v ^= SBOX2_0222[(byte)(t2 >> 24)];
-
- s[2] ^= u ^ v;
- s[3] ^= u ^ v ^ rightRotate(u, 8);
-
- t1 = s[2] ^ skey[2 + keyoff];
- u = SBOX4_4404[(byte)t1];
- u ^= SBOX3_3033[(byte)(t1 >> 8)];
- u ^= SBOX2_0222[(byte)(t1 >> 16)];
- u ^= SBOX1_1110[(byte)(t1 >> 24)];
- t2 = s[3] ^ skey[3 + keyoff];
- v = SBOX1_1110[(byte)t2];
- v ^= SBOX4_4404[(byte)(t2 >> 8)];
- v ^= SBOX3_3033[(byte)(t2 >> 16)];
- v ^= SBOX2_0222[(byte)(t2 >> 24)];
-
- s[0] ^= u ^ v;
- s[1] ^= u ^ v ^ rightRotate(u, 8);
- }
-
- private static void camelliaFLs(uint[] s, uint[] fkey, int keyoff)
- {
-
- s[1] ^= leftRotate(s[0] & fkey[0 + keyoff], 1);
- s[0] ^= fkey[1 + keyoff] | s[1];
-
- s[2] ^= fkey[3 + keyoff] | s[3];
- s[3] ^= leftRotate(fkey[2 + keyoff] & s[2], 1);
- }
-
- private void setKey(bool forEncryption, byte[] key)
- {
- uint[] k = new uint[8];
- uint[] ka = new uint[4];
- uint[] kb = new uint[4];
- uint[] t = new uint[4];
-
- switch (key.Length)
- {
- case 16:
- _keyIs128 = true;
- k[0] = bytes2uint(key, 0);
- k[1] = bytes2uint(key, 4);
- k[2] = bytes2uint(key, 8);
- k[3] = bytes2uint(key, 12);
- k[4] = k[5] = k[6] = k[7] = 0;
- break;
- case 24:
- k[0] = bytes2uint(key, 0);
- k[1] = bytes2uint(key, 4);
- k[2] = bytes2uint(key, 8);
- k[3] = bytes2uint(key, 12);
- k[4] = bytes2uint(key, 16);
- k[5] = bytes2uint(key, 20);
- k[6] = ~k[4];
- k[7] = ~k[5];
- _keyIs128 = false;
- break;
- case 32:
- k[0] = bytes2uint(key, 0);
- k[1] = bytes2uint(key, 4);
- k[2] = bytes2uint(key, 8);
- k[3] = bytes2uint(key, 12);
- k[4] = bytes2uint(key, 16);
- k[5] = bytes2uint(key, 20);
- k[6] = bytes2uint(key, 24);
- k[7] = bytes2uint(key, 28);
- _keyIs128 = false;
- break;
- default:
- throw new ArgumentException("key sizes are only 16/24/32 bytes.");
- }
-
- for (int i = 0; i < 4; i++)
- {
- ka[i] = k[i] ^ k[i + 4];
- }
- /* compute KA */
- camelliaF2(ka, SIGMA, 0);
- for (int i = 0; i < 4; i++)
- {
- ka[i] ^= k[i];
- }
- camelliaF2(ka, SIGMA, 4);
-
- if (_keyIs128)
- {
- if (forEncryption)
- {
- /* KL dependant keys */
- kw[0] = k[0];
- kw[1] = k[1];
- kw[2] = k[2];
- kw[3] = k[3];
- roldq(15, k, 0, subkey, 4);
- roldq(30, k, 0, subkey, 12);
- roldq(15, k, 0, t, 0);
- subkey[18] = t[2];
- subkey[19] = t[3];
- roldq(17, k, 0, ke, 4);
- roldq(17, k, 0, subkey, 24);
- roldq(17, k, 0, subkey, 32);
- /* KA dependant keys */
- subkey[0] = ka[0];
- subkey[1] = ka[1];
- subkey[2] = ka[2];
- subkey[3] = ka[3];
- roldq(15, ka, 0, subkey, 8);
- roldq(15, ka, 0, ke, 0);
- roldq(15, ka, 0, t, 0);
- subkey[16] = t[0];
- subkey[17] = t[1];
- roldq(15, ka, 0, subkey, 20);
- roldqo32(34, ka, 0, subkey, 28);
- roldq(17, ka, 0, kw, 4);
-
- }
- else
- { // decryption
- /* KL dependant keys */
- kw[4] = k[0];
- kw[5] = k[1];
- kw[6] = k[2];
- kw[7] = k[3];
- decroldq(15, k, 0, subkey, 28);
- decroldq(30, k, 0, subkey, 20);
- decroldq(15, k, 0, t, 0);
- subkey[16] = t[0];
- subkey[17] = t[1];
- decroldq(17, k, 0, ke, 0);
- decroldq(17, k, 0, subkey, 8);
- decroldq(17, k, 0, subkey, 0);
- /* KA dependant keys */
- subkey[34] = ka[0];
- subkey[35] = ka[1];
- subkey[32] = ka[2];
- subkey[33] = ka[3];
- decroldq(15, ka, 0, subkey, 24);
- decroldq(15, ka, 0, ke, 4);
- decroldq(15, ka, 0, t, 0);
- subkey[18] = t[2];
- subkey[19] = t[3];
- decroldq(15, ka, 0, subkey, 12);
- decroldqo32(34, ka, 0, subkey, 4);
- roldq(17, ka, 0, kw, 0);
- }
- }
- else
- { // 192bit or 256bit
- /* compute KB */
- for (int i = 0; i < 4; i++)
- {
- kb[i] = ka[i] ^ k[i + 4];
- }
- camelliaF2(kb, SIGMA, 8);
-
- if (forEncryption)
- {
- /* KL dependant keys */
- kw[0] = k[0];
- kw[1] = k[1];
- kw[2] = k[2];
- kw[3] = k[3];
- roldqo32(45, k, 0, subkey, 16);
- roldq(15, k, 0, ke, 4);
- roldq(17, k, 0, subkey, 32);
- roldqo32(34, k, 0, subkey, 44);
- /* KR dependant keys */
- roldq(15, k, 4, subkey, 4);
- roldq(15, k, 4, ke, 0);
- roldq(30, k, 4, subkey, 24);
- roldqo32(34, k, 4, subkey, 36);
- /* KA dependant keys */
- roldq(15, ka, 0, subkey, 8);
- roldq(30, ka, 0, subkey, 20);
- /* 32bit rotation */
- ke[8] = ka[1];
- ke[9] = ka[2];
- ke[10] = ka[3];
- ke[11] = ka[0];
- roldqo32(49, ka, 0, subkey, 40);
-
- /* KB dependant keys */
- subkey[0] = kb[0];
- subkey[1] = kb[1];
- subkey[2] = kb[2];
- subkey[3] = kb[3];
- roldq(30, kb, 0, subkey, 12);
- roldq(30, kb, 0, subkey, 28);
- roldqo32(51, kb, 0, kw, 4);
-
- }
- else
- { // decryption
- /* KL dependant keys */
- kw[4] = k[0];
- kw[5] = k[1];
- kw[6] = k[2];
- kw[7] = k[3];
- decroldqo32(45, k, 0, subkey, 28);
- decroldq(15, k, 0, ke, 4);
- decroldq(17, k, 0, subkey, 12);
- decroldqo32(34, k, 0, subkey, 0);
- /* KR dependant keys */
- decroldq(15, k, 4, subkey, 40);
- decroldq(15, k, 4, ke, 8);
- decroldq(30, k, 4, subkey, 20);
- decroldqo32(34, k, 4, subkey, 8);
- /* KA dependant keys */
- decroldq(15, ka, 0, subkey, 36);
- decroldq(30, ka, 0, subkey, 24);
- /* 32bit rotation */
- ke[2] = ka[1];
- ke[3] = ka[2];
- ke[0] = ka[3];
- ke[1] = ka[0];
- decroldqo32(49, ka, 0, subkey, 4);
-
- /* KB dependant keys */
- subkey[46] = kb[0];
- subkey[47] = kb[1];
- subkey[44] = kb[2];
- subkey[45] = kb[3];
- decroldq(30, kb, 0, subkey, 32);
- decroldq(30, kb, 0, subkey, 16);
- roldqo32(51, kb, 0, kw, 0);
- }
- }
- }
-
- private int processBlock128(byte[] input, int inOff, byte[] output, int outOff)
- {
- for (int i = 0; i < 4; i++)
- {
- state[i] = bytes2uint(input, inOff + (i * 4));
- state[i] ^= kw[i];
- }
-
- camelliaF2(state, subkey, 0);
- camelliaF2(state, subkey, 4);
- camelliaF2(state, subkey, 8);
- camelliaFLs(state, ke, 0);
- camelliaF2(state, subkey, 12);
- camelliaF2(state, subkey, 16);
- camelliaF2(state, subkey, 20);
- camelliaFLs(state, ke, 4);
- camelliaF2(state, subkey, 24);
- camelliaF2(state, subkey, 28);
- camelliaF2(state, subkey, 32);
-
- state[2] ^= kw[4];
- state[3] ^= kw[5];
- state[0] ^= kw[6];
- state[1] ^= kw[7];
-
- uint2bytes(state[2], output, outOff);
- uint2bytes(state[3], output, outOff + 4);
- uint2bytes(state[0], output, outOff + 8);
- uint2bytes(state[1], output, outOff + 12);
-
- return BLOCK_SIZE;
- }
-
- private int processBlock192or256(byte[] input, int inOff, byte[] output, int outOff)
- {
- for (int i = 0; i < 4; i++)
- {
- state[i] = bytes2uint(input, inOff + (i * 4));
- state[i] ^= kw[i];
- }
-
- camelliaF2(state, subkey, 0);
- camelliaF2(state, subkey, 4);
- camelliaF2(state, subkey, 8);
- camelliaFLs(state, ke, 0);
- camelliaF2(state, subkey, 12);
- camelliaF2(state, subkey, 16);
- camelliaF2(state, subkey, 20);
- camelliaFLs(state, ke, 4);
- camelliaF2(state, subkey, 24);
- camelliaF2(state, subkey, 28);
- camelliaF2(state, subkey, 32);
- camelliaFLs(state, ke, 8);
- camelliaF2(state, subkey, 36);
- camelliaF2(state, subkey, 40);
- camelliaF2(state, subkey, 44);
-
- state[2] ^= kw[4];
- state[3] ^= kw[5];
- state[0] ^= kw[6];
- state[1] ^= kw[7];
-
- uint2bytes(state[2], output, outOff);
- uint2bytes(state[3], output, outOff + 4);
- uint2bytes(state[0], output, outOff + 8);
- uint2bytes(state[1], output, outOff + 12);
- return BLOCK_SIZE;
- }
-
- public CamelliaEngine()
- {
- }
-
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException("only simple KeyParameter expected.");
-
- setKey(forEncryption, ((KeyParameter)parameters).GetKey());
-
- initialised = true;
- }
-
- public virtual string AlgorithmName
- {
- get { return "Camellia"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (!initialised)
- throw new InvalidOperationException("Camellia engine not initialised");
-
- Check.DataLength(input, inOff, BLOCK_SIZE, "input buffer too short");
- Check.OutputLength(output, outOff, BLOCK_SIZE, "output buffer too short");
-
- if (_keyIs128)
- {
- return processBlock128(input, inOff, output, outOff);
- }
- else
- {
- return processBlock192or256(input, inOff, output, outOff);
- }
- }
-
- public virtual void Reset()
- {
- // nothing
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/CamelliaLightEngine.cs b/BCCrypto/src/crypto/engines/CamelliaLightEngine.cs
deleted file mode 100644
index a132227..0000000
--- a/BCCrypto/src/crypto/engines/CamelliaLightEngine.cs
+++ /dev/null
@@ -1,580 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * Camellia - based on RFC 3713, smaller implementation, about half the size of CamelliaEngine.
- */
- public class CamelliaLightEngine
- : IBlockCipher
- {
- private const int BLOCK_SIZE = 16;
-// private const int MASK8 = 0xff;
- private bool initialised;
- private bool _keyis128;
-
- private uint[] subkey = new uint[24 * 4];
- private uint[] kw = new uint[4 * 2]; // for whitening
- private uint[] ke = new uint[6 * 2]; // for FL and FL^(-1)
- private uint[] state = new uint[4]; // for encryption and decryption
-
- private static readonly uint[] SIGMA = {
- 0xa09e667f, 0x3bcc908b,
- 0xb67ae858, 0x4caa73b2,
- 0xc6ef372f, 0xe94f82be,
- 0x54ff53a5, 0xf1d36f1c,
- 0x10e527fa, 0xde682d1d,
- 0xb05688c2, 0xb3e6c1fd
- };
-
- /*
- *
- * S-box data
- *
- */
- private static readonly byte[] SBOX1 = {
- (byte)112, (byte)130, (byte)44, (byte)236,
- (byte)179, (byte)39, (byte)192, (byte)229,
- (byte)228, (byte)133, (byte)87, (byte)53,
- (byte)234, (byte)12, (byte)174, (byte)65,
- (byte)35, (byte)239, (byte)107, (byte)147,
- (byte)69, (byte)25, (byte)165, (byte)33,
- (byte)237, (byte)14, (byte)79, (byte)78,
- (byte)29, (byte)101, (byte)146, (byte)189,
- (byte)134, (byte)184, (byte)175, (byte)143,
- (byte)124, (byte)235, (byte)31, (byte)206,
- (byte)62, (byte)48, (byte)220, (byte)95,
- (byte)94, (byte)197, (byte)11, (byte)26,
- (byte)166, (byte)225, (byte)57, (byte)202,
- (byte)213, (byte)71, (byte)93, (byte)61,
- (byte)217, (byte)1, (byte)90, (byte)214,
- (byte)81, (byte)86, (byte)108, (byte)77,
- (byte)139, (byte)13, (byte)154, (byte)102,
- (byte)251, (byte)204, (byte)176, (byte)45,
- (byte)116, (byte)18, (byte)43, (byte)32,
- (byte)240, (byte)177, (byte)132, (byte)153,
- (byte)223, (byte)76, (byte)203, (byte)194,
- (byte)52, (byte)126, (byte)118, (byte)5,
- (byte)109, (byte)183, (byte)169, (byte)49,
- (byte)209, (byte)23, (byte)4, (byte)215,
- (byte)20, (byte)88, (byte)58, (byte)97,
- (byte)222, (byte)27, (byte)17, (byte)28,
- (byte)50, (byte)15, (byte)156, (byte)22,
- (byte)83, (byte)24, (byte)242, (byte)34,
- (byte)254, (byte)68, (byte)207, (byte)178,
- (byte)195, (byte)181, (byte)122, (byte)145,
- (byte)36, (byte)8, (byte)232, (byte)168,
- (byte)96, (byte)252, (byte)105, (byte)80,
- (byte)170, (byte)208, (byte)160, (byte)125,
- (byte)161, (byte)137, (byte)98, (byte)151,
- (byte)84, (byte)91, (byte)30, (byte)149,
- (byte)224, (byte)255, (byte)100, (byte)210,
- (byte)16, (byte)196, (byte)0, (byte)72,
- (byte)163, (byte)247, (byte)117, (byte)219,
- (byte)138, (byte)3, (byte)230, (byte)218,
- (byte)9, (byte)63, (byte)221, (byte)148,
- (byte)135, (byte)92, (byte)131, (byte)2,
- (byte)205, (byte)74, (byte)144, (byte)51,
- (byte)115, (byte)103, (byte)246, (byte)243,
- (byte)157, (byte)127, (byte)191, (byte)226,
- (byte)82, (byte)155, (byte)216, (byte)38,
- (byte)200, (byte)55, (byte)198, (byte)59,
- (byte)129, (byte)150, (byte)111, (byte)75,
- (byte)19, (byte)190, (byte)99, (byte)46,
- (byte)233, (byte)121, (byte)167, (byte)140,
- (byte)159, (byte)110, (byte)188, (byte)142,
- (byte)41, (byte)245, (byte)249, (byte)182,
- (byte)47, (byte)253, (byte)180, (byte)89,
- (byte)120, (byte)152, (byte)6, (byte)106,
- (byte)231, (byte)70, (byte)113, (byte)186,
- (byte)212, (byte)37, (byte)171, (byte)66,
- (byte)136, (byte)162, (byte)141, (byte)250,
- (byte)114, (byte)7, (byte)185, (byte)85,
- (byte)248, (byte)238, (byte)172, (byte)10,
- (byte)54, (byte)73, (byte)42, (byte)104,
- (byte)60, (byte)56, (byte)241, (byte)164,
- (byte)64, (byte)40, (byte)211, (byte)123,
- (byte)187, (byte)201, (byte)67, (byte)193,
- (byte)21, (byte)227, (byte)173, (byte)244,
- (byte)119, (byte)199, (byte)128, (byte)158
- };
-
- private static uint rightRotate(uint x, int s)
- {
- return ((x >> s) + (x << (32 - s)));
- }
-
- private static uint leftRotate(uint x, int s)
- {
- return (x << s) + (x >> (32 - s));
- }
-
- private static void roldq(int rot, uint[] ki, int ioff, uint[] ko, int ooff)
- {
- ko[0 + ooff] = (ki[0 + ioff] << rot) | (ki[1 + ioff] >> (32 - rot));
- ko[1 + ooff] = (ki[1 + ioff] << rot) | (ki[2 + ioff] >> (32 - rot));
- ko[2 + ooff] = (ki[2 + ioff] << rot) | (ki[3 + ioff] >> (32 - rot));
- ko[3 + ooff] = (ki[3 + ioff] << rot) | (ki[0 + ioff] >> (32 - rot));
- ki[0 + ioff] = ko[0 + ooff];
- ki[1 + ioff] = ko[1 + ooff];
- ki[2 + ioff] = ko[2 + ooff];
- ki[3 + ioff] = ko[3 + ooff];
- }
-
- private static void decroldq(int rot, uint[] ki, int ioff, uint[] ko, int ooff)
- {
- ko[2 + ooff] = (ki[0 + ioff] << rot) | (ki[1 + ioff] >> (32 - rot));
- ko[3 + ooff] = (ki[1 + ioff] << rot) | (ki[2 + ioff] >> (32 - rot));
- ko[0 + ooff] = (ki[2 + ioff] << rot) | (ki[3 + ioff] >> (32 - rot));
- ko[1 + ooff] = (ki[3 + ioff] << rot) | (ki[0 + ioff] >> (32 - rot));
- ki[0 + ioff] = ko[2 + ooff];
- ki[1 + ioff] = ko[3 + ooff];
- ki[2 + ioff] = ko[0 + ooff];
- ki[3 + ioff] = ko[1 + ooff];
- }
-
- private static void roldqo32(int rot, uint[] ki, int ioff, uint[] ko, int ooff)
- {
- ko[0 + ooff] = (ki[1 + ioff] << (rot - 32)) | (ki[2 + ioff] >> (64 - rot));
- ko[1 + ooff] = (ki[2 + ioff] << (rot - 32)) | (ki[3 + ioff] >> (64 - rot));
- ko[2 + ooff] = (ki[3 + ioff] << (rot - 32)) | (ki[0 + ioff] >> (64 - rot));
- ko[3 + ooff] = (ki[0 + ioff] << (rot - 32)) | (ki[1 + ioff] >> (64 - rot));
- ki[0 + ioff] = ko[0 + ooff];
- ki[1 + ioff] = ko[1 + ooff];
- ki[2 + ioff] = ko[2 + ooff];
- ki[3 + ioff] = ko[3 + ooff];
- }
-
- private static void decroldqo32(int rot, uint[] ki, int ioff, uint[] ko, int ooff)
- {
- ko[2 + ooff] = (ki[1 + ioff] << (rot - 32)) | (ki[2 + ioff] >> (64 - rot));
- ko[3 + ooff] = (ki[2 + ioff] << (rot - 32)) | (ki[3 + ioff] >> (64 - rot));
- ko[0 + ooff] = (ki[3 + ioff] << (rot - 32)) | (ki[0 + ioff] >> (64 - rot));
- ko[1 + ooff] = (ki[0 + ioff] << (rot - 32)) | (ki[1 + ioff] >> (64 - rot));
- ki[0 + ioff] = ko[2 + ooff];
- ki[1 + ioff] = ko[3 + ooff];
- ki[2 + ioff] = ko[0 + ooff];
- ki[3 + ioff] = ko[1 + ooff];
- }
-
- private static uint bytes2uint(byte[] src, int offset)
- {
- uint word = 0;
- for (int i = 0; i < 4; i++)
- {
- word = (word << 8) + (uint)src[i + offset];
- }
- return word;
- }
-
- private static void uint2bytes(uint word, byte[] dst, int offset)
- {
- for (int i = 0; i < 4; i++)
- {
- dst[(3 - i) + offset] = (byte)word;
- word >>= 8;
- }
- }
-
- private byte lRot8(byte v, int rot)
- {
- return (byte)(((uint)v << rot) | ((uint)v >> (8 - rot)));
- }
-
- private uint sbox2(int x)
- {
- return (uint)lRot8(SBOX1[x], 1);
- }
-
- private uint sbox3(int x)
- {
- return (uint)lRot8(SBOX1[x], 7);
- }
-
- private uint sbox4(int x)
- {
- return (uint)SBOX1[lRot8((byte)x, 1)];
- }
-
- private void camelliaF2(uint[] s, uint[] skey, int keyoff)
- {
- uint t1, t2, u, v;
-
- t1 = s[0] ^ skey[0 + keyoff];
- u = sbox4((byte)t1);
- u |= (sbox3((byte)(t1 >> 8)) << 8);
- u |= (sbox2((byte)(t1 >> 16)) << 16);
- u |= ((uint)(SBOX1[(byte)(t1 >> 24)]) << 24);
-
- t2 = s[1] ^ skey[1 + keyoff];
- v = (uint)SBOX1[(byte)t2];
- v |= (sbox4((byte)(t2 >> 8)) << 8);
- v |= (sbox3((byte)(t2 >> 16)) << 16);
- v |= (sbox2((byte)(t2 >> 24)) << 24);
-
- v = leftRotate(v, 8);
- u ^= v;
- v = leftRotate(v, 8) ^ u;
- u = rightRotate(u, 8) ^ v;
- s[2] ^= leftRotate(v, 16) ^ u;
- s[3] ^= leftRotate(u, 8);
-
- t1 = s[2] ^ skey[2 + keyoff];
- u = sbox4((byte)t1);
- u |= sbox3((byte)(t1 >> 8)) << 8;
- u |= sbox2((byte)(t1 >> 16)) << 16;
- u |= ((uint)SBOX1[(byte)(t1 >> 24)]) << 24;
-
- t2 = s[3] ^ skey[3 + keyoff];
- v = (uint)SBOX1[(byte)t2];
- v |= sbox4((byte)(t2 >> 8)) << 8;
- v |= sbox3((byte)(t2 >> 16)) << 16;
- v |= sbox2((byte)(t2 >> 24)) << 24;
-
- v = leftRotate(v, 8);
- u ^= v;
- v = leftRotate(v, 8) ^ u;
- u = rightRotate(u, 8) ^ v;
- s[0] ^= leftRotate(v, 16) ^ u;
- s[1] ^= leftRotate(u, 8);
- }
-
- private void camelliaFLs(uint[] s, uint[] fkey, int keyoff)
- {
- s[1] ^= leftRotate(s[0] & fkey[0 + keyoff], 1);
- s[0] ^= fkey[1 + keyoff] | s[1];
-
- s[2] ^= fkey[3 + keyoff] | s[3];
- s[3] ^= leftRotate(fkey[2 + keyoff] & s[2], 1);
- }
-
- private void setKey(bool forEncryption, byte[] key)
- {
- uint[] k = new uint[8];
- uint[] ka = new uint[4];
- uint[] kb = new uint[4];
- uint[] t = new uint[4];
-
- switch (key.Length)
- {
- case 16:
- _keyis128 = true;
- k[0] = bytes2uint(key, 0);
- k[1] = bytes2uint(key, 4);
- k[2] = bytes2uint(key, 8);
- k[3] = bytes2uint(key, 12);
- k[4] = k[5] = k[6] = k[7] = 0;
- break;
- case 24:
- k[0] = bytes2uint(key, 0);
- k[1] = bytes2uint(key, 4);
- k[2] = bytes2uint(key, 8);
- k[3] = bytes2uint(key, 12);
- k[4] = bytes2uint(key, 16);
- k[5] = bytes2uint(key, 20);
- k[6] = ~k[4];
- k[7] = ~k[5];
- _keyis128 = false;
- break;
- case 32:
- k[0] = bytes2uint(key, 0);
- k[1] = bytes2uint(key, 4);
- k[2] = bytes2uint(key, 8);
- k[3] = bytes2uint(key, 12);
- k[4] = bytes2uint(key, 16);
- k[5] = bytes2uint(key, 20);
- k[6] = bytes2uint(key, 24);
- k[7] = bytes2uint(key, 28);
- _keyis128 = false;
- break;
- default:
- throw new ArgumentException("key sizes are only 16/24/32 bytes.");
- }
-
- for (int i = 0; i < 4; i++)
- {
- ka[i] = k[i] ^ k[i + 4];
- }
- /* compute KA */
- camelliaF2(ka, SIGMA, 0);
- for (int i = 0; i < 4; i++)
- {
- ka[i] ^= k[i];
- }
- camelliaF2(ka, SIGMA, 4);
-
- if (_keyis128)
- {
- if (forEncryption)
- {
- /* KL dependant keys */
- kw[0] = k[0];
- kw[1] = k[1];
- kw[2] = k[2];
- kw[3] = k[3];
- roldq(15, k, 0, subkey, 4);
- roldq(30, k, 0, subkey, 12);
- roldq(15, k, 0, t, 0);
- subkey[18] = t[2];
- subkey[19] = t[3];
- roldq(17, k, 0, ke, 4);
- roldq(17, k, 0, subkey, 24);
- roldq(17, k, 0, subkey, 32);
- /* KA dependant keys */
- subkey[0] = ka[0];
- subkey[1] = ka[1];
- subkey[2] = ka[2];
- subkey[3] = ka[3];
- roldq(15, ka, 0, subkey, 8);
- roldq(15, ka, 0, ke, 0);
- roldq(15, ka, 0, t, 0);
- subkey[16] = t[0];
- subkey[17] = t[1];
- roldq(15, ka, 0, subkey, 20);
- roldqo32(34, ka, 0, subkey, 28);
- roldq(17, ka, 0, kw, 4);
-
- }
- else
- { // decryption
- /* KL dependant keys */
- kw[4] = k[0];
- kw[5] = k[1];
- kw[6] = k[2];
- kw[7] = k[3];
- decroldq(15, k, 0, subkey, 28);
- decroldq(30, k, 0, subkey, 20);
- decroldq(15, k, 0, t, 0);
- subkey[16] = t[0];
- subkey[17] = t[1];
- decroldq(17, k, 0, ke, 0);
- decroldq(17, k, 0, subkey, 8);
- decroldq(17, k, 0, subkey, 0);
- /* KA dependant keys */
- subkey[34] = ka[0];
- subkey[35] = ka[1];
- subkey[32] = ka[2];
- subkey[33] = ka[3];
- decroldq(15, ka, 0, subkey, 24);
- decroldq(15, ka, 0, ke, 4);
- decroldq(15, ka, 0, t, 0);
- subkey[18] = t[2];
- subkey[19] = t[3];
- decroldq(15, ka, 0, subkey, 12);
- decroldqo32(34, ka, 0, subkey, 4);
- roldq(17, ka, 0, kw, 0);
- }
- }
- else
- { // 192bit or 256bit
- /* compute KB */
- for (int i = 0; i < 4; i++)
- {
- kb[i] = ka[i] ^ k[i + 4];
- }
- camelliaF2(kb, SIGMA, 8);
-
- if (forEncryption)
- {
- /* KL dependant keys */
- kw[0] = k[0];
- kw[1] = k[1];
- kw[2] = k[2];
- kw[3] = k[3];
- roldqo32(45, k, 0, subkey, 16);
- roldq(15, k, 0, ke, 4);
- roldq(17, k, 0, subkey, 32);
- roldqo32(34, k, 0, subkey, 44);
- /* KR dependant keys */
- roldq(15, k, 4, subkey, 4);
- roldq(15, k, 4, ke, 0);
- roldq(30, k, 4, subkey, 24);
- roldqo32(34, k, 4, subkey, 36);
- /* KA dependant keys */
- roldq(15, ka, 0, subkey, 8);
- roldq(30, ka, 0, subkey, 20);
- /* 32bit rotation */
- ke[8] = ka[1];
- ke[9] = ka[2];
- ke[10] = ka[3];
- ke[11] = ka[0];
- roldqo32(49, ka, 0, subkey, 40);
-
- /* KB dependant keys */
- subkey[0] = kb[0];
- subkey[1] = kb[1];
- subkey[2] = kb[2];
- subkey[3] = kb[3];
- roldq(30, kb, 0, subkey, 12);
- roldq(30, kb, 0, subkey, 28);
- roldqo32(51, kb, 0, kw, 4);
-
- }
- else
- { // decryption
- /* KL dependant keys */
- kw[4] = k[0];
- kw[5] = k[1];
- kw[6] = k[2];
- kw[7] = k[3];
- decroldqo32(45, k, 0, subkey, 28);
- decroldq(15, k, 0, ke, 4);
- decroldq(17, k, 0, subkey, 12);
- decroldqo32(34, k, 0, subkey, 0);
- /* KR dependant keys */
- decroldq(15, k, 4, subkey, 40);
- decroldq(15, k, 4, ke, 8);
- decroldq(30, k, 4, subkey, 20);
- decroldqo32(34, k, 4, subkey, 8);
- /* KA dependant keys */
- decroldq(15, ka, 0, subkey, 36);
- decroldq(30, ka, 0, subkey, 24);
- /* 32bit rotation */
- ke[2] = ka[1];
- ke[3] = ka[2];
- ke[0] = ka[3];
- ke[1] = ka[0];
- decroldqo32(49, ka, 0, subkey, 4);
-
- /* KB dependant keys */
- subkey[46] = kb[0];
- subkey[47] = kb[1];
- subkey[44] = kb[2];
- subkey[45] = kb[3];
- decroldq(30, kb, 0, subkey, 32);
- decroldq(30, kb, 0, subkey, 16);
- roldqo32(51, kb, 0, kw, 0);
- }
- }
- }
-
- private int processBlock128(byte[] input, int inOff, byte[] output, int outOff)
- {
- for (int i = 0; i < 4; i++)
- {
- state[i] = bytes2uint(input, inOff + (i * 4));
- state[i] ^= kw[i];
- }
-
- camelliaF2(state, subkey, 0);
- camelliaF2(state, subkey, 4);
- camelliaF2(state, subkey, 8);
- camelliaFLs(state, ke, 0);
- camelliaF2(state, subkey, 12);
- camelliaF2(state, subkey, 16);
- camelliaF2(state, subkey, 20);
- camelliaFLs(state, ke, 4);
- camelliaF2(state, subkey, 24);
- camelliaF2(state, subkey, 28);
- camelliaF2(state, subkey, 32);
-
- state[2] ^= kw[4];
- state[3] ^= kw[5];
- state[0] ^= kw[6];
- state[1] ^= kw[7];
-
- uint2bytes(state[2], output, outOff);
- uint2bytes(state[3], output, outOff + 4);
- uint2bytes(state[0], output, outOff + 8);
- uint2bytes(state[1], output, outOff + 12);
-
- return BLOCK_SIZE;
- }
-
- private int processBlock192or256(byte[] input, int inOff, byte[] output, int outOff)
- {
- for (int i = 0; i < 4; i++)
- {
- state[i] = bytes2uint(input, inOff + (i * 4));
- state[i] ^= kw[i];
- }
-
- camelliaF2(state, subkey, 0);
- camelliaF2(state, subkey, 4);
- camelliaF2(state, subkey, 8);
- camelliaFLs(state, ke, 0);
- camelliaF2(state, subkey, 12);
- camelliaF2(state, subkey, 16);
- camelliaF2(state, subkey, 20);
- camelliaFLs(state, ke, 4);
- camelliaF2(state, subkey, 24);
- camelliaF2(state, subkey, 28);
- camelliaF2(state, subkey, 32);
- camelliaFLs(state, ke, 8);
- camelliaF2(state, subkey, 36);
- camelliaF2(state, subkey, 40);
- camelliaF2(state, subkey, 44);
-
- state[2] ^= kw[4];
- state[3] ^= kw[5];
- state[0] ^= kw[6];
- state[1] ^= kw[7];
-
- uint2bytes(state[2], output, outOff);
- uint2bytes(state[3], output, outOff + 4);
- uint2bytes(state[0], output, outOff + 8);
- uint2bytes(state[1], output, outOff + 12);
- return BLOCK_SIZE;
- }
-
- public CamelliaLightEngine()
- {
- initialised = false;
- }
-
- public virtual string AlgorithmName
- {
- get { return "Camellia"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException("only simple KeyParameter expected.");
-
- setKey(forEncryption, ((KeyParameter)parameters).GetKey());
-
- initialised = true;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (!initialised)
- throw new InvalidOperationException("Camellia engine not initialised");
-
- Check.DataLength(input, inOff, BLOCK_SIZE, "input buffer too short");
- Check.OutputLength(output, outOff, BLOCK_SIZE, "output buffer too short");
-
- if (_keyis128)
- {
- return processBlock128(input, inOff, output, outOff);
- }
- else
- {
- return processBlock192or256(input, inOff, output, outOff);
- }
- }
-
- public virtual void Reset()
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/CamelliaWrapEngine.cs b/BCCrypto/src/crypto/engines/CamelliaWrapEngine.cs
deleted file mode 100644
index 49dc833..0000000
--- a/BCCrypto/src/crypto/engines/CamelliaWrapEngine.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-namespace Org.BouncyCastle.Crypto.Engines
-{
- ///
- /// An implementation of the Camellia key wrapper based on RFC 3657/RFC 3394.
- ///
- /// For further details see: http://www.ietf.org/rfc/rfc3657.txt .
- ///
- public class CamelliaWrapEngine
- : Rfc3394WrapEngine
- {
- public CamelliaWrapEngine()
- : base(new CamelliaEngine())
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/Cast5Engine.cs b/BCCrypto/src/crypto/engines/Cast5Engine.cs
deleted file mode 100644
index 53836db..0000000
--- a/BCCrypto/src/crypto/engines/Cast5Engine.cs
+++ /dev/null
@@ -1,802 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * A class that provides CAST key encryption operations,
- * such as encoding data and generating keys.
- *
- * All the algorithms herein are from the Internet RFC's
- *
- * RFC2144 - Cast5 (64bit block, 40-128bit key)
- * RFC2612 - CAST6 (128bit block, 128-256bit key)
- *
- * and implement a simplified cryptography interface.
- */
- public class Cast5Engine
- : IBlockCipher
- {
- internal static readonly uint[] S1 =
- {
- 0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949,
- 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e,
- 0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d,
- 0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0,
- 0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7,
- 0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935,
- 0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d,
- 0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50,
- 0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe,
- 0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3,
- 0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167,
- 0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291,
- 0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779,
- 0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2,
- 0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511,
- 0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d,
- 0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5,
- 0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324,
- 0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c,
- 0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc,
- 0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d,
- 0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96,
- 0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a,
- 0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d,
- 0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd,
- 0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6,
- 0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9,
- 0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872,
- 0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c,
- 0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e,
- 0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9,
- 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf
- },
- S2 =
- {
- 0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651,
- 0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3,
- 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb,
- 0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806,
- 0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b,
- 0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359,
- 0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b,
- 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c,
- 0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34,
- 0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb,
- 0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd,
- 0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860,
- 0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b,
- 0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304,
- 0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b,
- 0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf,
- 0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c,
- 0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13,
- 0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f,
- 0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6,
- 0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6,
- 0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58,
- 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906,
- 0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d,
- 0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6,
- 0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4,
- 0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6,
- 0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f,
- 0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249,
- 0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa,
- 0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9,
- 0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1
- },
- S3 =
- {
- 0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90,
- 0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5,
- 0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e,
- 0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240,
- 0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5,
- 0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b,
- 0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71,
- 0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04,
- 0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82,
- 0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15,
- 0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2,
- 0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176,
- 0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148,
- 0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc,
- 0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341,
- 0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e,
- 0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51,
- 0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f,
- 0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a,
- 0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b,
- 0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b,
- 0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5,
- 0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45,
- 0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536,
- 0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc,
- 0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0,
- 0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69,
- 0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2,
- 0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49,
- 0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d,
- 0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a,
- 0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783
- },
- S4 =
- {
- 0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1,
- 0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf,
- 0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15,
- 0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121,
- 0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25,
- 0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5,
- 0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb,
- 0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5,
- 0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d,
- 0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6,
- 0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23,
- 0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003,
- 0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6,
- 0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119,
- 0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24,
- 0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a,
- 0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79,
- 0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df,
- 0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26,
- 0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab,
- 0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7,
- 0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417,
- 0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2,
- 0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2,
- 0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a,
- 0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919,
- 0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef,
- 0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876,
- 0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab,
- 0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04,
- 0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282,
- 0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2
- },
- S5 =
- {
- 0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f,
- 0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a,
- 0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff,
- 0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02,
- 0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a,
- 0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7,
- 0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9,
- 0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981,
- 0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774,
- 0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655,
- 0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2,
- 0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910,
- 0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1,
- 0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da,
- 0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049,
- 0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f,
- 0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba,
- 0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be,
- 0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3,
- 0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840,
- 0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4,
- 0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2,
- 0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7,
- 0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5,
- 0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e,
- 0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e,
- 0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801,
- 0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad,
- 0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0,
- 0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20,
- 0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8,
- 0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4
- },
- S6 =
- {
- 0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac,
- 0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138,
- 0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367,
- 0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98,
- 0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072,
- 0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3,
- 0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd,
- 0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8,
- 0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9,
- 0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54,
- 0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387,
- 0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc,
- 0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf,
- 0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf,
- 0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f,
- 0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289,
- 0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950,
- 0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f,
- 0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b,
- 0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be,
- 0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13,
- 0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976,
- 0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0,
- 0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891,
- 0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da,
- 0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc,
- 0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084,
- 0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25,
- 0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121,
- 0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5,
- 0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd,
- 0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f
- },
- S7 =
- {
- 0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f,
- 0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de,
- 0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43,
- 0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19,
- 0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2,
- 0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516,
- 0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88,
- 0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816,
- 0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756,
- 0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a,
- 0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264,
- 0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688,
- 0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28,
- 0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3,
- 0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7,
- 0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06,
- 0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033,
- 0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a,
- 0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566,
- 0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509,
- 0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962,
- 0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e,
- 0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c,
- 0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c,
- 0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285,
- 0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301,
- 0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be,
- 0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767,
- 0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647,
- 0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914,
- 0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c,
- 0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3
- },
- S8 =
- {
- 0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5,
- 0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc,
- 0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd,
- 0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d,
- 0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2,
- 0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862,
- 0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc,
- 0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c,
- 0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e,
- 0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039,
- 0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8,
- 0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42,
- 0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5,
- 0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472,
- 0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225,
- 0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c,
- 0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb,
- 0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054,
- 0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70,
- 0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc,
- 0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c,
- 0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3,
- 0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4,
- 0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101,
- 0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f,
- 0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e,
- 0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a,
- 0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c,
- 0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384,
- 0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c,
- 0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82,
- 0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e
- };
-
- //====================================
- // Useful constants
- //====================================
-
- internal static readonly int MAX_ROUNDS = 16;
- internal static readonly int RED_ROUNDS = 12;
-
- private const int BLOCK_SIZE = 8; // bytes = 64 bits
-
- private int[] _Kr = new int[17]; // the rotating round key
- private uint[] _Km = new uint[17]; // the masking round key
-
- private bool _encrypting;
-
- private byte[] _workingKey;
- private int _rounds = MAX_ROUNDS;
-
- public Cast5Engine()
- {
- }
-
- /**
- * initialise a CAST cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException("Invalid parameter passed to "+ AlgorithmName +" init - " + Platform.GetTypeName(parameters));
-
- _encrypting = forEncryption;
- _workingKey = ((KeyParameter)parameters).GetKey();
- SetKey(_workingKey);
- }
-
- public virtual string AlgorithmName
- {
- get { return "CAST5"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- int blockSize = GetBlockSize();
- if (_workingKey == null)
- throw new InvalidOperationException(AlgorithmName + " not initialised");
-
- Check.DataLength(input, inOff, blockSize, "input buffer too short");
- Check.OutputLength(output, outOff, blockSize, "output buffer too short");
-
- if (_encrypting)
- {
- return EncryptBlock(input, inOff, output, outOff);
- }
- else
- {
- return DecryptBlock(input, inOff, output, outOff);
- }
- }
-
- public virtual void Reset()
- {
- }
-
- public virtual int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- //==================================
- // Private Implementation
- //==================================
-
- /*
- * Creates the subkeys using the same nomenclature
- * as described in RFC2144.
- *
- * See section 2.4
- */
- internal virtual void SetKey(byte[] key)
- {
- /*
- * Determine the key size here, if required
- *
- * if keysize <= 80bits, use 12 rounds instead of 16
- * if keysize < 128bits, pad with 0
- *
- * Typical key sizes => 40, 64, 80, 128
- */
-
- if (key.Length < 11)
- {
- _rounds = RED_ROUNDS;
- }
-
- int [] z = new int[16];
- int [] x = new int[16];
-
- uint z03, z47, z8B, zCF;
- uint x03, x47, x8B, xCF;
-
- /* copy the key into x */
- for (int i=0; i< key.Length; i++)
- {
- x[i] = (int)(key[i] & 0xff);
- }
-
- /*
- * This will look different because the selection of
- * bytes from the input key I've already chosen the
- * correct int.
- */
- x03 = IntsTo32bits(x, 0x0);
- x47 = IntsTo32bits(x, 0x4);
- x8B = IntsTo32bits(x, 0x8);
- xCF = IntsTo32bits(x, 0xC);
-
- z03 = x03 ^S5[x[0xD]] ^S6[x[0xF]] ^S7[x[0xC]] ^S8[x[0xE]] ^S7[x[0x8]];
-
- Bits32ToInts(z03, z, 0x0);
- z47 = x8B ^S5[z[0x0]] ^S6[z[0x2]] ^S7[z[0x1]] ^S8[z[0x3]] ^S8[x[0xA]];
- Bits32ToInts(z47, z, 0x4);
- z8B = xCF ^S5[z[0x7]] ^S6[z[0x6]] ^S7[z[0x5]] ^S8[z[0x4]] ^S5[x[0x9]];
- Bits32ToInts(z8B, z, 0x8);
- zCF = x47 ^S5[z[0xA]] ^S6[z[0x9]] ^S7[z[0xB]] ^S8[z[0x8]] ^S6[x[0xB]];
- Bits32ToInts(zCF, z, 0xC);
- _Km[ 1]= S5[z[0x8]] ^ S6[z[0x9]] ^ S7[z[0x7]] ^ S8[z[0x6]] ^ S5[z[0x2]];
- _Km[ 2]= S5[z[0xA]] ^ S6[z[0xB]] ^ S7[z[0x5]] ^ S8[z[0x4]] ^ S6[z[0x6]];
- _Km[ 3]= S5[z[0xC]] ^ S6[z[0xD]] ^ S7[z[0x3]] ^ S8[z[0x2]] ^ S7[z[0x9]];
- _Km[ 4]= S5[z[0xE]] ^ S6[z[0xF]] ^ S7[z[0x1]] ^ S8[z[0x0]] ^ S8[z[0xC]];
-
- z03 = IntsTo32bits(z, 0x0);
- z47 = IntsTo32bits(z, 0x4);
- z8B = IntsTo32bits(z, 0x8);
- zCF = IntsTo32bits(z, 0xC);
- x03 = z8B ^S5[z[0x5]] ^S6[z[0x7]] ^S7[z[0x4]] ^S8[z[0x6]] ^S7[z[0x0]];
- Bits32ToInts(x03, x, 0x0);
- x47 = z03 ^S5[x[0x0]] ^S6[x[0x2]] ^S7[x[0x1]] ^S8[x[0x3]] ^S8[z[0x2]];
- Bits32ToInts(x47, x, 0x4);
- x8B = z47 ^S5[x[0x7]] ^S6[x[0x6]] ^S7[x[0x5]] ^S8[x[0x4]] ^S5[z[0x1]];
- Bits32ToInts(x8B, x, 0x8);
- xCF = zCF ^S5[x[0xA]] ^S6[x[0x9]] ^S7[x[0xB]] ^S8[x[0x8]] ^S6[z[0x3]];
- Bits32ToInts(xCF, x, 0xC);
- _Km[ 5]= S5[x[0x3]] ^ S6[x[0x2]] ^ S7[x[0xC]] ^ S8[x[0xD]] ^ S5[x[0x8]];
- _Km[ 6]= S5[x[0x1]] ^ S6[x[0x0]] ^ S7[x[0xE]] ^ S8[x[0xF]] ^ S6[x[0xD]];
- _Km[ 7]= S5[x[0x7]] ^ S6[x[0x6]] ^ S7[x[0x8]] ^ S8[x[0x9]] ^ S7[x[0x3]];
- _Km[ 8]= S5[x[0x5]] ^ S6[x[0x4]] ^ S7[x[0xA]] ^ S8[x[0xB]] ^ S8[x[0x7]];
-
- x03 = IntsTo32bits(x, 0x0);
- x47 = IntsTo32bits(x, 0x4);
- x8B = IntsTo32bits(x, 0x8);
- xCF = IntsTo32bits(x, 0xC);
- z03 = x03 ^S5[x[0xD]] ^S6[x[0xF]] ^S7[x[0xC]] ^S8[x[0xE]] ^S7[x[0x8]];
- Bits32ToInts(z03, z, 0x0);
- z47 = x8B ^S5[z[0x0]] ^S6[z[0x2]] ^S7[z[0x1]] ^S8[z[0x3]] ^S8[x[0xA]];
- Bits32ToInts(z47, z, 0x4);
- z8B = xCF ^S5[z[0x7]] ^S6[z[0x6]] ^S7[z[0x5]] ^S8[z[0x4]] ^S5[x[0x9]];
- Bits32ToInts(z8B, z, 0x8);
- zCF = x47 ^S5[z[0xA]] ^S6[z[0x9]] ^S7[z[0xB]] ^S8[z[0x8]] ^S6[x[0xB]];
- Bits32ToInts(zCF, z, 0xC);
- _Km[ 9]= S5[z[0x3]] ^ S6[z[0x2]] ^ S7[z[0xC]] ^ S8[z[0xD]] ^ S5[z[0x9]];
- _Km[10]= S5[z[0x1]] ^ S6[z[0x0]] ^ S7[z[0xE]] ^ S8[z[0xF]] ^ S6[z[0xc]];
- _Km[11]= S5[z[0x7]] ^ S6[z[0x6]] ^ S7[z[0x8]] ^ S8[z[0x9]] ^ S7[z[0x2]];
- _Km[12]= S5[z[0x5]] ^ S6[z[0x4]] ^ S7[z[0xA]] ^ S8[z[0xB]] ^ S8[z[0x6]];
-
- z03 = IntsTo32bits(z, 0x0);
- z47 = IntsTo32bits(z, 0x4);
- z8B = IntsTo32bits(z, 0x8);
- zCF = IntsTo32bits(z, 0xC);
- x03 = z8B ^S5[z[0x5]] ^S6[z[0x7]] ^S7[z[0x4]] ^S8[z[0x6]] ^S7[z[0x0]];
- Bits32ToInts(x03, x, 0x0);
- x47 = z03 ^S5[x[0x0]] ^S6[x[0x2]] ^S7[x[0x1]] ^S8[x[0x3]] ^S8[z[0x2]];
- Bits32ToInts(x47, x, 0x4);
- x8B = z47 ^S5[x[0x7]] ^S6[x[0x6]] ^S7[x[0x5]] ^S8[x[0x4]] ^S5[z[0x1]];
- Bits32ToInts(x8B, x, 0x8);
- xCF = zCF ^S5[x[0xA]] ^S6[x[0x9]] ^S7[x[0xB]] ^S8[x[0x8]] ^S6[z[0x3]];
- Bits32ToInts(xCF, x, 0xC);
- _Km[13]= S5[x[0x8]] ^ S6[x[0x9]] ^ S7[x[0x7]] ^ S8[x[0x6]] ^ S5[x[0x3]];
- _Km[14]= S5[x[0xA]] ^ S6[x[0xB]] ^ S7[x[0x5]] ^ S8[x[0x4]] ^ S6[x[0x7]];
- _Km[15]= S5[x[0xC]] ^ S6[x[0xD]] ^ S7[x[0x3]] ^ S8[x[0x2]] ^ S7[x[0x8]];
- _Km[16]= S5[x[0xE]] ^ S6[x[0xF]] ^ S7[x[0x1]] ^ S8[x[0x0]] ^ S8[x[0xD]];
-
- x03 = IntsTo32bits(x, 0x0);
- x47 = IntsTo32bits(x, 0x4);
- x8B = IntsTo32bits(x, 0x8);
- xCF = IntsTo32bits(x, 0xC);
- z03 = x03 ^S5[x[0xD]] ^S6[x[0xF]] ^S7[x[0xC]] ^S8[x[0xE]] ^S7[x[0x8]];
- Bits32ToInts(z03, z, 0x0);
- z47 = x8B ^S5[z[0x0]] ^S6[z[0x2]] ^S7[z[0x1]] ^S8[z[0x3]] ^S8[x[0xA]];
- Bits32ToInts(z47, z, 0x4);
- z8B = xCF ^S5[z[0x7]] ^S6[z[0x6]] ^S7[z[0x5]] ^S8[z[0x4]] ^S5[x[0x9]];
- Bits32ToInts(z8B, z, 0x8);
- zCF = x47 ^S5[z[0xA]] ^S6[z[0x9]] ^S7[z[0xB]] ^S8[z[0x8]] ^S6[x[0xB]];
- Bits32ToInts(zCF, z, 0xC);
- _Kr[ 1]=(int)((S5[z[0x8]]^S6[z[0x9]]^S7[z[0x7]]^S8[z[0x6]] ^ S5[z[0x2]])&0x1f);
- _Kr[ 2]=(int)((S5[z[0xA]]^S6[z[0xB]]^S7[z[0x5]]^S8[z[0x4]] ^ S6[z[0x6]])&0x1f);
- _Kr[ 3]=(int)((S5[z[0xC]]^S6[z[0xD]]^S7[z[0x3]]^S8[z[0x2]] ^ S7[z[0x9]])&0x1f);
- _Kr[ 4]=(int)((S5[z[0xE]]^S6[z[0xF]]^S7[z[0x1]]^S8[z[0x0]] ^ S8[z[0xC]])&0x1f);
-
- z03 = IntsTo32bits(z, 0x0);
- z47 = IntsTo32bits(z, 0x4);
- z8B = IntsTo32bits(z, 0x8);
- zCF = IntsTo32bits(z, 0xC);
- x03 = z8B ^S5[z[0x5]] ^S6[z[0x7]] ^S7[z[0x4]] ^S8[z[0x6]] ^S7[z[0x0]];
- Bits32ToInts(x03, x, 0x0);
- x47 = z03 ^S5[x[0x0]] ^S6[x[0x2]] ^S7[x[0x1]] ^S8[x[0x3]] ^S8[z[0x2]];
- Bits32ToInts(x47, x, 0x4);
- x8B = z47 ^S5[x[0x7]] ^S6[x[0x6]] ^S7[x[0x5]] ^S8[x[0x4]] ^S5[z[0x1]];
- Bits32ToInts(x8B, x, 0x8);
- xCF = zCF ^S5[x[0xA]] ^S6[x[0x9]] ^S7[x[0xB]] ^S8[x[0x8]] ^S6[z[0x3]];
- Bits32ToInts(xCF, x, 0xC);
- _Kr[ 5]=(int)((S5[x[0x3]]^S6[x[0x2]]^S7[x[0xC]]^S8[x[0xD]]^S5[x[0x8]])&0x1f);
- _Kr[ 6]=(int)((S5[x[0x1]]^S6[x[0x0]]^S7[x[0xE]]^S8[x[0xF]]^S6[x[0xD]])&0x1f);
- _Kr[ 7]=(int)((S5[x[0x7]]^S6[x[0x6]]^S7[x[0x8]]^S8[x[0x9]]^S7[x[0x3]])&0x1f);
- _Kr[ 8]=(int)((S5[x[0x5]]^S6[x[0x4]]^S7[x[0xA]]^S8[x[0xB]]^S8[x[0x7]])&0x1f);
-
- x03 = IntsTo32bits(x, 0x0);
- x47 = IntsTo32bits(x, 0x4);
- x8B = IntsTo32bits(x, 0x8);
- xCF = IntsTo32bits(x, 0xC);
- z03 = x03 ^S5[x[0xD]] ^S6[x[0xF]] ^S7[x[0xC]] ^S8[x[0xE]] ^S7[x[0x8]];
- Bits32ToInts(z03, z, 0x0);
- z47 = x8B ^S5[z[0x0]] ^S6[z[0x2]] ^S7[z[0x1]] ^S8[z[0x3]] ^S8[x[0xA]];
- Bits32ToInts(z47, z, 0x4);
- z8B = xCF ^S5[z[0x7]] ^S6[z[0x6]] ^S7[z[0x5]] ^S8[z[0x4]] ^S5[x[0x9]];
- Bits32ToInts(z8B, z, 0x8);
- zCF = x47 ^S5[z[0xA]] ^S6[z[0x9]] ^S7[z[0xB]] ^S8[z[0x8]] ^S6[x[0xB]];
- Bits32ToInts(zCF, z, 0xC);
- _Kr[ 9]=(int)((S5[z[0x3]]^S6[z[0x2]]^S7[z[0xC]]^S8[z[0xD]]^S5[z[0x9]])&0x1f);
- _Kr[10]=(int)((S5[z[0x1]]^S6[z[0x0]]^S7[z[0xE]]^S8[z[0xF]]^S6[z[0xc]])&0x1f);
- _Kr[11]=(int)((S5[z[0x7]]^S6[z[0x6]]^S7[z[0x8]]^S8[z[0x9]]^S7[z[0x2]])&0x1f);
- _Kr[12]=(int)((S5[z[0x5]]^S6[z[0x4]]^S7[z[0xA]]^S8[z[0xB]]^S8[z[0x6]])&0x1f);
-
- z03 = IntsTo32bits(z, 0x0);
- z47 = IntsTo32bits(z, 0x4);
- z8B = IntsTo32bits(z, 0x8);
- zCF = IntsTo32bits(z, 0xC);
- x03 = z8B ^S5[z[0x5]] ^S6[z[0x7]] ^S7[z[0x4]] ^S8[z[0x6]] ^S7[z[0x0]];
- Bits32ToInts(x03, x, 0x0);
- x47 = z03 ^S5[x[0x0]] ^S6[x[0x2]] ^S7[x[0x1]] ^S8[x[0x3]] ^S8[z[0x2]];
- Bits32ToInts(x47, x, 0x4);
- x8B = z47 ^S5[x[0x7]] ^S6[x[0x6]] ^S7[x[0x5]] ^S8[x[0x4]] ^S5[z[0x1]];
- Bits32ToInts(x8B, x, 0x8);
- xCF = zCF ^S5[x[0xA]] ^S6[x[0x9]] ^S7[x[0xB]] ^S8[x[0x8]] ^S6[z[0x3]];
- Bits32ToInts(xCF, x, 0xC);
- _Kr[13]=(int)((S5[x[0x8]]^S6[x[0x9]]^S7[x[0x7]]^S8[x[0x6]]^S5[x[0x3]])&0x1f);
- _Kr[14]=(int)((S5[x[0xA]]^S6[x[0xB]]^S7[x[0x5]]^S8[x[0x4]]^S6[x[0x7]])&0x1f);
- _Kr[15]=(int)((S5[x[0xC]]^S6[x[0xD]]^S7[x[0x3]]^S8[x[0x2]]^S7[x[0x8]])&0x1f);
- _Kr[16]=(int)((S5[x[0xE]]^S6[x[0xF]]^S7[x[0x1]]^S8[x[0x0]]^S8[x[0xD]])&0x1f);
- }
-
- /**
- * Encrypt the given input starting at the given offset and place
- * the result in the provided buffer starting at the given offset.
- *
- * @param src The plaintext buffer
- * @param srcIndex An offset into src
- * @param dst The ciphertext buffer
- * @param dstIndex An offset into dst
- */
- internal virtual int EncryptBlock(
- byte[] src,
- int srcIndex,
- byte[] dst,
- int dstIndex)
- {
- // process the input block
- // batch the units up into a 32 bit chunk and go for it
- // the array is in bytes, the increment is 8x8 bits = 64
-
- uint L0 = Pack.BE_To_UInt32(src, srcIndex);
- uint R0 = Pack.BE_To_UInt32(src, srcIndex + 4);
-
- uint[] result = new uint[2];
- CAST_Encipher(L0, R0, result);
-
- // now stuff them into the destination block
- Pack.UInt32_To_BE(result[0], dst, dstIndex);
- Pack.UInt32_To_BE(result[1], dst, dstIndex + 4);
-
- return BLOCK_SIZE;
- }
-
- /**
- * Decrypt the given input starting at the given offset and place
- * the result in the provided buffer starting at the given offset.
- *
- * @param src The plaintext buffer
- * @param srcIndex An offset into src
- * @param dst The ciphertext buffer
- * @param dstIndex An offset into dst
- */
- internal virtual int DecryptBlock(
- byte[] src,
- int srcIndex,
- byte[] dst,
- int dstIndex)
- {
- // process the input block
- // batch the units up into a 32 bit chunk and go for it
- // the array is in bytes, the increment is 8x8 bits = 64
- uint L16 = Pack.BE_To_UInt32(src, srcIndex);
- uint R16 = Pack.BE_To_UInt32(src, srcIndex + 4);
-
- uint[] result = new uint[2];
- CAST_Decipher(L16, R16, result);
-
- // now stuff them into the destination block
- Pack.UInt32_To_BE(result[0], dst, dstIndex);
- Pack.UInt32_To_BE(result[1], dst, dstIndex + 4);
-
- return BLOCK_SIZE;
- }
-
- /**
- * The first of the three processing functions for the
- * encryption and decryption.
- *
- * @param D the input to be processed
- * @param Kmi the mask to be used from Km[n]
- * @param Kri the rotation value to be used
- *
- */
- internal static uint F1(uint D, uint Kmi, int Kri)
- {
- uint I = Kmi + D;
- I = I << Kri | (I >> (32-Kri));
- return ((S1[(I>>24)&0xff]^S2[(I>>16)&0xff])-S3[(I>>8)&0xff])+S4[I&0xff];
- }
-
- /**
- * The second of the three processing functions for the
- * encryption and decryption.
- *
- * @param D the input to be processed
- * @param Kmi the mask to be used from Km[n]
- * @param Kri the rotation value to be used
- *
- */
- internal static uint F2(uint D, uint Kmi, int Kri)
- {
- uint I = Kmi ^ D;
- I = I << Kri | (I >> (32-Kri));
- return ((S1[(I>>24)&0xff]-S2[(I>>16)&0xff])+S3[(I>>8)&0xff])^S4[I&0xff];
- }
-
- /**
- * The third of the three processing functions for the
- * encryption and decryption.
- *
- * @param D the input to be processed
- * @param Kmi the mask to be used from Km[n]
- * @param Kri the rotation value to be used
- *
- */
- internal static uint F3(uint D, uint Kmi, int Kri)
- {
- uint I = Kmi - D;
- I = I << Kri | (I >> (32-Kri));
- return ((S1[(I>>24)&0xff]+S2[(I>>16)&0xff])^S3[(I>>8)&0xff])-S4[I&0xff];
- }
-
- /**
- * Does the 16 rounds to encrypt the block.
- *
- * @param L0 the LH-32bits of the plaintext block
- * @param R0 the RH-32bits of the plaintext block
- */
- internal void CAST_Encipher(uint L0, uint R0, uint[] result)
- {
- uint Lp = L0; // the previous value, equiv to L[i-1]
- uint Rp = R0; // equivalent to R[i-1]
-
- /*
- * numbering consistent with paper to make
- * checking and validating easier
- */
- uint Li = L0, Ri = R0;
-
- for (int i = 1; i<=_rounds ; i++)
- {
- Lp = Li;
- Rp = Ri;
-
- Li = Rp;
- switch (i)
- {
- case 1:
- case 4:
- case 7:
- case 10:
- case 13:
- case 16:
- Ri = Lp ^ F1(Rp, _Km[i], _Kr[i]);
- break;
- case 2:
- case 5:
- case 8:
- case 11:
- case 14:
- Ri = Lp ^ F2(Rp, _Km[i], _Kr[i]);
- break;
- case 3:
- case 6:
- case 9:
- case 12:
- case 15:
- Ri = Lp ^ F3(Rp, _Km[i], _Kr[i]);
- break;
- }
- }
-
- result[0] = Ri;
- result[1] = Li;
-
- return;
- }
-
- internal void CAST_Decipher(uint L16, uint R16, uint[] result)
- {
- uint Lp = L16; // the previous value, equiv to L[i-1]
- uint Rp = R16; // equivalent to R[i-1]
-
- /*
- * numbering consistent with paper to make
- * checking and validating easier
- */
- uint Li = L16, Ri = R16;
-
- for (int i = _rounds; i > 0; i--)
- {
- Lp = Li;
- Rp = Ri;
-
- Li = Rp;
- switch (i)
- {
- case 1:
- case 4:
- case 7:
- case 10:
- case 13:
- case 16:
- Ri = Lp ^ F1(Rp, _Km[i], _Kr[i]);
- break;
- case 2:
- case 5:
- case 8:
- case 11:
- case 14:
- Ri = Lp ^ F2(Rp, _Km[i], _Kr[i]);
- break;
- case 3:
- case 6:
- case 9:
- case 12:
- case 15:
- Ri = Lp ^ F3(Rp, _Km[i], _Kr[i]);
- break;
- }
- }
-
- result[0] = Ri;
- result[1] = Li;
-
- return;
- }
-
- internal static void Bits32ToInts(uint inData, int[] b, int offset)
- {
- b[offset + 3] = (int) (inData & 0xff);
- b[offset + 2] = (int) ((inData >> 8) & 0xff);
- b[offset + 1] = (int) ((inData >> 16) & 0xff);
- b[offset] = (int) ((inData >> 24) & 0xff);
- }
-
- internal static uint IntsTo32bits(int[] b, int i)
- {
- return (uint)(((b[i] & 0xff) << 24) |
- ((b[i+1] & 0xff) << 16) |
- ((b[i+2] & 0xff) << 8) |
- ((b[i+3] & 0xff)));
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/Cast6Engine.cs b/BCCrypto/src/crypto/engines/Cast6Engine.cs
deleted file mode 100644
index c5c419b..0000000
--- a/BCCrypto/src/crypto/engines/Cast6Engine.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * A class that provides CAST6 key encryption operations,
- * such as encoding data and generating keys.
- *
- * All the algorithms herein are from the Internet RFC
- *
- * RFC2612 - CAST6 (128bit block, 128-256bit key)
- *
- * and implement a simplified cryptography interface.
- */
- public sealed class Cast6Engine
- : Cast5Engine
- {
- //====================================
- // Useful constants
- //====================================
- private const int ROUNDS = 12;
- private const int BLOCK_SIZE = 16; // bytes = 128 bits
-
- /*
- * Put the round and mask keys into an array.
- * Kr0[i] => _Kr[i*4 + 0]
- */
- private int []_Kr = new int[ROUNDS*4]; // the rotating round key(s)
- private uint []_Km = new uint[ROUNDS*4]; // the masking round key(s)
-
- /*
- * Key setup
- */
- private int []_Tr = new int[24 * 8];
- private uint []_Tm = new uint[24 * 8];
- private uint[] _workingKey = new uint[8];
-
- public Cast6Engine()
- {
- }
-
- public override string AlgorithmName
- {
- get { return "CAST6"; }
- }
-
- public override void Reset()
- {
- }
-
- public override int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- //==================================
- // Private Implementation
- //==================================
- /*
- * Creates the subkeys using the same nomenclature
- * as described in RFC2612.
- *
- * See section 2.4
- */
- internal override void SetKey(
- byte[] key)
- {
- uint Cm = 0x5a827999;
- uint Mm = 0x6ed9eba1;
- int Cr = 19;
- int Mr = 17;
- /*
- * Determine the key size here, if required
- *
- * if keysize < 256 bytes, pad with 0
- *
- * Typical key sizes => 128, 160, 192, 224, 256
- */
- for (int i=0; i< 24; i++)
- {
- for (int j=0; j< 8; j++)
- {
- _Tm[i*8 + j] = Cm;
- Cm += Mm; //mod 2^32;
- _Tr[i*8 + j] = Cr;
- Cr = (Cr + Mr) & 0x1f; // mod 32
- }
- }
-
- byte[] tmpKey = new byte[64];
- key.CopyTo(tmpKey, 0);
-
- // now create ABCDEFGH
- for (int i = 0; i < 8; i++)
- {
- _workingKey[i] = Pack.BE_To_UInt32(tmpKey, i*4);
- }
-
- // Generate the key schedule
- for (int i = 0; i < 12; i++)
- {
- // KAPPA <- W2i(KAPPA)
- int i2 = i*2 *8;
- _workingKey[6] ^= F1(_workingKey[7], _Tm[i2], _Tr[i2]);
- _workingKey[5] ^= F2(_workingKey[6], _Tm[i2+1], _Tr[i2+1]);
- _workingKey[4] ^= F3(_workingKey[5], _Tm[i2+2], _Tr[i2+2]);
- _workingKey[3] ^= F1(_workingKey[4], _Tm[i2+3], _Tr[i2+3]);
- _workingKey[2] ^= F2(_workingKey[3], _Tm[i2+4], _Tr[i2+4]);
- _workingKey[1] ^= F3(_workingKey[2], _Tm[i2+5], _Tr[i2+5]);
- _workingKey[0] ^= F1(_workingKey[1], _Tm[i2+6], _Tr[i2+6]);
- _workingKey[7] ^= F2(_workingKey[0], _Tm[i2+7], _Tr[i2+7]);
- // KAPPA <- W2i+1(KAPPA)
- i2 = (i*2 + 1)*8;
- _workingKey[6] ^= F1(_workingKey[7], _Tm[i2], _Tr[i2]);
- _workingKey[5] ^= F2(_workingKey[6], _Tm[i2+1], _Tr[i2+1]);
- _workingKey[4] ^= F3(_workingKey[5], _Tm[i2+2], _Tr[i2+2]);
- _workingKey[3] ^= F1(_workingKey[4], _Tm[i2+3], _Tr[i2+3]);
- _workingKey[2] ^= F2(_workingKey[3], _Tm[i2+4], _Tr[i2+4]);
- _workingKey[1] ^= F3(_workingKey[2], _Tm[i2+5], _Tr[i2+5]);
- _workingKey[0] ^= F1(_workingKey[1], _Tm[i2+6], _Tr[i2+6]);
- _workingKey[7] ^= F2(_workingKey[0], _Tm[i2+7], _Tr[i2+7]);
- // Kr_(i) <- KAPPA
- _Kr[i*4] = (int)(_workingKey[0] & 0x1f);
- _Kr[i*4 + 1] = (int)(_workingKey[2] & 0x1f);
- _Kr[i*4 + 2] = (int)(_workingKey[4] & 0x1f);
- _Kr[i*4 + 3] = (int)(_workingKey[6] & 0x1f);
- // Km_(i) <- KAPPA
- _Km[i*4] = _workingKey[7];
- _Km[i*4 + 1] = _workingKey[5];
- _Km[i*4 + 2] = _workingKey[3];
- _Km[i*4 + 3] = _workingKey[1];
- }
- }
-
- /**
- * Encrypt the given input starting at the given offset and place
- * the result in the provided buffer starting at the given offset.
- *
- * @param src The plaintext buffer
- * @param srcIndex An offset into src
- * @param dst The ciphertext buffer
- * @param dstIndex An offset into dst
- */
- internal override int EncryptBlock(
- byte[] src,
- int srcIndex,
- byte[] dst,
- int dstIndex)
- {
- // process the input block
- // batch the units up into 4x32 bit chunks and go for it
- uint A = Pack.BE_To_UInt32(src, srcIndex);
- uint B = Pack.BE_To_UInt32(src, srcIndex + 4);
- uint C = Pack.BE_To_UInt32(src, srcIndex + 8);
- uint D = Pack.BE_To_UInt32(src, srcIndex + 12);
- uint[] result = new uint[4];
- CAST_Encipher(A, B, C, D, result);
- // now stuff them into the destination block
- Pack.UInt32_To_BE(result[0], dst, dstIndex);
- Pack.UInt32_To_BE(result[1], dst, dstIndex + 4);
- Pack.UInt32_To_BE(result[2], dst, dstIndex + 8);
- Pack.UInt32_To_BE(result[3], dst, dstIndex + 12);
- return BLOCK_SIZE;
- }
-
- /**
- * Decrypt the given input starting at the given offset and place
- * the result in the provided buffer starting at the given offset.
- *
- * @param src The plaintext buffer
- * @param srcIndex An offset into src
- * @param dst The ciphertext buffer
- * @param dstIndex An offset into dst
- */
- internal override int DecryptBlock(
- byte[] src,
- int srcIndex,
- byte[] dst,
- int dstIndex)
- {
- // process the input block
- // batch the units up into 4x32 bit chunks and go for it
- uint A = Pack.BE_To_UInt32(src, srcIndex);
- uint B = Pack.BE_To_UInt32(src, srcIndex + 4);
- uint C = Pack.BE_To_UInt32(src, srcIndex + 8);
- uint D = Pack.BE_To_UInt32(src, srcIndex + 12);
- uint[] result = new uint[4];
- CAST_Decipher(A, B, C, D, result);
- // now stuff them into the destination block
- Pack.UInt32_To_BE(result[0], dst, dstIndex);
- Pack.UInt32_To_BE(result[1], dst, dstIndex + 4);
- Pack.UInt32_To_BE(result[2], dst, dstIndex + 8);
- Pack.UInt32_To_BE(result[3], dst, dstIndex + 12);
- return BLOCK_SIZE;
- }
-
- /**
- * Does the 12 quad rounds rounds to encrypt the block.
- *
- * @param A the 00-31 bits of the plaintext block
- * @param B the 32-63 bits of the plaintext block
- * @param C the 64-95 bits of the plaintext block
- * @param D the 96-127 bits of the plaintext block
- * @param result the resulting ciphertext
- */
- private void CAST_Encipher(
- uint A,
- uint B,
- uint C,
- uint D,
- uint[] result)
- {
- for (int i = 0; i < 6; i++)
- {
- int x = i*4;
- // BETA <- Qi(BETA)
- C ^= F1(D, _Km[x], _Kr[x]);
- B ^= F2(C, _Km[x + 1], _Kr[x + 1]);
- A ^= F3(B, _Km[x + 2], _Kr[x + 2]);
- D ^= F1(A, _Km[x + 3], _Kr[x + 3]);
- }
- for (int i = 6; i < 12; i++)
- {
- int x = i*4;
- // BETA <- QBARi(BETA)
- D ^= F1(A, _Km[x + 3], _Kr[x + 3]);
- A ^= F3(B, _Km[x + 2], _Kr[x + 2]);
- B ^= F2(C, _Km[x + 1], _Kr[x + 1]);
- C ^= F1(D, _Km[x], _Kr[x]);
- }
- result[0] = A;
- result[1] = B;
- result[2] = C;
- result[3] = D;
- }
-
- /**
- * Does the 12 quad rounds rounds to decrypt the block.
- *
- * @param A the 00-31 bits of the ciphertext block
- * @param B the 32-63 bits of the ciphertext block
- * @param C the 64-95 bits of the ciphertext block
- * @param D the 96-127 bits of the ciphertext block
- * @param result the resulting plaintext
- */
- private void CAST_Decipher(
- uint A,
- uint B,
- uint C,
- uint D,
- uint[] result)
- {
- for (int i = 0; i < 6; i++)
- {
- int x = (11-i)*4;
- // BETA <- Qi(BETA)
- C ^= F1(D, _Km[x], _Kr[x]);
- B ^= F2(C, _Km[x + 1], _Kr[x + 1]);
- A ^= F3(B, _Km[x + 2], _Kr[x + 2]);
- D ^= F1(A, _Km[x + 3], _Kr[x + 3]);
- }
- for (int i=6; i<12; i++)
- {
- int x = (11-i)*4;
- // BETA <- QBARi(BETA)
- D ^= F1(A, _Km[x + 3], _Kr[x + 3]);
- A ^= F3(B, _Km[x + 2], _Kr[x + 2]);
- B ^= F2(C, _Km[x + 1], _Kr[x + 1]);
- C ^= F1(D, _Km[x], _Kr[x]);
- }
- result[0] = A;
- result[1] = B;
- result[2] = C;
- result[3] = D;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/ChaCha7539Engine.cs b/BCCrypto/src/crypto/engines/ChaCha7539Engine.cs
deleted file mode 100644
index af4163a..0000000
--- a/BCCrypto/src/crypto/engines/ChaCha7539Engine.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- ///
- /// Implementation of Daniel J. Bernstein's ChaCha stream cipher.
- ///
- public class ChaCha7539Engine
- : Salsa20Engine
- {
- ///
- /// Creates a 20 rounds ChaCha engine.
- ///
- public ChaCha7539Engine()
- {
- }
-
- public override string AlgorithmName
- {
- get { return "ChaCha7539" + rounds; }
- }
-
- protected override int NonceSize
- {
- get { return 12; }
- }
-
- protected override void AdvanceCounter()
- {
- if (++engineState[12] == 0)
- throw new InvalidOperationException("attempt to increase counter past 2^32.");
- }
-
- protected override void ResetCounter()
- {
- engineState[12] = 0;
- }
-
- protected override void SetKey(byte[] keyBytes, byte[] ivBytes)
- {
- if (keyBytes != null)
- {
- if (keyBytes.Length != 32)
- throw new ArgumentException(AlgorithmName + " requires 256 bit key");
-
- PackTauOrSigma(keyBytes.Length, engineState, 0);
-
- // Key
- Pack.LE_To_UInt32(keyBytes, 0, engineState, 4, 8);
- }
-
- // IV
- Pack.LE_To_UInt32(ivBytes, 0, engineState, 13, 3);
- }
-
- protected override void GenerateKeyStream(byte[] output)
- {
- ChaChaEngine.ChachaCore(rounds, engineState, x);
- Pack.UInt32_To_LE(x, output, 0);
- }
- }
-}
-
diff --git a/BCCrypto/src/crypto/engines/ChaChaEngine.cs b/BCCrypto/src/crypto/engines/ChaChaEngine.cs
deleted file mode 100644
index 8720504..0000000
--- a/BCCrypto/src/crypto/engines/ChaChaEngine.cs
+++ /dev/null
@@ -1,157 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- ///
- /// Implementation of Daniel J. Bernstein's ChaCha stream cipher.
- ///
- public class ChaChaEngine
- : Salsa20Engine
- {
- ///
- /// Creates a 20 rounds ChaCha engine.
- ///
- public ChaChaEngine()
- {
- }
-
- ///
- /// Creates a ChaCha engine with a specific number of rounds.
- ///
- /// the number of rounds (must be an even number).
- public ChaChaEngine(int rounds)
- : base(rounds)
- {
- }
-
- public override string AlgorithmName
- {
- get { return "ChaCha" + rounds; }
- }
-
- protected override void AdvanceCounter()
- {
- if (++engineState[12] == 0)
- {
- ++engineState[13];
- }
- }
-
- protected override void ResetCounter()
- {
- engineState[12] = engineState[13] = 0;
- }
-
- protected override void SetKey(byte[] keyBytes, byte[] ivBytes)
- {
- if (keyBytes != null)
- {
- if ((keyBytes.Length != 16) && (keyBytes.Length != 32))
- throw new ArgumentException(AlgorithmName + " requires 128 bit or 256 bit key");
-
- PackTauOrSigma(keyBytes.Length, engineState, 0);
-
- // Key
- Pack.LE_To_UInt32(keyBytes, 0, engineState, 4, 4);
- Pack.LE_To_UInt32(keyBytes, keyBytes.Length - 16, engineState, 8, 4);
- }
-
- // IV
- Pack.LE_To_UInt32(ivBytes, 0, engineState, 14, 2);
- }
-
- protected override void GenerateKeyStream(byte[] output)
- {
- ChachaCore(rounds, engineState, x);
- Pack.UInt32_To_LE(x, output, 0);
- }
-
- ///
- /// ChaCha function.
- ///
- /// The number of ChaCha rounds to execute
- /// The input words.
- /// The ChaCha state to modify.
- internal static void ChachaCore(int rounds, uint[] input, uint[] x)
- {
- if (input.Length != 16)
- throw new ArgumentException();
- if (x.Length != 16)
- throw new ArgumentException();
- if (rounds % 2 != 0)
- throw new ArgumentException("Number of rounds must be even");
-
- uint x00 = input[ 0];
- uint x01 = input[ 1];
- uint x02 = input[ 2];
- uint x03 = input[ 3];
- uint x04 = input[ 4];
- uint x05 = input[ 5];
- uint x06 = input[ 6];
- uint x07 = input[ 7];
- uint x08 = input[ 8];
- uint x09 = input[ 9];
- uint x10 = input[10];
- uint x11 = input[11];
- uint x12 = input[12];
- uint x13 = input[13];
- uint x14 = input[14];
- uint x15 = input[15];
-
- for (int i = rounds; i > 0; i -= 2)
- {
- x00 += x04; x12 = R(x12 ^ x00, 16);
- x08 += x12; x04 = R(x04 ^ x08, 12);
- x00 += x04; x12 = R(x12 ^ x00, 8);
- x08 += x12; x04 = R(x04 ^ x08, 7);
- x01 += x05; x13 = R(x13 ^ x01, 16);
- x09 += x13; x05 = R(x05 ^ x09, 12);
- x01 += x05; x13 = R(x13 ^ x01, 8);
- x09 += x13; x05 = R(x05 ^ x09, 7);
- x02 += x06; x14 = R(x14 ^ x02, 16);
- x10 += x14; x06 = R(x06 ^ x10, 12);
- x02 += x06; x14 = R(x14 ^ x02, 8);
- x10 += x14; x06 = R(x06 ^ x10, 7);
- x03 += x07; x15 = R(x15 ^ x03, 16);
- x11 += x15; x07 = R(x07 ^ x11, 12);
- x03 += x07; x15 = R(x15 ^ x03, 8);
- x11 += x15; x07 = R(x07 ^ x11, 7);
- x00 += x05; x15 = R(x15 ^ x00, 16);
- x10 += x15; x05 = R(x05 ^ x10, 12);
- x00 += x05; x15 = R(x15 ^ x00, 8);
- x10 += x15; x05 = R(x05 ^ x10, 7);
- x01 += x06; x12 = R(x12 ^ x01, 16);
- x11 += x12; x06 = R(x06 ^ x11, 12);
- x01 += x06; x12 = R(x12 ^ x01, 8);
- x11 += x12; x06 = R(x06 ^ x11, 7);
- x02 += x07; x13 = R(x13 ^ x02, 16);
- x08 += x13; x07 = R(x07 ^ x08, 12);
- x02 += x07; x13 = R(x13 ^ x02, 8);
- x08 += x13; x07 = R(x07 ^ x08, 7);
- x03 += x04; x14 = R(x14 ^ x03, 16);
- x09 += x14; x04 = R(x04 ^ x09, 12);
- x03 += x04; x14 = R(x14 ^ x03, 8);
- x09 += x14; x04 = R(x04 ^ x09, 7);
- }
-
- x[ 0] = x00 + input[ 0];
- x[ 1] = x01 + input[ 1];
- x[ 2] = x02 + input[ 2];
- x[ 3] = x03 + input[ 3];
- x[ 4] = x04 + input[ 4];
- x[ 5] = x05 + input[ 5];
- x[ 6] = x06 + input[ 6];
- x[ 7] = x07 + input[ 7];
- x[ 8] = x08 + input[ 8];
- x[ 9] = x09 + input[ 9];
- x[10] = x10 + input[10];
- x[11] = x11 + input[11];
- x[12] = x12 + input[12];
- x[13] = x13 + input[13];
- x[14] = x14 + input[14];
- x[15] = x15 + input[15];
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/DesEdeEngine.cs b/BCCrypto/src/crypto/engines/DesEdeEngine.cs
deleted file mode 100644
index 2fac24a..0000000
--- a/BCCrypto/src/crypto/engines/DesEdeEngine.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /// A class that provides a basic DESede (or Triple DES) engine.
- public class DesEdeEngine
- : DesEngine
- {
- private int[] workingKey1, workingKey2, workingKey3;
- private bool forEncryption;
-
- /**
- * initialise a DESede cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public override void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException("invalid parameter passed to DESede init - " + Platform.GetTypeName(parameters));
-
- byte[] keyMaster = ((KeyParameter)parameters).GetKey();
- if (keyMaster.Length != 24 && keyMaster.Length != 16)
- throw new ArgumentException("key size must be 16 or 24 bytes.");
-
- this.forEncryption = forEncryption;
-
- byte[] key1 = new byte[8];
- Array.Copy(keyMaster, 0, key1, 0, key1.Length);
- workingKey1 = GenerateWorkingKey(forEncryption, key1);
-
- byte[] key2 = new byte[8];
- Array.Copy(keyMaster, 8, key2, 0, key2.Length);
- workingKey2 = GenerateWorkingKey(!forEncryption, key2);
-
- if (keyMaster.Length == 24)
- {
- byte[] key3 = new byte[8];
- Array.Copy(keyMaster, 16, key3, 0, key3.Length);
- workingKey3 = GenerateWorkingKey(forEncryption, key3);
- }
- else // 16 byte key
- {
- workingKey3 = workingKey1;
- }
- }
-
- public override string AlgorithmName
- {
- get { return "DESede"; }
- }
-
- public override int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- public override int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (workingKey1 == null)
- throw new InvalidOperationException("DESede engine not initialised");
-
- Check.DataLength(input, inOff, BLOCK_SIZE, "input buffer too short");
- Check.OutputLength(output, outOff, BLOCK_SIZE, "output buffer too short");
-
- byte[] temp = new byte[BLOCK_SIZE];
-
- if (forEncryption)
- {
- DesFunc(workingKey1, input, inOff, temp, 0);
- DesFunc(workingKey2, temp, 0, temp, 0);
- DesFunc(workingKey3, temp, 0, output, outOff);
- }
- else
- {
- DesFunc(workingKey3, input, inOff, temp, 0);
- DesFunc(workingKey2, temp, 0, temp, 0);
- DesFunc(workingKey1, temp, 0, output, outOff);
- }
-
- return BLOCK_SIZE;
- }
-
- public override void Reset()
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/DesEdeWrapEngine.cs b/BCCrypto/src/crypto/engines/DesEdeWrapEngine.cs
deleted file mode 100644
index 43100a9..0000000
--- a/BCCrypto/src/crypto/engines/DesEdeWrapEngine.cs
+++ /dev/null
@@ -1,322 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * Wrap keys according to
- *
- * draft-ietf-smime-key-wrap-01.txt .
- *
- * Note:
- *
- * this is based on a draft, and as such is subject to change - don't use this class for anything requiring long term storage.
- * if you are using this to wrap triple-des keys you need to set the
- * parity bits on the key and, if it's a two-key triple-des key, pad it
- * yourself.
- *
- *
- */
- public class DesEdeWrapEngine
- : IWrapper
- {
- /** Field engine */
- private CbcBlockCipher engine;
- /** Field param */
- private KeyParameter param;
- /** Field paramPlusIV */
- private ParametersWithIV paramPlusIV;
- /** Field iv */
- private byte[] iv;
- /** Field forWrapping */
- private bool forWrapping;
- /** Field IV2 */
- private static readonly byte[] IV2 = { (byte) 0x4a, (byte) 0xdd, (byte) 0xa2,
- (byte) 0x2c, (byte) 0x79, (byte) 0xe8,
- (byte) 0x21, (byte) 0x05 };
-
- //
- // checksum digest
- //
- private readonly IDigest sha1 = new Sha1Digest();
- private readonly byte[] digest = new byte[20];
-
- /**
- * Method init
- *
- * @param forWrapping
- * @param param
- */
- public virtual void Init(
- bool forWrapping,
- ICipherParameters parameters)
- {
- this.forWrapping = forWrapping;
- this.engine = new CbcBlockCipher(new DesEdeEngine());
-
- SecureRandom sr;
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom pr = (ParametersWithRandom) parameters;
- parameters = pr.Parameters;
- sr = pr.Random;
- }
- else
- {
- sr = new SecureRandom();
- }
-
- if (parameters is KeyParameter)
- {
- this.param = (KeyParameter) parameters;
- if (this.forWrapping)
- {
- // Hm, we have no IV but we want to wrap ?!?
- // well, then we have to create our own IV.
- this.iv = new byte[8];
- sr.NextBytes(iv);
-
- this.paramPlusIV = new ParametersWithIV(this.param, this.iv);
- }
- }
- else if (parameters is ParametersWithIV)
- {
- if (!forWrapping)
- throw new ArgumentException("You should not supply an IV for unwrapping");
-
- this.paramPlusIV = (ParametersWithIV) parameters;
- this.iv = this.paramPlusIV.GetIV();
- this.param = (KeyParameter) this.paramPlusIV.Parameters;
-
- if (this.iv.Length != 8)
- throw new ArgumentException("IV is not 8 octets", "parameters");
- }
- }
-
- /**
- * Method GetAlgorithmName
- *
- * @return
- */
- public virtual string AlgorithmName
- {
- get { return "DESede"; }
- }
-
- /**
- * Method wrap
- *
- * @param in
- * @param inOff
- * @param inLen
- * @return
- */
- public virtual byte[] Wrap(
- byte[] input,
- int inOff,
- int length)
- {
- if (!forWrapping)
- {
- throw new InvalidOperationException("Not initialized for wrapping");
- }
-
- byte[] keyToBeWrapped = new byte[length];
- Array.Copy(input, inOff, keyToBeWrapped, 0, length);
-
- // Compute the CMS Key Checksum, (section 5.6.1), call this CKS.
- byte[] CKS = CalculateCmsKeyChecksum(keyToBeWrapped);
-
- // Let WKCKS = WK || CKS where || is concatenation.
- byte[] WKCKS = new byte[keyToBeWrapped.Length + CKS.Length];
- Array.Copy(keyToBeWrapped, 0, WKCKS, 0, keyToBeWrapped.Length);
- Array.Copy(CKS, 0, WKCKS, keyToBeWrapped.Length, CKS.Length);
-
- // Encrypt WKCKS in CBC mode using KEK as the key and IV as the
- // initialization vector. Call the results TEMP1.
-
- int blockSize = engine.GetBlockSize();
-
- if (WKCKS.Length % blockSize != 0)
- throw new InvalidOperationException("Not multiple of block length");
-
- engine.Init(true, paramPlusIV);
-
- byte [] TEMP1 = new byte[WKCKS.Length];
-
- for (int currentBytePos = 0; currentBytePos != WKCKS.Length; currentBytePos += blockSize)
- {
- engine.ProcessBlock(WKCKS, currentBytePos, TEMP1, currentBytePos);
- }
-
- // Let TEMP2 = IV || TEMP1.
- byte[] TEMP2 = new byte[this.iv.Length + TEMP1.Length];
- Array.Copy(this.iv, 0, TEMP2, 0, this.iv.Length);
- Array.Copy(TEMP1, 0, TEMP2, this.iv.Length, TEMP1.Length);
-
- // Reverse the order of the octets in TEMP2 and call the result TEMP3.
- byte[] TEMP3 = reverse(TEMP2);
-
- // Encrypt TEMP3 in CBC mode using the KEK and an initialization vector
- // of 0x 4a dd a2 2c 79 e8 21 05. The resulting cipher text is the desired
- // result. It is 40 octets long if a 168 bit key is being wrapped.
- ParametersWithIV param2 = new ParametersWithIV(this.param, IV2);
- this.engine.Init(true, param2);
-
- for (int currentBytePos = 0; currentBytePos != TEMP3.Length; currentBytePos += blockSize)
- {
- engine.ProcessBlock(TEMP3, currentBytePos, TEMP3, currentBytePos);
- }
-
- return TEMP3;
- }
-
- /**
- * Method unwrap
- *
- * @param in
- * @param inOff
- * @param inLen
- * @return
- * @throws InvalidCipherTextException
- */
- public virtual byte[] Unwrap(
- byte[] input,
- int inOff,
- int length)
- {
- if (forWrapping)
- {
- throw new InvalidOperationException("Not set for unwrapping");
- }
- if (input == null)
- {
- throw new InvalidCipherTextException("Null pointer as ciphertext");
- }
-
- int blockSize = engine.GetBlockSize();
-
- if (length % blockSize != 0)
- {
- throw new InvalidCipherTextException("Ciphertext not multiple of " + blockSize);
- }
-
- /*
- // Check if the length of the cipher text is reasonable given the key
- // type. It must be 40 bytes for a 168 bit key and either 32, 40, or
- // 48 bytes for a 128, 192, or 256 bit key. If the length is not supported
- // or inconsistent with the algorithm for which the key is intended,
- // return error.
- //
- // we do not accept 168 bit keys. it has to be 192 bit.
- int lengthA = (estimatedKeyLengthInBit / 8) + 16;
- int lengthB = estimatedKeyLengthInBit % 8;
- if ((lengthA != keyToBeUnwrapped.Length) || (lengthB != 0)) {
- throw new XMLSecurityException("empty");
- }
- */
-
- // Decrypt the cipher text with TRIPLedeS in CBC mode using the KEK
- // and an initialization vector (IV) of 0x4adda22c79e82105. Call the output TEMP3.
- ParametersWithIV param2 = new ParametersWithIV(this.param, IV2);
- this.engine.Init(false, param2);
-
- byte [] TEMP3 = new byte[length];
-
- for (int currentBytePos = 0; currentBytePos != TEMP3.Length; currentBytePos += blockSize)
- {
- engine.ProcessBlock(input, inOff + currentBytePos, TEMP3, currentBytePos);
- }
-
- // Reverse the order of the octets in TEMP3 and call the result TEMP2.
- byte[] TEMP2 = reverse(TEMP3);
-
- // Decompose TEMP2 into IV, the first 8 octets, and TEMP1, the remaining octets.
- this.iv = new byte[8];
- byte[] TEMP1 = new byte[TEMP2.Length - 8];
- Array.Copy(TEMP2, 0, this.iv, 0, 8);
- Array.Copy(TEMP2, 8, TEMP1, 0, TEMP2.Length - 8);
-
- // Decrypt TEMP1 using TRIPLedeS in CBC mode using the KEK and the IV
- // found in the previous step. Call the result WKCKS.
- this.paramPlusIV = new ParametersWithIV(this.param, this.iv);
- this.engine.Init(false, this.paramPlusIV);
-
- byte[] WKCKS = new byte[TEMP1.Length];
-
- for (int currentBytePos = 0; currentBytePos != WKCKS.Length; currentBytePos += blockSize)
- {
- engine.ProcessBlock(TEMP1, currentBytePos, WKCKS, currentBytePos);
- }
-
- // Decompose WKCKS. CKS is the last 8 octets and WK, the wrapped key, are
- // those octets before the CKS.
- byte[] result = new byte[WKCKS.Length - 8];
- byte[] CKStoBeVerified = new byte[8];
- Array.Copy(WKCKS, 0, result, 0, WKCKS.Length - 8);
- Array.Copy(WKCKS, WKCKS.Length - 8, CKStoBeVerified, 0, 8);
-
- // Calculate a CMS Key Checksum, (section 5.6.1), over the WK and compare
- // with the CKS extracted in the above step. If they are not equal, return error.
- if (!CheckCmsKeyChecksum(result, CKStoBeVerified)) {
- throw new InvalidCipherTextException(
- "Checksum inside ciphertext is corrupted");
- }
-
- // WK is the wrapped key, now extracted for use in data decryption.
- return result;
- }
-
- /**
- * Some key wrap algorithms make use of the Key Checksum defined
- * in CMS [CMS-Algorithms]. This is used to provide an integrity
- * check value for the key being wrapped. The algorithm is
- *
- * - Compute the 20 octet SHA-1 hash on the key being wrapped.
- * - Use the first 8 octets of this hash as the checksum value.
- *
- * @param key
- * @return
- * @throws Exception
- * @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum
- */
- private byte[] CalculateCmsKeyChecksum(
- byte[] key)
- {
- sha1.BlockUpdate(key, 0, key.Length);
- sha1.DoFinal(digest, 0);
-
- byte[] result = new byte[8];
- Array.Copy(digest, 0, result, 0, 8);
- return result;
- }
-
- /**
- * @param key
- * @param checksum
- * @return
- * @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum
- */
- private bool CheckCmsKeyChecksum(
- byte[] key,
- byte[] checksum)
- {
- return Arrays.ConstantTimeAreEqual(CalculateCmsKeyChecksum(key), checksum);
- }
-
- private static byte[] reverse(byte[] bs)
- {
- byte[] result = new byte[bs.Length];
- for (int i = 0; i < bs.Length; i++)
- {
- result[i] = bs[bs.Length - (i + 1)];
- }
- return result;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/DesEngine.cs b/BCCrypto/src/crypto/engines/DesEngine.cs
deleted file mode 100644
index cfd5068..0000000
--- a/BCCrypto/src/crypto/engines/DesEngine.cs
+++ /dev/null
@@ -1,475 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /// A class that provides a basic DES engine.
- public class DesEngine
- : IBlockCipher
- {
- internal const int BLOCK_SIZE = 8;
-
- private int[] workingKey;
-
- public virtual int[] GetWorkingKey()
- {
- return workingKey;
- }
-
- /**
- * initialise a DES cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException("invalid parameter passed to DES init - " + Platform.GetTypeName(parameters));
-
- workingKey = GenerateWorkingKey(forEncryption, ((KeyParameter)parameters).GetKey());
- }
-
- public virtual string AlgorithmName
- {
- get { return "DES"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (workingKey == null)
- throw new InvalidOperationException("DES engine not initialised");
-
- Check.DataLength(input, inOff, BLOCK_SIZE, "input buffer too short");
- Check.OutputLength(output, outOff, BLOCK_SIZE, "output buffer too short");
-
- DesFunc(workingKey, input, inOff, output, outOff);
-
- return BLOCK_SIZE;
- }
-
- public virtual void Reset()
- {
- }
-
- /**
- * what follows is mainly taken from "Applied Cryptography", by
- * Bruce Schneier, however it also bears great resemblance to Richard
- * Outerbridge's D3DES...
- */
-
-// private static readonly short[] Df_Key =
-// {
-// 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,
-// 0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10,
-// 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67
-// };
-
- private static readonly short[] bytebit =
- {
- 128, 64, 32, 16, 8, 4, 2, 1
- };
-
- private static readonly int[] bigbyte =
- {
- 0x800000, 0x400000, 0x200000, 0x100000,
- 0x80000, 0x40000, 0x20000, 0x10000,
- 0x8000, 0x4000, 0x2000, 0x1000,
- 0x800, 0x400, 0x200, 0x100,
- 0x80, 0x40, 0x20, 0x10,
- 0x8, 0x4, 0x2, 0x1
- };
-
- /*
- * Use the key schedule specified in the Standard (ANSI X3.92-1981).
- */
- private static readonly byte[] pc1 =
- {
- 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17,
- 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,
- 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21,
- 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3
- };
-
- private static readonly byte[] totrot =
- {
- 1, 2, 4, 6, 8, 10, 12, 14,
- 15, 17, 19, 21, 23, 25, 27, 28
- };
-
- private static readonly byte[] pc2 =
- {
- 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
- 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,
- 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
- 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31
- };
-
- private static readonly uint[] SP1 =
- {
- 0x01010400, 0x00000000, 0x00010000, 0x01010404,
- 0x01010004, 0x00010404, 0x00000004, 0x00010000,
- 0x00000400, 0x01010400, 0x01010404, 0x00000400,
- 0x01000404, 0x01010004, 0x01000000, 0x00000004,
- 0x00000404, 0x01000400, 0x01000400, 0x00010400,
- 0x00010400, 0x01010000, 0x01010000, 0x01000404,
- 0x00010004, 0x01000004, 0x01000004, 0x00010004,
- 0x00000000, 0x00000404, 0x00010404, 0x01000000,
- 0x00010000, 0x01010404, 0x00000004, 0x01010000,
- 0x01010400, 0x01000000, 0x01000000, 0x00000400,
- 0x01010004, 0x00010000, 0x00010400, 0x01000004,
- 0x00000400, 0x00000004, 0x01000404, 0x00010404,
- 0x01010404, 0x00010004, 0x01010000, 0x01000404,
- 0x01000004, 0x00000404, 0x00010404, 0x01010400,
- 0x00000404, 0x01000400, 0x01000400, 0x00000000,
- 0x00010004, 0x00010400, 0x00000000, 0x01010004
- };
-
- private static readonly uint[] SP2 =
- {
- 0x80108020, 0x80008000, 0x00008000, 0x00108020,
- 0x00100000, 0x00000020, 0x80100020, 0x80008020,
- 0x80000020, 0x80108020, 0x80108000, 0x80000000,
- 0x80008000, 0x00100000, 0x00000020, 0x80100020,
- 0x00108000, 0x00100020, 0x80008020, 0x00000000,
- 0x80000000, 0x00008000, 0x00108020, 0x80100000,
- 0x00100020, 0x80000020, 0x00000000, 0x00108000,
- 0x00008020, 0x80108000, 0x80100000, 0x00008020,
- 0x00000000, 0x00108020, 0x80100020, 0x00100000,
- 0x80008020, 0x80100000, 0x80108000, 0x00008000,
- 0x80100000, 0x80008000, 0x00000020, 0x80108020,
- 0x00108020, 0x00000020, 0x00008000, 0x80000000,
- 0x00008020, 0x80108000, 0x00100000, 0x80000020,
- 0x00100020, 0x80008020, 0x80000020, 0x00100020,
- 0x00108000, 0x00000000, 0x80008000, 0x00008020,
- 0x80000000, 0x80100020, 0x80108020, 0x00108000
- };
-
- private static readonly uint[] SP3 =
- {
- 0x00000208, 0x08020200, 0x00000000, 0x08020008,
- 0x08000200, 0x00000000, 0x00020208, 0x08000200,
- 0x00020008, 0x08000008, 0x08000008, 0x00020000,
- 0x08020208, 0x00020008, 0x08020000, 0x00000208,
- 0x08000000, 0x00000008, 0x08020200, 0x00000200,
- 0x00020200, 0x08020000, 0x08020008, 0x00020208,
- 0x08000208, 0x00020200, 0x00020000, 0x08000208,
- 0x00000008, 0x08020208, 0x00000200, 0x08000000,
- 0x08020200, 0x08000000, 0x00020008, 0x00000208,
- 0x00020000, 0x08020200, 0x08000200, 0x00000000,
- 0x00000200, 0x00020008, 0x08020208, 0x08000200,
- 0x08000008, 0x00000200, 0x00000000, 0x08020008,
- 0x08000208, 0x00020000, 0x08000000, 0x08020208,
- 0x00000008, 0x00020208, 0x00020200, 0x08000008,
- 0x08020000, 0x08000208, 0x00000208, 0x08020000,
- 0x00020208, 0x00000008, 0x08020008, 0x00020200
- };
-
- private static readonly uint[] SP4 =
- {
- 0x00802001, 0x00002081, 0x00002081, 0x00000080,
- 0x00802080, 0x00800081, 0x00800001, 0x00002001,
- 0x00000000, 0x00802000, 0x00802000, 0x00802081,
- 0x00000081, 0x00000000, 0x00800080, 0x00800001,
- 0x00000001, 0x00002000, 0x00800000, 0x00802001,
- 0x00000080, 0x00800000, 0x00002001, 0x00002080,
- 0x00800081, 0x00000001, 0x00002080, 0x00800080,
- 0x00002000, 0x00802080, 0x00802081, 0x00000081,
- 0x00800080, 0x00800001, 0x00802000, 0x00802081,
- 0x00000081, 0x00000000, 0x00000000, 0x00802000,
- 0x00002080, 0x00800080, 0x00800081, 0x00000001,
- 0x00802001, 0x00002081, 0x00002081, 0x00000080,
- 0x00802081, 0x00000081, 0x00000001, 0x00002000,
- 0x00800001, 0x00002001, 0x00802080, 0x00800081,
- 0x00002001, 0x00002080, 0x00800000, 0x00802001,
- 0x00000080, 0x00800000, 0x00002000, 0x00802080
- };
-
- private static readonly uint[] SP5 =
- {
- 0x00000100, 0x02080100, 0x02080000, 0x42000100,
- 0x00080000, 0x00000100, 0x40000000, 0x02080000,
- 0x40080100, 0x00080000, 0x02000100, 0x40080100,
- 0x42000100, 0x42080000, 0x00080100, 0x40000000,
- 0x02000000, 0x40080000, 0x40080000, 0x00000000,
- 0x40000100, 0x42080100, 0x42080100, 0x02000100,
- 0x42080000, 0x40000100, 0x00000000, 0x42000000,
- 0x02080100, 0x02000000, 0x42000000, 0x00080100,
- 0x00080000, 0x42000100, 0x00000100, 0x02000000,
- 0x40000000, 0x02080000, 0x42000100, 0x40080100,
- 0x02000100, 0x40000000, 0x42080000, 0x02080100,
- 0x40080100, 0x00000100, 0x02000000, 0x42080000,
- 0x42080100, 0x00080100, 0x42000000, 0x42080100,
- 0x02080000, 0x00000000, 0x40080000, 0x42000000,
- 0x00080100, 0x02000100, 0x40000100, 0x00080000,
- 0x00000000, 0x40080000, 0x02080100, 0x40000100
- };
-
- private static readonly uint[] SP6 =
- {
- 0x20000010, 0x20400000, 0x00004000, 0x20404010,
- 0x20400000, 0x00000010, 0x20404010, 0x00400000,
- 0x20004000, 0x00404010, 0x00400000, 0x20000010,
- 0x00400010, 0x20004000, 0x20000000, 0x00004010,
- 0x00000000, 0x00400010, 0x20004010, 0x00004000,
- 0x00404000, 0x20004010, 0x00000010, 0x20400010,
- 0x20400010, 0x00000000, 0x00404010, 0x20404000,
- 0x00004010, 0x00404000, 0x20404000, 0x20000000,
- 0x20004000, 0x00000010, 0x20400010, 0x00404000,
- 0x20404010, 0x00400000, 0x00004010, 0x20000010,
- 0x00400000, 0x20004000, 0x20000000, 0x00004010,
- 0x20000010, 0x20404010, 0x00404000, 0x20400000,
- 0x00404010, 0x20404000, 0x00000000, 0x20400010,
- 0x00000010, 0x00004000, 0x20400000, 0x00404010,
- 0x00004000, 0x00400010, 0x20004010, 0x00000000,
- 0x20404000, 0x20000000, 0x00400010, 0x20004010
- };
-
- private static readonly uint[] SP7 =
- {
- 0x00200000, 0x04200002, 0x04000802, 0x00000000,
- 0x00000800, 0x04000802, 0x00200802, 0x04200800,
- 0x04200802, 0x00200000, 0x00000000, 0x04000002,
- 0x00000002, 0x04000000, 0x04200002, 0x00000802,
- 0x04000800, 0x00200802, 0x00200002, 0x04000800,
- 0x04000002, 0x04200000, 0x04200800, 0x00200002,
- 0x04200000, 0x00000800, 0x00000802, 0x04200802,
- 0x00200800, 0x00000002, 0x04000000, 0x00200800,
- 0x04000000, 0x00200800, 0x00200000, 0x04000802,
- 0x04000802, 0x04200002, 0x04200002, 0x00000002,
- 0x00200002, 0x04000000, 0x04000800, 0x00200000,
- 0x04200800, 0x00000802, 0x00200802, 0x04200800,
- 0x00000802, 0x04000002, 0x04200802, 0x04200000,
- 0x00200800, 0x00000000, 0x00000002, 0x04200802,
- 0x00000000, 0x00200802, 0x04200000, 0x00000800,
- 0x04000002, 0x04000800, 0x00000800, 0x00200002
- };
-
- private static readonly uint[] SP8 =
- {
- 0x10001040, 0x00001000, 0x00040000, 0x10041040,
- 0x10000000, 0x10001040, 0x00000040, 0x10000000,
- 0x00040040, 0x10040000, 0x10041040, 0x00041000,
- 0x10041000, 0x00041040, 0x00001000, 0x00000040,
- 0x10040000, 0x10000040, 0x10001000, 0x00001040,
- 0x00041000, 0x00040040, 0x10040040, 0x10041000,
- 0x00001040, 0x00000000, 0x00000000, 0x10040040,
- 0x10000040, 0x10001000, 0x00041040, 0x00040000,
- 0x00041040, 0x00040000, 0x10041000, 0x00001000,
- 0x00000040, 0x10040040, 0x00001000, 0x00041040,
- 0x10001000, 0x00000040, 0x10000040, 0x10040000,
- 0x10040040, 0x10000000, 0x00040000, 0x10001040,
- 0x00000000, 0x10041040, 0x00040040, 0x10000040,
- 0x10040000, 0x10001000, 0x10001040, 0x00000000,
- 0x10041040, 0x00041000, 0x00041000, 0x00001040,
- 0x00001040, 0x00040040, 0x10000000, 0x10041000
- };
-
- /**
- * Generate an integer based working key based on our secret key
- * and what we processing we are planning to do.
- *
- * Acknowledgements for this routine go to James Gillogly and Phil Karn.
- * (whoever, and wherever they are!).
- */
- protected static int[] GenerateWorkingKey(
- bool encrypting,
- byte[] key)
- {
- int[] newKey = new int[32];
- bool[] pc1m = new bool[56];
- bool[] pcr = new bool[56];
-
- for (int j = 0; j < 56; j++ )
- {
- int l = pc1[j];
-
- pc1m[j] = ((key[(uint) l >> 3] & bytebit[l & 07]) != 0);
- }
-
- for (int i = 0; i < 16; i++)
- {
- int l, m, n;
-
- if (encrypting)
- {
- m = i << 1;
- }
- else
- {
- m = (15 - i) << 1;
- }
-
- n = m + 1;
- newKey[m] = newKey[n] = 0;
-
- for (int j = 0; j < 28; j++)
- {
- l = j + totrot[i];
- if ( l < 28 )
- {
- pcr[j] = pc1m[l];
- }
- else
- {
- pcr[j] = pc1m[l - 28];
- }
- }
-
- for (int j = 28; j < 56; j++)
- {
- l = j + totrot[i];
- if (l < 56 )
- {
- pcr[j] = pc1m[l];
- }
- else
- {
- pcr[j] = pc1m[l - 28];
- }
- }
-
- for (int j = 0; j < 24; j++)
- {
- if (pcr[pc2[j]])
- {
- newKey[m] |= bigbyte[j];
- }
-
- if (pcr[pc2[j + 24]])
- {
- newKey[n] |= bigbyte[j];
- }
- }
- }
-
- //
- // store the processed key
- //
- for (int i = 0; i != 32; i += 2)
- {
- int i1, i2;
-
- i1 = newKey[i];
- i2 = newKey[i + 1];
-
- newKey[i] = (int) ( (uint) ((i1 & 0x00fc0000) << 6) |
- (uint) ((i1 & 0x00000fc0) << 10) |
- ((uint) (i2 & 0x00fc0000) >> 10) |
- ((uint) (i2 & 0x00000fc0) >> 6));
-
- newKey[i + 1] = (int) ( (uint) ((i1 & 0x0003f000) << 12) |
- (uint) ((i1 & 0x0000003f) << 16) |
- ((uint) (i2 & 0x0003f000) >> 4) |
- (uint) (i2 & 0x0000003f));
- }
-
- return newKey;
- }
-
- /**
- * the DES engine.
- */
- internal static void DesFunc(
- int[] wKey,
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- uint left = Pack.BE_To_UInt32(input, inOff);
- uint right = Pack.BE_To_UInt32(input, inOff + 4);
- uint work;
-
- work = ((left >> 4) ^ right) & 0x0f0f0f0f;
- right ^= work;
- left ^= (work << 4);
- work = ((left >> 16) ^ right) & 0x0000ffff;
- right ^= work;
- left ^= (work << 16);
- work = ((right >> 2) ^ left) & 0x33333333;
- left ^= work;
- right ^= (work << 2);
- work = ((right >> 8) ^ left) & 0x00ff00ff;
- left ^= work;
- right ^= (work << 8);
- right = (right << 1) | (right >> 31);
- work = (left ^ right) & 0xaaaaaaaa;
- left ^= work;
- right ^= work;
- left = (left << 1) | (left >> 31);
-
- for (int round = 0; round < 8; round++)
- {
- uint fval;
-
- work = (right << 28) | (right >> 4);
- work ^= (uint)wKey[round * 4 + 0];
- fval = SP7[work & 0x3f];
- fval |= SP5[(work >> 8) & 0x3f];
- fval |= SP3[(work >> 16) & 0x3f];
- fval |= SP1[(work >> 24) & 0x3f];
- work = right ^ (uint)wKey[round * 4 + 1];
- fval |= SP8[ work & 0x3f];
- fval |= SP6[(work >> 8) & 0x3f];
- fval |= SP4[(work >> 16) & 0x3f];
- fval |= SP2[(work >> 24) & 0x3f];
- left ^= fval;
- work = (left << 28) | (left >> 4);
- work ^= (uint)wKey[round * 4 + 2];
- fval = SP7[ work & 0x3f];
- fval |= SP5[(work >> 8) & 0x3f];
- fval |= SP3[(work >> 16) & 0x3f];
- fval |= SP1[(work >> 24) & 0x3f];
- work = left ^ (uint)wKey[round * 4 + 3];
- fval |= SP8[ work & 0x3f];
- fval |= SP6[(work >> 8) & 0x3f];
- fval |= SP4[(work >> 16) & 0x3f];
- fval |= SP2[(work >> 24) & 0x3f];
- right ^= fval;
- }
-
- right = (right << 31) | (right >> 1);
- work = (left ^ right) & 0xaaaaaaaa;
- left ^= work;
- right ^= work;
- left = (left << 31) | (left >> 1);
- work = ((left >> 8) ^ right) & 0x00ff00ff;
- right ^= work;
- left ^= (work << 8);
- work = ((left >> 2) ^ right) & 0x33333333;
- right ^= work;
- left ^= (work << 2);
- work = ((right >> 16) ^ left) & 0x0000ffff;
- left ^= work;
- right ^= (work << 16);
- work = ((right >> 4) ^ left) & 0x0f0f0f0f;
- left ^= work;
- right ^= (work << 4);
-
- Pack.UInt32_To_BE(right, outBytes, outOff);
- Pack.UInt32_To_BE(left, outBytes, outOff + 4);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/Dstu7624Engine.cs b/BCCrypto/src/crypto/engines/Dstu7624Engine.cs
deleted file mode 100644
index 422b557..0000000
--- a/BCCrypto/src/crypto/engines/Dstu7624Engine.cs
+++ /dev/null
@@ -1,855 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * implementation of DSTU 7624 (Kalyna)
- */
- public class Dstu7624Engine
- : IBlockCipher
- {
- private static readonly int BITS_IN_WORD = 64;
- private static readonly int BITS_IN_BYTE = 8;
-
- private static readonly int REDUCTION_POLYNOMIAL = 0x011d; /* x^8 + x^4 + x^3 + x^2 + 1 */
-
- private ulong[] internalState;
- private ulong[] workingKey;
- private ulong[][] roundKeys;
-
- /* Number of 64-bit words in block */
- private int wordsInBlock;
-
- /* Number of 64-bit words in key */
- private int wordsInKey;
-
- /* Number of encryption rounds depending on key length */
- private static int ROUNDS_128 = 10;
- private static int ROUNDS_256 = 14;
- private static int ROUNDS_512 = 18;
-
- private int blockSizeBits;
- private int roundsAmount;
-
- private bool forEncryption;
-
- private byte[] internalStateBytes;
- private byte[] tempInternalStateBytes;
-
- public Dstu7624Engine(int blockSizeBits)
- {
- /* DSTU7624 supports 128 | 256 | 512 key/block sizes */
- if (blockSizeBits != 128 && blockSizeBits != 256 && blockSizeBits != 512)
- {
- throw new ArgumentException("Unsupported block length: only 128/256/512 are allowed");
- }
- this.blockSizeBits = blockSizeBits;
-
- wordsInBlock = blockSizeBits / BITS_IN_WORD;
- internalState = new ulong[wordsInBlock];
-
- internalStateBytes = new byte[internalState.Length * 64 / BITS_IN_BYTE];
- tempInternalStateBytes = new byte[internalState.Length * 64 / BITS_IN_BYTE];
- }
-
- #region INITIALIZATION
- public virtual void Init(bool forEncryption, ICipherParameters parameters)
- {
- if (parameters is KeyParameter)
- {
- this.forEncryption = forEncryption;
-
- byte[] keyBytes = ((KeyParameter)parameters).GetKey();
- int keyBitLength = keyBytes.Length * BITS_IN_BYTE;
- int blockBitLength = wordsInBlock * BITS_IN_WORD;
-
- if (keyBitLength != 128 && keyBitLength != 256 && keyBitLength != 512)
- {
- throw new ArgumentException("unsupported key length: only 128/256/512 are allowed");
- }
-
- /* Limitations on key lengths depending on block lengths. See table 6.1 in standard */
- if (blockBitLength == 128)
- {
- if (keyBitLength == 512)
- {
- throw new ArgumentException("Unsupported key length");
- }
- }
-
- if (blockBitLength == 256)
- {
- if (keyBitLength == 128)
- {
- throw new ArgumentException("Unsupported key length");
- }
- }
-
- if (blockBitLength == 512)
- {
- if (keyBitLength != 512)
- {
- throw new ArgumentException("Unsupported key length");
- }
- }
-
- switch (keyBitLength)
- {
- case 128:
- roundsAmount = ROUNDS_128;
- break;
- case 256:
- roundsAmount = ROUNDS_256;
- break;
- case 512:
- roundsAmount = ROUNDS_512;
- break;
- }
-
- wordsInKey = keyBitLength / BITS_IN_WORD;
-
- /* +1 round key as defined in standard */
- roundKeys = new ulong[roundsAmount + 1][];
- for (int roundKeyIndex = 0; roundKeyIndex < roundKeys.Length; roundKeyIndex++)
- {
- roundKeys[roundKeyIndex] = new ulong[wordsInBlock];
- }
-
- workingKey = new ulong[wordsInKey];
-
- if (keyBytes.Length != wordsInKey * BITS_IN_WORD / BITS_IN_BYTE)
- {
- throw new ArgumentException("Invalid key parameter passed to DSTU7624Engine init");
- }
-
- /* Unpack encryption key bytes to words */
- Pack.LE_To_UInt64(keyBytes, 0, workingKey);
-
- ulong[] kt = new ulong[wordsInBlock];
-
- KeyExpandKT(workingKey, kt);
-
- KeyExpandEven(workingKey, kt);
-
- KeyExpandOdd();
-
- }
- else if (parameters != null)
- {
- throw new ArgumentException("invalid parameter passed to Dstu7624 init - "
- + Platform.GetTypeName(parameters));
- }
-
- this.forEncryption = forEncryption;
- }
-
- private void KeyExpandKT(ulong[] key, ulong[] kt)
- {
- ulong[] k0 = new ulong[wordsInBlock];
- ulong[] k1 = new ulong[wordsInBlock];
-
- internalState = new ulong[wordsInBlock];
- internalState[0] += (ulong)(wordsInBlock + wordsInKey + 1);
-
- if (wordsInBlock == wordsInKey)
- {
- Array.Copy(key, k0, k0.Length);
- Array.Copy(key, k1, k1.Length);
- }
- else
- {
- Array.Copy(key, 0, k0, 0, wordsInBlock);
- Array.Copy(key, wordsInBlock, k1, 0, wordsInBlock);
- }
-
- AddRoundKeyExpand(k0);
-
- EncryptionRound();
-
- XorRoundKeyExpand(k1);
-
- EncryptionRound();
-
- AddRoundKeyExpand(k0);
-
- EncryptionRound();
-
- Array.Copy(internalState, kt, wordsInBlock);
- }
-
- private void KeyExpandEven(ulong[] key, ulong[] kt)
- {
- ulong[] initial_data = new ulong[wordsInKey];
-
- ulong[] kt_round = new ulong[wordsInBlock];
-
- ulong[] tmv = new ulong[wordsInBlock];
-
- int round = 0;
-
- Array.Copy(key, initial_data, wordsInKey);
-
- for (int i = 0; i < wordsInBlock; i++)
- {
- tmv[i] = 0x0001000100010001;
- }
-
- while (true)
- {
- Array.Copy(kt, internalState, wordsInBlock);
-
- AddRoundKeyExpand(tmv);
-
- Array.Copy(internalState, kt_round, wordsInBlock);
- Array.Copy(initial_data, internalState, wordsInBlock);
-
- AddRoundKeyExpand(kt_round);
-
- EncryptionRound();
-
- XorRoundKeyExpand(kt_round);
-
- EncryptionRound();
-
- AddRoundKeyExpand(kt_round);
-
- Array.Copy(internalState, roundKeys[round], wordsInBlock);
-
- if (roundsAmount == round)
- {
- break;
- }
- if (wordsInKey != wordsInBlock)
- {
- round += 2;
-
- ShiftLeft(tmv);
-
- Array.Copy(kt, internalState, wordsInBlock);
-
- AddRoundKeyExpand(tmv);
-
- Array.Copy(internalState, kt_round, wordsInBlock);
- Array.Copy(initial_data, wordsInBlock, internalState, 0, wordsInBlock);
-
- AddRoundKeyExpand(kt_round);
-
- EncryptionRound();
-
- XorRoundKeyExpand(kt_round);
-
- EncryptionRound();
-
- AddRoundKeyExpand(kt_round);
-
- Array.Copy(internalState, roundKeys[round], wordsInBlock);
-
- if (roundsAmount == round)
- {
- break;
- }
- }
-
- round += 2;
- ShiftLeft(tmv);
-
- //Rotate initial data array on 1 element left
- ulong temp = initial_data[0];
- Array.Copy(initial_data, 1, initial_data, 0, initial_data.Length - 1);
- initial_data[initial_data.Length - 1] = temp;
- }
- }
- private void KeyExpandOdd()
- {
- for (int i = 1; i < roundsAmount; i += 2)
- {
- Array.Copy(roundKeys[i - 1], roundKeys[i], wordsInBlock);
- RotateLeft(roundKeys[i]);
- }
- }
- #endregion
-
-
- public virtual int ProcessBlock(byte[] input, int inOff, byte[] output, int outOff)
- {
- if (workingKey == null)
- throw new InvalidOperationException("Dstu7624 engine not initialised");
-
- Check.DataLength(input, inOff, GetBlockSize(), "input buffer too short");
- Check.OutputLength(output, outOff, GetBlockSize(), "output buffer too short");
-
- if (forEncryption)
- {
- Encrypt(input, inOff, output, outOff);
- }
- else
- {
- Decrypt(input, inOff, output, outOff);
- }
-
- return GetBlockSize();
- }
-
- private void Encrypt(byte[] plain, int inOff, byte[] cipherText, int outOff)
- {
- int round = 0;
-
- Array.Copy(plain, inOff, plain, 0, blockSizeBits / BITS_IN_BYTE);
- Array.Resize(ref plain, blockSizeBits / BITS_IN_BYTE);
-
- ulong[] plain_ = BytesToWords(plain);
-
- Array.Copy(plain_, internalState, wordsInBlock);
-
- AddRoundKey(round);
-
- for (round = 1; round < roundsAmount; round++)
- {
- EncryptionRound();
-
- XorRoundKey(round);
-
- }
- EncryptionRound();
-
- AddRoundKey(roundsAmount);
-
- ulong[] cipherText_ = new ulong[internalState.Length];
-
- Array.Copy(internalState, cipherText_, wordsInBlock);
-
- byte[] temp = WordsToBytes(cipherText_);
-
- Array.Copy(temp, 0, cipherText, outOff, temp.Length);
-
- }
- private void Decrypt(byte[] cipherText, int inOff, byte[] decryptedText, int outOff)
- {
- Array.Copy(cipherText, inOff, cipherText, 0, blockSizeBits / BITS_IN_BYTE);
- Array.Resize(ref cipherText, blockSizeBits / BITS_IN_BYTE);
-
- int round = roundsAmount;
-
- ulong[] cipherText_ = BytesToWords(cipherText);
-
- Array.Copy(cipherText_, internalState, wordsInBlock);
-
- SubRoundKey(round);
-
- for (round = roundsAmount - 1; round > 0; round--)
- {
- DecryptionRound();
- XorRoundKey(round);
- }
-
- DecryptionRound();
- SubRoundKey(0);
-
- ulong[] decryptedText_ = new ulong[internalState.Length];
-
- Array.Copy(internalState, decryptedText_, wordsInBlock);
-
-
- byte[] temp = WordsToBytes(decryptedText_);
- Array.Copy(temp, 0, decryptedText, outOff, temp.Length);
-
-
- }
-
-
-
-
-
-
-
-
-
- private void AddRoundKeyExpand(ulong[] value)
- {
- for (int i = 0; i < wordsInBlock; i++)
- {
- internalState[i] += value[i];
- }
- }
-
- private void EncryptionRound()
- {
- SubBytes();
- ShiftRows();
- MixColumns();
- }
-
- private void DecryptionRound()
- {
- InvMixColumns();
- InvShiftRows();
- InvSubBytes();
- }
-
- private void RotateLeft(ulong[] state_value)
- {
- int rotateBytesLength = 2 * state_value.Length + 3;
- int bytesLength = state_value.Length * (BITS_IN_WORD / BITS_IN_BYTE);
-
-
- byte[] bytes = WordsToBytes(state_value);
- byte[] buffer = new byte[rotateBytesLength];
-
- Array.Copy(bytes, buffer, rotateBytesLength);
-
- Buffer.BlockCopy(bytes, rotateBytesLength, bytes, 0, bytesLength - rotateBytesLength);
-
- Array.Copy(buffer, 0, bytes, bytesLength - rotateBytesLength, rotateBytesLength);
-
- var temp = BytesToWords(bytes);
- Array.Copy(temp, state_value, state_value.Length);
- }
-
- private void ShiftLeft(ulong[] state_value)
- {
- for (int i = 0; i < state_value.Length; i++)
- {
- state_value[i] <<= 1;
- }
- Array.Reverse(state_value);
- }
-
- private void XorRoundKeyExpand(ulong[] value)
- {
- for (int i = 0; i < wordsInBlock; i++)
- {
- internalState[i] ^= value[i];
- }
- }
-
- private void XorRoundKey(int round)
- {
- for (int i = 0; i < wordsInBlock; i++)
- {
- internalState[i] ^= roundKeys[round][i];
- }
- }
-
- private void ShiftRows()
- {
- int row, col;
- int shift = -1;
-
- byte[] stateBytes = WordsToBytes(internalState);
-
- byte[] nstate = new byte[wordsInBlock * sizeof(ulong)];
-
- for (row = 0; row < sizeof(ulong); row++)
- {
- if (row % (sizeof(ulong) / wordsInBlock) == 0)
- {
- shift += 1;
- }
-
- for (col = 0; col < wordsInBlock; col++)
- {
- nstate[row + ((col + shift) % wordsInBlock) * sizeof(ulong)] = stateBytes[row + col * sizeof(ulong)];
- }
- }
-
- internalState = BytesToWords(nstate);
-
- }
-
- private void InvShiftRows()
- {
- int row, col;
- int shift = -1;
-
- byte[] stateBytes = WordsToBytes(internalState);
- byte[] nstate = new byte[wordsInBlock * sizeof(ulong)];
-
- for (row = 0; row < sizeof(ulong); row++)
- {
- if (row % (sizeof(ulong) / wordsInBlock) == 0)
- {
- shift += 1;
- }
-
- for (col = 0; col < wordsInBlock; col++)
- {
- nstate[row + col * sizeof(ulong)] = stateBytes[row + ((col + shift) % wordsInBlock) * sizeof(ulong)];
- }
- }
-
- internalState = BytesToWords(nstate);
- }
-
- private ulong[] BytesToWords(byte[] bytes)
- {
- ulong[] words = new ulong[bytes.Length / sizeof(ulong)];
-
- for (int i = 0; i < words.Length; i++)
- {
- words[i] = BitConverter.ToUInt64(bytes, i * sizeof(ulong));
-
- if (!BitConverter.IsLittleEndian)
- {
- words[i] = ReverseWord(words[i]);
- }
- }
-
- return words;
- }
-
- private byte[] WordsToBytes(ulong[] words)
- {
- byte[] bytes = new byte[words.Length * sizeof(ulong)];
-
- byte[] tempBytes = new byte[sizeof(ulong)];
-
- for (int i = 0; i < words.Length; ++i)
- {
- if (!BitConverter.IsLittleEndian)
- {
- words[i] = ReverseWord(words[i]);
- }
-
- tempBytes = BitConverter.GetBytes(words[i]);
- Array.Copy(tempBytes, 0, bytes, i * tempBytes.Length, tempBytes.Length);
- }
- return bytes;
- }
-
- private ulong ReverseWord(ulong x)
- {
- byte[] bytes = BitConverter.GetBytes(x);
- Array.Reverse(bytes);
- return BitConverter.ToUInt64(bytes, 0);
- }
-
- private void AddRoundKey(int round)
- {
- for (int i = 0; i < wordsInBlock; ++i)
- {
- internalState[i] += roundKeys[round][i];
- }
- }
-
- private void SubRoundKey(int round)
- {
- for (int i = 0; i < wordsInBlock; ++i)
- {
- internalState[i] -= roundKeys[round][i];
- }
- }
-
- private void MixColumns()
- {
- MatrixMultiply(mdsMatrix);
- }
-
- private void InvMixColumns()
- {
- MatrixMultiply(mdsInvMatrix);
- }
-
- private void MatrixMultiply(byte[][] matrix)
- {
- int col, row, b;
- byte product;
- ulong result;
- byte[] stateBytes = WordsToBytes(internalState);
-
- for (col = 0; col < wordsInBlock; ++col)
- {
- result = 0;
- for (row = sizeof(ulong) - 1; row >= 0; --row)
- {
- product = 0;
- for (b = sizeof(ulong) - 1; b >= 0; --b)
- {
- product ^= MultiplyGF(stateBytes[b + col * sizeof(ulong)], matrix[row][b]);
- }
- result |= (ulong)product << (row * sizeof(ulong));
- }
- internalState[col] = result;
- }
- }
-
- private byte MultiplyGF(byte x, byte y)
- {
- byte r = 0;
- byte hbit = 0;
-
- for (int i = 0; i < BITS_IN_BYTE; i++)
- {
- if ((y & 0x01) == 1)
- {
- r ^= x;
- }
-
- hbit = (byte)(x & 0x80);
-
- x <<= 1;
-
- if (hbit == 0x80)
- {
- x = (byte)((int)x ^ REDUCTION_POLYNOMIAL);
- }
- y >>= 1;
- }
- return r;
- }
-
- private void SubBytes()
- {
- for (int i = 0; i < wordsInBlock; i++)
- {
- internalState[i] = sboxesForEncryption[0][internalState[i] & 0x00000000000000FF] |
- ((ulong)sboxesForEncryption[1][(internalState[i] & 0x000000000000FF00) >> 8] << 8) |
- ((ulong)sboxesForEncryption[2][(internalState[i] & 0x0000000000FF0000) >> 16] << 16) |
- ((ulong)sboxesForEncryption[3][(internalState[i] & 0x00000000FF000000) >> 24] << 24) |
- ((ulong)sboxesForEncryption[0][(internalState[i] & 0x000000FF00000000) >> 32] << 32) |
- ((ulong)sboxesForEncryption[1][(internalState[i] & 0x0000FF0000000000) >> 40] << 40) |
- ((ulong)sboxesForEncryption[2][(internalState[i] & 0x00FF000000000000) >> 48] << 48) |
- ((ulong)sboxesForEncryption[3][(internalState[i] & 0xFF00000000000000) >> 56] << 56);
- }
- }
-
- private void InvSubBytes()
- {
- for (int i = 0; i < wordsInBlock; i++)
- {
- internalState[i] = sboxesForDecryption[0][internalState[i] & 0x00000000000000FF] |
- ((ulong)sboxesForDecryption[1][(internalState[i] & 0x000000000000FF00) >> 8] << 8) |
- ((ulong)sboxesForDecryption[2][(internalState[i] & 0x0000000000FF0000) >> 16] << 16) |
- ((ulong)sboxesForDecryption[3][(internalState[i] & 0x00000000FF000000) >> 24] << 24) |
- ((ulong)sboxesForDecryption[0][(internalState[i] & 0x000000FF00000000) >> 32] << 32) |
- ((ulong)sboxesForDecryption[1][(internalState[i] & 0x0000FF0000000000) >> 40] << 40) |
- ((ulong)sboxesForDecryption[2][(internalState[i] & 0x00FF000000000000) >> 48] << 48) |
- ((ulong)sboxesForDecryption[3][(internalState[i] & 0xFF00000000000000) >> 56] << 56);
- }
- }
-
-
- #region TABLES AND S-BOXES
-
- private byte[][] mdsMatrix =
- {
- new byte[] { 0x01, 0x01, 0x05, 0x01, 0x08, 0x06, 0x07, 0x04 },
- new byte[] { 0x04, 0x01, 0x01, 0x05, 0x01, 0x08, 0x06, 0x07 },
- new byte[] { 0x07, 0x04, 0x01, 0x01, 0x05, 0x01, 0x08, 0x06 },
- new byte[] { 0x06, 0x07, 0x04, 0x01, 0x01, 0x05, 0x01, 0x08 },
- new byte[] { 0x08, 0x06, 0x07, 0x04, 0x01, 0x01, 0x05, 0x01 },
- new byte[] { 0x01, 0x08, 0x06, 0x07, 0x04, 0x01, 0x01, 0x05 },
- new byte[] { 0x05, 0x01, 0x08, 0x06, 0x07, 0x04, 0x01, 0x01 },
- new byte[] { 0x01, 0x05, 0x01, 0x08, 0x06, 0x07, 0x04, 0x01 },
- };
-
- private byte[][] mdsInvMatrix =
- {
- new byte[] { 0xAD, 0x95, 0x76, 0xA8, 0x2F, 0x49, 0xD7, 0xCA },
- new byte[] { 0xCA, 0xAD, 0x95, 0x76, 0xA8, 0x2F, 0x49, 0xD7 },
- new byte[] { 0xD7, 0xCA, 0xAD, 0x95, 0x76, 0xA8, 0x2F, 0x49 },
- new byte[] { 0x49, 0xD7, 0xCA, 0xAD, 0x95, 0x76, 0xA8, 0x2F },
- new byte[] { 0x2F, 0x49, 0xD7, 0xCA, 0xAD, 0x95, 0x76, 0xA8 },
- new byte[] { 0xA8, 0x2F, 0x49, 0xD7, 0xCA, 0xAD, 0x95, 0x76 },
- new byte[] { 0x76, 0xA8, 0x2F, 0x49, 0xD7, 0xCA, 0xAD, 0x95 },
- new byte[] { 0x95, 0x76, 0xA8, 0x2F, 0x49, 0xD7, 0xCA, 0xAD },
- };
-
-
- private byte[][] sboxesForEncryption =
- {
- new byte[]
- {
- 0xa8, 0x43, 0x5f, 0x06, 0x6b, 0x75, 0x6c, 0x59, 0x71, 0xdf, 0x87, 0x95, 0x17, 0xf0, 0xd8, 0x09,
- 0x6d, 0xf3, 0x1d, 0xcb, 0xc9, 0x4d, 0x2c, 0xaf, 0x79, 0xe0, 0x97, 0xfd, 0x6f, 0x4b, 0x45, 0x39,
- 0x3e, 0xdd, 0xa3, 0x4f, 0xb4, 0xb6, 0x9a, 0x0e, 0x1f, 0xbf, 0x15, 0xe1, 0x49, 0xd2, 0x93, 0xc6,
- 0x92, 0x72, 0x9e, 0x61, 0xd1, 0x63, 0xfa, 0xee, 0xf4, 0x19, 0xd5, 0xad, 0x58, 0xa4, 0xbb, 0xa1,
- 0xdc, 0xf2, 0x83, 0x37, 0x42, 0xe4, 0x7a, 0x32, 0x9c, 0xcc, 0xab, 0x4a, 0x8f, 0x6e, 0x04, 0x27,
- 0x2e, 0xe7, 0xe2, 0x5a, 0x96, 0x16, 0x23, 0x2b, 0xc2, 0x65, 0x66, 0x0f, 0xbc, 0xa9, 0x47, 0x41,
- 0x34, 0x48, 0xfc, 0xb7, 0x6a, 0x88, 0xa5, 0x53, 0x86, 0xf9, 0x5b, 0xdb, 0x38, 0x7b, 0xc3, 0x1e,
- 0x22, 0x33, 0x24, 0x28, 0x36, 0xc7, 0xb2, 0x3b, 0x8e, 0x77, 0xba, 0xf5, 0x14, 0x9f, 0x08, 0x55,
- 0x9b, 0x4c, 0xfe, 0x60, 0x5c, 0xda, 0x18, 0x46, 0xcd, 0x7d, 0x21, 0xb0, 0x3f, 0x1b, 0x89, 0xff,
- 0xeb, 0x84, 0x69, 0x3a, 0x9d, 0xd7, 0xd3, 0x70, 0x67, 0x40, 0xb5, 0xde, 0x5d, 0x30, 0x91, 0xb1,
- 0x78, 0x11, 0x01, 0xe5, 0x00, 0x68, 0x98, 0xa0, 0xc5, 0x02, 0xa6, 0x74, 0x2d, 0x0b, 0xa2, 0x76,
- 0xb3, 0xbe, 0xce, 0xbd, 0xae, 0xe9, 0x8a, 0x31, 0x1c, 0xec, 0xf1, 0x99, 0x94, 0xaa, 0xf6, 0x26,
- 0x2f, 0xef, 0xe8, 0x8c, 0x35, 0x03, 0xd4, 0x7f, 0xfb, 0x05, 0xc1, 0x5e, 0x90, 0x20, 0x3d, 0x82,
- 0xf7, 0xea, 0x0a, 0x0d, 0x7e, 0xf8, 0x50, 0x1a, 0xc4, 0x07, 0x57, 0xb8, 0x3c, 0x62, 0xe3, 0xc8,
- 0xac, 0x52, 0x64, 0x10, 0xd0, 0xd9, 0x13, 0x0c, 0x12, 0x29, 0x51, 0xb9, 0xcf, 0xd6, 0x73, 0x8d,
- 0x81, 0x54, 0xc0, 0xed, 0x4e, 0x44, 0xa7, 0x2a, 0x85, 0x25, 0xe6, 0xca, 0x7c, 0x8b, 0x56, 0x80
- },
-
- new byte[]
- {
- 0xce, 0xbb, 0xeb, 0x92, 0xea, 0xcb, 0x13, 0xc1, 0xe9, 0x3a, 0xd6, 0xb2, 0xd2, 0x90, 0x17, 0xf8,
- 0x42, 0x15, 0x56, 0xb4, 0x65, 0x1c, 0x88, 0x43, 0xc5, 0x5c, 0x36, 0xba, 0xf5, 0x57, 0x67, 0x8d,
- 0x31, 0xf6, 0x64, 0x58, 0x9e, 0xf4, 0x22, 0xaa, 0x75, 0x0f, 0x02, 0xb1, 0xdf, 0x6d, 0x73, 0x4d,
- 0x7c, 0x26, 0x2e, 0xf7, 0x08, 0x5d, 0x44, 0x3e, 0x9f, 0x14, 0xc8, 0xae, 0x54, 0x10, 0xd8, 0xbc,
- 0x1a, 0x6b, 0x69, 0xf3, 0xbd, 0x33, 0xab, 0xfa, 0xd1, 0x9b, 0x68, 0x4e, 0x16, 0x95, 0x91, 0xee,
- 0x4c, 0x63, 0x8e, 0x5b, 0xcc, 0x3c, 0x19, 0xa1, 0x81, 0x49, 0x7b, 0xd9, 0x6f, 0x37, 0x60, 0xca,
- 0xe7, 0x2b, 0x48, 0xfd, 0x96, 0x45, 0xfc, 0x41, 0x12, 0x0d, 0x79, 0xe5, 0x89, 0x8c, 0xe3, 0x20,
- 0x30, 0xdc, 0xb7, 0x6c, 0x4a, 0xb5, 0x3f, 0x97, 0xd4, 0x62, 0x2d, 0x06, 0xa4, 0xa5, 0x83, 0x5f,
- 0x2a, 0xda, 0xc9, 0x00, 0x7e, 0xa2, 0x55, 0xbf, 0x11, 0xd5, 0x9c, 0xcf, 0x0e, 0x0a, 0x3d, 0x51,
- 0x7d, 0x93, 0x1b, 0xfe, 0xc4, 0x47, 0x09, 0x86, 0x0b, 0x8f, 0x9d, 0x6a, 0x07, 0xb9, 0xb0, 0x98,
- 0x18, 0x32, 0x71, 0x4b, 0xef, 0x3b, 0x70, 0xa0, 0xe4, 0x40, 0xff, 0xc3, 0xa9, 0xe6, 0x78, 0xf9,
- 0x8b, 0x46, 0x80, 0x1e, 0x38, 0xe1, 0xb8, 0xa8, 0xe0, 0x0c, 0x23, 0x76, 0x1d, 0x25, 0x24, 0x05,
- 0xf1, 0x6e, 0x94, 0x28, 0x9a, 0x84, 0xe8, 0xa3, 0x4f, 0x77, 0xd3, 0x85, 0xe2, 0x52, 0xf2, 0x82,
- 0x50, 0x7a, 0x2f, 0x74, 0x53, 0xb3, 0x61, 0xaf, 0x39, 0x35, 0xde, 0xcd, 0x1f, 0x99, 0xac, 0xad,
- 0x72, 0x2c, 0xdd, 0xd0, 0x87, 0xbe, 0x5e, 0xa6, 0xec, 0x04, 0xc6, 0x03, 0x34, 0xfb, 0xdb, 0x59,
- 0xb6, 0xc2, 0x01, 0xf0, 0x5a, 0xed, 0xa7, 0x66, 0x21, 0x7f, 0x8a, 0x27, 0xc7, 0xc0, 0x29, 0xd7
- },
-
- new byte[]
- {
- 0x93, 0xd9, 0x9a, 0xb5, 0x98, 0x22, 0x45, 0xfc, 0xba, 0x6a, 0xdf, 0x02, 0x9f, 0xdc, 0x51, 0x59,
- 0x4a, 0x17, 0x2b, 0xc2, 0x94, 0xf4, 0xbb, 0xa3, 0x62, 0xe4, 0x71, 0xd4, 0xcd, 0x70, 0x16, 0xe1,
- 0x49, 0x3c, 0xc0, 0xd8, 0x5c, 0x9b, 0xad, 0x85, 0x53, 0xa1, 0x7a, 0xc8, 0x2d, 0xe0, 0xd1, 0x72,
- 0xa6, 0x2c, 0xc4, 0xe3, 0x76, 0x78, 0xb7, 0xb4, 0x09, 0x3b, 0x0e, 0x41, 0x4c, 0xde, 0xb2, 0x90,
- 0x25, 0xa5, 0xd7, 0x03, 0x11, 0x00, 0xc3, 0x2e, 0x92, 0xef, 0x4e, 0x12, 0x9d, 0x7d, 0xcb, 0x35,
- 0x10, 0xd5, 0x4f, 0x9e, 0x4d, 0xa9, 0x55, 0xc6, 0xd0, 0x7b, 0x18, 0x97, 0xd3, 0x36, 0xe6, 0x48,
- 0x56, 0x81, 0x8f, 0x77, 0xcc, 0x9c, 0xb9, 0xe2, 0xac, 0xb8, 0x2f, 0x15, 0xa4, 0x7c, 0xda, 0x38,
- 0x1e, 0x0b, 0x05, 0xd6, 0x14, 0x6e, 0x6c, 0x7e, 0x66, 0xfd, 0xb1, 0xe5, 0x60, 0xaf, 0x5e, 0x33,
- 0x87, 0xc9, 0xf0, 0x5d, 0x6d, 0x3f, 0x88, 0x8d, 0xc7, 0xf7, 0x1d, 0xe9, 0xec, 0xed, 0x80, 0x29,
- 0x27, 0xcf, 0x99, 0xa8, 0x50, 0x0f, 0x37, 0x24, 0x28, 0x30, 0x95, 0xd2, 0x3e, 0x5b, 0x40, 0x83,
- 0xb3, 0x69, 0x57, 0x1f, 0x07, 0x1c, 0x8a, 0xbc, 0x20, 0xeb, 0xce, 0x8e, 0xab, 0xee, 0x31, 0xa2,
- 0x73, 0xf9, 0xca, 0x3a, 0x1a, 0xfb, 0x0d, 0xc1, 0xfe, 0xfa, 0xf2, 0x6f, 0xbd, 0x96, 0xdd, 0x43,
- 0x52, 0xb6, 0x08, 0xf3, 0xae, 0xbe, 0x19, 0x89, 0x32, 0x26, 0xb0, 0xea, 0x4b, 0x64, 0x84, 0x82,
- 0x6b, 0xf5, 0x79, 0xbf, 0x01, 0x5f, 0x75, 0x63, 0x1b, 0x23, 0x3d, 0x68, 0x2a, 0x65, 0xe8, 0x91,
- 0xf6, 0xff, 0x13, 0x58, 0xf1, 0x47, 0x0a, 0x7f, 0xc5, 0xa7, 0xe7, 0x61, 0x5a, 0x06, 0x46, 0x44,
- 0x42, 0x04, 0xa0, 0xdb, 0x39, 0x86, 0x54, 0xaa, 0x8c, 0x34, 0x21, 0x8b, 0xf8, 0x0c, 0x74, 0x67
- },
-
- new byte[]
- {
- 0x68, 0x8d, 0xca, 0x4d, 0x73, 0x4b, 0x4e, 0x2a, 0xd4, 0x52, 0x26, 0xb3, 0x54, 0x1e, 0x19, 0x1f,
- 0x22, 0x03, 0x46, 0x3d, 0x2d, 0x4a, 0x53, 0x83, 0x13, 0x8a, 0xb7, 0xd5, 0x25, 0x79, 0xf5, 0xbd,
- 0x58, 0x2f, 0x0d, 0x02, 0xed, 0x51, 0x9e, 0x11, 0xf2, 0x3e, 0x55, 0x5e, 0xd1, 0x16, 0x3c, 0x66,
- 0x70, 0x5d, 0xf3, 0x45, 0x40, 0xcc, 0xe8, 0x94, 0x56, 0x08, 0xce, 0x1a, 0x3a, 0xd2, 0xe1, 0xdf,
- 0xb5, 0x38, 0x6e, 0x0e, 0xe5, 0xf4, 0xf9, 0x86, 0xe9, 0x4f, 0xd6, 0x85, 0x23, 0xcf, 0x32, 0x99,
- 0x31, 0x14, 0xae, 0xee, 0xc8, 0x48, 0xd3, 0x30, 0xa1, 0x92, 0x41, 0xb1, 0x18, 0xc4, 0x2c, 0x71,
- 0x72, 0x44, 0x15, 0xfd, 0x37, 0xbe, 0x5f, 0xaa, 0x9b, 0x88, 0xd8, 0xab, 0x89, 0x9c, 0xfa, 0x60,
- 0xea, 0xbc, 0x62, 0x0c, 0x24, 0xa6, 0xa8, 0xec, 0x67, 0x20, 0xdb, 0x7c, 0x28, 0xdd, 0xac, 0x5b,
- 0x34, 0x7e, 0x10, 0xf1, 0x7b, 0x8f, 0x63, 0xa0, 0x05, 0x9a, 0x43, 0x77, 0x21, 0xbf, 0x27, 0x09,
- 0xc3, 0x9f, 0xb6, 0xd7, 0x29, 0xc2, 0xeb, 0xc0, 0xa4, 0x8b, 0x8c, 0x1d, 0xfb, 0xff, 0xc1, 0xb2,
- 0x97, 0x2e, 0xf8, 0x65, 0xf6, 0x75, 0x07, 0x04, 0x49, 0x33, 0xe4, 0xd9, 0xb9, 0xd0, 0x42, 0xc7,
- 0x6c, 0x90, 0x00, 0x8e, 0x6f, 0x50, 0x01, 0xc5, 0xda, 0x47, 0x3f, 0xcd, 0x69, 0xa2, 0xe2, 0x7a,
- 0xa7, 0xc6, 0x93, 0x0f, 0x0a, 0x06, 0xe6, 0x2b, 0x96, 0xa3, 0x1c, 0xaf, 0x6a, 0x12, 0x84, 0x39,
- 0xe7, 0xb0, 0x82, 0xf7, 0xfe, 0x9d, 0x87, 0x5c, 0x81, 0x35, 0xde, 0xb4, 0xa5, 0xfc, 0x80, 0xef,
- 0xcb, 0xbb, 0x6b, 0x76, 0xba, 0x5a, 0x7d, 0x78, 0x0b, 0x95, 0xe3, 0xad, 0x74, 0x98, 0x3b, 0x36,
- 0x64, 0x6d, 0xdc, 0xf0, 0x59, 0xa9, 0x4c, 0x17, 0x7f, 0x91, 0xb8, 0xc9, 0x57, 0x1b, 0xe0, 0x61
- }
-
- };
-
-
- private byte[][] sboxesForDecryption =
- {
- new byte[]
- {
- 0xa4, 0xa2, 0xa9, 0xc5, 0x4e, 0xc9, 0x03, 0xd9, 0x7e, 0x0f, 0xd2, 0xad, 0xe7, 0xd3, 0x27, 0x5b,
- 0xe3, 0xa1, 0xe8, 0xe6, 0x7c, 0x2a, 0x55, 0x0c, 0x86, 0x39, 0xd7, 0x8d, 0xb8, 0x12, 0x6f, 0x28,
- 0xcd, 0x8a, 0x70, 0x56, 0x72, 0xf9, 0xbf, 0x4f, 0x73, 0xe9, 0xf7, 0x57, 0x16, 0xac, 0x50, 0xc0,
- 0x9d, 0xb7, 0x47, 0x71, 0x60, 0xc4, 0x74, 0x43, 0x6c, 0x1f, 0x93, 0x77, 0xdc, 0xce, 0x20, 0x8c,
- 0x99, 0x5f, 0x44, 0x01, 0xf5, 0x1e, 0x87, 0x5e, 0x61, 0x2c, 0x4b, 0x1d, 0x81, 0x15, 0xf4, 0x23,
- 0xd6, 0xea, 0xe1, 0x67, 0xf1, 0x7f, 0xfe, 0xda, 0x3c, 0x07, 0x53, 0x6a, 0x84, 0x9c, 0xcb, 0x02,
- 0x83, 0x33, 0xdd, 0x35, 0xe2, 0x59, 0x5a, 0x98, 0xa5, 0x92, 0x64, 0x04, 0x06, 0x10, 0x4d, 0x1c,
- 0x97, 0x08, 0x31, 0xee, 0xab, 0x05, 0xaf, 0x79, 0xa0, 0x18, 0x46, 0x6d, 0xfc, 0x89, 0xd4, 0xc7,
- 0xff, 0xf0, 0xcf, 0x42, 0x91, 0xf8, 0x68, 0x0a, 0x65, 0x8e, 0xb6, 0xfd, 0xc3, 0xef, 0x78, 0x4c,
- 0xcc, 0x9e, 0x30, 0x2e, 0xbc, 0x0b, 0x54, 0x1a, 0xa6, 0xbb, 0x26, 0x80, 0x48, 0x94, 0x32, 0x7d,
- 0xa7, 0x3f, 0xae, 0x22, 0x3d, 0x66, 0xaa, 0xf6, 0x00, 0x5d, 0xbd, 0x4a, 0xe0, 0x3b, 0xb4, 0x17,
- 0x8b, 0x9f, 0x76, 0xb0, 0x24, 0x9a, 0x25, 0x63, 0xdb, 0xeb, 0x7a, 0x3e, 0x5c, 0xb3, 0xb1, 0x29,
- 0xf2, 0xca, 0x58, 0x6e, 0xd8, 0xa8, 0x2f, 0x75, 0xdf, 0x14, 0xfb, 0x13, 0x49, 0x88, 0xb2, 0xec,
- 0xe4, 0x34, 0x2d, 0x96, 0xc6, 0x3a, 0xed, 0x95, 0x0e, 0xe5, 0x85, 0x6b, 0x40, 0x21, 0x9b, 0x09,
- 0x19, 0x2b, 0x52, 0xde, 0x45, 0xa3, 0xfa, 0x51, 0xc2, 0xb5, 0xd1, 0x90, 0xb9, 0xf3, 0x37, 0xc1,
- 0x0d, 0xba, 0x41, 0x11, 0x38, 0x7b, 0xbe, 0xd0, 0xd5, 0x69, 0x36, 0xc8, 0x62, 0x1b, 0x82, 0x8f
- },
-
- new byte[]
- {
- 0x83, 0xf2, 0x2a, 0xeb, 0xe9, 0xbf, 0x7b, 0x9c, 0x34, 0x96, 0x8d, 0x98, 0xb9, 0x69, 0x8c, 0x29,
- 0x3d, 0x88, 0x68, 0x06, 0x39, 0x11, 0x4c, 0x0e, 0xa0, 0x56, 0x40, 0x92, 0x15, 0xbc, 0xb3, 0xdc,
- 0x6f, 0xf8, 0x26, 0xba, 0xbe, 0xbd, 0x31, 0xfb, 0xc3, 0xfe, 0x80, 0x61, 0xe1, 0x7a, 0x32, 0xd2,
- 0x70, 0x20, 0xa1, 0x45, 0xec, 0xd9, 0x1a, 0x5d, 0xb4, 0xd8, 0x09, 0xa5, 0x55, 0x8e, 0x37, 0x76,
- 0xa9, 0x67, 0x10, 0x17, 0x36, 0x65, 0xb1, 0x95, 0x62, 0x59, 0x74, 0xa3, 0x50, 0x2f, 0x4b, 0xc8,
- 0xd0, 0x8f, 0xcd, 0xd4, 0x3c, 0x86, 0x12, 0x1d, 0x23, 0xef, 0xf4, 0x53, 0x19, 0x35, 0xe6, 0x7f,
- 0x5e, 0xd6, 0x79, 0x51, 0x22, 0x14, 0xf7, 0x1e, 0x4a, 0x42, 0x9b, 0x41, 0x73, 0x2d, 0xc1, 0x5c,
- 0xa6, 0xa2, 0xe0, 0x2e, 0xd3, 0x28, 0xbb, 0xc9, 0xae, 0x6a, 0xd1, 0x5a, 0x30, 0x90, 0x84, 0xf9,
- 0xb2, 0x58, 0xcf, 0x7e, 0xc5, 0xcb, 0x97, 0xe4, 0x16, 0x6c, 0xfa, 0xb0, 0x6d, 0x1f, 0x52, 0x99,
- 0x0d, 0x4e, 0x03, 0x91, 0xc2, 0x4d, 0x64, 0x77, 0x9f, 0xdd, 0xc4, 0x49, 0x8a, 0x9a, 0x24, 0x38,
- 0xa7, 0x57, 0x85, 0xc7, 0x7c, 0x7d, 0xe7, 0xf6, 0xb7, 0xac, 0x27, 0x46, 0xde, 0xdf, 0x3b, 0xd7,
- 0x9e, 0x2b, 0x0b, 0xd5, 0x13, 0x75, 0xf0, 0x72, 0xb6, 0x9d, 0x1b, 0x01, 0x3f, 0x44, 0xe5, 0x87,
- 0xfd, 0x07, 0xf1, 0xab, 0x94, 0x18, 0xea, 0xfc, 0x3a, 0x82, 0x5f, 0x05, 0x54, 0xdb, 0x00, 0x8b,
- 0xe3, 0x48, 0x0c, 0xca, 0x78, 0x89, 0x0a, 0xff, 0x3e, 0x5b, 0x81, 0xee, 0x71, 0xe2, 0xda, 0x2c,
- 0xb8, 0xb5, 0xcc, 0x6e, 0xa8, 0x6b, 0xad, 0x60, 0xc6, 0x08, 0x04, 0x02, 0xe8, 0xf5, 0x4f, 0xa4,
- 0xf3, 0xc0, 0xce, 0x43, 0x25, 0x1c, 0x21, 0x33, 0x0f, 0xaf, 0x47, 0xed, 0x66, 0x63, 0x93, 0xaa
- },
-
- new byte[]
- {
- 0x45, 0xd4, 0x0b, 0x43, 0xf1, 0x72, 0xed, 0xa4, 0xc2, 0x38, 0xe6, 0x71, 0xfd, 0xb6, 0x3a, 0x95,
- 0x50, 0x44, 0x4b, 0xe2, 0x74, 0x6b, 0x1e, 0x11, 0x5a, 0xc6, 0xb4, 0xd8, 0xa5, 0x8a, 0x70, 0xa3,
- 0xa8, 0xfa, 0x05, 0xd9, 0x97, 0x40, 0xc9, 0x90, 0x98, 0x8f, 0xdc, 0x12, 0x31, 0x2c, 0x47, 0x6a,
- 0x99, 0xae, 0xc8, 0x7f, 0xf9, 0x4f, 0x5d, 0x96, 0x6f, 0xf4, 0xb3, 0x39, 0x21, 0xda, 0x9c, 0x85,
- 0x9e, 0x3b, 0xf0, 0xbf, 0xef, 0x06, 0xee, 0xe5, 0x5f, 0x20, 0x10, 0xcc, 0x3c, 0x54, 0x4a, 0x52,
- 0x94, 0x0e, 0xc0, 0x28, 0xf6, 0x56, 0x60, 0xa2, 0xe3, 0x0f, 0xec, 0x9d, 0x24, 0x83, 0x7e, 0xd5,
- 0x7c, 0xeb, 0x18, 0xd7, 0xcd, 0xdd, 0x78, 0xff, 0xdb, 0xa1, 0x09, 0xd0, 0x76, 0x84, 0x75, 0xbb,
- 0x1d, 0x1a, 0x2f, 0xb0, 0xfe, 0xd6, 0x34, 0x63, 0x35, 0xd2, 0x2a, 0x59, 0x6d, 0x4d, 0x77, 0xe7,
- 0x8e, 0x61, 0xcf, 0x9f, 0xce, 0x27, 0xf5, 0x80, 0x86, 0xc7, 0xa6, 0xfb, 0xf8, 0x87, 0xab, 0x62,
- 0x3f, 0xdf, 0x48, 0x00, 0x14, 0x9a, 0xbd, 0x5b, 0x04, 0x92, 0x02, 0x25, 0x65, 0x4c, 0x53, 0x0c,
- 0xf2, 0x29, 0xaf, 0x17, 0x6c, 0x41, 0x30, 0xe9, 0x93, 0x55, 0xf7, 0xac, 0x68, 0x26, 0xc4, 0x7d,
- 0xca, 0x7a, 0x3e, 0xa0, 0x37, 0x03, 0xc1, 0x36, 0x69, 0x66, 0x08, 0x16, 0xa7, 0xbc, 0xc5, 0xd3,
- 0x22, 0xb7, 0x13, 0x46, 0x32, 0xe8, 0x57, 0x88, 0x2b, 0x81, 0xb2, 0x4e, 0x64, 0x1c, 0xaa, 0x91,
- 0x58, 0x2e, 0x9b, 0x5c, 0x1b, 0x51, 0x73, 0x42, 0x23, 0x01, 0x6e, 0xf3, 0x0d, 0xbe, 0x3d, 0x0a,
- 0x2d, 0x1f, 0x67, 0x33, 0x19, 0x7b, 0x5e, 0xea, 0xde, 0x8b, 0xcb, 0xa9, 0x8c, 0x8d, 0xad, 0x49,
- 0x82, 0xe4, 0xba, 0xc3, 0x15, 0xd1, 0xe0, 0x89, 0xfc, 0xb1, 0xb9, 0xb5, 0x07, 0x79, 0xb8, 0xe1
- },
-
- new byte[]
- {
- 0xb2, 0xb6, 0x23, 0x11, 0xa7, 0x88, 0xc5, 0xa6, 0x39, 0x8f, 0xc4, 0xe8, 0x73, 0x22, 0x43, 0xc3,
- 0x82, 0x27, 0xcd, 0x18, 0x51, 0x62, 0x2d, 0xf7, 0x5c, 0x0e, 0x3b, 0xfd, 0xca, 0x9b, 0x0d, 0x0f,
- 0x79, 0x8c, 0x10, 0x4c, 0x74, 0x1c, 0x0a, 0x8e, 0x7c, 0x94, 0x07, 0xc7, 0x5e, 0x14, 0xa1, 0x21,
- 0x57, 0x50, 0x4e, 0xa9, 0x80, 0xd9, 0xef, 0x64, 0x41, 0xcf, 0x3c, 0xee, 0x2e, 0x13, 0x29, 0xba,
- 0x34, 0x5a, 0xae, 0x8a, 0x61, 0x33, 0x12, 0xb9, 0x55, 0xa8, 0x15, 0x05, 0xf6, 0x03, 0x06, 0x49,
- 0xb5, 0x25, 0x09, 0x16, 0x0c, 0x2a, 0x38, 0xfc, 0x20, 0xf4, 0xe5, 0x7f, 0xd7, 0x31, 0x2b, 0x66,
- 0x6f, 0xff, 0x72, 0x86, 0xf0, 0xa3, 0x2f, 0x78, 0x00, 0xbc, 0xcc, 0xe2, 0xb0, 0xf1, 0x42, 0xb4,
- 0x30, 0x5f, 0x60, 0x04, 0xec, 0xa5, 0xe3, 0x8b, 0xe7, 0x1d, 0xbf, 0x84, 0x7b, 0xe6, 0x81, 0xf8,
- 0xde, 0xd8, 0xd2, 0x17, 0xce, 0x4b, 0x47, 0xd6, 0x69, 0x6c, 0x19, 0x99, 0x9a, 0x01, 0xb3, 0x85,
- 0xb1, 0xf9, 0x59, 0xc2, 0x37, 0xe9, 0xc8, 0xa0, 0xed, 0x4f, 0x89, 0x68, 0x6d, 0xd5, 0x26, 0x91,
- 0x87, 0x58, 0xbd, 0xc9, 0x98, 0xdc, 0x75, 0xc0, 0x76, 0xf5, 0x67, 0x6b, 0x7e, 0xeb, 0x52, 0xcb,
- 0xd1, 0x5b, 0x9f, 0x0b, 0xdb, 0x40, 0x92, 0x1a, 0xfa, 0xac, 0xe4, 0xe1, 0x71, 0x1f, 0x65, 0x8d,
- 0x97, 0x9e, 0x95, 0x90, 0x5d, 0xb7, 0xc1, 0xaf, 0x54, 0xfb, 0x02, 0xe0, 0x35, 0xbb, 0x3a, 0x4d,
- 0xad, 0x2c, 0x3d, 0x56, 0x08, 0x1b, 0x4a, 0x93, 0x6a, 0xab, 0xb8, 0x7a, 0xf2, 0x7d, 0xda, 0x3f,
- 0xfe, 0x3e, 0xbe, 0xea, 0xaa, 0x44, 0xc6, 0xd0, 0x36, 0x48, 0x70, 0x96, 0x77, 0x24, 0x53, 0xdf,
- 0xf3, 0x83, 0x28, 0x32, 0x45, 0x1e, 0xa4, 0xd3, 0xa2, 0x46, 0x6e, 0x9c, 0xdd, 0x63, 0xd4, 0x9d
- }
- };
- #endregion
-
-
-
- public virtual string AlgorithmName
- {
- get { return "Dstu7624"; }
- }
-
- public virtual int GetBlockSize()
- {
- return blockSizeBits / BITS_IN_BYTE;
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual void Reset()
- {
-
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/engines/Dstu7624WrapEngine.cs b/BCCrypto/src/crypto/engines/Dstu7624WrapEngine.cs
deleted file mode 100644
index 5d21f6e..0000000
--- a/BCCrypto/src/crypto/engines/Dstu7624WrapEngine.cs
+++ /dev/null
@@ -1,263 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using System.Collections.Generic;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- public class Dstu7624WrapEngine : IWrapper
- {
- private const int BYTES_IN_INTEGER = 4;
-
- private KeyParameter param;
- private Dstu7624Engine engine;
- private bool forWrapping;
- private int blockSize;
-
- private byte[] buffer;
- private byte[] intArray;
-
- private readonly byte[] checkSumArray, zeroArray;
-
-
- public Dstu7624WrapEngine(int blockSizeBits)
- {
- engine = new Dstu7624Engine(blockSizeBits);
- param = null;
-
- blockSize = blockSizeBits / 8;
- buffer = new byte[blockSize];
-
- intArray = new byte[BYTES_IN_INTEGER];
-
- checkSumArray = new byte[blockSize];
- zeroArray = new byte[blockSize];
- }
-
-
- public string AlgorithmName
- {
- get { return "Dstu7624WrapEngine"; }
- }
-
- public void Init(bool forWrapping, ICipherParameters parameters)
- {
- this.forWrapping = forWrapping;
-
- if (parameters is KeyParameter)
- {
- this.param = (KeyParameter)parameters;
-
- engine.Init(forWrapping, param);
- }
- else
- {
- throw new ArgumentException("Bad parameters passed to Dstu7624WrapEngine");
- }
- }
-
- public byte[] Wrap(byte[] input, int inOff, int length)
- {
- if (!forWrapping)
- {
- throw new InvalidOperationException("Not set for wrapping");
- }
-
- if ((input.Length - inOff) % blockSize != 0)
- {
- throw new ArgumentException("Padding not supported");
- }
-
- int n = 2 * (1 + input.Length / blockSize);
-
- int V = (n - 1) * 6;
-
- buffer = new byte[input.Length - inOff + blockSize];
- Array.Copy(input, inOff, buffer, 0, input.Length - inOff);
- //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
-
-
-
- byte[] B = new byte[blockSize / 2];
- Array.Copy(buffer, 0, B, 0, blockSize / 2);
- //Console.WriteLine("B0: "+ Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(B));
-
-
- List bTemp = new List();
-
- int bHalfBlocksLen = buffer.Length - blockSize / 2;
- int bufOff = blockSize / 2;
- while (bHalfBlocksLen != 0)
- {
- byte[] temp = new byte[blockSize / 2];
- Array.Copy(buffer, bufOff, temp, 0, blockSize / 2);
- //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
- //Console.WriteLine(buffer.Length);
- //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(temp));
-
- bTemp.Add(temp);
-
- bHalfBlocksLen -= blockSize / 2;
- bufOff += blockSize / 2;
- }
-
-
-
- for (int j = 0; j < V; j++)
- {
- Array.Copy(B, 0, buffer, 0, blockSize / 2);
- Array.Copy(bTemp[0], 0, buffer, blockSize / 2, blockSize / 2);
-
- engine.ProcessBlock(buffer, 0, buffer, 0);
-
- intTobytes(j + 1, intArray, 0);
- for (int byteNum = 0; byteNum < BYTES_IN_INTEGER; byteNum++)
- {
- buffer[byteNum + blockSize / 2] ^= intArray[byteNum];
- }
-
- Array.Copy(buffer, blockSize / 2, B, 0, blockSize / 2);
-
- for (int i = 2; i < n; i++)
- {
- Array.Copy(bTemp[i - 1], 0, bTemp[i - 2], 0, blockSize / 2);
- }
-
- Array.Copy(buffer, 0, bTemp[n - 2], 0, blockSize / 2);
-
- //Console.WriteLine("B" + j.ToString() + ": " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(B));
- //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[0]));
- //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[1]));
- //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[2]));
-
- //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
- }
-
-
- Array.Copy(B, 0, buffer, 0, blockSize / 2);
- bufOff = blockSize / 2;
-
- for (int i = 0; i < n - 1; i++)
- {
- Array.Copy(bTemp[i], 0, buffer, bufOff, blockSize / 2);
- bufOff += blockSize / 2;
- }
-
- return buffer;
- }
-
- public byte[] Unwrap(byte[] input, int inOff, int length)
- {
- if (forWrapping)
- {
- throw new InvalidOperationException("not set for unwrapping");
- }
-
- if ((input.Length - inOff) % blockSize != 0)
- {
- throw new ArgumentException("Padding not supported");
- }
-
- int n = 2 * input.Length / blockSize;
-
- int V = (n - 1) * 6;
-
- buffer = new byte[input.Length - inOff];
- Array.Copy(input, inOff, buffer, 0, input.Length - inOff);
-
- byte[] B = new byte[blockSize / 2];
- Array.Copy(buffer, 0, B, 0, blockSize / 2);
- //Console.WriteLine("B18: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(B));
-
- List bTemp = new List();
-
- int bHalfBlocksLen = buffer.Length - blockSize / 2;
- int bufOff = blockSize / 2;
- while (bHalfBlocksLen != 0)
- {
- byte[] temp = new byte[blockSize / 2];
- Array.Copy(buffer, bufOff, temp, 0, blockSize / 2);
- //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
- //Console.WriteLine(buffer.Length);
- //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(temp));
-
- bTemp.Add(temp);
-
- bHalfBlocksLen -= blockSize / 2;
- bufOff += blockSize / 2;
- }
-
-
- for (int j = 0; j < V; j++)
- {
- Array.Copy(bTemp[n - 2], 0, buffer, 0, blockSize / 2);
- Array.Copy(B, 0, buffer, blockSize / 2, blockSize / 2);
- intTobytes(V - j, intArray, 0);
- for (int byteNum = 0; byteNum < BYTES_IN_INTEGER; byteNum++)
- {
- buffer[byteNum + blockSize / 2] ^= intArray[byteNum];
- }
-
- //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
-
- engine.ProcessBlock(buffer, 0, buffer, 0);
-
- //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
-
- Array.Copy(buffer, 0, B, 0, blockSize / 2);
-
- for (int i = 2; i < n; i++)
- {
- Array.Copy(bTemp[n - i - 1], 0, bTemp[n - i], 0, blockSize / 2);
- }
-
- Array.Copy(buffer, blockSize / 2, bTemp[0], 0, blockSize / 2);
-
- //Console.WriteLine("B" + (V - j - 1).ToString() + ": " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(B));
- //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[0]));
- //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[1]));
- //Console.WriteLine("b: " + Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(bTemp[2]));
-
- //Console.WriteLine(Org.BouncyCastle.Utilities.Encoders.Hex.ToHexString(buffer));
- }
-
-
- Array.Copy(B, 0, buffer, 0, blockSize / 2);
- bufOff = blockSize / 2;
-
- for (int i = 0; i < n - 1; i++)
- {
- Array.Copy(bTemp[i], 0, buffer, bufOff, blockSize / 2);
- bufOff += blockSize / 2;
- }
-
-
- Array.Copy(buffer, buffer.Length - blockSize, checkSumArray, 0, blockSize);
-
-
- if (!Arrays.AreEqual(checkSumArray, zeroArray))
- {
- throw new InvalidCipherTextException("checksum failed");
- }
- else
- {
- Array.Resize(ref buffer, buffer.Length - blockSize);
- }
-
- return buffer;
- }
-
- //int to array of bytes
- private static void intTobytes(
- int num,
- byte[] outBytes,
- int outOff)
- {
- outBytes[outOff + 3] = (byte)(num >> 24);
- outBytes[outOff + 2] = (byte)(num >> 16);
- outBytes[outOff + 1] = (byte)(num >> 8);
- outBytes[outOff] = (byte)num;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/ElGamalEngine.cs b/BCCrypto/src/crypto/engines/ElGamalEngine.cs
deleted file mode 100644
index 197d7bc..0000000
--- a/BCCrypto/src/crypto/engines/ElGamalEngine.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * this does your basic ElGamal algorithm.
- */
- public class ElGamalEngine
- : IAsymmetricBlockCipher
- {
- private ElGamalKeyParameters key;
- private SecureRandom random;
- private bool forEncryption;
- private int bitSize;
-
- public virtual string AlgorithmName
- {
- get { return "ElGamal"; }
- }
-
- /**
- * initialise the ElGamal engine.
- *
- * @param forEncryption true if we are encrypting, false otherwise.
- * @param param the necessary ElGamal key parameters.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom p = (ParametersWithRandom) parameters;
-
- this.key = (ElGamalKeyParameters) p.Parameters;
- this.random = p.Random;
- }
- else
- {
- this.key = (ElGamalKeyParameters) parameters;
- this.random = new SecureRandom();
- }
-
- this.forEncryption = forEncryption;
- this.bitSize = key.Parameters.P.BitLength;
-
- if (forEncryption)
- {
- if (!(key is ElGamalPublicKeyParameters))
- {
- throw new ArgumentException("ElGamalPublicKeyParameters are required for encryption.");
- }
- }
- else
- {
- if (!(key is ElGamalPrivateKeyParameters))
- {
- throw new ArgumentException("ElGamalPrivateKeyParameters are required for decryption.");
- }
- }
- }
-
- /**
- * Return the maximum size for an input block to this engine.
- * For ElGamal this is always one byte less than the size of P on
- * encryption, and twice the length as the size of P on decryption.
- *
- * @return maximum size for an input block.
- */
- public virtual int GetInputBlockSize()
- {
- if (forEncryption)
- {
- return (bitSize - 1) / 8;
- }
-
- return 2 * ((bitSize + 7) / 8);
- }
-
- /**
- * Return the maximum size for an output block to this engine.
- * For ElGamal this is always one byte less than the size of P on
- * decryption, and twice the length as the size of P on encryption.
- *
- * @return maximum size for an output block.
- */
- public virtual int GetOutputBlockSize()
- {
- if (forEncryption)
- {
- return 2 * ((bitSize + 7) / 8);
- }
-
- return (bitSize - 1) / 8;
- }
-
- /**
- * Process a single block using the basic ElGamal algorithm.
- *
- * @param in the input array.
- * @param inOff the offset into the input buffer where the data starts.
- * @param length the length of the data to be processed.
- * @return the result of the ElGamal process.
- * @exception DataLengthException the input block is too large.
- */
- public virtual byte[] ProcessBlock(
- byte[] input,
- int inOff,
- int length)
- {
- if (key == null)
- throw new InvalidOperationException("ElGamal engine not initialised");
-
- int maxLength = forEncryption
- ? (bitSize - 1 + 7) / 8
- : GetInputBlockSize();
-
- if (length > maxLength)
- throw new DataLengthException("input too large for ElGamal cipher.\n");
-
- BigInteger p = key.Parameters.P;
-
- byte[] output;
- if (key is ElGamalPrivateKeyParameters) // decryption
- {
- int halfLength = length / 2;
- BigInteger gamma = new BigInteger(1, input, inOff, halfLength);
- BigInteger phi = new BigInteger(1, input, inOff + halfLength, halfLength);
-
- ElGamalPrivateKeyParameters priv = (ElGamalPrivateKeyParameters) key;
-
- // a shortcut, which generally relies on p being prime amongst other things.
- // if a problem with this shows up, check the p and g values!
- BigInteger m = gamma.ModPow(p.Subtract(BigInteger.One).Subtract(priv.X), p).Multiply(phi).Mod(p);
-
- output = m.ToByteArrayUnsigned();
- }
- else // encryption
- {
- BigInteger tmp = new BigInteger(1, input, inOff, length);
-
- if (tmp.BitLength >= p.BitLength)
- throw new DataLengthException("input too large for ElGamal cipher.\n");
-
-
- ElGamalPublicKeyParameters pub = (ElGamalPublicKeyParameters) key;
-
- BigInteger pSub2 = p.Subtract(BigInteger.Two);
-
- // TODO In theory, a series of 'k', 'g.ModPow(k, p)' and 'y.ModPow(k, p)' can be pre-calculated
- BigInteger k;
- do
- {
- k = new BigInteger(p.BitLength, random);
- }
- while (k.SignValue == 0 || k.CompareTo(pSub2) > 0);
-
- BigInteger g = key.Parameters.G;
- BigInteger gamma = g.ModPow(k, p);
- BigInteger phi = tmp.Multiply(pub.Y.ModPow(k, p)).Mod(p);
-
- output = new byte[this.GetOutputBlockSize()];
-
- // TODO Add methods to allow writing BigInteger to existing byte array?
- byte[] out1 = gamma.ToByteArrayUnsigned();
- byte[] out2 = phi.ToByteArrayUnsigned();
- out1.CopyTo(output, output.Length / 2 - out1.Length);
- out2.CopyTo(output, output.Length - out2.Length);
- }
-
- return output;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/GOST28147Engine.cs b/BCCrypto/src/crypto/engines/GOST28147Engine.cs
deleted file mode 100644
index 71e6d9e..0000000
--- a/BCCrypto/src/crypto/engines/GOST28147Engine.cs
+++ /dev/null
@@ -1,368 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * implementation of GOST 28147-89
- */
- public class Gost28147Engine
- : IBlockCipher
- {
- private const int BlockSize = 8;
- private int[] workingKey = null;
- private bool forEncryption;
-
- private byte[] S = Sbox_Default;
-
- // these are the S-boxes given in Applied Cryptography 2nd Ed., p. 333
- // This is default S-box!
- private static readonly byte[] Sbox_Default = {
- 0x4,0xA,0x9,0x2,0xD,0x8,0x0,0xE,0x6,0xB,0x1,0xC,0x7,0xF,0x5,0x3,
- 0xE,0xB,0x4,0xC,0x6,0xD,0xF,0xA,0x2,0x3,0x8,0x1,0x0,0x7,0x5,0x9,
- 0x5,0x8,0x1,0xD,0xA,0x3,0x4,0x2,0xE,0xF,0xC,0x7,0x6,0x0,0x9,0xB,
- 0x7,0xD,0xA,0x1,0x0,0x8,0x9,0xF,0xE,0x4,0x6,0xC,0xB,0x2,0x5,0x3,
- 0x6,0xC,0x7,0x1,0x5,0xF,0xD,0x8,0x4,0xA,0x9,0xE,0x0,0x3,0xB,0x2,
- 0x4,0xB,0xA,0x0,0x7,0x2,0x1,0xD,0x3,0x6,0x8,0x5,0x9,0xC,0xF,0xE,
- 0xD,0xB,0x4,0x1,0x3,0xF,0x5,0x9,0x0,0xA,0xE,0x7,0x6,0x8,0x2,0xC,
- 0x1,0xF,0xD,0x0,0x5,0x7,0xA,0x4,0x9,0x2,0x3,0xE,0x6,0xB,0x8,0xC
- };
-
- /*
- * class content S-box parameters for encrypting
- * getting from, see: http://tools.ietf.org/id/draft-popov-cryptopro-cpalgs-01.txt
- * http://tools.ietf.org/id/draft-popov-cryptopro-cpalgs-02.txt
- */
- private static readonly byte[] ESbox_Test = {
- 0x4,0x2,0xF,0x5,0x9,0x1,0x0,0x8,0xE,0x3,0xB,0xC,0xD,0x7,0xA,0x6,
- 0xC,0x9,0xF,0xE,0x8,0x1,0x3,0xA,0x2,0x7,0x4,0xD,0x6,0x0,0xB,0x5,
- 0xD,0x8,0xE,0xC,0x7,0x3,0x9,0xA,0x1,0x5,0x2,0x4,0x6,0xF,0x0,0xB,
- 0xE,0x9,0xB,0x2,0x5,0xF,0x7,0x1,0x0,0xD,0xC,0x6,0xA,0x4,0x3,0x8,
- 0x3,0xE,0x5,0x9,0x6,0x8,0x0,0xD,0xA,0xB,0x7,0xC,0x2,0x1,0xF,0x4,
- 0x8,0xF,0x6,0xB,0x1,0x9,0xC,0x5,0xD,0x3,0x7,0xA,0x0,0xE,0x2,0x4,
- 0x9,0xB,0xC,0x0,0x3,0x6,0x7,0x5,0x4,0x8,0xE,0xF,0x1,0xA,0x2,0xD,
- 0xC,0x6,0x5,0x2,0xB,0x0,0x9,0xD,0x3,0xE,0x7,0xA,0xF,0x4,0x1,0x8
- };
-
- private static readonly byte[] ESbox_A = {
- 0x9,0x6,0x3,0x2,0x8,0xB,0x1,0x7,0xA,0x4,0xE,0xF,0xC,0x0,0xD,0x5,
- 0x3,0x7,0xE,0x9,0x8,0xA,0xF,0x0,0x5,0x2,0x6,0xC,0xB,0x4,0xD,0x1,
- 0xE,0x4,0x6,0x2,0xB,0x3,0xD,0x8,0xC,0xF,0x5,0xA,0x0,0x7,0x1,0x9,
- 0xE,0x7,0xA,0xC,0xD,0x1,0x3,0x9,0x0,0x2,0xB,0x4,0xF,0x8,0x5,0x6,
- 0xB,0x5,0x1,0x9,0x8,0xD,0xF,0x0,0xE,0x4,0x2,0x3,0xC,0x7,0xA,0x6,
- 0x3,0xA,0xD,0xC,0x1,0x2,0x0,0xB,0x7,0x5,0x9,0x4,0x8,0xF,0xE,0x6,
- 0x1,0xD,0x2,0x9,0x7,0xA,0x6,0x0,0x8,0xC,0x4,0x5,0xF,0x3,0xB,0xE,
- 0xB,0xA,0xF,0x5,0x0,0xC,0xE,0x8,0x6,0x2,0x3,0x9,0x1,0x7,0xD,0x4
- };
-
- private static readonly byte[] ESbox_B = {
- 0x8,0x4,0xB,0x1,0x3,0x5,0x0,0x9,0x2,0xE,0xA,0xC,0xD,0x6,0x7,0xF,
- 0x0,0x1,0x2,0xA,0x4,0xD,0x5,0xC,0x9,0x7,0x3,0xF,0xB,0x8,0x6,0xE,
- 0xE,0xC,0x0,0xA,0x9,0x2,0xD,0xB,0x7,0x5,0x8,0xF,0x3,0x6,0x1,0x4,
- 0x7,0x5,0x0,0xD,0xB,0x6,0x1,0x2,0x3,0xA,0xC,0xF,0x4,0xE,0x9,0x8,
- 0x2,0x7,0xC,0xF,0x9,0x5,0xA,0xB,0x1,0x4,0x0,0xD,0x6,0x8,0xE,0x3,
- 0x8,0x3,0x2,0x6,0x4,0xD,0xE,0xB,0xC,0x1,0x7,0xF,0xA,0x0,0x9,0x5,
- 0x5,0x2,0xA,0xB,0x9,0x1,0xC,0x3,0x7,0x4,0xD,0x0,0x6,0xF,0x8,0xE,
- 0x0,0x4,0xB,0xE,0x8,0x3,0x7,0x1,0xA,0x2,0x9,0x6,0xF,0xD,0x5,0xC
- };
-
- private static readonly byte[] ESbox_C = {
- 0x1,0xB,0xC,0x2,0x9,0xD,0x0,0xF,0x4,0x5,0x8,0xE,0xA,0x7,0x6,0x3,
- 0x0,0x1,0x7,0xD,0xB,0x4,0x5,0x2,0x8,0xE,0xF,0xC,0x9,0xA,0x6,0x3,
- 0x8,0x2,0x5,0x0,0x4,0x9,0xF,0xA,0x3,0x7,0xC,0xD,0x6,0xE,0x1,0xB,
- 0x3,0x6,0x0,0x1,0x5,0xD,0xA,0x8,0xB,0x2,0x9,0x7,0xE,0xF,0xC,0x4,
- 0x8,0xD,0xB,0x0,0x4,0x5,0x1,0x2,0x9,0x3,0xC,0xE,0x6,0xF,0xA,0x7,
- 0xC,0x9,0xB,0x1,0x8,0xE,0x2,0x4,0x7,0x3,0x6,0x5,0xA,0x0,0xF,0xD,
- 0xA,0x9,0x6,0x8,0xD,0xE,0x2,0x0,0xF,0x3,0x5,0xB,0x4,0x1,0xC,0x7,
- 0x7,0x4,0x0,0x5,0xA,0x2,0xF,0xE,0xC,0x6,0x1,0xB,0xD,0x9,0x3,0x8
- };
-
- private static readonly byte[] ESbox_D = {
- 0xF,0xC,0x2,0xA,0x6,0x4,0x5,0x0,0x7,0x9,0xE,0xD,0x1,0xB,0x8,0x3,
- 0xB,0x6,0x3,0x4,0xC,0xF,0xE,0x2,0x7,0xD,0x8,0x0,0x5,0xA,0x9,0x1,
- 0x1,0xC,0xB,0x0,0xF,0xE,0x6,0x5,0xA,0xD,0x4,0x8,0x9,0x3,0x7,0x2,
- 0x1,0x5,0xE,0xC,0xA,0x7,0x0,0xD,0x6,0x2,0xB,0x4,0x9,0x3,0xF,0x8,
- 0x0,0xC,0x8,0x9,0xD,0x2,0xA,0xB,0x7,0x3,0x6,0x5,0x4,0xE,0xF,0x1,
- 0x8,0x0,0xF,0x3,0x2,0x5,0xE,0xB,0x1,0xA,0x4,0x7,0xC,0x9,0xD,0x6,
- 0x3,0x0,0x6,0xF,0x1,0xE,0x9,0x2,0xD,0x8,0xC,0x4,0xB,0xA,0x5,0x7,
- 0x1,0xA,0x6,0x8,0xF,0xB,0x0,0x4,0xC,0x3,0x5,0x9,0x7,0xD,0x2,0xE
- };
-
- //S-box for digest
- private static readonly byte[] DSbox_Test = {
- 0x4,0xA,0x9,0x2,0xD,0x8,0x0,0xE,0x6,0xB,0x1,0xC,0x7,0xF,0x5,0x3,
- 0xE,0xB,0x4,0xC,0x6,0xD,0xF,0xA,0x2,0x3,0x8,0x1,0x0,0x7,0x5,0x9,
- 0x5,0x8,0x1,0xD,0xA,0x3,0x4,0x2,0xE,0xF,0xC,0x7,0x6,0x0,0x9,0xB,
- 0x7,0xD,0xA,0x1,0x0,0x8,0x9,0xF,0xE,0x4,0x6,0xC,0xB,0x2,0x5,0x3,
- 0x6,0xC,0x7,0x1,0x5,0xF,0xD,0x8,0x4,0xA,0x9,0xE,0x0,0x3,0xB,0x2,
- 0x4,0xB,0xA,0x0,0x7,0x2,0x1,0xD,0x3,0x6,0x8,0x5,0x9,0xC,0xF,0xE,
- 0xD,0xB,0x4,0x1,0x3,0xF,0x5,0x9,0x0,0xA,0xE,0x7,0x6,0x8,0x2,0xC,
- 0x1,0xF,0xD,0x0,0x5,0x7,0xA,0x4,0x9,0x2,0x3,0xE,0x6,0xB,0x8,0xC
- };
-
- private static readonly byte[] DSbox_A = {
- 0xA,0x4,0x5,0x6,0x8,0x1,0x3,0x7,0xD,0xC,0xE,0x0,0x9,0x2,0xB,0xF,
- 0x5,0xF,0x4,0x0,0x2,0xD,0xB,0x9,0x1,0x7,0x6,0x3,0xC,0xE,0xA,0x8,
- 0x7,0xF,0xC,0xE,0x9,0x4,0x1,0x0,0x3,0xB,0x5,0x2,0x6,0xA,0x8,0xD,
- 0x4,0xA,0x7,0xC,0x0,0xF,0x2,0x8,0xE,0x1,0x6,0x5,0xD,0xB,0x9,0x3,
- 0x7,0x6,0x4,0xB,0x9,0xC,0x2,0xA,0x1,0x8,0x0,0xE,0xF,0xD,0x3,0x5,
- 0x7,0x6,0x2,0x4,0xD,0x9,0xF,0x0,0xA,0x1,0x5,0xB,0x8,0xE,0xC,0x3,
- 0xD,0xE,0x4,0x1,0x7,0x0,0x5,0xA,0x3,0xC,0x8,0xF,0x6,0x2,0x9,0xB,
- 0x1,0x3,0xA,0x9,0x5,0xB,0x4,0xF,0x8,0x6,0x7,0xE,0xD,0x0,0x2,0xC
- };
-
- //
- // pre-defined sbox table
- //
- private static readonly IDictionary sBoxes = Platform.CreateHashtable();
-
- static Gost28147Engine()
- {
- AddSBox("Default", Sbox_Default);
- AddSBox("E-TEST", ESbox_Test);
- AddSBox("E-A", ESbox_A);
- AddSBox("E-B", ESbox_B);
- AddSBox("E-C", ESbox_C);
- AddSBox("E-D", ESbox_D);
- AddSBox("D-TEST", DSbox_Test);
- AddSBox("D-A", DSbox_A);
- }
-
- private static void AddSBox(string sBoxName, byte[] sBox)
- {
- sBoxes.Add(Platform.ToUpperInvariant(sBoxName), sBox);
- }
-
- /**
- * standard constructor.
- */
- public Gost28147Engine()
- {
- }
-
- /**
- * initialise an Gost28147 cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (parameters is ParametersWithSBox)
- {
- ParametersWithSBox param = (ParametersWithSBox)parameters;
-
- //
- // Set the S-Box
- //
- byte[] sBox = param.GetSBox();
- if (sBox.Length != Sbox_Default.Length)
- throw new ArgumentException("invalid S-box passed to GOST28147 init");
-
- this.S = Arrays.Clone(sBox);
-
- //
- // set key if there is one
- //
- if (param.Parameters != null)
- {
- workingKey = generateWorkingKey(forEncryption,
- ((KeyParameter)param.Parameters).GetKey());
- }
- }
- else if (parameters is KeyParameter)
- {
- workingKey = generateWorkingKey(forEncryption,
- ((KeyParameter)parameters).GetKey());
- }
- else if (parameters != null)
- {
- throw new ArgumentException("invalid parameter passed to Gost28147 init - "
- + Platform.GetTypeName(parameters));
- }
- }
-
- public virtual string AlgorithmName
- {
- get { return "Gost28147"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BlockSize;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (workingKey == null)
- throw new InvalidOperationException("Gost28147 engine not initialised");
-
- Check.DataLength(input, inOff, BlockSize, "input buffer too short");
- Check.OutputLength(output, outOff, BlockSize, "output buffer too short");
-
- Gost28147Func(workingKey, input, inOff, output, outOff);
-
- return BlockSize;
- }
-
- public virtual void Reset()
- {
- }
-
- private int[] generateWorkingKey(
- bool forEncryption,
- byte[] userKey)
- {
- this.forEncryption = forEncryption;
-
- if (userKey.Length != 32)
- {
- throw new ArgumentException("Key length invalid. Key needs to be 32 byte - 256 bit!!!");
- }
-
- int[] key = new int[8];
- for(int i=0; i!=8; i++)
- {
- key[i] = bytesToint(userKey,i*4);
- }
-
- return key;
- }
-
- private int Gost28147_mainStep(int n1, int key)
- {
- int cm = (key + n1); // CM1
-
- // S-box replacing
-
- int om = S[ 0 + ((cm >> (0 * 4)) & 0xF)] << (0 * 4);
- om += S[ 16 + ((cm >> (1 * 4)) & 0xF)] << (1 * 4);
- om += S[ 32 + ((cm >> (2 * 4)) & 0xF)] << (2 * 4);
- om += S[ 48 + ((cm >> (3 * 4)) & 0xF)] << (3 * 4);
- om += S[ 64 + ((cm >> (4 * 4)) & 0xF)] << (4 * 4);
- om += S[ 80 + ((cm >> (5 * 4)) & 0xF)] << (5 * 4);
- om += S[ 96 + ((cm >> (6 * 4)) & 0xF)] << (6 * 4);
- om += S[112 + ((cm >> (7 * 4)) & 0xF)] << (7 * 4);
-
-// return om << 11 | om >>> (32-11); // 11-leftshift
- int omLeft = om << 11;
- int omRight = (int)(((uint) om) >> (32 - 11)); // Note: Casts required to get unsigned bit rotation
-
- return omLeft | omRight;
- }
-
- private void Gost28147Func(
- int[] workingKey,
- byte[] inBytes,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- int N1, N2, tmp; //tmp -> for saving N1
- N1 = bytesToint(inBytes, inOff);
- N2 = bytesToint(inBytes, inOff + 4);
-
- if (this.forEncryption)
- {
- for(int k = 0; k < 3; k++) // 1-24 steps
- {
- for(int j = 0; j < 8; j++)
- {
- tmp = N1;
- int step = Gost28147_mainStep(N1, workingKey[j]);
- N1 = N2 ^ step; // CM2
- N2 = tmp;
- }
- }
- for(int j = 7; j > 0; j--) // 25-31 steps
- {
- tmp = N1;
- N1 = N2 ^ Gost28147_mainStep(N1, workingKey[j]); // CM2
- N2 = tmp;
- }
- }
- else //decrypt
- {
- for(int j = 0; j < 8; j++) // 1-8 steps
- {
- tmp = N1;
- N1 = N2 ^ Gost28147_mainStep(N1, workingKey[j]); // CM2
- N2 = tmp;
- }
- for(int k = 0; k < 3; k++) //9-31 steps
- {
- for(int j = 7; j >= 0; j--)
- {
- if ((k == 2) && (j==0))
- {
- break; // break 32 step
- }
- tmp = N1;
- N1 = N2 ^ Gost28147_mainStep(N1, workingKey[j]); // CM2
- N2 = tmp;
- }
- }
- }
-
- N2 = N2 ^ Gost28147_mainStep(N1, workingKey[0]); // 32 step (N1=N1)
-
- intTobytes(N1, outBytes, outOff);
- intTobytes(N2, outBytes, outOff + 4);
- }
-
- //array of bytes to type int
- private static int bytesToint(
- byte[] inBytes,
- int inOff)
- {
- return (int)((inBytes[inOff + 3] << 24) & 0xff000000) + ((inBytes[inOff + 2] << 16) & 0xff0000) +
- ((inBytes[inOff + 1] << 8) & 0xff00) + (inBytes[inOff] & 0xff);
- }
-
- //int to array of bytes
- private static void intTobytes(
- int num,
- byte[] outBytes,
- int outOff)
- {
- outBytes[outOff + 3] = (byte)(num >> 24);
- outBytes[outOff + 2] = (byte)(num >> 16);
- outBytes[outOff + 1] = (byte)(num >> 8);
- outBytes[outOff] = (byte)num;
- }
-
- /**
- * Return the S-Box associated with SBoxName
- * @param sBoxName name of the S-Box
- * @return byte array representing the S-Box
- */
- public static byte[] GetSBox(
- string sBoxName)
- {
- byte[] sBox = (byte[])sBoxes[Platform.ToUpperInvariant(sBoxName)];
-
- if (sBox == null)
- {
- throw new ArgumentException("Unknown S-Box - possible types: "
- + "\"Default\", \"E-Test\", \"E-A\", \"E-B\", \"E-C\", \"E-D\", \"D-Test\", \"D-A\".");
- }
-
- return Arrays.Clone(sBox);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/HC128Engine.cs b/BCCrypto/src/crypto/engines/HC128Engine.cs
deleted file mode 100644
index 5b71865..0000000
--- a/BCCrypto/src/crypto/engines/HC128Engine.cs
+++ /dev/null
@@ -1,235 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * HC-128 is a software-efficient stream cipher created by Hongjun Wu. It
- * generates keystream from a 128-bit secret key and a 128-bit initialization
- * vector.
- *
- * http://www.ecrypt.eu.org/stream/p3ciphers/hc/hc128_p3.pdf
- *
- * It is a third phase candidate in the eStream contest, and is patent-free.
- * No attacks are known as of today (April 2007). See
- *
- * http://www.ecrypt.eu.org/stream/hcp3.html
- *
- */
- public class HC128Engine
- : IStreamCipher
- {
- private uint[] p = new uint[512];
- private uint[] q = new uint[512];
- private uint cnt = 0;
-
- private static uint F1(uint x)
- {
- return RotateRight(x, 7) ^ RotateRight(x, 18) ^ (x >> 3);
- }
-
- private static uint F2(uint x)
- {
- return RotateRight(x, 17) ^ RotateRight(x, 19) ^ (x >> 10);
- }
-
- private uint G1(uint x, uint y, uint z)
- {
- return (RotateRight(x, 10) ^ RotateRight(z, 23)) + RotateRight(y, 8);
- }
-
- private uint G2(uint x, uint y, uint z)
- {
- return (RotateLeft(x, 10) ^ RotateLeft(z, 23)) + RotateLeft(y, 8);
- }
-
- private static uint RotateLeft(uint x, int bits)
- {
- return (x << bits) | (x >> -bits);
- }
-
- private static uint RotateRight(uint x, int bits)
- {
- return (x >> bits) | (x << -bits);
- }
-
- private uint H1(uint x)
- {
- return q[x & 0xFF] + q[((x >> 16) & 0xFF) + 256];
- }
-
- private uint H2(uint x)
- {
- return p[x & 0xFF] + p[((x >> 16) & 0xFF) + 256];
- }
-
- private static uint Mod1024(uint x)
- {
- return x & 0x3FF;
- }
-
- private static uint Mod512(uint x)
- {
- return x & 0x1FF;
- }
-
- private static uint Dim(uint x, uint y)
- {
- return Mod512(x - y);
- }
-
- private uint Step()
- {
- uint j = Mod512(cnt);
- uint ret;
- if (cnt < 512)
- {
- p[j] += G1(p[Dim(j, 3)], p[Dim(j, 10)], p[Dim(j, 511)]);
- ret = H1(p[Dim(j, 12)]) ^ p[j];
- }
- else
- {
- q[j] += G2(q[Dim(j, 3)], q[Dim(j, 10)], q[Dim(j, 511)]);
- ret = H2(q[Dim(j, 12)]) ^ q[j];
- }
- cnt = Mod1024(cnt + 1);
- return ret;
- }
-
- private byte[] key, iv;
- private bool initialised;
-
- private void Init()
- {
- if (key.Length != 16)
- throw new ArgumentException("The key must be 128 bits long");
-
- idx = 0;
- cnt = 0;
-
- uint[] w = new uint[1280];
-
- for (int i = 0; i < 16; i++)
- {
- w[i >> 2] |= ((uint)key[i] << (8 * (i & 0x3)));
- }
- Array.Copy(w, 0, w, 4, 4);
-
- for (int i = 0; i < iv.Length && i < 16; i++)
- {
- w[(i >> 2) + 8] |= ((uint)iv[i] << (8 * (i & 0x3)));
- }
- Array.Copy(w, 8, w, 12, 4);
-
- for (uint i = 16; i < 1280; i++)
- {
- w[i] = F2(w[i - 2]) + w[i - 7] + F1(w[i - 15]) + w[i - 16] + i;
- }
-
- Array.Copy(w, 256, p, 0, 512);
- Array.Copy(w, 768, q, 0, 512);
-
- for (int i = 0; i < 512; i++)
- {
- p[i] = Step();
- }
- for (int i = 0; i < 512; i++)
- {
- q[i] = Step();
- }
-
- cnt = 0;
- }
-
- public virtual string AlgorithmName
- {
- get { return "HC-128"; }
- }
-
- /**
- * Initialise a HC-128 cipher.
- *
- * @param forEncryption whether or not we are for encryption. Irrelevant, as
- * encryption and decryption are the same.
- * @param params the parameters required to set up the cipher.
- * @throws ArgumentException if the params argument is
- * inappropriate (ie. the key is not 128 bit long).
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- ICipherParameters keyParam = parameters;
-
- if (parameters is ParametersWithIV)
- {
- iv = ((ParametersWithIV)parameters).GetIV();
- keyParam = ((ParametersWithIV)parameters).Parameters;
- }
- else
- {
- iv = new byte[0];
- }
-
- if (keyParam is KeyParameter)
- {
- key = ((KeyParameter)keyParam).GetKey();
- Init();
- }
- else
- {
- throw new ArgumentException(
- "Invalid parameter passed to HC128 init - " + Platform.GetTypeName(parameters),
- "parameters");
- }
-
- initialised = true;
- }
-
- private byte[] buf = new byte[4];
- private int idx = 0;
-
- private byte GetByte()
- {
- if (idx == 0)
- {
- Pack.UInt32_To_LE(Step(), buf);
- }
- byte ret = buf[idx];
- idx = idx + 1 & 0x3;
- return ret;
- }
-
- public virtual void ProcessBytes(
- byte[] input,
- int inOff,
- int len,
- byte[] output,
- int outOff)
- {
- if (!initialised)
- throw new InvalidOperationException(AlgorithmName + " not initialised");
-
- Check.DataLength(input, inOff, len, "input buffer too short");
- Check.OutputLength(output, outOff, len, "output buffer too short");
-
- for (int i = 0; i < len; i++)
- {
- output[outOff + i] = (byte)(input[inOff + i] ^ GetByte());
- }
- }
-
- public virtual void Reset()
- {
- Init();
- }
-
- public virtual byte ReturnByte(byte input)
- {
- return (byte)(input ^ GetByte());
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/HC256Engine.cs b/BCCrypto/src/crypto/engines/HC256Engine.cs
deleted file mode 100644
index 84de1ca..0000000
--- a/BCCrypto/src/crypto/engines/HC256Engine.cs
+++ /dev/null
@@ -1,224 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * HC-256 is a software-efficient stream cipher created by Hongjun Wu. It
- * generates keystream from a 256-bit secret key and a 256-bit initialization
- * vector.
- *
- * http://www.ecrypt.eu.org/stream/p3ciphers/hc/hc256_p3.pdf
- *
- * Its brother, HC-128, is a third phase candidate in the eStream contest.
- * The algorithm is patent-free. No attacks are known as of today (April 2007).
- * See
- *
- * http://www.ecrypt.eu.org/stream/hcp3.html
- *
- */
- public class HC256Engine
- : IStreamCipher
- {
- private uint[] p = new uint[1024];
- private uint[] q = new uint[1024];
- private uint cnt = 0;
-
- private uint Step()
- {
- uint j = cnt & 0x3FF;
- uint ret;
- if (cnt < 1024)
- {
- uint x = p[(j - 3 & 0x3FF)];
- uint y = p[(j - 1023 & 0x3FF)];
- p[j] += p[(j - 10 & 0x3FF)]
- + (RotateRight(x, 10) ^ RotateRight(y, 23))
- + q[((x ^ y) & 0x3FF)];
-
- x = p[(j - 12 & 0x3FF)];
- ret = (q[x & 0xFF] + q[((x >> 8) & 0xFF) + 256]
- + q[((x >> 16) & 0xFF) + 512] + q[((x >> 24) & 0xFF) + 768])
- ^ p[j];
- }
- else
- {
- uint x = q[(j - 3 & 0x3FF)];
- uint y = q[(j - 1023 & 0x3FF)];
- q[j] += q[(j - 10 & 0x3FF)]
- + (RotateRight(x, 10) ^ RotateRight(y, 23))
- + p[((x ^ y) & 0x3FF)];
-
- x = q[(j - 12 & 0x3FF)];
- ret = (p[x & 0xFF] + p[((x >> 8) & 0xFF) + 256]
- + p[((x >> 16) & 0xFF) + 512] + p[((x >> 24) & 0xFF) + 768])
- ^ q[j];
- }
- cnt = cnt + 1 & 0x7FF;
- return ret;
- }
-
- private byte[] key, iv;
- private bool initialised;
-
- private void Init()
- {
- if (key.Length != 32 && key.Length != 16)
- throw new ArgumentException("The key must be 128/256 bits long");
-
- if (iv.Length < 16)
- throw new ArgumentException("The IV must be at least 128 bits long");
-
- if (key.Length != 32)
- {
- byte[] k = new byte[32];
-
- Array.Copy(key, 0, k, 0, key.Length);
- Array.Copy(key, 0, k, 16, key.Length);
-
- key = k;
- }
-
- if (iv.Length < 32)
- {
- byte[] newIV = new byte[32];
-
- Array.Copy(iv, 0, newIV, 0, iv.Length);
- Array.Copy(iv, 0, newIV, iv.Length, newIV.Length - iv.Length);
-
- iv = newIV;
- }
-
- idx = 0;
- cnt = 0;
-
- uint[] w = new uint[2560];
-
- for (int i = 0; i < 32; i++)
- {
- w[i >> 2] |= ((uint)key[i] << (8 * (i & 0x3)));
- }
-
- for (int i = 0; i < 32; i++)
- {
- w[(i >> 2) + 8] |= ((uint)iv[i] << (8 * (i & 0x3)));
- }
-
- for (uint i = 16; i < 2560; i++)
- {
- uint x = w[i - 2];
- uint y = w[i - 15];
- w[i] = (RotateRight(x, 17) ^ RotateRight(x, 19) ^ (x >> 10))
- + w[i - 7]
- + (RotateRight(y, 7) ^ RotateRight(y, 18) ^ (y >> 3))
- + w[i - 16] + i;
- }
-
- Array.Copy(w, 512, p, 0, 1024);
- Array.Copy(w, 1536, q, 0, 1024);
-
- for (int i = 0; i < 4096; i++)
- {
- Step();
- }
-
- cnt = 0;
- }
-
- public virtual string AlgorithmName
- {
- get { return "HC-256"; }
- }
-
- /**
- * Initialise a HC-256 cipher.
- *
- * @param forEncryption whether or not we are for encryption. Irrelevant, as
- * encryption and decryption are the same.
- * @param params the parameters required to set up the cipher.
- * @throws ArgumentException if the params argument is
- * inappropriate (ie. the key is not 256 bit long).
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- ICipherParameters keyParam = parameters;
-
- if (parameters is ParametersWithIV)
- {
- iv = ((ParametersWithIV)parameters).GetIV();
- keyParam = ((ParametersWithIV)parameters).Parameters;
- }
- else
- {
- iv = new byte[0];
- }
-
- if (keyParam is KeyParameter)
- {
- key = ((KeyParameter)keyParam).GetKey();
- Init();
- }
- else
- {
- throw new ArgumentException(
- "Invalid parameter passed to HC256 init - " + Platform.GetTypeName(parameters),
- "parameters");
- }
-
- initialised = true;
- }
-
- private byte[] buf = new byte[4];
- private int idx = 0;
-
- private byte GetByte()
- {
- if (idx == 0)
- {
- Pack.UInt32_To_LE(Step(), buf);
- }
- byte ret = buf[idx];
- idx = idx + 1 & 0x3;
- return ret;
- }
-
- public virtual void ProcessBytes(
- byte[] input,
- int inOff,
- int len,
- byte[] output,
- int outOff)
- {
- if (!initialised)
- throw new InvalidOperationException(AlgorithmName + " not initialised");
-
- Check.DataLength(input, inOff, len, "input buffer too short");
- Check.OutputLength(output, outOff, len, "output buffer too short");
-
- for (int i = 0; i < len; i++)
- {
- output[outOff + i] = (byte)(input[inOff + i] ^ GetByte());
- }
- }
-
- public virtual void Reset()
- {
- Init();
- }
-
- public virtual byte ReturnByte(byte input)
- {
- return (byte)(input ^ GetByte());
- }
-
- private static uint RotateRight(uint x, int bits)
- {
- return (x >> bits) | (x << -bits);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/ISAACEngine.cs b/BCCrypto/src/crypto/engines/ISAACEngine.cs
deleted file mode 100644
index 277a27e..0000000
--- a/BCCrypto/src/crypto/engines/ISAACEngine.cs
+++ /dev/null
@@ -1,212 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * Implementation of Bob Jenkin's ISAAC (Indirection Shift Accumulate Add and Count).
- * see: http://www.burtleburtle.net/bob/rand/isaacafa.html
- */
- public class IsaacEngine
- : IStreamCipher
- {
- // Constants
- private static readonly int sizeL = 8,
- stateArraySize = sizeL<<5; // 256
-
- // Cipher's internal state
- private uint[] engineState = null, // mm
- results = null; // randrsl
- private uint a = 0, b = 0, c = 0;
-
- // Engine state
- private int index = 0;
- private byte[] keyStream = new byte[stateArraySize<<2], // results expanded into bytes
- workingKey = null;
- private bool initialised = false;
-
- /**
- * initialise an ISAAC cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param params the parameters required to set up the cipher.
- * @exception ArgumentException if the params argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException(
- "invalid parameter passed to ISAAC Init - " + Platform.GetTypeName(parameters),
- "parameters");
-
- /*
- * ISAAC encryption and decryption is completely
- * symmetrical, so the 'forEncryption' is
- * irrelevant.
- */
- KeyParameter p = (KeyParameter) parameters;
- setKey(p.GetKey());
- }
-
- public virtual byte ReturnByte(
- byte input)
- {
- if (index == 0)
- {
- isaac();
- keyStream = Pack.UInt32_To_BE(results);
- }
-
- byte output = (byte)(keyStream[index]^input);
- index = (index + 1) & 1023;
-
- return output;
- }
-
- public virtual void ProcessBytes(
- byte[] input,
- int inOff,
- int len,
- byte[] output,
- int outOff)
- {
- if (!initialised)
- throw new InvalidOperationException(AlgorithmName + " not initialised");
-
- Check.DataLength(input, inOff, len, "input buffer too short");
- Check.OutputLength(output, outOff, len, "output buffer too short");
-
- for (int i = 0; i < len; i++)
- {
- if (index == 0)
- {
- isaac();
- keyStream = Pack.UInt32_To_BE(results);
- }
- output[i+outOff] = (byte)(keyStream[index]^input[i+inOff]);
- index = (index + 1) & 1023;
- }
- }
-
- public virtual string AlgorithmName
- {
- get { return "ISAAC"; }
- }
-
- public virtual void Reset()
- {
- setKey(workingKey);
- }
-
- // Private implementation
- private void setKey(
- byte[] keyBytes)
- {
- workingKey = keyBytes;
-
- if (engineState == null)
- {
- engineState = new uint[stateArraySize];
- }
-
- if (results == null)
- {
- results = new uint[stateArraySize];
- }
-
- int i, j, k;
-
- // Reset state
- for (i = 0; i < stateArraySize; i++)
- {
- engineState[i] = results[i] = 0;
- }
- a = b = c = 0;
-
- // Reset index counter for output
- index = 0;
-
- // Convert the key bytes to ints and put them into results[] for initialization
- byte[] t = new byte[keyBytes.Length + (keyBytes.Length & 3)];
- Array.Copy(keyBytes, 0, t, 0, keyBytes.Length);
- for (i = 0; i < t.Length; i+=4)
- {
- results[i >> 2] = Pack.LE_To_UInt32(t, i);
- }
-
- // It has begun?
- uint[] abcdefgh = new uint[sizeL];
-
- for (i = 0; i < sizeL; i++)
- {
- abcdefgh[i] = 0x9e3779b9; // Phi (golden ratio)
- }
-
- for (i = 0; i < 4; i++)
- {
- mix(abcdefgh);
- }
-
- for (i = 0; i < 2; i++)
- {
- for (j = 0; j < stateArraySize; j+=sizeL)
- {
- for (k = 0; k < sizeL; k++)
- {
- abcdefgh[k] += (i<1) ? results[j+k] : engineState[j+k];
- }
-
- mix(abcdefgh);
-
- for (k = 0; k < sizeL; k++)
- {
- engineState[j+k] = abcdefgh[k];
- }
- }
- }
-
- isaac();
-
- initialised = true;
- }
-
- private void isaac()
- {
- uint x, y;
-
- b += ++c;
- for (int i = 0; i < stateArraySize; i++)
- {
- x = engineState[i];
- switch (i & 3)
- {
- case 0: a ^= (a << 13); break;
- case 1: a ^= (a >> 6); break;
- case 2: a ^= (a << 2); break;
- case 3: a ^= (a >> 16); break;
- }
- a += engineState[(i+128) & 0xFF];
- engineState[i] = y = engineState[(int)((uint)x >> 2) & 0xFF] + a + b;
- results[i] = b = engineState[(int)((uint)y >> 10) & 0xFF] + x;
- }
- }
-
- private void mix(uint[] x)
- {
- x[0]^=x[1]<< 11; x[3]+=x[0]; x[1]+=x[2];
- x[1]^=x[2]>> 2; x[4]+=x[1]; x[2]+=x[3];
- x[2]^=x[3]<< 8; x[5]+=x[2]; x[3]+=x[4];
- x[3]^=x[4]>> 16; x[6]+=x[3]; x[4]+=x[5];
- x[4]^=x[5]<< 10; x[7]+=x[4]; x[5]+=x[6];
- x[5]^=x[6]>> 4; x[0]+=x[5]; x[6]+=x[7];
- x[6]^=x[7]<< 8; x[1]+=x[6]; x[7]+=x[0];
- x[7]^=x[0]>> 9; x[2]+=x[7]; x[0]+=x[1];
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/IdeaEngine.cs b/BCCrypto/src/crypto/engines/IdeaEngine.cs
deleted file mode 100644
index 18a151c..0000000
--- a/BCCrypto/src/crypto/engines/IdeaEngine.cs
+++ /dev/null
@@ -1,332 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * A class that provides a basic International Data Encryption Algorithm (IDEA) engine.
- *
- * This implementation is based on the "HOWTO: INTERNATIONAL DATA ENCRYPTION ALGORITHM"
- * implementation summary by Fauzan Mirza (F.U.Mirza@sheffield.ac.uk). (baring 1 typo at the
- * end of the mulinv function!).
- *
- *
- * It can be found at ftp://ftp.funet.fi/pub/crypt/cryptography/symmetric/idea/
- *
- *
- * Note 1: This algorithm is patented in the USA, Japan, and Europe including
- * at least Austria, France, Germany, Italy, Netherlands, Spain, Sweden, Switzerland
- * and the United Kingdom. Non-commercial use is free, however any commercial
- * products are liable for royalties. Please see
- * www.mediacrypt.com for
- * further details. This announcement has been included at the request of
- * the patent holders.
- *
- *
- * Note 2: Due to the requests concerning the above, this algorithm is now only
- * included in the extended assembly. It is not included in the default distributions.
- *
- */
- public class IdeaEngine
- : IBlockCipher
- {
- private const int BLOCK_SIZE = 8;
- private int[] workingKey;
- /**
- * standard constructor.
- */
- public IdeaEngine()
- {
- }
- /**
- * initialise an IDEA cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException("invalid parameter passed to IDEA init - " + Platform.GetTypeName(parameters));
-
- workingKey = GenerateWorkingKey(forEncryption,
- ((KeyParameter)parameters).GetKey());
- }
-
- public virtual string AlgorithmName
- {
- get { return "IDEA"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (workingKey == null)
- throw new InvalidOperationException("IDEA engine not initialised");
-
- Check.DataLength(input, inOff, BLOCK_SIZE, "input buffer too short");
- Check.OutputLength(output, outOff, BLOCK_SIZE, "output buffer too short");
-
- IdeaFunc(workingKey, input, inOff, output, outOff);
- return BLOCK_SIZE;
- }
- public virtual void Reset()
- {
- }
- private static readonly int MASK = 0xffff;
- private static readonly int BASE = 0x10001;
- private int BytesToWord(
- byte[] input,
- int inOff)
- {
- return ((input[inOff] << 8) & 0xff00) + (input[inOff + 1] & 0xff);
- }
- private void WordToBytes(
- int word,
- byte[] outBytes,
- int outOff)
- {
- outBytes[outOff] = (byte)((uint) word >> 8);
- outBytes[outOff + 1] = (byte)word;
- }
- /**
- * return x = x * y where the multiplication is done modulo
- * 65537 (0x10001) (as defined in the IDEA specification) and
- * a zero input is taken to be 65536 (0x10000).
- *
- * @param x the x value
- * @param y the y value
- * @return x = x * y
- */
- private int Mul(
- int x,
- int y)
- {
- if (x == 0)
- {
- x = (BASE - y);
- }
- else if (y == 0)
- {
- x = (BASE - x);
- }
- else
- {
- int p = x * y;
- y = p & MASK;
- x = (int) ((uint) p >> 16);
- x = y - x + ((y < x) ? 1 : 0);
- }
- return x & MASK;
- }
- private void IdeaFunc(
- int[] workingKey,
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- int x0, x1, x2, x3, t0, t1;
- int keyOff = 0;
- x0 = BytesToWord(input, inOff);
- x1 = BytesToWord(input, inOff + 2);
- x2 = BytesToWord(input, inOff + 4);
- x3 = BytesToWord(input, inOff + 6);
- for (int round = 0; round < 8; round++)
- {
- x0 = Mul(x0, workingKey[keyOff++]);
- x1 += workingKey[keyOff++];
- x1 &= MASK;
- x2 += workingKey[keyOff++];
- x2 &= MASK;
- x3 = Mul(x3, workingKey[keyOff++]);
- t0 = x1;
- t1 = x2;
- x2 ^= x0;
- x1 ^= x3;
- x2 = Mul(x2, workingKey[keyOff++]);
- x1 += x2;
- x1 &= MASK;
- x1 = Mul(x1, workingKey[keyOff++]);
- x2 += x1;
- x2 &= MASK;
- x0 ^= x1;
- x3 ^= x2;
- x1 ^= t1;
- x2 ^= t0;
- }
- WordToBytes(Mul(x0, workingKey[keyOff++]), outBytes, outOff);
- WordToBytes(x2 + workingKey[keyOff++], outBytes, outOff + 2); /* NB: Order */
- WordToBytes(x1 + workingKey[keyOff++], outBytes, outOff + 4);
- WordToBytes(Mul(x3, workingKey[keyOff]), outBytes, outOff + 6);
- }
- /**
- * The following function is used to expand the user key to the encryption
- * subkey. The first 16 bytes are the user key, and the rest of the subkey
- * is calculated by rotating the previous 16 bytes by 25 bits to the left,
- * and so on until the subkey is completed.
- */
- private int[] ExpandKey(
- byte[] uKey)
- {
- int[] key = new int[52];
- if (uKey.Length < 16)
- {
- byte[] tmp = new byte[16];
- Array.Copy(uKey, 0, tmp, tmp.Length - uKey.Length, uKey.Length);
- uKey = tmp;
- }
- for (int i = 0; i < 8; i++)
- {
- key[i] = BytesToWord(uKey, i * 2);
- }
- for (int i = 8; i < 52; i++)
- {
- if ((i & 7) < 6)
- {
- key[i] = ((key[i - 7] & 127) << 9 | key[i - 6] >> 7) & MASK;
- }
- else if ((i & 7) == 6)
- {
- key[i] = ((key[i - 7] & 127) << 9 | key[i - 14] >> 7) & MASK;
- }
- else
- {
- key[i] = ((key[i - 15] & 127) << 9 | key[i - 14] >> 7) & MASK;
- }
- }
- return key;
- }
- /**
- * This function computes multiplicative inverse using Euclid's Greatest
- * Common Divisor algorithm. Zero and one are self inverse.
- *
- * i.e. x * MulInv(x) == 1 (modulo BASE)
- *
- */
- private int MulInv(
- int x)
- {
- int t0, t1, q, y;
-
- if (x < 2)
- {
- return x;
- }
- t0 = 1;
- t1 = BASE / x;
- y = BASE % x;
- while (y != 1)
- {
- q = x / y;
- x = x % y;
- t0 = (t0 + (t1 * q)) & MASK;
- if (x == 1)
- {
- return t0;
- }
- q = y / x;
- y = y % x;
- t1 = (t1 + (t0 * q)) & MASK;
- }
- return (1 - t1) & MASK;
- }
- /**
- * Return the additive inverse of x.
- *
- * i.e. x + AddInv(x) == 0
- *
- */
- int AddInv(
- int x)
- {
- return (0 - x) & MASK;
- }
-
- /**
- * The function to invert the encryption subkey to the decryption subkey.
- * It also involves the multiplicative inverse and the additive inverse functions.
- */
- private int[] InvertKey(
- int[] inKey)
- {
- int t1, t2, t3, t4;
- int p = 52; /* We work backwards */
- int[] key = new int[52];
- int inOff = 0;
-
- t1 = MulInv(inKey[inOff++]);
- t2 = AddInv(inKey[inOff++]);
- t3 = AddInv(inKey[inOff++]);
- t4 = MulInv(inKey[inOff++]);
- key[--p] = t4;
- key[--p] = t3;
- key[--p] = t2;
- key[--p] = t1;
-
- for (int round = 1; round < 8; round++)
- {
- t1 = inKey[inOff++];
- t2 = inKey[inOff++];
- key[--p] = t2;
- key[--p] = t1;
-
- t1 = MulInv(inKey[inOff++]);
- t2 = AddInv(inKey[inOff++]);
- t3 = AddInv(inKey[inOff++]);
- t4 = MulInv(inKey[inOff++]);
- key[--p] = t4;
- key[--p] = t2; /* NB: Order */
- key[--p] = t3;
- key[--p] = t1;
- }
- t1 = inKey[inOff++];
- t2 = inKey[inOff++];
- key[--p] = t2;
- key[--p] = t1;
-
- t1 = MulInv(inKey[inOff++]);
- t2 = AddInv(inKey[inOff++]);
- t3 = AddInv(inKey[inOff++]);
- t4 = MulInv(inKey[inOff]);
- key[--p] = t4;
- key[--p] = t3;
- key[--p] = t2;
- key[--p] = t1;
- return key;
- }
-
- private int[] GenerateWorkingKey(
- bool forEncryption,
- byte[] userKey)
- {
- if (forEncryption)
- {
- return ExpandKey(userKey);
- }
- else
- {
- return InvertKey(ExpandKey(userKey));
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/IesEngine.cs b/BCCrypto/src/crypto/engines/IesEngine.cs
deleted file mode 100644
index 307cc7a..0000000
--- a/BCCrypto/src/crypto/engines/IesEngine.cs
+++ /dev/null
@@ -1,243 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * support class for constructing intergrated encryption ciphers
- * for doing basic message exchanges on top of key agreement ciphers
- */
- public class IesEngine
- {
- private readonly IBasicAgreement agree;
- private readonly IDerivationFunction kdf;
- private readonly IMac mac;
- private readonly BufferedBlockCipher cipher;
- private readonly byte[] macBuf;
-
- private bool forEncryption;
- private ICipherParameters privParam, pubParam;
- private IesParameters param;
-
- /**
- * set up for use with stream mode, where the key derivation function
- * is used to provide a stream of bytes to xor with the message.
- *
- * @param agree the key agreement used as the basis for the encryption
- * @param kdf the key derivation function used for byte generation
- * @param mac the message authentication code generator for the message
- */
- public IesEngine(
- IBasicAgreement agree,
- IDerivationFunction kdf,
- IMac mac)
- {
- this.agree = agree;
- this.kdf = kdf;
- this.mac = mac;
- this.macBuf = new byte[mac.GetMacSize()];
-// this.cipher = null;
- }
-
- /**
- * set up for use in conjunction with a block cipher to handle the
- * message.
- *
- * @param agree the key agreement used as the basis for the encryption
- * @param kdf the key derivation function used for byte generation
- * @param mac the message authentication code generator for the message
- * @param cipher the cipher to used for encrypting the message
- */
- public IesEngine(
- IBasicAgreement agree,
- IDerivationFunction kdf,
- IMac mac,
- BufferedBlockCipher cipher)
- {
- this.agree = agree;
- this.kdf = kdf;
- this.mac = mac;
- this.macBuf = new byte[mac.GetMacSize()];
- this.cipher = cipher;
- }
-
- /**
- * Initialise the encryptor.
- *
- * @param forEncryption whether or not this is encryption/decryption.
- * @param privParam our private key parameters
- * @param pubParam the recipient's/sender's public key parameters
- * @param param encoding and derivation parameters.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters privParameters,
- ICipherParameters pubParameters,
- ICipherParameters iesParameters)
- {
- this.forEncryption = forEncryption;
- this.privParam = privParameters;
- this.pubParam = pubParameters;
- this.param = (IesParameters)iesParameters;
- }
-
- private byte[] DecryptBlock(
- byte[] in_enc,
- int inOff,
- int inLen,
- byte[] z)
- {
- byte[] M = null;
- KeyParameter macKey = null;
- KdfParameters kParam = new KdfParameters(z, param.GetDerivationV());
- int macKeySize = param.MacKeySize;
-
- kdf.Init(kParam);
-
- // Ensure that the length of the input is greater than the MAC in bytes
- if (inLen < mac.GetMacSize())
- throw new InvalidCipherTextException("Length of input must be greater than the MAC");
-
- inLen -= mac.GetMacSize();
-
- if (cipher == null) // stream mode
- {
- byte[] Buffer = GenerateKdfBytes(kParam, inLen + (macKeySize / 8));
-
- M = new byte[inLen];
-
- for (int i = 0; i != inLen; i++)
- {
- M[i] = (byte)(in_enc[inOff + i] ^ Buffer[i]);
- }
-
- macKey = new KeyParameter(Buffer, inLen, (macKeySize / 8));
- }
- else
- {
- int cipherKeySize = ((IesWithCipherParameters)param).CipherKeySize;
- byte[] Buffer = GenerateKdfBytes(kParam, (cipherKeySize / 8) + (macKeySize / 8));
-
- cipher.Init(false, new KeyParameter(Buffer, 0, (cipherKeySize / 8)));
-
- M = cipher.DoFinal(in_enc, inOff, inLen);
-
- macKey = new KeyParameter(Buffer, (cipherKeySize / 8), (macKeySize / 8));
- }
-
- byte[] macIV = param.GetEncodingV();
-
- mac.Init(macKey);
- mac.BlockUpdate(in_enc, inOff, inLen);
- mac.BlockUpdate(macIV, 0, macIV.Length);
- mac.DoFinal(macBuf, 0);
-
- inOff += inLen;
-
- byte[] T1 = Arrays.CopyOfRange(in_enc, inOff, inOff + macBuf.Length);
-
- if (!Arrays.ConstantTimeAreEqual(T1, macBuf))
- throw (new InvalidCipherTextException("Invalid MAC."));
-
- return M;
- }
-
- private byte[] EncryptBlock(
- byte[] input,
- int inOff,
- int inLen,
- byte[] z)
- {
- byte[] C = null;
- KeyParameter macKey = null;
- KdfParameters kParam = new KdfParameters(z, param.GetDerivationV());
- int c_text_length = 0;
- int macKeySize = param.MacKeySize;
-
- if (cipher == null) // stream mode
- {
- byte[] Buffer = GenerateKdfBytes(kParam, inLen + (macKeySize / 8));
-
- C = new byte[inLen + mac.GetMacSize()];
- c_text_length = inLen;
-
- for (int i = 0; i != inLen; i++)
- {
- C[i] = (byte)(input[inOff + i] ^ Buffer[i]);
- }
-
- macKey = new KeyParameter(Buffer, inLen, (macKeySize / 8));
- }
- else
- {
- int cipherKeySize = ((IesWithCipherParameters)param).CipherKeySize;
- byte[] Buffer = GenerateKdfBytes(kParam, (cipherKeySize / 8) + (macKeySize / 8));
-
- cipher.Init(true, new KeyParameter(Buffer, 0, (cipherKeySize / 8)));
-
- c_text_length = cipher.GetOutputSize(inLen);
- byte[] tmp = new byte[c_text_length];
-
- int len = cipher.ProcessBytes(input, inOff, inLen, tmp, 0);
- len += cipher.DoFinal(tmp, len);
-
- C = new byte[len + mac.GetMacSize()];
- c_text_length = len;
-
- Array.Copy(tmp, 0, C, 0, len);
-
- macKey = new KeyParameter(Buffer, (cipherKeySize / 8), (macKeySize / 8));
- }
-
- byte[] macIV = param.GetEncodingV();
-
- mac.Init(macKey);
- mac.BlockUpdate(C, 0, c_text_length);
- mac.BlockUpdate(macIV, 0, macIV.Length);
- //
- // return the message and it's MAC
- //
- mac.DoFinal(C, c_text_length);
- return C;
- }
-
- private byte[] GenerateKdfBytes(
- KdfParameters kParam,
- int length)
- {
- byte[] buf = new byte[length];
-
- kdf.Init(kParam);
-
- kdf.GenerateBytes(buf, 0, buf.Length);
-
- return buf;
- }
-
- public virtual byte[] ProcessBlock(
- byte[] input,
- int inOff,
- int inLen)
- {
- agree.Init(privParam);
-
- BigInteger z = agree.CalculateAgreement(pubParam);
-
- byte[] zBytes = BigIntegers.AsUnsignedByteArray(agree.GetFieldSize(), z);
-
- try
- {
- return forEncryption
- ? EncryptBlock(input, inOff, inLen, zBytes)
- : DecryptBlock(input, inOff, inLen, zBytes);
- }
- finally
- {
- Array.Clear(zBytes, 0, zBytes.Length);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/NaccacheSternEngine.cs b/BCCrypto/src/crypto/engines/NaccacheSternEngine.cs
deleted file mode 100644
index 64665c1..0000000
--- a/BCCrypto/src/crypto/engines/NaccacheSternEngine.cs
+++ /dev/null
@@ -1,358 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * NaccacheStern Engine. For details on this cipher, please see
- * http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf
- */
- public class NaccacheSternEngine
- : IAsymmetricBlockCipher
- {
- private bool forEncryption;
-
- private NaccacheSternKeyParameters key;
-
- private IList[] lookup = null;
-
- public string AlgorithmName
- {
- get { return "NaccacheStern"; }
- }
-
- /**
- * Initializes this algorithm. Must be called before all other Functions.
- *
- * @see org.bouncycastle.crypto.AsymmetricBlockCipher#init(bool,
- * org.bouncycastle.crypto.CipherParameters)
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- this.forEncryption = forEncryption;
-
- if (parameters is ParametersWithRandom)
- {
- parameters = ((ParametersWithRandom) parameters).Parameters;
- }
-
- key = (NaccacheSternKeyParameters)parameters;
-
- // construct lookup table for faster decryption if necessary
- if (!this.forEncryption)
- {
- NaccacheSternPrivateKeyParameters priv = (NaccacheSternPrivateKeyParameters)key;
- IList primes = priv.SmallPrimesList;
- lookup = new IList[primes.Count];
- for (int i = 0; i < primes.Count; i++)
- {
- BigInteger actualPrime = (BigInteger) primes[i];
- int actualPrimeValue = actualPrime.IntValue;
-
- lookup[i] = Platform.CreateArrayList(actualPrimeValue);
- lookup[i].Add(BigInteger.One);
-
- BigInteger accJ = BigInteger.Zero;
-
- for (int j = 1; j < actualPrimeValue; j++)
- {
-// BigInteger bigJ = BigInteger.ValueOf(j);
-// accJ = priv.PhiN.Multiply(bigJ);
- accJ = accJ.Add(priv.PhiN);
- BigInteger comp = accJ.Divide(actualPrime);
- lookup[i].Add(priv.G.ModPow(comp, priv.Modulus));
- }
- }
- }
- }
-
- [Obsolete("Remove: no longer used")]
- public virtual bool Debug
- {
- set {}
- }
-
- /**
- * Returns the input block size of this algorithm.
- *
- * @see org.bouncycastle.crypto.AsymmetricBlockCipher#GetInputBlockSize()
- */
- public virtual int GetInputBlockSize()
- {
- if (forEncryption)
- {
- // We can only encrypt values up to lowerSigmaBound
- return (key.LowerSigmaBound + 7) / 8 - 1;
- }
- else
- {
- // We pad to modulus-size bytes for easier decryption.
-// return key.Modulus.ToByteArray().Length;
- return key.Modulus.BitLength / 8 + 1;
- }
- }
-
- /**
- * Returns the output block size of this algorithm.
- *
- * @see org.bouncycastle.crypto.AsymmetricBlockCipher#GetOutputBlockSize()
- */
- public virtual int GetOutputBlockSize()
- {
- if (forEncryption)
- {
- // encrypted Data is always padded up to modulus size
-// return key.Modulus.ToByteArray().Length;
- return key.Modulus.BitLength / 8 + 1;
- }
- else
- {
- // decrypted Data has upper limit lowerSigmaBound
- return (key.LowerSigmaBound + 7) / 8 - 1;
- }
- }
-
- /**
- * Process a single Block using the Naccache-Stern algorithm.
- *
- * @see org.bouncycastle.crypto.AsymmetricBlockCipher#ProcessBlock(byte[],
- * int, int)
- */
- public virtual byte[] ProcessBlock(
- byte[] inBytes,
- int inOff,
- int length)
- {
- if (key == null)
- throw new InvalidOperationException("NaccacheStern engine not initialised");
- if (length > (GetInputBlockSize() + 1))
- throw new DataLengthException("input too large for Naccache-Stern cipher.\n");
-
- if (!forEncryption)
- {
- // At decryption make sure that we receive padded data blocks
- if (length < GetInputBlockSize())
- {
- throw new InvalidCipherTextException("BlockLength does not match modulus for Naccache-Stern cipher.\n");
- }
- }
-
- // transform input into BigInteger
- BigInteger input = new BigInteger(1, inBytes, inOff, length);
-
- byte[] output;
- if (forEncryption)
- {
- output = Encrypt(input);
- }
- else
- {
- IList plain = Platform.CreateArrayList();
- NaccacheSternPrivateKeyParameters priv = (NaccacheSternPrivateKeyParameters)key;
- IList primes = priv.SmallPrimesList;
- // Get Chinese Remainders of CipherText
- for (int i = 0; i < primes.Count; i++)
- {
- BigInteger exp = input.ModPow(priv.PhiN.Divide((BigInteger)primes[i]), priv.Modulus);
- IList al = lookup[i];
- if (lookup[i].Count != ((BigInteger)primes[i]).IntValue)
- {
- throw new InvalidCipherTextException("Error in lookup Array for "
- + ((BigInteger)primes[i]).IntValue
- + ": Size mismatch. Expected ArrayList with length "
- + ((BigInteger)primes[i]).IntValue + " but found ArrayList of length "
- + lookup[i].Count);
- }
- int lookedup = al.IndexOf(exp);
-
- if (lookedup == -1)
- {
- throw new InvalidCipherTextException("Lookup failed");
- }
- plain.Add(BigInteger.ValueOf(lookedup));
- }
- BigInteger test = chineseRemainder(plain, primes);
-
- // Should not be used as an oracle, so reencrypt output to see
- // if it corresponds to input
-
- // this breaks probabilisic encryption, so disable it. Anyway, we do
- // use the first n primes for key generation, so it is pretty easy
- // to guess them. But as stated in the paper, this is not a security
- // breach. So we can just work with the correct sigma.
-
- // if ((key.G.ModPow(test, key.Modulus)).Equals(input)) {
- // output = test.ToByteArray();
- // } else {
- // output = null;
- // }
-
- output = test.ToByteArray();
- }
-
- return output;
- }
-
- /**
- * Encrypts a BigInteger aka Plaintext with the public key.
- *
- * @param plain
- * The BigInteger to encrypt
- * @return The byte[] representation of the encrypted BigInteger (i.e.
- * crypted.toByteArray())
- */
- public virtual byte[] Encrypt(
- BigInteger plain)
- {
- // Always return modulus size values 0-padded at the beginning
- // 0-padding at the beginning is correctly parsed by BigInteger :)
-// byte[] output = key.Modulus.ToByteArray();
-// Array.Clear(output, 0, output.Length);
- byte[] output = new byte[key.Modulus.BitLength / 8 + 1];
-
- byte[] tmp = key.G.ModPow(plain, key.Modulus).ToByteArray();
- Array.Copy(tmp, 0, output, output.Length - tmp.Length, tmp.Length);
- return output;
- }
-
- /**
- * Adds the contents of two encrypted blocks mod sigma
- *
- * @param block1
- * the first encrypted block
- * @param block2
- * the second encrypted block
- * @return encrypt((block1 + block2) mod sigma)
- * @throws InvalidCipherTextException
- */
- public virtual byte[] AddCryptedBlocks(
- byte[] block1,
- byte[] block2)
- {
- // check for correct blocksize
- if (forEncryption)
- {
- if ((block1.Length > GetOutputBlockSize())
- || (block2.Length > GetOutputBlockSize()))
- {
- throw new InvalidCipherTextException(
- "BlockLength too large for simple addition.\n");
- }
- }
- else
- {
- if ((block1.Length > GetInputBlockSize())
- || (block2.Length > GetInputBlockSize()))
- {
- throw new InvalidCipherTextException(
- "BlockLength too large for simple addition.\n");
- }
- }
-
- // calculate resulting block
- BigInteger m1Crypt = new BigInteger(1, block1);
- BigInteger m2Crypt = new BigInteger(1, block2);
- BigInteger m1m2Crypt = m1Crypt.Multiply(m2Crypt);
- m1m2Crypt = m1m2Crypt.Mod(key.Modulus);
-
- //byte[] output = key.Modulus.ToByteArray();
- //Array.Clear(output, 0, output.Length);
- byte[] output = new byte[key.Modulus.BitLength / 8 + 1];
-
- byte[] m1m2CryptBytes = m1m2Crypt.ToByteArray();
- Array.Copy(m1m2CryptBytes, 0, output,
- output.Length - m1m2CryptBytes.Length, m1m2CryptBytes.Length);
-
- return output;
- }
-
- /**
- * Convenience Method for data exchange with the cipher.
- *
- * Determines blocksize and splits data to blocksize.
- *
- * @param data the data to be processed
- * @return the data after it went through the NaccacheSternEngine.
- * @throws InvalidCipherTextException
- */
- public virtual byte[] ProcessData(
- byte[] data)
- {
- if (data.Length > GetInputBlockSize())
- {
- int inBlocksize = GetInputBlockSize();
- int outBlocksize = GetOutputBlockSize();
- int datapos = 0;
- int retpos = 0;
- byte[] retval = new byte[(data.Length / inBlocksize + 1) * outBlocksize];
- while (datapos < data.Length)
- {
- byte[] tmp;
- if (datapos + inBlocksize < data.Length)
- {
- tmp = ProcessBlock(data, datapos, inBlocksize);
- datapos += inBlocksize;
- }
- else
- {
- tmp = ProcessBlock(data, datapos, data.Length - datapos);
- datapos += data.Length - datapos;
- }
- if (tmp != null)
- {
- tmp.CopyTo(retval, retpos);
- retpos += tmp.Length;
- }
- else
- {
- throw new InvalidCipherTextException("cipher returned null");
- }
- }
- byte[] ret = new byte[retpos];
- Array.Copy(retval, 0, ret, 0, retpos);
- return ret;
- }
- else
- {
- return ProcessBlock(data, 0, data.Length);
- }
- }
-
- /**
- * Computes the integer x that is expressed through the given primes and the
- * congruences with the chinese remainder theorem (CRT).
- *
- * @param congruences
- * the congruences c_i
- * @param primes
- * the primes p_i
- * @return an integer x for that x % p_i == c_i
- */
- private static BigInteger chineseRemainder(IList congruences, IList primes)
- {
- BigInteger retval = BigInteger.Zero;
- BigInteger all = BigInteger.One;
- for (int i = 0; i < primes.Count; i++)
- {
- all = all.Multiply((BigInteger)primes[i]);
- }
- for (int i = 0; i < primes.Count; i++)
- {
- BigInteger a = (BigInteger)primes[i];
- BigInteger b = all.Divide(a);
- BigInteger b2 = b.ModInverse(a);
- BigInteger tmp = b.Multiply(b2);
- tmp = tmp.Multiply((BigInteger)congruences[i]);
- retval = retval.Add(tmp);
- }
-
- return retval.Mod(all);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/NoekeonEngine.cs b/BCCrypto/src/crypto/engines/NoekeonEngine.cs
deleted file mode 100644
index f64be50..0000000
--- a/BCCrypto/src/crypto/engines/NoekeonEngine.cs
+++ /dev/null
@@ -1,241 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * A Noekeon engine, using direct-key mode.
- */
- public class NoekeonEngine
- : IBlockCipher
- {
- private const int GenericSize = 16; // Block and key size, as well as the amount of rounds.
-
- private static readonly uint[] nullVector =
- {
- 0x00, 0x00, 0x00, 0x00 // Used in decryption
- };
-
- private static readonly uint[] roundConstants =
- {
- 0x80, 0x1b, 0x36, 0x6c,
- 0xd8, 0xab, 0x4d, 0x9a,
- 0x2f, 0x5e, 0xbc, 0x63,
- 0xc6, 0x97, 0x35, 0x6a,
- 0xd4
- };
-
- private uint[] state = new uint[4], // a
- subKeys = new uint[4], // k
- decryptKeys = new uint[4];
-
- private bool _initialised, _forEncryption;
-
- /**
- * Create an instance of the Noekeon encryption algorithm
- * and set some defaults
- */
- public NoekeonEngine()
- {
- _initialised = false;
- }
-
- public virtual string AlgorithmName
- {
- get { return "Noekeon"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return GenericSize;
- }
-
- /**
- * initialise
- *
- * @param forEncryption whether or not we are for encryption.
- * @param params the parameters required to set up the cipher.
- * @exception ArgumentException if the params argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException("Invalid parameters passed to Noekeon init - "
- + Platform.GetTypeName(parameters), "parameters");
-
- _forEncryption = forEncryption;
- _initialised = true;
-
- KeyParameter p = (KeyParameter) parameters;
-
- setKey(p.GetKey());
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (!_initialised)
- throw new InvalidOperationException(AlgorithmName + " not initialised");
-
- Check.DataLength(input, inOff, GenericSize, "input buffer too short");
- Check.OutputLength(output, outOff, GenericSize, "output buffer too short");
-
- return _forEncryption
- ? encryptBlock(input, inOff, output, outOff)
- : decryptBlock(input, inOff, output, outOff);
- }
-
- public virtual void Reset()
- {
- // TODO This should do something in case the encryption is aborted
- }
-
- /**
- * Re-key the cipher.
- *
- * @param key the key to be used
- */
- private void setKey(byte[] key)
- {
- subKeys[0] = Pack.BE_To_UInt32(key, 0);
- subKeys[1] = Pack.BE_To_UInt32(key, 4);
- subKeys[2] = Pack.BE_To_UInt32(key, 8);
- subKeys[3] = Pack.BE_To_UInt32(key, 12);
- }
-
- private int encryptBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- state[0] = Pack.BE_To_UInt32(input, inOff);
- state[1] = Pack.BE_To_UInt32(input, inOff+4);
- state[2] = Pack.BE_To_UInt32(input, inOff+8);
- state[3] = Pack.BE_To_UInt32(input, inOff+12);
-
- int i;
- for (i = 0; i < GenericSize; i++)
- {
- state[0] ^= roundConstants[i];
- theta(state, subKeys);
- pi1(state);
- gamma(state);
- pi2(state);
- }
-
- state[0] ^= roundConstants[i];
- theta(state, subKeys);
-
- Pack.UInt32_To_BE(state[0], output, outOff);
- Pack.UInt32_To_BE(state[1], output, outOff+4);
- Pack.UInt32_To_BE(state[2], output, outOff+8);
- Pack.UInt32_To_BE(state[3], output, outOff+12);
-
- return GenericSize;
- }
-
- private int decryptBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- state[0] = Pack.BE_To_UInt32(input, inOff);
- state[1] = Pack.BE_To_UInt32(input, inOff+4);
- state[2] = Pack.BE_To_UInt32(input, inOff+8);
- state[3] = Pack.BE_To_UInt32(input, inOff+12);
-
- Array.Copy(subKeys, 0, decryptKeys, 0, subKeys.Length);
- theta(decryptKeys, nullVector);
-
- int i;
- for (i = GenericSize; i > 0; i--)
- {
- theta(state, decryptKeys);
- state[0] ^= roundConstants[i];
- pi1(state);
- gamma(state);
- pi2(state);
- }
-
- theta(state, decryptKeys);
- state[0] ^= roundConstants[i];
-
- Pack.UInt32_To_BE(state[0], output, outOff);
- Pack.UInt32_To_BE(state[1], output, outOff+4);
- Pack.UInt32_To_BE(state[2], output, outOff+8);
- Pack.UInt32_To_BE(state[3], output, outOff+12);
-
- return GenericSize;
- }
-
- private void gamma(uint[] a)
- {
- a[1] ^= ~a[3] & ~a[2];
- a[0] ^= a[2] & a[1];
-
- uint tmp = a[3];
- a[3] = a[0];
- a[0] = tmp;
- a[2] ^= a[0]^a[1]^a[3];
-
- a[1] ^= ~a[3] & ~a[2];
- a[0] ^= a[2] & a[1];
- }
-
- private void theta(uint[] a, uint[] k)
- {
- uint tmp;
- tmp = a[0]^a[2];
- tmp ^= rotl(tmp,8)^rotl(tmp,24);
- a[1] ^= tmp;
- a[3] ^= tmp;
-
- for (int i = 0; i < 4; i++)
- {
- a[i] ^= k[i];
- }
-
- tmp = a[1]^a[3];
- tmp ^= rotl(tmp,8)^rotl(tmp,24);
- a[0] ^= tmp;
- a[2] ^= tmp;
- }
-
- private void pi1(uint[] a)
- {
- a[1] = rotl(a[1], 1);
- a[2] = rotl(a[2], 5);
- a[3] = rotl(a[3], 2);
- }
-
- private void pi2(uint[] a)
- {
- a[1] = rotl(a[1], 31);
- a[2] = rotl(a[2], 27);
- a[3] = rotl(a[3], 30);
- }
-
- // Helpers
-
- private uint rotl(uint x, int y)
- {
- return (x << y) | (x >> (32-y));
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/NullEngine.cs b/BCCrypto/src/crypto/engines/NullEngine.cs
deleted file mode 100644
index f883b7c..0000000
--- a/BCCrypto/src/crypto/engines/NullEngine.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * The no-op engine that just copies bytes through, irrespective of whether encrypting and decrypting.
- * Provided for the sake of completeness.
- */
- public class NullEngine
- : IBlockCipher
- {
- private bool initialised;
- private const int BlockSize = 1;
-
- public NullEngine()
- {
- }
-
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- // we don't mind any parameters that may come in
- initialised = true;
- }
-
- public virtual string AlgorithmName
- {
- get { return "Null"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return true; }
- }
-
- public virtual int GetBlockSize()
- {
- return BlockSize;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (!initialised)
- throw new InvalidOperationException("Null engine not initialised");
-
- Check.DataLength(input, inOff, BlockSize, "input buffer too short");
- Check.OutputLength(output, outOff, BlockSize, "output buffer too short");
-
- for (int i = 0; i < BlockSize; ++i)
- {
- output[outOff + i] = input[inOff + i];
- }
-
- return BlockSize;
- }
-
- public virtual void Reset()
- {
- // nothing needs to be done
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RC2Engine.cs b/BCCrypto/src/crypto/engines/RC2Engine.cs
deleted file mode 100644
index 4aca189..0000000
--- a/BCCrypto/src/crypto/engines/RC2Engine.cs
+++ /dev/null
@@ -1,311 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * an implementation of RC2 as described in RFC 2268
- * "A Description of the RC2(r) Encryption Algorithm" R. Rivest.
- */
- public class RC2Engine
- : IBlockCipher
- {
- //
- // the values we use for key expansion (based on the digits of PI)
- //
- private static readonly byte[] piTable =
- {
- (byte)0xd9, (byte)0x78, (byte)0xf9, (byte)0xc4, (byte)0x19, (byte)0xdd, (byte)0xb5, (byte)0xed,
- (byte)0x28, (byte)0xe9, (byte)0xfd, (byte)0x79, (byte)0x4a, (byte)0xa0, (byte)0xd8, (byte)0x9d,
- (byte)0xc6, (byte)0x7e, (byte)0x37, (byte)0x83, (byte)0x2b, (byte)0x76, (byte)0x53, (byte)0x8e,
- (byte)0x62, (byte)0x4c, (byte)0x64, (byte)0x88, (byte)0x44, (byte)0x8b, (byte)0xfb, (byte)0xa2,
- (byte)0x17, (byte)0x9a, (byte)0x59, (byte)0xf5, (byte)0x87, (byte)0xb3, (byte)0x4f, (byte)0x13,
- (byte)0x61, (byte)0x45, (byte)0x6d, (byte)0x8d, (byte)0x9, (byte)0x81, (byte)0x7d, (byte)0x32,
- (byte)0xbd, (byte)0x8f, (byte)0x40, (byte)0xeb, (byte)0x86, (byte)0xb7, (byte)0x7b, (byte)0xb,
- (byte)0xf0, (byte)0x95, (byte)0x21, (byte)0x22, (byte)0x5c, (byte)0x6b, (byte)0x4e, (byte)0x82,
- (byte)0x54, (byte)0xd6, (byte)0x65, (byte)0x93, (byte)0xce, (byte)0x60, (byte)0xb2, (byte)0x1c,
- (byte)0x73, (byte)0x56, (byte)0xc0, (byte)0x14, (byte)0xa7, (byte)0x8c, (byte)0xf1, (byte)0xdc,
- (byte)0x12, (byte)0x75, (byte)0xca, (byte)0x1f, (byte)0x3b, (byte)0xbe, (byte)0xe4, (byte)0xd1,
- (byte)0x42, (byte)0x3d, (byte)0xd4, (byte)0x30, (byte)0xa3, (byte)0x3c, (byte)0xb6, (byte)0x26,
- (byte)0x6f, (byte)0xbf, (byte)0xe, (byte)0xda, (byte)0x46, (byte)0x69, (byte)0x7, (byte)0x57,
- (byte)0x27, (byte)0xf2, (byte)0x1d, (byte)0x9b, (byte)0xbc, (byte)0x94, (byte)0x43, (byte)0x3,
- (byte)0xf8, (byte)0x11, (byte)0xc7, (byte)0xf6, (byte)0x90, (byte)0xef, (byte)0x3e, (byte)0xe7,
- (byte)0x6, (byte)0xc3, (byte)0xd5, (byte)0x2f, (byte)0xc8, (byte)0x66, (byte)0x1e, (byte)0xd7,
- (byte)0x8, (byte)0xe8, (byte)0xea, (byte)0xde, (byte)0x80, (byte)0x52, (byte)0xee, (byte)0xf7,
- (byte)0x84, (byte)0xaa, (byte)0x72, (byte)0xac, (byte)0x35, (byte)0x4d, (byte)0x6a, (byte)0x2a,
- (byte)0x96, (byte)0x1a, (byte)0xd2, (byte)0x71, (byte)0x5a, (byte)0x15, (byte)0x49, (byte)0x74,
- (byte)0x4b, (byte)0x9f, (byte)0xd0, (byte)0x5e, (byte)0x4, (byte)0x18, (byte)0xa4, (byte)0xec,
- (byte)0xc2, (byte)0xe0, (byte)0x41, (byte)0x6e, (byte)0xf, (byte)0x51, (byte)0xcb, (byte)0xcc,
- (byte)0x24, (byte)0x91, (byte)0xaf, (byte)0x50, (byte)0xa1, (byte)0xf4, (byte)0x70, (byte)0x39,
- (byte)0x99, (byte)0x7c, (byte)0x3a, (byte)0x85, (byte)0x23, (byte)0xb8, (byte)0xb4, (byte)0x7a,
- (byte)0xfc, (byte)0x2, (byte)0x36, (byte)0x5b, (byte)0x25, (byte)0x55, (byte)0x97, (byte)0x31,
- (byte)0x2d, (byte)0x5d, (byte)0xfa, (byte)0x98, (byte)0xe3, (byte)0x8a, (byte)0x92, (byte)0xae,
- (byte)0x5, (byte)0xdf, (byte)0x29, (byte)0x10, (byte)0x67, (byte)0x6c, (byte)0xba, (byte)0xc9,
- (byte)0xd3, (byte)0x0, (byte)0xe6, (byte)0xcf, (byte)0xe1, (byte)0x9e, (byte)0xa8, (byte)0x2c,
- (byte)0x63, (byte)0x16, (byte)0x1, (byte)0x3f, (byte)0x58, (byte)0xe2, (byte)0x89, (byte)0xa9,
- (byte)0xd, (byte)0x38, (byte)0x34, (byte)0x1b, (byte)0xab, (byte)0x33, (byte)0xff, (byte)0xb0,
- (byte)0xbb, (byte)0x48, (byte)0xc, (byte)0x5f, (byte)0xb9, (byte)0xb1, (byte)0xcd, (byte)0x2e,
- (byte)0xc5, (byte)0xf3, (byte)0xdb, (byte)0x47, (byte)0xe5, (byte)0xa5, (byte)0x9c, (byte)0x77,
- (byte)0xa, (byte)0xa6, (byte)0x20, (byte)0x68, (byte)0xfe, (byte)0x7f, (byte)0xc1, (byte)0xad
- };
-
- private const int BLOCK_SIZE = 8;
-
- private int[] workingKey;
- private bool encrypting;
-
- private int[] GenerateWorkingKey(
- byte[] key,
- int bits)
- {
- int x;
- int[] xKey = new int[128];
-
- for (int i = 0; i != key.Length; i++)
- {
- xKey[i] = key[i] & 0xff;
- }
-
- // Phase 1: Expand input key to 128 bytes
- int len = key.Length;
-
- if (len < 128)
- {
- int index = 0;
-
- x = xKey[len - 1];
-
- do
- {
- x = piTable[(x + xKey[index++]) & 255] & 0xff;
- xKey[len++] = x;
- }
- while (len < 128);
- }
-
- // Phase 2 - reduce effective key size to "bits"
- len = (bits + 7) >> 3;
- x = piTable[xKey[128 - len] & (255 >> (7 & -bits))] & 0xff;
- xKey[128 - len] = x;
-
- for (int i = 128 - len - 1; i >= 0; i--)
- {
- x = piTable[x ^ xKey[i + len]] & 0xff;
- xKey[i] = x;
- }
-
- // Phase 3 - copy to newKey in little-endian order
- int[] newKey = new int[64];
-
- for (int i = 0; i != newKey.Length; i++)
- {
- newKey[i] = (xKey[2 * i] + (xKey[2 * i + 1] << 8));
- }
-
- return newKey;
- }
-
- /**
- * initialise a RC2 cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- this.encrypting = forEncryption;
-
- if (parameters is RC2Parameters)
- {
- RC2Parameters param = (RC2Parameters) parameters;
-
- workingKey = GenerateWorkingKey(param.GetKey(), param.EffectiveKeyBits);
- }
- else if (parameters is KeyParameter)
- {
- KeyParameter param = (KeyParameter) parameters;
- byte[] key = param.GetKey();
-
- workingKey = GenerateWorkingKey(key, key.Length * 8);
- }
- else
- {
- throw new ArgumentException("invalid parameter passed to RC2 init - " + Platform.GetTypeName(parameters));
- }
- }
-
- public virtual void Reset()
- {
- }
-
- public virtual string AlgorithmName
- {
- get { return "RC2"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (workingKey == null)
- throw new InvalidOperationException("RC2 engine not initialised");
-
- Check.DataLength(input, inOff, BLOCK_SIZE, "input buffer too short");
- Check.OutputLength(output, outOff, BLOCK_SIZE, "output buffer too short");
-
- if (encrypting)
- {
- EncryptBlock(input, inOff, output, outOff);
- }
- else
- {
- DecryptBlock(input, inOff, output, outOff);
- }
-
- return BLOCK_SIZE;
- }
-
- /**
- * return the result rotating the 16 bit number in x left by y
- */
- private int RotateWordLeft(
- int x,
- int y)
- {
- x &= 0xffff;
- return (x << y) | (x >> (16 - y));
- }
-
- private void EncryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- int x76, x54, x32, x10;
-
- x76 = ((input[inOff + 7] & 0xff) << 8) + (input[inOff + 6] & 0xff);
- x54 = ((input[inOff + 5] & 0xff) << 8) + (input[inOff + 4] & 0xff);
- x32 = ((input[inOff + 3] & 0xff) << 8) + (input[inOff + 2] & 0xff);
- x10 = ((input[inOff + 1] & 0xff) << 8) + (input[inOff + 0] & 0xff);
-
- for (int i = 0; i <= 16; i += 4)
- {
- x10 = RotateWordLeft(x10 + (x32 & ~x76) + (x54 & x76) + workingKey[i ], 1);
- x32 = RotateWordLeft(x32 + (x54 & ~x10) + (x76 & x10) + workingKey[i+1], 2);
- x54 = RotateWordLeft(x54 + (x76 & ~x32) + (x10 & x32) + workingKey[i+2], 3);
- x76 = RotateWordLeft(x76 + (x10 & ~x54) + (x32 & x54) + workingKey[i+3], 5);
- }
-
- x10 += workingKey[x76 & 63];
- x32 += workingKey[x10 & 63];
- x54 += workingKey[x32 & 63];
- x76 += workingKey[x54 & 63];
-
- for (int i = 20; i <= 40; i += 4)
- {
- x10 = RotateWordLeft(x10 + (x32 & ~x76) + (x54 & x76) + workingKey[i ], 1);
- x32 = RotateWordLeft(x32 + (x54 & ~x10) + (x76 & x10) + workingKey[i+1], 2);
- x54 = RotateWordLeft(x54 + (x76 & ~x32) + (x10 & x32) + workingKey[i+2], 3);
- x76 = RotateWordLeft(x76 + (x10 & ~x54) + (x32 & x54) + workingKey[i+3], 5);
- }
-
- x10 += workingKey[x76 & 63];
- x32 += workingKey[x10 & 63];
- x54 += workingKey[x32 & 63];
- x76 += workingKey[x54 & 63];
-
- for (int i = 44; i < 64; i += 4)
- {
- x10 = RotateWordLeft(x10 + (x32 & ~x76) + (x54 & x76) + workingKey[i ], 1);
- x32 = RotateWordLeft(x32 + (x54 & ~x10) + (x76 & x10) + workingKey[i+1], 2);
- x54 = RotateWordLeft(x54 + (x76 & ~x32) + (x10 & x32) + workingKey[i+2], 3);
- x76 = RotateWordLeft(x76 + (x10 & ~x54) + (x32 & x54) + workingKey[i+3], 5);
- }
-
- outBytes[outOff + 0] = (byte)x10;
- outBytes[outOff + 1] = (byte)(x10 >> 8);
- outBytes[outOff + 2] = (byte)x32;
- outBytes[outOff + 3] = (byte)(x32 >> 8);
- outBytes[outOff + 4] = (byte)x54;
- outBytes[outOff + 5] = (byte)(x54 >> 8);
- outBytes[outOff + 6] = (byte)x76;
- outBytes[outOff + 7] = (byte)(x76 >> 8);
- }
-
- private void DecryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- int x76, x54, x32, x10;
-
- x76 = ((input[inOff + 7] & 0xff) << 8) + (input[inOff + 6] & 0xff);
- x54 = ((input[inOff + 5] & 0xff) << 8) + (input[inOff + 4] & 0xff);
- x32 = ((input[inOff + 3] & 0xff) << 8) + (input[inOff + 2] & 0xff);
- x10 = ((input[inOff + 1] & 0xff) << 8) + (input[inOff + 0] & 0xff);
-
- for (int i = 60; i >= 44; i -= 4)
- {
- x76 = RotateWordLeft(x76, 11) - ((x10 & ~x54) + (x32 & x54) + workingKey[i+3]);
- x54 = RotateWordLeft(x54, 13) - ((x76 & ~x32) + (x10 & x32) + workingKey[i+2]);
- x32 = RotateWordLeft(x32, 14) - ((x54 & ~x10) + (x76 & x10) + workingKey[i+1]);
- x10 = RotateWordLeft(x10, 15) - ((x32 & ~x76) + (x54 & x76) + workingKey[i ]);
- }
-
- x76 -= workingKey[x54 & 63];
- x54 -= workingKey[x32 & 63];
- x32 -= workingKey[x10 & 63];
- x10 -= workingKey[x76 & 63];
-
- for (int i = 40; i >= 20; i -= 4)
- {
- x76 = RotateWordLeft(x76, 11) - ((x10 & ~x54) + (x32 & x54) + workingKey[i+3]);
- x54 = RotateWordLeft(x54, 13) - ((x76 & ~x32) + (x10 & x32) + workingKey[i+2]);
- x32 = RotateWordLeft(x32, 14) - ((x54 & ~x10) + (x76 & x10) + workingKey[i+1]);
- x10 = RotateWordLeft(x10, 15) - ((x32 & ~x76) + (x54 & x76) + workingKey[i ]);
- }
-
- x76 -= workingKey[x54 & 63];
- x54 -= workingKey[x32 & 63];
- x32 -= workingKey[x10 & 63];
- x10 -= workingKey[x76 & 63];
-
- for (int i = 16; i >= 0; i -= 4)
- {
- x76 = RotateWordLeft(x76, 11) - ((x10 & ~x54) + (x32 & x54) + workingKey[i+3]);
- x54 = RotateWordLeft(x54, 13) - ((x76 & ~x32) + (x10 & x32) + workingKey[i+2]);
- x32 = RotateWordLeft(x32, 14) - ((x54 & ~x10) + (x76 & x10) + workingKey[i+1]);
- x10 = RotateWordLeft(x10, 15) - ((x32 & ~x76) + (x54 & x76) + workingKey[i ]);
- }
-
- outBytes[outOff + 0] = (byte)x10;
- outBytes[outOff + 1] = (byte)(x10 >> 8);
- outBytes[outOff + 2] = (byte)x32;
- outBytes[outOff + 3] = (byte)(x32 >> 8);
- outBytes[outOff + 4] = (byte)x54;
- outBytes[outOff + 5] = (byte)(x54 >> 8);
- outBytes[outOff + 6] = (byte)x76;
- outBytes[outOff + 7] = (byte)(x76 >> 8);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RC2WrapEngine.cs b/BCCrypto/src/crypto/engines/RC2WrapEngine.cs
deleted file mode 100644
index 5742aa8..0000000
--- a/BCCrypto/src/crypto/engines/RC2WrapEngine.cs
+++ /dev/null
@@ -1,370 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * Wrap keys according to RFC 3217 - RC2 mechanism
- */
- public class RC2WrapEngine
- : IWrapper
- {
- /** Field engine */
- private CbcBlockCipher engine;
-
- /** Field param */
- private ICipherParameters parameters;
-
- /** Field paramPlusIV */
- private ParametersWithIV paramPlusIV;
-
- /** Field iv */
- private byte[] iv;
-
- /** Field forWrapping */
- private bool forWrapping;
-
- private SecureRandom sr;
-
- /** Field IV2 */
- private static readonly byte[] IV2 =
- {
- (byte) 0x4a, (byte) 0xdd, (byte) 0xa2,
- (byte) 0x2c, (byte) 0x79, (byte) 0xe8,
- (byte) 0x21, (byte) 0x05
- };
-
- //
- // checksum digest
- //
- IDigest sha1 = new Sha1Digest();
- byte[] digest = new byte[20];
-
- /**
- * Method init
- *
- * @param forWrapping
- * @param param
- */
- public virtual void Init(
- bool forWrapping,
- ICipherParameters parameters)
- {
- this.forWrapping = forWrapping;
- this.engine = new CbcBlockCipher(new RC2Engine());
-
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom pWithR = (ParametersWithRandom)parameters;
- sr = pWithR.Random;
- parameters = pWithR.Parameters;
- }
- else
- {
- sr = new SecureRandom();
- }
-
- if (parameters is ParametersWithIV)
- {
- if (!forWrapping)
- throw new ArgumentException("You should not supply an IV for unwrapping");
-
- this.paramPlusIV = (ParametersWithIV)parameters;
- this.iv = this.paramPlusIV.GetIV();
- this.parameters = this.paramPlusIV.Parameters;
-
- if (this.iv.Length != 8)
- throw new ArgumentException("IV is not 8 octets");
- }
- else
- {
- this.parameters = parameters;
-
- if (this.forWrapping)
- {
- // Hm, we have no IV but we want to wrap ?!?
- // well, then we have to create our own IV.
- this.iv = new byte[8];
- sr.NextBytes(iv);
- this.paramPlusIV = new ParametersWithIV(this.parameters, this.iv);
- }
- }
- }
-
- /**
- * Method GetAlgorithmName
- *
- * @return
- */
- public virtual string AlgorithmName
- {
- get { return "RC2"; }
- }
-
- /**
- * Method wrap
- *
- * @param in
- * @param inOff
- * @param inLen
- * @return
- */
- public virtual byte[] Wrap(
- byte[] input,
- int inOff,
- int length)
- {
- if (!forWrapping)
- {
- throw new InvalidOperationException("Not initialized for wrapping");
- }
-
- int len = length + 1;
- if ((len % 8) != 0)
- {
- len += 8 - (len % 8);
- }
-
- byte [] keyToBeWrapped = new byte[len];
-
- keyToBeWrapped[0] = (byte)length;
- Array.Copy(input, inOff, keyToBeWrapped, 1, length);
-
- byte[] pad = new byte[keyToBeWrapped.Length - length - 1];
-
- if (pad.Length > 0)
- {
- sr.NextBytes(pad);
- Array.Copy(pad, 0, keyToBeWrapped, length + 1, pad.Length);
- }
-
- // Compute the CMS Key Checksum, (section 5.6.1), call this CKS.
- byte[] CKS = CalculateCmsKeyChecksum(keyToBeWrapped);
-
- // Let WKCKS = WK || CKS where || is concatenation.
- byte[] WKCKS = new byte[keyToBeWrapped.Length + CKS.Length];
-
- Array.Copy(keyToBeWrapped, 0, WKCKS, 0, keyToBeWrapped.Length);
- Array.Copy(CKS, 0, WKCKS, keyToBeWrapped.Length, CKS.Length);
-
- // Encrypt WKCKS in CBC mode using KEK as the key and IV as the
- // initialization vector. Call the results TEMP1.
- byte [] TEMP1 = new byte[WKCKS.Length];
-
- Array.Copy(WKCKS, 0, TEMP1, 0, WKCKS.Length);
-
- int noOfBlocks = WKCKS.Length / engine.GetBlockSize();
- int extraBytes = WKCKS.Length % engine.GetBlockSize();
-
- if (extraBytes != 0)
- {
- throw new InvalidOperationException("Not multiple of block length");
- }
-
- engine.Init(true, paramPlusIV);
-
- for (int i = 0; i < noOfBlocks; i++)
- {
- int currentBytePos = i * engine.GetBlockSize();
-
- engine.ProcessBlock(TEMP1, currentBytePos, TEMP1, currentBytePos);
- }
-
- // Left TEMP2 = IV || TEMP1.
- byte[] TEMP2 = new byte[this.iv.Length + TEMP1.Length];
-
- Array.Copy(this.iv, 0, TEMP2, 0, this.iv.Length);
- Array.Copy(TEMP1, 0, TEMP2, this.iv.Length, TEMP1.Length);
-
- // Reverse the order of the octets in TEMP2 and call the result TEMP3.
- byte[] TEMP3 = new byte[TEMP2.Length];
-
- for (int i = 0; i < TEMP2.Length; i++)
- {
- TEMP3[i] = TEMP2[TEMP2.Length - (i + 1)];
- }
-
- // Encrypt TEMP3 in CBC mode using the KEK and an initialization vector
- // of 0x 4a dd a2 2c 79 e8 21 05. The resulting cipher text is the desired
- // result. It is 40 octets long if a 168 bit key is being wrapped.
- ParametersWithIV param2 = new ParametersWithIV(this.parameters, IV2);
-
- this.engine.Init(true, param2);
-
- for (int i = 0; i < noOfBlocks + 1; i++)
- {
- int currentBytePos = i * engine.GetBlockSize();
-
- engine.ProcessBlock(TEMP3, currentBytePos, TEMP3, currentBytePos);
- }
-
- return TEMP3;
- }
-
- /**
- * Method unwrap
- *
- * @param in
- * @param inOff
- * @param inLen
- * @return
- * @throws InvalidCipherTextException
- */
- public virtual byte[] Unwrap(
- byte[] input,
- int inOff,
- int length)
- {
- if (forWrapping)
- {
- throw new InvalidOperationException("Not set for unwrapping");
- }
-
- if (input == null)
- {
- throw new InvalidCipherTextException("Null pointer as ciphertext");
- }
-
- if (length % engine.GetBlockSize() != 0)
- {
- throw new InvalidCipherTextException("Ciphertext not multiple of "
- + engine.GetBlockSize());
- }
-
- /*
- // Check if the length of the cipher text is reasonable given the key
- // type. It must be 40 bytes for a 168 bit key and either 32, 40, or
- // 48 bytes for a 128, 192, or 256 bit key. If the length is not supported
- // or inconsistent with the algorithm for which the key is intended,
- // return error.
- //
- // we do not accept 168 bit keys. it has to be 192 bit.
- int lengthA = (estimatedKeyLengthInBit / 8) + 16;
- int lengthB = estimatedKeyLengthInBit % 8;
-
- if ((lengthA != keyToBeUnwrapped.Length) || (lengthB != 0)) {
- throw new XMLSecurityException("empty");
- }
- */
-
- // Decrypt the cipher text with TRIPLedeS in CBC mode using the KEK
- // and an initialization vector (IV) of 0x4adda22c79e82105. Call the output TEMP3.
- ParametersWithIV param2 = new ParametersWithIV(this.parameters, IV2);
-
- this.engine.Init(false, param2);
-
- byte [] TEMP3 = new byte[length];
-
- Array.Copy(input, inOff, TEMP3, 0, length);
-
- for (int i = 0; i < (TEMP3.Length / engine.GetBlockSize()); i++)
- {
- int currentBytePos = i * engine.GetBlockSize();
-
- engine.ProcessBlock(TEMP3, currentBytePos, TEMP3, currentBytePos);
- }
-
- // Reverse the order of the octets in TEMP3 and call the result TEMP2.
- byte[] TEMP2 = new byte[TEMP3.Length];
-
- for (int i = 0; i < TEMP3.Length; i++)
- {
- TEMP2[i] = TEMP3[TEMP3.Length - (i + 1)];
- }
-
- // Decompose TEMP2 into IV, the first 8 octets, and TEMP1, the remaining octets.
- this.iv = new byte[8];
-
- byte[] TEMP1 = new byte[TEMP2.Length - 8];
-
- Array.Copy(TEMP2, 0, this.iv, 0, 8);
- Array.Copy(TEMP2, 8, TEMP1, 0, TEMP2.Length - 8);
-
- // Decrypt TEMP1 using TRIPLedeS in CBC mode using the KEK and the IV
- // found in the previous step. Call the result WKCKS.
- this.paramPlusIV = new ParametersWithIV(this.parameters, this.iv);
-
- this.engine.Init(false, this.paramPlusIV);
-
- byte[] LCEKPADICV = new byte[TEMP1.Length];
-
- Array.Copy(TEMP1, 0, LCEKPADICV, 0, TEMP1.Length);
-
- for (int i = 0; i < (LCEKPADICV.Length / engine.GetBlockSize()); i++)
- {
- int currentBytePos = i * engine.GetBlockSize();
-
- engine.ProcessBlock(LCEKPADICV, currentBytePos, LCEKPADICV, currentBytePos);
- }
-
- // Decompose LCEKPADICV. CKS is the last 8 octets and WK, the wrapped key, are
- // those octets before the CKS.
- byte[] result = new byte[LCEKPADICV.Length - 8];
- byte[] CKStoBeVerified = new byte[8];
-
- Array.Copy(LCEKPADICV, 0, result, 0, LCEKPADICV.Length - 8);
- Array.Copy(LCEKPADICV, LCEKPADICV.Length - 8, CKStoBeVerified, 0, 8);
-
- // Calculate a CMS Key Checksum, (section 5.6.1), over the WK and compare
- // with the CKS extracted in the above step. If they are not equal, return error.
- if (!CheckCmsKeyChecksum(result, CKStoBeVerified))
- {
- throw new InvalidCipherTextException(
- "Checksum inside ciphertext is corrupted");
- }
-
- if ((result.Length - ((result[0] & 0xff) + 1)) > 7)
- {
- throw new InvalidCipherTextException(
- "too many pad bytes (" + (result.Length - ((result[0] & 0xff) + 1)) + ")");
- }
-
- // CEK is the wrapped key, now extracted for use in data decryption.
- byte[] CEK = new byte[result[0]];
- Array.Copy(result, 1, CEK, 0, CEK.Length);
- return CEK;
- }
-
- /**
- * Some key wrap algorithms make use of the Key Checksum defined
- * in CMS [CMS-Algorithms]. This is used to provide an integrity
- * check value for the key being wrapped. The algorithm is
- *
- * - Compute the 20 octet SHA-1 hash on the key being wrapped.
- * - Use the first 8 octets of this hash as the checksum value.
- *
- * @param key
- * @return
- * @throws Exception
- * @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum
- */
- private byte[] CalculateCmsKeyChecksum(
- byte[] key)
- {
- sha1.BlockUpdate(key, 0, key.Length);
- sha1.DoFinal(digest, 0);
-
- byte[] result = new byte[8];
- Array.Copy(digest, 0, result, 0, 8);
- return result;
- }
-
- /**
- * @param key
- * @param checksum
- * @return
- * @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum
- */
- private bool CheckCmsKeyChecksum(
- byte[] key,
- byte[] checksum)
- {
- return Arrays.ConstantTimeAreEqual(CalculateCmsKeyChecksum(key), checksum);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RC4Engine.cs b/BCCrypto/src/crypto/engines/RC4Engine.cs
deleted file mode 100644
index f12b9aa..0000000
--- a/BCCrypto/src/crypto/engines/RC4Engine.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- public class RC4Engine
- : IStreamCipher
- {
- private readonly static int STATE_LENGTH = 256;
-
- /*
- * variables to hold the state of the RC4 engine
- * during encryption and decryption
- */
-
- private byte[] engineState;
- private int x;
- private int y;
- private byte[] workingKey;
-
- /**
- * initialise a RC4 cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (parameters is KeyParameter)
- {
- /*
- * RC4 encryption and decryption is completely
- * symmetrical, so the 'forEncryption' is
- * irrelevant.
- */
- workingKey = ((KeyParameter)parameters).GetKey();
- SetKey(workingKey);
-
- return;
- }
-
- throw new ArgumentException("invalid parameter passed to RC4 init - " + Platform.GetTypeName(parameters));
- }
-
- public virtual string AlgorithmName
- {
- get { return "RC4"; }
- }
-
- public virtual byte ReturnByte(
- byte input)
- {
- x = (x + 1) & 0xff;
- y = (engineState[x] + y) & 0xff;
-
- // swap
- byte tmp = engineState[x];
- engineState[x] = engineState[y];
- engineState[y] = tmp;
-
- // xor
- return (byte)(input ^ engineState[(engineState[x] + engineState[y]) & 0xff]);
- }
-
- public virtual void ProcessBytes(
- byte[] input,
- int inOff,
- int length,
- byte[] output,
- int outOff)
- {
- Check.DataLength(input, inOff, length, "input buffer too short");
- Check.OutputLength(output, outOff, length, "output buffer too short");
-
- for (int i = 0; i < length ; i++)
- {
- x = (x + 1) & 0xff;
- y = (engineState[x] + y) & 0xff;
-
- // swap
- byte tmp = engineState[x];
- engineState[x] = engineState[y];
- engineState[y] = tmp;
-
- // xor
- output[i+outOff] = (byte)(input[i + inOff]
- ^ engineState[(engineState[x] + engineState[y]) & 0xff]);
- }
- }
-
- public virtual void Reset()
- {
- SetKey(workingKey);
- }
-
- // Private implementation
-
- private void SetKey(
- byte[] keyBytes)
- {
- workingKey = keyBytes;
-
- // System.out.println("the key length is ; "+ workingKey.Length);
-
- x = 0;
- y = 0;
-
- if (engineState == null)
- {
- engineState = new byte[STATE_LENGTH];
- }
-
- // reset the state of the engine
- for (int i=0; i < STATE_LENGTH; i++)
- {
- engineState[i] = (byte)i;
- }
-
- int i1 = 0;
- int i2 = 0;
-
- for (int i=0; i < STATE_LENGTH; i++)
- {
- i2 = ((keyBytes[i1] & 0xff) + engineState[i] + i2) & 0xff;
- // do the byte-swap inline
- byte tmp = engineState[i];
- engineState[i] = engineState[i2];
- engineState[i2] = tmp;
- i1 = (i1+1) % keyBytes.Length;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RC532Engine.cs b/BCCrypto/src/crypto/engines/RC532Engine.cs
deleted file mode 100644
index d1c29e6..0000000
--- a/BCCrypto/src/crypto/engines/RC532Engine.cs
+++ /dev/null
@@ -1,294 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * The specification for RC5 came from the RC5 Encryption Algorithm
- * publication in RSA CryptoBytes, Spring of 1995.
- * http://www.rsasecurity.com/rsalabs/cryptobytes .
- *
- * This implementation has a word size of 32 bits.
- */
- public class RC532Engine
- : IBlockCipher
- {
- /*
- * the number of rounds to perform
- */
- private int _noRounds;
-
- /*
- * the expanded key array of size 2*(rounds + 1)
- */
- private int [] _S;
-
- /*
- * our "magic constants" for 32 32
- *
- * Pw = Odd((e-2) * 2^wordsize)
- * Qw = Odd((o-2) * 2^wordsize)
- *
- * where e is the base of natural logarithms (2.718281828...)
- * and o is the golden ratio (1.61803398...)
- */
- private static readonly int P32 = unchecked((int) 0xb7e15163);
- private static readonly int Q32 = unchecked((int) 0x9e3779b9);
-
- private bool forEncryption;
-
- /**
- * Create an instance of the RC5 encryption algorithm
- * and set some defaults
- */
- public RC532Engine()
- {
- _noRounds = 12; // the default
-// _S = null;
- }
-
- public virtual string AlgorithmName
- {
- get { return "RC5-32"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return 2 * 4;
- }
-
- /**
- * initialise a RC5-32 cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (typeof(RC5Parameters).IsInstanceOfType(parameters))
- {
- RC5Parameters p = (RC5Parameters)parameters;
-
- _noRounds = p.Rounds;
-
- SetKey(p.GetKey());
- }
- else if (typeof(KeyParameter).IsInstanceOfType(parameters))
- {
- KeyParameter p = (KeyParameter)parameters;
-
- SetKey(p.GetKey());
- }
- else
- {
- throw new ArgumentException("invalid parameter passed to RC532 init - " + Platform.GetTypeName(parameters));
- }
-
- this.forEncryption = forEncryption;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- return (forEncryption)
- ? EncryptBlock(input, inOff, output, outOff)
- : DecryptBlock(input, inOff, output, outOff);
- }
-
- public virtual void Reset()
- {
- }
-
- /**
- * Re-key the cipher.
- *
- * @param key the key to be used
- */
- private void SetKey(
- byte[] key)
- {
- //
- // KEY EXPANSION:
- //
- // There are 3 phases to the key expansion.
- //
- // Phase 1:
- // Copy the secret key K[0...b-1] into an array L[0..c-1] of
- // c = ceil(b/u), where u = 32/8 in little-endian order.
- // In other words, we fill up L using u consecutive key bytes
- // of K. Any unfilled byte positions in L are zeroed. In the
- // case that b = c = 0, set c = 1 and L[0] = 0.
- //
- int[] L = new int[(key.Length + (4 - 1)) / 4];
-
- for (int i = 0; i != key.Length; i++)
- {
- L[i / 4] += (key[i] & 0xff) << (8 * (i % 4));
- }
-
- //
- // Phase 2:
- // Initialize S to a particular fixed pseudo-random bit pattern
- // using an arithmetic progression modulo 2^wordsize determined
- // by the magic numbers, Pw & Qw.
- //
- _S = new int[2*(_noRounds + 1)];
-
- _S[0] = P32;
- for (int i=1; i < _S.Length; i++)
- {
- _S[i] = (_S[i-1] + Q32);
- }
-
- //
- // Phase 3:
- // Mix in the user's secret key in 3 passes over the arrays S & L.
- // The max of the arrays sizes is used as the loop control
- //
- int iter;
-
- if (L.Length > _S.Length)
- {
- iter = 3 * L.Length;
- }
- else
- {
- iter = 3 * _S.Length;
- }
-
- int A = 0, B = 0;
- int ii = 0, jj = 0;
-
- for (int k = 0; k < iter; k++)
- {
- A = _S[ii] = RotateLeft(_S[ii] + A + B, 3);
- B = L[jj] = RotateLeft( L[jj] + A + B, A+B);
- ii = (ii+1) % _S.Length;
- jj = (jj+1) % L.Length;
- }
- }
-
- /**
- * Encrypt the given block starting at the given offset and place
- * the result in the provided buffer starting at the given offset.
- *
- * @param in in byte buffer containing data to encrypt
- * @param inOff offset into src buffer
- * @param out out buffer where encrypted data is written
- * @param outOff offset into out buffer
- */
- private int EncryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- int A = BytesToWord(input, inOff) + _S[0];
- int B = BytesToWord(input, inOff + 4) + _S[1];
-
- for (int i = 1; i <= _noRounds; i++)
- {
- A = RotateLeft(A ^ B, B) + _S[2*i];
- B = RotateLeft(B ^ A, A) + _S[2*i+1];
- }
-
- WordToBytes(A, outBytes, outOff);
- WordToBytes(B, outBytes, outOff + 4);
-
- return 2 * 4;
- }
-
- private int DecryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- int A = BytesToWord(input, inOff);
- int B = BytesToWord(input, inOff + 4);
-
- for (int i = _noRounds; i >= 1; i--)
- {
- B = RotateRight(B - _S[2*i+1], A) ^ A;
- A = RotateRight(A - _S[2*i], B) ^ B;
- }
-
- WordToBytes(A - _S[0], outBytes, outOff);
- WordToBytes(B - _S[1], outBytes, outOff + 4);
-
- return 2 * 4;
- }
-
-
- //////////////////////////////////////////////////////////////
- //
- // PRIVATE Helper Methods
- //
- //////////////////////////////////////////////////////////////
-
- /**
- * Perform a left "spin" of the word. The rotation of the given
- * word x is rotated left by y bits.
- * Only the lg(32) low-order bits of y
- * are used to determine the rotation amount. Here it is
- * assumed that the wordsize used is a power of 2.
- *
- * @param x word to rotate
- * @param y number of bits to rotate % 32
- */
- private int RotateLeft(int x, int y) {
- return ((int) ( (uint) (x << (y & (32-1))) |
- ((uint) x >> (32 - (y & (32-1)))) )
- );
- }
-
- /**
- * Perform a right "spin" of the word. The rotation of the given
- * word x is rotated left by y bits.
- * Only the lg(32) low-order bits of y
- * are used to determine the rotation amount. Here it is
- * assumed that the wordsize used is a power of 2.
- *
- * @param x word to rotate
- * @param y number of bits to rotate % 32
- */
- private int RotateRight(int x, int y) {
- return ((int) ( ((uint) x >> (y & (32-1))) |
- (uint) (x << (32 - (y & (32-1)))) )
- );
- }
-
- private int BytesToWord(
- byte[] src,
- int srcOff)
- {
- return (src[srcOff] & 0xff) | ((src[srcOff + 1] & 0xff) << 8)
- | ((src[srcOff + 2] & 0xff) << 16) | ((src[srcOff + 3] & 0xff) << 24);
- }
-
- private void WordToBytes(
- int word,
- byte[] dst,
- int dstOff)
- {
- dst[dstOff] = (byte)word;
- dst[dstOff + 1] = (byte)(word >> 8);
- dst[dstOff + 2] = (byte)(word >> 16);
- dst[dstOff + 3] = (byte)(word >> 24);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RC564Engine.cs b/BCCrypto/src/crypto/engines/RC564Engine.cs
deleted file mode 100644
index 097fd60..0000000
--- a/BCCrypto/src/crypto/engines/RC564Engine.cs
+++ /dev/null
@@ -1,295 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * The specification for RC5 came from the RC5 Encryption Algorithm
- * publication in RSA CryptoBytes, Spring of 1995.
- * http://www.rsasecurity.com/rsalabs/cryptobytes .
- *
- * This implementation is set to work with a 64 bit word size.
- */
- public class RC564Engine
- : IBlockCipher
- {
- private static readonly int wordSize = 64;
- private static readonly int bytesPerWord = wordSize / 8;
-
- /*
- * the number of rounds to perform
- */
- private int _noRounds;
-
- /*
- * the expanded key array of size 2*(rounds + 1)
- */
- private long [] _S;
-
- /*
- * our "magic constants" for wordSize 62
- *
- * Pw = Odd((e-2) * 2^wordsize)
- * Qw = Odd((o-2) * 2^wordsize)
- *
- * where e is the base of natural logarithms (2.718281828...)
- * and o is the golden ratio (1.61803398...)
- */
- private static readonly long P64 = unchecked( (long) 0xb7e151628aed2a6bL);
- private static readonly long Q64 = unchecked( (long) 0x9e3779b97f4a7c15L);
-
- private bool forEncryption;
-
- /**
- * Create an instance of the RC5 encryption algorithm
- * and set some defaults
- */
- public RC564Engine()
- {
- _noRounds = 12;
-// _S = null;
- }
-
- public virtual string AlgorithmName
- {
- get { return "RC5-64"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return 2 * bytesPerWord;
- }
-
- /**
- * initialise a RC5-64 cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(typeof(RC5Parameters).IsInstanceOfType(parameters)))
- {
- throw new ArgumentException("invalid parameter passed to RC564 init - " + Platform.GetTypeName(parameters));
- }
-
- RC5Parameters p = (RC5Parameters)parameters;
-
- this.forEncryption = forEncryption;
-
- _noRounds = p.Rounds;
-
- SetKey(p.GetKey());
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- return (forEncryption) ? EncryptBlock(input, inOff, output, outOff)
- : DecryptBlock(input, inOff, output, outOff);
- }
-
- public virtual void Reset()
- {
- }
-
- /**
- * Re-key the cipher.
- *
- * @param key the key to be used
- */
- private void SetKey(
- byte[] key)
- {
- //
- // KEY EXPANSION:
- //
- // There are 3 phases to the key expansion.
- //
- // Phase 1:
- // Copy the secret key K[0...b-1] into an array L[0..c-1] of
- // c = ceil(b/u), where u = wordSize/8 in little-endian order.
- // In other words, we fill up L using u consecutive key bytes
- // of K. Any unfilled byte positions in L are zeroed. In the
- // case that b = c = 0, set c = 1 and L[0] = 0.
- //
- long[] L = new long[(key.Length + (bytesPerWord - 1)) / bytesPerWord];
-
- for (int i = 0; i != key.Length; i++)
- {
- L[i / bytesPerWord] += (long)(key[i] & 0xff) << (8 * (i % bytesPerWord));
- }
-
- //
- // Phase 2:
- // Initialize S to a particular fixed pseudo-random bit pattern
- // using an arithmetic progression modulo 2^wordsize determined
- // by the magic numbers, Pw & Qw.
- //
- _S = new long[2*(_noRounds + 1)];
-
- _S[0] = P64;
- for (int i=1; i < _S.Length; i++)
- {
- _S[i] = (_S[i-1] + Q64);
- }
-
- //
- // Phase 3:
- // Mix in the user's secret key in 3 passes over the arrays S & L.
- // The max of the arrays sizes is used as the loop control
- //
- int iter;
-
- if (L.Length > _S.Length)
- {
- iter = 3 * L.Length;
- }
- else
- {
- iter = 3 * _S.Length;
- }
-
- long A = 0, B = 0;
- int ii = 0, jj = 0;
-
- for (int k = 0; k < iter; k++)
- {
- A = _S[ii] = RotateLeft(_S[ii] + A + B, 3);
- B = L[jj] = RotateLeft( L[jj] + A + B, A+B);
- ii = (ii+1) % _S.Length;
- jj = (jj+1) % L.Length;
- }
- }
-
- /**
- * Encrypt the given block starting at the given offset and place
- * the result in the provided buffer starting at the given offset.
- *
- * @param in in byte buffer containing data to encrypt
- * @param inOff offset into src buffer
- * @param out out buffer where encrypted data is written
- * @param outOff offset into out buffer
- */
- private int EncryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- long A = BytesToWord(input, inOff) + _S[0];
- long B = BytesToWord(input, inOff + bytesPerWord) + _S[1];
-
- for (int i = 1; i <= _noRounds; i++)
- {
- A = RotateLeft(A ^ B, B) + _S[2*i];
- B = RotateLeft(B ^ A, A) + _S[2*i+1];
- }
-
- WordToBytes(A, outBytes, outOff);
- WordToBytes(B, outBytes, outOff + bytesPerWord);
-
- return 2 * bytesPerWord;
- }
-
- private int DecryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- long A = BytesToWord(input, inOff);
- long B = BytesToWord(input, inOff + bytesPerWord);
-
- for (int i = _noRounds; i >= 1; i--)
- {
- B = RotateRight(B - _S[2*i+1], A) ^ A;
- A = RotateRight(A - _S[2*i], B) ^ B;
- }
-
- WordToBytes(A - _S[0], outBytes, outOff);
- WordToBytes(B - _S[1], outBytes, outOff + bytesPerWord);
-
- return 2 * bytesPerWord;
- }
-
-
- //////////////////////////////////////////////////////////////
- //
- // PRIVATE Helper Methods
- //
- //////////////////////////////////////////////////////////////
-
- /**
- * Perform a left "spin" of the word. The rotation of the given
- * word x is rotated left by y bits.
- * Only the lg(wordSize) low-order bits of y
- * are used to determine the rotation amount. Here it is
- * assumed that the wordsize used is a power of 2.
- *
- * @param x word to rotate
- * @param y number of bits to rotate % wordSize
- */
- private long RotateLeft(long x, long y) {
- return ((long) ( (ulong) (x << (int) (y & (wordSize-1))) |
- ((ulong) x >> (int) (wordSize - (y & (wordSize-1)))))
- );
- }
-
- /**
- * Perform a right "spin" of the word. The rotation of the given
- * word x is rotated left by y bits.
- * Only the lg(wordSize) low-order bits of y
- * are used to determine the rotation amount. Here it is
- * assumed that the wordsize used is a power of 2.
- *
- * @param x word to rotate
- * @param y number of bits to rotate % wordSize
- */
- private long RotateRight(long x, long y) {
- return ((long) ( ((ulong) x >> (int) (y & (wordSize-1))) |
- (ulong) (x << (int) (wordSize - (y & (wordSize-1)))))
- );
- }
-
- private long BytesToWord(
- byte[] src,
- int srcOff)
- {
- long word = 0;
-
- for (int i = bytesPerWord - 1; i >= 0; i--)
- {
- word = (word << 8) + (src[i + srcOff] & 0xff);
- }
-
- return word;
- }
-
- private void WordToBytes(
- long word,
- byte[] dst,
- int dstOff)
- {
- for (int i = 0; i < bytesPerWord; i++)
- {
- dst[i + dstOff] = (byte)word;
- word = (long) ((ulong) word >> 8);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RC6Engine.cs b/BCCrypto/src/crypto/engines/RC6Engine.cs
deleted file mode 100644
index 9aeb1e7..0000000
--- a/BCCrypto/src/crypto/engines/RC6Engine.cs
+++ /dev/null
@@ -1,361 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * An RC6 engine.
- */
- public class RC6Engine
- : IBlockCipher
- {
- private static readonly int wordSize = 32;
- private static readonly int bytesPerWord = wordSize / 8;
-
- /*
- * the number of rounds to perform
- */
- private static readonly int _noRounds = 20;
-
- /*
- * the expanded key array of size 2*(rounds + 1)
- */
- private int [] _S;
-
- /*
- * our "magic constants" for wordSize 32
- *
- * Pw = Odd((e-2) * 2^wordsize)
- * Qw = Odd((o-2) * 2^wordsize)
- *
- * where e is the base of natural logarithms (2.718281828...)
- * and o is the golden ratio (1.61803398...)
- */
- private static readonly int P32 = unchecked((int) 0xb7e15163);
- private static readonly int Q32 = unchecked((int) 0x9e3779b9);
-
- private static readonly int LGW = 5; // log2(32)
-
- private bool forEncryption;
-
- /**
- * Create an instance of the RC6 encryption algorithm
- * and set some defaults
- */
- public RC6Engine()
- {
-// _S = null;
- }
-
- public virtual string AlgorithmName
- {
- get { return "RC6"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return 4 * bytesPerWord;
- }
-
- /**
- * initialise a RC5-32 cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException("invalid parameter passed to RC6 init - " + Platform.GetTypeName(parameters));
-
- this.forEncryption = forEncryption;
-
- KeyParameter p = (KeyParameter)parameters;
- SetKey(p.GetKey());
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- int blockSize = GetBlockSize();
- if (_S == null)
- throw new InvalidOperationException("RC6 engine not initialised");
-
- Check.DataLength(input, inOff, blockSize, "input buffer too short");
- Check.OutputLength(output, outOff, blockSize, "output buffer too short");
-
- return (forEncryption)
- ? EncryptBlock(input, inOff, output, outOff)
- : DecryptBlock(input, inOff, output, outOff);
- }
-
- public virtual void Reset()
- {
- }
-
- /**
- * Re-key the cipher.
- *
- * @param inKey the key to be used
- */
- private void SetKey(
- byte[] key)
- {
- //
- // KEY EXPANSION:
- //
- // There are 3 phases to the key expansion.
- //
- // Phase 1:
- // Copy the secret key K[0...b-1] into an array L[0..c-1] of
- // c = ceil(b/u), where u = wordSize/8 in little-endian order.
- // In other words, we fill up L using u consecutive key bytes
- // of K. Any unfilled byte positions in L are zeroed. In the
- // case that b = c = 0, set c = 1 and L[0] = 0.
- //
- // compute number of dwords
- int c = (key.Length + (bytesPerWord - 1)) / bytesPerWord;
- if (c == 0)
- {
- c = 1;
- }
- int[] L = new int[(key.Length + bytesPerWord - 1) / bytesPerWord];
-
- // load all key bytes into array of key dwords
- for (int i = key.Length - 1; i >= 0; i--)
- {
- L[i / bytesPerWord] = (L[i / bytesPerWord] << 8) + (key[i] & 0xff);
- }
-
- //
- // Phase 2:
- // Key schedule is placed in a array of 2+2*ROUNDS+2 = 44 dwords.
- // Initialize S to a particular fixed pseudo-random bit pattern
- // using an arithmetic progression modulo 2^wordsize determined
- // by the magic numbers, Pw & Qw.
- //
- _S = new int[2+2*_noRounds+2];
-
- _S[0] = P32;
- for (int i=1; i < _S.Length; i++)
- {
- _S[i] = (_S[i-1] + Q32);
- }
-
- //
- // Phase 3:
- // Mix in the user's secret key in 3 passes over the arrays S & L.
- // The max of the arrays sizes is used as the loop control
- //
- int iter;
-
- if (L.Length > _S.Length)
- {
- iter = 3 * L.Length;
- }
- else
- {
- iter = 3 * _S.Length;
- }
-
- int A = 0;
- int B = 0;
- int ii = 0, jj = 0;
-
- for (int k = 0; k < iter; k++)
- {
- A = _S[ii] = RotateLeft(_S[ii] + A + B, 3);
- B = L[jj] = RotateLeft( L[jj] + A + B, A+B);
- ii = (ii+1) % _S.Length;
- jj = (jj+1) % L.Length;
- }
- }
-
- private int EncryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- // load A,B,C and D registers from in.
- int A = BytesToWord(input, inOff);
- int B = BytesToWord(input, inOff + bytesPerWord);
- int C = BytesToWord(input, inOff + bytesPerWord*2);
- int D = BytesToWord(input, inOff + bytesPerWord*3);
-
- // Do pseudo-round #0: pre-whitening of B and D
- B += _S[0];
- D += _S[1];
-
- // perform round #1,#2 ... #ROUNDS of encryption
- for (int i = 1; i <= _noRounds; i++)
- {
- int t = 0,u = 0;
-
- t = B*(2*B+1);
- t = RotateLeft(t,5);
-
- u = D*(2*D+1);
- u = RotateLeft(u,5);
-
- A ^= t;
- A = RotateLeft(A,u);
- A += _S[2*i];
-
- C ^= u;
- C = RotateLeft(C,t);
- C += _S[2*i+1];
-
- int temp = A;
- A = B;
- B = C;
- C = D;
- D = temp;
- }
- // do pseudo-round #(ROUNDS+1) : post-whitening of A and C
- A += _S[2*_noRounds+2];
- C += _S[2*_noRounds+3];
-
- // store A, B, C and D registers to out
- WordToBytes(A, outBytes, outOff);
- WordToBytes(B, outBytes, outOff + bytesPerWord);
- WordToBytes(C, outBytes, outOff + bytesPerWord*2);
- WordToBytes(D, outBytes, outOff + bytesPerWord*3);
-
- return 4 * bytesPerWord;
- }
-
- private int DecryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- // load A,B,C and D registers from out.
- int A = BytesToWord(input, inOff);
- int B = BytesToWord(input, inOff + bytesPerWord);
- int C = BytesToWord(input, inOff + bytesPerWord*2);
- int D = BytesToWord(input, inOff + bytesPerWord*3);
-
- // Undo pseudo-round #(ROUNDS+1) : post whitening of A and C
- C -= _S[2*_noRounds+3];
- A -= _S[2*_noRounds+2];
-
- // Undo round #ROUNDS, .., #2,#1 of encryption
- for (int i = _noRounds; i >= 1; i--)
- {
- int t=0,u = 0;
-
- int temp = D;
- D = C;
- C = B;
- B = A;
- A = temp;
-
- t = B*(2*B+1);
- t = RotateLeft(t, LGW);
-
- u = D*(2*D+1);
- u = RotateLeft(u, LGW);
-
- C -= _S[2*i+1];
- C = RotateRight(C,t);
- C ^= u;
-
- A -= _S[2*i];
- A = RotateRight(A,u);
- A ^= t;
-
- }
- // Undo pseudo-round #0: pre-whitening of B and D
- D -= _S[1];
- B -= _S[0];
-
- WordToBytes(A, outBytes, outOff);
- WordToBytes(B, outBytes, outOff + bytesPerWord);
- WordToBytes(C, outBytes, outOff + bytesPerWord*2);
- WordToBytes(D, outBytes, outOff + bytesPerWord*3);
-
- return 4 * bytesPerWord;
- }
-
-
- //////////////////////////////////////////////////////////////
- //
- // PRIVATE Helper Methods
- //
- //////////////////////////////////////////////////////////////
-
- /**
- * Perform a left "spin" of the word. The rotation of the given
- * word x is rotated left by y bits.
- * Only the lg(wordSize) low-order bits of y
- * are used to determine the rotation amount. Here it is
- * assumed that the wordsize used is a power of 2.
- *
- * @param x word to rotate
- * @param y number of bits to rotate % wordSize
- */
- private int RotateLeft(int x, int y)
- {
- return ((int)((uint)(x << (y & (wordSize-1)))
- | ((uint) x >> (wordSize - (y & (wordSize-1))))));
- }
-
- /**
- * Perform a right "spin" of the word. The rotation of the given
- * word x is rotated left by y bits.
- * Only the lg(wordSize) low-order bits of y
- * are used to determine the rotation amount. Here it is
- * assumed that the wordsize used is a power of 2.
- *
- * @param x word to rotate
- * @param y number of bits to rotate % wordSize
- */
- private int RotateRight(int x, int y)
- {
- return ((int)(((uint) x >> (y & (wordSize-1)))
- | (uint)(x << (wordSize - (y & (wordSize-1))))));
- }
-
- private int BytesToWord(
- byte[] src,
- int srcOff)
- {
- int word = 0;
-
- for (int i = bytesPerWord - 1; i >= 0; i--)
- {
- word = (word << 8) + (src[i + srcOff] & 0xff);
- }
-
- return word;
- }
-
- private void WordToBytes(
- int word,
- byte[] dst,
- int dstOff)
- {
- for (int i = 0; i < bytesPerWord; i++)
- {
- dst[i + dstOff] = (byte)word;
- word = (int) ((uint) word >> 8);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RFC3211WrapEngine.cs b/BCCrypto/src/crypto/engines/RFC3211WrapEngine.cs
deleted file mode 100644
index 4e3af52..0000000
--- a/BCCrypto/src/crypto/engines/RFC3211WrapEngine.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * an implementation of the RFC 3211 Key Wrap
- * Specification.
- */
- public class Rfc3211WrapEngine
- : IWrapper
- {
- private CbcBlockCipher engine;
- private ParametersWithIV param;
- private bool forWrapping;
- private SecureRandom rand;
-
- public Rfc3211WrapEngine(
- IBlockCipher engine)
- {
- this.engine = new CbcBlockCipher(engine);
- }
-
- public virtual void Init(
- bool forWrapping,
- ICipherParameters param)
- {
- this.forWrapping = forWrapping;
-
- if (param is ParametersWithRandom)
- {
- ParametersWithRandom p = (ParametersWithRandom) param;
-
- this.rand = p.Random;
- this.param = (ParametersWithIV) p.Parameters;
- }
- else
- {
- if (forWrapping)
- {
- rand = new SecureRandom();
- }
-
- this.param = (ParametersWithIV) param;
- }
- }
-
- public virtual string AlgorithmName
- {
- get { return engine.GetUnderlyingCipher().AlgorithmName + "/RFC3211Wrap"; }
- }
-
- public virtual byte[] Wrap(
- byte[] inBytes,
- int inOff,
- int inLen)
- {
- if (!forWrapping)
- {
- throw new InvalidOperationException("not set for wrapping");
- }
-
- engine.Init(true, param);
-
- int blockSize = engine.GetBlockSize();
- byte[] cekBlock;
-
- if (inLen + 4 < blockSize * 2)
- {
- cekBlock = new byte[blockSize * 2];
- }
- else
- {
- cekBlock = new byte[(inLen + 4) % blockSize == 0 ? inLen + 4 : ((inLen + 4) / blockSize + 1) * blockSize];
- }
-
- cekBlock[0] = (byte)inLen;
- cekBlock[1] = (byte)~inBytes[inOff];
- cekBlock[2] = (byte)~inBytes[inOff + 1];
- cekBlock[3] = (byte)~inBytes[inOff + 2];
-
- Array.Copy(inBytes, inOff, cekBlock, 4, inLen);
-
- rand.NextBytes(cekBlock, inLen + 4, cekBlock.Length - inLen - 4);
-
- for (int i = 0; i < cekBlock.Length; i += blockSize)
- {
- engine.ProcessBlock(cekBlock, i, cekBlock, i);
- }
-
- for (int i = 0; i < cekBlock.Length; i += blockSize)
- {
- engine.ProcessBlock(cekBlock, i, cekBlock, i);
- }
-
- return cekBlock;
- }
-
- public virtual byte[] Unwrap(
- byte[] inBytes,
- int inOff,
- int inLen)
- {
- if (forWrapping)
- {
- throw new InvalidOperationException("not set for unwrapping");
- }
-
- int blockSize = engine.GetBlockSize();
-
- if (inLen < 2 * blockSize)
- {
- throw new InvalidCipherTextException("input too short");
- }
-
- byte[] cekBlock = new byte[inLen];
- byte[] iv = new byte[blockSize];
-
- Array.Copy(inBytes, inOff, cekBlock, 0, inLen);
- Array.Copy(inBytes, inOff, iv, 0, iv.Length);
-
- engine.Init(false, new ParametersWithIV(param.Parameters, iv));
-
- for (int i = blockSize; i < cekBlock.Length; i += blockSize)
- {
- engine.ProcessBlock(cekBlock, i, cekBlock, i);
- }
-
- Array.Copy(cekBlock, cekBlock.Length - iv.Length, iv, 0, iv.Length);
-
- engine.Init(false, new ParametersWithIV(param.Parameters, iv));
-
- engine.ProcessBlock(cekBlock, 0, cekBlock, 0);
-
- engine.Init(false, param);
-
- for (int i = 0; i < cekBlock.Length; i += blockSize)
- {
- engine.ProcessBlock(cekBlock, i, cekBlock, i);
- }
-
- if ((cekBlock[0] & 0xff) > cekBlock.Length - 4)
- {
- throw new InvalidCipherTextException("wrapped key corrupted");
- }
-
- byte[] key = new byte[cekBlock[0] & 0xff];
-
- Array.Copy(cekBlock, 4, key, 0, cekBlock[0]);
-
- // Note: Using constant time comparison
- int nonEqual = 0;
- for (int i = 0; i != 3; i++)
- {
- byte check = (byte)~cekBlock[1 + i];
- nonEqual |= (check ^ key[i]);
- }
-
- if (nonEqual != 0)
- throw new InvalidCipherTextException("wrapped key fails checksum");
-
- return key;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RFC3394WrapEngine.cs b/BCCrypto/src/crypto/engines/RFC3394WrapEngine.cs
deleted file mode 100644
index 4bb0e21..0000000
--- a/BCCrypto/src/crypto/engines/RFC3394WrapEngine.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- ///
- /// An implementation of the AES Key Wrapper from the NIST Key Wrap
- /// Specification as described in RFC 3394.
- ///
- /// For further details see: http://www.ietf.org/rfc/rfc3394.txt
- /// and http://csrc.nist.gov/encryption/kms/key-wrap.pdf .
- ///
- public class Rfc3394WrapEngine
- : IWrapper
- {
- private readonly IBlockCipher engine;
-
- private KeyParameter param;
- private bool forWrapping;
-
- private byte[] iv =
- {
- 0xa6, 0xa6, 0xa6, 0xa6,
- 0xa6, 0xa6, 0xa6, 0xa6
- };
-
- public Rfc3394WrapEngine(
- IBlockCipher engine)
- {
- this.engine = engine;
- }
-
- public virtual void Init(
- bool forWrapping,
- ICipherParameters parameters)
- {
- this.forWrapping = forWrapping;
-
- if (parameters is ParametersWithRandom)
- {
- parameters = ((ParametersWithRandom) parameters).Parameters;
- }
-
- if (parameters is KeyParameter)
- {
- this.param = (KeyParameter) parameters;
- }
- else if (parameters is ParametersWithIV)
- {
- ParametersWithIV pIV = (ParametersWithIV) parameters;
- byte[] iv = pIV.GetIV();
-
- if (iv.Length != 8)
- throw new ArgumentException("IV length not equal to 8", "parameters");
-
- this.iv = iv;
- this.param = (KeyParameter) pIV.Parameters;
- }
- else
- {
- // TODO Throw an exception for bad parameters?
- }
- }
-
- public virtual string AlgorithmName
- {
- get { return engine.AlgorithmName; }
- }
-
- public virtual byte[] Wrap(
- byte[] input,
- int inOff,
- int inLen)
- {
- if (!forWrapping)
- {
- throw new InvalidOperationException("not set for wrapping");
- }
-
- int n = inLen / 8;
-
- if ((n * 8) != inLen)
- {
- throw new DataLengthException("wrap data must be a multiple of 8 bytes");
- }
-
- byte[] block = new byte[inLen + iv.Length];
- byte[] buf = new byte[8 + iv.Length];
-
- Array.Copy(iv, 0, block, 0, iv.Length);
- Array.Copy(input, inOff, block, iv.Length, inLen);
-
- engine.Init(true, param);
-
- for (int j = 0; j != 6; j++)
- {
- for (int i = 1; i <= n; i++)
- {
- Array.Copy(block, 0, buf, 0, iv.Length);
- Array.Copy(block, 8 * i, buf, iv.Length, 8);
- engine.ProcessBlock(buf, 0, buf, 0);
-
- int t = n * j + i;
- for (int k = 1; t != 0; k++)
- {
- byte v = (byte)t;
-
- buf[iv.Length - k] ^= v;
- t = (int) ((uint)t >> 8);
- }
-
- Array.Copy(buf, 0, block, 0, 8);
- Array.Copy(buf, 8, block, 8 * i, 8);
- }
- }
-
- return block;
- }
-
- public virtual byte[] Unwrap(
- byte[] input,
- int inOff,
- int inLen)
- {
- if (forWrapping)
- {
- throw new InvalidOperationException("not set for unwrapping");
- }
-
- int n = inLen / 8;
-
- if ((n * 8) != inLen)
- {
- throw new InvalidCipherTextException("unwrap data must be a multiple of 8 bytes");
- }
-
- byte[] block = new byte[inLen - iv.Length];
- byte[] a = new byte[iv.Length];
- byte[] buf = new byte[8 + iv.Length];
-
- Array.Copy(input, inOff, a, 0, iv.Length);
- Array.Copy(input, inOff + iv.Length, block, 0, inLen - iv.Length);
-
- engine.Init(false, param);
-
- n = n - 1;
-
- for (int j = 5; j >= 0; j--)
- {
- for (int i = n; i >= 1; i--)
- {
- Array.Copy(a, 0, buf, 0, iv.Length);
- Array.Copy(block, 8 * (i - 1), buf, iv.Length, 8);
-
- int t = n * j + i;
- for (int k = 1; t != 0; k++)
- {
- byte v = (byte)t;
-
- buf[iv.Length - k] ^= v;
- t = (int) ((uint)t >> 8);
- }
-
- engine.ProcessBlock(buf, 0, buf, 0);
- Array.Copy(buf, 0, a, 0, 8);
- Array.Copy(buf, 8, block, 8 * (i - 1), 8);
- }
- }
-
- if (!Arrays.ConstantTimeAreEqual(a, iv))
- throw new InvalidCipherTextException("checksum failed");
-
- return block;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RSABlindedEngine.cs b/BCCrypto/src/crypto/engines/RSABlindedEngine.cs
deleted file mode 100644
index f95f145..0000000
--- a/BCCrypto/src/crypto/engines/RSABlindedEngine.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * this does your basic RSA algorithm with blinding
- */
- public class RsaBlindedEngine
- : IAsymmetricBlockCipher
- {
- private readonly RsaCoreEngine core = new RsaCoreEngine();
- private RsaKeyParameters key;
- private SecureRandom random;
-
- public virtual string AlgorithmName
- {
- get { return "RSA"; }
- }
-
- /**
- * initialise the RSA engine.
- *
- * @param forEncryption true if we are encrypting, false otherwise.
- * @param param the necessary RSA key parameters.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters param)
- {
- core.Init(forEncryption, param);
-
- if (param is ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom)param;
-
- key = (RsaKeyParameters)rParam.Parameters;
- random = rParam.Random;
- }
- else
- {
- key = (RsaKeyParameters)param;
- random = new SecureRandom();
- }
- }
-
- /**
- * Return the maximum size for an input block to this engine.
- * For RSA this is always one byte less than the key size on
- * encryption, and the same length as the key size on decryption.
- *
- * @return maximum size for an input block.
- */
- public virtual int GetInputBlockSize()
- {
- return core.GetInputBlockSize();
- }
-
- /**
- * Return the maximum size for an output block to this engine.
- * For RSA this is always one byte less than the key size on
- * decryption, and the same length as the key size on encryption.
- *
- * @return maximum size for an output block.
- */
- public virtual int GetOutputBlockSize()
- {
- return core.GetOutputBlockSize();
- }
-
- /**
- * Process a single block using the basic RSA algorithm.
- *
- * @param inBuf the input array.
- * @param inOff the offset into the input buffer where the data starts.
- * @param inLen the length of the data to be processed.
- * @return the result of the RSA process.
- * @exception DataLengthException the input block is too large.
- */
- public virtual byte[] ProcessBlock(
- byte[] inBuf,
- int inOff,
- int inLen)
- {
- if (key == null)
- throw new InvalidOperationException("RSA engine not initialised");
-
- BigInteger input = core.ConvertInput(inBuf, inOff, inLen);
-
- BigInteger result;
- if (key is RsaPrivateCrtKeyParameters)
- {
- RsaPrivateCrtKeyParameters k = (RsaPrivateCrtKeyParameters)key;
- BigInteger e = k.PublicExponent;
- if (e != null) // can't do blinding without a public exponent
- {
- BigInteger m = k.Modulus;
- BigInteger r = BigIntegers.CreateRandomInRange(
- BigInteger.One, m.Subtract(BigInteger.One), random);
-
- BigInteger blindedInput = r.ModPow(e, m).Multiply(input).Mod(m);
- BigInteger blindedResult = core.ProcessBlock(blindedInput);
-
- BigInteger rInv = r.ModInverse(m);
- result = blindedResult.Multiply(rInv).Mod(m);
-
- // defence against Arjen Lenstras CRT attack
- if (!input.Equals(result.ModPow(e, m)))
- throw new InvalidOperationException("RSA engine faulty decryption/signing detected");
- }
- else
- {
- result = core.ProcessBlock(input);
- }
- }
- else
- {
- result = core.ProcessBlock(input);
- }
-
- return core.ConvertOutput(result);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RSABlindingEngine.cs b/BCCrypto/src/crypto/engines/RSABlindingEngine.cs
deleted file mode 100644
index c636627..0000000
--- a/BCCrypto/src/crypto/engines/RSABlindingEngine.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * This does your basic RSA Chaum's blinding and unblinding as outlined in
- * "Handbook of Applied Cryptography", page 475. You need to use this if you are
- * trying to get another party to generate signatures without them being aware
- * of the message they are signing.
- */
- public class RsaBlindingEngine
- : IAsymmetricBlockCipher
- {
- private readonly RsaCoreEngine core = new RsaCoreEngine();
-
- private RsaKeyParameters key;
- private BigInteger blindingFactor;
-
- private bool forEncryption;
-
- public virtual string AlgorithmName
- {
- get { return "RSA"; }
- }
-
- /**
- * Initialise the blinding engine.
- *
- * @param forEncryption true if we are encrypting (blinding), false otherwise.
- * @param param the necessary RSA key parameters.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters param)
- {
- RsaBlindingParameters p;
-
- if (param is ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom)param;
-
- p = (RsaBlindingParameters)rParam.Parameters;
- }
- else
- {
- p = (RsaBlindingParameters)param;
- }
-
- core.Init(forEncryption, p.PublicKey);
-
- this.forEncryption = forEncryption;
- this.key = p.PublicKey;
- this.blindingFactor = p.BlindingFactor;
- }
-
- /**
- * Return the maximum size for an input block to this engine.
- * For RSA this is always one byte less than the key size on
- * encryption, and the same length as the key size on decryption.
- *
- * @return maximum size for an input block.
- */
- public virtual int GetInputBlockSize()
- {
- return core.GetInputBlockSize();
- }
-
- /**
- * Return the maximum size for an output block to this engine.
- * For RSA this is always one byte less than the key size on
- * decryption, and the same length as the key size on encryption.
- *
- * @return maximum size for an output block.
- */
- public virtual int GetOutputBlockSize()
- {
- return core.GetOutputBlockSize();
- }
-
- /**
- * Process a single block using the RSA blinding algorithm.
- *
- * @param in the input array.
- * @param inOff the offset into the input buffer where the data starts.
- * @param inLen the length of the data to be processed.
- * @return the result of the RSA process.
- * @throws DataLengthException the input block is too large.
- */
- public virtual byte[] ProcessBlock(
- byte[] inBuf,
- int inOff,
- int inLen)
- {
- BigInteger msg = core.ConvertInput(inBuf, inOff, inLen);
-
- if (forEncryption)
- {
- msg = BlindMessage(msg);
- }
- else
- {
- msg = UnblindMessage(msg);
- }
-
- return core.ConvertOutput(msg);
- }
-
- /*
- * Blind message with the blind factor.
- */
- private BigInteger BlindMessage(
- BigInteger msg)
- {
- BigInteger blindMsg = blindingFactor;
- blindMsg = msg.Multiply(blindMsg.ModPow(key.Exponent, key.Modulus));
- blindMsg = blindMsg.Mod(key.Modulus);
-
- return blindMsg;
- }
-
- /*
- * Unblind the message blinded with the blind factor.
- */
- private BigInteger UnblindMessage(
- BigInteger blindedMsg)
- {
- BigInteger m = key.Modulus;
- BigInteger msg = blindedMsg;
- BigInteger blindFactorInverse = blindingFactor.ModInverse(m);
- msg = msg.Multiply(blindFactorInverse);
- msg = msg.Mod(m);
-
- return msg;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RSACoreEngine.cs b/BCCrypto/src/crypto/engines/RSACoreEngine.cs
deleted file mode 100644
index fd44e3c..0000000
--- a/BCCrypto/src/crypto/engines/RSACoreEngine.cs
+++ /dev/null
@@ -1,156 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * this does your basic RSA algorithm.
- */
- class RsaCoreEngine
- {
- private RsaKeyParameters key;
- private bool forEncryption;
- private int bitSize;
-
- /**
- * initialise the RSA engine.
- *
- * @param forEncryption true if we are encrypting, false otherwise.
- * @param param the necessary RSA key parameters.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (parameters is ParametersWithRandom)
- {
- parameters = ((ParametersWithRandom) parameters).Parameters;
- }
-
- if (!(parameters is RsaKeyParameters))
- throw new InvalidKeyException("Not an RSA key");
-
- this.key = (RsaKeyParameters) parameters;
- this.forEncryption = forEncryption;
- this.bitSize = key.Modulus.BitLength;
- }
-
- /**
- * Return the maximum size for an input block to this engine.
- * For RSA this is always one byte less than the key size on
- * encryption, and the same length as the key size on decryption.
- *
- * @return maximum size for an input block.
- */
- public virtual int GetInputBlockSize()
- {
- if (forEncryption)
- {
- return (bitSize - 1) / 8;
- }
-
- return (bitSize + 7) / 8;
- }
-
- /**
- * Return the maximum size for an output block to this engine.
- * For RSA this is always one byte less than the key size on
- * decryption, and the same length as the key size on encryption.
- *
- * @return maximum size for an output block.
- */
- public virtual int GetOutputBlockSize()
- {
- if (forEncryption)
- {
- return (bitSize + 7) / 8;
- }
-
- return (bitSize - 1) / 8;
- }
-
- public virtual BigInteger ConvertInput(
- byte[] inBuf,
- int inOff,
- int inLen)
- {
- int maxLength = (bitSize + 7) / 8;
-
- if (inLen > maxLength)
- throw new DataLengthException("input too large for RSA cipher.");
-
- BigInteger input = new BigInteger(1, inBuf, inOff, inLen);
-
- if (input.CompareTo(key.Modulus) >= 0)
- throw new DataLengthException("input too large for RSA cipher.");
-
- return input;
- }
-
- public virtual byte[] ConvertOutput(
- BigInteger result)
- {
- byte[] output = result.ToByteArrayUnsigned();
-
- if (forEncryption)
- {
- int outSize = GetOutputBlockSize();
-
- // TODO To avoid this, create version of BigInteger.ToByteArray that
- // writes to an existing array
- if (output.Length < outSize) // have ended up with less bytes than normal, lengthen
- {
- byte[] tmp = new byte[outSize];
- output.CopyTo(tmp, tmp.Length - output.Length);
- output = tmp;
- }
- }
-
- return output;
- }
-
- public virtual BigInteger ProcessBlock(
- BigInteger input)
- {
- if (key is RsaPrivateCrtKeyParameters)
- {
- //
- // we have the extra factors, use the Chinese Remainder Theorem - the author
- // wishes to express his thanks to Dirk Bonekaemper at rtsffm.com for
- // advice regarding the expression of this.
- //
- RsaPrivateCrtKeyParameters crtKey = (RsaPrivateCrtKeyParameters)key;
-
- BigInteger p = crtKey.P;
- BigInteger q = crtKey.Q;
- BigInteger dP = crtKey.DP;
- BigInteger dQ = crtKey.DQ;
- BigInteger qInv = crtKey.QInv;
-
- BigInteger mP, mQ, h, m;
-
- // mP = ((input Mod p) ^ dP)) Mod p
- mP = (input.Remainder(p)).ModPow(dP, p);
-
- // mQ = ((input Mod q) ^ dQ)) Mod q
- mQ = (input.Remainder(q)).ModPow(dQ, q);
-
- // h = qInv * (mP - mQ) Mod p
- h = mP.Subtract(mQ);
- h = h.Multiply(qInv);
- h = h.Mod(p); // Mod (in Java) returns the positive residual
-
- // m = h * q + mQ
- m = h.Multiply(q);
- m = m.Add(mQ);
-
- return m;
- }
-
- return input.ModPow(key.Exponent, key.Modulus);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RijndaelEngine.cs b/BCCrypto/src/crypto/engines/RijndaelEngine.cs
deleted file mode 100644
index 7025cb5..0000000
--- a/BCCrypto/src/crypto/engines/RijndaelEngine.cs
+++ /dev/null
@@ -1,738 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * an implementation of Rijndael, based on the documentation and reference implementation
- * by Paulo Barreto, Vincent Rijmen, for v2.0 August '99.
- *
- * Note: this implementation is based on information prior to readonly NIST publication.
- *
- */
- public class RijndaelEngine
- : IBlockCipher
- {
- private static readonly int MAXROUNDS = 14;
-
- private static readonly int MAXKC = (256/4);
-
- private static readonly byte[] Logtable =
- {
- 0, 0, 25, 1, 50, 2, 26, 198,
- 75, 199, 27, 104, 51, 238, 223, 3,
- 100, 4, 224, 14, 52, 141, 129, 239,
- 76, 113, 8, 200, 248, 105, 28, 193,
- 125, 194, 29, 181, 249, 185, 39, 106,
- 77, 228, 166, 114, 154, 201, 9, 120,
- 101, 47, 138, 5, 33, 15, 225, 36,
- 18, 240, 130, 69, 53, 147, 218, 142,
- 150, 143, 219, 189, 54, 208, 206, 148,
- 19, 92, 210, 241, 64, 70, 131, 56,
- 102, 221, 253, 48, 191, 6, 139, 98,
- 179, 37, 226, 152, 34, 136, 145, 16,
- 126, 110, 72, 195, 163, 182, 30, 66,
- 58, 107, 40, 84, 250, 133, 61, 186,
- 43, 121, 10, 21, 155, 159, 94, 202,
- 78, 212, 172, 229, 243, 115, 167, 87,
- 175, 88, 168, 80, 244, 234, 214, 116,
- 79, 174, 233, 213, 231, 230, 173, 232,
- 44, 215, 117, 122, 235, 22, 11, 245,
- 89, 203, 95, 176, 156, 169, 81, 160,
- 127, 12, 246, 111, 23, 196, 73, 236,
- 216, 67, 31, 45, 164, 118, 123, 183,
- 204, 187, 62, 90, 251, 96, 177, 134,
- 59, 82, 161, 108, 170, 85, 41, 157,
- 151, 178, 135, 144, 97, 190, 220, 252,
- 188, 149, 207, 205, 55, 63, 91, 209,
- 83, 57, 132, 60, 65, 162, 109, 71,
- 20, 42, 158, 93, 86, 242, 211, 171,
- 68, 17, 146, 217, 35, 32, 46, 137,
- 180, 124, 184, 38, 119, 153, 227, 165,
- 103, 74, 237, 222, 197, 49, 254, 24,
- 13, 99, 140, 128, 192, 247, 112, 7
- };
-
- private static readonly byte[] Alogtable =
- {
- 0, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19, 53,
- 95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102, 170,
- 229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171, 230, 49,
- 83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178, 205,
- 76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120, 136,
- 131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154,
- 181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163,
- 254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160,
- 251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65,
- 195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117,
- 159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128,
- 155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84,
- 252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202,
- 69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14,
- 18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, 13, 23,
- 57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82, 246, 1,
- 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19, 53,
- 95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102, 170,
- 229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171, 230, 49,
- 83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178, 205,
- 76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120, 136,
- 131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154,
- 181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163,
- 254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160,
- 251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65,
- 195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117,
- 159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128,
- 155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84,
- 252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202,
- 69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14,
- 18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, 13, 23,
- 57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82, 246, 1,
- };
-
- private static readonly byte[] S =
- {
- 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118,
- 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192,
- 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21,
- 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117,
- 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132,
- 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207,
- 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168,
- 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210,
- 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115,
- 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219,
- 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121,
- 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8,
- 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138,
- 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158,
- 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223,
- 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22,
- };
-
- private static readonly byte[] Si =
- {
- 82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251,
- 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203,
- 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78,
- 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37,
- 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146,
- 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132,
- 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6,
- 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107,
- 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115,
- 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110,
- 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27,
- 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244,
- 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95,
- 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239,
- 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97,
- 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125,
- };
-
- private static readonly byte[] rcon =
- {
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
- 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91
- };
-
- static readonly byte[][] shifts0 = new byte [][]
- {
- new byte[]{ 0, 8, 16, 24 },
- new byte[]{ 0, 8, 16, 24 },
- new byte[]{ 0, 8, 16, 24 },
- new byte[]{ 0, 8, 16, 32 },
- new byte[]{ 0, 8, 24, 32 }
- };
-
- static readonly byte[][] shifts1 =
- {
- new byte[]{ 0, 24, 16, 8 },
- new byte[]{ 0, 32, 24, 16 },
- new byte[]{ 0, 40, 32, 24 },
- new byte[]{ 0, 48, 40, 24 },
- new byte[]{ 0, 56, 40, 32 }
- };
-
- /**
- * multiply two elements of GF(2^m)
- * needed for MixColumn and InvMixColumn
- */
- private byte Mul0x2(
- int b)
- {
- if (b != 0)
- {
- return Alogtable[25 + (Logtable[b] & 0xff)];
- }
- else
- {
- return 0;
- }
- }
-
- private byte Mul0x3(
- int b)
- {
- if (b != 0)
- {
- return Alogtable[1 + (Logtable[b] & 0xff)];
- }
- else
- {
- return 0;
- }
- }
-
- private byte Mul0x9(
- int b)
- {
- if (b >= 0)
- {
- return Alogtable[199 + b];
- }
- else
- {
- return 0;
- }
- }
-
- private byte Mul0xb(
- int b)
- {
- if (b >= 0)
- {
- return Alogtable[104 + b];
- }
- else
- {
- return 0;
- }
- }
-
- private byte Mul0xd(
- int b)
- {
- if (b >= 0)
- {
- return Alogtable[238 + b];
- }
- else
- {
- return 0;
- }
- }
-
- private byte Mul0xe(
- int b)
- {
- if (b >= 0)
- {
- return Alogtable[223 + b];
- }
- else
- {
- return 0;
- }
- }
-
- /**
- * xor corresponding text input and round key input bytes
- */
- private void KeyAddition(
- long[] rk)
- {
- A0 ^= rk[0];
- A1 ^= rk[1];
- A2 ^= rk[2];
- A3 ^= rk[3];
- }
-
- private long Shift(
- long r,
- int shift)
- {
- //return (((long)((ulong) r >> shift) | (r << (BC - shift)))) & BC_MASK;
-
- ulong temp = (ulong) r >> shift;
-
- // NB: This corrects for Mono Bug #79087 (fixed in 1.1.17)
- if (shift > 31)
- {
- temp &= 0xFFFFFFFFUL;
- }
-
- return ((long) temp | (r << (BC - shift))) & BC_MASK;
- }
-
- /**
- * Row 0 remains unchanged
- * The other three rows are shifted a variable amount
- */
- private void ShiftRow(
- byte[] shiftsSC)
- {
- A1 = Shift(A1, shiftsSC[1]);
- A2 = Shift(A2, shiftsSC[2]);
- A3 = Shift(A3, shiftsSC[3]);
- }
-
- private long ApplyS(
- long r,
- byte[] box)
- {
- long res = 0;
-
- for (int j = 0; j < BC; j += 8)
- {
- res |= (long)(box[(int)((r >> j) & 0xff)] & 0xff) << j;
- }
-
- return res;
- }
-
- /**
- * Replace every byte of the input by the byte at that place
- * in the nonlinear S-box
- */
- private void Substitution(
- byte[] box)
- {
- A0 = ApplyS(A0, box);
- A1 = ApplyS(A1, box);
- A2 = ApplyS(A2, box);
- A3 = ApplyS(A3, box);
- }
-
- /**
- * Mix the bytes of every column in a linear way
- */
- private void MixColumn()
- {
- long r0, r1, r2, r3;
-
- r0 = r1 = r2 = r3 = 0;
-
- for (int j = 0; j < BC; j += 8)
- {
- int a0 = (int)((A0 >> j) & 0xff);
- int a1 = (int)((A1 >> j) & 0xff);
- int a2 = (int)((A2 >> j) & 0xff);
- int a3 = (int)((A3 >> j) & 0xff);
-
- r0 |= (long)((Mul0x2(a0) ^ Mul0x3(a1) ^ a2 ^ a3) & 0xff) << j;
-
- r1 |= (long)((Mul0x2(a1) ^ Mul0x3(a2) ^ a3 ^ a0) & 0xff) << j;
-
- r2 |= (long)((Mul0x2(a2) ^ Mul0x3(a3) ^ a0 ^ a1) & 0xff) << j;
-
- r3 |= (long)((Mul0x2(a3) ^ Mul0x3(a0) ^ a1 ^ a2) & 0xff) << j;
- }
-
- A0 = r0;
- A1 = r1;
- A2 = r2;
- A3 = r3;
- }
-
- /**
- * Mix the bytes of every column in a linear way
- * This is the opposite operation of Mixcolumn
- */
- private void InvMixColumn()
- {
- long r0, r1, r2, r3;
-
- r0 = r1 = r2 = r3 = 0;
- for (int j = 0; j < BC; j += 8)
- {
- int a0 = (int)((A0 >> j) & 0xff);
- int a1 = (int)((A1 >> j) & 0xff);
- int a2 = (int)((A2 >> j) & 0xff);
- int a3 = (int)((A3 >> j) & 0xff);
-
- //
- // pre-lookup the log table
- //
- a0 = (a0 != 0) ? (Logtable[a0 & 0xff] & 0xff) : -1;
- a1 = (a1 != 0) ? (Logtable[a1 & 0xff] & 0xff) : -1;
- a2 = (a2 != 0) ? (Logtable[a2 & 0xff] & 0xff) : -1;
- a3 = (a3 != 0) ? (Logtable[a3 & 0xff] & 0xff) : -1;
-
- r0 |= (long)((Mul0xe(a0) ^ Mul0xb(a1) ^ Mul0xd(a2) ^ Mul0x9(a3)) & 0xff) << j;
-
- r1 |= (long)((Mul0xe(a1) ^ Mul0xb(a2) ^ Mul0xd(a3) ^ Mul0x9(a0)) & 0xff) << j;
-
- r2 |= (long)((Mul0xe(a2) ^ Mul0xb(a3) ^ Mul0xd(a0) ^ Mul0x9(a1)) & 0xff) << j;
-
- r3 |= (long)((Mul0xe(a3) ^ Mul0xb(a0) ^ Mul0xd(a1) ^ Mul0x9(a2)) & 0xff) << j;
- }
-
- A0 = r0;
- A1 = r1;
- A2 = r2;
- A3 = r3;
- }
-
- /**
- * Calculate the necessary round keys
- * The number of calculations depends on keyBits and blockBits
- */
- private long[][] GenerateWorkingKey(
- byte[] key)
- {
- int KC;
- int t, rconpointer = 0;
- int keyBits = key.Length * 8;
- byte[,] tk = new byte[4,MAXKC];
- //long[,] W = new long[MAXROUNDS+1,4];
- long[][] W = new long[MAXROUNDS+1][];
-
- for (int i = 0; i < MAXROUNDS+1; i++) W[i] = new long[4];
-
- switch (keyBits)
- {
- case 128:
- KC = 4;
- break;
- case 160:
- KC = 5;
- break;
- case 192:
- KC = 6;
- break;
- case 224:
- KC = 7;
- break;
- case 256:
- KC = 8;
- break;
- default :
- throw new ArgumentException("Key length not 128/160/192/224/256 bits.");
- }
-
- if (keyBits >= blockBits)
- {
- ROUNDS = KC + 6;
- }
- else
- {
- ROUNDS = (BC / 8) + 6;
- }
-
- //
- // copy the key into the processing area
- //
- int index = 0;
-
- for (int i = 0; i < key.Length; i++)
- {
- tk[i % 4,i / 4] = key[index++];
- }
-
- t = 0;
-
- //
- // copy values into round key array
- //
- for (int j = 0; (j < KC) && (t < (ROUNDS+1)*(BC / 8)); j++, t++)
- {
- for (int i = 0; i < 4; i++)
- {
- W[t / (BC / 8)][i] |= (long)(tk[i,j] & 0xff) << ((t * 8) % BC);
- }
- }
-
- //
- // while not enough round key material calculated
- // calculate new values
- //
- while (t < (ROUNDS+1)*(BC/8))
- {
- for (int i = 0; i < 4; i++)
- {
- tk[i,0] ^= S[tk[(i+1)%4,KC-1] & 0xff];
- }
- tk[0,0] ^= (byte) rcon[rconpointer++];
-
- if (KC <= 6)
- {
- for (int j = 1; j < KC; j++)
- {
- for (int i = 0; i < 4; i++)
- {
- tk[i,j] ^= tk[i,j-1];
- }
- }
- }
- else
- {
- for (int j = 1; j < 4; j++)
- {
- for (int i = 0; i < 4; i++)
- {
- tk[i,j] ^= tk[i,j-1];
- }
- }
- for (int i = 0; i < 4; i++)
- {
- tk[i,4] ^= S[tk[i,3] & 0xff];
- }
- for (int j = 5; j < KC; j++)
- {
- for (int i = 0; i < 4; i++)
- {
- tk[i,j] ^= tk[i,j-1];
- }
- }
- }
-
- //
- // copy values into round key array
- //
- for (int j = 0; (j < KC) && (t < (ROUNDS+1)*(BC/8)); j++, t++)
- {
- for (int i = 0; i < 4; i++)
- {
- W[t / (BC/8)][i] |= (long)(tk[i,j] & 0xff) << ((t * 8) % (BC));
- }
- }
- }
- return W;
- }
-
- private int BC;
- private long BC_MASK;
- private int ROUNDS;
- private int blockBits;
- private long[][] workingKey;
- private long A0, A1, A2, A3;
- private bool forEncryption;
- private byte[] shifts0SC;
- private byte[] shifts1SC;
-
- /**
- * default constructor - 128 bit block size.
- */
- public RijndaelEngine() : this(128) {}
-
- /**
- * basic constructor - set the cipher up for a given blocksize
- *
- * @param blocksize the blocksize in bits, must be 128, 192, or 256.
- */
- public RijndaelEngine(
- int blockBits)
- {
- switch (blockBits)
- {
- case 128:
- BC = 32;
- BC_MASK = 0xffffffffL;
- shifts0SC = shifts0[0];
- shifts1SC = shifts1[0];
- break;
- case 160:
- BC = 40;
- BC_MASK = 0xffffffffffL;
- shifts0SC = shifts0[1];
- shifts1SC = shifts1[1];
- break;
- case 192:
- BC = 48;
- BC_MASK = 0xffffffffffffL;
- shifts0SC = shifts0[2];
- shifts1SC = shifts1[2];
- break;
- case 224:
- BC = 56;
- BC_MASK = 0xffffffffffffffL;
- shifts0SC = shifts0[3];
- shifts1SC = shifts1[3];
- break;
- case 256:
- BC = 64;
- BC_MASK = unchecked( (long)0xffffffffffffffffL);
- shifts0SC = shifts0[4];
- shifts1SC = shifts1[4];
- break;
- default:
- throw new ArgumentException("unknown blocksize to Rijndael");
- }
-
- this.blockBits = blockBits;
- }
-
- /**
- * initialise a Rijndael cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (typeof(KeyParameter).IsInstanceOfType(parameters))
- {
- workingKey = GenerateWorkingKey(((KeyParameter)parameters).GetKey());
- this.forEncryption = forEncryption;
- return;
- }
-
- throw new ArgumentException("invalid parameter passed to Rijndael init - " + Platform.GetTypeName(parameters));
- }
-
- public virtual string AlgorithmName
- {
- get { return "Rijndael"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BC / 2;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (workingKey == null)
- throw new InvalidOperationException("Rijndael engine not initialised");
-
- Check.DataLength(input, inOff, (BC / 2), "input buffer too short");
- Check.OutputLength(output, outOff, (BC / 2), "output buffer too short");
-
- UnPackBlock(input, inOff);
-
- if (forEncryption)
- {
- EncryptBlock(workingKey);
- }
- else
- {
- DecryptBlock(workingKey);
- }
-
- PackBlock(output, outOff);
-
- return BC / 2;
- }
-
- public virtual void Reset()
- {
- }
-
- private void UnPackBlock(
- byte[] bytes,
- int off)
- {
- int index = off;
-
- A0 = (long)(bytes[index++] & 0xff);
- A1 = (long)(bytes[index++] & 0xff);
- A2 = (long)(bytes[index++] & 0xff);
- A3 = (long)(bytes[index++] & 0xff);
-
- for (int j = 8; j != BC; j += 8)
- {
- A0 |= (long)(bytes[index++] & 0xff) << j;
- A1 |= (long)(bytes[index++] & 0xff) << j;
- A2 |= (long)(bytes[index++] & 0xff) << j;
- A3 |= (long)(bytes[index++] & 0xff) << j;
- }
- }
-
- private void PackBlock(
- byte[] bytes,
- int off)
- {
- int index = off;
-
- for (int j = 0; j != BC; j += 8)
- {
- bytes[index++] = (byte)(A0 >> j);
- bytes[index++] = (byte)(A1 >> j);
- bytes[index++] = (byte)(A2 >> j);
- bytes[index++] = (byte)(A3 >> j);
- }
- }
-
- private void EncryptBlock(
- long[][] rk)
- {
- int r;
-
- //
- // begin with a key addition
- //
- KeyAddition(rk[0]);
-
- //
- // ROUNDS-1 ordinary rounds
- //
- for (r = 1; r < ROUNDS; r++)
- {
- Substitution(S);
- ShiftRow(shifts0SC);
- MixColumn();
- KeyAddition(rk[r]);
- }
-
- //
- // Last round is special: there is no MixColumn
- //
- Substitution(S);
- ShiftRow(shifts0SC);
- KeyAddition(rk[ROUNDS]);
- }
-
- private void DecryptBlock(
- long[][] rk)
- {
- int r;
-
- // To decrypt: apply the inverse operations of the encrypt routine,
- // in opposite order
- //
- // (KeyAddition is an involution: it 's equal to its inverse)
- // (the inverse of Substitution with table S is Substitution with the inverse table of S)
- // (the inverse of Shiftrow is Shiftrow over a suitable distance)
- //
-
- // First the special round:
- // without InvMixColumn
- // with extra KeyAddition
- //
- KeyAddition(rk[ROUNDS]);
- Substitution(Si);
- ShiftRow(shifts1SC);
-
- //
- // ROUNDS-1 ordinary rounds
- //
- for (r = ROUNDS-1; r > 0; r--)
- {
- KeyAddition(rk[r]);
- InvMixColumn();
- Substitution(Si);
- ShiftRow(shifts1SC);
- }
-
- //
- // End with the extra key addition
- //
- KeyAddition(rk[0]);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/RsaEngine.cs b/BCCrypto/src/crypto/engines/RsaEngine.cs
deleted file mode 100644
index 4399b44..0000000
--- a/BCCrypto/src/crypto/engines/RsaEngine.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * this does your basic RSA algorithm.
- */
- public class RsaEngine
- : IAsymmetricBlockCipher
- {
- private RsaCoreEngine core;
-
- public virtual string AlgorithmName
- {
- get { return "RSA"; }
- }
-
- /**
- * initialise the RSA engine.
- *
- * @param forEncryption true if we are encrypting, false otherwise.
- * @param param the necessary RSA key parameters.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (core == null)
- core = new RsaCoreEngine();
-
- core.Init(forEncryption, parameters);
- }
-
- /**
- * Return the maximum size for an input block to this engine.
- * For RSA this is always one byte less than the key size on
- * encryption, and the same length as the key size on decryption.
- *
- * @return maximum size for an input block.
- */
- public virtual int GetInputBlockSize()
- {
- return core.GetInputBlockSize();
- }
-
- /**
- * Return the maximum size for an output block to this engine.
- * For RSA this is always one byte less than the key size on
- * decryption, and the same length as the key size on encryption.
- *
- * @return maximum size for an output block.
- */
- public virtual int GetOutputBlockSize()
- {
- return core.GetOutputBlockSize();
- }
-
- /**
- * Process a single block using the basic RSA algorithm.
- *
- * @param inBuf the input array.
- * @param inOff the offset into the input buffer where the data starts.
- * @param inLen the length of the data to be processed.
- * @return the result of the RSA process.
- * @exception DataLengthException the input block is too large.
- */
- public virtual byte[] ProcessBlock(
- byte[] inBuf,
- int inOff,
- int inLen)
- {
- if (core == null)
- throw new InvalidOperationException("RSA engine not initialised");
-
- return core.ConvertOutput(core.ProcessBlock(core.ConvertInput(inBuf, inOff, inLen)));
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/SEEDEngine.cs b/BCCrypto/src/crypto/engines/SEEDEngine.cs
deleted file mode 100644
index f615b84..0000000
--- a/BCCrypto/src/crypto/engines/SEEDEngine.cs
+++ /dev/null
@@ -1,360 +0,0 @@
-using System;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * Implementation of the SEED algorithm as described in RFC 4009
- */
- public class SeedEngine
- : IBlockCipher
- {
- private const int BlockSize = 16;
-
- private static readonly uint[] SS0 =
- {
- 0x2989a1a8, 0x05858184, 0x16c6d2d4, 0x13c3d3d0, 0x14445054, 0x1d0d111c, 0x2c8ca0ac, 0x25052124,
- 0x1d4d515c, 0x03434340, 0x18081018, 0x1e0e121c, 0x11415150, 0x3cccf0fc, 0x0acac2c8, 0x23436360,
- 0x28082028, 0x04444044, 0x20002020, 0x1d8d919c, 0x20c0e0e0, 0x22c2e2e0, 0x08c8c0c8, 0x17071314,
- 0x2585a1a4, 0x0f8f838c, 0x03030300, 0x3b4b7378, 0x3b8bb3b8, 0x13031310, 0x12c2d2d0, 0x2ecee2ec,
- 0x30407070, 0x0c8c808c, 0x3f0f333c, 0x2888a0a8, 0x32023230, 0x1dcdd1dc, 0x36c6f2f4, 0x34447074,
- 0x2ccce0ec, 0x15859194, 0x0b0b0308, 0x17475354, 0x1c4c505c, 0x1b4b5358, 0x3d8db1bc, 0x01010100,
- 0x24042024, 0x1c0c101c, 0x33437370, 0x18889098, 0x10001010, 0x0cccc0cc, 0x32c2f2f0, 0x19c9d1d8,
- 0x2c0c202c, 0x27c7e3e4, 0x32427270, 0x03838380, 0x1b8b9398, 0x11c1d1d0, 0x06868284, 0x09c9c1c8,
- 0x20406060, 0x10405050, 0x2383a3a0, 0x2bcbe3e8, 0x0d0d010c, 0x3686b2b4, 0x1e8e929c, 0x0f4f434c,
- 0x3787b3b4, 0x1a4a5258, 0x06c6c2c4, 0x38487078, 0x2686a2a4, 0x12021210, 0x2f8fa3ac, 0x15c5d1d4,
- 0x21416160, 0x03c3c3c0, 0x3484b0b4, 0x01414140, 0x12425250, 0x3d4d717c, 0x0d8d818c, 0x08080008,
- 0x1f0f131c, 0x19899198, 0x00000000, 0x19091118, 0x04040004, 0x13435350, 0x37c7f3f4, 0x21c1e1e0,
- 0x3dcdf1fc, 0x36467274, 0x2f0f232c, 0x27072324, 0x3080b0b0, 0x0b8b8388, 0x0e0e020c, 0x2b8ba3a8,
- 0x2282a2a0, 0x2e4e626c, 0x13839390, 0x0d4d414c, 0x29496168, 0x3c4c707c, 0x09090108, 0x0a0a0208,
- 0x3f8fb3bc, 0x2fcfe3ec, 0x33c3f3f0, 0x05c5c1c4, 0x07878384, 0x14041014, 0x3ecef2fc, 0x24446064,
- 0x1eced2dc, 0x2e0e222c, 0x0b4b4348, 0x1a0a1218, 0x06060204, 0x21012120, 0x2b4b6368, 0x26466264,
- 0x02020200, 0x35c5f1f4, 0x12829290, 0x0a8a8288, 0x0c0c000c, 0x3383b3b0, 0x3e4e727c, 0x10c0d0d0,
- 0x3a4a7278, 0x07474344, 0x16869294, 0x25c5e1e4, 0x26062224, 0x00808080, 0x2d8da1ac, 0x1fcfd3dc,
- 0x2181a1a0, 0x30003030, 0x37073334, 0x2e8ea2ac, 0x36063234, 0x15051114, 0x22022220, 0x38083038,
- 0x34c4f0f4, 0x2787a3a4, 0x05454144, 0x0c4c404c, 0x01818180, 0x29c9e1e8, 0x04848084, 0x17879394,
- 0x35053134, 0x0bcbc3c8, 0x0ecec2cc, 0x3c0c303c, 0x31417170, 0x11011110, 0x07c7c3c4, 0x09898188,
- 0x35457174, 0x3bcbf3f8, 0x1acad2d8, 0x38c8f0f8, 0x14849094, 0x19495158, 0x02828280, 0x04c4c0c4,
- 0x3fcff3fc, 0x09494148, 0x39093138, 0x27476364, 0x00c0c0c0, 0x0fcfc3cc, 0x17c7d3d4, 0x3888b0b8,
- 0x0f0f030c, 0x0e8e828c, 0x02424240, 0x23032320, 0x11819190, 0x2c4c606c, 0x1bcbd3d8, 0x2484a0a4,
- 0x34043034, 0x31c1f1f0, 0x08484048, 0x02c2c2c0, 0x2f4f636c, 0x3d0d313c, 0x2d0d212c, 0x00404040,
- 0x3e8eb2bc, 0x3e0e323c, 0x3c8cb0bc, 0x01c1c1c0, 0x2a8aa2a8, 0x3a8ab2b8, 0x0e4e424c, 0x15455154,
- 0x3b0b3338, 0x1cccd0dc, 0x28486068, 0x3f4f737c, 0x1c8c909c, 0x18c8d0d8, 0x0a4a4248, 0x16465254,
- 0x37477374, 0x2080a0a0, 0x2dcde1ec, 0x06464244, 0x3585b1b4, 0x2b0b2328, 0x25456164, 0x3acaf2f8,
- 0x23c3e3e0, 0x3989b1b8, 0x3181b1b0, 0x1f8f939c, 0x1e4e525c, 0x39c9f1f8, 0x26c6e2e4, 0x3282b2b0,
- 0x31013130, 0x2acae2e8, 0x2d4d616c, 0x1f4f535c, 0x24c4e0e4, 0x30c0f0f0, 0x0dcdc1cc, 0x08888088,
- 0x16061214, 0x3a0a3238, 0x18485058, 0x14c4d0d4, 0x22426260, 0x29092128, 0x07070304, 0x33033330,
- 0x28c8e0e8, 0x1b0b1318, 0x05050104, 0x39497178, 0x10809090, 0x2a4a6268, 0x2a0a2228, 0x1a8a9298
- };
-
- private static readonly uint[] SS1 =
- {
- 0x38380830, 0xe828c8e0, 0x2c2d0d21, 0xa42686a2, 0xcc0fcfc3, 0xdc1eced2, 0xb03383b3, 0xb83888b0,
- 0xac2f8fa3, 0x60204060, 0x54154551, 0xc407c7c3, 0x44044440, 0x6c2f4f63, 0x682b4b63, 0x581b4b53,
- 0xc003c3c3, 0x60224262, 0x30330333, 0xb43585b1, 0x28290921, 0xa02080a0, 0xe022c2e2, 0xa42787a3,
- 0xd013c3d3, 0x90118191, 0x10110111, 0x04060602, 0x1c1c0c10, 0xbc3c8cb0, 0x34360632, 0x480b4b43,
- 0xec2fcfe3, 0x88088880, 0x6c2c4c60, 0xa82888a0, 0x14170713, 0xc404c4c0, 0x14160612, 0xf434c4f0,
- 0xc002c2c2, 0x44054541, 0xe021c1e1, 0xd416c6d2, 0x3c3f0f33, 0x3c3d0d31, 0x8c0e8e82, 0x98188890,
- 0x28280820, 0x4c0e4e42, 0xf436c6f2, 0x3c3e0e32, 0xa42585a1, 0xf839c9f1, 0x0c0d0d01, 0xdc1fcfd3,
- 0xd818c8d0, 0x282b0b23, 0x64264662, 0x783a4a72, 0x24270723, 0x2c2f0f23, 0xf031c1f1, 0x70324272,
- 0x40024242, 0xd414c4d0, 0x40014141, 0xc000c0c0, 0x70334373, 0x64274763, 0xac2c8ca0, 0x880b8b83,
- 0xf437c7f3, 0xac2d8da1, 0x80008080, 0x1c1f0f13, 0xc80acac2, 0x2c2c0c20, 0xa82a8aa2, 0x34340430,
- 0xd012c2d2, 0x080b0b03, 0xec2ecee2, 0xe829c9e1, 0x5c1d4d51, 0x94148490, 0x18180810, 0xf838c8f0,
- 0x54174753, 0xac2e8ea2, 0x08080800, 0xc405c5c1, 0x10130313, 0xcc0dcdc1, 0x84068682, 0xb83989b1,
- 0xfc3fcff3, 0x7c3d4d71, 0xc001c1c1, 0x30310131, 0xf435c5f1, 0x880a8a82, 0x682a4a62, 0xb03181b1,
- 0xd011c1d1, 0x20200020, 0xd417c7d3, 0x00020202, 0x20220222, 0x04040400, 0x68284860, 0x70314171,
- 0x04070703, 0xd81bcbd3, 0x9c1d8d91, 0x98198991, 0x60214161, 0xbc3e8eb2, 0xe426c6e2, 0x58194951,
- 0xdc1dcdd1, 0x50114151, 0x90108090, 0xdc1cccd0, 0x981a8a92, 0xa02383a3, 0xa82b8ba3, 0xd010c0d0,
- 0x80018181, 0x0c0f0f03, 0x44074743, 0x181a0a12, 0xe023c3e3, 0xec2ccce0, 0x8c0d8d81, 0xbc3f8fb3,
- 0x94168692, 0x783b4b73, 0x5c1c4c50, 0xa02282a2, 0xa02181a1, 0x60234363, 0x20230323, 0x4c0d4d41,
- 0xc808c8c0, 0x9c1e8e92, 0x9c1c8c90, 0x383a0a32, 0x0c0c0c00, 0x2c2e0e22, 0xb83a8ab2, 0x6c2e4e62,
- 0x9c1f8f93, 0x581a4a52, 0xf032c2f2, 0x90128292, 0xf033c3f3, 0x48094941, 0x78384870, 0xcc0cccc0,
- 0x14150511, 0xf83bcbf3, 0x70304070, 0x74354571, 0x7c3f4f73, 0x34350531, 0x10100010, 0x00030303,
- 0x64244460, 0x6c2d4d61, 0xc406c6c2, 0x74344470, 0xd415c5d1, 0xb43484b0, 0xe82acae2, 0x08090901,
- 0x74364672, 0x18190911, 0xfc3ecef2, 0x40004040, 0x10120212, 0xe020c0e0, 0xbc3d8db1, 0x04050501,
- 0xf83acaf2, 0x00010101, 0xf030c0f0, 0x282a0a22, 0x5c1e4e52, 0xa82989a1, 0x54164652, 0x40034343,
- 0x84058581, 0x14140410, 0x88098981, 0x981b8b93, 0xb03080b0, 0xe425c5e1, 0x48084840, 0x78394971,
- 0x94178793, 0xfc3cccf0, 0x1c1e0e12, 0x80028282, 0x20210121, 0x8c0c8c80, 0x181b0b13, 0x5c1f4f53,
- 0x74374773, 0x54144450, 0xb03282b2, 0x1c1d0d11, 0x24250521, 0x4c0f4f43, 0x00000000, 0x44064642,
- 0xec2dcde1, 0x58184850, 0x50124252, 0xe82bcbe3, 0x7c3e4e72, 0xd81acad2, 0xc809c9c1, 0xfc3dcdf1,
- 0x30300030, 0x94158591, 0x64254561, 0x3c3c0c30, 0xb43686b2, 0xe424c4e0, 0xb83b8bb3, 0x7c3c4c70,
- 0x0c0e0e02, 0x50104050, 0x38390931, 0x24260622, 0x30320232, 0x84048480, 0x68294961, 0x90138393,
- 0x34370733, 0xe427c7e3, 0x24240420, 0xa42484a0, 0xc80bcbc3, 0x50134353, 0x080a0a02, 0x84078783,
- 0xd819c9d1, 0x4c0c4c40, 0x80038383, 0x8c0f8f83, 0xcc0ecec2, 0x383b0b33, 0x480a4a42, 0xb43787b3
- };
-
- private static readonly uint[] SS2 =
- {
-
- 0xa1a82989, 0x81840585, 0xd2d416c6, 0xd3d013c3, 0x50541444, 0x111c1d0d, 0xa0ac2c8c, 0x21242505,
- 0x515c1d4d, 0x43400343, 0x10181808, 0x121c1e0e, 0x51501141, 0xf0fc3ccc, 0xc2c80aca, 0x63602343,
- 0x20282808, 0x40440444, 0x20202000, 0x919c1d8d, 0xe0e020c0, 0xe2e022c2, 0xc0c808c8, 0x13141707,
- 0xa1a42585, 0x838c0f8f, 0x03000303, 0x73783b4b, 0xb3b83b8b, 0x13101303, 0xd2d012c2, 0xe2ec2ece,
- 0x70703040, 0x808c0c8c, 0x333c3f0f, 0xa0a82888, 0x32303202, 0xd1dc1dcd, 0xf2f436c6, 0x70743444,
- 0xe0ec2ccc, 0x91941585, 0x03080b0b, 0x53541747, 0x505c1c4c, 0x53581b4b, 0xb1bc3d8d, 0x01000101,
- 0x20242404, 0x101c1c0c, 0x73703343, 0x90981888, 0x10101000, 0xc0cc0ccc, 0xf2f032c2, 0xd1d819c9,
- 0x202c2c0c, 0xe3e427c7, 0x72703242, 0x83800383, 0x93981b8b, 0xd1d011c1, 0x82840686, 0xc1c809c9,
- 0x60602040, 0x50501040, 0xa3a02383, 0xe3e82bcb, 0x010c0d0d, 0xb2b43686, 0x929c1e8e, 0x434c0f4f,
- 0xb3b43787, 0x52581a4a, 0xc2c406c6, 0x70783848, 0xa2a42686, 0x12101202, 0xa3ac2f8f, 0xd1d415c5,
- 0x61602141, 0xc3c003c3, 0xb0b43484, 0x41400141, 0x52501242, 0x717c3d4d, 0x818c0d8d, 0x00080808,
- 0x131c1f0f, 0x91981989, 0x00000000, 0x11181909, 0x00040404, 0x53501343, 0xf3f437c7, 0xe1e021c1,
- 0xf1fc3dcd, 0x72743646, 0x232c2f0f, 0x23242707, 0xb0b03080, 0x83880b8b, 0x020c0e0e, 0xa3a82b8b,
- 0xa2a02282, 0x626c2e4e, 0x93901383, 0x414c0d4d, 0x61682949, 0x707c3c4c, 0x01080909, 0x02080a0a,
- 0xb3bc3f8f, 0xe3ec2fcf, 0xf3f033c3, 0xc1c405c5, 0x83840787, 0x10141404, 0xf2fc3ece, 0x60642444,
- 0xd2dc1ece, 0x222c2e0e, 0x43480b4b, 0x12181a0a, 0x02040606, 0x21202101, 0x63682b4b, 0x62642646,
- 0x02000202, 0xf1f435c5, 0x92901282, 0x82880a8a, 0x000c0c0c, 0xb3b03383, 0x727c3e4e, 0xd0d010c0,
- 0x72783a4a, 0x43440747, 0x92941686, 0xe1e425c5, 0x22242606, 0x80800080, 0xa1ac2d8d, 0xd3dc1fcf,
- 0xa1a02181, 0x30303000, 0x33343707, 0xa2ac2e8e, 0x32343606, 0x11141505, 0x22202202, 0x30383808,
- 0xf0f434c4, 0xa3a42787, 0x41440545, 0x404c0c4c, 0x81800181, 0xe1e829c9, 0x80840484, 0x93941787,
- 0x31343505, 0xc3c80bcb, 0xc2cc0ece, 0x303c3c0c, 0x71703141, 0x11101101, 0xc3c407c7, 0x81880989,
- 0x71743545, 0xf3f83bcb, 0xd2d81aca, 0xf0f838c8, 0x90941484, 0x51581949, 0x82800282, 0xc0c404c4,
- 0xf3fc3fcf, 0x41480949, 0x31383909, 0x63642747, 0xc0c000c0, 0xc3cc0fcf, 0xd3d417c7, 0xb0b83888,
- 0x030c0f0f, 0x828c0e8e, 0x42400242, 0x23202303, 0x91901181, 0x606c2c4c, 0xd3d81bcb, 0xa0a42484,
- 0x30343404, 0xf1f031c1, 0x40480848, 0xc2c002c2, 0x636c2f4f, 0x313c3d0d, 0x212c2d0d, 0x40400040,
- 0xb2bc3e8e, 0x323c3e0e, 0xb0bc3c8c, 0xc1c001c1, 0xa2a82a8a, 0xb2b83a8a, 0x424c0e4e, 0x51541545,
- 0x33383b0b, 0xd0dc1ccc, 0x60682848, 0x737c3f4f, 0x909c1c8c, 0xd0d818c8, 0x42480a4a, 0x52541646,
- 0x73743747, 0xa0a02080, 0xe1ec2dcd, 0x42440646, 0xb1b43585, 0x23282b0b, 0x61642545, 0xf2f83aca,
- 0xe3e023c3, 0xb1b83989, 0xb1b03181, 0x939c1f8f, 0x525c1e4e, 0xf1f839c9, 0xe2e426c6, 0xb2b03282,
- 0x31303101, 0xe2e82aca, 0x616c2d4d, 0x535c1f4f, 0xe0e424c4, 0xf0f030c0, 0xc1cc0dcd, 0x80880888,
- 0x12141606, 0x32383a0a, 0x50581848, 0xd0d414c4, 0x62602242, 0x21282909, 0x03040707, 0x33303303,
- 0xe0e828c8, 0x13181b0b, 0x01040505, 0x71783949, 0x90901080, 0x62682a4a, 0x22282a0a, 0x92981a8a
- };
-
- private static readonly uint[] SS3 =
- {
-
- 0x08303838, 0xc8e0e828, 0x0d212c2d, 0x86a2a426, 0xcfc3cc0f, 0xced2dc1e, 0x83b3b033, 0x88b0b838,
- 0x8fa3ac2f, 0x40606020, 0x45515415, 0xc7c3c407, 0x44404404, 0x4f636c2f, 0x4b63682b, 0x4b53581b,
- 0xc3c3c003, 0x42626022, 0x03333033, 0x85b1b435, 0x09212829, 0x80a0a020, 0xc2e2e022, 0x87a3a427,
- 0xc3d3d013, 0x81919011, 0x01111011, 0x06020406, 0x0c101c1c, 0x8cb0bc3c, 0x06323436, 0x4b43480b,
- 0xcfe3ec2f, 0x88808808, 0x4c606c2c, 0x88a0a828, 0x07131417, 0xc4c0c404, 0x06121416, 0xc4f0f434,
- 0xc2c2c002, 0x45414405, 0xc1e1e021, 0xc6d2d416, 0x0f333c3f, 0x0d313c3d, 0x8e828c0e, 0x88909818,
- 0x08202828, 0x4e424c0e, 0xc6f2f436, 0x0e323c3e, 0x85a1a425, 0xc9f1f839, 0x0d010c0d, 0xcfd3dc1f,
- 0xc8d0d818, 0x0b23282b, 0x46626426, 0x4a72783a, 0x07232427, 0x0f232c2f, 0xc1f1f031, 0x42727032,
- 0x42424002, 0xc4d0d414, 0x41414001, 0xc0c0c000, 0x43737033, 0x47636427, 0x8ca0ac2c, 0x8b83880b,
- 0xc7f3f437, 0x8da1ac2d, 0x80808000, 0x0f131c1f, 0xcac2c80a, 0x0c202c2c, 0x8aa2a82a, 0x04303434,
- 0xc2d2d012, 0x0b03080b, 0xcee2ec2e, 0xc9e1e829, 0x4d515c1d, 0x84909414, 0x08101818, 0xc8f0f838,
- 0x47535417, 0x8ea2ac2e, 0x08000808, 0xc5c1c405, 0x03131013, 0xcdc1cc0d, 0x86828406, 0x89b1b839,
- 0xcff3fc3f, 0x4d717c3d, 0xc1c1c001, 0x01313031, 0xc5f1f435, 0x8a82880a, 0x4a62682a, 0x81b1b031,
- 0xc1d1d011, 0x00202020, 0xc7d3d417, 0x02020002, 0x02222022, 0x04000404, 0x48606828, 0x41717031,
- 0x07030407, 0xcbd3d81b, 0x8d919c1d, 0x89919819, 0x41616021, 0x8eb2bc3e, 0xc6e2e426, 0x49515819,
- 0xcdd1dc1d, 0x41515011, 0x80909010, 0xccd0dc1c, 0x8a92981a, 0x83a3a023, 0x8ba3a82b, 0xc0d0d010,
- 0x81818001, 0x0f030c0f, 0x47434407, 0x0a12181a, 0xc3e3e023, 0xcce0ec2c, 0x8d818c0d, 0x8fb3bc3f,
- 0x86929416, 0x4b73783b, 0x4c505c1c, 0x82a2a022, 0x81a1a021, 0x43636023, 0x03232023, 0x4d414c0d,
- 0xc8c0c808, 0x8e929c1e, 0x8c909c1c, 0x0a32383a, 0x0c000c0c, 0x0e222c2e, 0x8ab2b83a, 0x4e626c2e,
- 0x8f939c1f, 0x4a52581a, 0xc2f2f032, 0x82929012, 0xc3f3f033, 0x49414809, 0x48707838, 0xccc0cc0c,
- 0x05111415, 0xcbf3f83b, 0x40707030, 0x45717435, 0x4f737c3f, 0x05313435, 0x00101010, 0x03030003,
- 0x44606424, 0x4d616c2d, 0xc6c2c406, 0x44707434, 0xc5d1d415, 0x84b0b434, 0xcae2e82a, 0x09010809,
- 0x46727436, 0x09111819, 0xcef2fc3e, 0x40404000, 0x02121012, 0xc0e0e020, 0x8db1bc3d, 0x05010405,
- 0xcaf2f83a, 0x01010001, 0xc0f0f030, 0x0a22282a, 0x4e525c1e, 0x89a1a829, 0x46525416, 0x43434003,
- 0x85818405, 0x04101414, 0x89818809, 0x8b93981b, 0x80b0b030, 0xc5e1e425, 0x48404808, 0x49717839,
- 0x87939417, 0xccf0fc3c, 0x0e121c1e, 0x82828002, 0x01212021, 0x8c808c0c, 0x0b13181b, 0x4f535c1f,
- 0x47737437, 0x44505414, 0x82b2b032, 0x0d111c1d, 0x05212425, 0x4f434c0f, 0x00000000, 0x46424406,
- 0xcde1ec2d, 0x48505818, 0x42525012, 0xcbe3e82b, 0x4e727c3e, 0xcad2d81a, 0xc9c1c809, 0xcdf1fc3d,
- 0x00303030, 0x85919415, 0x45616425, 0x0c303c3c, 0x86b2b436, 0xc4e0e424, 0x8bb3b83b, 0x4c707c3c,
- 0x0e020c0e, 0x40505010, 0x09313839, 0x06222426, 0x02323032, 0x84808404, 0x49616829, 0x83939013,
- 0x07333437, 0xc7e3e427, 0x04202424, 0x84a0a424, 0xcbc3c80b, 0x43535013, 0x0a02080a, 0x87838407,
- 0xc9d1d819, 0x4c404c0c, 0x83838003, 0x8f838c0f, 0xcec2cc0e, 0x0b33383b, 0x4a42480a, 0x87b3b437
- };
-
- private static readonly uint[] KC =
- {
- 0x9e3779b9, 0x3c6ef373, 0x78dde6e6, 0xf1bbcdcc,
- 0xe3779b99, 0xc6ef3733, 0x8dde6e67, 0x1bbcdccf,
- 0x3779b99e, 0x6ef3733c, 0xdde6e678, 0xbbcdccf1,
- 0x779b99e3, 0xef3733c6, 0xde6e678d, 0xbcdccf1b
- };
-
- private int[] wKey;
- private bool forEncryption;
-
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- this.forEncryption = forEncryption;
- wKey = createWorkingKey(((KeyParameter)parameters).GetKey());
- }
-
- public virtual string AlgorithmName
- {
- get { return "SEED"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BlockSize;
- }
-
- public virtual int ProcessBlock(
- byte[] inBuf,
- int inOff,
- byte[] outBuf,
- int outOff)
- {
- if (wKey == null)
- throw new InvalidOperationException("SEED engine not initialised");
-
- Check.DataLength(inBuf, inOff, BlockSize, "input buffer too short");
- Check.OutputLength(outBuf, outOff, BlockSize, "output buffer too short");
-
- long l = bytesToLong(inBuf, inOff + 0);
- long r = bytesToLong(inBuf, inOff + 8);
-
- if (forEncryption)
- {
- for (int i = 0; i < 16; i++)
- {
- long nl = r;
-
- r = l ^ F(wKey[2 * i], wKey[(2 * i) + 1], r);
- l = nl;
- }
- }
- else
- {
- for (int i = 15; i >= 0; i--)
- {
- long nl = r;
-
- r = l ^ F(wKey[2 * i], wKey[(2 * i) + 1], r);
- l = nl;
- }
- }
-
- longToBytes(outBuf, outOff + 0, r);
- longToBytes(outBuf, outOff + 8, l);
-
- return BlockSize;
- }
-
- public virtual void Reset()
- {
- }
-
- private int[] createWorkingKey(
- byte[] inKey)
- {
- int[] key = new int[32];
- long lower = bytesToLong(inKey, 0);
- long upper = bytesToLong(inKey, 8);
-
- int key0 = extractW0(lower);
- int key1 = extractW1(lower);
- int key2 = extractW0(upper);
- int key3 = extractW1(upper);
-
- for (int i = 0; i < 16; i++)
- {
- key[2 * i] = G(key0 + key2 - (int)KC[i]);
- key[2 * i + 1] = G(key1 - key3 + (int)KC[i]);
-
- if (i % 2 == 0)
- {
- lower = rotateRight8(lower);
- key0 = extractW0(lower);
- key1 = extractW1(lower);
- }
- else
- {
- upper = rotateLeft8(upper);
- key2 = extractW0(upper);
- key3 = extractW1(upper);
- }
- }
-
- return key;
- }
-
- private int extractW1(
- long lVal)
- {
- return (int)lVal;
- }
-
- private int extractW0(
- long lVal)
- {
- return (int)(lVal >> 32);
- }
-
- private long rotateLeft8(
- long x)
- {
- return (x << 8) | ((long)((ulong) x >> 56));
- }
-
- private long rotateRight8(
- long x)
- {
- return ((long)((ulong) x >> 8)) | (x << 56);
- }
-
- private long bytesToLong(
- byte[] src,
- int srcOff)
- {
- long word = 0;
-
- for (int i = 0; i <= 7; i++)
- {
- word = (word << 8) + (src[i + srcOff] & 0xff);
- }
-
- return word;
- }
-
- private void longToBytes(
- byte[] dest,
- int destOff,
- long value)
- {
- for (int i = 0; i < 8; i++)
- {
- dest[i + destOff] = (byte)(value >> ((7 - i) * 8));
- }
- }
-
- private int G(
- int x)
- {
- return (int)(SS0[x & 0xff] ^ SS1[(x >> 8) & 0xff] ^ SS2[(x >> 16) & 0xff] ^ SS3[(x >> 24) & 0xff]);
- }
-
- private long F(
- int ki0,
- int ki1,
- long r)
- {
- int r0 = (int)(r >> 32);
- int r1 = (int)r;
- int rd1 = phaseCalc2(r0, ki0, r1, ki1);
- int rd0 = rd1 + phaseCalc1(r0, ki0, r1, ki1);
-
- return ((long)rd0 << 32) | (rd1 & 0xffffffffL);
- }
-
- private int phaseCalc1(
- int r0,
- int ki0,
- int r1,
- int ki1)
- {
- return G(G((r0 ^ ki0) ^ (r1 ^ ki1)) + (r0 ^ ki0));
- }
-
- private int phaseCalc2(
- int r0,
- int ki0,
- int r1,
- int ki1)
- {
- return G(phaseCalc1(r0, ki0, r1, ki1) + G((r0 ^ ki0) ^ (r1 ^ ki1)));
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/SEEDWrapEngine.cs b/BCCrypto/src/crypto/engines/SEEDWrapEngine.cs
deleted file mode 100644
index 6b71f94..0000000
--- a/BCCrypto/src/crypto/engines/SEEDWrapEngine.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-namespace Org.BouncyCastle.Crypto.Engines
-{
- ///
- /// An implementation of the SEED key wrapper based on RFC 4010/RFC 3394.
- ///
- /// For further details see: http://www.ietf.org/rfc/rfc4010.txt .
- ///
- public class SeedWrapEngine
- : Rfc3394WrapEngine
- {
- public SeedWrapEngine()
- : base(new SeedEngine())
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/Salsa20Engine.cs b/BCCrypto/src/crypto/engines/Salsa20Engine.cs
deleted file mode 100644
index 182eacd..0000000
--- a/BCCrypto/src/crypto/engines/Salsa20Engine.cs
+++ /dev/null
@@ -1,362 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- ///
- /// Implementation of Daniel J. Bernstein's Salsa20 stream cipher, Snuffle 2005
- ///
- public class Salsa20Engine
- : IStreamCipher
- {
- public static readonly int DEFAULT_ROUNDS = 20;
-
- /** Constants */
- private const int StateSize = 16; // 16, 32 bit ints = 64 bytes
-
- private readonly static uint[] TAU_SIGMA = Pack.LE_To_UInt32(Strings.ToAsciiByteArray("expand 16-byte k" + "expand 32-byte k"), 0, 8);
-
- internal void PackTauOrSigma(int keyLength, uint[] state, int stateOffset)
- {
- int tsOff = (keyLength - 16) / 4;
- state[stateOffset] = TAU_SIGMA[tsOff];
- state[stateOffset + 1] = TAU_SIGMA[tsOff + 1];
- state[stateOffset + 2] = TAU_SIGMA[tsOff + 2];
- state[stateOffset + 3] = TAU_SIGMA[tsOff + 3];
- }
-
- [Obsolete]
- protected readonly static byte[]
- sigma = Strings.ToAsciiByteArray("expand 32-byte k"),
- tau = Strings.ToAsciiByteArray("expand 16-byte k");
-
- protected int rounds;
-
- /*
- * variables to hold the state of the engine
- * during encryption and decryption
- */
- private int index = 0;
- internal uint[] engineState = new uint[StateSize]; // state
- internal uint[] x = new uint[StateSize]; // internal buffer
- private byte[] keyStream = new byte[StateSize * 4]; // expanded state, 64 bytes
- private bool initialised = false;
-
- /*
- * internal counter
- */
- private uint cW0, cW1, cW2;
-
- ///
- /// Creates a 20 round Salsa20 engine.
- ///
- public Salsa20Engine()
- : this(DEFAULT_ROUNDS)
- {
- }
-
- ///
- /// Creates a Salsa20 engine with a specific number of rounds.
- ///
- /// the number of rounds (must be an even number).
- public Salsa20Engine(int rounds)
- {
- if (rounds <= 0 || (rounds & 1) != 0)
- {
- throw new ArgumentException("'rounds' must be a positive, even number");
- }
-
- this.rounds = rounds;
- }
-
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- /*
- * Salsa20 encryption and decryption is completely
- * symmetrical, so the 'forEncryption' is
- * irrelevant. (Like 90% of stream ciphers)
- */
-
- ParametersWithIV ivParams = parameters as ParametersWithIV;
- if (ivParams == null)
- throw new ArgumentException(AlgorithmName + " Init requires an IV", "parameters");
-
- byte[] iv = ivParams.GetIV();
- if (iv == null || iv.Length != NonceSize)
- throw new ArgumentException(AlgorithmName + " requires exactly " + NonceSize + " bytes of IV");
-
- ICipherParameters keyParam = ivParams.Parameters;
- if (keyParam == null)
- {
- if (!initialised)
- throw new InvalidOperationException(AlgorithmName + " KeyParameter can not be null for first initialisation");
-
- SetKey(null, iv);
- }
- else if (keyParam is KeyParameter)
- {
- SetKey(((KeyParameter)keyParam).GetKey(), iv);
- }
- else
- {
- throw new ArgumentException(AlgorithmName + " Init parameters must contain a KeyParameter (or null for re-init)");
- }
-
- Reset();
- initialised = true;
- }
-
- protected virtual int NonceSize
- {
- get { return 8; }
- }
-
- public virtual string AlgorithmName
- {
- get
- {
- string name = "Salsa20";
- if (rounds != DEFAULT_ROUNDS)
- {
- name += "/" + rounds;
- }
- return name;
- }
- }
-
- public virtual byte ReturnByte(
- byte input)
- {
- if (LimitExceeded())
- {
- throw new MaxBytesExceededException("2^70 byte limit per IV; Change IV");
- }
-
- if (index == 0)
- {
- GenerateKeyStream(keyStream);
- AdvanceCounter();
- }
-
- byte output = (byte)(keyStream[index] ^ input);
- index = (index + 1) & 63;
-
- return output;
- }
-
- protected virtual void AdvanceCounter()
- {
- if (++engineState[8] == 0)
- {
- ++engineState[9];
- }
- }
-
- public virtual void ProcessBytes(
- byte[] inBytes,
- int inOff,
- int len,
- byte[] outBytes,
- int outOff)
- {
- if (!initialised)
- throw new InvalidOperationException(AlgorithmName + " not initialised");
-
- Check.DataLength(inBytes, inOff, len, "input buffer too short");
- Check.OutputLength(outBytes, outOff, len, "output buffer too short");
-
- if (LimitExceeded((uint)len))
- throw new MaxBytesExceededException("2^70 byte limit per IV would be exceeded; Change IV");
-
- for (int i = 0; i < len; i++)
- {
- if (index == 0)
- {
- GenerateKeyStream(keyStream);
- AdvanceCounter();
- }
- outBytes[i+outOff] = (byte)(keyStream[index]^inBytes[i+inOff]);
- index = (index + 1) & 63;
- }
- }
-
- public virtual void Reset()
- {
- index = 0;
- ResetLimitCounter();
- ResetCounter();
- }
-
- protected virtual void ResetCounter()
- {
- engineState[8] = engineState[9] = 0;
- }
-
- protected virtual void SetKey(byte[] keyBytes, byte[] ivBytes)
- {
- if (keyBytes != null)
- {
- if ((keyBytes.Length != 16) && (keyBytes.Length != 32))
- throw new ArgumentException(AlgorithmName + " requires 128 bit or 256 bit key");
-
- int tsOff = (keyBytes.Length - 16) / 4;
- engineState[0] = TAU_SIGMA[tsOff];
- engineState[5] = TAU_SIGMA[tsOff + 1];
- engineState[10] = TAU_SIGMA[tsOff + 2];
- engineState[15] = TAU_SIGMA[tsOff + 3];
-
- // Key
- Pack.LE_To_UInt32(keyBytes, 0, engineState, 1, 4);
- Pack.LE_To_UInt32(keyBytes, keyBytes.Length - 16, engineState, 11, 4);
- }
-
- // IV
- Pack.LE_To_UInt32(ivBytes, 0, engineState, 6, 2);
- }
-
- protected virtual void GenerateKeyStream(byte[] output)
- {
- SalsaCore(rounds, engineState, x);
- Pack.UInt32_To_LE(x, output, 0);
- }
-
- internal static void SalsaCore(int rounds, uint[] input, uint[] x)
- {
- if (input.Length != 16)
- throw new ArgumentException();
- if (x.Length != 16)
- throw new ArgumentException();
- if (rounds % 2 != 0)
- throw new ArgumentException("Number of rounds must be even");
-
- uint x00 = input[ 0];
- uint x01 = input[ 1];
- uint x02 = input[ 2];
- uint x03 = input[ 3];
- uint x04 = input[ 4];
- uint x05 = input[ 5];
- uint x06 = input[ 6];
- uint x07 = input[ 7];
- uint x08 = input[ 8];
- uint x09 = input[ 9];
- uint x10 = input[10];
- uint x11 = input[11];
- uint x12 = input[12];
- uint x13 = input[13];
- uint x14 = input[14];
- uint x15 = input[15];
-
- for (int i = rounds; i > 0; i -= 2)
- {
- x04 ^= R((x00+x12), 7);
- x08 ^= R((x04+x00), 9);
- x12 ^= R((x08+x04),13);
- x00 ^= R((x12+x08),18);
- x09 ^= R((x05+x01), 7);
- x13 ^= R((x09+x05), 9);
- x01 ^= R((x13+x09),13);
- x05 ^= R((x01+x13),18);
- x14 ^= R((x10+x06), 7);
- x02 ^= R((x14+x10), 9);
- x06 ^= R((x02+x14),13);
- x10 ^= R((x06+x02),18);
- x03 ^= R((x15+x11), 7);
- x07 ^= R((x03+x15), 9);
- x11 ^= R((x07+x03),13);
- x15 ^= R((x11+x07),18);
-
- x01 ^= R((x00+x03), 7);
- x02 ^= R((x01+x00), 9);
- x03 ^= R((x02+x01),13);
- x00 ^= R((x03+x02),18);
- x06 ^= R((x05+x04), 7);
- x07 ^= R((x06+x05), 9);
- x04 ^= R((x07+x06),13);
- x05 ^= R((x04+x07),18);
- x11 ^= R((x10+x09), 7);
- x08 ^= R((x11+x10), 9);
- x09 ^= R((x08+x11),13);
- x10 ^= R((x09+x08),18);
- x12 ^= R((x15+x14), 7);
- x13 ^= R((x12+x15), 9);
- x14 ^= R((x13+x12),13);
- x15 ^= R((x14+x13),18);
- }
-
- x[ 0] = x00 + input[ 0];
- x[ 1] = x01 + input[ 1];
- x[ 2] = x02 + input[ 2];
- x[ 3] = x03 + input[ 3];
- x[ 4] = x04 + input[ 4];
- x[ 5] = x05 + input[ 5];
- x[ 6] = x06 + input[ 6];
- x[ 7] = x07 + input[ 7];
- x[ 8] = x08 + input[ 8];
- x[ 9] = x09 + input[ 9];
- x[10] = x10 + input[10];
- x[11] = x11 + input[11];
- x[12] = x12 + input[12];
- x[13] = x13 + input[13];
- x[14] = x14 + input[14];
- x[15] = x15 + input[15];
- }
-
- /**
- * Rotate left
- *
- * @param x value to rotate
- * @param y amount to rotate x
- *
- * @return rotated x
- */
- internal static uint R(uint x, int y)
- {
- return (x << y) | (x >> (32 - y));
- }
-
- private void ResetLimitCounter()
- {
- cW0 = 0;
- cW1 = 0;
- cW2 = 0;
- }
-
- private bool LimitExceeded()
- {
- if (++cW0 == 0)
- {
- if (++cW1 == 0)
- {
- return (++cW2 & 0x20) != 0; // 2^(32 + 32 + 6)
- }
- }
-
- return false;
- }
-
- /*
- * this relies on the fact len will always be positive.
- */
- private bool LimitExceeded(
- uint len)
- {
- uint old = cW0;
- cW0 += len;
- if (cW0 < old)
- {
- if (++cW1 == 0)
- {
- return (++cW2 & 0x20) != 0; // 2^(32 + 32 + 6)
- }
- }
-
- return false;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/SerpentEngine.cs b/BCCrypto/src/crypto/engines/SerpentEngine.cs
deleted file mode 100644
index 76799f0..0000000
--- a/BCCrypto/src/crypto/engines/SerpentEngine.cs
+++ /dev/null
@@ -1,292 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * Serpent is a 128-bit 32-round block cipher with variable key lengths,
- * including 128, 192 and 256 bit keys conjectured to be at least as
- * secure as three-key triple-DES.
- *
- * Serpent was designed by Ross Anderson, Eli Biham and Lars Knudsen as a
- * candidate algorithm for the NIST AES Quest.
- *
- *
- * For full details see The Serpent home page
- *
- */
- public sealed class SerpentEngine
- : SerpentEngineBase
- {
- /**
- * Expand a user-supplied key material into a session key.
- *
- * @param key The user-key bytes (multiples of 4) to use.
- * @exception ArgumentException
- */
- protected override int[] MakeWorkingKey(byte[] key)
- {
- //
- // pad key to 256 bits
- //
- int[] kPad = new int[16];
- int off = 0;
- int length = 0;
-
- for (off = 0; (off + 4) < key.Length; off += 4)
- {
- kPad[length++] = (int)Pack.LE_To_UInt32(key, off);
- }
-
- if (off % 4 == 0)
- {
- kPad[length++] = (int)Pack.LE_To_UInt32(key, off);
- if (length < 8)
- {
- kPad[length] = 1;
- }
- }
- else
- {
- throw new ArgumentException("key must be a multiple of 4 bytes");
- }
-
- //
- // expand the padded key up to 33 x 128 bits of key material
- //
- int amount = (ROUNDS + 1) * 4;
- int[] w = new int[amount];
-
- //
- // compute w0 to w7 from w-8 to w-1
- //
- for (int i = 8; i < 16; i++)
- {
- kPad[i] = RotateLeft(kPad[i - 8] ^ kPad[i - 5] ^ kPad[i - 3] ^ kPad[i - 1] ^ PHI ^ (i - 8), 11);
- }
-
- Array.Copy(kPad, 8, w, 0, 8);
-
- //
- // compute w8 to w136
- //
- for (int i = 8; i < amount; i++)
- {
- w[i] = RotateLeft(w[i - 8] ^ w[i - 5] ^ w[i - 3] ^ w[i - 1] ^ PHI ^ i, 11);
- }
-
- //
- // create the working keys by processing w with the Sbox and IP
- //
- Sb3(w[0], w[1], w[2], w[3]);
- w[0] = X0; w[1] = X1; w[2] = X2; w[3] = X3;
- Sb2(w[4], w[5], w[6], w[7]);
- w[4] = X0; w[5] = X1; w[6] = X2; w[7] = X3;
- Sb1(w[8], w[9], w[10], w[11]);
- w[8] = X0; w[9] = X1; w[10] = X2; w[11] = X3;
- Sb0(w[12], w[13], w[14], w[15]);
- w[12] = X0; w[13] = X1; w[14] = X2; w[15] = X3;
- Sb7(w[16], w[17], w[18], w[19]);
- w[16] = X0; w[17] = X1; w[18] = X2; w[19] = X3;
- Sb6(w[20], w[21], w[22], w[23]);
- w[20] = X0; w[21] = X1; w[22] = X2; w[23] = X3;
- Sb5(w[24], w[25], w[26], w[27]);
- w[24] = X0; w[25] = X1; w[26] = X2; w[27] = X3;
- Sb4(w[28], w[29], w[30], w[31]);
- w[28] = X0; w[29] = X1; w[30] = X2; w[31] = X3;
- Sb3(w[32], w[33], w[34], w[35]);
- w[32] = X0; w[33] = X1; w[34] = X2; w[35] = X3;
- Sb2(w[36], w[37], w[38], w[39]);
- w[36] = X0; w[37] = X1; w[38] = X2; w[39] = X3;
- Sb1(w[40], w[41], w[42], w[43]);
- w[40] = X0; w[41] = X1; w[42] = X2; w[43] = X3;
- Sb0(w[44], w[45], w[46], w[47]);
- w[44] = X0; w[45] = X1; w[46] = X2; w[47] = X3;
- Sb7(w[48], w[49], w[50], w[51]);
- w[48] = X0; w[49] = X1; w[50] = X2; w[51] = X3;
- Sb6(w[52], w[53], w[54], w[55]);
- w[52] = X0; w[53] = X1; w[54] = X2; w[55] = X3;
- Sb5(w[56], w[57], w[58], w[59]);
- w[56] = X0; w[57] = X1; w[58] = X2; w[59] = X3;
- Sb4(w[60], w[61], w[62], w[63]);
- w[60] = X0; w[61] = X1; w[62] = X2; w[63] = X3;
- Sb3(w[64], w[65], w[66], w[67]);
- w[64] = X0; w[65] = X1; w[66] = X2; w[67] = X3;
- Sb2(w[68], w[69], w[70], w[71]);
- w[68] = X0; w[69] = X1; w[70] = X2; w[71] = X3;
- Sb1(w[72], w[73], w[74], w[75]);
- w[72] = X0; w[73] = X1; w[74] = X2; w[75] = X3;
- Sb0(w[76], w[77], w[78], w[79]);
- w[76] = X0; w[77] = X1; w[78] = X2; w[79] = X3;
- Sb7(w[80], w[81], w[82], w[83]);
- w[80] = X0; w[81] = X1; w[82] = X2; w[83] = X3;
- Sb6(w[84], w[85], w[86], w[87]);
- w[84] = X0; w[85] = X1; w[86] = X2; w[87] = X3;
- Sb5(w[88], w[89], w[90], w[91]);
- w[88] = X0; w[89] = X1; w[90] = X2; w[91] = X3;
- Sb4(w[92], w[93], w[94], w[95]);
- w[92] = X0; w[93] = X1; w[94] = X2; w[95] = X3;
- Sb3(w[96], w[97], w[98], w[99]);
- w[96] = X0; w[97] = X1; w[98] = X2; w[99] = X3;
- Sb2(w[100], w[101], w[102], w[103]);
- w[100] = X0; w[101] = X1; w[102] = X2; w[103] = X3;
- Sb1(w[104], w[105], w[106], w[107]);
- w[104] = X0; w[105] = X1; w[106] = X2; w[107] = X3;
- Sb0(w[108], w[109], w[110], w[111]);
- w[108] = X0; w[109] = X1; w[110] = X2; w[111] = X3;
- Sb7(w[112], w[113], w[114], w[115]);
- w[112] = X0; w[113] = X1; w[114] = X2; w[115] = X3;
- Sb6(w[116], w[117], w[118], w[119]);
- w[116] = X0; w[117] = X1; w[118] = X2; w[119] = X3;
- Sb5(w[120], w[121], w[122], w[123]);
- w[120] = X0; w[121] = X1; w[122] = X2; w[123] = X3;
- Sb4(w[124], w[125], w[126], w[127]);
- w[124] = X0; w[125] = X1; w[126] = X2; w[127] = X3;
- Sb3(w[128], w[129], w[130], w[131]);
- w[128] = X0; w[129] = X1; w[130] = X2; w[131] = X3;
-
- return w;
- }
-
- /**
- * Encrypt one block of plaintext.
- *
- * @param input the array containing the input data.
- * @param inOff offset into the in array the data starts at.
- * @param output the array the output data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- */
- protected override void EncryptBlock(byte[] input, int inOff, byte[] output, int outOff)
- {
- X0 = (int)Pack.LE_To_UInt32(input, inOff);
- X1 = (int)Pack.LE_To_UInt32(input, inOff + 4);
- X2 = (int)Pack.LE_To_UInt32(input, inOff + 8);
- X3 = (int)Pack.LE_To_UInt32(input, inOff + 12);
-
- Sb0(wKey[0] ^ X0, wKey[1] ^ X1, wKey[2] ^ X2, wKey[3] ^ X3); LT();
- Sb1(wKey[4] ^ X0, wKey[5] ^ X1, wKey[6] ^ X2, wKey[7] ^ X3); LT();
- Sb2(wKey[8] ^ X0, wKey[9] ^ X1, wKey[10] ^ X2, wKey[11] ^ X3); LT();
- Sb3(wKey[12] ^ X0, wKey[13] ^ X1, wKey[14] ^ X2, wKey[15] ^ X3); LT();
- Sb4(wKey[16] ^ X0, wKey[17] ^ X1, wKey[18] ^ X2, wKey[19] ^ X3); LT();
- Sb5(wKey[20] ^ X0, wKey[21] ^ X1, wKey[22] ^ X2, wKey[23] ^ X3); LT();
- Sb6(wKey[24] ^ X0, wKey[25] ^ X1, wKey[26] ^ X2, wKey[27] ^ X3); LT();
- Sb7(wKey[28] ^ X0, wKey[29] ^ X1, wKey[30] ^ X2, wKey[31] ^ X3); LT();
- Sb0(wKey[32] ^ X0, wKey[33] ^ X1, wKey[34] ^ X2, wKey[35] ^ X3); LT();
- Sb1(wKey[36] ^ X0, wKey[37] ^ X1, wKey[38] ^ X2, wKey[39] ^ X3); LT();
- Sb2(wKey[40] ^ X0, wKey[41] ^ X1, wKey[42] ^ X2, wKey[43] ^ X3); LT();
- Sb3(wKey[44] ^ X0, wKey[45] ^ X1, wKey[46] ^ X2, wKey[47] ^ X3); LT();
- Sb4(wKey[48] ^ X0, wKey[49] ^ X1, wKey[50] ^ X2, wKey[51] ^ X3); LT();
- Sb5(wKey[52] ^ X0, wKey[53] ^ X1, wKey[54] ^ X2, wKey[55] ^ X3); LT();
- Sb6(wKey[56] ^ X0, wKey[57] ^ X1, wKey[58] ^ X2, wKey[59] ^ X3); LT();
- Sb7(wKey[60] ^ X0, wKey[61] ^ X1, wKey[62] ^ X2, wKey[63] ^ X3); LT();
- Sb0(wKey[64] ^ X0, wKey[65] ^ X1, wKey[66] ^ X2, wKey[67] ^ X3); LT();
- Sb1(wKey[68] ^ X0, wKey[69] ^ X1, wKey[70] ^ X2, wKey[71] ^ X3); LT();
- Sb2(wKey[72] ^ X0, wKey[73] ^ X1, wKey[74] ^ X2, wKey[75] ^ X3); LT();
- Sb3(wKey[76] ^ X0, wKey[77] ^ X1, wKey[78] ^ X2, wKey[79] ^ X3); LT();
- Sb4(wKey[80] ^ X0, wKey[81] ^ X1, wKey[82] ^ X2, wKey[83] ^ X3); LT();
- Sb5(wKey[84] ^ X0, wKey[85] ^ X1, wKey[86] ^ X2, wKey[87] ^ X3); LT();
- Sb6(wKey[88] ^ X0, wKey[89] ^ X1, wKey[90] ^ X2, wKey[91] ^ X3); LT();
- Sb7(wKey[92] ^ X0, wKey[93] ^ X1, wKey[94] ^ X2, wKey[95] ^ X3); LT();
- Sb0(wKey[96] ^ X0, wKey[97] ^ X1, wKey[98] ^ X2, wKey[99] ^ X3); LT();
- Sb1(wKey[100] ^ X0, wKey[101] ^ X1, wKey[102] ^ X2, wKey[103] ^ X3); LT();
- Sb2(wKey[104] ^ X0, wKey[105] ^ X1, wKey[106] ^ X2, wKey[107] ^ X3); LT();
- Sb3(wKey[108] ^ X0, wKey[109] ^ X1, wKey[110] ^ X2, wKey[111] ^ X3); LT();
- Sb4(wKey[112] ^ X0, wKey[113] ^ X1, wKey[114] ^ X2, wKey[115] ^ X3); LT();
- Sb5(wKey[116] ^ X0, wKey[117] ^ X1, wKey[118] ^ X2, wKey[119] ^ X3); LT();
- Sb6(wKey[120] ^ X0, wKey[121] ^ X1, wKey[122] ^ X2, wKey[123] ^ X3); LT();
- Sb7(wKey[124] ^ X0, wKey[125] ^ X1, wKey[126] ^ X2, wKey[127] ^ X3);
-
- Pack.UInt32_To_LE((uint)(wKey[128] ^ X0), output, outOff);
- Pack.UInt32_To_LE((uint)(wKey[129] ^ X1), output, outOff + 4);
- Pack.UInt32_To_LE((uint)(wKey[130] ^ X2), output, outOff + 8);
- Pack.UInt32_To_LE((uint)(wKey[131] ^ X3), output, outOff + 12);
- }
-
- /**
- * Decrypt one block of ciphertext.
- *
- * @param input the array containing the input data.
- * @param inOff offset into the in array the data starts at.
- * @param output the array the output data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- */
- protected override void DecryptBlock(byte[] input, int inOff, byte[] output, int outOff)
- {
- X0 = wKey[128] ^ (int)Pack.LE_To_UInt32(input, inOff);
- X1 = wKey[129] ^ (int)Pack.LE_To_UInt32(input, inOff + 4);
- X2 = wKey[130] ^ (int)Pack.LE_To_UInt32(input, inOff + 8);
- X3 = wKey[131] ^ (int)Pack.LE_To_UInt32(input, inOff + 12);
-
- Ib7(X0, X1, X2, X3);
- X0 ^= wKey[124]; X1 ^= wKey[125]; X2 ^= wKey[126]; X3 ^= wKey[127];
- InverseLT(); Ib6(X0, X1, X2, X3);
- X0 ^= wKey[120]; X1 ^= wKey[121]; X2 ^= wKey[122]; X3 ^= wKey[123];
- InverseLT(); Ib5(X0, X1, X2, X3);
- X0 ^= wKey[116]; X1 ^= wKey[117]; X2 ^= wKey[118]; X3 ^= wKey[119];
- InverseLT(); Ib4(X0, X1, X2, X3);
- X0 ^= wKey[112]; X1 ^= wKey[113]; X2 ^= wKey[114]; X3 ^= wKey[115];
- InverseLT(); Ib3(X0, X1, X2, X3);
- X0 ^= wKey[108]; X1 ^= wKey[109]; X2 ^= wKey[110]; X3 ^= wKey[111];
- InverseLT(); Ib2(X0, X1, X2, X3);
- X0 ^= wKey[104]; X1 ^= wKey[105]; X2 ^= wKey[106]; X3 ^= wKey[107];
- InverseLT(); Ib1(X0, X1, X2, X3);
- X0 ^= wKey[100]; X1 ^= wKey[101]; X2 ^= wKey[102]; X3 ^= wKey[103];
- InverseLT(); Ib0(X0, X1, X2, X3);
- X0 ^= wKey[96]; X1 ^= wKey[97]; X2 ^= wKey[98]; X3 ^= wKey[99];
- InverseLT(); Ib7(X0, X1, X2, X3);
- X0 ^= wKey[92]; X1 ^= wKey[93]; X2 ^= wKey[94]; X3 ^= wKey[95];
- InverseLT(); Ib6(X0, X1, X2, X3);
- X0 ^= wKey[88]; X1 ^= wKey[89]; X2 ^= wKey[90]; X3 ^= wKey[91];
- InverseLT(); Ib5(X0, X1, X2, X3);
- X0 ^= wKey[84]; X1 ^= wKey[85]; X2 ^= wKey[86]; X3 ^= wKey[87];
- InverseLT(); Ib4(X0, X1, X2, X3);
- X0 ^= wKey[80]; X1 ^= wKey[81]; X2 ^= wKey[82]; X3 ^= wKey[83];
- InverseLT(); Ib3(X0, X1, X2, X3);
- X0 ^= wKey[76]; X1 ^= wKey[77]; X2 ^= wKey[78]; X3 ^= wKey[79];
- InverseLT(); Ib2(X0, X1, X2, X3);
- X0 ^= wKey[72]; X1 ^= wKey[73]; X2 ^= wKey[74]; X3 ^= wKey[75];
- InverseLT(); Ib1(X0, X1, X2, X3);
- X0 ^= wKey[68]; X1 ^= wKey[69]; X2 ^= wKey[70]; X3 ^= wKey[71];
- InverseLT(); Ib0(X0, X1, X2, X3);
- X0 ^= wKey[64]; X1 ^= wKey[65]; X2 ^= wKey[66]; X3 ^= wKey[67];
- InverseLT(); Ib7(X0, X1, X2, X3);
- X0 ^= wKey[60]; X1 ^= wKey[61]; X2 ^= wKey[62]; X3 ^= wKey[63];
- InverseLT(); Ib6(X0, X1, X2, X3);
- X0 ^= wKey[56]; X1 ^= wKey[57]; X2 ^= wKey[58]; X3 ^= wKey[59];
- InverseLT(); Ib5(X0, X1, X2, X3);
- X0 ^= wKey[52]; X1 ^= wKey[53]; X2 ^= wKey[54]; X3 ^= wKey[55];
- InverseLT(); Ib4(X0, X1, X2, X3);
- X0 ^= wKey[48]; X1 ^= wKey[49]; X2 ^= wKey[50]; X3 ^= wKey[51];
- InverseLT(); Ib3(X0, X1, X2, X3);
- X0 ^= wKey[44]; X1 ^= wKey[45]; X2 ^= wKey[46]; X3 ^= wKey[47];
- InverseLT(); Ib2(X0, X1, X2, X3);
- X0 ^= wKey[40]; X1 ^= wKey[41]; X2 ^= wKey[42]; X3 ^= wKey[43];
- InverseLT(); Ib1(X0, X1, X2, X3);
- X0 ^= wKey[36]; X1 ^= wKey[37]; X2 ^= wKey[38]; X3 ^= wKey[39];
- InverseLT(); Ib0(X0, X1, X2, X3);
- X0 ^= wKey[32]; X1 ^= wKey[33]; X2 ^= wKey[34]; X3 ^= wKey[35];
- InverseLT(); Ib7(X0, X1, X2, X3);
- X0 ^= wKey[28]; X1 ^= wKey[29]; X2 ^= wKey[30]; X3 ^= wKey[31];
- InverseLT(); Ib6(X0, X1, X2, X3);
- X0 ^= wKey[24]; X1 ^= wKey[25]; X2 ^= wKey[26]; X3 ^= wKey[27];
- InverseLT(); Ib5(X0, X1, X2, X3);
- X0 ^= wKey[20]; X1 ^= wKey[21]; X2 ^= wKey[22]; X3 ^= wKey[23];
- InverseLT(); Ib4(X0, X1, X2, X3);
- X0 ^= wKey[16]; X1 ^= wKey[17]; X2 ^= wKey[18]; X3 ^= wKey[19];
- InverseLT(); Ib3(X0, X1, X2, X3);
- X0 ^= wKey[12]; X1 ^= wKey[13]; X2 ^= wKey[14]; X3 ^= wKey[15];
- InverseLT(); Ib2(X0, X1, X2, X3);
- X0 ^= wKey[8]; X1 ^= wKey[9]; X2 ^= wKey[10]; X3 ^= wKey[11];
- InverseLT(); Ib1(X0, X1, X2, X3);
- X0 ^= wKey[4]; X1 ^= wKey[5]; X2 ^= wKey[6]; X3 ^= wKey[7];
- InverseLT(); Ib0(X0, X1, X2, X3);
-
- Pack.UInt32_To_LE((uint)(X0 ^ wKey[0]), output, outOff);
- Pack.UInt32_To_LE((uint)(X1 ^ wKey[1]), output, outOff + 4);
- Pack.UInt32_To_LE((uint)(X2 ^ wKey[2]), output, outOff + 8);
- Pack.UInt32_To_LE((uint)(X3 ^ wKey[3]), output, outOff + 12);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/SerpentEngineBase.cs b/BCCrypto/src/crypto/engines/SerpentEngineBase.cs
deleted file mode 100644
index 9de5522..0000000
--- a/BCCrypto/src/crypto/engines/SerpentEngineBase.cs
+++ /dev/null
@@ -1,469 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- public abstract class SerpentEngineBase
- : IBlockCipher
- {
- protected static readonly int BlockSize = 16;
-
- internal const int ROUNDS = 32;
- internal const int PHI = unchecked((int)0x9E3779B9); // (sqrt(5) - 1) * 2**31
-
- protected bool encrypting;
- protected int[] wKey;
-
- protected int X0, X1, X2, X3; // registers
-
- protected SerpentEngineBase()
- {
- }
-
- /**
- * initialise a Serpent cipher.
- *
- * @param encrypting whether or not we are for encryption.
- * @param params the parameters required to set up the cipher.
- * @throws IllegalArgumentException if the params argument is
- * inappropriate.
- */
- public virtual void Init(bool encrypting, ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException("invalid parameter passed to " + AlgorithmName + " init - " + Platform.GetTypeName(parameters));
-
- this.encrypting = encrypting;
- this.wKey = MakeWorkingKey(((KeyParameter)parameters).GetKey());
- }
-
- public virtual string AlgorithmName
- {
- get { return "Serpent"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BlockSize;
- }
-
- /**
- * Process one block of input from the array in and write it to
- * the out array.
- *
- * @param in the array containing the input data.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the output data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @return the number of bytes processed and produced.
- * @throws DataLengthException if there isn't enough data in in, or
- * space in out.
- * @throws IllegalStateException if the cipher isn't initialised.
- */
- public int ProcessBlock(byte[] input, int inOff, byte[] output, int outOff)
- {
- if (wKey == null)
- throw new InvalidOperationException(AlgorithmName + " not initialised");
-
- Check.DataLength(input, inOff, BlockSize, "input buffer too short");
- Check.OutputLength(output, outOff, BlockSize, "output buffer too short");
-
- if (encrypting)
- {
- EncryptBlock(input, inOff, output, outOff);
- }
- else
- {
- DecryptBlock(input, inOff, output, outOff);
- }
-
- return BlockSize;
- }
-
- public virtual void Reset()
- {
- }
-
- protected static int RotateLeft(int x, int bits)
- {
- return ((x << bits) | (int) ((uint)x >> (32 - bits)));
- }
-
- private static int RotateRight(int x, int bits)
- {
- return ( (int)((uint)x >> bits) | (x << (32 - bits)));
- }
-
- /*
- * The sboxes below are based on the work of Brian Gladman and
- * Sam Simpson, whose original notice appears below.
- *
- * For further details see:
- * http://fp.gladman.plus.com/cryptography_technology/serpent/
- *
- */
-
- /* Partially optimised Serpent S Box boolean functions derived */
- /* using a recursive descent analyser but without a full search */
- /* of all subtrees. This set of S boxes is the result of work */
- /* by Sam Simpson and Brian Gladman using the spare time on a */
- /* cluster of high capacity servers to search for S boxes with */
- /* this customised search engine. There are now an average of */
- /* 15.375 terms per S box. */
- /* */
- /* Copyright: Dr B. R Gladman (gladman@seven77.demon.co.uk) */
- /* and Sam Simpson (s.simpson@mia.co.uk) */
- /* 17th December 1998 */
- /* */
- /* We hereby give permission for information in this file to be */
- /* used freely subject only to acknowledgement of its origin. */
-
- /*
- * S0 - { 3, 8,15, 1,10, 6, 5,11,14,13, 4, 2, 7, 0, 9,12 } - 15 terms.
- */
- protected void Sb0(int a, int b, int c, int d)
- {
- int t1 = a ^ d;
- int t3 = c ^ t1;
- int t4 = b ^ t3;
- X3 = (a & d) ^ t4;
- int t7 = a ^ (b & t1);
- X2 = t4 ^ (c | t7);
- int t12 = X3 & (t3 ^ t7);
- X1 = (~t3) ^ t12;
- X0 = t12 ^ (~t7);
- }
-
- /**
- * InvSO - {13, 3,11, 0,10, 6, 5,12, 1,14, 4, 7,15, 9, 8, 2 } - 15 terms.
- */
- protected void Ib0(int a, int b, int c, int d)
- {
- int t1 = ~a;
- int t2 = a ^ b;
- int t4 = d ^ (t1 | t2);
- int t5 = c ^ t4;
- X2 = t2 ^ t5;
- int t8 = t1 ^ (d & t2);
- X1 = t4 ^ (X2 & t8);
- X3 = (a & t4) ^ (t5 | X1);
- X0 = X3 ^ (t5 ^ t8);
- }
-
- /**
- * S1 - {15,12, 2, 7, 9, 0, 5,10, 1,11,14, 8, 6,13, 3, 4 } - 14 terms.
- */
- protected void Sb1(int a, int b, int c, int d)
- {
- int t2 = b ^ (~a);
- int t5 = c ^ (a | t2);
- X2 = d ^ t5;
- int t7 = b ^ (d | t2);
- int t8 = t2 ^ X2;
- X3 = t8 ^ (t5 & t7);
- int t11 = t5 ^ t7;
- X1 = X3 ^ t11;
- X0 = t5 ^ (t8 & t11);
- }
-
- /**
- * InvS1 - { 5, 8, 2,14,15, 6,12, 3,11, 4, 7, 9, 1,13,10, 0 } - 14 steps.
- */
- protected void Ib1(int a, int b, int c, int d)
- {
- int t1 = b ^ d;
- int t3 = a ^ (b & t1);
- int t4 = t1 ^ t3;
- X3 = c ^ t4;
- int t7 = b ^ (t1 & t3);
- int t8 = X3 | t7;
- X1 = t3 ^ t8;
- int t10 = ~X1;
- int t11 = X3 ^ t7;
- X0 = t10 ^ t11;
- X2 = t4 ^ (t10 | t11);
- }
-
- /**
- * S2 - { 8, 6, 7, 9, 3,12,10,15,13, 1,14, 4, 0,11, 5, 2 } - 16 terms.
- */
- protected void Sb2(int a, int b, int c, int d)
- {
- int t1 = ~a;
- int t2 = b ^ d;
- int t3 = c & t1;
- X0 = t2 ^ t3;
- int t5 = c ^ t1;
- int t6 = c ^ X0;
- int t7 = b & t6;
- X3 = t5 ^ t7;
- X2 = a ^ ((d | t7) & (X0 | t5));
- X1 = (t2 ^ X3) ^ (X2 ^ (d | t1));
- }
-
- /**
- * InvS2 - {12, 9,15, 4,11,14, 1, 2, 0, 3, 6,13, 5, 8,10, 7 } - 16 steps.
- */
- protected void Ib2(int a, int b, int c, int d)
- {
- int t1 = b ^ d;
- int t2 = ~t1;
- int t3 = a ^ c;
- int t4 = c ^ t1;
- int t5 = b & t4;
- X0 = t3 ^ t5;
- int t7 = a | t2;
- int t8 = d ^ t7;
- int t9 = t3 | t8;
- X3 = t1 ^ t9;
- int t11 = ~t4;
- int t12 = X0 | X3;
- X1 = t11 ^ t12;
- X2 = (d & t11) ^ (t3 ^ t12);
- }
-
- /**
- * S3 - { 0,15,11, 8,12, 9, 6, 3,13, 1, 2, 4,10, 7, 5,14 } - 16 terms.
- */
- protected void Sb3(int a, int b, int c, int d)
- {
- int t1 = a ^ b;
- int t2 = a & c;
- int t3 = a | d;
- int t4 = c ^ d;
- int t5 = t1 & t3;
- int t6 = t2 | t5;
- X2 = t4 ^ t6;
- int t8 = b ^ t3;
- int t9 = t6 ^ t8;
- int t10 = t4 & t9;
- X0 = t1 ^ t10;
- int t12 = X2 & X0;
- X1 = t9 ^ t12;
- X3 = (b | d) ^ (t4 ^ t12);
- }
-
- /**
- * InvS3 - { 0, 9,10, 7,11,14, 6,13, 3, 5,12, 2, 4, 8,15, 1 } - 15 terms
- */
- protected void Ib3(int a, int b, int c, int d)
- {
- int t1 = a | b;
- int t2 = b ^ c;
- int t3 = b & t2;
- int t4 = a ^ t3;
- int t5 = c ^ t4;
- int t6 = d | t4;
- X0 = t2 ^ t6;
- int t8 = t2 | t6;
- int t9 = d ^ t8;
- X2 = t5 ^ t9;
- int t11 = t1 ^ t9;
- int t12 = X0 & t11;
- X3 = t4 ^ t12;
- X1 = X3 ^ (X0 ^ t11);
- }
-
- /**
- * S4 - { 1,15, 8, 3,12, 0,11, 6, 2, 5, 4,10, 9,14, 7,13 } - 15 terms.
- */
- protected void Sb4(int a, int b, int c, int d)
- {
- int t1 = a ^ d;
- int t2 = d & t1;
- int t3 = c ^ t2;
- int t4 = b | t3;
- X3 = t1 ^ t4;
- int t6 = ~b;
- int t7 = t1 | t6;
- X0 = t3 ^ t7;
- int t9 = a & X0;
- int t10 = t1 ^ t6;
- int t11 = t4 & t10;
- X2 = t9 ^ t11;
- X1 = (a ^ t3) ^ (t10 & X2);
- }
-
- /**
- * InvS4 - { 5, 0, 8, 3,10, 9, 7,14, 2,12,11, 6, 4,15,13, 1 } - 15 terms.
- */
- protected void Ib4(int a, int b, int c, int d)
- {
- int t1 = c | d;
- int t2 = a & t1;
- int t3 = b ^ t2;
- int t4 = a & t3;
- int t5 = c ^ t4;
- X1 = d ^ t5;
- int t7 = ~a;
- int t8 = t5 & X1;
- X3 = t3 ^ t8;
- int t10 = X1 | t7;
- int t11 = d ^ t10;
- X0 = X3 ^ t11;
- X2 = (t3 & t11) ^ (X1 ^ t7);
- }
-
- /**
- * S5 - {15, 5, 2,11, 4,10, 9,12, 0, 3,14, 8,13, 6, 7, 1 } - 16 terms.
- */
- protected void Sb5(int a, int b, int c, int d)
- {
- int t1 = ~a;
- int t2 = a ^ b;
- int t3 = a ^ d;
- int t4 = c ^ t1;
- int t5 = t2 | t3;
- X0 = t4 ^ t5;
- int t7 = d & X0;
- int t8 = t2 ^ X0;
- X1 = t7 ^ t8;
- int t10 = t1 | X0;
- int t11 = t2 | t7;
- int t12 = t3 ^ t10;
- X2 = t11 ^ t12;
- X3 = (b ^ t7) ^ (X1 & t12);
- }
-
- /**
- * InvS5 - { 8,15, 2, 9, 4, 1,13,14,11, 6, 5, 3, 7,12,10, 0 } - 16 terms.
- */
- protected void Ib5(int a, int b, int c, int d)
- {
- int t1 = ~c;
- int t2 = b & t1;
- int t3 = d ^ t2;
- int t4 = a & t3;
- int t5 = b ^ t1;
- X3 = t4 ^ t5;
- int t7 = b | X3;
- int t8 = a & t7;
- X1 = t3 ^ t8;
- int t10 = a | d;
- int t11 = t1 ^ t7;
- X0 = t10 ^ t11;
- X2 = (b & t10) ^ (t4 | (a ^ c));
- }
-
- /**
- * S6 - { 7, 2,12, 5, 8, 4, 6,11,14, 9, 1,15,13, 3,10, 0 } - 15 terms.
- */
- protected void Sb6(int a, int b, int c, int d)
- {
- int t1 = ~a;
- int t2 = a ^ d;
- int t3 = b ^ t2;
- int t4 = t1 | t2;
- int t5 = c ^ t4;
- X1 = b ^ t5;
- int t7 = t2 | X1;
- int t8 = d ^ t7;
- int t9 = t5 & t8;
- X2 = t3 ^ t9;
- int t11 = t5 ^ t8;
- X0 = X2 ^ t11;
- X3 = (~t5) ^ (t3 & t11);
- }
-
- /**
- * InvS6 - {15,10, 1,13, 5, 3, 6, 0, 4, 9,14, 7, 2,12, 8,11 } - 15 terms.
- */
- protected void Ib6(int a, int b, int c, int d)
- {
- int t1 = ~a;
- int t2 = a ^ b;
- int t3 = c ^ t2;
- int t4 = c | t1;
- int t5 = d ^ t4;
- X1 = t3 ^ t5;
- int t7 = t3 & t5;
- int t8 = t2 ^ t7;
- int t9 = b | t8;
- X3 = t5 ^ t9;
- int t11 = b | X3;
- X0 = t8 ^ t11;
- X2 = (d & t1) ^ (t3 ^ t11);
- }
-
- /**
- * S7 - { 1,13,15, 0,14, 8, 2,11, 7, 4,12,10, 9, 3, 5, 6 } - 16 terms.
- */
- protected void Sb7(int a, int b, int c, int d)
- {
- int t1 = b ^ c;
- int t2 = c & t1;
- int t3 = d ^ t2;
- int t4 = a ^ t3;
- int t5 = d | t1;
- int t6 = t4 & t5;
- X1 = b ^ t6;
- int t8 = t3 | X1;
- int t9 = a & t4;
- X3 = t1 ^ t9;
- int t11 = t4 ^ t8;
- int t12 = X3 & t11;
- X2 = t3 ^ t12;
- X0 = (~t11) ^ (X3 & X2);
- }
-
- /**
- * InvS7 - { 3, 0, 6,13, 9,14,15, 8, 5,12,11, 7,10, 1, 4, 2 } - 17 terms.
- */
- protected void Ib7(int a, int b, int c, int d)
- {
- int t3 = c | (a & b);
- int t4 = d & (a | b);
- X3 = t3 ^ t4;
- int t6 = ~d;
- int t7 = b ^ t4;
- int t9 = t7 | (X3 ^ t6);
- X1 = a ^ t9;
- X0 = (c ^ t7) ^ (d | X1);
- X2 = (t3 ^ X1) ^ (X0 ^ (a & X3));
- }
-
- /**
- * Apply the linear transformation to the register set.
- */
- protected void LT()
- {
- int x0 = RotateLeft(X0, 13);
- int x2 = RotateLeft(X2, 3);
- int x1 = X1 ^ x0 ^ x2;
- int x3 = X3 ^ x2 ^ x0 << 3;
-
- X1 = RotateLeft(x1, 1);
- X3 = RotateLeft(x3, 7);
- X0 = RotateLeft(x0 ^ X1 ^ X3, 5);
- X2 = RotateLeft(x2 ^ X3 ^ (X1 << 7), 22);
- }
-
- /**
- * Apply the inverse of the linear transformation to the register set.
- */
- protected void InverseLT()
- {
- int x2 = RotateRight(X2, 22) ^ X3 ^ (X1 << 7);
- int x0 = RotateRight(X0, 5) ^ X1 ^ X3;
- int x3 = RotateRight(X3, 7);
- int x1 = RotateRight(X1, 1);
- X3 = x3 ^ x2 ^ x0 << 3;
- X1 = x1 ^ x0 ^ x2;
- X2 = RotateRight(x2, 3);
- X0 = RotateRight(x0, 13);
- }
-
- protected abstract int[] MakeWorkingKey(byte[] key);
-
- protected abstract void EncryptBlock(byte[] input, int inOff, byte[] output, int outOff);
-
- protected abstract void DecryptBlock(byte[] input, int inOff, byte[] output, int outOff);
- }
-}
diff --git a/BCCrypto/src/crypto/engines/SkipjackEngine.cs b/BCCrypto/src/crypto/engines/SkipjackEngine.cs
deleted file mode 100644
index c90646c..0000000
--- a/BCCrypto/src/crypto/engines/SkipjackEngine.cs
+++ /dev/null
@@ -1,254 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * a class that provides a basic SKIPJACK engine.
- */
- public class SkipjackEngine
- : IBlockCipher
- {
- const int BLOCK_SIZE = 8;
-
- static readonly short [] ftable =
- {
- 0xa3, 0xd7, 0x09, 0x83, 0xf8, 0x48, 0xf6, 0xf4, 0xb3, 0x21, 0x15, 0x78, 0x99, 0xb1, 0xaf, 0xf9,
- 0xe7, 0x2d, 0x4d, 0x8a, 0xce, 0x4c, 0xca, 0x2e, 0x52, 0x95, 0xd9, 0x1e, 0x4e, 0x38, 0x44, 0x28,
- 0x0a, 0xdf, 0x02, 0xa0, 0x17, 0xf1, 0x60, 0x68, 0x12, 0xb7, 0x7a, 0xc3, 0xe9, 0xfa, 0x3d, 0x53,
- 0x96, 0x84, 0x6b, 0xba, 0xf2, 0x63, 0x9a, 0x19, 0x7c, 0xae, 0xe5, 0xf5, 0xf7, 0x16, 0x6a, 0xa2,
- 0x39, 0xb6, 0x7b, 0x0f, 0xc1, 0x93, 0x81, 0x1b, 0xee, 0xb4, 0x1a, 0xea, 0xd0, 0x91, 0x2f, 0xb8,
- 0x55, 0xb9, 0xda, 0x85, 0x3f, 0x41, 0xbf, 0xe0, 0x5a, 0x58, 0x80, 0x5f, 0x66, 0x0b, 0xd8, 0x90,
- 0x35, 0xd5, 0xc0, 0xa7, 0x33, 0x06, 0x65, 0x69, 0x45, 0x00, 0x94, 0x56, 0x6d, 0x98, 0x9b, 0x76,
- 0x97, 0xfc, 0xb2, 0xc2, 0xb0, 0xfe, 0xdb, 0x20, 0xe1, 0xeb, 0xd6, 0xe4, 0xdd, 0x47, 0x4a, 0x1d,
- 0x42, 0xed, 0x9e, 0x6e, 0x49, 0x3c, 0xcd, 0x43, 0x27, 0xd2, 0x07, 0xd4, 0xde, 0xc7, 0x67, 0x18,
- 0x89, 0xcb, 0x30, 0x1f, 0x8d, 0xc6, 0x8f, 0xaa, 0xc8, 0x74, 0xdc, 0xc9, 0x5d, 0x5c, 0x31, 0xa4,
- 0x70, 0x88, 0x61, 0x2c, 0x9f, 0x0d, 0x2b, 0x87, 0x50, 0x82, 0x54, 0x64, 0x26, 0x7d, 0x03, 0x40,
- 0x34, 0x4b, 0x1c, 0x73, 0xd1, 0xc4, 0xfd, 0x3b, 0xcc, 0xfb, 0x7f, 0xab, 0xe6, 0x3e, 0x5b, 0xa5,
- 0xad, 0x04, 0x23, 0x9c, 0x14, 0x51, 0x22, 0xf0, 0x29, 0x79, 0x71, 0x7e, 0xff, 0x8c, 0x0e, 0xe2,
- 0x0c, 0xef, 0xbc, 0x72, 0x75, 0x6f, 0x37, 0xa1, 0xec, 0xd3, 0x8e, 0x62, 0x8b, 0x86, 0x10, 0xe8,
- 0x08, 0x77, 0x11, 0xbe, 0x92, 0x4f, 0x24, 0xc5, 0x32, 0x36, 0x9d, 0xcf, 0xf3, 0xa6, 0xbb, 0xac,
- 0x5e, 0x6c, 0xa9, 0x13, 0x57, 0x25, 0xb5, 0xe3, 0xbd, 0xa8, 0x3a, 0x01, 0x05, 0x59, 0x2a, 0x46
- };
-
- private int[] key0, key1, key2, key3;
- private bool encrypting;
-
- /**
- * initialise a SKIPJACK cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException("invalid parameter passed to SKIPJACK init - " + Platform.GetTypeName(parameters));
-
- byte[] keyBytes = ((KeyParameter)parameters).GetKey();
-
- this.encrypting = forEncryption;
- this.key0 = new int[32];
- this.key1 = new int[32];
- this.key2 = new int[32];
- this.key3 = new int[32];
-
- //
- // expand the key to 128 bytes in 4 parts (saving us a modulo, multiply
- // and an addition).
- //
- for (int i = 0; i < 32; i ++)
- {
- key0[i] = keyBytes[(i * 4) % 10] & 0xff;
- key1[i] = keyBytes[(i * 4 + 1) % 10] & 0xff;
- key2[i] = keyBytes[(i * 4 + 2) % 10] & 0xff;
- key3[i] = keyBytes[(i * 4 + 3) % 10] & 0xff;
- }
- }
-
- public virtual string AlgorithmName
- {
- get { return "SKIPJACK"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (key1 == null)
- throw new InvalidOperationException("SKIPJACK engine not initialised");
-
- Check.DataLength(input, inOff, BLOCK_SIZE, "input buffer too short");
- Check.OutputLength(output, outOff, BLOCK_SIZE, "output buffer too short");
-
- if (encrypting)
- {
- EncryptBlock(input, inOff, output, outOff);
- }
- else
- {
- DecryptBlock(input, inOff, output, outOff);
- }
-
- return BLOCK_SIZE;
- }
-
- public virtual void Reset()
- {
- }
-
- /**
- * The G permutation
- */
- private int G(
- int k,
- int w)
- {
- int g1, g2, g3, g4, g5, g6;
-
- g1 = (w >> 8) & 0xff;
- g2 = w & 0xff;
-
- g3 = ftable[g2 ^ key0[k]] ^ g1;
- g4 = ftable[g3 ^ key1[k]] ^ g2;
- g5 = ftable[g4 ^ key2[k]] ^ g3;
- g6 = ftable[g5 ^ key3[k]] ^ g4;
-
- return ((g5 << 8) + g6);
- }
-
- public virtual int EncryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- int w1 = (input[inOff + 0] << 8) + (input[inOff + 1] & 0xff);
- int w2 = (input[inOff + 2] << 8) + (input[inOff + 3] & 0xff);
- int w3 = (input[inOff + 4] << 8) + (input[inOff + 5] & 0xff);
- int w4 = (input[inOff + 6] << 8) + (input[inOff + 7] & 0xff);
-
- int k = 0;
-
- for (int t = 0; t < 2; t++)
- {
- for(int i = 0; i < 8; i++)
- {
- int tmp = w4;
- w4 = w3;
- w3 = w2;
- w2 = G(k, w1);
- w1 = w2 ^ tmp ^ (k + 1);
- k++;
- }
-
- for(int i = 0; i < 8; i++)
- {
- int tmp = w4;
- w4 = w3;
- w3 = w1 ^ w2 ^ (k + 1);
- w2 = G(k, w1);
- w1 = tmp;
- k++;
- }
- }
-
- outBytes[outOff + 0] = (byte)((w1 >> 8));
- outBytes[outOff + 1] = (byte)(w1);
- outBytes[outOff + 2] = (byte)((w2 >> 8));
- outBytes[outOff + 3] = (byte)(w2);
- outBytes[outOff + 4] = (byte)((w3 >> 8));
- outBytes[outOff + 5] = (byte)(w3);
- outBytes[outOff + 6] = (byte)((w4 >> 8));
- outBytes[outOff + 7] = (byte)(w4);
-
- return BLOCK_SIZE;
- }
-
- /**
- * the inverse of the G permutation.
- */
- private int H(
- int k,
- int w)
- {
- int h1, h2, h3, h4, h5, h6;
-
- h1 = w & 0xff;
- h2 = (w >> 8) & 0xff;
-
- h3 = ftable[h2 ^ key3[k]] ^ h1;
- h4 = ftable[h3 ^ key2[k]] ^ h2;
- h5 = ftable[h4 ^ key1[k]] ^ h3;
- h6 = ftable[h5 ^ key0[k]] ^ h4;
-
- return ((h6 << 8) + h5);
- }
-
- public virtual int DecryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- int w2 = (input[inOff + 0] << 8) + (input[inOff + 1] & 0xff);
- int w1 = (input[inOff + 2] << 8) + (input[inOff + 3] & 0xff);
- int w4 = (input[inOff + 4] << 8) + (input[inOff + 5] & 0xff);
- int w3 = (input[inOff + 6] << 8) + (input[inOff + 7] & 0xff);
-
- int k = 31;
-
- for (int t = 0; t < 2; t++)
- {
- for(int i = 0; i < 8; i++)
- {
- int tmp = w4;
- w4 = w3;
- w3 = w2;
- w2 = H(k, w1);
- w1 = w2 ^ tmp ^ (k + 1);
- k--;
- }
-
- for(int i = 0; i < 8; i++)
- {
- int tmp = w4;
- w4 = w3;
- w3 = w1 ^ w2 ^ (k + 1);
- w2 = H(k, w1);
- w1 = tmp;
- k--;
- }
- }
-
- outBytes[outOff + 0] = (byte)((w2 >> 8));
- outBytes[outOff + 1] = (byte)(w2);
- outBytes[outOff + 2] = (byte)((w1 >> 8));
- outBytes[outOff + 3] = (byte)(w1);
- outBytes[outOff + 4] = (byte)((w4 >> 8));
- outBytes[outOff + 5] = (byte)(w4);
- outBytes[outOff + 6] = (byte)((w3 >> 8));
- outBytes[outOff + 7] = (byte)(w3);
-
- return BLOCK_SIZE;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/TEAEngine.cs b/BCCrypto/src/crypto/engines/TEAEngine.cs
deleted file mode 100644
index 7b70014..0000000
--- a/BCCrypto/src/crypto/engines/TEAEngine.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * An TEA engine.
- */
- public class TeaEngine
- : IBlockCipher
- {
- private const int
- rounds = 32,
- block_size = 8;
-// key_size = 16,
-
- private const uint
- delta = 0x9E3779B9,
- d_sum = 0xC6EF3720; // sum on decrypt
-
- /*
- * the expanded key array of 4 subkeys
- */
- private uint _a, _b, _c, _d;
- private bool _initialised;
- private bool _forEncryption;
-
- /**
- * Create an instance of the TEA encryption algorithm
- * and set some defaults
- */
- public TeaEngine()
- {
- _initialised = false;
- }
-
- public virtual string AlgorithmName
- {
- get { return "TEA"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return block_size;
- }
-
- /**
- * initialise
- *
- * @param forEncryption whether or not we are for encryption.
- * @param params the parameters required to set up the cipher.
- * @exception ArgumentException if the params argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- {
- throw new ArgumentException("invalid parameter passed to TEA init - "
- + Platform.GetTypeName(parameters));
- }
-
- _forEncryption = forEncryption;
- _initialised = true;
-
- KeyParameter p = (KeyParameter) parameters;
-
- setKey(p.GetKey());
- }
-
- public virtual int ProcessBlock(
- byte[] inBytes,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- if (!_initialised)
- throw new InvalidOperationException(AlgorithmName + " not initialised");
-
- Check.DataLength(inBytes, inOff, block_size, "input buffer too short");
- Check.OutputLength(outBytes, outOff, block_size, "output buffer too short");
-
- return _forEncryption
- ? encryptBlock(inBytes, inOff, outBytes, outOff)
- : decryptBlock(inBytes, inOff, outBytes, outOff);
- }
-
- public virtual void Reset()
- {
- }
-
- /**
- * Re-key the cipher.
- *
- * @param key the key to be used
- */
- private void setKey(
- byte[] key)
- {
- _a = Pack.BE_To_UInt32(key, 0);
- _b = Pack.BE_To_UInt32(key, 4);
- _c = Pack.BE_To_UInt32(key, 8);
- _d = Pack.BE_To_UInt32(key, 12);
- }
-
- private int encryptBlock(
- byte[] inBytes,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- // Pack bytes into integers
- uint v0 = Pack.BE_To_UInt32(inBytes, inOff);
- uint v1 = Pack.BE_To_UInt32(inBytes, inOff + 4);
-
- uint sum = 0;
-
- for (int i = 0; i != rounds; i++)
- {
- sum += delta;
- v0 += ((v1 << 4) + _a) ^ (v1 + sum) ^ ((v1 >> 5) + _b);
- v1 += ((v0 << 4) + _c) ^ (v0 + sum) ^ ((v0 >> 5) + _d);
- }
-
- Pack.UInt32_To_BE(v0, outBytes, outOff);
- Pack.UInt32_To_BE(v1, outBytes, outOff + 4);
-
- return block_size;
- }
-
- private int decryptBlock(
- byte[] inBytes,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- // Pack bytes into integers
- uint v0 = Pack.BE_To_UInt32(inBytes, inOff);
- uint v1 = Pack.BE_To_UInt32(inBytes, inOff + 4);
-
- uint sum = d_sum;
-
- for (int i = 0; i != rounds; i++)
- {
- v1 -= ((v0 << 4) + _c) ^ (v0 + sum) ^ ((v0 >> 5) + _d);
- v0 -= ((v1 << 4) + _a) ^ (v1 + sum) ^ ((v1 >> 5) + _b);
- sum -= delta;
- }
-
- Pack.UInt32_To_BE(v0, outBytes, outOff);
- Pack.UInt32_To_BE(v1, outBytes, outOff + 4);
-
- return block_size;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/ThreefishEngine.cs b/BCCrypto/src/crypto/engines/ThreefishEngine.cs
deleted file mode 100644
index eade3cc..0000000
--- a/BCCrypto/src/crypto/engines/ThreefishEngine.cs
+++ /dev/null
@@ -1,1491 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- ///
- /// Implementation of the Threefish tweakable large block cipher in 256, 512 and 1024 bit block
- /// sizes.
- ///
- ///
- /// This is the 1.3 version of Threefish defined in the Skein hash function submission to the NIST
- /// SHA-3 competition in October 2010.
- ///
- /// Threefish was designed by Niels Ferguson - Stefan Lucks - Bruce Schneier - Doug Whiting - Mihir
- /// Bellare - Tadayoshi Kohno - Jon Callas - Jesse Walker.
- ///
- /// This implementation inlines all round functions, unrolls 8 rounds, and uses 1.2k of static tables
- /// to speed up key schedule injection.
- /// 2 x block size state is retained by each cipher instance.
- ///
- public class ThreefishEngine
- : IBlockCipher
- {
- ///
- /// 256 bit block size - Threefish-256
- ///
- public const int BLOCKSIZE_256 = 256;
- ///
- /// 512 bit block size - Threefish-512
- ///
- public const int BLOCKSIZE_512 = 512;
- ///
- /// 1024 bit block size - Threefish-1024
- ///
- public const int BLOCKSIZE_1024 = 1024;
-
- /**
- * Size of the tweak in bytes (always 128 bit/16 bytes)
- */
- private const int TWEAK_SIZE_BYTES = 16;
- private const int TWEAK_SIZE_WORDS = TWEAK_SIZE_BYTES / 8;
-
- /**
- * Rounds in Threefish-256
- */
- private const int ROUNDS_256 = 72;
- /**
- * Rounds in Threefish-512
- */
- private const int ROUNDS_512 = 72;
- /**
- * Rounds in Threefish-1024
- */
- private const int ROUNDS_1024 = 80;
-
- /**
- * Max rounds of any of the variants
- */
- private const int MAX_ROUNDS = ROUNDS_1024;
-
- /**
- * Key schedule parity constant
- */
- private const ulong C_240 = 0x1BD11BDAA9FC1A22L;
-
- /* Pre-calculated modulo arithmetic tables for key schedule lookups */
- private static readonly int[] MOD9 = new int[MAX_ROUNDS];
- private static readonly int[] MOD17 = new int[MOD9.Length];
- private static readonly int[] MOD5 = new int[MOD9.Length];
- private static readonly int[] MOD3 = new int[MOD9.Length];
-
- static ThreefishEngine()
- {
- for (int i = 0; i < MOD9.Length; i++)
- {
- MOD17[i] = i % 17;
- MOD9[i] = i % 9;
- MOD5[i] = i % 5;
- MOD3[i] = i % 3;
- }
- }
-
- /**
- * Block size in bytes
- */
- private readonly int blocksizeBytes;
-
- /**
- * Block size in 64 bit words
- */
- private readonly int blocksizeWords;
-
- /**
- * Buffer for byte oriented processBytes to call internal word API
- */
- private readonly ulong[] currentBlock;
-
- /**
- * Tweak bytes (2 byte t1,t2, calculated t3 and repeat of t1,t2 for modulo free lookup
- */
- private readonly ulong[] t = new ulong[5];
-
- /**
- * Key schedule words
- */
- private readonly ulong[] kw;
-
- /**
- * The internal cipher implementation (varies by blocksize)
- */
- private readonly ThreefishCipher cipher;
-
- private bool forEncryption;
-
- ///
- /// Constructs a new Threefish cipher, with a specified block size.
- ///
- /// the block size in bits, one of , ,
- /// .
- public ThreefishEngine(int blocksizeBits)
- {
- this.blocksizeBytes = (blocksizeBits / 8);
- this.blocksizeWords = (this.blocksizeBytes / 8);
- this.currentBlock = new ulong[blocksizeWords];
-
- /*
- * Provide room for original key words, extended key word and repeat of key words for modulo
- * free lookup of key schedule words.
- */
- this.kw = new ulong[2 * blocksizeWords + 1];
-
- switch (blocksizeBits)
- {
- case BLOCKSIZE_256:
- cipher = new Threefish256Cipher(kw, t);
- break;
- case BLOCKSIZE_512:
- cipher = new Threefish512Cipher(kw, t);
- break;
- case BLOCKSIZE_1024:
- cipher = new Threefish1024Cipher(kw, t);
- break;
- default:
- throw new ArgumentException(
- "Invalid blocksize - Threefish is defined with block size of 256, 512, or 1024 bits");
- }
- }
-
- ///
- /// Initialise the engine.
- ///
- /// Initialise for encryption if true, for decryption if false.
- /// an instance of or (to
- /// use a 0 tweak)
- public virtual void Init(bool forEncryption, ICipherParameters parameters)
- {
- byte[] keyBytes;
- byte[] tweakBytes;
-
- if (parameters is TweakableBlockCipherParameters)
- {
- TweakableBlockCipherParameters tParams = (TweakableBlockCipherParameters)parameters;
- keyBytes = tParams.Key.GetKey();
- tweakBytes = tParams.Tweak;
- }
- else if (parameters is KeyParameter)
- {
- keyBytes = ((KeyParameter)parameters).GetKey();
- tweakBytes = null;
- }
- else
- {
- throw new ArgumentException("Invalid parameter passed to Threefish init - "
- + Platform.GetTypeName(parameters));
- }
-
- ulong[] keyWords = null;
- ulong[] tweakWords = null;
-
- if (keyBytes != null)
- {
- if (keyBytes.Length != this.blocksizeBytes)
- {
- throw new ArgumentException("Threefish key must be same size as block (" + blocksizeBytes
- + " bytes)");
- }
- keyWords = new ulong[blocksizeWords];
- for (int i = 0; i < keyWords.Length; i++)
- {
- keyWords[i] = BytesToWord(keyBytes, i * 8);
- }
- }
- if (tweakBytes != null)
- {
- if (tweakBytes.Length != TWEAK_SIZE_BYTES)
- {
- throw new ArgumentException("Threefish tweak must be " + TWEAK_SIZE_BYTES + " bytes");
- }
- tweakWords = new ulong[]{BytesToWord(tweakBytes, 0), BytesToWord(tweakBytes, 8)};
- }
- Init(forEncryption, keyWords, tweakWords);
- }
-
- ///
- /// Initialise the engine, specifying the key and tweak directly.
- ///
- /// the cipher mode.
- /// the words of the key, or null to use the current key.
- /// the 2 word (128 bit) tweak, or null to use the current tweak.
- internal void Init(bool forEncryption, ulong[] key, ulong[] tweak)
- {
- this.forEncryption = forEncryption;
- if (key != null)
- {
- SetKey(key);
- }
- if (tweak != null)
- {
- SetTweak(tweak);
- }
- }
-
- private void SetKey(ulong[] key)
- {
- if (key.Length != this.blocksizeWords)
- {
- throw new ArgumentException("Threefish key must be same size as block (" + blocksizeWords
- + " words)");
- }
-
- /*
- * Full subkey schedule is deferred to execution to avoid per cipher overhead (10k for 512,
- * 20k for 1024).
- *
- * Key and tweak word sequences are repeated, and static MOD17/MOD9/MOD5/MOD3 calculations
- * used, to avoid expensive mod computations during cipher operation.
- */
-
- ulong knw = C_240;
- for (int i = 0; i < blocksizeWords; i++)
- {
- kw[i] = key[i];
- knw = knw ^ kw[i];
- }
- kw[blocksizeWords] = knw;
- Array.Copy(kw, 0, kw, blocksizeWords + 1, blocksizeWords);
- }
-
- private void SetTweak(ulong[] tweak)
- {
- if (tweak.Length != TWEAK_SIZE_WORDS)
- {
- throw new ArgumentException("Tweak must be " + TWEAK_SIZE_WORDS + " words.");
- }
-
- /*
- * Tweak schedule partially repeated to avoid mod computations during cipher operation
- */
- t[0] = tweak[0];
- t[1] = tweak[1];
- t[2] = t[0] ^ t[1];
- t[3] = t[0];
- t[4] = t[1];
- }
-
- public virtual string AlgorithmName
- {
- get { return "Threefish-" + (blocksizeBytes * 8); }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return blocksizeBytes;
- }
-
- public virtual void Reset()
- {
- }
-
- public virtual int ProcessBlock(byte[] inBytes, int inOff, byte[] outBytes, int outOff)
- {
- if ((outOff + blocksizeBytes) > outBytes.Length)
- {
- throw new DataLengthException("Output buffer too short");
- }
-
- if ((inOff + blocksizeBytes) > inBytes.Length)
- {
- throw new DataLengthException("Input buffer too short");
- }
-
- for (int i = 0; i < blocksizeBytes; i += 8)
- {
- currentBlock[i >> 3] = BytesToWord(inBytes, inOff + i);
- }
- ProcessBlock(this.currentBlock, this.currentBlock);
- for (int i = 0; i < blocksizeBytes; i += 8)
- {
- WordToBytes(this.currentBlock[i >> 3], outBytes, outOff + i);
- }
-
- return blocksizeBytes;
- }
-
- ///
- /// Process a block of data represented as 64 bit words.
- ///
- /// the number of 8 byte words processed (which will be the same as the block size).
- /// a block sized buffer of words to process.
- /// a block sized buffer of words to receive the output of the operation.
- /// if either the input or output is not block sized
- /// if this engine is not initialised
- internal int ProcessBlock(ulong[] inWords, ulong[] outWords)
- {
- if (kw[blocksizeWords] == 0)
- {
- throw new InvalidOperationException("Threefish engine not initialised");
- }
-
- if (inWords.Length != blocksizeWords)
- {
- throw new DataLengthException("Input buffer too short");
- }
- if (outWords.Length != blocksizeWords)
- {
- throw new DataLengthException("Output buffer too short");
- }
-
- if (forEncryption)
- {
- cipher.EncryptBlock(inWords, outWords);
- }
- else
- {
- cipher.DecryptBlock(inWords, outWords);
- }
-
- return blocksizeWords;
- }
-
- ///
- /// Read a single 64 bit word from input in LSB first order.
- ///
- internal static ulong BytesToWord(byte[] bytes, int off)
- {
- if ((off + 8) > bytes.Length)
- {
- // Help the JIT avoid index checks
- throw new ArgumentException();
- }
-
- ulong word = 0;
- int index = off;
-
- word = (bytes[index++] & 0xffUL);
- word |= (bytes[index++] & 0xffUL) << 8;
- word |= (bytes[index++] & 0xffUL) << 16;
- word |= (bytes[index++] & 0xffUL) << 24;
- word |= (bytes[index++] & 0xffUL) << 32;
- word |= (bytes[index++] & 0xffUL) << 40;
- word |= (bytes[index++] & 0xffUL) << 48;
- word |= (bytes[index++] & 0xffUL) << 56;
-
- return word;
- }
-
- ///
- /// Write a 64 bit word to output in LSB first order.
- ///
- internal static void WordToBytes(ulong word, byte[] bytes, int off)
- {
- if ((off + 8) > bytes.Length)
- {
- // Help the JIT avoid index checks
- throw new ArgumentException();
- }
- int index = off;
-
- bytes[index++] = (byte)word;
- bytes[index++] = (byte)(word >> 8);
- bytes[index++] = (byte)(word >> 16);
- bytes[index++] = (byte)(word >> 24);
- bytes[index++] = (byte)(word >> 32);
- bytes[index++] = (byte)(word >> 40);
- bytes[index++] = (byte)(word >> 48);
- bytes[index++] = (byte)(word >> 56);
- }
-
- /**
- * Rotate left + xor part of the mix operation.
- */
- private static ulong RotlXor(ulong x, int n, ulong xor)
- {
- return ((x << n) | (x >> (64 - n))) ^ xor;
- }
-
- /**
- * Rotate xor + rotate right part of the unmix operation.
- */
- private static ulong XorRotr(ulong x, int n, ulong xor)
- {
- ulong xored = x ^ xor;
- return (xored >> n) | (xored << (64 - n));
- }
-
- private abstract class ThreefishCipher
- {
- /**
- * The extended + repeated tweak words
- */
- protected readonly ulong[] t;
- /**
- * The extended + repeated key words
- */
- protected readonly ulong[] kw;
-
- protected ThreefishCipher(ulong[] kw, ulong[] t)
- {
- this.kw = kw;
- this.t = t;
- }
-
- internal abstract void EncryptBlock(ulong[] block, ulong[] outWords);
-
- internal abstract void DecryptBlock(ulong[] block, ulong[] outWords);
-
- }
-
- private sealed class Threefish256Cipher
- : ThreefishCipher
- {
- /**
- * Mix rotation constants defined in Skein 1.3 specification
- */
- private const int ROTATION_0_0 = 14, ROTATION_0_1 = 16;
- private const int ROTATION_1_0 = 52, ROTATION_1_1 = 57;
- private const int ROTATION_2_0 = 23, ROTATION_2_1 = 40;
- private const int ROTATION_3_0 = 5, ROTATION_3_1 = 37;
-
- private const int ROTATION_4_0 = 25, ROTATION_4_1 = 33;
- private const int ROTATION_5_0 = 46, ROTATION_5_1 = 12;
- private const int ROTATION_6_0 = 58, ROTATION_6_1 = 22;
- private const int ROTATION_7_0 = 32, ROTATION_7_1 = 32;
-
- public Threefish256Cipher(ulong[] kw, ulong[] t)
- : base(kw, t)
- {
- }
-
- internal override void EncryptBlock(ulong[] block, ulong[] outWords)
- {
- ulong[] kw = this.kw;
- ulong[] t = this.t;
- int[] mod5 = MOD5;
- int[] mod3 = MOD3;
-
- /* Help the JIT avoid index bounds checks */
- if (kw.Length != 9)
- {
- throw new ArgumentException();
- }
- if (t.Length != 5)
- {
- throw new ArgumentException();
- }
-
- /*
- * Read 4 words of plaintext data, not using arrays for cipher state
- */
- ulong b0 = block[0];
- ulong b1 = block[1];
- ulong b2 = block[2];
- ulong b3 = block[3];
-
- /*
- * First subkey injection.
- */
- b0 += kw[0];
- b1 += kw[1] + t[0];
- b2 += kw[2] + t[1];
- b3 += kw[3];
-
- /*
- * Rounds loop, unrolled to 8 rounds per iteration.
- *
- * Unrolling to multiples of 4 avoids the mod 4 check for key injection, and allows
- * inlining of the permutations, which cycle every of 2 rounds (avoiding array
- * index/lookup).
- *
- * Unrolling to multiples of 8 avoids the mod 8 rotation constant lookup, and allows
- * inlining constant rotation values (avoiding array index/lookup).
- */
-
- for (int d = 1; d < (ROUNDS_256 / 4); d += 2)
- {
- int dm5 = mod5[d];
- int dm3 = mod3[d];
-
- /*
- * 4 rounds of mix and permute.
- *
- * Permute schedule has a 2 round cycle, so permutes are inlined in the mix
- * operations in each 4 round block.
- */
- b1 = RotlXor(b1, ROTATION_0_0, b0 += b1);
- b3 = RotlXor(b3, ROTATION_0_1, b2 += b3);
-
- b3 = RotlXor(b3, ROTATION_1_0, b0 += b3);
- b1 = RotlXor(b1, ROTATION_1_1, b2 += b1);
-
- b1 = RotlXor(b1, ROTATION_2_0, b0 += b1);
- b3 = RotlXor(b3, ROTATION_2_1, b2 += b3);
-
- b3 = RotlXor(b3, ROTATION_3_0, b0 += b3);
- b1 = RotlXor(b1, ROTATION_3_1, b2 += b1);
-
- /*
- * Subkey injection for first 4 rounds.
- */
- b0 += kw[dm5];
- b1 += kw[dm5 + 1] + t[dm3];
- b2 += kw[dm5 + 2] + t[dm3 + 1];
- b3 += kw[dm5 + 3] + (uint)d;
-
- /*
- * 4 more rounds of mix/permute
- */
- b1 = RotlXor(b1, ROTATION_4_0, b0 += b1);
- b3 = RotlXor(b3, ROTATION_4_1, b2 += b3);
-
- b3 = RotlXor(b3, ROTATION_5_0, b0 += b3);
- b1 = RotlXor(b1, ROTATION_5_1, b2 += b1);
-
- b1 = RotlXor(b1, ROTATION_6_0, b0 += b1);
- b3 = RotlXor(b3, ROTATION_6_1, b2 += b3);
-
- b3 = RotlXor(b3, ROTATION_7_0, b0 += b3);
- b1 = RotlXor(b1, ROTATION_7_1, b2 += b1);
-
- /*
- * Subkey injection for next 4 rounds.
- */
- b0 += kw[dm5 + 1];
- b1 += kw[dm5 + 2] + t[dm3 + 1];
- b2 += kw[dm5 + 3] + t[dm3 + 2];
- b3 += kw[dm5 + 4] + (uint)d + 1;
- }
-
- /*
- * Output cipher state.
- */
- outWords[0] = b0;
- outWords[1] = b1;
- outWords[2] = b2;
- outWords[3] = b3;
- }
-
- internal override void DecryptBlock(ulong[] block, ulong[] state)
- {
- ulong[] kw = this.kw;
- ulong[] t = this.t;
- int[] mod5 = MOD5;
- int[] mod3 = MOD3;
-
- /* Help the JIT avoid index bounds checks */
- if (kw.Length != 9)
- {
- throw new ArgumentException();
- }
- if (t.Length != 5)
- {
- throw new ArgumentException();
- }
-
- ulong b0 = block[0];
- ulong b1 = block[1];
- ulong b2 = block[2];
- ulong b3 = block[3];
-
- for (int d = (ROUNDS_256 / 4) - 1; d >= 1; d -= 2)
- {
- int dm5 = mod5[d];
- int dm3 = mod3[d];
-
- /* Reverse key injection for second 4 rounds */
- b0 -= kw[dm5 + 1];
- b1 -= kw[dm5 + 2] + t[dm3 + 1];
- b2 -= kw[dm5 + 3] + t[dm3 + 2];
- b3 -= kw[dm5 + 4] + (uint)d + 1;
-
- /* Reverse second 4 mix/permute rounds */
-
- b3 = XorRotr(b3, ROTATION_7_0, b0);
- b0 -= b3;
- b1 = XorRotr(b1, ROTATION_7_1, b2);
- b2 -= b1;
-
- b1 = XorRotr(b1, ROTATION_6_0, b0);
- b0 -= b1;
- b3 = XorRotr(b3, ROTATION_6_1, b2);
- b2 -= b3;
-
- b3 = XorRotr(b3, ROTATION_5_0, b0);
- b0 -= b3;
- b1 = XorRotr(b1, ROTATION_5_1, b2);
- b2 -= b1;
-
- b1 = XorRotr(b1, ROTATION_4_0, b0);
- b0 -= b1;
- b3 = XorRotr(b3, ROTATION_4_1, b2);
- b2 -= b3;
-
- /* Reverse key injection for first 4 rounds */
- b0 -= kw[dm5];
- b1 -= kw[dm5 + 1] + t[dm3];
- b2 -= kw[dm5 + 2] + t[dm3 + 1];
- b3 -= kw[dm5 + 3] + (uint)d;
-
- /* Reverse first 4 mix/permute rounds */
- b3 = XorRotr(b3, ROTATION_3_0, b0);
- b0 -= b3;
- b1 = XorRotr(b1, ROTATION_3_1, b2);
- b2 -= b1;
-
- b1 = XorRotr(b1, ROTATION_2_0, b0);
- b0 -= b1;
- b3 = XorRotr(b3, ROTATION_2_1, b2);
- b2 -= b3;
-
- b3 = XorRotr(b3, ROTATION_1_0, b0);
- b0 -= b3;
- b1 = XorRotr(b1, ROTATION_1_1, b2);
- b2 -= b1;
-
- b1 = XorRotr(b1, ROTATION_0_0, b0);
- b0 -= b1;
- b3 = XorRotr(b3, ROTATION_0_1, b2);
- b2 -= b3;
- }
-
- /*
- * First subkey uninjection.
- */
- b0 -= kw[0];
- b1 -= kw[1] + t[0];
- b2 -= kw[2] + t[1];
- b3 -= kw[3];
-
- /*
- * Output cipher state.
- */
- state[0] = b0;
- state[1] = b1;
- state[2] = b2;
- state[3] = b3;
- }
-
- }
-
- private sealed class Threefish512Cipher
- : ThreefishCipher
- {
- /**
- * Mix rotation constants defined in Skein 1.3 specification
- */
- private const int ROTATION_0_0 = 46, ROTATION_0_1 = 36, ROTATION_0_2 = 19, ROTATION_0_3 = 37;
- private const int ROTATION_1_0 = 33, ROTATION_1_1 = 27, ROTATION_1_2 = 14, ROTATION_1_3 = 42;
- private const int ROTATION_2_0 = 17, ROTATION_2_1 = 49, ROTATION_2_2 = 36, ROTATION_2_3 = 39;
- private const int ROTATION_3_0 = 44, ROTATION_3_1 = 9, ROTATION_3_2 = 54, ROTATION_3_3 = 56;
-
- private const int ROTATION_4_0 = 39, ROTATION_4_1 = 30, ROTATION_4_2 = 34, ROTATION_4_3 = 24;
- private const int ROTATION_5_0 = 13, ROTATION_5_1 = 50, ROTATION_5_2 = 10, ROTATION_5_3 = 17;
- private const int ROTATION_6_0 = 25, ROTATION_6_1 = 29, ROTATION_6_2 = 39, ROTATION_6_3 = 43;
- private const int ROTATION_7_0 = 8, ROTATION_7_1 = 35, ROTATION_7_2 = 56, ROTATION_7_3 = 22;
-
- internal Threefish512Cipher(ulong[] kw, ulong[] t)
- : base(kw, t)
- {
- }
-
- internal override void EncryptBlock(ulong[] block, ulong[] outWords)
- {
- ulong[] kw = this.kw;
- ulong[] t = this.t;
- int[] mod9 = MOD9;
- int[] mod3 = MOD3;
-
- /* Help the JIT avoid index bounds checks */
- if (kw.Length != 17)
- {
- throw new ArgumentException();
- }
- if (t.Length != 5)
- {
- throw new ArgumentException();
- }
-
- /*
- * Read 8 words of plaintext data, not using arrays for cipher state
- */
- ulong b0 = block[0];
- ulong b1 = block[1];
- ulong b2 = block[2];
- ulong b3 = block[3];
- ulong b4 = block[4];
- ulong b5 = block[5];
- ulong b6 = block[6];
- ulong b7 = block[7];
-
- /*
- * First subkey injection.
- */
- b0 += kw[0];
- b1 += kw[1];
- b2 += kw[2];
- b3 += kw[3];
- b4 += kw[4];
- b5 += kw[5] + t[0];
- b6 += kw[6] + t[1];
- b7 += kw[7];
-
- /*
- * Rounds loop, unrolled to 8 rounds per iteration.
- *
- * Unrolling to multiples of 4 avoids the mod 4 check for key injection, and allows
- * inlining of the permutations, which cycle every of 4 rounds (avoiding array
- * index/lookup).
- *
- * Unrolling to multiples of 8 avoids the mod 8 rotation constant lookup, and allows
- * inlining constant rotation values (avoiding array index/lookup).
- */
-
- for (int d = 1; d < (ROUNDS_512 / 4); d += 2)
- {
- int dm9 = mod9[d];
- int dm3 = mod3[d];
-
- /*
- * 4 rounds of mix and permute.
- *
- * Permute schedule has a 4 round cycle, so permutes are inlined in the mix
- * operations in each 4 round block.
- */
- b1 = RotlXor(b1, ROTATION_0_0, b0 += b1);
- b3 = RotlXor(b3, ROTATION_0_1, b2 += b3);
- b5 = RotlXor(b5, ROTATION_0_2, b4 += b5);
- b7 = RotlXor(b7, ROTATION_0_3, b6 += b7);
-
- b1 = RotlXor(b1, ROTATION_1_0, b2 += b1);
- b7 = RotlXor(b7, ROTATION_1_1, b4 += b7);
- b5 = RotlXor(b5, ROTATION_1_2, b6 += b5);
- b3 = RotlXor(b3, ROTATION_1_3, b0 += b3);
-
- b1 = RotlXor(b1, ROTATION_2_0, b4 += b1);
- b3 = RotlXor(b3, ROTATION_2_1, b6 += b3);
- b5 = RotlXor(b5, ROTATION_2_2, b0 += b5);
- b7 = RotlXor(b7, ROTATION_2_3, b2 += b7);
-
- b1 = RotlXor(b1, ROTATION_3_0, b6 += b1);
- b7 = RotlXor(b7, ROTATION_3_1, b0 += b7);
- b5 = RotlXor(b5, ROTATION_3_2, b2 += b5);
- b3 = RotlXor(b3, ROTATION_3_3, b4 += b3);
-
- /*
- * Subkey injection for first 4 rounds.
- */
- b0 += kw[dm9];
- b1 += kw[dm9 + 1];
- b2 += kw[dm9 + 2];
- b3 += kw[dm9 + 3];
- b4 += kw[dm9 + 4];
- b5 += kw[dm9 + 5] + t[dm3];
- b6 += kw[dm9 + 6] + t[dm3 + 1];
- b7 += kw[dm9 + 7] + (uint)d;
-
- /*
- * 4 more rounds of mix/permute
- */
- b1 = RotlXor(b1, ROTATION_4_0, b0 += b1);
- b3 = RotlXor(b3, ROTATION_4_1, b2 += b3);
- b5 = RotlXor(b5, ROTATION_4_2, b4 += b5);
- b7 = RotlXor(b7, ROTATION_4_3, b6 += b7);
-
- b1 = RotlXor(b1, ROTATION_5_0, b2 += b1);
- b7 = RotlXor(b7, ROTATION_5_1, b4 += b7);
- b5 = RotlXor(b5, ROTATION_5_2, b6 += b5);
- b3 = RotlXor(b3, ROTATION_5_3, b0 += b3);
-
- b1 = RotlXor(b1, ROTATION_6_0, b4 += b1);
- b3 = RotlXor(b3, ROTATION_6_1, b6 += b3);
- b5 = RotlXor(b5, ROTATION_6_2, b0 += b5);
- b7 = RotlXor(b7, ROTATION_6_3, b2 += b7);
-
- b1 = RotlXor(b1, ROTATION_7_0, b6 += b1);
- b7 = RotlXor(b7, ROTATION_7_1, b0 += b7);
- b5 = RotlXor(b5, ROTATION_7_2, b2 += b5);
- b3 = RotlXor(b3, ROTATION_7_3, b4 += b3);
-
- /*
- * Subkey injection for next 4 rounds.
- */
- b0 += kw[dm9 + 1];
- b1 += kw[dm9 + 2];
- b2 += kw[dm9 + 3];
- b3 += kw[dm9 + 4];
- b4 += kw[dm9 + 5];
- b5 += kw[dm9 + 6] + t[dm3 + 1];
- b6 += kw[dm9 + 7] + t[dm3 + 2];
- b7 += kw[dm9 + 8] + (uint)d + 1;
- }
-
- /*
- * Output cipher state.
- */
- outWords[0] = b0;
- outWords[1] = b1;
- outWords[2] = b2;
- outWords[3] = b3;
- outWords[4] = b4;
- outWords[5] = b5;
- outWords[6] = b6;
- outWords[7] = b7;
- }
-
- internal override void DecryptBlock(ulong[] block, ulong[] state)
- {
- ulong[] kw = this.kw;
- ulong[] t = this.t;
- int[] mod9 = MOD9;
- int[] mod3 = MOD3;
-
- /* Help the JIT avoid index bounds checks */
- if (kw.Length != 17)
- {
- throw new ArgumentException();
- }
- if (t.Length != 5)
- {
- throw new ArgumentException();
- }
-
- ulong b0 = block[0];
- ulong b1 = block[1];
- ulong b2 = block[2];
- ulong b3 = block[3];
- ulong b4 = block[4];
- ulong b5 = block[5];
- ulong b6 = block[6];
- ulong b7 = block[7];
-
- for (int d = (ROUNDS_512 / 4) - 1; d >= 1; d -= 2)
- {
- int dm9 = mod9[d];
- int dm3 = mod3[d];
-
- /* Reverse key injection for second 4 rounds */
- b0 -= kw[dm9 + 1];
- b1 -= kw[dm9 + 2];
- b2 -= kw[dm9 + 3];
- b3 -= kw[dm9 + 4];
- b4 -= kw[dm9 + 5];
- b5 -= kw[dm9 + 6] + t[dm3 + 1];
- b6 -= kw[dm9 + 7] + t[dm3 + 2];
- b7 -= kw[dm9 + 8] + (uint)d + 1;
-
- /* Reverse second 4 mix/permute rounds */
-
- b1 = XorRotr(b1, ROTATION_7_0, b6);
- b6 -= b1;
- b7 = XorRotr(b7, ROTATION_7_1, b0);
- b0 -= b7;
- b5 = XorRotr(b5, ROTATION_7_2, b2);
- b2 -= b5;
- b3 = XorRotr(b3, ROTATION_7_3, b4);
- b4 -= b3;
-
- b1 = XorRotr(b1, ROTATION_6_0, b4);
- b4 -= b1;
- b3 = XorRotr(b3, ROTATION_6_1, b6);
- b6 -= b3;
- b5 = XorRotr(b5, ROTATION_6_2, b0);
- b0 -= b5;
- b7 = XorRotr(b7, ROTATION_6_3, b2);
- b2 -= b7;
-
- b1 = XorRotr(b1, ROTATION_5_0, b2);
- b2 -= b1;
- b7 = XorRotr(b7, ROTATION_5_1, b4);
- b4 -= b7;
- b5 = XorRotr(b5, ROTATION_5_2, b6);
- b6 -= b5;
- b3 = XorRotr(b3, ROTATION_5_3, b0);
- b0 -= b3;
-
- b1 = XorRotr(b1, ROTATION_4_0, b0);
- b0 -= b1;
- b3 = XorRotr(b3, ROTATION_4_1, b2);
- b2 -= b3;
- b5 = XorRotr(b5, ROTATION_4_2, b4);
- b4 -= b5;
- b7 = XorRotr(b7, ROTATION_4_3, b6);
- b6 -= b7;
-
- /* Reverse key injection for first 4 rounds */
- b0 -= kw[dm9];
- b1 -= kw[dm9 + 1];
- b2 -= kw[dm9 + 2];
- b3 -= kw[dm9 + 3];
- b4 -= kw[dm9 + 4];
- b5 -= kw[dm9 + 5] + t[dm3];
- b6 -= kw[dm9 + 6] + t[dm3 + 1];
- b7 -= kw[dm9 + 7] + (uint)d;
-
- /* Reverse first 4 mix/permute rounds */
- b1 = XorRotr(b1, ROTATION_3_0, b6);
- b6 -= b1;
- b7 = XorRotr(b7, ROTATION_3_1, b0);
- b0 -= b7;
- b5 = XorRotr(b5, ROTATION_3_2, b2);
- b2 -= b5;
- b3 = XorRotr(b3, ROTATION_3_3, b4);
- b4 -= b3;
-
- b1 = XorRotr(b1, ROTATION_2_0, b4);
- b4 -= b1;
- b3 = XorRotr(b3, ROTATION_2_1, b6);
- b6 -= b3;
- b5 = XorRotr(b5, ROTATION_2_2, b0);
- b0 -= b5;
- b7 = XorRotr(b7, ROTATION_2_3, b2);
- b2 -= b7;
-
- b1 = XorRotr(b1, ROTATION_1_0, b2);
- b2 -= b1;
- b7 = XorRotr(b7, ROTATION_1_1, b4);
- b4 -= b7;
- b5 = XorRotr(b5, ROTATION_1_2, b6);
- b6 -= b5;
- b3 = XorRotr(b3, ROTATION_1_3, b0);
- b0 -= b3;
-
- b1 = XorRotr(b1, ROTATION_0_0, b0);
- b0 -= b1;
- b3 = XorRotr(b3, ROTATION_0_1, b2);
- b2 -= b3;
- b5 = XorRotr(b5, ROTATION_0_2, b4);
- b4 -= b5;
- b7 = XorRotr(b7, ROTATION_0_3, b6);
- b6 -= b7;
- }
-
- /*
- * First subkey uninjection.
- */
- b0 -= kw[0];
- b1 -= kw[1];
- b2 -= kw[2];
- b3 -= kw[3];
- b4 -= kw[4];
- b5 -= kw[5] + t[0];
- b6 -= kw[6] + t[1];
- b7 -= kw[7];
-
- /*
- * Output cipher state.
- */
- state[0] = b0;
- state[1] = b1;
- state[2] = b2;
- state[3] = b3;
- state[4] = b4;
- state[5] = b5;
- state[6] = b6;
- state[7] = b7;
- }
- }
-
- private sealed class Threefish1024Cipher
- : ThreefishCipher
- {
- /**
- * Mix rotation constants defined in Skein 1.3 specification
- */
- private const int ROTATION_0_0 = 24, ROTATION_0_1 = 13, ROTATION_0_2 = 8, ROTATION_0_3 = 47;
- private const int ROTATION_0_4 = 8, ROTATION_0_5 = 17, ROTATION_0_6 = 22, ROTATION_0_7 = 37;
- private const int ROTATION_1_0 = 38, ROTATION_1_1 = 19, ROTATION_1_2 = 10, ROTATION_1_3 = 55;
- private const int ROTATION_1_4 = 49, ROTATION_1_5 = 18, ROTATION_1_6 = 23, ROTATION_1_7 = 52;
- private const int ROTATION_2_0 = 33, ROTATION_2_1 = 4, ROTATION_2_2 = 51, ROTATION_2_3 = 13;
- private const int ROTATION_2_4 = 34, ROTATION_2_5 = 41, ROTATION_2_6 = 59, ROTATION_2_7 = 17;
- private const int ROTATION_3_0 = 5, ROTATION_3_1 = 20, ROTATION_3_2 = 48, ROTATION_3_3 = 41;
- private const int ROTATION_3_4 = 47, ROTATION_3_5 = 28, ROTATION_3_6 = 16, ROTATION_3_7 = 25;
-
- private const int ROTATION_4_0 = 41, ROTATION_4_1 = 9, ROTATION_4_2 = 37, ROTATION_4_3 = 31;
- private const int ROTATION_4_4 = 12, ROTATION_4_5 = 47, ROTATION_4_6 = 44, ROTATION_4_7 = 30;
- private const int ROTATION_5_0 = 16, ROTATION_5_1 = 34, ROTATION_5_2 = 56, ROTATION_5_3 = 51;
- private const int ROTATION_5_4 = 4, ROTATION_5_5 = 53, ROTATION_5_6 = 42, ROTATION_5_7 = 41;
- private const int ROTATION_6_0 = 31, ROTATION_6_1 = 44, ROTATION_6_2 = 47, ROTATION_6_3 = 46;
- private const int ROTATION_6_4 = 19, ROTATION_6_5 = 42, ROTATION_6_6 = 44, ROTATION_6_7 = 25;
- private const int ROTATION_7_0 = 9, ROTATION_7_1 = 48, ROTATION_7_2 = 35, ROTATION_7_3 = 52;
- private const int ROTATION_7_4 = 23, ROTATION_7_5 = 31, ROTATION_7_6 = 37, ROTATION_7_7 = 20;
-
- public Threefish1024Cipher(ulong[] kw, ulong[] t)
- : base(kw, t)
- {
- }
-
- internal override void EncryptBlock(ulong[] block, ulong[] outWords)
- {
- ulong[] kw = this.kw;
- ulong[] t = this.t;
- int[] mod17 = MOD17;
- int[] mod3 = MOD3;
-
- /* Help the JIT avoid index bounds checks */
- if (kw.Length != 33)
- {
- throw new ArgumentException();
- }
- if (t.Length != 5)
- {
- throw new ArgumentException();
- }
-
- /*
- * Read 16 words of plaintext data, not using arrays for cipher state
- */
- ulong b0 = block[0];
- ulong b1 = block[1];
- ulong b2 = block[2];
- ulong b3 = block[3];
- ulong b4 = block[4];
- ulong b5 = block[5];
- ulong b6 = block[6];
- ulong b7 = block[7];
- ulong b8 = block[8];
- ulong b9 = block[9];
- ulong b10 = block[10];
- ulong b11 = block[11];
- ulong b12 = block[12];
- ulong b13 = block[13];
- ulong b14 = block[14];
- ulong b15 = block[15];
-
- /*
- * First subkey injection.
- */
- b0 += kw[0];
- b1 += kw[1];
- b2 += kw[2];
- b3 += kw[3];
- b4 += kw[4];
- b5 += kw[5];
- b6 += kw[6];
- b7 += kw[7];
- b8 += kw[8];
- b9 += kw[9];
- b10 += kw[10];
- b11 += kw[11];
- b12 += kw[12];
- b13 += kw[13] + t[0];
- b14 += kw[14] + t[1];
- b15 += kw[15];
-
- /*
- * Rounds loop, unrolled to 8 rounds per iteration.
- *
- * Unrolling to multiples of 4 avoids the mod 4 check for key injection, and allows
- * inlining of the permutations, which cycle every of 4 rounds (avoiding array
- * index/lookup).
- *
- * Unrolling to multiples of 8 avoids the mod 8 rotation constant lookup, and allows
- * inlining constant rotation values (avoiding array index/lookup).
- */
-
- for (int d = 1; d < (ROUNDS_1024 / 4); d += 2)
- {
- int dm17 = mod17[d];
- int dm3 = mod3[d];
-
- /*
- * 4 rounds of mix and permute.
- *
- * Permute schedule has a 4 round cycle, so permutes are inlined in the mix
- * operations in each 4 round block.
- */
- b1 = RotlXor(b1, ROTATION_0_0, b0 += b1);
- b3 = RotlXor(b3, ROTATION_0_1, b2 += b3);
- b5 = RotlXor(b5, ROTATION_0_2, b4 += b5);
- b7 = RotlXor(b7, ROTATION_0_3, b6 += b7);
- b9 = RotlXor(b9, ROTATION_0_4, b8 += b9);
- b11 = RotlXor(b11, ROTATION_0_5, b10 += b11);
- b13 = RotlXor(b13, ROTATION_0_6, b12 += b13);
- b15 = RotlXor(b15, ROTATION_0_7, b14 += b15);
-
- b9 = RotlXor(b9, ROTATION_1_0, b0 += b9);
- b13 = RotlXor(b13, ROTATION_1_1, b2 += b13);
- b11 = RotlXor(b11, ROTATION_1_2, b6 += b11);
- b15 = RotlXor(b15, ROTATION_1_3, b4 += b15);
- b7 = RotlXor(b7, ROTATION_1_4, b10 += b7);
- b3 = RotlXor(b3, ROTATION_1_5, b12 += b3);
- b5 = RotlXor(b5, ROTATION_1_6, b14 += b5);
- b1 = RotlXor(b1, ROTATION_1_7, b8 += b1);
-
- b7 = RotlXor(b7, ROTATION_2_0, b0 += b7);
- b5 = RotlXor(b5, ROTATION_2_1, b2 += b5);
- b3 = RotlXor(b3, ROTATION_2_2, b4 += b3);
- b1 = RotlXor(b1, ROTATION_2_3, b6 += b1);
- b15 = RotlXor(b15, ROTATION_2_4, b12 += b15);
- b13 = RotlXor(b13, ROTATION_2_5, b14 += b13);
- b11 = RotlXor(b11, ROTATION_2_6, b8 += b11);
- b9 = RotlXor(b9, ROTATION_2_7, b10 += b9);
-
- b15 = RotlXor(b15, ROTATION_3_0, b0 += b15);
- b11 = RotlXor(b11, ROTATION_3_1, b2 += b11);
- b13 = RotlXor(b13, ROTATION_3_2, b6 += b13);
- b9 = RotlXor(b9, ROTATION_3_3, b4 += b9);
- b1 = RotlXor(b1, ROTATION_3_4, b14 += b1);
- b5 = RotlXor(b5, ROTATION_3_5, b8 += b5);
- b3 = RotlXor(b3, ROTATION_3_6, b10 += b3);
- b7 = RotlXor(b7, ROTATION_3_7, b12 += b7);
-
- /*
- * Subkey injection for first 4 rounds.
- */
- b0 += kw[dm17];
- b1 += kw[dm17 + 1];
- b2 += kw[dm17 + 2];
- b3 += kw[dm17 + 3];
- b4 += kw[dm17 + 4];
- b5 += kw[dm17 + 5];
- b6 += kw[dm17 + 6];
- b7 += kw[dm17 + 7];
- b8 += kw[dm17 + 8];
- b9 += kw[dm17 + 9];
- b10 += kw[dm17 + 10];
- b11 += kw[dm17 + 11];
- b12 += kw[dm17 + 12];
- b13 += kw[dm17 + 13] + t[dm3];
- b14 += kw[dm17 + 14] + t[dm3 + 1];
- b15 += kw[dm17 + 15] + (uint)d;
-
- /*
- * 4 more rounds of mix/permute
- */
- b1 = RotlXor(b1, ROTATION_4_0, b0 += b1);
- b3 = RotlXor(b3, ROTATION_4_1, b2 += b3);
- b5 = RotlXor(b5, ROTATION_4_2, b4 += b5);
- b7 = RotlXor(b7, ROTATION_4_3, b6 += b7);
- b9 = RotlXor(b9, ROTATION_4_4, b8 += b9);
- b11 = RotlXor(b11, ROTATION_4_5, b10 += b11);
- b13 = RotlXor(b13, ROTATION_4_6, b12 += b13);
- b15 = RotlXor(b15, ROTATION_4_7, b14 += b15);
-
- b9 = RotlXor(b9, ROTATION_5_0, b0 += b9);
- b13 = RotlXor(b13, ROTATION_5_1, b2 += b13);
- b11 = RotlXor(b11, ROTATION_5_2, b6 += b11);
- b15 = RotlXor(b15, ROTATION_5_3, b4 += b15);
- b7 = RotlXor(b7, ROTATION_5_4, b10 += b7);
- b3 = RotlXor(b3, ROTATION_5_5, b12 += b3);
- b5 = RotlXor(b5, ROTATION_5_6, b14 += b5);
- b1 = RotlXor(b1, ROTATION_5_7, b8 += b1);
-
- b7 = RotlXor(b7, ROTATION_6_0, b0 += b7);
- b5 = RotlXor(b5, ROTATION_6_1, b2 += b5);
- b3 = RotlXor(b3, ROTATION_6_2, b4 += b3);
- b1 = RotlXor(b1, ROTATION_6_3, b6 += b1);
- b15 = RotlXor(b15, ROTATION_6_4, b12 += b15);
- b13 = RotlXor(b13, ROTATION_6_5, b14 += b13);
- b11 = RotlXor(b11, ROTATION_6_6, b8 += b11);
- b9 = RotlXor(b9, ROTATION_6_7, b10 += b9);
-
- b15 = RotlXor(b15, ROTATION_7_0, b0 += b15);
- b11 = RotlXor(b11, ROTATION_7_1, b2 += b11);
- b13 = RotlXor(b13, ROTATION_7_2, b6 += b13);
- b9 = RotlXor(b9, ROTATION_7_3, b4 += b9);
- b1 = RotlXor(b1, ROTATION_7_4, b14 += b1);
- b5 = RotlXor(b5, ROTATION_7_5, b8 += b5);
- b3 = RotlXor(b3, ROTATION_7_6, b10 += b3);
- b7 = RotlXor(b7, ROTATION_7_7, b12 += b7);
-
- /*
- * Subkey injection for next 4 rounds.
- */
- b0 += kw[dm17 + 1];
- b1 += kw[dm17 + 2];
- b2 += kw[dm17 + 3];
- b3 += kw[dm17 + 4];
- b4 += kw[dm17 + 5];
- b5 += kw[dm17 + 6];
- b6 += kw[dm17 + 7];
- b7 += kw[dm17 + 8];
- b8 += kw[dm17 + 9];
- b9 += kw[dm17 + 10];
- b10 += kw[dm17 + 11];
- b11 += kw[dm17 + 12];
- b12 += kw[dm17 + 13];
- b13 += kw[dm17 + 14] + t[dm3 + 1];
- b14 += kw[dm17 + 15] + t[dm3 + 2];
- b15 += kw[dm17 + 16] + (uint)d + 1;
-
- }
-
- /*
- * Output cipher state.
- */
- outWords[0] = b0;
- outWords[1] = b1;
- outWords[2] = b2;
- outWords[3] = b3;
- outWords[4] = b4;
- outWords[5] = b5;
- outWords[6] = b6;
- outWords[7] = b7;
- outWords[8] = b8;
- outWords[9] = b9;
- outWords[10] = b10;
- outWords[11] = b11;
- outWords[12] = b12;
- outWords[13] = b13;
- outWords[14] = b14;
- outWords[15] = b15;
- }
-
- internal override void DecryptBlock(ulong[] block, ulong[] state)
- {
- ulong[] kw = this.kw;
- ulong[] t = this.t;
- int[] mod17 = MOD17;
- int[] mod3 = MOD3;
-
- /* Help the JIT avoid index bounds checks */
- if (kw.Length != 33)
- {
- throw new ArgumentException();
- }
- if (t.Length != 5)
- {
- throw new ArgumentException();
- }
-
- ulong b0 = block[0];
- ulong b1 = block[1];
- ulong b2 = block[2];
- ulong b3 = block[3];
- ulong b4 = block[4];
- ulong b5 = block[5];
- ulong b6 = block[6];
- ulong b7 = block[7];
- ulong b8 = block[8];
- ulong b9 = block[9];
- ulong b10 = block[10];
- ulong b11 = block[11];
- ulong b12 = block[12];
- ulong b13 = block[13];
- ulong b14 = block[14];
- ulong b15 = block[15];
-
- for (int d = (ROUNDS_1024 / 4) - 1; d >= 1; d -= 2)
- {
- int dm17 = mod17[d];
- int dm3 = mod3[d];
-
- /* Reverse key injection for second 4 rounds */
- b0 -= kw[dm17 + 1];
- b1 -= kw[dm17 + 2];
- b2 -= kw[dm17 + 3];
- b3 -= kw[dm17 + 4];
- b4 -= kw[dm17 + 5];
- b5 -= kw[dm17 + 6];
- b6 -= kw[dm17 + 7];
- b7 -= kw[dm17 + 8];
- b8 -= kw[dm17 + 9];
- b9 -= kw[dm17 + 10];
- b10 -= kw[dm17 + 11];
- b11 -= kw[dm17 + 12];
- b12 -= kw[dm17 + 13];
- b13 -= kw[dm17 + 14] + t[dm3 + 1];
- b14 -= kw[dm17 + 15] + t[dm3 + 2];
- b15 -= kw[dm17 + 16] + (uint)d + 1;
-
- /* Reverse second 4 mix/permute rounds */
- b15 = XorRotr(b15, ROTATION_7_0, b0);
- b0 -= b15;
- b11 = XorRotr(b11, ROTATION_7_1, b2);
- b2 -= b11;
- b13 = XorRotr(b13, ROTATION_7_2, b6);
- b6 -= b13;
- b9 = XorRotr(b9, ROTATION_7_3, b4);
- b4 -= b9;
- b1 = XorRotr(b1, ROTATION_7_4, b14);
- b14 -= b1;
- b5 = XorRotr(b5, ROTATION_7_5, b8);
- b8 -= b5;
- b3 = XorRotr(b3, ROTATION_7_6, b10);
- b10 -= b3;
- b7 = XorRotr(b7, ROTATION_7_7, b12);
- b12 -= b7;
-
- b7 = XorRotr(b7, ROTATION_6_0, b0);
- b0 -= b7;
- b5 = XorRotr(b5, ROTATION_6_1, b2);
- b2 -= b5;
- b3 = XorRotr(b3, ROTATION_6_2, b4);
- b4 -= b3;
- b1 = XorRotr(b1, ROTATION_6_3, b6);
- b6 -= b1;
- b15 = XorRotr(b15, ROTATION_6_4, b12);
- b12 -= b15;
- b13 = XorRotr(b13, ROTATION_6_5, b14);
- b14 -= b13;
- b11 = XorRotr(b11, ROTATION_6_6, b8);
- b8 -= b11;
- b9 = XorRotr(b9, ROTATION_6_7, b10);
- b10 -= b9;
-
- b9 = XorRotr(b9, ROTATION_5_0, b0);
- b0 -= b9;
- b13 = XorRotr(b13, ROTATION_5_1, b2);
- b2 -= b13;
- b11 = XorRotr(b11, ROTATION_5_2, b6);
- b6 -= b11;
- b15 = XorRotr(b15, ROTATION_5_3, b4);
- b4 -= b15;
- b7 = XorRotr(b7, ROTATION_5_4, b10);
- b10 -= b7;
- b3 = XorRotr(b3, ROTATION_5_5, b12);
- b12 -= b3;
- b5 = XorRotr(b5, ROTATION_5_6, b14);
- b14 -= b5;
- b1 = XorRotr(b1, ROTATION_5_7, b8);
- b8 -= b1;
-
- b1 = XorRotr(b1, ROTATION_4_0, b0);
- b0 -= b1;
- b3 = XorRotr(b3, ROTATION_4_1, b2);
- b2 -= b3;
- b5 = XorRotr(b5, ROTATION_4_2, b4);
- b4 -= b5;
- b7 = XorRotr(b7, ROTATION_4_3, b6);
- b6 -= b7;
- b9 = XorRotr(b9, ROTATION_4_4, b8);
- b8 -= b9;
- b11 = XorRotr(b11, ROTATION_4_5, b10);
- b10 -= b11;
- b13 = XorRotr(b13, ROTATION_4_6, b12);
- b12 -= b13;
- b15 = XorRotr(b15, ROTATION_4_7, b14);
- b14 -= b15;
-
- /* Reverse key injection for first 4 rounds */
- b0 -= kw[dm17];
- b1 -= kw[dm17 + 1];
- b2 -= kw[dm17 + 2];
- b3 -= kw[dm17 + 3];
- b4 -= kw[dm17 + 4];
- b5 -= kw[dm17 + 5];
- b6 -= kw[dm17 + 6];
- b7 -= kw[dm17 + 7];
- b8 -= kw[dm17 + 8];
- b9 -= kw[dm17 + 9];
- b10 -= kw[dm17 + 10];
- b11 -= kw[dm17 + 11];
- b12 -= kw[dm17 + 12];
- b13 -= kw[dm17 + 13] + t[dm3];
- b14 -= kw[dm17 + 14] + t[dm3 + 1];
- b15 -= kw[dm17 + 15] + (uint)d;
-
- /* Reverse first 4 mix/permute rounds */
- b15 = XorRotr(b15, ROTATION_3_0, b0);
- b0 -= b15;
- b11 = XorRotr(b11, ROTATION_3_1, b2);
- b2 -= b11;
- b13 = XorRotr(b13, ROTATION_3_2, b6);
- b6 -= b13;
- b9 = XorRotr(b9, ROTATION_3_3, b4);
- b4 -= b9;
- b1 = XorRotr(b1, ROTATION_3_4, b14);
- b14 -= b1;
- b5 = XorRotr(b5, ROTATION_3_5, b8);
- b8 -= b5;
- b3 = XorRotr(b3, ROTATION_3_6, b10);
- b10 -= b3;
- b7 = XorRotr(b7, ROTATION_3_7, b12);
- b12 -= b7;
-
- b7 = XorRotr(b7, ROTATION_2_0, b0);
- b0 -= b7;
- b5 = XorRotr(b5, ROTATION_2_1, b2);
- b2 -= b5;
- b3 = XorRotr(b3, ROTATION_2_2, b4);
- b4 -= b3;
- b1 = XorRotr(b1, ROTATION_2_3, b6);
- b6 -= b1;
- b15 = XorRotr(b15, ROTATION_2_4, b12);
- b12 -= b15;
- b13 = XorRotr(b13, ROTATION_2_5, b14);
- b14 -= b13;
- b11 = XorRotr(b11, ROTATION_2_6, b8);
- b8 -= b11;
- b9 = XorRotr(b9, ROTATION_2_7, b10);
- b10 -= b9;
-
- b9 = XorRotr(b9, ROTATION_1_0, b0);
- b0 -= b9;
- b13 = XorRotr(b13, ROTATION_1_1, b2);
- b2 -= b13;
- b11 = XorRotr(b11, ROTATION_1_2, b6);
- b6 -= b11;
- b15 = XorRotr(b15, ROTATION_1_3, b4);
- b4 -= b15;
- b7 = XorRotr(b7, ROTATION_1_4, b10);
- b10 -= b7;
- b3 = XorRotr(b3, ROTATION_1_5, b12);
- b12 -= b3;
- b5 = XorRotr(b5, ROTATION_1_6, b14);
- b14 -= b5;
- b1 = XorRotr(b1, ROTATION_1_7, b8);
- b8 -= b1;
-
- b1 = XorRotr(b1, ROTATION_0_0, b0);
- b0 -= b1;
- b3 = XorRotr(b3, ROTATION_0_1, b2);
- b2 -= b3;
- b5 = XorRotr(b5, ROTATION_0_2, b4);
- b4 -= b5;
- b7 = XorRotr(b7, ROTATION_0_3, b6);
- b6 -= b7;
- b9 = XorRotr(b9, ROTATION_0_4, b8);
- b8 -= b9;
- b11 = XorRotr(b11, ROTATION_0_5, b10);
- b10 -= b11;
- b13 = XorRotr(b13, ROTATION_0_6, b12);
- b12 -= b13;
- b15 = XorRotr(b15, ROTATION_0_7, b14);
- b14 -= b15;
- }
-
- /*
- * First subkey uninjection.
- */
- b0 -= kw[0];
- b1 -= kw[1];
- b2 -= kw[2];
- b3 -= kw[3];
- b4 -= kw[4];
- b5 -= kw[5];
- b6 -= kw[6];
- b7 -= kw[7];
- b8 -= kw[8];
- b9 -= kw[9];
- b10 -= kw[10];
- b11 -= kw[11];
- b12 -= kw[12];
- b13 -= kw[13] + t[0];
- b14 -= kw[14] + t[1];
- b15 -= kw[15];
-
- /*
- * Output cipher state.
- */
- state[0] = b0;
- state[1] = b1;
- state[2] = b2;
- state[3] = b3;
- state[4] = b4;
- state[5] = b5;
- state[6] = b6;
- state[7] = b7;
- state[8] = b8;
- state[9] = b9;
- state[10] = b10;
- state[11] = b11;
- state[12] = b12;
- state[13] = b13;
- state[14] = b14;
- state[15] = b15;
- }
-
- }
-
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/crypto/engines/TnepresEngine.cs b/BCCrypto/src/crypto/engines/TnepresEngine.cs
deleted file mode 100644
index ce687d1..0000000
--- a/BCCrypto/src/crypto/engines/TnepresEngine.cs
+++ /dev/null
@@ -1,299 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * Tnepres is a 128-bit 32-round block cipher with variable key lengths,
- * including 128, 192 and 256 bit keys conjectured to be at least as
- * secure as three-key triple-DES.
- *
- * Tnepres is based on Serpent which was designed by Ross Anderson, Eli Biham and Lars Knudsen as a
- * candidate algorithm for the NIST AES Quest. Unfortunately there was an endianness issue
- * with test vectors in the AES submission and the resulting confusion lead to the Tnepres cipher
- * as well, which is a byte swapped version of Serpent.
- *
- *
- * For full details see The Serpent home page
- *
- */
- public sealed class TnepresEngine
- : SerpentEngineBase
- {
- public override string AlgorithmName
- {
- get { return "Tnepres"; }
- }
-
- /**
- * Expand a user-supplied key material into a session key.
- *
- * @param key The user-key bytes (multiples of 4) to use.
- * @exception ArgumentException
- */
- protected override int[] MakeWorkingKey(byte[] key)
- {
- //
- // pad key to 256 bits
- //
- int[] kPad = new int[16];
- int off = 0;
- int length = 0;
-
- for (off = key.Length - 4; off > 0; off -= 4)
- {
- kPad[length++] = (int)Pack.BE_To_UInt32(key, off);
- }
-
- if (off == 0)
- {
- kPad[length++] = (int)Pack.BE_To_UInt32(key, 0);
- if (length < 8)
- {
- kPad[length] = 1;
- }
- }
- else
- {
- throw new ArgumentException("key must be a multiple of 4 bytes");
- }
-
- //
- // expand the padded key up to 33 x 128 bits of key material
- //
- int amount = (ROUNDS + 1) * 4;
- int[] w = new int[amount];
-
- //
- // compute w0 to w7 from w-8 to w-1
- //
- for (int i = 8; i < 16; i++)
- {
- kPad[i] = RotateLeft(kPad[i - 8] ^ kPad[i - 5] ^ kPad[i - 3] ^ kPad[i - 1] ^ PHI ^ (i - 8), 11);
- }
-
- Array.Copy(kPad, 8, w, 0, 8);
-
- //
- // compute w8 to w136
- //
- for (int i = 8; i < amount; i++)
- {
- w[i] = RotateLeft(w[i - 8] ^ w[i - 5] ^ w[i - 3] ^ w[i - 1] ^ PHI ^ i, 11);
- }
-
- //
- // create the working keys by processing w with the Sbox and IP
- //
- Sb3(w[0], w[1], w[2], w[3]);
- w[0] = X0; w[1] = X1; w[2] = X2; w[3] = X3;
- Sb2(w[4], w[5], w[6], w[7]);
- w[4] = X0; w[5] = X1; w[6] = X2; w[7] = X3;
- Sb1(w[8], w[9], w[10], w[11]);
- w[8] = X0; w[9] = X1; w[10] = X2; w[11] = X3;
- Sb0(w[12], w[13], w[14], w[15]);
- w[12] = X0; w[13] = X1; w[14] = X2; w[15] = X3;
- Sb7(w[16], w[17], w[18], w[19]);
- w[16] = X0; w[17] = X1; w[18] = X2; w[19] = X3;
- Sb6(w[20], w[21], w[22], w[23]);
- w[20] = X0; w[21] = X1; w[22] = X2; w[23] = X3;
- Sb5(w[24], w[25], w[26], w[27]);
- w[24] = X0; w[25] = X1; w[26] = X2; w[27] = X3;
- Sb4(w[28], w[29], w[30], w[31]);
- w[28] = X0; w[29] = X1; w[30] = X2; w[31] = X3;
- Sb3(w[32], w[33], w[34], w[35]);
- w[32] = X0; w[33] = X1; w[34] = X2; w[35] = X3;
- Sb2(w[36], w[37], w[38], w[39]);
- w[36] = X0; w[37] = X1; w[38] = X2; w[39] = X3;
- Sb1(w[40], w[41], w[42], w[43]);
- w[40] = X0; w[41] = X1; w[42] = X2; w[43] = X3;
- Sb0(w[44], w[45], w[46], w[47]);
- w[44] = X0; w[45] = X1; w[46] = X2; w[47] = X3;
- Sb7(w[48], w[49], w[50], w[51]);
- w[48] = X0; w[49] = X1; w[50] = X2; w[51] = X3;
- Sb6(w[52], w[53], w[54], w[55]);
- w[52] = X0; w[53] = X1; w[54] = X2; w[55] = X3;
- Sb5(w[56], w[57], w[58], w[59]);
- w[56] = X0; w[57] = X1; w[58] = X2; w[59] = X3;
- Sb4(w[60], w[61], w[62], w[63]);
- w[60] = X0; w[61] = X1; w[62] = X2; w[63] = X3;
- Sb3(w[64], w[65], w[66], w[67]);
- w[64] = X0; w[65] = X1; w[66] = X2; w[67] = X3;
- Sb2(w[68], w[69], w[70], w[71]);
- w[68] = X0; w[69] = X1; w[70] = X2; w[71] = X3;
- Sb1(w[72], w[73], w[74], w[75]);
- w[72] = X0; w[73] = X1; w[74] = X2; w[75] = X3;
- Sb0(w[76], w[77], w[78], w[79]);
- w[76] = X0; w[77] = X1; w[78] = X2; w[79] = X3;
- Sb7(w[80], w[81], w[82], w[83]);
- w[80] = X0; w[81] = X1; w[82] = X2; w[83] = X3;
- Sb6(w[84], w[85], w[86], w[87]);
- w[84] = X0; w[85] = X1; w[86] = X2; w[87] = X3;
- Sb5(w[88], w[89], w[90], w[91]);
- w[88] = X0; w[89] = X1; w[90] = X2; w[91] = X3;
- Sb4(w[92], w[93], w[94], w[95]);
- w[92] = X0; w[93] = X1; w[94] = X2; w[95] = X3;
- Sb3(w[96], w[97], w[98], w[99]);
- w[96] = X0; w[97] = X1; w[98] = X2; w[99] = X3;
- Sb2(w[100], w[101], w[102], w[103]);
- w[100] = X0; w[101] = X1; w[102] = X2; w[103] = X3;
- Sb1(w[104], w[105], w[106], w[107]);
- w[104] = X0; w[105] = X1; w[106] = X2; w[107] = X3;
- Sb0(w[108], w[109], w[110], w[111]);
- w[108] = X0; w[109] = X1; w[110] = X2; w[111] = X3;
- Sb7(w[112], w[113], w[114], w[115]);
- w[112] = X0; w[113] = X1; w[114] = X2; w[115] = X3;
- Sb6(w[116], w[117], w[118], w[119]);
- w[116] = X0; w[117] = X1; w[118] = X2; w[119] = X3;
- Sb5(w[120], w[121], w[122], w[123]);
- w[120] = X0; w[121] = X1; w[122] = X2; w[123] = X3;
- Sb4(w[124], w[125], w[126], w[127]);
- w[124] = X0; w[125] = X1; w[126] = X2; w[127] = X3;
- Sb3(w[128], w[129], w[130], w[131]);
- w[128] = X0; w[129] = X1; w[130] = X2; w[131] = X3;
-
- return w;
- }
-
- /**
- * Encrypt one block of plaintext.
- *
- * @param input the array containing the input data.
- * @param inOff offset into the in array the data starts at.
- * @param output the array the output data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- */
- protected override void EncryptBlock(byte[] input, int inOff, byte[] output, int outOff)
- {
- X3 = (int)Pack.BE_To_UInt32(input, inOff);
- X2 = (int)Pack.BE_To_UInt32(input, inOff + 4);
- X1 = (int)Pack.BE_To_UInt32(input, inOff + 8);
- X0 = (int)Pack.BE_To_UInt32(input, inOff + 12);
-
- Sb0(wKey[0] ^ X0, wKey[1] ^ X1, wKey[2] ^ X2, wKey[3] ^ X3); LT();
- Sb1(wKey[4] ^ X0, wKey[5] ^ X1, wKey[6] ^ X2, wKey[7] ^ X3); LT();
- Sb2(wKey[8] ^ X0, wKey[9] ^ X1, wKey[10] ^ X2, wKey[11] ^ X3); LT();
- Sb3(wKey[12] ^ X0, wKey[13] ^ X1, wKey[14] ^ X2, wKey[15] ^ X3); LT();
- Sb4(wKey[16] ^ X0, wKey[17] ^ X1, wKey[18] ^ X2, wKey[19] ^ X3); LT();
- Sb5(wKey[20] ^ X0, wKey[21] ^ X1, wKey[22] ^ X2, wKey[23] ^ X3); LT();
- Sb6(wKey[24] ^ X0, wKey[25] ^ X1, wKey[26] ^ X2, wKey[27] ^ X3); LT();
- Sb7(wKey[28] ^ X0, wKey[29] ^ X1, wKey[30] ^ X2, wKey[31] ^ X3); LT();
- Sb0(wKey[32] ^ X0, wKey[33] ^ X1, wKey[34] ^ X2, wKey[35] ^ X3); LT();
- Sb1(wKey[36] ^ X0, wKey[37] ^ X1, wKey[38] ^ X2, wKey[39] ^ X3); LT();
- Sb2(wKey[40] ^ X0, wKey[41] ^ X1, wKey[42] ^ X2, wKey[43] ^ X3); LT();
- Sb3(wKey[44] ^ X0, wKey[45] ^ X1, wKey[46] ^ X2, wKey[47] ^ X3); LT();
- Sb4(wKey[48] ^ X0, wKey[49] ^ X1, wKey[50] ^ X2, wKey[51] ^ X3); LT();
- Sb5(wKey[52] ^ X0, wKey[53] ^ X1, wKey[54] ^ X2, wKey[55] ^ X3); LT();
- Sb6(wKey[56] ^ X0, wKey[57] ^ X1, wKey[58] ^ X2, wKey[59] ^ X3); LT();
- Sb7(wKey[60] ^ X0, wKey[61] ^ X1, wKey[62] ^ X2, wKey[63] ^ X3); LT();
- Sb0(wKey[64] ^ X0, wKey[65] ^ X1, wKey[66] ^ X2, wKey[67] ^ X3); LT();
- Sb1(wKey[68] ^ X0, wKey[69] ^ X1, wKey[70] ^ X2, wKey[71] ^ X3); LT();
- Sb2(wKey[72] ^ X0, wKey[73] ^ X1, wKey[74] ^ X2, wKey[75] ^ X3); LT();
- Sb3(wKey[76] ^ X0, wKey[77] ^ X1, wKey[78] ^ X2, wKey[79] ^ X3); LT();
- Sb4(wKey[80] ^ X0, wKey[81] ^ X1, wKey[82] ^ X2, wKey[83] ^ X3); LT();
- Sb5(wKey[84] ^ X0, wKey[85] ^ X1, wKey[86] ^ X2, wKey[87] ^ X3); LT();
- Sb6(wKey[88] ^ X0, wKey[89] ^ X1, wKey[90] ^ X2, wKey[91] ^ X3); LT();
- Sb7(wKey[92] ^ X0, wKey[93] ^ X1, wKey[94] ^ X2, wKey[95] ^ X3); LT();
- Sb0(wKey[96] ^ X0, wKey[97] ^ X1, wKey[98] ^ X2, wKey[99] ^ X3); LT();
- Sb1(wKey[100] ^ X0, wKey[101] ^ X1, wKey[102] ^ X2, wKey[103] ^ X3); LT();
- Sb2(wKey[104] ^ X0, wKey[105] ^ X1, wKey[106] ^ X2, wKey[107] ^ X3); LT();
- Sb3(wKey[108] ^ X0, wKey[109] ^ X1, wKey[110] ^ X2, wKey[111] ^ X3); LT();
- Sb4(wKey[112] ^ X0, wKey[113] ^ X1, wKey[114] ^ X2, wKey[115] ^ X3); LT();
- Sb5(wKey[116] ^ X0, wKey[117] ^ X1, wKey[118] ^ X2, wKey[119] ^ X3); LT();
- Sb6(wKey[120] ^ X0, wKey[121] ^ X1, wKey[122] ^ X2, wKey[123] ^ X3); LT();
- Sb7(wKey[124] ^ X0, wKey[125] ^ X1, wKey[126] ^ X2, wKey[127] ^ X3);
-
- Pack.UInt32_To_BE((uint)(wKey[131] ^ X3), output, outOff);
- Pack.UInt32_To_BE((uint)(wKey[130] ^ X2), output, outOff + 4);
- Pack.UInt32_To_BE((uint)(wKey[129] ^ X1), output, outOff + 8);
- Pack.UInt32_To_BE((uint)(wKey[128] ^ X0), output, outOff + 12);
- }
-
- /**
- * Decrypt one block of ciphertext.
- *
- * @param input the array containing the input data.
- * @param inOff offset into the in array the data starts at.
- * @param output the array the output data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- */
- protected override void DecryptBlock(byte[] input, int inOff, byte[] output, int outOff)
- {
- X3 = wKey[131] ^ (int)Pack.BE_To_UInt32(input, inOff);
- X2 = wKey[130] ^ (int)Pack.BE_To_UInt32(input, inOff + 4);
- X1 = wKey[129] ^ (int)Pack.BE_To_UInt32(input, inOff + 8);
- X0 = wKey[128] ^ (int)Pack.BE_To_UInt32(input, inOff + 12);
-
- Ib7(X0, X1, X2, X3);
- X0 ^= wKey[124]; X1 ^= wKey[125]; X2 ^= wKey[126]; X3 ^= wKey[127];
- InverseLT(); Ib6(X0, X1, X2, X3);
- X0 ^= wKey[120]; X1 ^= wKey[121]; X2 ^= wKey[122]; X3 ^= wKey[123];
- InverseLT(); Ib5(X0, X1, X2, X3);
- X0 ^= wKey[116]; X1 ^= wKey[117]; X2 ^= wKey[118]; X3 ^= wKey[119];
- InverseLT(); Ib4(X0, X1, X2, X3);
- X0 ^= wKey[112]; X1 ^= wKey[113]; X2 ^= wKey[114]; X3 ^= wKey[115];
- InverseLT(); Ib3(X0, X1, X2, X3);
- X0 ^= wKey[108]; X1 ^= wKey[109]; X2 ^= wKey[110]; X3 ^= wKey[111];
- InverseLT(); Ib2(X0, X1, X2, X3);
- X0 ^= wKey[104]; X1 ^= wKey[105]; X2 ^= wKey[106]; X3 ^= wKey[107];
- InverseLT(); Ib1(X0, X1, X2, X3);
- X0 ^= wKey[100]; X1 ^= wKey[101]; X2 ^= wKey[102]; X3 ^= wKey[103];
- InverseLT(); Ib0(X0, X1, X2, X3);
- X0 ^= wKey[96]; X1 ^= wKey[97]; X2 ^= wKey[98]; X3 ^= wKey[99];
- InverseLT(); Ib7(X0, X1, X2, X3);
- X0 ^= wKey[92]; X1 ^= wKey[93]; X2 ^= wKey[94]; X3 ^= wKey[95];
- InverseLT(); Ib6(X0, X1, X2, X3);
- X0 ^= wKey[88]; X1 ^= wKey[89]; X2 ^= wKey[90]; X3 ^= wKey[91];
- InverseLT(); Ib5(X0, X1, X2, X3);
- X0 ^= wKey[84]; X1 ^= wKey[85]; X2 ^= wKey[86]; X3 ^= wKey[87];
- InverseLT(); Ib4(X0, X1, X2, X3);
- X0 ^= wKey[80]; X1 ^= wKey[81]; X2 ^= wKey[82]; X3 ^= wKey[83];
- InverseLT(); Ib3(X0, X1, X2, X3);
- X0 ^= wKey[76]; X1 ^= wKey[77]; X2 ^= wKey[78]; X3 ^= wKey[79];
- InverseLT(); Ib2(X0, X1, X2, X3);
- X0 ^= wKey[72]; X1 ^= wKey[73]; X2 ^= wKey[74]; X3 ^= wKey[75];
- InverseLT(); Ib1(X0, X1, X2, X3);
- X0 ^= wKey[68]; X1 ^= wKey[69]; X2 ^= wKey[70]; X3 ^= wKey[71];
- InverseLT(); Ib0(X0, X1, X2, X3);
- X0 ^= wKey[64]; X1 ^= wKey[65]; X2 ^= wKey[66]; X3 ^= wKey[67];
- InverseLT(); Ib7(X0, X1, X2, X3);
- X0 ^= wKey[60]; X1 ^= wKey[61]; X2 ^= wKey[62]; X3 ^= wKey[63];
- InverseLT(); Ib6(X0, X1, X2, X3);
- X0 ^= wKey[56]; X1 ^= wKey[57]; X2 ^= wKey[58]; X3 ^= wKey[59];
- InverseLT(); Ib5(X0, X1, X2, X3);
- X0 ^= wKey[52]; X1 ^= wKey[53]; X2 ^= wKey[54]; X3 ^= wKey[55];
- InverseLT(); Ib4(X0, X1, X2, X3);
- X0 ^= wKey[48]; X1 ^= wKey[49]; X2 ^= wKey[50]; X3 ^= wKey[51];
- InverseLT(); Ib3(X0, X1, X2, X3);
- X0 ^= wKey[44]; X1 ^= wKey[45]; X2 ^= wKey[46]; X3 ^= wKey[47];
- InverseLT(); Ib2(X0, X1, X2, X3);
- X0 ^= wKey[40]; X1 ^= wKey[41]; X2 ^= wKey[42]; X3 ^= wKey[43];
- InverseLT(); Ib1(X0, X1, X2, X3);
- X0 ^= wKey[36]; X1 ^= wKey[37]; X2 ^= wKey[38]; X3 ^= wKey[39];
- InverseLT(); Ib0(X0, X1, X2, X3);
- X0 ^= wKey[32]; X1 ^= wKey[33]; X2 ^= wKey[34]; X3 ^= wKey[35];
- InverseLT(); Ib7(X0, X1, X2, X3);
- X0 ^= wKey[28]; X1 ^= wKey[29]; X2 ^= wKey[30]; X3 ^= wKey[31];
- InverseLT(); Ib6(X0, X1, X2, X3);
- X0 ^= wKey[24]; X1 ^= wKey[25]; X2 ^= wKey[26]; X3 ^= wKey[27];
- InverseLT(); Ib5(X0, X1, X2, X3);
- X0 ^= wKey[20]; X1 ^= wKey[21]; X2 ^= wKey[22]; X3 ^= wKey[23];
- InverseLT(); Ib4(X0, X1, X2, X3);
- X0 ^= wKey[16]; X1 ^= wKey[17]; X2 ^= wKey[18]; X3 ^= wKey[19];
- InverseLT(); Ib3(X0, X1, X2, X3);
- X0 ^= wKey[12]; X1 ^= wKey[13]; X2 ^= wKey[14]; X3 ^= wKey[15];
- InverseLT(); Ib2(X0, X1, X2, X3);
- X0 ^= wKey[8]; X1 ^= wKey[9]; X2 ^= wKey[10]; X3 ^= wKey[11];
- InverseLT(); Ib1(X0, X1, X2, X3);
- X0 ^= wKey[4]; X1 ^= wKey[5]; X2 ^= wKey[6]; X3 ^= wKey[7];
- InverseLT(); Ib0(X0, X1, X2, X3);
-
- Pack.UInt32_To_BE((uint)(X3 ^ wKey[3]), output, outOff);
- Pack.UInt32_To_BE((uint)(X2 ^ wKey[2]), output, outOff + 4);
- Pack.UInt32_To_BE((uint)(X1 ^ wKey[1]), output, outOff + 8);
- Pack.UInt32_To_BE((uint)(X0 ^ wKey[0]), output, outOff + 12);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/TwofishEngine.cs b/BCCrypto/src/crypto/engines/TwofishEngine.cs
deleted file mode 100644
index 71c2465..0000000
--- a/BCCrypto/src/crypto/engines/TwofishEngine.cs
+++ /dev/null
@@ -1,675 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * A class that provides Twofish encryption operations.
- *
- * This Java implementation is based on the Java reference
- * implementation provided by Bruce Schneier and developed
- * by Raif S. Naffah.
- */
- public sealed class TwofishEngine
- : IBlockCipher
- {
- private static readonly byte[,] P = {
- { // p0
- (byte) 0xA9, (byte) 0x67, (byte) 0xB3, (byte) 0xE8,
- (byte) 0x04, (byte) 0xFD, (byte) 0xA3, (byte) 0x76,
- (byte) 0x9A, (byte) 0x92, (byte) 0x80, (byte) 0x78,
- (byte) 0xE4, (byte) 0xDD, (byte) 0xD1, (byte) 0x38,
- (byte) 0x0D, (byte) 0xC6, (byte) 0x35, (byte) 0x98,
- (byte) 0x18, (byte) 0xF7, (byte) 0xEC, (byte) 0x6C,
- (byte) 0x43, (byte) 0x75, (byte) 0x37, (byte) 0x26,
- (byte) 0xFA, (byte) 0x13, (byte) 0x94, (byte) 0x48,
- (byte) 0xF2, (byte) 0xD0, (byte) 0x8B, (byte) 0x30,
- (byte) 0x84, (byte) 0x54, (byte) 0xDF, (byte) 0x23,
- (byte) 0x19, (byte) 0x5B, (byte) 0x3D, (byte) 0x59,
- (byte) 0xF3, (byte) 0xAE, (byte) 0xA2, (byte) 0x82,
- (byte) 0x63, (byte) 0x01, (byte) 0x83, (byte) 0x2E,
- (byte) 0xD9, (byte) 0x51, (byte) 0x9B, (byte) 0x7C,
- (byte) 0xA6, (byte) 0xEB, (byte) 0xA5, (byte) 0xBE,
- (byte) 0x16, (byte) 0x0C, (byte) 0xE3, (byte) 0x61,
- (byte) 0xC0, (byte) 0x8C, (byte) 0x3A, (byte) 0xF5,
- (byte) 0x73, (byte) 0x2C, (byte) 0x25, (byte) 0x0B,
- (byte) 0xBB, (byte) 0x4E, (byte) 0x89, (byte) 0x6B,
- (byte) 0x53, (byte) 0x6A, (byte) 0xB4, (byte) 0xF1,
- (byte) 0xE1, (byte) 0xE6, (byte) 0xBD, (byte) 0x45,
- (byte) 0xE2, (byte) 0xF4, (byte) 0xB6, (byte) 0x66,
- (byte) 0xCC, (byte) 0x95, (byte) 0x03, (byte) 0x56,
- (byte) 0xD4, (byte) 0x1C, (byte) 0x1E, (byte) 0xD7,
- (byte) 0xFB, (byte) 0xC3, (byte) 0x8E, (byte) 0xB5,
- (byte) 0xE9, (byte) 0xCF, (byte) 0xBF, (byte) 0xBA,
- (byte) 0xEA, (byte) 0x77, (byte) 0x39, (byte) 0xAF,
- (byte) 0x33, (byte) 0xC9, (byte) 0x62, (byte) 0x71,
- (byte) 0x81, (byte) 0x79, (byte) 0x09, (byte) 0xAD,
- (byte) 0x24, (byte) 0xCD, (byte) 0xF9, (byte) 0xD8,
- (byte) 0xE5, (byte) 0xC5, (byte) 0xB9, (byte) 0x4D,
- (byte) 0x44, (byte) 0x08, (byte) 0x86, (byte) 0xE7,
- (byte) 0xA1, (byte) 0x1D, (byte) 0xAA, (byte) 0xED,
- (byte) 0x06, (byte) 0x70, (byte) 0xB2, (byte) 0xD2,
- (byte) 0x41, (byte) 0x7B, (byte) 0xA0, (byte) 0x11,
- (byte) 0x31, (byte) 0xC2, (byte) 0x27, (byte) 0x90,
- (byte) 0x20, (byte) 0xF6, (byte) 0x60, (byte) 0xFF,
- (byte) 0x96, (byte) 0x5C, (byte) 0xB1, (byte) 0xAB,
- (byte) 0x9E, (byte) 0x9C, (byte) 0x52, (byte) 0x1B,
- (byte) 0x5F, (byte) 0x93, (byte) 0x0A, (byte) 0xEF,
- (byte) 0x91, (byte) 0x85, (byte) 0x49, (byte) 0xEE,
- (byte) 0x2D, (byte) 0x4F, (byte) 0x8F, (byte) 0x3B,
- (byte) 0x47, (byte) 0x87, (byte) 0x6D, (byte) 0x46,
- (byte) 0xD6, (byte) 0x3E, (byte) 0x69, (byte) 0x64,
- (byte) 0x2A, (byte) 0xCE, (byte) 0xCB, (byte) 0x2F,
- (byte) 0xFC, (byte) 0x97, (byte) 0x05, (byte) 0x7A,
- (byte) 0xAC, (byte) 0x7F, (byte) 0xD5, (byte) 0x1A,
- (byte) 0x4B, (byte) 0x0E, (byte) 0xA7, (byte) 0x5A,
- (byte) 0x28, (byte) 0x14, (byte) 0x3F, (byte) 0x29,
- (byte) 0x88, (byte) 0x3C, (byte) 0x4C, (byte) 0x02,
- (byte) 0xB8, (byte) 0xDA, (byte) 0xB0, (byte) 0x17,
- (byte) 0x55, (byte) 0x1F, (byte) 0x8A, (byte) 0x7D,
- (byte) 0x57, (byte) 0xC7, (byte) 0x8D, (byte) 0x74,
- (byte) 0xB7, (byte) 0xC4, (byte) 0x9F, (byte) 0x72,
- (byte) 0x7E, (byte) 0x15, (byte) 0x22, (byte) 0x12,
- (byte) 0x58, (byte) 0x07, (byte) 0x99, (byte) 0x34,
- (byte) 0x6E, (byte) 0x50, (byte) 0xDE, (byte) 0x68,
- (byte) 0x65, (byte) 0xBC, (byte) 0xDB, (byte) 0xF8,
- (byte) 0xC8, (byte) 0xA8, (byte) 0x2B, (byte) 0x40,
- (byte) 0xDC, (byte) 0xFE, (byte) 0x32, (byte) 0xA4,
- (byte) 0xCA, (byte) 0x10, (byte) 0x21, (byte) 0xF0,
- (byte) 0xD3, (byte) 0x5D, (byte) 0x0F, (byte) 0x00,
- (byte) 0x6F, (byte) 0x9D, (byte) 0x36, (byte) 0x42,
- (byte) 0x4A, (byte) 0x5E, (byte) 0xC1, (byte) 0xE0 },
- { // p1
- (byte) 0x75, (byte) 0xF3, (byte) 0xC6, (byte) 0xF4,
- (byte) 0xDB, (byte) 0x7B, (byte) 0xFB, (byte) 0xC8,
- (byte) 0x4A, (byte) 0xD3, (byte) 0xE6, (byte) 0x6B,
- (byte) 0x45, (byte) 0x7D, (byte) 0xE8, (byte) 0x4B,
- (byte) 0xD6, (byte) 0x32, (byte) 0xD8, (byte) 0xFD,
- (byte) 0x37, (byte) 0x71, (byte) 0xF1, (byte) 0xE1,
- (byte) 0x30, (byte) 0x0F, (byte) 0xF8, (byte) 0x1B,
- (byte) 0x87, (byte) 0xFA, (byte) 0x06, (byte) 0x3F,
- (byte) 0x5E, (byte) 0xBA, (byte) 0xAE, (byte) 0x5B,
- (byte) 0x8A, (byte) 0x00, (byte) 0xBC, (byte) 0x9D,
- (byte) 0x6D, (byte) 0xC1, (byte) 0xB1, (byte) 0x0E,
- (byte) 0x80, (byte) 0x5D, (byte) 0xD2, (byte) 0xD5,
- (byte) 0xA0, (byte) 0x84, (byte) 0x07, (byte) 0x14,
- (byte) 0xB5, (byte) 0x90, (byte) 0x2C, (byte) 0xA3,
- (byte) 0xB2, (byte) 0x73, (byte) 0x4C, (byte) 0x54,
- (byte) 0x92, (byte) 0x74, (byte) 0x36, (byte) 0x51,
- (byte) 0x38, (byte) 0xB0, (byte) 0xBD, (byte) 0x5A,
- (byte) 0xFC, (byte) 0x60, (byte) 0x62, (byte) 0x96,
- (byte) 0x6C, (byte) 0x42, (byte) 0xF7, (byte) 0x10,
- (byte) 0x7C, (byte) 0x28, (byte) 0x27, (byte) 0x8C,
- (byte) 0x13, (byte) 0x95, (byte) 0x9C, (byte) 0xC7,
- (byte) 0x24, (byte) 0x46, (byte) 0x3B, (byte) 0x70,
- (byte) 0xCA, (byte) 0xE3, (byte) 0x85, (byte) 0xCB,
- (byte) 0x11, (byte) 0xD0, (byte) 0x93, (byte) 0xB8,
- (byte) 0xA6, (byte) 0x83, (byte) 0x20, (byte) 0xFF,
- (byte) 0x9F, (byte) 0x77, (byte) 0xC3, (byte) 0xCC,
- (byte) 0x03, (byte) 0x6F, (byte) 0x08, (byte) 0xBF,
- (byte) 0x40, (byte) 0xE7, (byte) 0x2B, (byte) 0xE2,
- (byte) 0x79, (byte) 0x0C, (byte) 0xAA, (byte) 0x82,
- (byte) 0x41, (byte) 0x3A, (byte) 0xEA, (byte) 0xB9,
- (byte) 0xE4, (byte) 0x9A, (byte) 0xA4, (byte) 0x97,
- (byte) 0x7E, (byte) 0xDA, (byte) 0x7A, (byte) 0x17,
- (byte) 0x66, (byte) 0x94, (byte) 0xA1, (byte) 0x1D,
- (byte) 0x3D, (byte) 0xF0, (byte) 0xDE, (byte) 0xB3,
- (byte) 0x0B, (byte) 0x72, (byte) 0xA7, (byte) 0x1C,
- (byte) 0xEF, (byte) 0xD1, (byte) 0x53, (byte) 0x3E,
- (byte) 0x8F, (byte) 0x33, (byte) 0x26, (byte) 0x5F,
- (byte) 0xEC, (byte) 0x76, (byte) 0x2A, (byte) 0x49,
- (byte) 0x81, (byte) 0x88, (byte) 0xEE, (byte) 0x21,
- (byte) 0xC4, (byte) 0x1A, (byte) 0xEB, (byte) 0xD9,
- (byte) 0xC5, (byte) 0x39, (byte) 0x99, (byte) 0xCD,
- (byte) 0xAD, (byte) 0x31, (byte) 0x8B, (byte) 0x01,
- (byte) 0x18, (byte) 0x23, (byte) 0xDD, (byte) 0x1F,
- (byte) 0x4E, (byte) 0x2D, (byte) 0xF9, (byte) 0x48,
- (byte) 0x4F, (byte) 0xF2, (byte) 0x65, (byte) 0x8E,
- (byte) 0x78, (byte) 0x5C, (byte) 0x58, (byte) 0x19,
- (byte) 0x8D, (byte) 0xE5, (byte) 0x98, (byte) 0x57,
- (byte) 0x67, (byte) 0x7F, (byte) 0x05, (byte) 0x64,
- (byte) 0xAF, (byte) 0x63, (byte) 0xB6, (byte) 0xFE,
- (byte) 0xF5, (byte) 0xB7, (byte) 0x3C, (byte) 0xA5,
- (byte) 0xCE, (byte) 0xE9, (byte) 0x68, (byte) 0x44,
- (byte) 0xE0, (byte) 0x4D, (byte) 0x43, (byte) 0x69,
- (byte) 0x29, (byte) 0x2E, (byte) 0xAC, (byte) 0x15,
- (byte) 0x59, (byte) 0xA8, (byte) 0x0A, (byte) 0x9E,
- (byte) 0x6E, (byte) 0x47, (byte) 0xDF, (byte) 0x34,
- (byte) 0x35, (byte) 0x6A, (byte) 0xCF, (byte) 0xDC,
- (byte) 0x22, (byte) 0xC9, (byte) 0xC0, (byte) 0x9B,
- (byte) 0x89, (byte) 0xD4, (byte) 0xED, (byte) 0xAB,
- (byte) 0x12, (byte) 0xA2, (byte) 0x0D, (byte) 0x52,
- (byte) 0xBB, (byte) 0x02, (byte) 0x2F, (byte) 0xA9,
- (byte) 0xD7, (byte) 0x61, (byte) 0x1E, (byte) 0xB4,
- (byte) 0x50, (byte) 0x04, (byte) 0xF6, (byte) 0xC2,
- (byte) 0x16, (byte) 0x25, (byte) 0x86, (byte) 0x56,
- (byte) 0x55, (byte) 0x09, (byte) 0xBE, (byte) 0x91 }
- };
-
- /**
- * Define the fixed p0/p1 permutations used in keyed S-box lookup.
- * By changing the following constant definitions, the S-boxes will
- * automatically Get changed in the Twofish engine.
- */
- private const int P_00 = 1;
- private const int P_01 = 0;
- private const int P_02 = 0;
- private const int P_03 = P_01 ^ 1;
- private const int P_04 = 1;
-
- private const int P_10 = 0;
- private const int P_11 = 0;
- private const int P_12 = 1;
- private const int P_13 = P_11 ^ 1;
- private const int P_14 = 0;
-
- private const int P_20 = 1;
- private const int P_21 = 1;
- private const int P_22 = 0;
- private const int P_23 = P_21 ^ 1;
- private const int P_24 = 0;
-
- private const int P_30 = 0;
- private const int P_31 = 1;
- private const int P_32 = 1;
- private const int P_33 = P_31 ^ 1;
- private const int P_34 = 1;
-
- /* Primitive polynomial for GF(256) */
- private const int GF256_FDBK = 0x169;
- private const int GF256_FDBK_2 = GF256_FDBK / 2;
- private const int GF256_FDBK_4 = GF256_FDBK / 4;
-
- private const int RS_GF_FDBK = 0x14D; // field generator
-
- //====================================
- // Useful constants
- //====================================
-
- private const int ROUNDS = 16;
- private const int MAX_ROUNDS = 16; // bytes = 128 bits
- private const int BLOCK_SIZE = 16; // bytes = 128 bits
- private const int MAX_KEY_BITS = 256;
-
- private const int INPUT_WHITEN=0;
- private const int OUTPUT_WHITEN=INPUT_WHITEN+BLOCK_SIZE/4; // 4
- private const int ROUND_SUBKEYS=OUTPUT_WHITEN+BLOCK_SIZE/4;// 8
-
- private const int TOTAL_SUBKEYS=ROUND_SUBKEYS+2*MAX_ROUNDS;// 40
-
- private const int SK_STEP = 0x02020202;
- private const int SK_BUMP = 0x01010101;
- private const int SK_ROTL = 9;
-
- private bool encrypting;
-
- private int[] gMDS0 = new int[MAX_KEY_BITS];
- private int[] gMDS1 = new int[MAX_KEY_BITS];
- private int[] gMDS2 = new int[MAX_KEY_BITS];
- private int[] gMDS3 = new int[MAX_KEY_BITS];
-
- /**
- * gSubKeys[] and gSBox[] are eventually used in the
- * encryption and decryption methods.
- */
- private int[] gSubKeys;
- private int[] gSBox;
-
- private int k64Cnt;
-
- private byte[] workingKey;
-
- public TwofishEngine()
- {
- // calculate the MDS matrix
- int[] m1 = new int[2];
- int[] mX = new int[2];
- int[] mY = new int[2];
- int j;
-
- for (int i=0; i< MAX_KEY_BITS ; i++)
- {
- j = P[0,i] & 0xff;
- m1[0] = j;
- mX[0] = Mx_X(j) & 0xff;
- mY[0] = Mx_Y(j) & 0xff;
-
- j = P[1,i] & 0xff;
- m1[1] = j;
- mX[1] = Mx_X(j) & 0xff;
- mY[1] = Mx_Y(j) & 0xff;
-
- gMDS0[i] = m1[P_00] | mX[P_00] << 8 |
- mY[P_00] << 16 | mY[P_00] << 24;
-
- gMDS1[i] = mY[P_10] | mY[P_10] << 8 |
- mX[P_10] << 16 | m1[P_10] << 24;
-
- gMDS2[i] = mX[P_20] | mY[P_20] << 8 |
- m1[P_20] << 16 | mY[P_20] << 24;
-
- gMDS3[i] = mX[P_30] | m1[P_30] << 8 |
- mY[P_30] << 16 | mX[P_30] << 24;
- }
- }
-
- /**
- * initialise a Twofish cipher.
- *
- * @param forEncryption whether or not we are for encryption.
- * @param parameters the parameters required to set up the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- throw new ArgumentException("invalid parameter passed to Twofish init - " + Platform.GetTypeName(parameters));
-
- this.encrypting = forEncryption;
- this.workingKey = ((KeyParameter)parameters).GetKey();
- this.k64Cnt = (this.workingKey.Length / 8); // pre-padded ?
- SetKey(this.workingKey);
- }
-
- public string AlgorithmName
- {
- get { return "Twofish"; }
- }
-
- public bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if (workingKey == null)
- throw new InvalidOperationException("Twofish not initialised");
-
- Check.DataLength(input, inOff, BLOCK_SIZE, "input buffer too short");
- Check.OutputLength(output, outOff, BLOCK_SIZE, "output buffer too short");
-
- if (encrypting)
- {
- EncryptBlock(input, inOff, output, outOff);
- }
- else
- {
- DecryptBlock(input, inOff, output, outOff);
- }
-
- return BLOCK_SIZE;
- }
-
- public void Reset()
- {
- if (this.workingKey != null)
- {
- SetKey(this.workingKey);
- }
- }
-
- public int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- //==================================
- // Private Implementation
- //==================================
-
- private void SetKey(byte[] key)
- {
- int[] k32e = new int[MAX_KEY_BITS/64]; // 4
- int[] k32o = new int[MAX_KEY_BITS/64]; // 4
-
- int[] sBoxKeys = new int[MAX_KEY_BITS/64]; // 4
- gSubKeys = new int[TOTAL_SUBKEYS];
-
- if (k64Cnt < 1)
- {
- throw new ArgumentException("Key size less than 64 bits");
- }
-
- if (k64Cnt > 4)
- {
- throw new ArgumentException("Key size larger than 256 bits");
- }
-
- /*
- * k64Cnt is the number of 8 byte blocks (64 chunks)
- * that are in the input key. The input key is a
- * maximum of 32 bytes ( 256 bits ), so the range
- * for k64Cnt is 1..4
- */
- for (int i=0,p=0; i> 24);
- A += B;
- gSubKeys[i*2] = A;
- A += B;
- gSubKeys[i*2 + 1] = A << SK_ROTL | (int)((uint)A >> (32-SK_ROTL));
- }
-
- /*
- * fully expand the table for speed
- */
- int k0 = sBoxKeys[0];
- int k1 = sBoxKeys[1];
- int k2 = sBoxKeys[2];
- int k3 = sBoxKeys[3];
- int b0, b1, b2, b3;
- gSBox = new int[4*MAX_KEY_BITS];
- for (int i=0; i>1) | x2 << 31;
- x3 = (x3 << 1 | (int) ((uint)x3 >> 31)) ^ (t0 + 2*t1 + gSubKeys[k++]);
-
- t0 = Fe32_0(x2);
- t1 = Fe32_3(x3);
- x0 ^= t0 + t1 + gSubKeys[k++];
- x0 = (int) ((uint)x0 >>1) | x0 << 31;
- x1 = (x1 << 1 | (int)((uint)x1 >> 31)) ^ (t0 + 2*t1 + gSubKeys[k++]);
- }
-
- Bits32ToBytes(x2 ^ gSubKeys[OUTPUT_WHITEN], dst, dstIndex);
- Bits32ToBytes(x3 ^ gSubKeys[OUTPUT_WHITEN + 1], dst, dstIndex + 4);
- Bits32ToBytes(x0 ^ gSubKeys[OUTPUT_WHITEN + 2], dst, dstIndex + 8);
- Bits32ToBytes(x1 ^ gSubKeys[OUTPUT_WHITEN + 3], dst, dstIndex + 12);
- }
-
- /**
- * Decrypt the given input starting at the given offset and place
- * the result in the provided buffer starting at the given offset.
- * The input will be an exact multiple of our blocksize.
- */
- private void DecryptBlock(
- byte[] src,
- int srcIndex,
- byte[] dst,
- int dstIndex)
- {
- int x2 = BytesTo32Bits(src, srcIndex) ^ gSubKeys[OUTPUT_WHITEN];
- int x3 = BytesTo32Bits(src, srcIndex+4) ^ gSubKeys[OUTPUT_WHITEN + 1];
- int x0 = BytesTo32Bits(src, srcIndex+8) ^ gSubKeys[OUTPUT_WHITEN + 2];
- int x1 = BytesTo32Bits(src, srcIndex+12) ^ gSubKeys[OUTPUT_WHITEN + 3];
-
- int k = ROUND_SUBKEYS + 2 * ROUNDS -1 ;
- int t0, t1;
- for (int r = 0; r< ROUNDS ; r +=2)
- {
- t0 = Fe32_0(x2);
- t1 = Fe32_3(x3);
- x1 ^= t0 + 2*t1 + gSubKeys[k--];
- x0 = (x0 << 1 | (int)((uint) x0 >> 31)) ^ (t0 + t1 + gSubKeys[k--]);
- x1 = (int) ((uint)x1 >>1) | x1 << 31;
-
- t0 = Fe32_0(x0);
- t1 = Fe32_3(x1);
- x3 ^= t0 + 2*t1 + gSubKeys[k--];
- x2 = (x2 << 1 | (int)((uint)x2 >> 31)) ^ (t0 + t1 + gSubKeys[k--]);
- x3 = (int)((uint)x3 >>1) | x3 << 31;
- }
-
- Bits32ToBytes(x0 ^ gSubKeys[INPUT_WHITEN], dst, dstIndex);
- Bits32ToBytes(x1 ^ gSubKeys[INPUT_WHITEN + 1], dst, dstIndex + 4);
- Bits32ToBytes(x2 ^ gSubKeys[INPUT_WHITEN + 2], dst, dstIndex + 8);
- Bits32ToBytes(x3 ^ gSubKeys[INPUT_WHITEN + 3], dst, dstIndex + 12);
- }
-
- /*
- * TODO: This can be optimised and made cleaner by combining
- * the functionality in this function and applying it appropriately
- * to the creation of the subkeys during key setup.
- */
- private int F32(int x, int[] k32)
- {
- int b0 = M_b0(x);
- int b1 = M_b1(x);
- int b2 = M_b2(x);
- int b3 = M_b3(x);
- int k0 = k32[0];
- int k1 = k32[1];
- int k2 = k32[2];
- int k3 = k32[3];
-
- int result = 0;
- switch (k64Cnt & 3)
- {
- case 1:
- result = gMDS0[(P[P_01,b0] & 0xff) ^ M_b0(k0)] ^
- gMDS1[(P[P_11,b1] & 0xff) ^ M_b1(k0)] ^
- gMDS2[(P[P_21,b2] & 0xff) ^ M_b2(k0)] ^
- gMDS3[(P[P_31,b3] & 0xff) ^ M_b3(k0)];
- break;
- case 0: /* 256 bits of key */
- b0 = (P[P_04,b0] & 0xff) ^ M_b0(k3);
- b1 = (P[P_14,b1] & 0xff) ^ M_b1(k3);
- b2 = (P[P_24,b2] & 0xff) ^ M_b2(k3);
- b3 = (P[P_34,b3] & 0xff) ^ M_b3(k3);
- goto case 3;
- case 3:
- b0 = (P[P_03,b0] & 0xff) ^ M_b0(k2);
- b1 = (P[P_13,b1] & 0xff) ^ M_b1(k2);
- b2 = (P[P_23,b2] & 0xff) ^ M_b2(k2);
- b3 = (P[P_33,b3] & 0xff) ^ M_b3(k2);
- goto case 2;
- case 2:
- result =
- gMDS0[(P[P_01,(P[P_02,b0]&0xff)^M_b0(k1)]&0xff)^M_b0(k0)] ^
- gMDS1[(P[P_11,(P[P_12,b1]&0xff)^M_b1(k1)]&0xff)^M_b1(k0)] ^
- gMDS2[(P[P_21,(P[P_22,b2]&0xff)^M_b2(k1)]&0xff)^M_b2(k0)] ^
- gMDS3[(P[P_31,(P[P_32,b3]&0xff)^M_b3(k1)]&0xff)^M_b3(k0)];
- break;
- }
- return result;
- }
-
- /**
- * Use (12, 8) Reed-Solomon code over GF(256) to produce
- * a key S-box 32-bit entity from 2 key material 32-bit
- * entities.
- *
- * @param k0 first 32-bit entity
- * @param k1 second 32-bit entity
- * @return Remainder polynomial Generated using RS code
- */
- private int RS_MDS_Encode(int k0, int k1)
- {
- int r = k1;
- for (int i = 0 ; i < 4 ; i++) // shift 1 byte at a time
- {
- r = RS_rem(r);
- }
- r ^= k0;
- for (int i=0 ; i < 4 ; i++)
- {
- r = RS_rem(r);
- }
-
- return r;
- }
-
- /**
- * Reed-Solomon code parameters: (12,8) reversible code:
- *
- *
- * G(x) = x^4 + (a+1/a)x^3 + ax^2 + (a+1/a)x + 1
- *
- * where a = primitive root of field generator 0x14D
- *
- */
- private int RS_rem(int x)
- {
- int b = (int) (((uint)x >> 24) & 0xff);
- int g2 = ((b << 1) ^
- ((b & 0x80) != 0 ? RS_GF_FDBK : 0)) & 0xff;
- int g3 = ( (int)((uint)b >> 1) ^
- ((b & 0x01) != 0 ? (int)((uint)RS_GF_FDBK >> 1) : 0)) ^ g2 ;
- return ((x << 8) ^ (g3 << 24) ^ (g2 << 16) ^ (g3 << 8) ^ b);
- }
-
- private int LFSR1(int x)
- {
- return (x >> 1) ^
- (((x & 0x01) != 0) ? GF256_FDBK_2 : 0);
- }
-
- private int LFSR2(int x)
- {
- return (x >> 2) ^
- (((x & 0x02) != 0) ? GF256_FDBK_2 : 0) ^
- (((x & 0x01) != 0) ? GF256_FDBK_4 : 0);
- }
-
- private int Mx_X(int x)
- {
- return x ^ LFSR2(x);
- } // 5B
-
- private int Mx_Y(int x)
- {
- return x ^ LFSR1(x) ^ LFSR2(x);
- } // EF
-
- private int M_b0(int x)
- {
- return x & 0xff;
- }
-
- private int M_b1(int x)
- {
- return (int)((uint)x >> 8) & 0xff;
- }
-
- private int M_b2(int x)
- {
- return (int)((uint)x >> 16) & 0xff;
- }
-
- private int M_b3(int x)
- {
- return (int)((uint)x >> 24) & 0xff;
- }
-
- private int Fe32_0(int x)
- {
- return gSBox[ 0x000 + 2*(x & 0xff) ] ^
- gSBox[ 0x001 + 2*((int)((uint)x >> 8) & 0xff) ] ^
- gSBox[ 0x200 + 2*((int)((uint)x >> 16) & 0xff) ] ^
- gSBox[ 0x201 + 2*((int)((uint)x >> 24) & 0xff) ];
- }
-
- private int Fe32_3(int x)
- {
- return gSBox[ 0x000 + 2*((int)((uint)x >> 24) & 0xff) ] ^
- gSBox[ 0x001 + 2*(x & 0xff) ] ^
- gSBox[ 0x200 + 2*((int)((uint)x >> 8) & 0xff) ] ^
- gSBox[ 0x201 + 2*((int)((uint)x >> 16) & 0xff) ];
- }
-
- private int BytesTo32Bits(byte[] b, int p)
- {
- return ((b[p] & 0xff) ) |
- ((b[p+1] & 0xff) << 8) |
- ((b[p+2] & 0xff) << 16) |
- ((b[p+3] & 0xff) << 24);
- }
-
- private void Bits32ToBytes(int inData, byte[] b, int offset)
- {
- b[offset] = (byte)inData;
- b[offset + 1] = (byte)(inData >> 8);
- b[offset + 2] = (byte)(inData >> 16);
- b[offset + 3] = (byte)(inData >> 24);
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/engines/VMPCEngine.cs b/BCCrypto/src/crypto/engines/VMPCEngine.cs
deleted file mode 100644
index 852901e..0000000
--- a/BCCrypto/src/crypto/engines/VMPCEngine.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- public class VmpcEngine
- : IStreamCipher
- {
- /*
- * variables to hold the state of the VMPC engine during encryption and
- * decryption
- */
- protected byte n = 0;
- protected byte[] P = null;
- protected byte s = 0;
-
- protected byte[] workingIV;
- protected byte[] workingKey;
-
- public virtual string AlgorithmName
- {
- get { return "VMPC"; }
- }
-
- /**
- * initialise a VMPC cipher.
- *
- * @param forEncryption
- * whether or not we are for encryption.
- * @param params
- * the parameters required to set up the cipher.
- * @exception ArgumentException
- * if the params argument is inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is ParametersWithIV))
- throw new ArgumentException("VMPC Init parameters must include an IV");
-
- ParametersWithIV ivParams = (ParametersWithIV) parameters;
-
- if (!(ivParams.Parameters is KeyParameter))
- throw new ArgumentException("VMPC Init parameters must include a key");
-
- KeyParameter key = (KeyParameter)ivParams.Parameters;
-
- this.workingIV = ivParams.GetIV();
-
- if (workingIV == null || workingIV.Length < 1 || workingIV.Length > 768)
- throw new ArgumentException("VMPC requires 1 to 768 bytes of IV");
-
- this.workingKey = key.GetKey();
-
- InitKey(this.workingKey, this.workingIV);
- }
-
- protected virtual void InitKey(
- byte[] keyBytes,
- byte[] ivBytes)
- {
- s = 0;
- P = new byte[256];
- for (int i = 0; i < 256; i++)
- {
- P[i] = (byte) i;
- }
-
- for (int m = 0; m < 768; m++)
- {
- s = P[(s + P[m & 0xff] + keyBytes[m % keyBytes.Length]) & 0xff];
- byte temp = P[m & 0xff];
- P[m & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- }
- for (int m = 0; m < 768; m++)
- {
- s = P[(s + P[m & 0xff] + ivBytes[m % ivBytes.Length]) & 0xff];
- byte temp = P[m & 0xff];
- P[m & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- }
- n = 0;
- }
-
- public virtual void ProcessBytes(
- byte[] input,
- int inOff,
- int len,
- byte[] output,
- int outOff)
- {
- Check.DataLength(input, inOff, len, "input buffer too short");
- Check.OutputLength(output, outOff, len, "output buffer too short");
-
- for (int i = 0; i < len; i++)
- {
- s = P[(s + P[n & 0xff]) & 0xff];
- byte z = P[(P[(P[s & 0xff]) & 0xff] + 1) & 0xff];
- // encryption
- byte temp = P[n & 0xff];
- P[n & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- n = (byte) ((n + 1) & 0xff);
-
- // xor
- output[i + outOff] = (byte) (input[i + inOff] ^ z);
- }
- }
-
- public virtual void Reset()
- {
- InitKey(this.workingKey, this.workingIV);
- }
-
- public virtual byte ReturnByte(
- byte input)
- {
- s = P[(s + P[n & 0xff]) & 0xff];
- byte z = P[(P[(P[s & 0xff]) & 0xff] + 1) & 0xff];
- // encryption
- byte temp = P[n & 0xff];
- P[n & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- n = (byte) ((n + 1) & 0xff);
-
- // xor
- return (byte) (input ^ z);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/VMPCKSA3Engine.cs b/BCCrypto/src/crypto/engines/VMPCKSA3Engine.cs
deleted file mode 100644
index 95b6813..0000000
--- a/BCCrypto/src/crypto/engines/VMPCKSA3Engine.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- public class VmpcKsa3Engine
- : VmpcEngine
- {
- public override string AlgorithmName
- {
- get { return "VMPC-KSA3"; }
- }
-
- protected override void InitKey(
- byte[] keyBytes,
- byte[] ivBytes)
- {
- s = 0;
- P = new byte[256];
- for (int i = 0; i < 256; i++)
- {
- P[i] = (byte) i;
- }
-
- for (int m = 0; m < 768; m++)
- {
- s = P[(s + P[m & 0xff] + keyBytes[m % keyBytes.Length]) & 0xff];
- byte temp = P[m & 0xff];
- P[m & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- }
-
- for (int m = 0; m < 768; m++)
- {
- s = P[(s + P[m & 0xff] + ivBytes[m % ivBytes.Length]) & 0xff];
- byte temp = P[m & 0xff];
- P[m & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- }
-
- for (int m = 0; m < 768; m++)
- {
- s = P[(s + P[m & 0xff] + keyBytes[m % keyBytes.Length]) & 0xff];
- byte temp = P[m & 0xff];
- P[m & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- }
-
- n = 0;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/XSalsa20Engine.cs b/BCCrypto/src/crypto/engines/XSalsa20Engine.cs
deleted file mode 100644
index 50c51a8..0000000
--- a/BCCrypto/src/crypto/engines/XSalsa20Engine.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- ///
- /// Implementation of Daniel J. Bernstein's XSalsa20 stream cipher - Salsa20 with an extended nonce.
- ///
- ///
- /// XSalsa20 requires a 256 bit key, and a 192 bit nonce.
- ///
- public class XSalsa20Engine
- : Salsa20Engine
- {
- public override string AlgorithmName
- {
- get { return "XSalsa20"; }
- }
-
- protected override int NonceSize
- {
- get { return 24; }
- }
-
- ///
- /// XSalsa20 key generation: process 256 bit input key and 128 bits of the input nonce
- /// using a core Salsa20 function without input addition to produce 256 bit working key
- /// and use that with the remaining 64 bits of nonce to initialize a standard Salsa20 engine state.
- ///
- protected override void SetKey(byte[] keyBytes, byte[] ivBytes)
- {
- if (keyBytes == null)
- throw new ArgumentException(AlgorithmName + " doesn't support re-init with null key");
-
- if (keyBytes.Length != 32)
- throw new ArgumentException(AlgorithmName + " requires a 256 bit key");
-
- // Set key for HSalsa20
- base.SetKey(keyBytes, ivBytes);
-
- // Pack next 64 bits of IV into engine state instead of counter
- Pack.LE_To_UInt32(ivBytes, 8, engineState, 8, 2);
-
- // Process engine state to generate Salsa20 key
- uint[] hsalsa20Out = new uint[engineState.Length];
- SalsaCore(20, engineState, hsalsa20Out);
-
- // Set new key, removing addition in last round of salsaCore
- engineState[1] = hsalsa20Out[0] - engineState[0];
- engineState[2] = hsalsa20Out[5] - engineState[5];
- engineState[3] = hsalsa20Out[10] - engineState[10];
- engineState[4] = hsalsa20Out[15] - engineState[15];
-
- engineState[11] = hsalsa20Out[6] - engineState[6];
- engineState[12] = hsalsa20Out[7] - engineState[7];
- engineState[13] = hsalsa20Out[8] - engineState[8];
- engineState[14] = hsalsa20Out[9] - engineState[9];
-
- // Last 64 bits of input IV
- Pack.LE_To_UInt32(ivBytes, 16, engineState, 6, 2);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/engines/XTEAEngine.cs b/BCCrypto/src/crypto/engines/XTEAEngine.cs
deleted file mode 100644
index 5fcfa4a..0000000
--- a/BCCrypto/src/crypto/engines/XTEAEngine.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Engines
-{
- /**
- * An XTEA engine.
- */
- public class XteaEngine
- : IBlockCipher
- {
- private const int
- rounds = 32,
- block_size = 8,
-// key_size = 16,
- delta = unchecked((int) 0x9E3779B9);
-
- /*
- * the expanded key array of 4 subkeys
- */
- private uint[] _S = new uint[4],
- _sum0 = new uint[32],
- _sum1 = new uint[32];
- private bool _initialised, _forEncryption;
-
- /**
- * Create an instance of the TEA encryption algorithm
- * and set some defaults
- */
- public XteaEngine()
- {
- _initialised = false;
- }
-
- public virtual string AlgorithmName
- {
- get { return "XTEA"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- public virtual int GetBlockSize()
- {
- return block_size;
- }
-
- /**
- * initialise
- *
- * @param forEncryption whether or not we are for encryption.
- * @param params the parameters required to set up the cipher.
- * @exception ArgumentException if the params argument is
- * inappropriate.
- */
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (!(parameters is KeyParameter))
- {
- throw new ArgumentException("invalid parameter passed to TEA init - "
- + Platform.GetTypeName(parameters));
- }
-
- _forEncryption = forEncryption;
- _initialised = true;
-
- KeyParameter p = (KeyParameter) parameters;
-
- setKey(p.GetKey());
- }
-
- public virtual int ProcessBlock(
- byte[] inBytes,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- if (!_initialised)
- throw new InvalidOperationException(AlgorithmName + " not initialised");
-
- Check.DataLength(inBytes, inOff, block_size, "input buffer too short");
- Check.OutputLength(outBytes, outOff, block_size, "output buffer too short");
-
- return _forEncryption
- ? encryptBlock(inBytes, inOff, outBytes, outOff)
- : decryptBlock(inBytes, inOff, outBytes, outOff);
- }
-
- public virtual void Reset()
- {
- }
-
- /**
- * Re-key the cipher.
- *
- * @param key the key to be used
- */
- private void setKey(
- byte[] key)
- {
- int i, j;
- for (i = j = 0; i < 4; i++,j+=4)
- {
- _S[i] = Pack.BE_To_UInt32(key, j);
- }
-
- for (i = j = 0; i < rounds; i++)
- {
- _sum0[i] = ((uint)j + _S[j & 3]);
- j += delta;
- _sum1[i] = ((uint)j + _S[j >> 11 & 3]);
- }
- }
-
- private int encryptBlock(
- byte[] inBytes,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- // Pack bytes into integers
- uint v0 = Pack.BE_To_UInt32(inBytes, inOff);
- uint v1 = Pack.BE_To_UInt32(inBytes, inOff + 4);
-
- for (int i = 0; i < rounds; i++)
- {
- v0 += ((v1 << 4 ^ v1 >> 5) + v1) ^ _sum0[i];
- v1 += ((v0 << 4 ^ v0 >> 5) + v0) ^ _sum1[i];
- }
-
- Pack.UInt32_To_BE(v0, outBytes, outOff);
- Pack.UInt32_To_BE(v1, outBytes, outOff + 4);
-
- return block_size;
- }
-
- private int decryptBlock(
- byte[] inBytes,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- // Pack bytes into integers
- uint v0 = Pack.BE_To_UInt32(inBytes, inOff);
- uint v1 = Pack.BE_To_UInt32(inBytes, inOff + 4);
-
- for (int i = rounds-1; i >= 0; i--)
- {
- v1 -= ((v0 << 4 ^ v0 >> 5) + v0) ^ _sum1[i];
- v0 -= ((v1 << 4 ^ v1 >> 5) + v1) ^ _sum0[i];
- }
-
- Pack.UInt32_To_BE(v0, outBytes, outOff);
- Pack.UInt32_To_BE(v1, outBytes, outOff + 4);
-
- return block_size;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/BCrypt.cs b/BCCrypto/src/crypto/generators/BCrypt.cs
deleted file mode 100644
index af8029a..0000000
--- a/BCCrypto/src/crypto/generators/BCrypt.cs
+++ /dev/null
@@ -1,617 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * Core of password hashing scheme Bcrypt,
- * designed by Niels Provos and David Mazières,
- * corresponds to the C reference implementation.
- *
- * This implementation does not correspondent to the 1999 published paper
- * "A Future-Adaptable Password Scheme" of Niels Provos and David Mazières,
- * see: https://www.usenix.org/legacy/events/usenix99/provos/provos_html/node1.html.
- * In contrast to the paper, the order of key setup and salt setup is reversed:
- * state <- ExpandKey(state, 0, key)
- * state %lt;- ExpandKey(state, 0, salt)
- * This corresponds to the OpenBSD reference implementation of Bcrypt.
- *
- * Note:
- * There is no successful cryptanalysis (status 2015), but
- * the amount of memory and the band width of Bcrypt
- * may be insufficient to effectively prevent attacks
- * with custom hardware like FPGAs, ASICs
- *
- * This implementation uses some parts of Bouncy Castle's BlowfishEngine.
- *
- */
- public sealed class BCrypt
- {
- // magic String "OrpheanBeholderScryDoubt" is used as clear text for encryption
- private static readonly uint[] MAGIC_STRING =
- {
- 0x4F727068, 0x65616E42, 0x65686F6C,
- 0x64657253, 0x63727944, 0x6F756274
- };
-
- internal const int MAGIC_STRING_LENGTH = 6;
-
- private static readonly uint[]
- KP = {
- 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
- 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
- 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
- 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
- 0x9216D5D9, 0x8979FB1B
- },
-
- KS0 = {
- 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
- 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
- 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
- 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
- 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
- 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
- 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
- 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
- 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
- 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
- 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
- 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
- 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
- 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
- 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
- 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
- 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
- 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
- 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
- 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
- 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
- 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
- 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
- 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
- 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
- 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
- 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
- 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
- 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
- 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
- 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
- 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
- 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
- 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
- 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
- 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
- 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
- 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
- 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
- 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
- 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
- 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
- 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
- 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
- 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
- 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
- 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
- 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
- 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
- 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
- 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
- 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
- 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
- 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
- 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
- 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
- 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
- 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
- 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
- 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
- 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
- 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
- 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
- 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A
- },
-
- KS1 = {
- 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
- 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
- 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
- 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
- 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
- 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
- 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
- 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
- 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
- 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
- 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
- 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
- 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
- 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
- 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
- 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
- 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
- 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
- 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
- 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
- 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
- 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
- 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
- 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
- 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
- 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
- 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
- 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
- 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
- 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
- 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
- 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
- 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
- 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
- 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
- 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
- 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
- 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
- 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
- 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
- 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
- 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
- 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
- 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
- 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
- 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
- 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
- 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
- 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
- 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
- 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
- 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
- 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
- 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
- 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
- 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
- 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
- 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
- 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
- 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
- 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
- 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
- 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
- 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7
- },
-
- KS2 = {
- 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
- 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
- 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
- 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
- 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
- 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
- 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
- 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
- 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
- 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
- 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
- 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
- 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
- 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
- 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
- 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
- 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
- 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
- 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
- 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
- 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
- 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
- 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
- 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
- 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
- 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
- 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
- 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
- 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
- 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
- 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
- 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
- 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
- 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
- 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
- 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
- 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
- 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
- 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
- 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
- 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
- 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
- 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
- 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
- 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
- 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
- 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
- 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
- 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
- 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
- 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
- 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
- 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
- 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
- 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
- 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
- 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
- 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
- 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
- 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
- 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
- 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
- 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
- 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0
- },
-
- KS3 = {
- 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
- 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
- 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
- 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
- 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
- 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
- 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
- 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
- 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
- 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
- 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
- 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
- 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
- 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
- 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
- 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
- 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
- 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
- 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
- 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
- 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
- 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
- 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
- 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
- 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
- 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
- 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
- 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
- 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
- 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
- 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
- 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
- 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
- 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
- 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
- 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
- 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
- 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
- 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
- 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
- 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
- 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
- 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
- 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
- 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
- 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
- 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
- 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
- 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
- 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
- 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
- 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
- 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
- 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
- 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
- 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
- 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
- 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
- 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
- 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
- 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
- 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
- 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
- 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6
- };
-
- //====================================
- // Useful constants
- //====================================
-
- private const int ROUNDS = 16;
- private const int SBOX_SK = 256;
- private const int SBOX_SK2 = SBOX_SK * 2;
- private const int SBOX_SK3 = SBOX_SK * 3;
- private const int P_SZ = ROUNDS + 2;
-
- private readonly uint[] S; // the s-boxes
- private readonly uint[] P; // the p-array
-
- private BCrypt()
- {
- S = new uint[SBOX_SK * 4];
- P = new uint[P_SZ];
- }
-
- //==================================
- // Private Implementation
- //==================================
-
- private uint F(uint x)
- {
- return (((S[(x >> 24)] + S[SBOX_SK + ((x >> 16) & 0xff)])
- ^ S[SBOX_SK2 + ((x >> 8) & 0xff)]) + S[SBOX_SK3 + (x & 0xff)]);
- }
-
- /*
- * apply the encryption cycle to each value pair in the table.
- */
- private void ProcessTable(uint xl, uint xr, uint[] table)
- {
- int size = table.Length;
-
- for (int s = 0; s < size; s += 2)
- {
- xl ^= P[0];
-
- for (int i = 1; i < ROUNDS; i += 2)
- {
- xr ^= F(xl) ^ P[i];
- xl ^= F(xr) ^ P[i + 1];
- }
-
- xr ^= P[ROUNDS + 1];
-
- table[s] = xr;
- table[s + 1] = xl;
-
- xr = xl; // end of cycle swap
- xl = table[s];
- }
- }
-
- /*
- * Initialize the S-boxes and the P-array, with a fixed string
- * This string contains the hexadecimal digits of pi (3.141...)
- */
- private void InitState()
- {
- Array.Copy(KS0, 0, S, 0, SBOX_SK);
- Array.Copy(KS1, 0, S, SBOX_SK, SBOX_SK);
- Array.Copy(KS2, 0, S, SBOX_SK2, SBOX_SK);
- Array.Copy(KS3, 0, S, SBOX_SK3, SBOX_SK);
-
- Array.Copy(KP, 0, P, 0, P_SZ);
- }
-
- /*
- * XOR P with key cyclic.
- * This is the first part of ExpandKey function
- */
- private void CyclicXorKey(byte[] key)
- {
- int keyLength = key.Length;
- int keyIndex = 0;
-
- for (int i = 0; i < P_SZ; i++)
- {
- // get the 32 bits of the key, in 4 * 8 bit chunks
- uint data = 0x0000000;
- for (int j = 0; j < 4; j++)
- {
- // create a 32 bit block
- data = (data << 8) | key[keyIndex];
-
- // wrap when we get to the end of the key
- if (++keyIndex >= keyLength)
- {
- keyIndex = 0;
- }
- }
- // XOR the newly created 32 bit chunk onto the P-array
- P[i] ^= data;
- }
- }
-
-
- /*
- * encrypt magic String 64 times in ECB
- */
- private byte[] EncryptMagicString()
- {
- uint[] text = {
- MAGIC_STRING[0], MAGIC_STRING[1],
- MAGIC_STRING[2], MAGIC_STRING[3],
- MAGIC_STRING[4], MAGIC_STRING[5]
- };
- for (int i = 0; i < 64; i++)
- {
- for (int j = 0; j < MAGIC_STRING_LENGTH; j += 2)
- {
- uint left = text[j];
- uint right = text[j + 1];
-
- left ^= P[0];
- for (int k = 1; k < ROUNDS; k += 2)
- {
- right ^= F(left) ^ P[k];
- left ^= F(right) ^ P[k + 1];
- }
- right ^= P[ROUNDS + 1];
- // swap values:
- text[j] = right;
- text[j + 1] = left;
- }
- }
- byte[] result = new byte[24]; // holds 192 bit key
- Pack.UInt32_To_BE(text, result, 0);
- Array.Clear(text, 0, text.Length);
- Array.Clear(P, 0, P.Length);
- Array.Clear(S, 0, S.Length);
-
- return result;
- }
-
- /*
- * This is a part of Eksblowfish function
- *
- * @param table: sub-keys or working key
- * @param salt32Bit: a 16 byte salt as two 32 bit words
- * @param iv1: value from last proceeded table
- * @param iv2: value from last proceeded table
- */
- private void ProcessTableWithSalt(uint[] table, uint[] salt32Bit, uint iv1, uint iv2)
- {
- uint xl = iv1 ^ salt32Bit[0];
- uint xr = iv2 ^ salt32Bit[1];
-
- uint yl;
- uint yr;
- int size = table.Length;
-
- for (int s = 0; s < size; s += 4)
- {
- xl ^= P[0];
- for (int i = 1; i < ROUNDS; i += 2)
- {
- xr ^= F(xl) ^ P[i];
- xl ^= F(xr) ^ P[i + 1];
- }
- xr ^= P[ROUNDS + 1];
-
- table[s] = xr;
- table[s + 1] = xl;
-
- yl = salt32Bit[2] ^ xr;
- yr = salt32Bit[3] ^ xl;
-
- if (s + 2 >= size) // P holds 18 values
- {
- break;
- }
-
- yl ^= P[0];
- for (int i = 1; i < ROUNDS; i += 2)
- {
- yr ^= F(yl) ^ P[i];
- yl ^= F(yr) ^ P[i + 1];
- }
- yr ^= P[ROUNDS + 1];
-
- table[s + 2] = yr;
- table[s + 3] = yl;
-
- xl = salt32Bit[0] ^ yr;
- xr = salt32Bit[1] ^ yl;
- }
- }
-
- /**
- * Derives a raw 192 bit Bcrypt key
- *
- * @param cost the cost factor, treated as an exponent of 2
- * @param salt a 16 byte salt
- * @param psw the password
- * @return a 192 bit key
- */
- private byte[] DeriveRawKey(int cost, byte[] salt, byte[] psw)
- {
- if (salt.Length != 16)
- throw new DataLengthException("Invalid salt size: 16 bytes expected.");
- if (cost < 4 || cost > 31)
- throw new ArgumentException("Illegal cost factor: 4 - 31 expected.", "cost");
-
- if (psw.Length == 0)
- {
- psw = new byte[4];
- }
-
- // state <- InitState()
- InitState();
-
- uint[] salt32Bit = new uint[4]; // holds 16 byte salt
- Pack.BE_To_UInt32(salt, 0, salt32Bit);
-
- uint[] salt32Bit2 = new uint[salt.Length]; // swapped values
- salt32Bit2[0] = salt32Bit[2];
- salt32Bit2[1] = salt32Bit[3];
- salt32Bit2[2] = salt32Bit[0];
- salt32Bit2[3] = salt32Bit[1];
-
- // ExpandKey( state, salt, key):
- CyclicXorKey(psw);
- ProcessTableWithSalt(P, salt32Bit, 0, 0);
- Array.Clear(salt32Bit, 0, salt32Bit.Length);
- ProcessTableWithSalt(S, salt32Bit2, P[P.Length - 2], P[P.Length - 1]);
- Array.Clear(salt32Bit2, 0, salt32Bit2.Length);
-
- int rounds = 1 << cost;
- for (int i = 0; i != rounds; i++) // rounds may be negative if cost is 31
- {
- // state <- ExpandKey(state, 0, key);
- CyclicXorKey(psw);
- ProcessTable(0, 0, P);
- ProcessTable(P[P_SZ - 2], P[P_SZ - 1], S);
-
- // state <- ExpandKey(state, 0, salt);
- CyclicXorKey(salt);
- ProcessTable(0, 0, P);
- ProcessTable(P[P_SZ - 2], P[P_SZ - 1], S);
- }
-
- // encrypt magicString 64 times
- return EncryptMagicString();
- }
-
- /**
- * Size of the salt parameter in bytes
- */
- internal const int SALT_SIZE_BYTES = 16;
-
- /**
- * Minimum value of cost parameter, equal to log2(bytes of salt)
- */
- internal const int MIN_COST = 4;
-
- /**
- * Maximum value of cost parameter (31 == 2,147,483,648)
- */
- internal const int MAX_COST = 31;
-
- /**
- * Maximum size of password == max (unrestricted) size of Blowfish key
- */
- // Blowfish spec limits keys to 448bit/56 bytes to ensure all bits of key affect all ciphertext
- // bits, but technically algorithm handles 72 byte keys and most implementations support this.
- internal const int MAX_PASSWORD_BYTES = 72;
-
- /**
- * Calculates the bcrypt hash of a password.
- *
- * This implements the raw bcrypt function as defined in the bcrypt specification, not
- * the crypt encoded version implemented in OpenBSD.
- *
- * @param password the password bytes (up to 72 bytes) to use for this invocation.
- * @param salt the 128 bit salt to use for this invocation.
- * @param cost the bcrypt cost parameter. The cost of the bcrypt function grows as
- * 2^cost. Legal values are 4..31 inclusive.
- * @return the output of the raw bcrypt operation: a 192 bit (24 byte) hash.
- */
- public static byte[] Generate(byte[] password, byte[] salt, int cost)
- {
- if (password == null)
- throw new ArgumentNullException("password");
- if (password.Length > MAX_PASSWORD_BYTES)
- throw new ArgumentException("BCrypt password must be <= 72 bytes", "password");
- if (salt == null)
- throw new ArgumentNullException("salt");
- if (salt.Length != SALT_SIZE_BYTES)
- throw new ArgumentException("BCrypt salt must be 128 bits", "salt");
- if (cost < MIN_COST || cost > MAX_COST)
- throw new ArgumentException("BCrypt cost must be from 4..31", "cost");
-
- return new BCrypt().DeriveRawKey(cost, salt, password);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/BaseKdfBytesGenerator.cs b/BCCrypto/src/crypto/generators/BaseKdfBytesGenerator.cs
deleted file mode 100644
index bca4207..0000000
--- a/BCCrypto/src/crypto/generators/BaseKdfBytesGenerator.cs
+++ /dev/null
@@ -1,132 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * Basic KDF generator for derived keys and ivs as defined by IEEE P1363a/ISO 18033
- *
- * This implementation is based on ISO 18033/P1363a.
- */
- public class BaseKdfBytesGenerator
- : IDerivationFunction
- {
- private int counterStart;
- private IDigest digest;
- private byte[] shared;
- private byte[] iv;
-
- /**
- * Construct a KDF Parameters generator.
- *
- * @param counterStart value of counter.
- * @param digest the digest to be used as the source of derived keys.
- */
- public BaseKdfBytesGenerator(int counterStart, IDigest digest)
- {
- this.counterStart = counterStart;
- this.digest = digest;
- }
-
- public virtual void Init(IDerivationParameters parameters)
- {
- if (parameters is KdfParameters)
- {
- KdfParameters p = (KdfParameters)parameters;
-
- shared = p.GetSharedSecret();
- iv = p.GetIV();
- }
- else if (parameters is Iso18033KdfParameters)
- {
- Iso18033KdfParameters p = (Iso18033KdfParameters)parameters;
-
- shared = p.GetSeed();
- iv = null;
- }
- else
- {
- throw new ArgumentException("KDF parameters required for KDF Generator");
- }
- }
-
- /**
- * return the underlying digest.
- */
- public virtual IDigest Digest
- {
- get { return digest; }
- }
-
- /**
- * fill len bytes of the output buffer with bytes generated from
- * the derivation function.
- *
- * @throws ArgumentException if the size of the request will cause an overflow.
- * @throws DataLengthException if the out buffer is too small.
- */
- public virtual int GenerateBytes(byte[] output, int outOff, int length)
- {
- if ((output.Length - length) < outOff)
- throw new DataLengthException("output buffer too small");
-
- long oBytes = length;
- int outLen = digest.GetDigestSize();
-
- //
- // this is at odds with the standard implementation, the
- // maximum value should be hBits * (2^32 - 1) where hBits
- // is the digest output size in bits. We can't have an
- // array with a long index at the moment...
- //
- if (oBytes > ((2L << 32) - 1))
- throw new ArgumentException("Output length too large");
-
- int cThreshold = (int)((oBytes + outLen - 1) / outLen);
-
- byte[] dig = new byte[digest.GetDigestSize()];
-
- byte[] C = new byte[4];
- Pack.UInt32_To_BE((uint)counterStart, C, 0);
-
- uint counterBase = (uint)(counterStart & ~0xFF);
-
- for (int i = 0; i < cThreshold; i++)
- {
- digest.BlockUpdate(shared, 0, shared.Length);
- digest.BlockUpdate(C, 0, 4);
-
- if (iv != null)
- {
- digest.BlockUpdate(iv, 0, iv.Length);
- }
-
- digest.DoFinal(dig, 0);
-
- if (length > outLen)
- {
- Array.Copy(dig, 0, output, outOff, outLen);
- outOff += outLen;
- length -= outLen;
- }
- else
- {
- Array.Copy(dig, 0, output, outOff, length);
- }
-
- if (++C[3] == 0)
- {
- counterBase += 0x100;
- Pack.UInt32_To_BE(counterBase, C, 0);
- }
- }
-
- digest.Reset();
-
- return (int)oBytes;
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/crypto/generators/DHBasicKeyPairGenerator.cs b/BCCrypto/src/crypto/generators/DHBasicKeyPairGenerator.cs
deleted file mode 100644
index 51b3af6..0000000
--- a/BCCrypto/src/crypto/generators/DHBasicKeyPairGenerator.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * a basic Diffie-Hellman key pair generator.
- *
- * This generates keys consistent for use with the basic algorithm for
- * Diffie-Hellman.
- */
- public class DHBasicKeyPairGenerator
- : IAsymmetricCipherKeyPairGenerator
- {
- private DHKeyGenerationParameters param;
-
- public virtual void Init(
- KeyGenerationParameters parameters)
- {
- this.param = (DHKeyGenerationParameters)parameters;
- }
-
- public virtual AsymmetricCipherKeyPair GenerateKeyPair()
- {
- DHKeyGeneratorHelper helper = DHKeyGeneratorHelper.Instance;
- DHParameters dhp = param.Parameters;
-
- BigInteger x = helper.CalculatePrivate(dhp, param.Random);
- BigInteger y = helper.CalculatePublic(dhp, x);
-
- return new AsymmetricCipherKeyPair(
- new DHPublicKeyParameters(y, dhp),
- new DHPrivateKeyParameters(x, dhp));
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/DHKeyGeneratorHelper.cs b/BCCrypto/src/crypto/generators/DHKeyGeneratorHelper.cs
deleted file mode 100644
index 68aba64..0000000
--- a/BCCrypto/src/crypto/generators/DHKeyGeneratorHelper.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- class DHKeyGeneratorHelper
- {
- internal static readonly DHKeyGeneratorHelper Instance = new DHKeyGeneratorHelper();
-
- private DHKeyGeneratorHelper()
- {
- }
-
- internal BigInteger CalculatePrivate(
- DHParameters dhParams,
- SecureRandom random)
- {
- int limit = dhParams.L;
-
- if (limit != 0)
- {
- int minWeight = limit >> 2;
- for (;;)
- {
- BigInteger x = new BigInteger(limit, random).SetBit(limit - 1);
- if (WNafUtilities.GetNafWeight(x) >= minWeight)
- {
- return x;
- }
- }
- }
-
- BigInteger min = BigInteger.Two;
- int m = dhParams.M;
- if (m != 0)
- {
- min = BigInteger.One.ShiftLeft(m - 1);
- }
-
- BigInteger q = dhParams.Q;
- if (q == null)
- {
- q = dhParams.P;
- }
- BigInteger max = q.Subtract(BigInteger.Two);
-
- {
- int minWeight = max.BitLength >> 2;
- for (;;)
- {
- BigInteger x = BigIntegers.CreateRandomInRange(min, max, random);
- if (WNafUtilities.GetNafWeight(x) >= minWeight)
- {
- return x;
- }
- }
- }
- }
-
- internal BigInteger CalculatePublic(
- DHParameters dhParams,
- BigInteger x)
- {
- return dhParams.G.ModPow(x, dhParams.P);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/DHKeyPairGenerator.cs b/BCCrypto/src/crypto/generators/DHKeyPairGenerator.cs
deleted file mode 100644
index 3bf58ba..0000000
--- a/BCCrypto/src/crypto/generators/DHKeyPairGenerator.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * a Diffie-Hellman key pair generator.
- *
- * This generates keys consistent for use in the MTI/A0 key agreement protocol
- * as described in "Handbook of Applied Cryptography", Pages 516-519.
- */
- public class DHKeyPairGenerator
- : IAsymmetricCipherKeyPairGenerator
- {
- private DHKeyGenerationParameters param;
-
- public virtual void Init(
- KeyGenerationParameters parameters)
- {
- this.param = (DHKeyGenerationParameters)parameters;
- }
-
- public virtual AsymmetricCipherKeyPair GenerateKeyPair()
- {
- DHKeyGeneratorHelper helper = DHKeyGeneratorHelper.Instance;
- DHParameters dhp = param.Parameters;
-
- BigInteger x = helper.CalculatePrivate(dhp, param.Random);
- BigInteger y = helper.CalculatePublic(dhp, x);
-
- return new AsymmetricCipherKeyPair(
- new DHPublicKeyParameters(y, dhp),
- new DHPrivateKeyParameters(x, dhp));
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/DHParametersGenerator.cs b/BCCrypto/src/crypto/generators/DHParametersGenerator.cs
deleted file mode 100644
index e752c84..0000000
--- a/BCCrypto/src/crypto/generators/DHParametersGenerator.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- public class DHParametersGenerator
- {
- private int size;
- private int certainty;
- private SecureRandom random;
-
- public virtual void Init(
- int size,
- int certainty,
- SecureRandom random)
- {
- this.size = size;
- this.certainty = certainty;
- this.random = random;
- }
-
- /**
- * which Generates the p and g values from the given parameters,
- * returning the DHParameters object.
- *
- * Note: can take a while...
- */
- public virtual DHParameters GenerateParameters()
- {
- //
- // find a safe prime p where p = 2*q + 1, where p and q are prime.
- //
- BigInteger[] safePrimes = DHParametersHelper.GenerateSafePrimes(size, certainty, random);
-
- BigInteger p = safePrimes[0];
- BigInteger q = safePrimes[1];
- BigInteger g = DHParametersHelper.SelectGenerator(p, q, random);
-
- return new DHParameters(p, g, q, BigInteger.Two, null);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/DHParametersHelper.cs b/BCCrypto/src/crypto/generators/DHParametersHelper.cs
deleted file mode 100644
index 3856904..0000000
--- a/BCCrypto/src/crypto/generators/DHParametersHelper.cs
+++ /dev/null
@@ -1,156 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- internal class DHParametersHelper
- {
- private static readonly BigInteger Six = BigInteger.ValueOf(6);
-
- private static readonly int[][] primeLists = BigInteger.primeLists;
- private static readonly int[] primeProducts = BigInteger.primeProducts;
- private static readonly BigInteger[] BigPrimeProducts = ConstructBigPrimeProducts(primeProducts);
-
- private static BigInteger[] ConstructBigPrimeProducts(int[] primeProducts)
- {
- BigInteger[] bpp = new BigInteger[primeProducts.Length];
- for (int i = 0; i < bpp.Length; ++i)
- {
- bpp[i] = BigInteger.ValueOf(primeProducts[i]);
- }
- return bpp;
- }
-
- /*
- * Finds a pair of prime BigInteger's {p, q: p = 2q + 1}
- *
- * (see: Handbook of Applied Cryptography 4.86)
- */
- internal static BigInteger[] GenerateSafePrimes(int size, int certainty, SecureRandom random)
- {
- BigInteger p, q;
- int qLength = size - 1;
- int minWeight = size >> 2;
-
- if (size <= 32)
- {
- for (;;)
- {
- q = new BigInteger(qLength, 2, random);
-
- p = q.ShiftLeft(1).Add(BigInteger.One);
-
- if (!p.IsProbablePrime(certainty, true))
- continue;
-
- if (certainty > 2 && !q.IsProbablePrime(certainty, true))
- continue;
-
- break;
- }
- }
- else
- {
- // Note: Modified from Java version for speed
- for (;;)
- {
- q = new BigInteger(qLength, 0, random);
-
- retry:
- for (int i = 0; i < primeLists.Length; ++i)
- {
- int test = q.Remainder(BigPrimeProducts[i]).IntValue;
-
- if (i == 0)
- {
- int rem3 = test % 3;
- if (rem3 != 2)
- {
- int diff = 2 * rem3 + 2;
- q = q.Add(BigInteger.ValueOf(diff));
- test = (test + diff) % primeProducts[i];
- }
- }
-
- int[] primeList = primeLists[i];
- for (int j = 0; j < primeList.Length; ++j)
- {
- int prime = primeList[j];
- int qRem = test % prime;
- if (qRem == 0 || qRem == (prime >> 1))
- {
- q = q.Add(Six);
- goto retry;
- }
- }
- }
-
- if (q.BitLength != qLength)
- continue;
-
- if (!q.RabinMillerTest(2, random, true))
- continue;
-
- p = q.ShiftLeft(1).Add(BigInteger.One);
-
- if (!p.RabinMillerTest(certainty, random, true))
- continue;
-
- if (certainty > 2 && !q.RabinMillerTest(certainty - 2, random, true))
- continue;
-
- /*
- * Require a minimum weight of the NAF representation, since low-weight primes may be
- * weak against a version of the number-field-sieve for the discrete-logarithm-problem.
- *
- * See "The number field sieve for integers of low weight", Oliver Schirokauer.
- */
- if (WNafUtilities.GetNafWeight(p) < minWeight)
- continue;
-
- break;
- }
- }
-
- return new BigInteger[] { p, q };
- }
-
- /*
- * Select a high order element of the multiplicative group Zp*
- *
- * p and q must be s.t. p = 2*q + 1, where p and q are prime (see generateSafePrimes)
- */
- internal static BigInteger SelectGenerator(BigInteger p, BigInteger q, SecureRandom random)
- {
- BigInteger pMinusTwo = p.Subtract(BigInteger.Two);
- BigInteger g;
-
- /*
- * (see: Handbook of Applied Cryptography 4.80)
- */
-// do
-// {
-// g = BigIntegers.CreateRandomInRange(BigInteger.Two, pMinusTwo, random);
-// }
-// while (g.ModPow(BigInteger.Two, p).Equals(BigInteger.One)
-// || g.ModPow(q, p).Equals(BigInteger.One));
-
- /*
- * RFC 2631 2.2.1.2 (and see: Handbook of Applied Cryptography 4.81)
- */
- do
- {
- BigInteger h = BigIntegers.CreateRandomInRange(BigInteger.Two, pMinusTwo, random);
-
- g = h.ModPow(BigInteger.Two, p);
- }
- while (g.Equals(BigInteger.One));
-
- return g;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/DesEdeKeyGenerator.cs b/BCCrypto/src/crypto/generators/DesEdeKeyGenerator.cs
deleted file mode 100644
index 904cc71..0000000
--- a/BCCrypto/src/crypto/generators/DesEdeKeyGenerator.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- public class DesEdeKeyGenerator
- : DesKeyGenerator
- {
- public DesEdeKeyGenerator()
- {
- }
-
- internal DesEdeKeyGenerator(
- int defaultStrength)
- : base(defaultStrength)
- {
- }
-
- /**
- * initialise the key generator - if strength is set to zero
- * the key Generated will be 192 bits in size, otherwise
- * strength can be 128 or 192 (or 112 or 168 if you don't count
- * parity bits), depending on whether you wish to do 2-key or 3-key
- * triple DES.
- *
- * @param param the parameters to be used for key generation
- */
- protected override void engineInit(
- KeyGenerationParameters parameters)
- {
- this.random = parameters.Random;
- this.strength = (parameters.Strength + 7) / 8;
-
- if (strength == 0 || strength == (168 / 8))
- {
- strength = DesEdeParameters.DesEdeKeyLength;
- }
- else if (strength == (112 / 8))
- {
- strength = 2 * DesEdeParameters.DesKeyLength;
- }
- else if (strength != DesEdeParameters.DesEdeKeyLength
- && strength != (2 * DesEdeParameters.DesKeyLength))
- {
- throw new ArgumentException("DESede key must be "
- + (DesEdeParameters.DesEdeKeyLength * 8) + " or "
- + (2 * 8 * DesEdeParameters.DesKeyLength)
- + " bits long.");
- }
- }
-
- protected override byte[] engineGenerateKey()
- {
- byte[] newKey = new byte[strength];
-
- do
- {
- random.NextBytes(newKey);
- DesEdeParameters.SetOddParity(newKey);
- }
- while (DesEdeParameters.IsWeakKey(newKey, 0, newKey.Length) || !DesEdeParameters.IsRealEdeKey(newKey, 0));
-
- return newKey;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/DesKeyGenerator.cs b/BCCrypto/src/crypto/generators/DesKeyGenerator.cs
deleted file mode 100644
index 4c2051d..0000000
--- a/BCCrypto/src/crypto/generators/DesKeyGenerator.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- public class DesKeyGenerator
- : CipherKeyGenerator
- {
- public DesKeyGenerator()
- {
- }
-
- internal DesKeyGenerator(
- int defaultStrength)
- : base(defaultStrength)
- {
- }
-
- /**
- * initialise the key generator - if strength is set to zero
- * the key generated will be 64 bits in size, otherwise
- * strength can be 64 or 56 bits (if you don't count the parity bits).
- *
- * @param param the parameters to be used for key generation
- */
- protected override void engineInit(
- KeyGenerationParameters parameters)
- {
- base.engineInit(parameters);
-
- if (strength == 0 || strength == (56 / 8))
- {
- strength = DesParameters.DesKeyLength;
- }
- else if (strength != DesParameters.DesKeyLength)
- {
- throw new ArgumentException(
- "DES key must be " + (DesParameters.DesKeyLength * 8) + " bits long.");
- }
- }
-
- protected override byte[] engineGenerateKey()
- {
- byte[] newKey = new byte[DesParameters.DesKeyLength];
-
- do
- {
- random.NextBytes(newKey);
- DesParameters.SetOddParity(newKey);
- }
- while (DesParameters.IsWeakKey(newKey, 0));
-
- return newKey;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/DsaKeyPairGenerator.cs b/BCCrypto/src/crypto/generators/DsaKeyPairGenerator.cs
deleted file mode 100644
index 1c9ce5a..0000000
--- a/BCCrypto/src/crypto/generators/DsaKeyPairGenerator.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * a DSA key pair generator.
- *
- * This Generates DSA keys in line with the method described
- * in FIPS 186-3 B.1 FFC Key Pair Generation .
- */
- public class DsaKeyPairGenerator
- : IAsymmetricCipherKeyPairGenerator
- {
- private static readonly BigInteger One = BigInteger.One;
-
- private DsaKeyGenerationParameters param;
-
- public void Init(
- KeyGenerationParameters parameters)
- {
- if (parameters == null)
- throw new ArgumentNullException("parameters");
-
- // Note: If we start accepting instances of KeyGenerationParameters,
- // must apply constraint checking on strength (see DsaParametersGenerator.Init)
-
- this.param = (DsaKeyGenerationParameters) parameters;
- }
-
- public AsymmetricCipherKeyPair GenerateKeyPair()
- {
- DsaParameters dsaParams = param.Parameters;
-
- BigInteger x = GeneratePrivateKey(dsaParams.Q, param.Random);
- BigInteger y = CalculatePublicKey(dsaParams.P, dsaParams.G, x);
-
- return new AsymmetricCipherKeyPair(
- new DsaPublicKeyParameters(y, dsaParams),
- new DsaPrivateKeyParameters(x, dsaParams));
- }
-
- private static BigInteger GeneratePrivateKey(BigInteger q, SecureRandom random)
- {
- // B.1.2 Key Pair Generation by Testing Candidates
- int minWeight = q.BitLength >> 2;
- for (;;)
- {
- // TODO Prefer this method? (change test cases that used fixed random)
- // B.1.1 Key Pair Generation Using Extra Random Bits
- //BigInteger x = new BigInteger(q.BitLength + 64, random).Mod(q.Subtract(One)).Add(One);
-
- BigInteger x = BigIntegers.CreateRandomInRange(One, q.Subtract(One), random);
- if (WNafUtilities.GetNafWeight(x) >= minWeight)
- {
- return x;
- }
- }
- }
-
- private static BigInteger CalculatePublicKey(BigInteger p, BigInteger g, BigInteger x)
- {
- return g.ModPow(x, p);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/DsaParametersGenerator.cs b/BCCrypto/src/crypto/generators/DsaParametersGenerator.cs
deleted file mode 100644
index d7ae3ec..0000000
--- a/BCCrypto/src/crypto/generators/DsaParametersGenerator.cs
+++ /dev/null
@@ -1,355 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * Generate suitable parameters for DSA, in line with FIPS 186-2, or FIPS 186-3.
- */
- public class DsaParametersGenerator
- {
- private IDigest digest;
- private int L, N;
- private int certainty;
- private SecureRandom random;
- private bool use186_3;
- private int usageIndex;
-
- public DsaParametersGenerator()
- : this(new Sha1Digest())
- {
- }
-
- public DsaParametersGenerator(IDigest digest)
- {
- this.digest = digest;
- }
-
- /// Initialise the generator
- /// This form can only be used for older DSA (pre-DSA2) parameters
- /// the size of keys in bits (from 512 up to 1024, and a multiple of 64)
- /// measure of robustness of primes (at least 80 for FIPS 186-2 compliance)
- /// the source of randomness to use
- public virtual void Init(
- int size,
- int certainty,
- SecureRandom random)
- {
- if (!IsValidDsaStrength(size))
- throw new ArgumentException("size must be from 512 - 1024 and a multiple of 64", "size");
-
- this.use186_3 = false;
- this.L = size;
- this.N = GetDefaultN(size);
- this.certainty = certainty;
- this.random = random;
- }
-
- /// Initialise the generator for DSA 2
- /// You must use this Init method if you need to generate parameters for DSA 2 keys
- /// An instance of DsaParameterGenerationParameters used to configure this generator
- public virtual void Init(DsaParameterGenerationParameters parameters)
- {
- // TODO Should we enforce the minimum 'certainty' values as per C.3 Table C.1?
- this.use186_3 = true;
- this.L = parameters.L;
- this.N = parameters.N;
- this.certainty = parameters.Certainty;
- this.random = parameters.Random;
- this.usageIndex = parameters.UsageIndex;
-
- if ((L < 1024 || L > 3072) || L % 1024 != 0)
- throw new ArgumentException("Values must be between 1024 and 3072 and a multiple of 1024", "L");
- if (L == 1024 && N != 160)
- throw new ArgumentException("N must be 160 for L = 1024");
- if (L == 2048 && (N != 224 && N != 256))
- throw new ArgumentException("N must be 224 or 256 for L = 2048");
- if (L == 3072 && N != 256)
- throw new ArgumentException("N must be 256 for L = 3072");
-
- if (digest.GetDigestSize() * 8 < N)
- throw new InvalidOperationException("Digest output size too small for value of N");
- }
-
- /// Generates a set of DsaParameters
- /// Can take a while...
- public virtual DsaParameters GenerateParameters()
- {
- return use186_3
- ? GenerateParameters_FIPS186_3()
- : GenerateParameters_FIPS186_2();
- }
-
- protected virtual DsaParameters GenerateParameters_FIPS186_2()
- {
- byte[] seed = new byte[20];
- byte[] part1 = new byte[20];
- byte[] part2 = new byte[20];
- byte[] u = new byte[20];
- int n = (L - 1) / 160;
- byte[] w = new byte[L / 8];
-
- if (!(digest is Sha1Digest))
- throw new InvalidOperationException("can only use SHA-1 for generating FIPS 186-2 parameters");
-
- for (;;)
- {
- random.NextBytes(seed);
-
- Hash(digest, seed, part1);
- Array.Copy(seed, 0, part2, 0, seed.Length);
- Inc(part2);
- Hash(digest, part2, part2);
-
- for (int i = 0; i != u.Length; i++)
- {
- u[i] = (byte)(part1[i] ^ part2[i]);
- }
-
- u[0] |= (byte)0x80;
- u[19] |= (byte)0x01;
-
- BigInteger q = new BigInteger(1, u);
-
- if (!q.IsProbablePrime(certainty))
- continue;
-
- byte[] offset = Arrays.Clone(seed);
- Inc(offset);
-
- for (int counter = 0; counter < 4096; ++counter)
- {
- for (int k = 0; k < n; k++)
- {
- Inc(offset);
- Hash(digest, offset, part1);
- Array.Copy(part1, 0, w, w.Length - (k + 1) * part1.Length, part1.Length);
- }
-
- Inc(offset);
- Hash(digest, offset, part1);
- Array.Copy(part1, part1.Length - ((w.Length - (n) * part1.Length)), w, 0, w.Length - n * part1.Length);
-
- w[0] |= (byte)0x80;
-
- BigInteger x = new BigInteger(1, w);
-
- BigInteger c = x.Mod(q.ShiftLeft(1));
-
- BigInteger p = x.Subtract(c.Subtract(BigInteger.One));
-
- if (p.BitLength != L)
- continue;
-
- if (p.IsProbablePrime(certainty))
- {
- BigInteger g = CalculateGenerator_FIPS186_2(p, q, random);
-
- return new DsaParameters(p, q, g, new DsaValidationParameters(seed, counter));
- }
- }
- }
- }
-
- protected virtual BigInteger CalculateGenerator_FIPS186_2(BigInteger p, BigInteger q, SecureRandom r)
- {
- BigInteger e = p.Subtract(BigInteger.One).Divide(q);
- BigInteger pSub2 = p.Subtract(BigInteger.Two);
-
- for (;;)
- {
- BigInteger h = BigIntegers.CreateRandomInRange(BigInteger.Two, pSub2, r);
- BigInteger g = h.ModPow(e, p);
-
- if (g.BitLength > 1)
- return g;
- }
- }
-
- /**
- * generate suitable parameters for DSA, in line with
- * FIPS 186-3 A.1 Generation of the FFC Primes p and q .
- */
- protected virtual DsaParameters GenerateParameters_FIPS186_3()
- {
-// A.1.1.2 Generation of the Probable Primes p and q Using an Approved Hash Function
- IDigest d = digest;
- int outlen = d.GetDigestSize() * 8;
-
-// 1. Check that the (L, N) pair is in the list of acceptable (L, N pairs) (see Section 4.2). If
-// the pair is not in the list, then return INVALID.
- // Note: checked at initialisation
-
-// 2. If (seedlen < N), then return INVALID.
- // FIXME This should be configurable (must be >= N)
- int seedlen = N;
- byte[] seed = new byte[seedlen / 8];
-
-// 3. n = ceiling(L ⁄ outlen) – 1.
- int n = (L - 1) / outlen;
-
-// 4. b = L – 1 – (n ∗ outlen).
- int b = (L - 1) % outlen;
-
- byte[] output = new byte[d.GetDigestSize()];
- for (;;)
- {
-// 5. Get an arbitrary sequence of seedlen bits as the domain_parameter_seed.
- random.NextBytes(seed);
-
-// 6. U = Hash (domain_parameter_seed) mod 2^(N–1).
- Hash(d, seed, output);
- BigInteger U = new BigInteger(1, output).Mod(BigInteger.One.ShiftLeft(N - 1));
-
-// 7. q = 2^(N–1) + U + 1 – ( U mod 2).
- BigInteger q = U.SetBit(0).SetBit(N - 1);
-
-// 8. Test whether or not q is prime as specified in Appendix C.3.
- // TODO Review C.3 for primality checking
- if (!q.IsProbablePrime(certainty))
- {
-// 9. If q is not a prime, then go to step 5.
- continue;
- }
-
-// 10. offset = 1.
- // Note: 'offset' value managed incrementally
- byte[] offset = Arrays.Clone(seed);
-
-// 11. For counter = 0 to (4L – 1) do
- int counterLimit = 4 * L;
- for (int counter = 0; counter < counterLimit; ++counter)
- {
-// 11.1 For j = 0 to n do
-// Vj = Hash ((domain_parameter_seed + offset + j) mod 2^seedlen).
-// 11.2 W = V0 + (V1 ∗ 2^outlen) + ... + (V^(n–1) ∗ 2^((n–1) ∗ outlen)) + ((Vn mod 2^b) ∗ 2^(n ∗ outlen)).
- // TODO Assemble w as a byte array
- BigInteger W = BigInteger.Zero;
- for (int j = 0, exp = 0; j <= n; ++j, exp += outlen)
- {
- Inc(offset);
- Hash(d, offset, output);
-
- BigInteger Vj = new BigInteger(1, output);
- if (j == n)
- {
- Vj = Vj.Mod(BigInteger.One.ShiftLeft(b));
- }
-
- W = W.Add(Vj.ShiftLeft(exp));
- }
-
-// 11.3 X = W + 2^(L–1). Comment: 0 ≤ W < 2L–1; hence, 2L–1 ≤ X < 2L.
- BigInteger X = W.Add(BigInteger.One.ShiftLeft(L - 1));
-
-// 11.4 c = X mod 2q.
- BigInteger c = X.Mod(q.ShiftLeft(1));
-
-// 11.5 p = X - (c - 1). Comment: p ≡ 1 (mod 2q).
- BigInteger p = X.Subtract(c.Subtract(BigInteger.One));
-
- // 11.6 If (p < 2^(L - 1)), then go to step 11.9
- if (p.BitLength != L)
- continue;
-
-// 11.7 Test whether or not p is prime as specified in Appendix C.3.
- // TODO Review C.3 for primality checking
- if (p.IsProbablePrime(certainty))
- {
-// 11.8 If p is determined to be prime, then return VALID and the values of p, q and
-// (optionally) the values of domain_parameter_seed and counter.
- // TODO Make configurable (8-bit unsigned)?
-
- if (usageIndex >= 0)
- {
- BigInteger g = CalculateGenerator_FIPS186_3_Verifiable(d, p, q, seed, usageIndex);
- if (g != null)
- return new DsaParameters(p, q, g, new DsaValidationParameters(seed, counter, usageIndex));
- }
-
- {
- BigInteger g = CalculateGenerator_FIPS186_3_Unverifiable(p, q, random);
-
- return new DsaParameters(p, q, g, new DsaValidationParameters(seed, counter));
- }
- }
-
-// 11.9 offset = offset + n + 1. Comment: Increment offset; then, as part of
-// the loop in step 11, increment counter; if
-// counter < 4L, repeat steps 11.1 through 11.8.
- // Note: 'offset' value already incremented in inner loop
- }
-// 12. Go to step 5.
- }
- }
-
- protected virtual BigInteger CalculateGenerator_FIPS186_3_Unverifiable(BigInteger p, BigInteger q,
- SecureRandom r)
- {
- return CalculateGenerator_FIPS186_2(p, q, r);
- }
-
- protected virtual BigInteger CalculateGenerator_FIPS186_3_Verifiable(IDigest d, BigInteger p, BigInteger q,
- byte[] seed, int index)
- {
- // A.2.3 Verifiable Canonical Generation of the Generator g
- BigInteger e = p.Subtract(BigInteger.One).Divide(q);
- byte[] ggen = Hex.Decode("6767656E");
-
- // 7. U = domain_parameter_seed || "ggen" || index || count.
- byte[] U = new byte[seed.Length + ggen.Length + 1 + 2];
- Array.Copy(seed, 0, U, 0, seed.Length);
- Array.Copy(ggen, 0, U, seed.Length, ggen.Length);
- U[U.Length - 3] = (byte)index;
-
- byte[] w = new byte[d.GetDigestSize()];
- for (int count = 1; count < (1 << 16); ++count)
- {
- Inc(U);
- Hash(d, U, w);
- BigInteger W = new BigInteger(1, w);
- BigInteger g = W.ModPow(e, p);
-
- if (g.CompareTo(BigInteger.Two) >= 0)
- return g;
- }
-
- return null;
- }
-
- private static bool IsValidDsaStrength(
- int strength)
- {
- return strength >= 512 && strength <= 1024 && strength % 64 == 0;
- }
-
- protected static void Hash(IDigest d, byte[] input, byte[] output)
- {
- d.BlockUpdate(input, 0, input.Length);
- d.DoFinal(output, 0);
- }
-
- private static int GetDefaultN(int L)
- {
- return L > 1024 ? 256 : 160;
- }
-
- protected static void Inc(byte[] buf)
- {
- for (int i = buf.Length - 1; i >= 0; --i)
- {
- byte b = (byte)(buf[i] + 1);
- buf[i] = b;
-
- if (b != 0)
- break;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/ECKeyPairGenerator.cs b/BCCrypto/src/crypto/generators/ECKeyPairGenerator.cs
deleted file mode 100644
index 26bc06e..0000000
--- a/BCCrypto/src/crypto/generators/ECKeyPairGenerator.cs
+++ /dev/null
@@ -1,162 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Sec;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.EC;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- public class ECKeyPairGenerator
- : IAsymmetricCipherKeyPairGenerator
- {
- private readonly string algorithm;
-
- private ECDomainParameters parameters;
- private DerObjectIdentifier publicKeyParamSet;
- private SecureRandom random;
-
- public ECKeyPairGenerator()
- : this("EC")
- {
- }
-
- public ECKeyPairGenerator(
- string algorithm)
- {
- if (algorithm == null)
- throw new ArgumentNullException("algorithm");
-
- this.algorithm = ECKeyParameters.VerifyAlgorithmName(algorithm);
- }
-
- public void Init(
- KeyGenerationParameters parameters)
- {
- if (parameters is ECKeyGenerationParameters)
- {
- ECKeyGenerationParameters ecP = (ECKeyGenerationParameters) parameters;
-
- this.publicKeyParamSet = ecP.PublicKeyParamSet;
- this.parameters = ecP.DomainParameters;
- }
- else
- {
- DerObjectIdentifier oid;
- switch (parameters.Strength)
- {
- case 192:
- oid = X9ObjectIdentifiers.Prime192v1;
- break;
- case 224:
- oid = SecObjectIdentifiers.SecP224r1;
- break;
- case 239:
- oid = X9ObjectIdentifiers.Prime239v1;
- break;
- case 256:
- oid = X9ObjectIdentifiers.Prime256v1;
- break;
- case 384:
- oid = SecObjectIdentifiers.SecP384r1;
- break;
- case 521:
- oid = SecObjectIdentifiers.SecP521r1;
- break;
- default:
- throw new InvalidParameterException("unknown key size.");
- }
-
- X9ECParameters ecps = FindECCurveByOid(oid);
-
- this.publicKeyParamSet = oid;
- this.parameters = new ECDomainParameters(
- ecps.Curve, ecps.G, ecps.N, ecps.H, ecps.GetSeed());
- }
-
- this.random = parameters.Random;
-
- if (this.random == null)
- {
- this.random = new SecureRandom();
- }
- }
-
- /**
- * Given the domain parameters this routine generates an EC key
- * pair in accordance with X9.62 section 5.2.1 pages 26, 27.
- */
- public AsymmetricCipherKeyPair GenerateKeyPair()
- {
- BigInteger n = parameters.N;
- BigInteger d;
- int minWeight = n.BitLength >> 2;
-
- for (;;)
- {
- d = new BigInteger(n.BitLength, random);
-
- if (d.CompareTo(BigInteger.Two) < 0 || d.CompareTo(n) >= 0)
- continue;
-
- if (WNafUtilities.GetNafWeight(d) < minWeight)
- continue;
-
- break;
- }
-
- ECPoint q = CreateBasePointMultiplier().Multiply(parameters.G, d);
-
- if (publicKeyParamSet != null)
- {
- return new AsymmetricCipherKeyPair(
- new ECPublicKeyParameters(algorithm, q, publicKeyParamSet),
- new ECPrivateKeyParameters(algorithm, d, publicKeyParamSet));
- }
-
- return new AsymmetricCipherKeyPair(
- new ECPublicKeyParameters(algorithm, q, parameters),
- new ECPrivateKeyParameters(algorithm, d, parameters));
- }
-
- protected virtual ECMultiplier CreateBasePointMultiplier()
- {
- return new FixedPointCombMultiplier();
- }
-
- internal static X9ECParameters FindECCurveByOid(DerObjectIdentifier oid)
- {
- // TODO ECGost3410NamedCurves support (returns ECDomainParameters though)
-
- X9ECParameters ecP = CustomNamedCurves.GetByOid(oid);
- if (ecP == null)
- {
- ecP = ECNamedCurveTable.GetByOid(oid);
- }
- return ecP;
- }
-
- internal static ECPublicKeyParameters GetCorrespondingPublicKey(
- ECPrivateKeyParameters privKey)
- {
- ECDomainParameters ec = privKey.Parameters;
- ECPoint q = new FixedPointCombMultiplier().Multiply(ec.G, privKey.D);
-
- if (privKey.PublicKeyParamSet != null)
- {
- return new ECPublicKeyParameters(privKey.AlgorithmName, q, privKey.PublicKeyParamSet);
- }
-
- return new ECPublicKeyParameters(privKey.AlgorithmName, q, ec);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/ElGamalKeyPairGenerator.cs b/BCCrypto/src/crypto/generators/ElGamalKeyPairGenerator.cs
deleted file mode 100644
index 227e7fe..0000000
--- a/BCCrypto/src/crypto/generators/ElGamalKeyPairGenerator.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * a ElGamal key pair generator.
- *
- * This Generates keys consistent for use with ElGamal as described in
- * page 164 of "Handbook of Applied Cryptography".
- */
- public class ElGamalKeyPairGenerator
- : IAsymmetricCipherKeyPairGenerator
- {
- private ElGamalKeyGenerationParameters param;
-
- public void Init(
- KeyGenerationParameters parameters)
- {
- this.param = (ElGamalKeyGenerationParameters) parameters;
- }
-
- public AsymmetricCipherKeyPair GenerateKeyPair()
- {
- DHKeyGeneratorHelper helper = DHKeyGeneratorHelper.Instance;
- ElGamalParameters egp = param.Parameters;
- DHParameters dhp = new DHParameters(egp.P, egp.G, null, 0, egp.L);
-
- BigInteger x = helper.CalculatePrivate(dhp, param.Random);
- BigInteger y = helper.CalculatePublic(dhp, x);
-
- return new AsymmetricCipherKeyPair(
- new ElGamalPublicKeyParameters(y, egp),
- new ElGamalPrivateKeyParameters(x, egp));
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/generators/ElGamalParametersGenerator.cs b/BCCrypto/src/crypto/generators/ElGamalParametersGenerator.cs
deleted file mode 100644
index 8443bb0..0000000
--- a/BCCrypto/src/crypto/generators/ElGamalParametersGenerator.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- public class ElGamalParametersGenerator
- {
- private int size;
- private int certainty;
- private SecureRandom random;
-
- public void Init(
- int size,
- int certainty,
- SecureRandom random)
- {
- this.size = size;
- this.certainty = certainty;
- this.random = random;
- }
-
- /**
- * which Generates the p and g values from the given parameters,
- * returning the ElGamalParameters object.
- *
- * Note: can take a while...
- *
- */
- public ElGamalParameters GenerateParameters()
- {
- //
- // find a safe prime p where p = 2*q + 1, where p and q are prime.
- //
- BigInteger[] safePrimes = DHParametersHelper.GenerateSafePrimes(size, certainty, random);
-
- BigInteger p = safePrimes[0];
- BigInteger q = safePrimes[1];
- BigInteger g = DHParametersHelper.SelectGenerator(p, q, random);
-
- return new ElGamalParameters(p, g);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/GOST3410KeyPairGenerator.cs b/BCCrypto/src/crypto/generators/GOST3410KeyPairGenerator.cs
deleted file mode 100644
index 520820b..0000000
--- a/BCCrypto/src/crypto/generators/GOST3410KeyPairGenerator.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * a GOST3410 key pair generator.
- * This generates GOST3410 keys in line with the method described
- * in GOST R 34.10-94.
- */
- public class Gost3410KeyPairGenerator
- : IAsymmetricCipherKeyPairGenerator
- {
- private Gost3410KeyGenerationParameters param;
-
- public void Init(
- KeyGenerationParameters parameters)
- {
- if (parameters is Gost3410KeyGenerationParameters)
- {
- this.param = (Gost3410KeyGenerationParameters) parameters;
- }
- else
- {
- Gost3410KeyGenerationParameters kgp = new Gost3410KeyGenerationParameters(
- parameters.Random,
- CryptoProObjectIdentifiers.GostR3410x94CryptoProA);
-
- if (parameters.Strength != kgp.Parameters.P.BitLength - 1)
- {
- // TODO Should we complain?
- }
-
- this.param = kgp;
- }
- }
-
- public AsymmetricCipherKeyPair GenerateKeyPair()
- {
- SecureRandom random = param.Random;
- Gost3410Parameters gost3410Params = param.Parameters;
-
- BigInteger q = gost3410Params.Q, x;
-
- int minWeight = 64;
- for (;;)
- {
- x = new BigInteger(256, random);
-
- if (x.SignValue < 1 || x.CompareTo(q) >= 0)
- continue;
-
- if (WNafUtilities.GetNafWeight(x) < minWeight)
- continue;
-
- break;
- }
-
- BigInteger p = gost3410Params.P;
- BigInteger a = gost3410Params.A;
-
- // calculate the public key.
- BigInteger y = a.ModPow(x, p);
-
- if (param.PublicKeyParamSet != null)
- {
- return new AsymmetricCipherKeyPair(
- new Gost3410PublicKeyParameters(y, param.PublicKeyParamSet),
- new Gost3410PrivateKeyParameters(x, param.PublicKeyParamSet));
- }
-
- return new AsymmetricCipherKeyPair(
- new Gost3410PublicKeyParameters(y, gost3410Params),
- new Gost3410PrivateKeyParameters(x, gost3410Params));
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/GOST3410ParametersGenerator.cs b/BCCrypto/src/crypto/generators/GOST3410ParametersGenerator.cs
deleted file mode 100644
index 52a9f5a..0000000
--- a/BCCrypto/src/crypto/generators/GOST3410ParametersGenerator.cs
+++ /dev/null
@@ -1,530 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * generate suitable parameters for GOST3410.
- */
- public class Gost3410ParametersGenerator
- {
- private int size;
- private int typeproc;
- private SecureRandom init_random;
-
- /**
- * initialise the key generator.
- *
- * @param size size of the key
- * @param typeProcedure type procedure A,B = 1; A',B' - else
- * @param random random byte source.
- */
- public void Init(
- int size,
- int typeProcedure,
- SecureRandom random)
- {
- this.size = size;
- this.typeproc = typeProcedure;
- this.init_random = random;
- }
-
- //Procedure A
- private int procedure_A(int x0, int c, BigInteger[] pq, int size)
- {
- //Verify and perform condition: 065536)
- {
- x0 = init_random.NextInt()/32768;
- }
-
- while((c<0 || c>65536) || (c/2==0))
- {
- c = init_random.NextInt()/32768 + 1;
- }
-
- BigInteger C = BigInteger.ValueOf(c);
- BigInteger constA16 = BigInteger.ValueOf(19381);
-
- //step1
- BigInteger[] y = new BigInteger[1]; // begin length = 1
- y[0] = BigInteger.ValueOf(x0);
-
- //step 2
- int[] t = new int[1]; // t - orders; begin length = 1
- t[0] = size;
- int s = 0;
- for (int i=0; t[i]>=17; i++)
- {
- // extension array t
- int[] tmp_t = new int[t.Length + 1]; ///////////////
- Array.Copy(t,0,tmp_t,0,t.Length); // extension
- t = new int[tmp_t.Length]; // array t
- Array.Copy(tmp_t, 0, t, 0, tmp_t.Length); ///////////////
-
- t[i+1] = t[i]/2;
- s = i+1;
- }
-
- //step3
- BigInteger[] p = new BigInteger[s+1];
- p[s] = new BigInteger("8003",16); //set min prime number length 16 bit
-
- int m = s-1; //step4
-
- for (int i=0; i t[m])
- {
- goto step6; //step 12
- }
-
- p[m] = NByLastP.Add(BigInteger.One);
-
- //step13
- if (BigInteger.Two.ModPow(NByLastP, p[m]).CompareTo(BigInteger.One) == 0
- && BigInteger.Two.ModPow(N, p[m]).CompareTo(BigInteger.One) != 0)
- {
- break;
- }
-
- N = N.Add(BigInteger.Two);
- }
-
- if (--m < 0)
- {
- pq[0] = p[0];
- pq[1] = p[1];
- return y[0].IntValue; //return for procedure B step 2
- }
-
- break; //step 14
- }
- }
- return y[0].IntValue;
- }
-
- //Procedure A'
- private long procedure_Aa(long x0, long c, BigInteger[] pq, int size)
- {
- //Verify and perform condition: 04294967296L)
- {
- x0 = init_random.NextInt()*2;
- }
-
- while((c<0 || c>4294967296L) || (c/2==0))
- {
- c = init_random.NextInt()*2+1;
- }
-
- BigInteger C = BigInteger.ValueOf(c);
- BigInteger constA32 = BigInteger.ValueOf(97781173);
-
- //step1
- BigInteger[] y = new BigInteger[1]; // begin length = 1
- y[0] = BigInteger.ValueOf(x0);
-
- //step 2
- int[] t = new int[1]; // t - orders; begin length = 1
- t[0] = size;
- int s = 0;
- for (int i=0; t[i]>=33; i++)
- {
- // extension array t
- int[] tmp_t = new int[t.Length + 1]; ///////////////
- Array.Copy(t,0,tmp_t,0,t.Length); // extension
- t = new int[tmp_t.Length]; // array t
- Array.Copy(tmp_t, 0, t, 0, tmp_t.Length); ///////////////
-
- t[i+1] = t[i]/2;
- s = i+1;
- }
-
- //step3
- BigInteger[] p = new BigInteger[s+1];
- p[s] = new BigInteger("8000000B",16); //set min prime number length 32 bit
-
- int m = s-1; //step4
-
- for (int i=0; i t[m])
- {
- goto step6; //step 12
- }
-
- p[m] = NByLastP.Add(BigInteger.One);
-
- //step13
- if (BigInteger.Two.ModPow(NByLastP, p[m]).CompareTo(BigInteger.One) == 0
- && BigInteger.Two.ModPow(N, p[m]).CompareTo(BigInteger.One) != 0)
- {
- break;
- }
-
- N = N.Add(BigInteger.Two);
- }
-
- if (--m < 0)
- {
- pq[0] = p[0];
- pq[1] = p[1];
- return y[0].LongValue; //return for procedure B' step 2
- }
-
- break; //step 14
- }
- }
- return y[0].LongValue;
- }
-
- //Procedure B
- private void procedure_B(int x0, int c, BigInteger[] pq)
- {
- //Verify and perform condition: 065536)
- {
- x0 = init_random.NextInt()/32768;
- }
-
- while((c<0 || c>65536) || (c/2==0))
- {
- c = init_random.NextInt()/32768 + 1;
- }
-
- BigInteger [] qp = new BigInteger[2];
- BigInteger q = null, Q = null, p = null;
- BigInteger C = BigInteger.ValueOf(c);
- BigInteger constA16 = BigInteger.ValueOf(19381);
-
- //step1
- x0 = procedure_A(x0, c, qp, 256);
- q = qp[0];
-
- //step2
- x0 = procedure_A(x0, c, qp, 512);
- Q = qp[0];
-
- BigInteger[] y = new BigInteger[65];
- y[0] = BigInteger.ValueOf(x0);
-
- const int tp = 1024;
-
- BigInteger qQ = q.Multiply(Q);
-
-step3:
- for(;;)
- {
- //step 3
- for (int j=0; j<64; j++)
- {
- y[j+1] = (y[j].Multiply(constA16).Add(C)).Mod(BigInteger.Two.Pow(16));
- }
-
- //step 4
- BigInteger Y = BigInteger.Zero;
-
- for (int j=0; j<64; j++)
- {
- Y = Y.Add(y[j].ShiftLeft(16*j));
- }
-
- y[0] = y[64]; //step 5
-
- //step 6
- BigInteger N = BigInteger.One.ShiftLeft(tp-1).Divide(qQ).Add(
- Y.ShiftLeft(tp-1).Divide(qQ.ShiftLeft(1024)));
-
- if (N.TestBit(0))
- {
- N = N.Add(BigInteger.One);
- }
-
- //step 7
-
- for(;;)
- {
- //step 11
- BigInteger qQN = qQ.Multiply(N);
-
- if (qQN.BitLength > tp)
- {
- goto step3; //step 9
- }
-
- p = qQN.Add(BigInteger.One);
-
- //step10
- if (BigInteger.Two.ModPow(qQN, p).CompareTo(BigInteger.One) == 0
- && BigInteger.Two.ModPow(q.Multiply(N), p).CompareTo(BigInteger.One) != 0)
- {
- pq[0] = p;
- pq[1] = q;
- return;
- }
-
- N = N.Add(BigInteger.Two);
- }
- }
- }
-
- //Procedure B'
- private void procedure_Bb(long x0, long c, BigInteger[] pq)
- {
- //Verify and perform condition: 04294967296L)
- {
- x0 = init_random.NextInt()*2;
- }
-
- while((c<0 || c>4294967296L) || (c/2==0))
- {
- c = init_random.NextInt()*2+1;
- }
-
- BigInteger [] qp = new BigInteger[2];
- BigInteger q = null, Q = null, p = null;
- BigInteger C = BigInteger.ValueOf(c);
- BigInteger constA32 = BigInteger.ValueOf(97781173);
-
- //step1
- x0 = procedure_Aa(x0, c, qp, 256);
- q = qp[0];
-
- //step2
- x0 = procedure_Aa(x0, c, qp, 512);
- Q = qp[0];
-
- BigInteger[] y = new BigInteger[33];
- y[0] = BigInteger.ValueOf(x0);
-
- const int tp = 1024;
-
- BigInteger qQ = q.Multiply(Q);
-
-step3:
- for(;;)
- {
- //step 3
- for (int j=0; j<32; j++)
- {
- y[j+1] = (y[j].Multiply(constA32).Add(C)).Mod(BigInteger.Two.Pow(32));
- }
-
- //step 4
- BigInteger Y = BigInteger.Zero;
- for (int j=0; j<32; j++)
- {
- Y = Y.Add(y[j].ShiftLeft(32*j));
- }
-
- y[0] = y[32]; //step 5
-
- //step 6
- BigInteger N = BigInteger.One.ShiftLeft(tp-1).Divide(qQ).Add(
- Y.ShiftLeft(tp-1).Divide(qQ.ShiftLeft(1024)));
-
- if (N.TestBit(0))
- {
- N = N.Add(BigInteger.One);
- }
-
- //step 7
-
- for(;;)
- {
- //step 11
- BigInteger qQN = qQ.Multiply(N);
-
- if (qQN.BitLength > tp)
- {
- goto step3; //step 9
- }
-
- p = qQN.Add(BigInteger.One);
-
- //step10
- if (BigInteger.Two.ModPow(qQN, p).CompareTo(BigInteger.One) == 0
- && BigInteger.Two.ModPow(q.Multiply(N), p).CompareTo(BigInteger.One) != 0)
- {
- pq[0] = p;
- pq[1] = q;
- return;
- }
-
- N = N.Add(BigInteger.Two);
- }
- }
- }
-
-
- /**
- * Procedure C
- * procedure generates the a value from the given p,q,
- * returning the a value.
- */
- private BigInteger procedure_C(BigInteger p, BigInteger q)
- {
- BigInteger pSub1 = p.Subtract(BigInteger.One);
- BigInteger pSub1Divq = pSub1.Divide(q);
-
- for(;;)
- {
- BigInteger d = new BigInteger(p.BitLength, init_random);
-
- // 1 < d < p-1
- if (d.CompareTo(BigInteger.One) > 0 && d.CompareTo(pSub1) < 0)
- {
- BigInteger a = d.ModPow(pSub1Divq, p);
-
- if (a.CompareTo(BigInteger.One) != 0)
- {
- return a;
- }
- }
- }
- }
-
- /**
- * which generates the p , q and a values from the given parameters,
- * returning the Gost3410Parameters object.
- */
- public Gost3410Parameters GenerateParameters()
- {
- BigInteger [] pq = new BigInteger[2];
- BigInteger q = null, p = null, a = null;
-
- int x0, c;
- long x0L, cL;
-
- if (typeproc==1)
- {
- x0 = init_random.NextInt();
- c = init_random.NextInt();
-
- switch(size)
- {
- case 512:
- procedure_A(x0, c, pq, 512);
- break;
- case 1024:
- procedure_B(x0, c, pq);
- break;
- default:
- throw new ArgumentException("Ooops! key size 512 or 1024 bit.");
- }
- p = pq[0]; q = pq[1];
- a = procedure_C(p, q);
- //System.out.println("p:"+p.toString(16)+"\n"+"q:"+q.toString(16)+"\n"+"a:"+a.toString(16));
- //System.out.println("p:"+p+"\n"+"q:"+q+"\n"+"a:"+a);
- return new Gost3410Parameters(p, q, a, new Gost3410ValidationParameters(x0, c));
- }
- else
- {
- x0L = init_random.NextLong();
- cL = init_random.NextLong();
-
- switch(size)
- {
- case 512:
- procedure_Aa(x0L, cL, pq, 512);
- break;
- case 1024:
- procedure_Bb(x0L, cL, pq);
- break;
- default:
- throw new InvalidOperationException("Ooops! key size 512 or 1024 bit.");
- }
- p = pq[0]; q = pq[1];
- a = procedure_C(p, q);
- //System.out.println("p:"+p.toString(16)+"\n"+"q:"+q.toString(16)+"\n"+"a:"+a.toString(16));
- //System.out.println("p:"+p+"\n"+"q:"+q+"\n"+"a:"+a);
- return new Gost3410Parameters(p, q, a, new Gost3410ValidationParameters(x0L, cL));
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/HKDFBytesGenerator.cs b/BCCrypto/src/crypto/generators/HKDFBytesGenerator.cs
deleted file mode 100644
index c2e667c..0000000
--- a/BCCrypto/src/crypto/generators/HKDFBytesGenerator.cs
+++ /dev/null
@@ -1,153 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * HMAC-based Extract-and-Expand Key Derivation Function (HKDF) implemented
- * according to IETF RFC 5869, May 2010 as specified by H. Krawczyk, IBM
- * Research & P. Eronen, Nokia. It uses a HMac internally to compute de OKM
- * (output keying material) and is likely to have better security properties
- * than KDF's based on just a hash function.
- */
- public class HkdfBytesGenerator
- : IDerivationFunction
- {
- private HMac hMacHash;
- private int hashLen;
-
- private byte[] info;
- private byte[] currentT;
-
- private int generatedBytes;
-
- /**
- * Creates a HKDFBytesGenerator based on the given hash function.
- *
- * @param hash the digest to be used as the source of generatedBytes bytes
- */
- public HkdfBytesGenerator(IDigest hash)
- {
- this.hMacHash = new HMac(hash);
- this.hashLen = hash.GetDigestSize();
- }
-
- public virtual void Init(IDerivationParameters parameters)
- {
- if (!(parameters is HkdfParameters))
- throw new ArgumentException("HKDF parameters required for HkdfBytesGenerator", "parameters");
-
- HkdfParameters hkdfParameters = (HkdfParameters)parameters;
- if (hkdfParameters.SkipExtract)
- {
- // use IKM directly as PRK
- hMacHash.Init(new KeyParameter(hkdfParameters.GetIkm()));
- }
- else
- {
- hMacHash.Init(Extract(hkdfParameters.GetSalt(), hkdfParameters.GetIkm()));
- }
-
- info = hkdfParameters.GetInfo();
-
- generatedBytes = 0;
- currentT = new byte[hashLen];
- }
-
- /**
- * Performs the extract part of the key derivation function.
- *
- * @param salt the salt to use
- * @param ikm the input keying material
- * @return the PRK as KeyParameter
- */
- private KeyParameter Extract(byte[] salt, byte[] ikm)
- {
- hMacHash.Init(new KeyParameter(ikm));
- if (salt == null)
- {
- // TODO check if hashLen is indeed same as HMAC size
- hMacHash.Init(new KeyParameter(new byte[hashLen]));
- }
- else
- {
- hMacHash.Init(new KeyParameter(salt));
- }
-
- hMacHash.BlockUpdate(ikm, 0, ikm.Length);
-
- byte[] prk = new byte[hashLen];
- hMacHash.DoFinal(prk, 0);
- return new KeyParameter(prk);
- }
-
- /**
- * Performs the expand part of the key derivation function, using currentT
- * as input and output buffer.
- *
- * @throws DataLengthException if the total number of bytes generated is larger than the one
- * specified by RFC 5869 (255 * HashLen)
- */
- private void ExpandNext()
- {
- int n = generatedBytes / hashLen + 1;
- if (n >= 256)
- {
- throw new DataLengthException(
- "HKDF cannot generate more than 255 blocks of HashLen size");
- }
- // special case for T(0): T(0) is empty, so no update
- if (generatedBytes != 0)
- {
- hMacHash.BlockUpdate(currentT, 0, hashLen);
- }
- hMacHash.BlockUpdate(info, 0, info.Length);
- hMacHash.Update((byte)n);
- hMacHash.DoFinal(currentT, 0);
- }
-
- public virtual IDigest Digest
- {
- get { return hMacHash.GetUnderlyingDigest(); }
- }
-
- public virtual int GenerateBytes(byte[] output, int outOff, int len)
- {
- if (generatedBytes + len > 255 * hashLen)
- {
- throw new DataLengthException(
- "HKDF may only be used for 255 * HashLen bytes of output");
- }
-
- if (generatedBytes % hashLen == 0)
- {
- ExpandNext();
- }
-
- // copy what is left in the currentT (1..hash
- int toGenerate = len;
- int posInT = generatedBytes % hashLen;
- int leftInT = hashLen - generatedBytes % hashLen;
- int toCopy = System.Math.Min(leftInT, toGenerate);
- Array.Copy(currentT, posInT, output, outOff, toCopy);
- generatedBytes += toCopy;
- toGenerate -= toCopy;
- outOff += toCopy;
-
- while (toGenerate > 0)
- {
- ExpandNext();
- toCopy = System.Math.Min(hashLen, toGenerate);
- Array.Copy(currentT, 0, output, outOff, toCopy);
- generatedBytes += toCopy;
- toGenerate -= toCopy;
- outOff += toCopy;
- }
-
- return len;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/Kdf1BytesGenerator.cs b/BCCrypto/src/crypto/generators/Kdf1BytesGenerator.cs
deleted file mode 100644
index 0ddf6c1..0000000
--- a/BCCrypto/src/crypto/generators/Kdf1BytesGenerator.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * KFD2 generator for derived keys and ivs as defined by IEEE P1363a/ISO 18033
- *
- * This implementation is based on IEEE P1363/ISO 18033.
- */
- public class Kdf1BytesGenerator
- : BaseKdfBytesGenerator
- {
- /**
- * Construct a KDF1 byte generator.
- *
- * @param digest the digest to be used as the source of derived keys.
- */
- public Kdf1BytesGenerator(IDigest digest)
- : base(0, digest)
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/Kdf2BytesGenerator.cs b/BCCrypto/src/crypto/generators/Kdf2BytesGenerator.cs
deleted file mode 100644
index 8a68219..0000000
--- a/BCCrypto/src/crypto/generators/Kdf2BytesGenerator.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * KDF2 generator for derived keys and ivs as defined by IEEE P1363a/ISO 18033
- *
- * This implementation is based on IEEE P1363/ISO 18033.
- */
- public class Kdf2BytesGenerator
- : BaseKdfBytesGenerator
- {
- /**
- * Construct a KDF2 bytes generator. Generates key material
- * according to IEEE P1363 or ISO 18033 depending on the initialisation.
- *
- * @param digest the digest to be used as the source of derived keys.
- */
- public Kdf2BytesGenerator(IDigest digest)
- : base(1, digest)
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/Mgf1BytesGenerator.cs b/BCCrypto/src/crypto/generators/Mgf1BytesGenerator.cs
deleted file mode 100644
index 23a3aca..0000000
--- a/BCCrypto/src/crypto/generators/Mgf1BytesGenerator.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-using System;
-//using Org.BouncyCastle.Math;
-//using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * Generator for MGF1 as defined in Pkcs 1v2
- */
- public class Mgf1BytesGenerator : IDerivationFunction
- {
- private IDigest digest;
- private byte[] seed;
- private int hLen;
-
- /**
- * @param digest the digest to be used as the source of Generated bytes
- */
- public Mgf1BytesGenerator(
- IDigest digest)
- {
- this.digest = digest;
- this.hLen = digest.GetDigestSize();
- }
-
- public void Init(
- IDerivationParameters parameters)
- {
- if (!(typeof(MgfParameters).IsInstanceOfType(parameters)))
- {
- throw new ArgumentException("MGF parameters required for MGF1Generator");
- }
-
- MgfParameters p = (MgfParameters)parameters;
-
- seed = p.GetSeed();
- }
-
- /**
- * return the underlying digest.
- */
- public IDigest Digest
- {
- get
- {
- return digest;
- }
- }
-
- /**
- * int to octet string.
- */
- private void ItoOSP(
- int i,
- byte[] sp)
- {
- sp[0] = (byte)((uint) i >> 24);
- sp[1] = (byte)((uint) i >> 16);
- sp[2] = (byte)((uint) i >> 8);
- sp[3] = (byte)((uint) i >> 0);
- }
-
- /**
- * fill len bytes of the output buffer with bytes Generated from
- * the derivation function.
- *
- * @throws DataLengthException if the out buffer is too small.
- */
- public int GenerateBytes(
- byte[] output,
- int outOff,
- int length)
- {
- if ((output.Length - length) < outOff)
- {
- throw new DataLengthException("output buffer too small");
- }
-
- byte[] hashBuf = new byte[hLen];
- byte[] C = new byte[4];
- int counter = 0;
-
- digest.Reset();
-
- if (length > hLen)
- {
- do
- {
- ItoOSP(counter, C);
-
- digest.BlockUpdate(seed, 0, seed.Length);
- digest.BlockUpdate(C, 0, C.Length);
- digest.DoFinal(hashBuf, 0);
-
- Array.Copy(hashBuf, 0, output, outOff + counter * hLen, hLen);
- }
- while (++counter < (length / hLen));
- }
-
- if ((counter * hLen) < length)
- {
- ItoOSP(counter, C);
-
- digest.BlockUpdate(seed, 0, seed.Length);
- digest.BlockUpdate(C, 0, C.Length);
- digest.DoFinal(hashBuf, 0);
-
- Array.Copy(hashBuf, 0, output, outOff + counter * hLen, length - (counter * hLen));
- }
-
- return length;
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/generators/NaccacheSternKeyPairGenerator.cs b/BCCrypto/src/crypto/generators/NaccacheSternKeyPairGenerator.cs
deleted file mode 100644
index 618ca9a..0000000
--- a/BCCrypto/src/crypto/generators/NaccacheSternKeyPairGenerator.cs
+++ /dev/null
@@ -1,268 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * Key generation parameters for NaccacheStern cipher. For details on this cipher, please see
- *
- * http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf
- */
- public class NaccacheSternKeyPairGenerator
- : IAsymmetricCipherKeyPairGenerator
- {
- private static readonly int[] smallPrimes =
- {
- 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,
- 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149,
- 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233,
- 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331,
- 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431,
- 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523,
- 541, 547, 557
- };
-
- private NaccacheSternKeyGenerationParameters param;
-
- /*
- * (non-Javadoc)
- *
- * @see org.bouncycastle.crypto.AsymmetricCipherKeyPairGenerator#init(org.bouncycastle.crypto.KeyGenerationParameters)
- */
- public void Init(KeyGenerationParameters parameters)
- {
- this.param = (NaccacheSternKeyGenerationParameters)parameters;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.bouncycastle.crypto.AsymmetricCipherKeyPairGenerator#generateKeyPair()
- */
- public AsymmetricCipherKeyPair GenerateKeyPair()
- {
- int strength = param.Strength;
- SecureRandom rand = param.Random;
- int certainty = param.Certainty;
-
- IList smallPrimes = findFirstPrimes(param.CountSmallPrimes);
-
- smallPrimes = permuteList(smallPrimes, rand);
-
- BigInteger u = BigInteger.One;
- BigInteger v = BigInteger.One;
-
- for (int i = 0; i < smallPrimes.Count / 2; i++)
- {
- u = u.Multiply((BigInteger)smallPrimes[i]);
- }
- for (int i = smallPrimes.Count / 2; i < smallPrimes.Count; i++)
- {
- v = v.Multiply((BigInteger)smallPrimes[i]);
- }
-
- BigInteger sigma = u.Multiply(v);
-
- // n = (2 a u _p + 1 ) ( 2 b v _q + 1)
- // -> |n| = strength
- // |2| = 1 in bits
- // -> |a| * |b| = |n| - |u| - |v| - |_p| - |_q| - |2| -|2|
- // remainingStrength = strength - sigma.bitLength() - _p.bitLength() -
- // _q.bitLength() - 1 -1
- int remainingStrength = strength - sigma.BitLength - 48;
- BigInteger a = generatePrime(remainingStrength / 2 + 1, certainty, rand);
- BigInteger b = generatePrime(remainingStrength / 2 + 1, certainty, rand);
-
- BigInteger _p;
- BigInteger _q;
- BigInteger p;
- BigInteger q;
-
- long tries = 0;
-
- BigInteger _2au = a.Multiply(u).ShiftLeft(1);
- BigInteger _2bv = b.Multiply(v).ShiftLeft(1);
-
- for (;;)
- {
- tries++;
-
- _p = generatePrime(24, certainty, rand);
-
- p = _p.Multiply(_2au).Add(BigInteger.One);
-
- if (!p.IsProbablePrime(certainty, true))
- continue;
-
- for (;;)
- {
- _q = generatePrime(24, certainty, rand);
-
- if (_p.Equals(_q))
- continue;
-
- q = _q.Multiply(_2bv).Add(BigInteger.One);
-
- if (q.IsProbablePrime(certainty, true))
- break;
- }
-
- if (!sigma.Gcd(_p.Multiply(_q)).Equals(BigInteger.One))
- {
- //Console.WriteLine("sigma.gcd(_p.mult(_q)) != 1!\n _p: " + _p +"\n _q: "+ _q );
- continue;
- }
-
- if (p.Multiply(q).BitLength < strength)
- {
- continue;
- }
- break;
- }
-
- BigInteger n = p.Multiply(q);
- BigInteger phi_n = p.Subtract(BigInteger.One).Multiply(q.Subtract(BigInteger.One));
- BigInteger g;
- tries = 0;
-
- for (;;)
- {
- // TODO After the first loop, just regenerate one randomly-selected gPart each time?
- IList gParts = Platform.CreateArrayList();
- for (int ind = 0; ind != smallPrimes.Count; ind++)
- {
- BigInteger i = (BigInteger)smallPrimes[ind];
- BigInteger e = phi_n.Divide(i);
-
- for (;;)
- {
- tries++;
-
- g = generatePrime(strength, certainty, rand);
-
- if (!g.ModPow(e, n).Equals(BigInteger.One))
- {
- gParts.Add(g);
- break;
- }
- }
- }
- g = BigInteger.One;
- for (int i = 0; i < smallPrimes.Count; i++)
- {
- BigInteger gPart = (BigInteger) gParts[i];
- BigInteger smallPrime = (BigInteger) smallPrimes[i];
- g = g.Multiply(gPart.ModPow(sigma.Divide(smallPrime), n)).Mod(n);
- }
-
- // make sure that g is not divisible by p_i or q_i
- bool divisible = false;
- for (int i = 0; i < smallPrimes.Count; i++)
- {
- if (g.ModPow(phi_n.Divide((BigInteger)smallPrimes[i]), n).Equals(BigInteger.One))
- {
- divisible = true;
- break;
- }
- }
-
- if (divisible)
- {
- continue;
- }
-
- // make sure that g has order > phi_n/4
-
- //if (g.ModPow(phi_n.Divide(BigInteger.ValueOf(4)), n).Equals(BigInteger.One))
- if (g.ModPow(phi_n.ShiftRight(2), n).Equals(BigInteger.One))
- {
- continue;
- }
-
- if (g.ModPow(phi_n.Divide(_p), n).Equals(BigInteger.One))
- {
- continue;
- }
- if (g.ModPow(phi_n.Divide(_q), n).Equals(BigInteger.One))
- {
- continue;
- }
- if (g.ModPow(phi_n.Divide(a), n).Equals(BigInteger.One))
- {
- continue;
- }
- if (g.ModPow(phi_n.Divide(b), n).Equals(BigInteger.One))
- {
- continue;
- }
- break;
- }
-
- return new AsymmetricCipherKeyPair(new NaccacheSternKeyParameters(false, g, n, sigma.BitLength),
- new NaccacheSternPrivateKeyParameters(g, n, sigma.BitLength, smallPrimes, phi_n));
- }
-
- private static BigInteger generatePrime(
- int bitLength,
- int certainty,
- SecureRandom rand)
- {
- return new BigInteger(bitLength, certainty, rand);
- }
-
- /**
- * Generates a permuted ArrayList from the original one. The original List
- * is not modified
- *
- * @param arr
- * the ArrayList to be permuted
- * @param rand
- * the source of Randomness for permutation
- * @return a new IList with the permuted elements.
- */
- private static IList permuteList(
- IList arr,
- SecureRandom rand)
- {
- // TODO Create a utility method for generating permutation of first 'n' integers
-
- IList retval = Platform.CreateArrayList(arr.Count);
-
- foreach (object element in arr)
- {
- int index = rand.Next(retval.Count + 1);
- retval.Insert(index, element);
- }
-
- return retval;
- }
-
- /**
- * Finds the first 'count' primes starting with 3
- *
- * @param count
- * the number of primes to find
- * @return a vector containing the found primes as Integer
- */
- private static IList findFirstPrimes(
- int count)
- {
- IList primes = Platform.CreateArrayList(count);
-
- for (int i = 0; i != count; i++)
- {
- primes.Add(BigInteger.ValueOf(smallPrimes[i]));
- }
-
- return primes;
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/generators/OpenBsdBCrypt.cs b/BCCrypto/src/crypto/generators/OpenBsdBCrypt.cs
deleted file mode 100644
index 85c34d7..0000000
--- a/BCCrypto/src/crypto/generators/OpenBsdBCrypt.cs
+++ /dev/null
@@ -1,270 +0,0 @@
-using System;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * Password hashing scheme BCrypt,
- * designed by Niels Provos and David Mazières, using the
- * String format and the Base64 encoding
- * of the reference implementation on OpenBSD
- */
- public class OpenBsdBCrypt
- {
- private static readonly byte[] EncodingTable = // the Bcrypts encoding table for OpenBSD
- {
- (byte)'.', (byte)'/', (byte)'A', (byte)'B', (byte)'C', (byte)'D',
- (byte)'E', (byte)'F', (byte)'G', (byte)'H', (byte)'I', (byte)'J',
- (byte)'K', (byte)'L', (byte)'M', (byte)'N', (byte)'O', (byte)'P',
- (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', (byte)'V',
- (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', (byte)'a', (byte)'b',
- (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', (byte)'h',
- (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n',
- (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t',
- (byte)'u', (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z',
- (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5',
- (byte)'6', (byte)'7', (byte)'8', (byte)'9'
- };
-
- /*
- * set up the decoding table.
- */
- private static readonly byte[] DecodingTable = new byte[128];
- private static readonly string Version = "2a"; // previous version was not UTF-8
-
- static OpenBsdBCrypt()
- {
- for (int i = 0; i < DecodingTable.Length; i++)
- {
- DecodingTable[i] = (byte)0xff;
- }
-
- for (int i = 0; i < EncodingTable.Length; i++)
- {
- DecodingTable[EncodingTable[i]] = (byte)i;
- }
- }
-
- public OpenBsdBCrypt()
- {
- }
-
- /**
- * Creates a 60 character Bcrypt String, including
- * version, cost factor, salt and hash, separated by '$'
- *
- * @param cost the cost factor, treated as an exponent of 2
- * @param salt a 16 byte salt
- * @param password the password
- * @return a 60 character Bcrypt String
- */
- private static string CreateBcryptString(byte[] password, byte[] salt, int cost)
- {
- StringBuilder sb = new StringBuilder(60);
- sb.Append('$');
- sb.Append(Version);
- sb.Append('$');
- sb.Append(cost < 10 ? ("0" + cost) : cost.ToString());
- sb.Append('$');
- sb.Append(EncodeData(salt));
-
- byte[] key = BCrypt.Generate(password, salt, cost);
-
- sb.Append(EncodeData(key));
-
- return sb.ToString();
- }
-
- /**
- * Creates a 60 character Bcrypt String, including
- * version, cost factor, salt and hash, separated by '$'
- *
- * @param cost the cost factor, treated as an exponent of 2
- * @param salt a 16 byte salt
- * @param password the password
- * @return a 60 character Bcrypt String
- */
- public static string Generate(char[] password, byte[] salt, int cost)
- {
- if (password == null)
- throw new ArgumentNullException("password");
- if (salt == null)
- throw new ArgumentNullException("salt");
- if (salt.Length != 16)
- throw new DataLengthException("16 byte salt required: " + salt.Length);
-
- if (cost < 4 || cost > 31) // Minimum rounds: 16, maximum 2^31
- throw new ArgumentException("Invalid cost factor.", "cost");
-
- byte[] psw = Strings.ToUtf8ByteArray(password);
-
- // 0 termination:
-
- byte[] tmp = new byte[psw.Length >= 72 ? 72 : psw.Length + 1];
- int copyLen = System.Math.Min(psw.Length, tmp.Length);
- Array.Copy(psw, 0, tmp, 0, copyLen);
-
- Array.Clear(psw, 0, psw.Length);
-
- string rv = CreateBcryptString(tmp, salt, cost);
-
- Array.Clear(tmp, 0, tmp.Length);
-
- return rv;
- }
-
- /**
- * Checks if a password corresponds to a 60 character Bcrypt String
- *
- * @param bcryptString a 60 character Bcrypt String, including
- * version, cost factor, salt and hash,
- * separated by '$'
- * @param password the password as an array of chars
- * @return true if the password corresponds to the
- * Bcrypt String, otherwise false
- */
- public static bool CheckPassword(string bcryptString, char[] password)
- {
- // validate bcryptString:
- if (bcryptString.Length != 60)
- throw new DataLengthException("Bcrypt String length: " + bcryptString.Length + ", 60 required.");
- if (bcryptString[0] != '$' || bcryptString[3] != '$' || bcryptString[6] != '$')
- throw new ArgumentException("Invalid Bcrypt String format.", "bcryptString");
- if (!bcryptString.Substring(1, 2).Equals(Version))
- throw new ArgumentException("Wrong Bcrypt version, 2a expected.", "bcryptString");
-
- int cost = 0;
- try
- {
- cost = Int32.Parse(bcryptString.Substring(4, 2));
- }
- catch (Exception nfe)
- {
- throw new ArgumentException("Invalid cost factor: " + bcryptString.Substring(4, 2), "bcryptString");
- }
- if (cost < 4 || cost > 31)
- throw new ArgumentException("Invalid cost factor: " + cost + ", 4 < cost < 31 expected.");
-
- // check password:
- if (password == null)
- throw new ArgumentNullException("Missing password.");
-
- int start = bcryptString.LastIndexOf('$') + 1, end = bcryptString.Length - 31;
- byte[] salt = DecodeSaltString(bcryptString.Substring(start, end - start));
-
- string newBcryptString = Generate(password, salt, cost);
-
- return bcryptString.Equals(newBcryptString);
- }
-
- /*
- * encode the input data producing a Bcrypt base 64 string.
- *
- * @param a byte representation of the salt or the password
- * @return the Bcrypt base64 string
- */
- private static string EncodeData(byte[] data)
- {
- if (data.Length != 24 && data.Length != 16) // 192 bit key or 128 bit salt expected
- throw new DataLengthException("Invalid length: " + data.Length + ", 24 for key or 16 for salt expected");
-
- bool salt = false;
- if (data.Length == 16)//salt
- {
- salt = true;
- byte[] tmp = new byte[18];// zero padding
- Array.Copy(data, 0, tmp, 0, data.Length);
- data = tmp;
- }
- else // key
- {
- data[data.Length - 1] = (byte)0;
- }
-
- MemoryStream mOut = new MemoryStream();
- int len = data.Length;
-
- uint a1, a2, a3;
- int i;
- for (i = 0; i < len; i += 3)
- {
- a1 = data[i];
- a2 = data[i + 1];
- a3 = data[i + 2];
-
- mOut.WriteByte(EncodingTable[(a1 >> 2) & 0x3f]);
- mOut.WriteByte(EncodingTable[((a1 << 4) | (a2 >> 4)) & 0x3f]);
- mOut.WriteByte(EncodingTable[((a2 << 2) | (a3 >> 6)) & 0x3f]);
- mOut.WriteByte(EncodingTable[a3 & 0x3f]);
- }
-
- string result = Strings.FromByteArray(mOut.ToArray());
- int resultLen = salt
- ? 22 // truncate padding
- : result.Length - 1;
-
- return result.Substring(0, resultLen);
- }
-
-
- /*
- * decodes the bcrypt base 64 encoded SaltString
- *
- * @param a 22 character Bcrypt base 64 encoded String
- * @return the 16 byte salt
- * @exception DataLengthException if the length
- * of parameter is not 22
- * @exception InvalidArgumentException if the parameter
- * contains a value other than from Bcrypts base 64 encoding table
- */
- private static byte[] DecodeSaltString(string saltString)
- {
- char[] saltChars = saltString.ToCharArray();
-
- MemoryStream mOut = new MemoryStream(16);
- byte b1, b2, b3, b4;
-
- if (saltChars.Length != 22)// bcrypt salt must be 22 (16 bytes)
- throw new DataLengthException("Invalid base64 salt length: " + saltChars.Length + " , 22 required.");
-
- // check string for invalid characters:
- for (int i = 0; i < saltChars.Length; i++)
- {
- int value = saltChars[i];
- if (value > 122 || value < 46 || (value > 57 && value < 65))
- throw new ArgumentException("Salt string contains invalid character: " + value, "saltString");
- }
-
- // Padding: add two '\u0000'
- char[] tmp = new char[22 + 2];
- Array.Copy(saltChars, 0, tmp, 0, saltChars.Length);
- saltChars = tmp;
-
- int len = saltChars.Length;
-
- for (int i = 0; i < len; i += 4)
- {
- b1 = DecodingTable[saltChars[i]];
- b2 = DecodingTable[saltChars[i + 1]];
- b3 = DecodingTable[saltChars[i + 2]];
- b4 = DecodingTable[saltChars[i + 3]];
-
- mOut.WriteByte((byte)((b1 << 2) | (b2 >> 4)));
- mOut.WriteByte((byte)((b2 << 4) | (b3 >> 2)));
- mOut.WriteByte((byte)((b3 << 6) | b4));
- }
-
- byte[] saltBytes = mOut.ToArray();
-
- // truncate:
- byte[] tmpSalt = new byte[16];
- Array.Copy(saltBytes, 0, tmpSalt, 0, tmpSalt.Length);
- saltBytes = tmpSalt;
-
- return saltBytes;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/OpenSSLPBEParametersGenerator.cs b/BCCrypto/src/crypto/generators/OpenSSLPBEParametersGenerator.cs
deleted file mode 100644
index 8da5d3a..0000000
--- a/BCCrypto/src/crypto/generators/OpenSSLPBEParametersGenerator.cs
+++ /dev/null
@@ -1,167 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * Generator for PBE derived keys and ivs as usd by OpenSSL.
- *
- * The scheme is a simple extension of PKCS 5 V2.0 Scheme 1 using MD5 with an
- * iteration count of 1.
- *
- */
- public class OpenSslPbeParametersGenerator
- : PbeParametersGenerator
- {
- private readonly IDigest digest = new MD5Digest();
-
- /**
- * Construct a OpenSSL Parameters generator.
- */
- public OpenSslPbeParametersGenerator()
- {
- }
-
- public override void Init(
- byte[] password,
- byte[] salt,
- int iterationCount)
- {
- // Ignore the provided iterationCount
- base.Init(password, salt, 1);
- }
-
- /**
- * Initialise - note the iteration count for this algorithm is fixed at 1.
- *
- * @param password password to use.
- * @param salt salt to use.
- */
- public virtual void Init(
- byte[] password,
- byte[] salt)
- {
- base.Init(password, salt, 1);
- }
-
- /**
- * the derived key function, the ith hash of the password and the salt.
- */
- private byte[] GenerateDerivedKey(
- int bytesNeeded)
- {
- byte[] buf = new byte[digest.GetDigestSize()];
- byte[] key = new byte[bytesNeeded];
- int offset = 0;
-
- for (;;)
- {
- digest.BlockUpdate(mPassword, 0, mPassword.Length);
- digest.BlockUpdate(mSalt, 0, mSalt.Length);
-
- digest.DoFinal(buf, 0);
-
- int len = (bytesNeeded > buf.Length) ? buf.Length : bytesNeeded;
- Array.Copy(buf, 0, key, offset, len);
- offset += len;
-
- // check if we need any more
- bytesNeeded -= len;
- if (bytesNeeded == 0)
- {
- break;
- }
-
- // do another round
- digest.Reset();
- digest.BlockUpdate(buf, 0, buf.Length);
- }
-
- return key;
- }
-
- /**
- * Generate a key parameter derived from the password, salt, and iteration
- * count we are currently initialised with.
- *
- * @param keySize the size of the key we want (in bits)
- * @return a KeyParameter object.
- * @exception ArgumentException if the key length larger than the base hash size.
- */
- [Obsolete("Use version with 'algorithm' parameter")]
- public override ICipherParameters GenerateDerivedParameters(
- int keySize)
- {
- return GenerateDerivedMacParameters(keySize);
- }
-
- public override ICipherParameters GenerateDerivedParameters(
- string algorithm,
- int keySize)
- {
- keySize /= 8;
-
- byte[] dKey = GenerateDerivedKey(keySize);
-
- return ParameterUtilities.CreateKeyParameter(algorithm, dKey, 0, keySize);
- }
-
- /**
- * Generate a key with initialisation vector parameter derived from
- * the password, salt, and iteration count we are currently initialised
- * with.
- *
- * @param keySize the size of the key we want (in bits)
- * @param ivSize the size of the iv we want (in bits)
- * @return a ParametersWithIV object.
- * @exception ArgumentException if keySize + ivSize is larger than the base hash size.
- */
- [Obsolete("Use version with 'algorithm' parameter")]
- public override ICipherParameters GenerateDerivedParameters(
- int keySize,
- int ivSize)
- {
- keySize = keySize / 8;
- ivSize = ivSize / 8;
-
- byte[] dKey = GenerateDerivedKey(keySize + ivSize);
-
- return new ParametersWithIV(new KeyParameter(dKey, 0, keySize), dKey, keySize, ivSize);
- }
-
- public override ICipherParameters GenerateDerivedParameters(
- string algorithm,
- int keySize,
- int ivSize)
- {
- keySize /= 8;
- ivSize /= 8;
-
- byte[] dKey = GenerateDerivedKey(keySize + ivSize);
- KeyParameter key = ParameterUtilities.CreateKeyParameter(algorithm, dKey, 0, keySize);
-
- return new ParametersWithIV(key, dKey, keySize, ivSize);
- }
-
- /**
- * Generate a key parameter for use with a MAC derived from the password,
- * salt, and iteration count we are currently initialised with.
- *
- * @param keySize the size of the key we want (in bits)
- * @return a KeyParameter object.
- * @exception ArgumentException if the key length larger than the base hash size.
- */
- public override ICipherParameters GenerateDerivedMacParameters(
- int keySize)
- {
- keySize = keySize / 8;
-
- byte[] dKey = GenerateDerivedKey(keySize);
-
- return new KeyParameter(dKey, 0, keySize);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/Pkcs12ParametersGenerator.cs b/BCCrypto/src/crypto/generators/Pkcs12ParametersGenerator.cs
deleted file mode 100644
index 85543a0..0000000
--- a/BCCrypto/src/crypto/generators/Pkcs12ParametersGenerator.cs
+++ /dev/null
@@ -1,243 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * Generator for Pbe derived keys and ivs as defined by Pkcs 12 V1.0.
- *
- * The document this implementation is based on can be found at
- *
- * RSA's Pkcs12 Page
- *
- */
- public class Pkcs12ParametersGenerator
- : PbeParametersGenerator
- {
- public const int KeyMaterial = 1;
- public const int IVMaterial = 2;
- public const int MacMaterial = 3;
-
- private readonly IDigest digest;
-
- private readonly int u;
- private readonly int v;
-
- /**
- * Construct a Pkcs 12 Parameters generator.
- *
- * @param digest the digest to be used as the source of derived keys.
- * @exception ArgumentException if an unknown digest is passed in.
- */
- public Pkcs12ParametersGenerator(
- IDigest digest)
- {
- this.digest = digest;
-
- u = digest.GetDigestSize();
- v = digest.GetByteLength();
- }
-
- /**
- * add a + b + 1, returning the result in a. The a value is treated
- * as a BigInteger of length (b.Length * 8) bits. The result is
- * modulo 2^b.Length in case of overflow.
- */
- private void Adjust(
- byte[] a,
- int aOff,
- byte[] b)
- {
- int x = (b[b.Length - 1] & 0xff) + (a[aOff + b.Length - 1] & 0xff) + 1;
-
- a[aOff + b.Length - 1] = (byte)x;
- x = (int) ((uint) x >> 8);
-
- for (int i = b.Length - 2; i >= 0; i--)
- {
- x += (b[i] & 0xff) + (a[aOff + i] & 0xff);
- a[aOff + i] = (byte)x;
- x = (int) ((uint) x >> 8);
- }
- }
-
- /**
- * generation of a derived key ala Pkcs12 V1.0.
- */
- private byte[] GenerateDerivedKey(
- int idByte,
- int n)
- {
- byte[] D = new byte[v];
- byte[] dKey = new byte[n];
-
- for (int i = 0; i != D.Length; i++)
- {
- D[i] = (byte)idByte;
- }
-
- byte[] S;
-
- if ((mSalt != null) && (mSalt.Length != 0))
- {
- S = new byte[v * ((mSalt.Length + v - 1) / v)];
-
- for (int i = 0; i != S.Length; i++)
- {
- S[i] = mSalt[i % mSalt.Length];
- }
- }
- else
- {
- S = new byte[0];
- }
-
- byte[] P;
-
- if ((mPassword != null) && (mPassword.Length != 0))
- {
- P = new byte[v * ((mPassword.Length + v - 1) / v)];
-
- for (int i = 0; i != P.Length; i++)
- {
- P[i] = mPassword[i % mPassword.Length];
- }
- }
- else
- {
- P = new byte[0];
- }
-
- byte[] I = new byte[S.Length + P.Length];
-
- Array.Copy(S, 0, I, 0, S.Length);
- Array.Copy(P, 0, I, S.Length, P.Length);
-
- byte[] B = new byte[v];
- int c = (n + u - 1) / u;
- byte[] A = new byte[u];
-
- for (int i = 1; i <= c; i++)
- {
- digest.BlockUpdate(D, 0, D.Length);
- digest.BlockUpdate(I, 0, I.Length);
- digest.DoFinal(A, 0);
-
- for (int j = 1; j != mIterationCount; j++)
- {
- digest.BlockUpdate(A, 0, A.Length);
- digest.DoFinal(A, 0);
- }
-
- for (int j = 0; j != B.Length; j++)
- {
- B[j] = A[j % A.Length];
- }
-
- for (int j = 0; j != I.Length / v; j++)
- {
- Adjust(I, j * v, B);
- }
-
- if (i == c)
- {
- Array.Copy(A, 0, dKey, (i - 1) * u, dKey.Length - ((i - 1) * u));
- }
- else
- {
- Array.Copy(A, 0, dKey, (i - 1) * u, A.Length);
- }
- }
-
- return dKey;
- }
-
- /**
- * Generate a key parameter derived from the password, salt, and iteration
- * count we are currently initialised with.
- *
- * @param keySize the size of the key we want (in bits)
- * @return a KeyParameter object.
- */
- public override ICipherParameters GenerateDerivedParameters(
- int keySize)
- {
- keySize /= 8;
-
- byte[] dKey = GenerateDerivedKey(KeyMaterial, keySize);
-
- return new KeyParameter(dKey, 0, keySize);
- }
-
- public override ICipherParameters GenerateDerivedParameters(
- string algorithm,
- int keySize)
- {
- keySize /= 8;
-
- byte[] dKey = GenerateDerivedKey(KeyMaterial, keySize);
-
- return ParameterUtilities.CreateKeyParameter(algorithm, dKey, 0, keySize);
- }
-
- /**
- * Generate a key with initialisation vector parameter derived from
- * the password, salt, and iteration count we are currently initialised
- * with.
- *
- * @param keySize the size of the key we want (in bits)
- * @param ivSize the size of the iv we want (in bits)
- * @return a ParametersWithIV object.
- */
- public override ICipherParameters GenerateDerivedParameters(
- int keySize,
- int ivSize)
- {
- keySize /= 8;
- ivSize /= 8;
-
- byte[] dKey = GenerateDerivedKey(KeyMaterial, keySize);
-
- byte[] iv = GenerateDerivedKey(IVMaterial, ivSize);
-
- return new ParametersWithIV(new KeyParameter(dKey, 0, keySize), iv, 0, ivSize);
- }
-
- public override ICipherParameters GenerateDerivedParameters(
- string algorithm,
- int keySize,
- int ivSize)
- {
- keySize /= 8;
- ivSize /= 8;
-
- byte[] dKey = GenerateDerivedKey(KeyMaterial, keySize);
- KeyParameter key = ParameterUtilities.CreateKeyParameter(algorithm, dKey, 0, keySize);
-
- byte[] iv = GenerateDerivedKey(IVMaterial, ivSize);
-
- return new ParametersWithIV(key, iv, 0, ivSize);
- }
-
- /**
- * Generate a key parameter for use with a MAC derived from the password,
- * salt, and iteration count we are currently initialised with.
- *
- * @param keySize the size of the key we want (in bits)
- * @return a KeyParameter object.
- */
- public override ICipherParameters GenerateDerivedMacParameters(
- int keySize)
- {
- keySize /= 8;
-
- byte[] dKey = GenerateDerivedKey(MacMaterial, keySize);
-
- return new KeyParameter(dKey, 0, keySize);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/Pkcs5S1ParametersGenerator.cs b/BCCrypto/src/crypto/generators/Pkcs5S1ParametersGenerator.cs
deleted file mode 100644
index 9b39a5f..0000000
--- a/BCCrypto/src/crypto/generators/Pkcs5S1ParametersGenerator.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * Generator for Pbe derived keys and ivs as defined by Pkcs 5 V2.0 Scheme 1.
- * Note this generator is limited to the size of the hash produced by the
- * digest used to drive it.
- *
- * The document this implementation is based on can be found at
- *
- * RSA's Pkcs5 Page
- *
- */
- public class Pkcs5S1ParametersGenerator
- : PbeParametersGenerator
- {
- private readonly IDigest digest;
-
- /**
- * Construct a Pkcs 5 Scheme 1 Parameters generator.
- *
- * @param digest the digest to be used as the source of derived keys.
- */
- public Pkcs5S1ParametersGenerator(
- IDigest digest)
- {
- this.digest = digest;
- }
-
- /**
- * the derived key function, the ith hash of the mPassword and the mSalt.
- */
- private byte[] GenerateDerivedKey()
- {
- byte[] digestBytes = new byte[digest.GetDigestSize()];
-
- digest.BlockUpdate(mPassword, 0, mPassword.Length);
- digest.BlockUpdate(mSalt, 0, mSalt.Length);
-
- digest.DoFinal(digestBytes, 0);
- for (int i = 1; i < mIterationCount; i++)
- {
- digest.BlockUpdate(digestBytes, 0, digestBytes.Length);
- digest.DoFinal(digestBytes, 0);
- }
-
- return digestBytes;
- }
-
- /**
- * Generate a key parameter derived from the mPassword, mSalt, and iteration
- * count we are currently initialised with.
- *
- * @param keySize the size of the key we want (in bits)
- * @return a KeyParameter object.
- * @exception ArgumentException if the key length larger than the base hash size.
- */
- public override ICipherParameters GenerateDerivedParameters(
- int keySize)
- {
- return GenerateDerivedMacParameters(keySize);
- }
-
- public override ICipherParameters GenerateDerivedParameters(
- string algorithm,
- int keySize)
- {
- keySize /= 8;
-
- if (keySize > digest.GetDigestSize())
- {
- throw new ArgumentException(
- "Can't Generate a derived key " + keySize + " bytes long.");
- }
-
- byte[] dKey = GenerateDerivedKey();
-
- return ParameterUtilities.CreateKeyParameter(algorithm, dKey, 0, keySize);
- }
-
- /**
- * Generate a key with initialisation vector parameter derived from
- * the mPassword, mSalt, and iteration count we are currently initialised
- * with.
- *
- * @param keySize the size of the key we want (in bits)
- * @param ivSize the size of the iv we want (in bits)
- * @return a ParametersWithIV object.
- * @exception ArgumentException if keySize + ivSize is larger than the base hash size.
- */
- public override ICipherParameters GenerateDerivedParameters(
- int keySize,
- int ivSize)
- {
- keySize /= 8;
- ivSize /= 8;
-
- if ((keySize + ivSize) > digest.GetDigestSize())
- {
- throw new ArgumentException(
- "Can't Generate a derived key " + (keySize + ivSize) + " bytes long.");
- }
-
- byte[] dKey = GenerateDerivedKey();
-
- return new ParametersWithIV(new KeyParameter(dKey, 0, keySize), dKey, keySize, ivSize);
- }
-
- public override ICipherParameters GenerateDerivedParameters(
- string algorithm,
- int keySize,
- int ivSize)
- {
- keySize /= 8;
- ivSize /= 8;
-
- if ((keySize + ivSize) > digest.GetDigestSize())
- {
- throw new ArgumentException(
- "Can't Generate a derived key " + (keySize + ivSize) + " bytes long.");
- }
-
- byte[] dKey = GenerateDerivedKey();
- KeyParameter key = ParameterUtilities.CreateKeyParameter(algorithm, dKey, 0, keySize);
-
- return new ParametersWithIV(key, dKey, keySize, ivSize);
- }
-
- /**
- * Generate a key parameter for use with a MAC derived from the mPassword,
- * mSalt, and iteration count we are currently initialised with.
- *
- * @param keySize the size of the key we want (in bits)
- * @return a KeyParameter object.
- * @exception ArgumentException if the key length larger than the base hash size.
- */
- public override ICipherParameters GenerateDerivedMacParameters(
- int keySize)
- {
- keySize /= 8;
-
- if (keySize > digest.GetDigestSize())
- {
- throw new ArgumentException(
- "Can't Generate a derived key " + keySize + " bytes long.");
- }
-
- byte[] dKey = GenerateDerivedKey();
-
- return new KeyParameter(dKey, 0, keySize);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/Pkcs5S2ParametersGenerator.cs b/BCCrypto/src/crypto/generators/Pkcs5S2ParametersGenerator.cs
deleted file mode 100644
index 0b0caa0..0000000
--- a/BCCrypto/src/crypto/generators/Pkcs5S2ParametersGenerator.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * Generator for Pbe derived keys and ivs as defined by Pkcs 5 V2.0 Scheme 2.
- * This generator uses a SHA-1 HMac as the calculation function.
- *
- * The document this implementation is based on can be found at
- *
- * RSA's Pkcs5 Page
- */
- public class Pkcs5S2ParametersGenerator
- : PbeParametersGenerator
- {
- private readonly IMac hMac;
- private readonly byte[] state;
-
- /**
- * construct a Pkcs5 Scheme 2 Parameters generator.
- */
- public Pkcs5S2ParametersGenerator()
- : this(new Sha1Digest())
- {
- }
-
- public Pkcs5S2ParametersGenerator(IDigest digest)
- {
- this.hMac = new HMac(digest);
- this.state = new byte[hMac.GetMacSize()];
- }
-
- private void F(
- byte[] S,
- int c,
- byte[] iBuf,
- byte[] outBytes,
- int outOff)
- {
- if (c == 0)
- throw new ArgumentException("iteration count must be at least 1.");
-
- if (S != null)
- {
- hMac.BlockUpdate(S, 0, S.Length);
- }
-
- hMac.BlockUpdate(iBuf, 0, iBuf.Length);
- hMac.DoFinal(state, 0);
-
- Array.Copy(state, 0, outBytes, outOff, state.Length);
-
- for (int count = 1; count < c; ++count)
- {
- hMac.BlockUpdate(state, 0, state.Length);
- hMac.DoFinal(state, 0);
-
- for (int j = 0; j < state.Length; ++j)
- {
- outBytes[outOff + j] ^= state[j];
- }
- }
- }
-
- private byte[] GenerateDerivedKey(
- int dkLen)
- {
- int hLen = hMac.GetMacSize();
- int l = (dkLen + hLen - 1) / hLen;
- byte[] iBuf = new byte[4];
- byte[] outBytes = new byte[l * hLen];
- int outPos = 0;
-
- ICipherParameters param = new KeyParameter(mPassword);
-
- hMac.Init(param);
-
- for (int i = 1; i <= l; i++)
- {
- // Increment the value in 'iBuf'
- int pos = 3;
- while (++iBuf[pos] == 0)
- {
- --pos;
- }
-
- F(mSalt, mIterationCount, iBuf, outBytes, outPos);
- outPos += hLen;
- }
-
- return outBytes;
- }
-
- /**
- * Generate a key parameter derived from the password, salt, and iteration
- * count we are currently initialised with.
- *
- * @param keySize the size of the key we want (in bits)
- * @return a KeyParameter object.
- */
- public override ICipherParameters GenerateDerivedParameters(
- int keySize)
- {
- return GenerateDerivedMacParameters(keySize);
- }
-
- public override ICipherParameters GenerateDerivedParameters(
- string algorithm,
- int keySize)
- {
- keySize /= 8;
-
- byte[] dKey = GenerateDerivedKey(keySize);
-
- return ParameterUtilities.CreateKeyParameter(algorithm, dKey, 0, keySize);
- }
-
- /**
- * Generate a key with initialisation vector parameter derived from
- * the password, salt, and iteration count we are currently initialised
- * with.
- *
- * @param keySize the size of the key we want (in bits)
- * @param ivSize the size of the iv we want (in bits)
- * @return a ParametersWithIV object.
- */
- public override ICipherParameters GenerateDerivedParameters(
- int keySize,
- int ivSize)
- {
- keySize /= 8;
- ivSize /= 8;
-
- byte[] dKey = GenerateDerivedKey(keySize + ivSize);
-
- return new ParametersWithIV(new KeyParameter(dKey, 0, keySize), dKey, keySize, ivSize);
- }
-
- public override ICipherParameters GenerateDerivedParameters(
- string algorithm,
- int keySize,
- int ivSize)
- {
- keySize /= 8;
- ivSize /= 8;
-
- byte[] dKey = GenerateDerivedKey(keySize + ivSize);
- KeyParameter key = ParameterUtilities.CreateKeyParameter(algorithm, dKey, 0, keySize);
-
- return new ParametersWithIV(key, dKey, keySize, ivSize);
- }
-
- /**
- * Generate a key parameter for use with a MAC derived from the password,
- * salt, and iteration count we are currently initialised with.
- *
- * @param keySize the size of the key we want (in bits)
- * @return a KeyParameter object.
- */
- public override ICipherParameters GenerateDerivedMacParameters(
- int keySize)
- {
- keySize /= 8;
-
- byte[] dKey = GenerateDerivedKey(keySize);
-
- return new KeyParameter(dKey, 0, keySize);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/Poly1305KeyGenerator.cs b/BCCrypto/src/crypto/generators/Poly1305KeyGenerator.cs
deleted file mode 100644
index cdb24bf..0000000
--- a/BCCrypto/src/crypto/generators/Poly1305KeyGenerator.cs
+++ /dev/null
@@ -1,116 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- ///
- /// Generates keys for the Poly1305 MAC.
- ///
- ///
- /// Poly1305 keys are 256 bit keys consisting of a 128 bit secret key used for the underlying block
- /// cipher followed by a 128 bit {@code r} value used for the polynomial portion of the Mac.
- /// The {@code r} value has a specific format with some bits required to be cleared, resulting in an
- /// effective 106 bit key.
- /// A separately generated 256 bit key can be modified to fit the Poly1305 key format by using the
- /// {@link #clamp(byte[])} method to clear the required bits.
- ///
- ///
- public class Poly1305KeyGenerator
- : CipherKeyGenerator
- {
- private const byte R_MASK_LOW_2 = (byte)0xFC;
- private const byte R_MASK_HIGH_4 = (byte)0x0F;
-
- ///
- /// Initialises the key generator.
- ///
- ///
- /// Poly1305 keys are always 256 bits, so the key length in the provided parameters is ignored.
- ///
- protected override void engineInit(KeyGenerationParameters param)
- {
- // Poly1305 keys are always 256 bits
- this.random = param.Random;
- this.strength = 32;
- }
-
- ///
- /// Generates a 256 bit key in the format required for Poly1305 - e.g.
- /// k[0] ... k[15], r[0] ... r[15] with the required bits in r cleared
- /// as per .
- ///
- protected override byte[] engineGenerateKey()
- {
- byte[] key = base.engineGenerateKey();
- Clamp(key);
- return key;
- }
-
- ///
- /// Modifies an existing 32 byte key value to comply with the requirements of the Poly1305 key by
- /// clearing required bits in the r (second 16 bytes) portion of the key.
- /// Specifically:
- ///
- /// r[3], r[7], r[11], r[15] have top four bits clear (i.e., are {0, 1, . . . , 15})
- /// r[4], r[8], r[12] have bottom two bits clear (i.e., are in {0, 4, 8, . . . , 252})
- ///
- ///
- /// a 32 byte key value k[0] ... k[15], r[0] ... r[15]
- public static void Clamp(byte[] key)
- {
- /*
- * Key is k[0] ... k[15], r[0] ... r[15] as per poly1305_aes_clamp in ref impl.
- */
- if (key.Length != 32)
- throw new ArgumentException("Poly1305 key must be 256 bits.");
-
- /*
- * r[3], r[7], r[11], r[15] have top four bits clear (i.e., are {0, 1, . . . , 15})
- */
- key[3] &= R_MASK_HIGH_4;
- key[7] &= R_MASK_HIGH_4;
- key[11] &= R_MASK_HIGH_4;
- key[15] &= R_MASK_HIGH_4;
-
- /*
- * r[4], r[8], r[12] have bottom two bits clear (i.e., are in {0, 4, 8, . . . , 252}).
- */
- key[4] &= R_MASK_LOW_2;
- key[8] &= R_MASK_LOW_2;
- key[12] &= R_MASK_LOW_2;
- }
-
- ///
- /// Checks a 32 byte key for compliance with the Poly1305 key requirements, e.g.
- /// k[0] ... k[15], r[0] ... r[15] with the required bits in r cleared
- /// as per .
- ///
- /// Key.
- /// if the key is of the wrong length, or has invalid bits set
- /// in the r portion of the key.
- public static void CheckKey(byte[] key)
- {
- if (key.Length != 32)
- throw new ArgumentException("Poly1305 key must be 256 bits.");
-
- CheckMask(key[3], R_MASK_HIGH_4);
- CheckMask(key[7], R_MASK_HIGH_4);
- CheckMask(key[11], R_MASK_HIGH_4);
- CheckMask(key[15], R_MASK_HIGH_4);
-
- CheckMask(key[4], R_MASK_LOW_2);
- CheckMask(key[8], R_MASK_LOW_2);
- CheckMask(key[12], R_MASK_LOW_2);
- }
-
- private static void CheckMask(byte b, byte mask)
- {
- if ((b & (~mask)) != 0)
- throw new ArgumentException("Invalid format for r portion of Poly1305 key.");
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/crypto/generators/RSABlindingFactorGenerator.cs b/BCCrypto/src/crypto/generators/RSABlindingFactorGenerator.cs
deleted file mode 100644
index e2f63fa..0000000
--- a/BCCrypto/src/crypto/generators/RSABlindingFactorGenerator.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * Generate a random factor suitable for use with RSA blind signatures
- * as outlined in Chaum's blinding and unblinding as outlined in
- * "Handbook of Applied Cryptography", page 475.
- */
- public class RsaBlindingFactorGenerator
- {
- private RsaKeyParameters key;
- private SecureRandom random;
-
- /**
- * Initialise the factor generator
- *
- * @param param the necessary RSA key parameters.
- */
- public void Init(
- ICipherParameters param)
- {
- if (param is ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom)param;
-
- key = (RsaKeyParameters)rParam.Parameters;
- random = rParam.Random;
- }
- else
- {
- key = (RsaKeyParameters)param;
- random = new SecureRandom();
- }
-
- if (key.IsPrivate)
- throw new ArgumentException("generator requires RSA public key");
- }
-
- /**
- * Generate a suitable blind factor for the public key the generator was initialised with.
- *
- * @return a random blind factor
- */
- public BigInteger GenerateBlindingFactor()
- {
- if (key == null)
- throw new InvalidOperationException("generator not initialised");
-
- BigInteger m = key.Modulus;
- int length = m.BitLength - 1; // must be less than m.BitLength
- BigInteger factor;
- BigInteger gcd;
-
- do
- {
- factor = new BigInteger(length, random);
- gcd = factor.Gcd(m);
- }
- while (factor.SignValue == 0 || factor.Equals(BigInteger.One) || !gcd.Equals(BigInteger.One));
-
- return factor;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/RsaKeyPairGenerator.cs b/BCCrypto/src/crypto/generators/RsaKeyPairGenerator.cs
deleted file mode 100644
index 4499765..0000000
--- a/BCCrypto/src/crypto/generators/RsaKeyPairGenerator.cs
+++ /dev/null
@@ -1,163 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- /**
- * an RSA key pair generator.
- */
- public class RsaKeyPairGenerator
- : IAsymmetricCipherKeyPairGenerator
- {
- private static readonly int[] SPECIAL_E_VALUES = new int[]{ 3, 5, 17, 257, 65537 };
- private static readonly int SPECIAL_E_HIGHEST = SPECIAL_E_VALUES[SPECIAL_E_VALUES.Length - 1];
- private static readonly int SPECIAL_E_BITS = BigInteger.ValueOf(SPECIAL_E_HIGHEST).BitLength;
-
- protected static readonly BigInteger One = BigInteger.One;
- protected static readonly BigInteger DefaultPublicExponent = BigInteger.ValueOf(0x10001);
- protected const int DefaultTests = 100;
-
- protected RsaKeyGenerationParameters parameters;
-
- public virtual void Init(
- KeyGenerationParameters parameters)
- {
- if (parameters is RsaKeyGenerationParameters)
- {
- this.parameters = (RsaKeyGenerationParameters)parameters;
- }
- else
- {
- this.parameters = new RsaKeyGenerationParameters(
- DefaultPublicExponent, parameters.Random, parameters.Strength, DefaultTests);
- }
- }
-
- public virtual AsymmetricCipherKeyPair GenerateKeyPair()
- {
- for (;;)
- {
- //
- // p and q values should have a length of half the strength in bits
- //
- int strength = parameters.Strength;
- int pBitlength = (strength + 1) / 2;
- int qBitlength = strength - pBitlength;
- int mindiffbits = strength / 3;
- int minWeight = strength >> 2;
-
- BigInteger e = parameters.PublicExponent;
-
- // TODO Consider generating safe primes for p, q (see DHParametersHelper.generateSafePrimes)
- // (then p-1 and q-1 will not consist of only small factors - see "Pollard's algorithm")
-
- BigInteger p = ChooseRandomPrime(pBitlength, e);
- BigInteger q, n;
-
- //
- // generate a modulus of the required length
- //
- for (;;)
- {
- q = ChooseRandomPrime(qBitlength, e);
-
- // p and q should not be too close together (or equal!)
- BigInteger diff = q.Subtract(p).Abs();
- if (diff.BitLength < mindiffbits)
- continue;
-
- //
- // calculate the modulus
- //
- n = p.Multiply(q);
-
- if (n.BitLength != strength)
- {
- //
- // if we get here our primes aren't big enough, make the largest
- // of the two p and try again
- //
- p = p.Max(q);
- continue;
- }
-
- /*
- * Require a minimum weight of the NAF representation, since low-weight composites may
- * be weak against a version of the number-field-sieve for factoring.
- *
- * See "The number field sieve for integers of low weight", Oliver Schirokauer.
- */
- if (WNafUtilities.GetNafWeight(n) < minWeight)
- {
- p = ChooseRandomPrime(pBitlength, e);
- continue;
- }
-
- break;
- }
-
- if (p.CompareTo(q) < 0)
- {
- BigInteger tmp = p;
- p = q;
- q = tmp;
- }
-
- BigInteger pSub1 = p.Subtract(One);
- BigInteger qSub1 = q.Subtract(One);
- //BigInteger phi = pSub1.Multiply(qSub1);
- BigInteger gcd = pSub1.Gcd(qSub1);
- BigInteger lcm = pSub1.Divide(gcd).Multiply(qSub1);
-
- //
- // calculate the private exponent
- //
- BigInteger d = e.ModInverse(lcm);
-
- if (d.BitLength <= qBitlength)
- continue;
-
- //
- // calculate the CRT factors
- //
- BigInteger dP = d.Remainder(pSub1);
- BigInteger dQ = d.Remainder(qSub1);
- BigInteger qInv = q.ModInverse(p);
-
- return new AsymmetricCipherKeyPair(
- new RsaKeyParameters(false, n, e),
- new RsaPrivateCrtKeyParameters(n, e, d, p, q, dP, dQ, qInv));
- }
- }
-
- /// Choose a random prime value for use with RSA
- /// the bit-length of the returned prime
- /// the RSA public exponent
- /// a prime p, with (p-1) relatively prime to e
- protected virtual BigInteger ChooseRandomPrime(int bitlength, BigInteger e)
- {
- bool eIsKnownOddPrime = (e.BitLength <= SPECIAL_E_BITS) && Arrays.Contains(SPECIAL_E_VALUES, e.IntValue);
-
- for (;;)
- {
- BigInteger p = new BigInteger(bitlength, 1, parameters.Random);
-
- if (p.Mod(e).Equals(One))
- continue;
-
- if (!p.IsProbablePrime(parameters.Certainty, true))
- continue;
-
- if (!eIsKnownOddPrime && !e.Gcd(p.Subtract(One)).Equals(One))
- continue;
-
- return p;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/generators/SCrypt.cs b/BCCrypto/src/crypto/generators/SCrypt.cs
deleted file mode 100644
index efa74d7..0000000
--- a/BCCrypto/src/crypto/generators/SCrypt.cs
+++ /dev/null
@@ -1,140 +0,0 @@
-using System;
-using System.Threading;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Generators
-{
- public class SCrypt
- {
- // TODO Validate arguments
- public static byte[] Generate(byte[] P, byte[] S, int N, int r, int p, int dkLen)
- {
- return MFcrypt(P, S, N, r, p, dkLen);
- }
-
- private static byte[] MFcrypt(byte[] P, byte[] S, int N, int r, int p, int dkLen)
- {
- int MFLenBytes = r * 128;
- byte[] bytes = SingleIterationPBKDF2(P, S, p * MFLenBytes);
-
- uint[] B = null;
-
- try
- {
- int BLen = bytes.Length >> 2;
- B = new uint[BLen];
-
- Pack.LE_To_UInt32(bytes, 0, B);
-
- int MFLenWords = MFLenBytes >> 2;
- for (int BOff = 0; BOff < BLen; BOff += MFLenWords)
- {
- // TODO These can be done in parallel threads
- SMix(B, BOff, N, r);
- }
-
- Pack.UInt32_To_LE(B, bytes, 0);
-
- return SingleIterationPBKDF2(P, bytes, dkLen);
- }
- finally
- {
- ClearAll(bytes, B);
- }
- }
-
- private static byte[] SingleIterationPBKDF2(byte[] P, byte[] S, int dkLen)
- {
- PbeParametersGenerator pGen = new Pkcs5S2ParametersGenerator(new Sha256Digest());
- pGen.Init(P, S, 1);
- KeyParameter key = (KeyParameter)pGen.GenerateDerivedMacParameters(dkLen * 8);
- return key.GetKey();
- }
-
- private static void SMix(uint[] B, int BOff, int N, int r)
- {
- int BCount = r * 32;
-
- uint[] blockX1 = new uint[16];
- uint[] blockX2 = new uint[16];
- uint[] blockY = new uint[BCount];
-
- uint[] X = new uint[BCount];
- uint[][] V = new uint[N][];
-
- try
- {
- Array.Copy(B, BOff, X, 0, BCount);
-
- for (int i = 0; i < N; ++i)
- {
- V[i] = (uint[])X.Clone();
- BlockMix(X, blockX1, blockX2, blockY, r);
- }
-
- uint mask = (uint)N - 1;
- for (int i = 0; i < N; ++i)
- {
- uint j = X[BCount - 16] & mask;
- Xor(X, V[j], 0, X);
- BlockMix(X, blockX1, blockX2, blockY, r);
- }
-
- Array.Copy(X, 0, B, BOff, BCount);
- }
- finally
- {
- ClearAll(V);
- ClearAll(X, blockX1, blockX2, blockY);
- }
- }
-
- private static void BlockMix(uint[] B, uint[] X1, uint[] X2, uint[] Y, int r)
- {
- Array.Copy(B, B.Length - 16, X1, 0, 16);
-
- int BOff = 0, YOff = 0, halfLen = B.Length >> 1;
-
- for (int i = 2 * r; i > 0; --i)
- {
- Xor(X1, B, BOff, X2);
-
- Salsa20Engine.SalsaCore(8, X2, X1);
- Array.Copy(X1, 0, Y, YOff, 16);
-
- YOff = halfLen + BOff - YOff;
- BOff += 16;
- }
-
- Array.Copy(Y, 0, B, 0, Y.Length);
- }
-
- private static void Xor(uint[] a, uint[] b, int bOff, uint[] output)
- {
- for (int i = output.Length - 1; i >= 0; --i)
- {
- output[i] = a[i] ^ b[bOff + i];
- }
- }
-
- private static void Clear(Array array)
- {
- if (array != null)
- {
- Array.Clear(array, 0, array.Length);
- }
- }
-
- private static void ClearAll(params Array[] arrays)
- {
- foreach (Array array in arrays)
- {
- Clear(array);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/io/CipherStream.cs b/BCCrypto/src/crypto/io/CipherStream.cs
deleted file mode 100644
index b5e6830..0000000
--- a/BCCrypto/src/crypto/io/CipherStream.cs
+++ /dev/null
@@ -1,252 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.IO
-{
- public class CipherStream
- : Stream
- {
- internal Stream stream;
- internal IBufferedCipher inCipher, outCipher;
- private byte[] mInBuf;
- private int mInPos;
- private bool inStreamEnded;
-
- public CipherStream(
- Stream stream,
- IBufferedCipher readCipher,
- IBufferedCipher writeCipher)
- {
- this.stream = stream;
-
- if (readCipher != null)
- {
- this.inCipher = readCipher;
- mInBuf = null;
- }
-
- if (writeCipher != null)
- {
- this.outCipher = writeCipher;
- }
- }
-
- public IBufferedCipher ReadCipher
- {
- get { return inCipher; }
- }
-
- public IBufferedCipher WriteCipher
- {
- get { return outCipher; }
- }
-
- public override int ReadByte()
- {
- if (inCipher == null)
- return stream.ReadByte();
-
- if (mInBuf == null || mInPos >= mInBuf.Length)
- {
- if (!FillInBuf())
- return -1;
- }
-
- return mInBuf[mInPos++];
- }
-
- public override int Read(
- byte[] buffer,
- int offset,
- int count)
- {
- if (inCipher == null)
- return stream.Read(buffer, offset, count);
-
- int num = 0;
- while (num < count)
- {
- if (mInBuf == null || mInPos >= mInBuf.Length)
- {
- if (!FillInBuf())
- break;
- }
-
- int numToCopy = System.Math.Min(count - num, mInBuf.Length - mInPos);
- Array.Copy(mInBuf, mInPos, buffer, offset + num, numToCopy);
- mInPos += numToCopy;
- num += numToCopy;
- }
-
- return num;
- }
-
- private bool FillInBuf()
- {
- if (inStreamEnded)
- return false;
-
- mInPos = 0;
-
- do
- {
- mInBuf = ReadAndProcessBlock();
- }
- while (!inStreamEnded && mInBuf == null);
-
- return mInBuf != null;
- }
-
- private byte[] ReadAndProcessBlock()
- {
- int blockSize = inCipher.GetBlockSize();
- int readSize = (blockSize == 0) ? 256 : blockSize;
-
- byte[] block = new byte[readSize];
- int numRead = 0;
- do
- {
- int count = stream.Read(block, numRead, block.Length - numRead);
- if (count < 1)
- {
- inStreamEnded = true;
- break;
- }
- numRead += count;
- }
- while (numRead < block.Length);
-
- Debug.Assert(inStreamEnded || numRead == block.Length);
-
- byte[] bytes = inStreamEnded
- ? inCipher.DoFinal(block, 0, numRead)
- : inCipher.ProcessBytes(block);
-
- if (bytes != null && bytes.Length == 0)
- {
- bytes = null;
- }
-
- return bytes;
- }
-
- public override void Write(
- byte[] buffer,
- int offset,
- int count)
- {
- Debug.Assert(buffer != null);
- Debug.Assert(0 <= offset && offset <= buffer.Length);
- Debug.Assert(count >= 0);
-
- int end = offset + count;
-
- Debug.Assert(0 <= end && end <= buffer.Length);
-
- if (outCipher == null)
- {
- stream.Write(buffer, offset, count);
- return;
- }
-
- byte[] data = outCipher.ProcessBytes(buffer, offset, count);
- if (data != null)
- {
- stream.Write(data, 0, data.Length);
- }
- }
-
- public override void WriteByte(
- byte b)
- {
- if (outCipher == null)
- {
- stream.WriteByte(b);
- return;
- }
-
- byte[] data = outCipher.ProcessByte(b);
- if (data != null)
- {
- stream.Write(data, 0, data.Length);
- }
- }
-
- public override bool CanRead
- {
- get { return stream.CanRead && (inCipher != null); }
- }
-
- public override bool CanWrite
- {
- get { return stream.CanWrite && (outCipher != null); }
- }
-
- public override bool CanSeek
- {
- get { return false; }
- }
-
- public sealed override long Length
- {
- get { throw new NotSupportedException(); }
- }
-
- public sealed override long Position
- {
- get { throw new NotSupportedException(); }
- set { throw new NotSupportedException(); }
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- if (outCipher != null)
- {
- byte[] data = outCipher.DoFinal();
- stream.Write(data, 0, data.Length);
- stream.Flush();
- }
- Platform.Dispose(stream);
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- if (outCipher != null)
- {
- byte[] data = outCipher.DoFinal();
- stream.Write(data, 0, data.Length);
- stream.Flush();
- }
- Platform.Dispose(stream);
- base.Close();
- }
-#endif
-
- public override void Flush()
- {
- // Note: outCipher.DoFinal is only called during Close()
- stream.Flush();
- }
-
- public sealed override long Seek(
- long offset,
- SeekOrigin origin)
- {
- throw new NotSupportedException();
- }
-
- public sealed override void SetLength(
- long length)
- {
- throw new NotSupportedException();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/io/DigestStream.cs b/BCCrypto/src/crypto/io/DigestStream.cs
deleted file mode 100644
index dce8757..0000000
--- a/BCCrypto/src/crypto/io/DigestStream.cs
+++ /dev/null
@@ -1,151 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.IO
-{
- public class DigestStream
- : Stream
- {
- protected readonly Stream stream;
- protected readonly IDigest inDigest;
- protected readonly IDigest outDigest;
-
- public DigestStream(
- Stream stream,
- IDigest readDigest,
- IDigest writeDigest)
- {
- this.stream = stream;
- this.inDigest = readDigest;
- this.outDigest = writeDigest;
- }
-
- public virtual IDigest ReadDigest()
- {
- return inDigest;
- }
-
- public virtual IDigest WriteDigest()
- {
- return outDigest;
- }
-
- public override int Read(
- byte[] buffer,
- int offset,
- int count)
- {
- int n = stream.Read(buffer, offset, count);
- if (inDigest != null)
- {
- if (n > 0)
- {
- inDigest.BlockUpdate(buffer, offset, n);
- }
- }
- return n;
- }
-
- public override int ReadByte()
- {
- int b = stream.ReadByte();
- if (inDigest != null)
- {
- if (b >= 0)
- {
- inDigest.Update((byte)b);
- }
- }
- return b;
- }
-
- public override void Write(
- byte[] buffer,
- int offset,
- int count)
- {
- if (outDigest != null)
- {
- if (count > 0)
- {
- outDigest.BlockUpdate(buffer, offset, count);
- }
- }
- stream.Write(buffer, offset, count);
- }
-
- public override void WriteByte(
- byte b)
- {
- if (outDigest != null)
- {
- outDigest.Update(b);
- }
- stream.WriteByte(b);
- }
-
- public override bool CanRead
- {
- get { return stream.CanRead; }
- }
-
- public override bool CanWrite
- {
- get { return stream.CanWrite; }
- }
-
- public override bool CanSeek
- {
- get { return stream.CanSeek; }
- }
-
- public override long Length
- {
- get { return stream.Length; }
- }
-
- public override long Position
- {
- get { return stream.Position; }
- set { stream.Position = value; }
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Platform.Dispose(stream);
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Platform.Dispose(stream);
- base.Close();
- }
-#endif
-
- public override void Flush()
- {
- stream.Flush();
- }
-
- public override long Seek(
- long offset,
- SeekOrigin origin)
- {
- return stream.Seek(offset, origin);
- }
-
- public override void SetLength(
- long length)
- {
- stream.SetLength(length);
- }
- }
-}
-
diff --git a/BCCrypto/src/crypto/io/MacStream.cs b/BCCrypto/src/crypto/io/MacStream.cs
deleted file mode 100644
index d9b8323..0000000
--- a/BCCrypto/src/crypto/io/MacStream.cs
+++ /dev/null
@@ -1,150 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.IO
-{
- public class MacStream
- : Stream
- {
- protected readonly Stream stream;
- protected readonly IMac inMac;
- protected readonly IMac outMac;
-
- public MacStream(
- Stream stream,
- IMac readMac,
- IMac writeMac)
- {
- this.stream = stream;
- this.inMac = readMac;
- this.outMac = writeMac;
- }
-
- public virtual IMac ReadMac()
- {
- return inMac;
- }
-
- public virtual IMac WriteMac()
- {
- return outMac;
- }
-
- public override int Read(
- byte[] buffer,
- int offset,
- int count)
- {
- int n = stream.Read(buffer, offset, count);
- if (inMac != null)
- {
- if (n > 0)
- {
- inMac.BlockUpdate(buffer, offset, n);
- }
- }
- return n;
- }
-
- public override int ReadByte()
- {
- int b = stream.ReadByte();
- if (inMac != null)
- {
- if (b >= 0)
- {
- inMac.Update((byte)b);
- }
- }
- return b;
- }
-
- public override void Write(
- byte[] buffer,
- int offset,
- int count)
- {
- if (outMac != null)
- {
- if (count > 0)
- {
- outMac.BlockUpdate(buffer, offset, count);
- }
- }
- stream.Write(buffer, offset, count);
- }
-
- public override void WriteByte(byte b)
- {
- if (outMac != null)
- {
- outMac.Update(b);
- }
- stream.WriteByte(b);
- }
-
- public override bool CanRead
- {
- get { return stream.CanRead; }
- }
-
- public override bool CanWrite
- {
- get { return stream.CanWrite; }
- }
-
- public override bool CanSeek
- {
- get { return stream.CanSeek; }
- }
-
- public override long Length
- {
- get { return stream.Length; }
- }
-
- public override long Position
- {
- get { return stream.Position; }
- set { stream.Position = value; }
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Platform.Dispose(stream);
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Platform.Dispose(stream);
- base.Close();
- }
-#endif
-
- public override void Flush()
- {
- stream.Flush();
- }
-
- public override long Seek(
- long offset,
- SeekOrigin origin)
- {
- return stream.Seek(offset,origin);
- }
-
- public override void SetLength(
- long length)
- {
- stream.SetLength(length);
- }
- }
-}
-
diff --git a/BCCrypto/src/crypto/io/SignerStream.cs b/BCCrypto/src/crypto/io/SignerStream.cs
deleted file mode 100644
index 1e37c8d..0000000
--- a/BCCrypto/src/crypto/io/SignerStream.cs
+++ /dev/null
@@ -1,151 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.IO
-{
- public class SignerStream
- : Stream
- {
- protected readonly Stream stream;
- protected readonly ISigner inSigner;
- protected readonly ISigner outSigner;
-
- public SignerStream(
- Stream stream,
- ISigner readSigner,
- ISigner writeSigner)
- {
- this.stream = stream;
- this.inSigner = readSigner;
- this.outSigner = writeSigner;
- }
-
- public virtual ISigner ReadSigner()
- {
- return inSigner;
- }
-
- public virtual ISigner WriteSigner()
- {
- return outSigner;
- }
-
- public override int Read(
- byte[] buffer,
- int offset,
- int count)
- {
- int n = stream.Read(buffer, offset, count);
- if (inSigner != null)
- {
- if (n > 0)
- {
- inSigner.BlockUpdate(buffer, offset, n);
- }
- }
- return n;
- }
-
- public override int ReadByte()
- {
- int b = stream.ReadByte();
- if (inSigner != null)
- {
- if (b >= 0)
- {
- inSigner.Update((byte)b);
- }
- }
- return b;
- }
-
- public override void Write(
- byte[] buffer,
- int offset,
- int count)
- {
- if (outSigner != null)
- {
- if (count > 0)
- {
- outSigner.BlockUpdate(buffer, offset, count);
- }
- }
- stream.Write(buffer, offset, count);
- }
-
- public override void WriteByte(
- byte b)
- {
- if (outSigner != null)
- {
- outSigner.Update(b);
- }
- stream.WriteByte(b);
- }
-
- public override bool CanRead
- {
- get { return stream.CanRead; }
- }
-
- public override bool CanWrite
- {
- get { return stream.CanWrite; }
- }
-
- public override bool CanSeek
- {
- get { return stream.CanSeek; }
- }
-
- public override long Length
- {
- get { return stream.Length; }
- }
-
- public override long Position
- {
- get { return stream.Position; }
- set { stream.Position = value; }
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Platform.Dispose(stream);
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Platform.Dispose(stream);
- base.Close();
- }
-#endif
-
- public override void Flush()
- {
- stream.Flush();
- }
-
- public override long Seek(
- long offset,
- SeekOrigin origin)
- {
- return stream.Seek(offset, origin);
- }
-
- public override void SetLength(
- long length)
- {
- stream.SetLength(length);
- }
- }
-}
-
diff --git a/BCCrypto/src/crypto/macs/CMac.cs b/BCCrypto/src/crypto/macs/CMac.cs
deleted file mode 100644
index 682c12b..0000000
--- a/BCCrypto/src/crypto/macs/CMac.cs
+++ /dev/null
@@ -1,257 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Paddings;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
- /**
- * CMAC - as specified at www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/omac.html
- *
- * CMAC is analogous to OMAC1 - see also en.wikipedia.org/wiki/CMAC
- *
- * CMAC is a NIST recomendation - see
- * csrc.nist.gov/CryptoToolkit/modes/800-38_Series_Publications/SP800-38B.pdf
- *
- * CMAC/OMAC1 is a blockcipher-based message authentication code designed and
- * analyzed by Tetsu Iwata and Kaoru Kurosawa.
- *
- * CMAC/OMAC1 is a simple variant of the CBC MAC (Cipher Block Chaining Message
- * Authentication Code). OMAC stands for One-Key CBC MAC.
- *
- * It supports 128- or 64-bits block ciphers, with any key size, and returns
- * a MAC with dimension less or equal to the block size of the underlying
- * cipher.
- *
- */
- public class CMac
- : IMac
- {
- private const byte CONSTANT_128 = (byte)0x87;
- private const byte CONSTANT_64 = (byte)0x1b;
-
- private byte[] ZEROES;
-
- private byte[] mac;
-
- private byte[] buf;
- private int bufOff;
- private IBlockCipher cipher;
-
- private int macSize;
-
- private byte[] L, Lu, Lu2;
-
- /**
- * create a standard MAC based on a CBC block cipher (64 or 128 bit block).
- * This will produce an authentication code the length of the block size
- * of the cipher.
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- */
- public CMac(
- IBlockCipher cipher)
- : this(cipher, cipher.GetBlockSize() * 8)
- {
- }
-
- /**
- * create a standard MAC based on a block cipher with the size of the
- * MAC been given in bits.
- *
- * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),
- * or 16 bits if being used as a data authenticator (FIPS Publication 113),
- * and in general should be less than the size of the block cipher as it reduces
- * the chance of an exhaustive attack (see Handbook of Applied Cryptography).
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8 and @lt;= 128.
- */
- public CMac(
- IBlockCipher cipher,
- int macSizeInBits)
- {
- if ((macSizeInBits % 8) != 0)
- throw new ArgumentException("MAC size must be multiple of 8");
-
- if (macSizeInBits > (cipher.GetBlockSize() * 8))
- {
- throw new ArgumentException(
- "MAC size must be less or equal to "
- + (cipher.GetBlockSize() * 8));
- }
-
- if (cipher.GetBlockSize() != 8 && cipher.GetBlockSize() != 16)
- {
- throw new ArgumentException(
- "Block size must be either 64 or 128 bits");
- }
-
- this.cipher = new CbcBlockCipher(cipher);
- this.macSize = macSizeInBits / 8;
-
- mac = new byte[cipher.GetBlockSize()];
-
- buf = new byte[cipher.GetBlockSize()];
-
- ZEROES = new byte[cipher.GetBlockSize()];
-
- bufOff = 0;
- }
-
- public string AlgorithmName
- {
- get { return cipher.AlgorithmName; }
- }
-
- private static int ShiftLeft(byte[] block, byte[] output)
- {
- int i = block.Length;
- uint bit = 0;
- while (--i >= 0)
- {
- uint b = block[i];
- output[i] = (byte)((b << 1) | bit);
- bit = (b >> 7) & 1;
- }
- return (int)bit;
- }
-
- private static byte[] DoubleLu(byte[] input)
- {
- byte[] ret = new byte[input.Length];
- int carry = ShiftLeft(input, ret);
- int xor = input.Length == 16 ? CONSTANT_128 : CONSTANT_64;
-
- /*
- * NOTE: This construction is an attempt at a constant-time implementation.
- */
- ret[input.Length - 1] ^= (byte)(xor >> ((1 - carry) << 3));
-
- return ret;
- }
-
- public void Init(
- ICipherParameters parameters)
- {
- if (parameters is KeyParameter)
- {
- cipher.Init(true, parameters);
-
- //initializes the L, Lu, Lu2 numbers
- L = new byte[ZEROES.Length];
- cipher.ProcessBlock(ZEROES, 0, L, 0);
- Lu = DoubleLu(L);
- Lu2 = DoubleLu(Lu);
- }
- else if (parameters != null)
- {
- // CMAC mode does not permit IV to underlying CBC mode
- throw new ArgumentException("CMac mode only permits key to be set.", "parameters");
- }
-
- Reset();
- }
-
- public int GetMacSize()
- {
- return macSize;
- }
-
- public void Update(
- byte input)
- {
- if (bufOff == buf.Length)
- {
- cipher.ProcessBlock(buf, 0, mac, 0);
- bufOff = 0;
- }
-
- buf[bufOff++] = input;
- }
-
- public void BlockUpdate(
- byte[] inBytes,
- int inOff,
- int len)
- {
- if (len < 0)
- throw new ArgumentException("Can't have a negative input length!");
-
- int blockSize = cipher.GetBlockSize();
- int gapLen = blockSize - bufOff;
-
- if (len > gapLen)
- {
- Array.Copy(inBytes, inOff, buf, bufOff, gapLen);
-
- cipher.ProcessBlock(buf, 0, mac, 0);
-
- bufOff = 0;
- len -= gapLen;
- inOff += gapLen;
-
- while (len > blockSize)
- {
- cipher.ProcessBlock(inBytes, inOff, mac, 0);
-
- len -= blockSize;
- inOff += blockSize;
- }
- }
-
- Array.Copy(inBytes, inOff, buf, bufOff, len);
-
- bufOff += len;
- }
-
- public int DoFinal(
- byte[] outBytes,
- int outOff)
- {
- int blockSize = cipher.GetBlockSize();
-
- byte[] lu;
- if (bufOff == blockSize)
- {
- lu = Lu;
- }
- else
- {
- new ISO7816d4Padding().AddPadding(buf, bufOff);
- lu = Lu2;
- }
-
- for (int i = 0; i < mac.Length; i++)
- {
- buf[i] ^= lu[i];
- }
-
- cipher.ProcessBlock(buf, 0, mac, 0);
-
- Array.Copy(mac, 0, outBytes, outOff, macSize);
-
- Reset();
-
- return macSize;
- }
-
- /**
- * Reset the mac generator.
- */
- public void Reset()
- {
- /*
- * clean the buffer.
- */
- Array.Clear(buf, 0, buf.Length);
- bufOff = 0;
-
- /*
- * Reset the underlying cipher.
- */
- cipher.Reset();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/macs/CbcBlockCipherMac.cs b/BCCrypto/src/crypto/macs/CbcBlockCipherMac.cs
deleted file mode 100644
index 146e16a..0000000
--- a/BCCrypto/src/crypto/macs/CbcBlockCipherMac.cs
+++ /dev/null
@@ -1,209 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Paddings;
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
- /**
- * standard CBC Block Cipher MAC - if no padding is specified the default of
- * pad of zeroes is used.
- */
- public class CbcBlockCipherMac
- : IMac
- {
- private byte[] buf;
- private int bufOff;
- private IBlockCipher cipher;
- private IBlockCipherPadding padding;
- private int macSize;
-
- /**
- * create a standard MAC based on a CBC block cipher. This will produce an
- * authentication code half the length of the block size of the cipher.
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- */
- public CbcBlockCipherMac(
- IBlockCipher cipher)
- : this(cipher, (cipher.GetBlockSize() * 8) / 2, null)
- {
- }
-
- /**
- * create a standard MAC based on a CBC block cipher. This will produce an
- * authentication code half the length of the block size of the cipher.
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- * @param padding the padding to be used to complete the last block.
- */
- public CbcBlockCipherMac(
- IBlockCipher cipher,
- IBlockCipherPadding padding)
- : this(cipher, (cipher.GetBlockSize() * 8) / 2, padding)
- {
- }
-
- /**
- * create a standard MAC based on a block cipher with the size of the
- * MAC been given in bits. This class uses CBC mode as the basis for the
- * MAC generation.
- *
- * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),
- * or 16 bits if being used as a data authenticator (FIPS Publication 113),
- * and in general should be less than the size of the block cipher as it reduces
- * the chance of an exhaustive attack (see Handbook of Applied Cryptography).
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.
- */
- public CbcBlockCipherMac(
- IBlockCipher cipher,
- int macSizeInBits)
- : this(cipher, macSizeInBits, null)
- {
- }
-
- /**
- * create a standard MAC based on a block cipher with the size of the
- * MAC been given in bits. This class uses CBC mode as the basis for the
- * MAC generation.
- *
- * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),
- * or 16 bits if being used as a data authenticator (FIPS Publication 113),
- * and in general should be less than the size of the block cipher as it reduces
- * the chance of an exhaustive attack (see Handbook of Applied Cryptography).
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.
- * @param padding the padding to be used to complete the last block.
- */
- public CbcBlockCipherMac(
- IBlockCipher cipher,
- int macSizeInBits,
- IBlockCipherPadding padding)
- {
- if ((macSizeInBits % 8) != 0)
- throw new ArgumentException("MAC size must be multiple of 8");
-
- this.cipher = new CbcBlockCipher(cipher);
- this.padding = padding;
- this.macSize = macSizeInBits / 8;
-
- buf = new byte[cipher.GetBlockSize()];
- bufOff = 0;
- }
-
- public string AlgorithmName
- {
- get { return cipher.AlgorithmName; }
- }
-
- public void Init(
- ICipherParameters parameters)
- {
- Reset();
-
- cipher.Init(true, parameters);
- }
-
- public int GetMacSize()
- {
- return macSize;
- }
-
- public void Update(
- byte input)
- {
- if (bufOff == buf.Length)
- {
- cipher.ProcessBlock(buf, 0, buf, 0);
- bufOff = 0;
- }
-
- buf[bufOff++] = input;
- }
-
- public void BlockUpdate(
- byte[] input,
- int inOff,
- int len)
- {
- if (len < 0)
- throw new ArgumentException("Can't have a negative input length!");
-
- int blockSize = cipher.GetBlockSize();
- int gapLen = blockSize - bufOff;
-
- if (len > gapLen)
- {
- Array.Copy(input, inOff, buf, bufOff, gapLen);
-
- cipher.ProcessBlock(buf, 0, buf, 0);
-
- bufOff = 0;
- len -= gapLen;
- inOff += gapLen;
-
- while (len > blockSize)
- {
- cipher.ProcessBlock(input, inOff, buf, 0);
-
- len -= blockSize;
- inOff += blockSize;
- }
- }
-
- Array.Copy(input, inOff, buf, bufOff, len);
-
- bufOff += len;
- }
-
- public int DoFinal(
- byte[] output,
- int outOff)
- {
- int blockSize = cipher.GetBlockSize();
-
- if (padding == null)
- {
- // pad with zeroes
- while (bufOff < blockSize)
- {
- buf[bufOff++] = 0;
- }
- }
- else
- {
- if (bufOff == blockSize)
- {
- cipher.ProcessBlock(buf, 0, buf, 0);
- bufOff = 0;
- }
-
- padding.AddPadding(buf, bufOff);
- }
-
- cipher.ProcessBlock(buf, 0, buf, 0);
-
- Array.Copy(buf, 0, output, outOff, macSize);
-
- Reset();
-
- return macSize;
- }
-
- /**
- * Reset the mac generator.
- */
- public void Reset()
- {
- // Clear the buffer.
- Array.Clear(buf, 0, buf.Length);
- bufOff = 0;
-
- // Reset the underlying cipher.
- cipher.Reset();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/macs/CfbBlockCipherMac.cs b/BCCrypto/src/crypto/macs/CfbBlockCipherMac.cs
deleted file mode 100644
index 364cf84..0000000
--- a/BCCrypto/src/crypto/macs/CfbBlockCipherMac.cs
+++ /dev/null
@@ -1,368 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Paddings;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
- /**
- * implements a Cipher-FeedBack (CFB) mode on top of a simple cipher.
- */
- class MacCFBBlockCipher
- : IBlockCipher
- {
- private byte[] IV;
- private byte[] cfbV;
- private byte[] cfbOutV;
-
- private readonly int blockSize;
- private readonly IBlockCipher cipher;
-
- /**
- * Basic constructor.
- *
- * @param cipher the block cipher to be used as the basis of the
- * feedback mode.
- * @param blockSize the block size in bits (note: a multiple of 8)
- */
- public MacCFBBlockCipher(
- IBlockCipher cipher,
- int bitBlockSize)
- {
- this.cipher = cipher;
- this.blockSize = bitBlockSize / 8;
-
- this.IV = new byte[cipher.GetBlockSize()];
- this.cfbV = new byte[cipher.GetBlockSize()];
- this.cfbOutV = new byte[cipher.GetBlockSize()];
- }
-
- /**
- * Initialise the cipher and, possibly, the initialisation vector (IV).
- * If an IV isn't passed as part of the parameter, the IV will be all zeros.
- * An IV which is too short is handled in FIPS compliant fashion.
- *
- * @param param the key and other data required by the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- if (parameters is ParametersWithIV)
- {
- ParametersWithIV ivParam = (ParametersWithIV)parameters;
- byte[] iv = ivParam.GetIV();
-
- if (iv.Length < IV.Length)
- {
- Array.Copy(iv, 0, IV, IV.Length - iv.Length, iv.Length);
- }
- else
- {
- Array.Copy(iv, 0, IV, 0, IV.Length);
- }
-
- parameters = ivParam.Parameters;
- }
-
- Reset();
-
- cipher.Init(true, parameters);
- }
-
- /**
- * return the algorithm name and mode.
- *
- * @return the name of the underlying algorithm followed by "/CFB"
- * and the block size in bits.
- */
- public string AlgorithmName
- {
- get { return cipher.AlgorithmName + "/CFB" + (blockSize * 8); }
- }
-
- public bool IsPartialBlockOkay
- {
- get { return true; }
- }
-
- /**
- * return the block size we are operating at.
- *
- * @return the block size we are operating at (in bytes).
- */
- public int GetBlockSize()
- {
- return blockSize;
- }
-
- /**
- * Process one block of input from the array in and write it to
- * the out array.
- *
- * @param in the array containing the input data.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the output data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @exception DataLengthException if there isn't enough data in in, or
- * space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- * @return the number of bytes processed and produced.
- */
- public int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- if ((inOff + blockSize) > input.Length)
- throw new DataLengthException("input buffer too short");
-
- if ((outOff + blockSize) > outBytes.Length)
- throw new DataLengthException("output buffer too short");
-
- cipher.ProcessBlock(cfbV, 0, cfbOutV, 0);
-
- //
- // XOR the cfbV with the plaintext producing the cipher text
- //
- for (int i = 0; i < blockSize; i++)
- {
- outBytes[outOff + i] = (byte)(cfbOutV[i] ^ input[inOff + i]);
- }
-
- //
- // change over the input block.
- //
- Array.Copy(cfbV, blockSize, cfbV, 0, cfbV.Length - blockSize);
- Array.Copy(outBytes, outOff, cfbV, cfbV.Length - blockSize, blockSize);
-
- return blockSize;
- }
-
- /**
- * reset the chaining vector back to the IV and reset the underlying
- * cipher.
- */
- public void Reset()
- {
- IV.CopyTo(cfbV, 0);
-
- cipher.Reset();
- }
-
- public void GetMacBlock(
- byte[] mac)
- {
- cipher.ProcessBlock(cfbV, 0, mac, 0);
- }
- }
-
- public class CfbBlockCipherMac
- : IMac
- {
- private byte[] mac;
- private byte[] Buffer;
- private int bufOff;
- private MacCFBBlockCipher cipher;
- private IBlockCipherPadding padding;
- private int macSize;
-
- /**
- * create a standard MAC based on a CFB block cipher. This will produce an
- * authentication code half the length of the block size of the cipher, with
- * the CFB mode set to 8 bits.
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- */
- public CfbBlockCipherMac(
- IBlockCipher cipher)
- : this(cipher, 8, (cipher.GetBlockSize() * 8) / 2, null)
- {
- }
-
- /**
- * create a standard MAC based on a CFB block cipher. This will produce an
- * authentication code half the length of the block size of the cipher, with
- * the CFB mode set to 8 bits.
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- * @param padding the padding to be used.
- */
- public CfbBlockCipherMac(
- IBlockCipher cipher,
- IBlockCipherPadding padding)
- : this(cipher, 8, (cipher.GetBlockSize() * 8) / 2, padding)
- {
- }
-
- /**
- * create a standard MAC based on a block cipher with the size of the
- * MAC been given in bits. This class uses CFB mode as the basis for the
- * MAC generation.
- *
- * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),
- * or 16 bits if being used as a data authenticator (FIPS Publication 113),
- * and in general should be less than the size of the block cipher as it reduces
- * the chance of an exhaustive attack (see Handbook of Applied Cryptography).
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- * @param cfbBitSize the size of an output block produced by the CFB mode.
- * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.
- */
- public CfbBlockCipherMac(
- IBlockCipher cipher,
- int cfbBitSize,
- int macSizeInBits)
- : this(cipher, cfbBitSize, macSizeInBits, null)
- {
- }
-
- /**
- * create a standard MAC based on a block cipher with the size of the
- * MAC been given in bits. This class uses CFB mode as the basis for the
- * MAC generation.
- *
- * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),
- * or 16 bits if being used as a data authenticator (FIPS Publication 113),
- * and in general should be less than the size of the block cipher as it reduces
- * the chance of an exhaustive attack (see Handbook of Applied Cryptography).
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- * @param cfbBitSize the size of an output block produced by the CFB mode.
- * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.
- * @param padding a padding to be used.
- */
- public CfbBlockCipherMac(
- IBlockCipher cipher,
- int cfbBitSize,
- int macSizeInBits,
- IBlockCipherPadding padding)
- {
- if ((macSizeInBits % 8) != 0)
- throw new ArgumentException("MAC size must be multiple of 8");
-
- mac = new byte[cipher.GetBlockSize()];
-
- this.cipher = new MacCFBBlockCipher(cipher, cfbBitSize);
- this.padding = padding;
- this.macSize = macSizeInBits / 8;
-
- Buffer = new byte[this.cipher.GetBlockSize()];
- bufOff = 0;
- }
-
- public string AlgorithmName
- {
- get { return cipher.AlgorithmName; }
- }
-
- public void Init(
- ICipherParameters parameters)
- {
- Reset();
-
- cipher.Init(true, parameters);
- }
-
- public int GetMacSize()
- {
- return macSize;
- }
-
- public void Update(
- byte input)
- {
- if (bufOff == Buffer.Length)
- {
- cipher.ProcessBlock(Buffer, 0, mac, 0);
- bufOff = 0;
- }
-
- Buffer[bufOff++] = input;
- }
-
- public void BlockUpdate(
- byte[] input,
- int inOff,
- int len)
- {
- if (len < 0)
- throw new ArgumentException("Can't have a negative input length!");
-
- int blockSize = cipher.GetBlockSize();
- int resultLen = 0;
- int gapLen = blockSize - bufOff;
-
- if (len > gapLen)
- {
- Array.Copy(input, inOff, Buffer, bufOff, gapLen);
-
- resultLen += cipher.ProcessBlock(Buffer, 0, mac, 0);
-
- bufOff = 0;
- len -= gapLen;
- inOff += gapLen;
-
- while (len > blockSize)
- {
- resultLen += cipher.ProcessBlock(input, inOff, mac, 0);
-
- len -= blockSize;
- inOff += blockSize;
- }
- }
-
- Array.Copy(input, inOff, Buffer, bufOff, len);
-
- bufOff += len;
- }
-
- public int DoFinal(
- byte[] output,
- int outOff)
- {
- int blockSize = cipher.GetBlockSize();
-
- // pad with zeroes
- if (this.padding == null)
- {
- while (bufOff < blockSize)
- {
- Buffer[bufOff++] = 0;
- }
- }
- else
- {
- padding.AddPadding(Buffer, bufOff);
- }
-
- cipher.ProcessBlock(Buffer, 0, mac, 0);
-
- cipher.GetMacBlock(mac);
-
- Array.Copy(mac, 0, output, outOff, macSize);
-
- Reset();
-
- return macSize;
- }
-
- /**
- * Reset the mac generator.
- */
- public void Reset()
- {
- // Clear the buffer.
- Array.Clear(Buffer, 0, Buffer.Length);
- bufOff = 0;
-
- // Reset the underlying cipher.
- cipher.Reset();
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/macs/DSTU7564Mac.cs b/BCCrypto/src/crypto/macs/DSTU7564Mac.cs
deleted file mode 100644
index 9073554..0000000
--- a/BCCrypto/src/crypto/macs/DSTU7564Mac.cs
+++ /dev/null
@@ -1,156 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
- ///
- /// Implementation of DSTU7564 mac mode
- ///
- public class Dstu7564Mac : IMac
- {
- private Dstu7564Digest engine;
- private int macSize;
-
- private ulong inputLength;
-
- byte[] paddedKey;
- byte[] invertedKey;
- byte[] paddedInput;
-
- public string AlgorithmName
- {
- get
- {
- return "DSTU7564Mac";
- }
- }
-
- public Dstu7564Mac(int macSizeBits)
- {
- engine = new Dstu7564Digest(macSizeBits);
- macSize = macSizeBits / 8;
- }
-
- public void Init(ICipherParameters parameters)
- {
- if (parameters is KeyParameter)
- {
- byte[] key = ((KeyParameter)parameters).GetKey();
-
- invertedKey = new byte[key.Length];
-
- paddedKey = PadKey(key);
-
- for (int byteIndex = 0; byteIndex < invertedKey.Length; byteIndex++)
- {
- invertedKey[byteIndex] = (byte)(key[byteIndex] ^ (byte)0xFF);
- }
- }
- else
- {
- throw new ArgumentException("Bad parameter passed");
- }
-
- engine.BlockUpdate(paddedKey, 0, paddedKey.Length);
- }
-
- public int GetMacSize()
- {
- return macSize;
- }
-
- public void BlockUpdate(byte[] input, int inOff, int len)
- {
- if (input.Length - inOff < len)
- {
- throw new DataLengthException("Input buffer too short");
- }
-
- if (paddedKey == null)
- {
- throw new InvalidOperationException(AlgorithmName + " not initialised");
- }
-
- engine.BlockUpdate(input, inOff, len);
- inputLength += (ulong)len;
-
- }
-
- public void Update(byte input)
- {
- engine.Update(input);
- inputLength++;
- }
-
- public int DoFinal(byte[] output, int outOff)
- {
- if (output.Length - outOff < macSize)
- {
- throw new DataLengthException("Output buffer too short");
- }
- if (paddedKey == null)
- {
- throw new InvalidOperationException(AlgorithmName + " not initialised");
- }
-
- Pad();
-
- engine.BlockUpdate(invertedKey, 0, invertedKey.Length);
-
- inputLength = 0;
-
- return engine.DoFinal(output, outOff);
- }
-
- public void Reset()
- {
- inputLength = 0;
- engine.Reset();
- if (paddedKey != null)
- {
- engine.BlockUpdate(paddedKey, 0, paddedKey.Length);
- }
- }
-
- private void Pad()
- {
- int extra = engine.GetByteLength() - (int)(inputLength % (ulong)engine.GetByteLength());
- if (extra < 13) // terminator byte + 96 bits of length
- {
- extra += engine.GetByteLength();
- }
-
- byte[] padded = new byte[extra];
-
- padded[0] = (byte)0x80; // Defined in standard;
-
- // Defined in standard;
- Pack.UInt64_To_LE(inputLength * 8, padded, padded.Length - 12);
-
- engine.BlockUpdate(padded, 0, padded.Length);
- }
-
- private byte[] PadKey(byte[] input)
- {
- int paddedLen = ((input.Length + engine.GetByteLength() - 1) / engine.GetByteLength()) *engine.GetByteLength();
-
- int extra = engine.GetByteLength() - (int)(input.Length % engine.GetByteLength());
- if (extra < 13) // terminator byte + 96 bits of length
- {
- paddedLen += engine.GetByteLength();
- }
-
- byte[] padded = new byte[paddedLen];
-
- Array.Copy(input, 0, padded, 0, input.Length);
-
- padded[input.Length] = (byte)0x80; // Defined in standard;
- Pack.UInt32_To_LE((uint)(input.Length * 8), padded, padded.Length - 12); // Defined in standard;
-
- return padded;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/macs/DSTU7624Mac.cs b/BCCrypto/src/crypto/macs/DSTU7624Mac.cs
deleted file mode 100644
index 953d816..0000000
--- a/BCCrypto/src/crypto/macs/DSTU7624Mac.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Parameters;
-
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
- /**
- * implementation of DSTU 7624 MAC
- */
- public class Dstu7624Mac : IMac
- {
- private int macSize;
-
- private Dstu7624Engine engine;
- private int blockSize;
-
- private byte[] c, cTemp, kDelta;
- private byte[] buf;
- private int bufOff;
-
- public Dstu7624Mac(int blockSizeBits, int q)
- {
- engine = new Dstu7624Engine(blockSizeBits);
-
- blockSize = blockSizeBits / 8;
-
- macSize = q / 8;
-
- c = new byte[blockSize];
-
- cTemp = new byte[blockSize];
-
- kDelta = new byte[blockSize];
- buf = new byte[blockSize];
- }
-
- public void Init(ICipherParameters parameters)
- {
- if (parameters is KeyParameter)
- {
- engine.Init(true, (KeyParameter)parameters);
-
- engine.ProcessBlock(kDelta, 0, kDelta, 0);
- }
- else
- {
- throw new ArgumentException("invalid parameter passed to Dstu7624Mac init - "
- + Platform.GetTypeName(parameters));
- }
- }
-
- public string AlgorithmName
- {
- get { return "Dstu7624Mac"; }
- }
-
- public int GetMacSize()
- {
- return macSize;
- }
-
- public void Update(byte input)
- {
- if (bufOff == buf.Length)
- {
- processBlock(buf, 0);
- bufOff = 0;
- }
-
- buf[bufOff++] = input;
- }
-
- public void BlockUpdate(byte[] input, int inOff, int len)
- {
- if (len < 0)
- {
- throw new ArgumentException(
- "Can't have a negative input length!");
- }
-
- int blockSize = engine.GetBlockSize();
- int gapLen = blockSize - bufOff;
-
- if (len > gapLen)
- {
- Array.Copy(input, inOff, buf, bufOff, gapLen);
-
- processBlock(buf, 0);
-
- bufOff = 0;
- len -= gapLen;
- inOff += gapLen;
-
- while (len > blockSize)
- {
- processBlock(input, inOff);
-
- len -= blockSize;
- inOff += blockSize;
- }
- }
-
- Array.Copy(input, inOff, buf, bufOff, len);
-
- bufOff += len;
- }
-
- private void processBlock(byte[] input, int inOff)
- {
- Xor(c, 0, input, inOff, cTemp);
-
- engine.ProcessBlock(cTemp, 0, c, 0);
- }
-
- private void Xor(byte[] c, int cOff, byte[] input, int inOff, byte[] xorResult)
- {
- for (int byteIndex = 0; byteIndex < blockSize; byteIndex++)
- {
- xorResult[byteIndex] = (byte)(c[byteIndex + cOff] ^ input[byteIndex + inOff]);
- }
- }
-
- public int DoFinal(byte[] output, int outOff)
- {
- if (bufOff % buf.Length != 0)
- {
- throw new DataLengthException("Input must be a multiple of blocksize");
- }
-
- //Last block
- Xor(c, 0, buf, 0, cTemp);
- Xor(cTemp, 0, kDelta, 0, c);
- engine.ProcessBlock(c, 0, c, 0);
-
- if (macSize + outOff > output.Length)
- {
- throw new DataLengthException("Output buffer too short");
- }
-
- Array.Copy(c, 0, output, outOff, macSize);
-
- return macSize;
- }
-
- public void Reset()
- {
- Arrays.Fill(c, (byte)0x00);
- Arrays.Fill(cTemp, (byte)0x00);
- Arrays.Fill(kDelta, (byte)0x00);
- Arrays.Fill(buf, (byte)0x00);
- engine.Reset();
- engine.ProcessBlock(kDelta, 0, kDelta, 0);
- bufOff = 0;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/macs/GMac.cs b/BCCrypto/src/crypto/macs/GMac.cs
deleted file mode 100644
index f2c3990..0000000
--- a/BCCrypto/src/crypto/macs/GMac.cs
+++ /dev/null
@@ -1,112 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
- ///
- /// The GMAC specialisation of Galois/Counter mode (GCM) detailed in NIST Special Publication
- /// 800-38D.
- ///
- ///
- /// GMac is an invocation of the GCM mode where no data is encrypted (i.e. all input data to the Mac
- /// is processed as additional authenticated data with the underlying GCM block cipher).
- ///
- public class GMac
- : IMac
- {
- private readonly GcmBlockCipher cipher;
- private readonly int macSizeBits;
-
- ///
- /// Creates a GMAC based on the operation of a block cipher in GCM mode.
- ///
- ///
- /// This will produce an authentication code the length of the block size of the cipher.
- ///
- /// the cipher to be used in GCM mode to generate the MAC.
- public GMac(GcmBlockCipher cipher)
- : this(cipher, 128)
- {
- }
-
- ///
- /// Creates a GMAC based on the operation of a 128 bit block cipher in GCM mode.
- ///
- ///
- /// This will produce an authentication code the length of the block size of the cipher.
- ///
- /// the cipher to be used in GCM mode to generate the MAC.
- /// the mac size to generate, in bits. Must be a multiple of 8, between 32 and 128 (inclusive).
- /// Sizes less than 96 are not recommended, but are supported for specialized applications.
- public GMac(GcmBlockCipher cipher, int macSizeBits)
- {
- this.cipher = cipher;
- this.macSizeBits = macSizeBits;
- }
-
- ///
- /// Initialises the GMAC - requires a
- /// providing a and a nonce.
- ///
- public void Init(ICipherParameters parameters)
- {
- if (parameters is ParametersWithIV)
- {
- ParametersWithIV param = (ParametersWithIV)parameters;
-
- byte[] iv = param.GetIV();
- KeyParameter keyParam = (KeyParameter)param.Parameters;
-
- // GCM is always operated in encrypt mode to calculate MAC
- cipher.Init(true, new AeadParameters(keyParam, macSizeBits, iv));
- }
- else
- {
- throw new ArgumentException("GMAC requires ParametersWithIV");
- }
- }
-
- public string AlgorithmName
- {
- get { return cipher.GetUnderlyingCipher().AlgorithmName + "-GMAC"; }
- }
-
- public int GetMacSize()
- {
- return macSizeBits / 8;
- }
-
- public void Update(byte input)
- {
- cipher.ProcessAadByte(input);
- }
-
- public void BlockUpdate(byte[] input, int inOff, int len)
- {
- cipher.ProcessAadBytes(input, inOff, len);
- }
-
- public int DoFinal(byte[] output, int outOff)
- {
- try
- {
- return cipher.DoFinal(output, outOff);
- }
- catch (InvalidCipherTextException e)
- {
- // Impossible in encrypt mode
- throw new InvalidOperationException(e.ToString());
- }
- }
-
- public void Reset()
- {
- cipher.Reset();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/macs/GOST28147Mac.cs b/BCCrypto/src/crypto/macs/GOST28147Mac.cs
deleted file mode 100644
index cc6b723..0000000
--- a/BCCrypto/src/crypto/macs/GOST28147Mac.cs
+++ /dev/null
@@ -1,297 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
- /**
- * implementation of GOST 28147-89 MAC
- */
- public class Gost28147Mac : IMac
- {
- private const int blockSize = 8;
- private const int macSize = 4;
- private int bufOff;
- private byte[] buf;
- private byte[] mac;
- private bool firstStep = true;
- private int[] workingKey;
-
- //
- // This is default S-box - E_A.
- private byte[] S =
- {
- 0x9,0x6,0x3,0x2,0x8,0xB,0x1,0x7,0xA,0x4,0xE,0xF,0xC,0x0,0xD,0x5,
- 0x3,0x7,0xE,0x9,0x8,0xA,0xF,0x0,0x5,0x2,0x6,0xC,0xB,0x4,0xD,0x1,
- 0xE,0x4,0x6,0x2,0xB,0x3,0xD,0x8,0xC,0xF,0x5,0xA,0x0,0x7,0x1,0x9,
- 0xE,0x7,0xA,0xC,0xD,0x1,0x3,0x9,0x0,0x2,0xB,0x4,0xF,0x8,0x5,0x6,
- 0xB,0x5,0x1,0x9,0x8,0xD,0xF,0x0,0xE,0x4,0x2,0x3,0xC,0x7,0xA,0x6,
- 0x3,0xA,0xD,0xC,0x1,0x2,0x0,0xB,0x7,0x5,0x9,0x4,0x8,0xF,0xE,0x6,
- 0x1,0xD,0x2,0x9,0x7,0xA,0x6,0x0,0x8,0xC,0x4,0x5,0xF,0x3,0xB,0xE,
- 0xB,0xA,0xF,0x5,0x0,0xC,0xE,0x8,0x6,0x2,0x3,0x9,0x1,0x7,0xD,0x4
- };
-
- public Gost28147Mac()
- {
- mac = new byte[blockSize];
- buf = new byte[blockSize];
- bufOff = 0;
- }
-
- private static int[] generateWorkingKey(
- byte[] userKey)
- {
- if (userKey.Length != 32)
- throw new ArgumentException("Key length invalid. Key needs to be 32 byte - 256 bit!!!");
-
- int[] key = new int[8];
- for(int i=0; i!=8; i++)
- {
- key[i] = bytesToint(userKey,i*4);
- }
-
- return key;
- }
-
- public void Init(
- ICipherParameters parameters)
- {
- Reset();
- buf = new byte[blockSize];
- if (parameters is ParametersWithSBox)
- {
- ParametersWithSBox param = (ParametersWithSBox)parameters;
-
- //
- // Set the S-Box
- //
- param.GetSBox().CopyTo(this.S, 0);
-
- //
- // set key if there is one
- //
- if (param.Parameters != null)
- {
- workingKey = generateWorkingKey(((KeyParameter)param.Parameters).GetKey());
- }
- }
- else if (parameters is KeyParameter)
- {
- workingKey = generateWorkingKey(((KeyParameter)parameters).GetKey());
- }
- else
- {
- throw new ArgumentException("invalid parameter passed to Gost28147 init - "
- + Platform.GetTypeName(parameters));
- }
- }
-
- public string AlgorithmName
- {
- get { return "Gost28147Mac"; }
- }
-
- public int GetMacSize()
- {
- return macSize;
- }
-
- private int gost28147_mainStep(int n1, int key)
- {
- int cm = (key + n1); // CM1
-
- // S-box replacing
-
- int om = S[ 0 + ((cm >> (0 * 4)) & 0xF)] << (0 * 4);
- om += S[ 16 + ((cm >> (1 * 4)) & 0xF)] << (1 * 4);
- om += S[ 32 + ((cm >> (2 * 4)) & 0xF)] << (2 * 4);
- om += S[ 48 + ((cm >> (3 * 4)) & 0xF)] << (3 * 4);
- om += S[ 64 + ((cm >> (4 * 4)) & 0xF)] << (4 * 4);
- om += S[ 80 + ((cm >> (5 * 4)) & 0xF)] << (5 * 4);
- om += S[ 96 + ((cm >> (6 * 4)) & 0xF)] << (6 * 4);
- om += S[112 + ((cm >> (7 * 4)) & 0xF)] << (7 * 4);
-
-// return om << 11 | om >>> (32-11); // 11-leftshift
- int omLeft = om << 11;
- int omRight = (int)(((uint) om) >> (32 - 11)); // Note: Casts required to get unsigned bit rotation
-
- return omLeft | omRight;
- }
-
- private void gost28147MacFunc(
- int[] workingKey,
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- int N1, N2, tmp; //tmp -> for saving N1
- N1 = bytesToint(input, inOff);
- N2 = bytesToint(input, inOff + 4);
-
- for (int k = 0; k < 2; k++) // 1-16 steps
- {
- for (int j = 0; j < 8; j++)
- {
- tmp = N1;
- N1 = N2 ^ gost28147_mainStep(N1, workingKey[j]); // CM2
- N2 = tmp;
- }
- }
-
- intTobytes(N1, output, outOff);
- intTobytes(N2, output, outOff + 4);
- }
-
- //array of bytes to type int
- private static int bytesToint(
- byte[] input,
- int inOff)
- {
- return (int)((input[inOff + 3] << 24) & 0xff000000) + ((input[inOff + 2] << 16) & 0xff0000)
- + ((input[inOff + 1] << 8) & 0xff00) + (input[inOff] & 0xff);
- }
-
- //int to array of bytes
- private static void intTobytes(
- int num,
- byte[] output,
- int outOff)
- {
- output[outOff + 3] = (byte)(num >> 24);
- output[outOff + 2] = (byte)(num >> 16);
- output[outOff + 1] = (byte)(num >> 8);
- output[outOff] = (byte)num;
- }
-
- private static byte[] CM5func(
- byte[] buf,
- int bufOff,
- byte[] mac)
- {
- byte[] sum = new byte[buf.Length - bufOff];
-
- Array.Copy(buf, bufOff, sum, 0, mac.Length);
-
- for (int i = 0; i != mac.Length; i++)
- {
- sum[i] = (byte)(sum[i] ^ mac[i]);
- }
-
- return sum;
- }
-
- public void Update(
- byte input)
- {
- if (bufOff == buf.Length)
- {
- byte[] sumbuf = new byte[buf.Length];
- Array.Copy(buf, 0, sumbuf, 0, mac.Length);
-
- if (firstStep)
- {
- firstStep = false;
- }
- else
- {
- sumbuf = CM5func(buf, 0, mac);
- }
-
- gost28147MacFunc(workingKey, sumbuf, 0, mac, 0);
- bufOff = 0;
- }
-
- buf[bufOff++] = input;
- }
-
- public void BlockUpdate(
- byte[] input,
- int inOff,
- int len)
- {
- if (len < 0)
- throw new ArgumentException("Can't have a negative input length!");
-
- int gapLen = blockSize - bufOff;
-
- if (len > gapLen)
- {
- Array.Copy(input, inOff, buf, bufOff, gapLen);
-
- byte[] sumbuf = new byte[buf.Length];
- Array.Copy(buf, 0, sumbuf, 0, mac.Length);
-
- if (firstStep)
- {
- firstStep = false;
- }
- else
- {
- sumbuf = CM5func(buf, 0, mac);
- }
-
- gost28147MacFunc(workingKey, sumbuf, 0, mac, 0);
-
- bufOff = 0;
- len -= gapLen;
- inOff += gapLen;
-
- while (len > blockSize)
- {
- sumbuf = CM5func(input, inOff, mac);
- gost28147MacFunc(workingKey, sumbuf, 0, mac, 0);
-
- len -= blockSize;
- inOff += blockSize;
- }
- }
-
- Array.Copy(input, inOff, buf, bufOff, len);
-
- bufOff += len;
- }
-
- public int DoFinal(
- byte[] output,
- int outOff)
- {
- //padding with zero
- while (bufOff < blockSize)
- {
- buf[bufOff++] = 0;
- }
-
- byte[] sumbuf = new byte[buf.Length];
- Array.Copy(buf, 0, sumbuf, 0, mac.Length);
-
- if (firstStep)
- {
- firstStep = false;
- }
- else
- {
- sumbuf = CM5func(buf, 0, mac);
- }
-
- gost28147MacFunc(workingKey, sumbuf, 0, mac, 0);
-
- Array.Copy(mac, (mac.Length/2)-macSize, output, outOff, macSize);
-
- Reset();
-
- return macSize;
- }
-
- public void Reset()
- {
- // Clear the buffer.
- Array.Clear(buf, 0, buf.Length);
- bufOff = 0;
-
- firstStep = true;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/macs/HMac.cs b/BCCrypto/src/crypto/macs/HMac.cs
deleted file mode 100644
index 460f3c5..0000000
--- a/BCCrypto/src/crypto/macs/HMac.cs
+++ /dev/null
@@ -1,154 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
- /**
- * HMAC implementation based on RFC2104
- *
- * H(K XOR opad, H(K XOR ipad, text))
- */
- public class HMac
- : IMac
- {
- private const byte IPAD = (byte)0x36;
- private const byte OPAD = (byte)0x5C;
-
- private readonly IDigest digest;
- private readonly int digestSize;
- private readonly int blockLength;
- private IMemoable ipadState;
- private IMemoable opadState;
-
- private readonly byte[] inputPad;
- private readonly byte[] outputBuf;
-
- public HMac(IDigest digest)
- {
- this.digest = digest;
- this.digestSize = digest.GetDigestSize();
- this.blockLength = digest.GetByteLength();
- this.inputPad = new byte[blockLength];
- this.outputBuf = new byte[blockLength + digestSize];
- }
-
- public virtual string AlgorithmName
- {
- get { return digest.AlgorithmName + "/HMAC"; }
- }
-
- public virtual IDigest GetUnderlyingDigest()
- {
- return digest;
- }
-
- public virtual void Init(ICipherParameters parameters)
- {
- digest.Reset();
-
- byte[] key = ((KeyParameter)parameters).GetKey();
- int keyLength = key.Length;
-
- if (keyLength > blockLength)
- {
- digest.BlockUpdate(key, 0, keyLength);
- digest.DoFinal(inputPad, 0);
-
- keyLength = digestSize;
- }
- else
- {
- Array.Copy(key, 0, inputPad, 0, keyLength);
- }
-
- Array.Clear(inputPad, keyLength, blockLength - keyLength);
- Array.Copy(inputPad, 0, outputBuf, 0, blockLength);
-
- XorPad(inputPad, blockLength, IPAD);
- XorPad(outputBuf, blockLength, OPAD);
-
- if (digest is IMemoable)
- {
- opadState = ((IMemoable)digest).Copy();
-
- ((IDigest)opadState).BlockUpdate(outputBuf, 0, blockLength);
- }
-
- digest.BlockUpdate(inputPad, 0, inputPad.Length);
-
- if (digest is IMemoable)
- {
- ipadState = ((IMemoable)digest).Copy();
- }
- }
-
- public virtual int GetMacSize()
- {
- return digestSize;
- }
-
- public virtual void Update(byte input)
- {
- digest.Update(input);
- }
-
- public virtual void BlockUpdate(byte[] input, int inOff, int len)
- {
- digest.BlockUpdate(input, inOff, len);
- }
-
- public virtual int DoFinal(byte[] output, int outOff)
- {
- digest.DoFinal(outputBuf, blockLength);
-
- if (opadState != null)
- {
- ((IMemoable)digest).Reset(opadState);
- digest.BlockUpdate(outputBuf, blockLength, digest.GetDigestSize());
- }
- else
- {
- digest.BlockUpdate(outputBuf, 0, outputBuf.Length);
- }
-
- int len = digest.DoFinal(output, outOff);
-
- Array.Clear(outputBuf, blockLength, digestSize);
-
- if (ipadState != null)
- {
- ((IMemoable)digest).Reset(ipadState);
- }
- else
- {
- digest.BlockUpdate(inputPad, 0, inputPad.Length);
- }
-
- return len;
- }
-
- /**
- * Reset the mac generator.
- */
- public virtual void Reset()
- {
- // Reset underlying digest
- digest.Reset();
-
- // Initialise the digest
- digest.BlockUpdate(inputPad, 0, inputPad.Length);
- }
-
- private static void XorPad(byte[] pad, int len, byte n)
- {
- for (int i = 0; i < len; ++i)
- {
- pad[i] ^= n;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/macs/ISO9797Alg3Mac.cs b/BCCrypto/src/crypto/macs/ISO9797Alg3Mac.cs
deleted file mode 100644
index 6fee619..0000000
--- a/BCCrypto/src/crypto/macs/ISO9797Alg3Mac.cs
+++ /dev/null
@@ -1,275 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Paddings;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
- /**
- * DES based CBC Block Cipher MAC according to ISO9797, algorithm 3 (ANSI X9.19 Retail MAC)
- *
- * This could as well be derived from CBCBlockCipherMac, but then the property mac in the base
- * class must be changed to protected
- */
- public class ISO9797Alg3Mac : IMac
- {
- private byte[] mac;
- private byte[] buf;
- private int bufOff;
- private IBlockCipher cipher;
- private IBlockCipherPadding padding;
- private int macSize;
- private KeyParameter lastKey2;
- private KeyParameter lastKey3;
-
- /**
- * create a Retail-MAC based on a CBC block cipher. This will produce an
- * authentication code of the length of the block size of the cipher.
- *
- * @param cipher the cipher to be used as the basis of the MAC generation. This must
- * be DESEngine.
- */
- public ISO9797Alg3Mac(
- IBlockCipher cipher)
- : this(cipher, cipher.GetBlockSize() * 8, null)
- {
- }
-
- /**
- * create a Retail-MAC based on a CBC block cipher. This will produce an
- * authentication code of the length of the block size of the cipher.
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- * @param padding the padding to be used to complete the last block.
- */
- public ISO9797Alg3Mac(
- IBlockCipher cipher,
- IBlockCipherPadding padding)
- : this(cipher, cipher.GetBlockSize() * 8, padding)
- {
- }
-
- /**
- * create a Retail-MAC based on a block cipher with the size of the
- * MAC been given in bits. This class uses single DES CBC mode as the basis for the
- * MAC generation.
- *
- * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),
- * or 16 bits if being used as a data authenticator (FIPS Publication 113),
- * and in general should be less than the size of the block cipher as it reduces
- * the chance of an exhaustive attack (see Handbook of Applied Cryptography).
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.
- */
- public ISO9797Alg3Mac(
- IBlockCipher cipher,
- int macSizeInBits)
- : this(cipher, macSizeInBits, null)
- {
- }
-
- /**
- * create a standard MAC based on a block cipher with the size of the
- * MAC been given in bits. This class uses single DES CBC mode as the basis for the
- * MAC generation. The final block is decrypted and then encrypted using the
- * middle and right part of the key.
- *
- * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),
- * or 16 bits if being used as a data authenticator (FIPS Publication 113),
- * and in general should be less than the size of the block cipher as it reduces
- * the chance of an exhaustive attack (see Handbook of Applied Cryptography).
- *
- * @param cipher the cipher to be used as the basis of the MAC generation.
- * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.
- * @param padding the padding to be used to complete the last block.
- */
- public ISO9797Alg3Mac(
- IBlockCipher cipher,
- int macSizeInBits,
- IBlockCipherPadding padding)
- {
- if ((macSizeInBits % 8) != 0)
- throw new ArgumentException("MAC size must be multiple of 8");
-
- if (!(cipher is DesEngine))
- throw new ArgumentException("cipher must be instance of DesEngine");
-
- this.cipher = new CbcBlockCipher(cipher);
- this.padding = padding;
- this.macSize = macSizeInBits / 8;
-
- mac = new byte[cipher.GetBlockSize()];
- buf = new byte[cipher.GetBlockSize()];
- bufOff = 0;
- }
-
- public string AlgorithmName
- {
- get { return "ISO9797Alg3"; }
- }
-
- public void Init(
- ICipherParameters parameters)
- {
- Reset();
-
- if (!(parameters is KeyParameter || parameters is ParametersWithIV))
- throw new ArgumentException("parameters must be an instance of KeyParameter or ParametersWithIV");
-
- // KeyParameter must contain a double or triple length DES key,
- // however the underlying cipher is a single DES. The middle and
- // right key are used only in the final step.
-
- KeyParameter kp;
- if (parameters is KeyParameter)
- {
- kp = (KeyParameter)parameters;
- }
- else
- {
- kp = (KeyParameter)((ParametersWithIV)parameters).Parameters;
- }
-
- KeyParameter key1;
- byte[] keyvalue = kp.GetKey();
-
- if (keyvalue.Length == 16)
- { // Double length DES key
- key1 = new KeyParameter(keyvalue, 0, 8);
- this.lastKey2 = new KeyParameter(keyvalue, 8, 8);
- this.lastKey3 = key1;
- }
- else if (keyvalue.Length == 24)
- { // Triple length DES key
- key1 = new KeyParameter(keyvalue, 0, 8);
- this.lastKey2 = new KeyParameter(keyvalue, 8, 8);
- this.lastKey3 = new KeyParameter(keyvalue, 16, 8);
- }
- else
- {
- throw new ArgumentException("Key must be either 112 or 168 bit long");
- }
-
- if (parameters is ParametersWithIV)
- {
- cipher.Init(true, new ParametersWithIV(key1, ((ParametersWithIV)parameters).GetIV()));
- }
- else
- {
- cipher.Init(true, key1);
- }
- }
-
- public int GetMacSize()
- {
- return macSize;
- }
-
- public void Update(
- byte input)
- {
- if (bufOff == buf.Length)
- {
- cipher.ProcessBlock(buf, 0, mac, 0);
- bufOff = 0;
- }
-
- buf[bufOff++] = input;
- }
-
- public void BlockUpdate(
- byte[] input,
- int inOff,
- int len)
- {
- if (len < 0)
- throw new ArgumentException("Can't have a negative input length!");
-
- int blockSize = cipher.GetBlockSize();
- int resultLen = 0;
- int gapLen = blockSize - bufOff;
-
- if (len > gapLen)
- {
- Array.Copy(input, inOff, buf, bufOff, gapLen);
-
- resultLen += cipher.ProcessBlock(buf, 0, mac, 0);
-
- bufOff = 0;
- len -= gapLen;
- inOff += gapLen;
-
- while (len > blockSize)
- {
- resultLen += cipher.ProcessBlock(input, inOff, mac, 0);
-
- len -= blockSize;
- inOff += blockSize;
- }
- }
-
- Array.Copy(input, inOff, buf, bufOff, len);
-
- bufOff += len;
- }
-
- public int DoFinal(
- byte[] output,
- int outOff)
- {
- int blockSize = cipher.GetBlockSize();
-
- if (padding == null)
- {
- // pad with zeroes
- while (bufOff < blockSize)
- {
- buf[bufOff++] = 0;
- }
- }
- else
- {
- if (bufOff == blockSize)
- {
- cipher.ProcessBlock(buf, 0, mac, 0);
- bufOff = 0;
- }
-
- padding.AddPadding(buf, bufOff);
- }
-
- cipher.ProcessBlock(buf, 0, mac, 0);
-
- // Added to code from base class
- DesEngine deseng = new DesEngine();
-
- deseng.Init(false, this.lastKey2);
- deseng.ProcessBlock(mac, 0, mac, 0);
-
- deseng.Init(true, this.lastKey3);
- deseng.ProcessBlock(mac, 0, mac, 0);
- // ****
-
- Array.Copy(mac, 0, output, outOff, macSize);
-
- Reset();
-
- return macSize;
- }
-
- /**
- * Reset the mac generator.
- */
- public void Reset()
- {
- Array.Clear(buf, 0, buf.Length);
- bufOff = 0;
-
- // reset the underlying cipher.
- cipher.Reset();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/macs/Poly1305.cs b/BCCrypto/src/crypto/macs/Poly1305.cs
deleted file mode 100644
index c0a660f..0000000
--- a/BCCrypto/src/crypto/macs/Poly1305.cs
+++ /dev/null
@@ -1,293 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
-
- ///
- /// Poly1305 message authentication code, designed by D. J. Bernstein.
- ///
- ///
- /// Poly1305 computes a 128-bit (16 bytes) authenticator, using a 128 bit nonce and a 256 bit key
- /// consisting of a 128 bit key applied to an underlying cipher, and a 128 bit key (with 106
- /// effective key bits) used in the authenticator.
- ///
- /// The polynomial calculation in this implementation is adapted from the public domain poly1305-donna-unrolled C implementation
- /// by Andrew M (@floodyberry).
- ///
- ///
- public class Poly1305
- : IMac
- {
- private const int BlockSize = 16;
-
- private readonly IBlockCipher cipher;
-
- private readonly byte[] singleByte = new byte[1];
-
- // Initialised state
-
- /** Polynomial key */
- private uint r0, r1, r2, r3, r4;
-
- /** Precomputed 5 * r[1..4] */
- private uint s1, s2, s3, s4;
-
- /** Encrypted nonce */
- private uint k0, k1, k2, k3;
-
- // Accumulating state
-
- /** Current block of buffered input */
- private byte[] currentBlock = new byte[BlockSize];
-
- /** Current offset in input buffer */
- private int currentBlockOffset = 0;
-
- /** Polynomial accumulator */
- private uint h0, h1, h2, h3, h4;
-
- /**
- * Constructs a Poly1305 MAC, where the key passed to init() will be used directly.
- */
- public Poly1305()
- {
- this.cipher = null;
- }
-
- /**
- * Constructs a Poly1305 MAC, using a 128 bit block cipher.
- */
- public Poly1305(IBlockCipher cipher)
- {
- if (cipher.GetBlockSize() != BlockSize)
- {
- throw new ArgumentException("Poly1305 requires a 128 bit block cipher.");
- }
- this.cipher = cipher;
- }
-
- ///
- /// Initialises the Poly1305 MAC.
- ///
- /// a {@link ParametersWithIV} containing a 128 bit nonce and a {@link KeyParameter} with
- /// a 256 bit key complying to the {@link Poly1305KeyGenerator Poly1305 key format}.
- public void Init(ICipherParameters parameters)
- {
- byte[] nonce = null;
-
- if (cipher != null)
- {
- if (!(parameters is ParametersWithIV))
- throw new ArgumentException("Poly1305 requires an IV when used with a block cipher.", "parameters");
-
- ParametersWithIV ivParams = (ParametersWithIV)parameters;
- nonce = ivParams.GetIV();
- parameters = ivParams.Parameters;
- }
-
- if (!(parameters is KeyParameter))
- throw new ArgumentException("Poly1305 requires a key.");
-
- KeyParameter keyParams = (KeyParameter)parameters;
-
- SetKey(keyParams.GetKey(), nonce);
-
- Reset();
- }
-
- private void SetKey(byte[] key, byte[] nonce)
- {
- if (key.Length != 32)
- throw new ArgumentException("Poly1305 key must be 256 bits.");
-
- if (cipher != null && (nonce == null || nonce.Length != BlockSize))
- throw new ArgumentException("Poly1305 requires a 128 bit IV.");
-
- // Extract r portion of key (and "clamp" the values)
- uint t0 = Pack.LE_To_UInt32(key, 0);
- uint t1 = Pack.LE_To_UInt32(key, 4);
- uint t2 = Pack.LE_To_UInt32(key, 8);
- uint t3 = Pack.LE_To_UInt32(key, 12);
-
- // NOTE: The masks perform the key "clamping" implicitly
- r0 = t0 & 0x03FFFFFFU;
- r1 = ((t0 >> 26) | (t1 << 6)) & 0x03FFFF03U;
- r2 = ((t1 >> 20) | (t2 << 12)) & 0x03FFC0FFU;
- r3 = ((t2 >> 14) | (t3 << 18)) & 0x03F03FFFU;
- r4 = (t3 >> 8) & 0x000FFFFFU;
-
- // Precompute multipliers
- s1 = r1 * 5;
- s2 = r2 * 5;
- s3 = r3 * 5;
- s4 = r4 * 5;
-
- byte[] kBytes;
- int kOff;
-
- if (cipher == null)
- {
- kBytes = key;
- kOff = BlockSize;
- }
- else
- {
- // Compute encrypted nonce
- kBytes = new byte[BlockSize];
- kOff = 0;
-
- cipher.Init(true, new KeyParameter(key, BlockSize, BlockSize));
- cipher.ProcessBlock(nonce, 0, kBytes, 0);
- }
-
- k0 = Pack.LE_To_UInt32(kBytes, kOff + 0);
- k1 = Pack.LE_To_UInt32(kBytes, kOff + 4);
- k2 = Pack.LE_To_UInt32(kBytes, kOff + 8);
- k3 = Pack.LE_To_UInt32(kBytes, kOff + 12);
- }
-
- public string AlgorithmName
- {
- get { return cipher == null ? "Poly1305" : "Poly1305-" + cipher.AlgorithmName; }
- }
-
- public int GetMacSize()
- {
- return BlockSize;
- }
-
- public void Update(byte input)
- {
- singleByte[0] = input;
- BlockUpdate(singleByte, 0, 1);
- }
-
- public void BlockUpdate(byte[] input, int inOff, int len)
- {
- int copied = 0;
- while (len > copied)
- {
- if (currentBlockOffset == BlockSize)
- {
- ProcessBlock();
- currentBlockOffset = 0;
- }
-
- int toCopy = System.Math.Min((len - copied), BlockSize - currentBlockOffset);
- Array.Copy(input, copied + inOff, currentBlock, currentBlockOffset, toCopy);
- copied += toCopy;
- currentBlockOffset += toCopy;
- }
-
- }
-
- private void ProcessBlock()
- {
- if (currentBlockOffset < BlockSize)
- {
- currentBlock[currentBlockOffset] = 1;
- for (int i = currentBlockOffset + 1; i < BlockSize; i++)
- {
- currentBlock[i] = 0;
- }
- }
-
- ulong t0 = Pack.LE_To_UInt32(currentBlock, 0);
- ulong t1 = Pack.LE_To_UInt32(currentBlock, 4);
- ulong t2 = Pack.LE_To_UInt32(currentBlock, 8);
- ulong t3 = Pack.LE_To_UInt32(currentBlock, 12);
-
- h0 += (uint)(t0 & 0x3ffffffU);
- h1 += (uint)((((t1 << 32) | t0) >> 26) & 0x3ffffff);
- h2 += (uint)((((t2 << 32) | t1) >> 20) & 0x3ffffff);
- h3 += (uint)((((t3 << 32) | t2) >> 14) & 0x3ffffff);
- h4 += (uint)(t3 >> 8);
-
- if (currentBlockOffset == BlockSize)
- {
- h4 += (1 << 24);
- }
-
- ulong tp0 = mul32x32_64(h0,r0) + mul32x32_64(h1,s4) + mul32x32_64(h2,s3) + mul32x32_64(h3,s2) + mul32x32_64(h4,s1);
- ulong tp1 = mul32x32_64(h0,r1) + mul32x32_64(h1,r0) + mul32x32_64(h2,s4) + mul32x32_64(h3,s3) + mul32x32_64(h4,s2);
- ulong tp2 = mul32x32_64(h0,r2) + mul32x32_64(h1,r1) + mul32x32_64(h2,r0) + mul32x32_64(h3,s4) + mul32x32_64(h4,s3);
- ulong tp3 = mul32x32_64(h0,r3) + mul32x32_64(h1,r2) + mul32x32_64(h2,r1) + mul32x32_64(h3,r0) + mul32x32_64(h4,s4);
- ulong tp4 = mul32x32_64(h0,r4) + mul32x32_64(h1,r3) + mul32x32_64(h2,r2) + mul32x32_64(h3,r1) + mul32x32_64(h4,r0);
-
- h0 = (uint)tp0 & 0x3ffffff; tp1 += (tp0 >> 26);
- h1 = (uint)tp1 & 0x3ffffff; tp2 += (tp1 >> 26);
- h2 = (uint)tp2 & 0x3ffffff; tp3 += (tp2 >> 26);
- h3 = (uint)tp3 & 0x3ffffff; tp4 += (tp3 >> 26);
- h4 = (uint)tp4 & 0x3ffffff;
- h0 += (uint)(tp4 >> 26) * 5;
- h1 += (h0 >> 26); h0 &= 0x3ffffff;
- }
-
- public int DoFinal(byte[] output, int outOff)
- {
- Check.DataLength(output, outOff, BlockSize, "Output buffer is too short.");
-
- if (currentBlockOffset > 0)
- {
- // Process padded block
- ProcessBlock();
- }
-
- h1 += (h0 >> 26); h0 &= 0x3ffffff;
- h2 += (h1 >> 26); h1 &= 0x3ffffff;
- h3 += (h2 >> 26); h2 &= 0x3ffffff;
- h4 += (h3 >> 26); h3 &= 0x3ffffff;
- h0 += (h4 >> 26) * 5; h4 &= 0x3ffffff;
- h1 += (h0 >> 26); h0 &= 0x3ffffff;
-
- uint g0, g1, g2, g3, g4, b;
- g0 = h0 + 5; b = g0 >> 26; g0 &= 0x3ffffff;
- g1 = h1 + b; b = g1 >> 26; g1 &= 0x3ffffff;
- g2 = h2 + b; b = g2 >> 26; g2 &= 0x3ffffff;
- g3 = h3 + b; b = g3 >> 26; g3 &= 0x3ffffff;
- g4 = h4 + b - (1 << 26);
-
- b = (g4 >> 31) - 1;
- uint nb = ~b;
- h0 = (h0 & nb) | (g0 & b);
- h1 = (h1 & nb) | (g1 & b);
- h2 = (h2 & nb) | (g2 & b);
- h3 = (h3 & nb) | (g3 & b);
- h4 = (h4 & nb) | (g4 & b);
-
- ulong f0, f1, f2, f3;
- f0 = ((h0 ) | (h1 << 26)) + (ulong)k0;
- f1 = ((h1 >> 6 ) | (h2 << 20)) + (ulong)k1;
- f2 = ((h2 >> 12) | (h3 << 14)) + (ulong)k2;
- f3 = ((h3 >> 18) | (h4 << 8 )) + (ulong)k3;
-
- Pack.UInt32_To_LE((uint)f0, output, outOff);
- f1 += (f0 >> 32);
- Pack.UInt32_To_LE((uint)f1, output, outOff + 4);
- f2 += (f1 >> 32);
- Pack.UInt32_To_LE((uint)f2, output, outOff + 8);
- f3 += (f2 >> 32);
- Pack.UInt32_To_LE((uint)f3, output, outOff + 12);
-
- Reset();
- return BlockSize;
- }
-
- public void Reset()
- {
- currentBlockOffset = 0;
-
- h0 = h1 = h2 = h3 = h4 = 0;
- }
-
- private static ulong mul32x32_64(uint i1, uint i2)
- {
- return ((ulong)i1) * i2;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/macs/SipHash.cs b/BCCrypto/src/crypto/macs/SipHash.cs
deleted file mode 100644
index e1a19fa..0000000
--- a/BCCrypto/src/crypto/macs/SipHash.cs
+++ /dev/null
@@ -1,199 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
- ///
- /// Implementation of SipHash as specified in "SipHash: a fast short-input PRF", by Jean-Philippe
- /// Aumasson and Daniel J. Bernstein (https://131002.net/siphash/siphash.pdf).
- ///
- ///
- /// "SipHash is a family of PRFs SipHash-c-d where the integer parameters c and d are the number of
- /// compression rounds and the number of finalization rounds. A compression round is identical to a
- /// finalization round and this round function is called SipRound. Given a 128-bit key k and a
- /// (possibly empty) byte string m, SipHash-c-d returns a 64-bit value..."
- ///
- public class SipHash
- : IMac
- {
- protected readonly int c, d;
-
- protected long k0, k1;
- protected long v0, v1, v2, v3;
-
- protected long m = 0;
- protected int wordPos = 0;
- protected int wordCount = 0;
-
- /// SipHash-2-4
- public SipHash()
- : this(2, 4)
- {
- }
-
- /// SipHash-c-d
- /// the number of compression rounds
- /// the number of finalization rounds
- public SipHash(int c, int d)
- {
- this.c = c;
- this.d = d;
- }
-
- public virtual string AlgorithmName
- {
- get { return "SipHash-" + c + "-" + d; }
- }
-
- public virtual int GetMacSize()
- {
- return 8;
- }
-
- public virtual void Init(ICipherParameters parameters)
- {
- KeyParameter keyParameter = parameters as KeyParameter;
- if (keyParameter == null)
- throw new ArgumentException("must be an instance of KeyParameter", "parameters");
- byte[] key = keyParameter.GetKey();
- if (key.Length != 16)
- throw new ArgumentException("must be a 128-bit key", "parameters");
-
- this.k0 = (long)Pack.LE_To_UInt64(key, 0);
- this.k1 = (long)Pack.LE_To_UInt64(key, 8);
-
- Reset();
- }
-
- public virtual void Update(byte input)
- {
- m = (long)(((ulong)m >> 8) | ((ulong)input << 56));
-
- if (++wordPos == 8)
- {
- ProcessMessageWord();
- wordPos = 0;
- }
- }
-
- public virtual void BlockUpdate(byte[] input, int offset, int length)
- {
- int i = 0, fullWords = length & ~7;
- if (wordPos == 0)
- {
- for (; i < fullWords; i += 8)
- {
- m = (long)Pack.LE_To_UInt64(input, offset + i);
- ProcessMessageWord();
- }
- for (; i < length; ++i)
- {
- m = (long)(((ulong)m >> 8) | ((ulong)input[offset + i] << 56));
- }
- wordPos = length - fullWords;
- }
- else
- {
- int bits = wordPos << 3;
- for (; i < fullWords; i += 8)
- {
- ulong n = Pack.LE_To_UInt64(input, offset + i);
- m = (long)((n << bits) | ((ulong)m >> -bits));
- ProcessMessageWord();
- m = (long)n;
- }
- for (; i < length; ++i)
- {
- m = (long)(((ulong)m >> 8) | ((ulong)input[offset + i] << 56));
-
- if (++wordPos == 8)
- {
- ProcessMessageWord();
- wordPos = 0;
- }
- }
- }
- }
-
- public virtual long DoFinal()
- {
- // NOTE: 2 distinct shifts to avoid "64-bit shift" when wordPos == 0
- m = (long)((ulong)m >> ((7 - wordPos) << 3));
- m = (long)((ulong)m >> 8);
- m = (long)((ulong)m | ((ulong)((wordCount << 3) + wordPos) << 56));
-
- ProcessMessageWord();
-
- v2 ^= 0xffL;
-
- ApplySipRounds(d);
-
- long result = v0 ^ v1 ^ v2 ^ v3;
-
- Reset();
-
- return result;
- }
-
- public virtual int DoFinal(byte[] output, int outOff)
- {
- long result = DoFinal();
- Pack.UInt64_To_LE((ulong)result, output, outOff);
- return 8;
- }
-
- public virtual void Reset()
- {
- v0 = k0 ^ 0x736f6d6570736575L;
- v1 = k1 ^ 0x646f72616e646f6dL;
- v2 = k0 ^ 0x6c7967656e657261L;
- v3 = k1 ^ 0x7465646279746573L;
-
- m = 0;
- wordPos = 0;
- wordCount = 0;
- }
-
- protected virtual void ProcessMessageWord()
- {
- ++wordCount;
- v3 ^= m;
- ApplySipRounds(c);
- v0 ^= m;
- }
-
- protected virtual void ApplySipRounds(int n)
- {
- long r0 = v0, r1 = v1, r2 = v2, r3 = v3;
-
- for (int r = 0; r < n; ++r)
- {
- r0 += r1;
- r2 += r3;
- r1 = RotateLeft(r1, 13);
- r3 = RotateLeft(r3, 16);
- r1 ^= r0;
- r3 ^= r2;
- r0 = RotateLeft(r0, 32);
- r2 += r1;
- r0 += r3;
- r1 = RotateLeft(r1, 17);
- r3 = RotateLeft(r3, 21);
- r1 ^= r2;
- r3 ^= r0;
- r2 = RotateLeft(r2, 32);
- }
-
- v0 = r0; v1 = r1; v2 = r2; v3 = r3;
- }
-
- protected static long RotateLeft(long x, int n)
- {
- ulong ux = (ulong)x;
- ux = (ux << n) | (ux >> -n);
- return (long)ux;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/macs/SkeinMac.cs b/BCCrypto/src/crypto/macs/SkeinMac.cs
deleted file mode 100644
index 07eff24..0000000
--- a/BCCrypto/src/crypto/macs/SkeinMac.cs
+++ /dev/null
@@ -1,118 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
-
- ///
- /// Implementation of the Skein parameterised MAC function in 256, 512 and 1024 bit block sizes,
- /// based on the Threefish tweakable block cipher.
- ///
- ///
- /// This is the 1.3 version of Skein defined in the Skein hash function submission to the NIST SHA-3
- /// competition in October 2010.
- ///
- /// Skein was designed by Niels Ferguson - Stefan Lucks - Bruce Schneier - Doug Whiting - Mihir
- /// Bellare - Tadayoshi Kohno - Jon Callas - Jesse Walker.
- ///
- ///
- ///
- public class SkeinMac
- : IMac
- {
- ///
- /// 256 bit block size - Skein-256
- ///
- public const int SKEIN_256 = SkeinEngine.SKEIN_256;
- ///
- /// 512 bit block size - Skein-512
- ///
- public const int SKEIN_512 = SkeinEngine.SKEIN_512;
- ///
- /// 1024 bit block size - Skein-1024
- ///
- public const int SKEIN_1024 = SkeinEngine.SKEIN_1024;
-
- private readonly SkeinEngine engine;
-
- ///
- /// Constructs a Skein MAC with an internal state size and output size.
- ///
- /// the internal state size in bits - one of or
- /// .
- /// the output/MAC size to produce in bits, which must be an integral number of
- /// bytes.
- public SkeinMac(int stateSizeBits, int digestSizeBits)
- {
- this.engine = new SkeinEngine(stateSizeBits, digestSizeBits);
- }
-
- public SkeinMac(SkeinMac mac)
- {
- this.engine = new SkeinEngine(mac.engine);
- }
-
- public string AlgorithmName
- {
- get { return "Skein-MAC-" + (engine.BlockSize * 8) + "-" + (engine.OutputSize * 8); }
- }
-
- ///
- /// Optionally initialises the Skein digest with the provided parameters.
- ///
- /// See for details on the parameterisation of the Skein hash function.
- /// the parameters to apply to this engine, or null to use no parameters.
- public void Init(ICipherParameters parameters)
- {
- SkeinParameters skeinParameters;
- if (parameters is SkeinParameters)
- {
- skeinParameters = (SkeinParameters)parameters;
- }
- else if (parameters is KeyParameter)
- {
- skeinParameters = new SkeinParameters.Builder().SetKey(((KeyParameter)parameters).GetKey()).Build();
- }
- else
- {
- throw new ArgumentException("Invalid parameter passed to Skein MAC init - "
- + Platform.GetTypeName(parameters));
- }
- if (skeinParameters.GetKey() == null)
- {
- throw new ArgumentException("Skein MAC requires a key parameter.");
- }
- engine.Init(skeinParameters);
- }
-
- public int GetMacSize()
- {
- return engine.OutputSize;
- }
-
- public void Reset()
- {
- engine.Reset();
- }
-
- public void Update(byte inByte)
- {
- engine.Update(inByte);
- }
-
- public void BlockUpdate(byte[] input, int inOff, int len)
- {
- engine.Update(input, inOff, len);
- }
-
- public int DoFinal(byte[] output, int outOff)
- {
- return engine.DoFinal(output, outOff);
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/macs/VMPCMac.cs b/BCCrypto/src/crypto/macs/VMPCMac.cs
deleted file mode 100644
index 6f2da07..0000000
--- a/BCCrypto/src/crypto/macs/VMPCMac.cs
+++ /dev/null
@@ -1,173 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Macs
-{
- public class VmpcMac
- : IMac
- {
- private byte g;
-
- private byte n = 0;
- private byte[] P = null;
- private byte s = 0;
-
- private byte[] T;
- private byte[] workingIV;
-
- private byte[] workingKey;
-
- private byte x1, x2, x3, x4;
-
- public virtual int DoFinal(byte[] output, int outOff)
- {
- // Execute the Post-Processing Phase
- for (int r = 1; r < 25; r++)
- {
- s = P[(s + P[n & 0xff]) & 0xff];
-
- x4 = P[(x4 + x3 + r) & 0xff];
- x3 = P[(x3 + x2 + r) & 0xff];
- x2 = P[(x2 + x1 + r) & 0xff];
- x1 = P[(x1 + s + r) & 0xff];
- T[g & 0x1f] = (byte) (T[g & 0x1f] ^ x1);
- T[(g + 1) & 0x1f] = (byte) (T[(g + 1) & 0x1f] ^ x2);
- T[(g + 2) & 0x1f] = (byte) (T[(g + 2) & 0x1f] ^ x3);
- T[(g + 3) & 0x1f] = (byte) (T[(g + 3) & 0x1f] ^ x4);
- g = (byte) ((g + 4) & 0x1f);
-
- byte temp = P[n & 0xff];
- P[n & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- n = (byte) ((n + 1) & 0xff);
- }
-
- // Input T to the IV-phase of the VMPC KSA
- for (int m = 0; m < 768; m++)
- {
- s = P[(s + P[m & 0xff] + T[m & 0x1f]) & 0xff];
- byte temp = P[m & 0xff];
- P[m & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- }
-
- // Store 20 new outputs of the VMPC Stream Cipher input table M
- byte[] M = new byte[20];
- for (int i = 0; i < 20; i++)
- {
- s = P[(s + P[i & 0xff]) & 0xff];
- M[i] = P[(P[(P[s & 0xff]) & 0xff] + 1) & 0xff];
-
- byte temp = P[i & 0xff];
- P[i & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- }
-
- Array.Copy(M, 0, output, outOff, M.Length);
- Reset();
-
- return M.Length;
- }
-
- public virtual string AlgorithmName
- {
- get { return "VMPC-MAC"; }
- }
-
- public virtual int GetMacSize()
- {
- return 20;
- }
-
- public virtual void Init(ICipherParameters parameters)
- {
- if (!(parameters is ParametersWithIV))
- throw new ArgumentException("VMPC-MAC Init parameters must include an IV", "parameters");
-
- ParametersWithIV ivParams = (ParametersWithIV) parameters;
- KeyParameter key = (KeyParameter) ivParams.Parameters;
-
- if (!(ivParams.Parameters is KeyParameter))
- throw new ArgumentException("VMPC-MAC Init parameters must include a key", "parameters");
-
- this.workingIV = ivParams.GetIV();
-
- if (workingIV == null || workingIV.Length < 1 || workingIV.Length > 768)
- throw new ArgumentException("VMPC-MAC requires 1 to 768 bytes of IV", "parameters");
-
- this.workingKey = key.GetKey();
-
- Reset();
-
- }
-
- private void initKey(byte[] keyBytes, byte[] ivBytes)
- {
- s = 0;
- P = new byte[256];
- for (int i = 0; i < 256; i++)
- {
- P[i] = (byte) i;
- }
- for (int m = 0; m < 768; m++)
- {
- s = P[(s + P[m & 0xff] + keyBytes[m % keyBytes.Length]) & 0xff];
- byte temp = P[m & 0xff];
- P[m & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- }
- for (int m = 0; m < 768; m++)
- {
- s = P[(s + P[m & 0xff] + ivBytes[m % ivBytes.Length]) & 0xff];
- byte temp = P[m & 0xff];
- P[m & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- }
- n = 0;
- }
-
- public virtual void Reset()
- {
- initKey(this.workingKey, this.workingIV);
- g = x1 = x2 = x3 = x4 = n = 0;
- T = new byte[32];
- for (int i = 0; i < 32; i++)
- {
- T[i] = 0;
- }
- }
-
- public virtual void Update(byte input)
- {
- s = P[(s + P[n & 0xff]) & 0xff];
- byte c = (byte) (input ^ P[(P[(P[s & 0xff]) & 0xff] + 1) & 0xff]);
-
- x4 = P[(x4 + x3) & 0xff];
- x3 = P[(x3 + x2) & 0xff];
- x2 = P[(x2 + x1) & 0xff];
- x1 = P[(x1 + s + c) & 0xff];
- T[g & 0x1f] = (byte) (T[g & 0x1f] ^ x1);
- T[(g + 1) & 0x1f] = (byte) (T[(g + 1) & 0x1f] ^ x2);
- T[(g + 2) & 0x1f] = (byte) (T[(g + 2) & 0x1f] ^ x3);
- T[(g + 3) & 0x1f] = (byte) (T[(g + 3) & 0x1f] ^ x4);
- g = (byte) ((g + 4) & 0x1f);
-
- byte temp = P[n & 0xff];
- P[n & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- n = (byte) ((n + 1) & 0xff);
- }
-
- public virtual void BlockUpdate(byte[] input, int inOff, int len)
- {
- if ((inOff + len) > input.Length)
- throw new DataLengthException("input buffer too short");
-
- for (int i = 0; i < len; i++)
- {
- Update(input[inOff + i]);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/CbcBlockCipher.cs b/BCCrypto/src/crypto/modes/CbcBlockCipher.cs
deleted file mode 100644
index 9345fd8..0000000
--- a/BCCrypto/src/crypto/modes/CbcBlockCipher.cs
+++ /dev/null
@@ -1,241 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- /**
- * implements Cipher-Block-Chaining (CBC) mode on top of a simple cipher.
- */
- public class CbcBlockCipher
- : IBlockCipher
- {
- private byte[] IV, cbcV, cbcNextV;
- private int blockSize;
- private IBlockCipher cipher;
- private bool encrypting;
-
- /**
- * Basic constructor.
- *
- * @param cipher the block cipher to be used as the basis of chaining.
- */
- public CbcBlockCipher(
- IBlockCipher cipher)
- {
- this.cipher = cipher;
- this.blockSize = cipher.GetBlockSize();
-
- this.IV = new byte[blockSize];
- this.cbcV = new byte[blockSize];
- this.cbcNextV = new byte[blockSize];
- }
-
- /**
- * return the underlying block cipher that we are wrapping.
- *
- * @return the underlying block cipher that we are wrapping.
- */
- public IBlockCipher GetUnderlyingCipher()
- {
- return cipher;
- }
-
- /**
- * Initialise the cipher and, possibly, the initialisation vector (IV).
- * If an IV isn't passed as part of the parameter, the IV will be all zeros.
- *
- * @param forEncryption if true the cipher is initialised for
- * encryption, if false for decryption.
- * @param param the key and other data required by the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- bool oldEncrypting = this.encrypting;
-
- this.encrypting = forEncryption;
-
- if (parameters is ParametersWithIV)
- {
- ParametersWithIV ivParam = (ParametersWithIV)parameters;
- byte[] iv = ivParam.GetIV();
-
- if (iv.Length != blockSize)
- {
- throw new ArgumentException("initialisation vector must be the same length as block size");
- }
-
- Array.Copy(iv, 0, IV, 0, iv.Length);
-
- parameters = ivParam.Parameters;
- }
-
- Reset();
-
- // if null it's an IV changed only.
- if (parameters != null)
- {
- cipher.Init(encrypting, parameters);
- }
- else if (oldEncrypting != encrypting)
- {
- throw new ArgumentException("cannot change encrypting state without providing key.");
- }
- }
-
- /**
- * return the algorithm name and mode.
- *
- * @return the name of the underlying algorithm followed by "/CBC".
- */
- public string AlgorithmName
- {
- get { return cipher.AlgorithmName + "/CBC"; }
- }
-
- public bool IsPartialBlockOkay
- {
- get { return false; }
- }
-
- /**
- * return the block size of the underlying cipher.
- *
- * @return the block size of the underlying cipher.
- */
- public int GetBlockSize()
- {
- return cipher.GetBlockSize();
- }
-
- /**
- * Process one block of input from the array in and write it to
- * the out array.
- *
- * @param in the array containing the input data.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the output data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @exception DataLengthException if there isn't enough data in in, or
- * space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- * @return the number of bytes processed and produced.
- */
- public int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- return (encrypting)
- ? EncryptBlock(input, inOff, output, outOff)
- : DecryptBlock(input, inOff, output, outOff);
- }
-
- /**
- * reset the chaining vector back to the IV and reset the underlying
- * cipher.
- */
- public void Reset()
- {
- Array.Copy(IV, 0, cbcV, 0, IV.Length);
- Array.Clear(cbcNextV, 0, cbcNextV.Length);
-
- cipher.Reset();
- }
-
- /**
- * Do the appropriate chaining step for CBC mode encryption.
- *
- * @param in the array containing the data to be encrypted.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the encrypted data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @exception DataLengthException if there isn't enough data in in, or
- * space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- * @return the number of bytes processed and produced.
- */
- private int EncryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- if ((inOff + blockSize) > input.Length)
- {
- throw new DataLengthException("input buffer too short");
- }
-
- /*
- * XOR the cbcV and the input,
- * then encrypt the cbcV
- */
- for (int i = 0; i < blockSize; i++)
- {
- cbcV[i] ^= input[inOff + i];
- }
-
- int length = cipher.ProcessBlock(cbcV, 0, outBytes, outOff);
-
- /*
- * copy ciphertext to cbcV
- */
- Array.Copy(outBytes, outOff, cbcV, 0, cbcV.Length);
-
- return length;
- }
-
- /**
- * Do the appropriate chaining step for CBC mode decryption.
- *
- * @param in the array containing the data to be decrypted.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the decrypted data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @exception DataLengthException if there isn't enough data in in, or
- * space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- * @return the number of bytes processed and produced.
- */
- private int DecryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- if ((inOff + blockSize) > input.Length)
- {
- throw new DataLengthException("input buffer too short");
- }
-
- Array.Copy(input, inOff, cbcNextV, 0, blockSize);
-
- int length = cipher.ProcessBlock(input, inOff, outBytes, outOff);
-
- /*
- * XOR the cbcV and the output
- */
- for (int i = 0; i < blockSize; i++)
- {
- outBytes[outOff + i] ^= cbcV[i];
- }
-
- /*
- * swap the back up buffer into next position
- */
- byte[] tmp;
-
- tmp = cbcV;
- cbcV = cbcNextV;
- cbcNextV = tmp;
-
- return length;
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/modes/CcmBlockCipher.cs b/BCCrypto/src/crypto/modes/CcmBlockCipher.cs
deleted file mode 100644
index 4de40d5..0000000
--- a/BCCrypto/src/crypto/modes/CcmBlockCipher.cs
+++ /dev/null
@@ -1,449 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- /**
- * Implements the Counter with Cipher Block Chaining mode (CCM) detailed in
- * NIST Special Publication 800-38C.
- *
- * Note : this mode is a packet mode - it needs all the data up front.
- *
- */
- public class CcmBlockCipher
- : IAeadBlockCipher
- {
- private static readonly int BlockSize = 16;
-
- private readonly IBlockCipher cipher;
- private readonly byte[] macBlock;
- private bool forEncryption;
- private byte[] nonce;
- private byte[] initialAssociatedText;
- private int macSize;
- private ICipherParameters keyParam;
- private readonly MemoryStream associatedText = new MemoryStream();
- private readonly MemoryStream data = new MemoryStream();
-
- /**
- * Basic constructor.
- *
- * @param cipher the block cipher to be used.
- */
- public CcmBlockCipher(
- IBlockCipher cipher)
- {
- this.cipher = cipher;
- this.macBlock = new byte[BlockSize];
-
- if (cipher.GetBlockSize() != BlockSize)
- throw new ArgumentException("cipher required with a block size of " + BlockSize + ".");
- }
-
- /**
- * return the underlying block cipher that we are wrapping.
- *
- * @return the underlying block cipher that we are wrapping.
- */
- public virtual IBlockCipher GetUnderlyingCipher()
- {
- return cipher;
- }
-
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- this.forEncryption = forEncryption;
-
- ICipherParameters cipherParameters;
- if (parameters is AeadParameters)
- {
- AeadParameters param = (AeadParameters) parameters;
-
- nonce = param.GetNonce();
- initialAssociatedText = param.GetAssociatedText();
- macSize = param.MacSize / 8;
- cipherParameters = param.Key;
- }
- else if (parameters is ParametersWithIV)
- {
- ParametersWithIV param = (ParametersWithIV) parameters;
-
- nonce = param.GetIV();
- initialAssociatedText = null;
- macSize = macBlock.Length / 2;
- cipherParameters = param.Parameters;
- }
- else
- {
- throw new ArgumentException("invalid parameters passed to CCM");
- }
-
- // NOTE: Very basic support for key re-use, but no performance gain from it
- if (cipherParameters != null)
- {
- keyParam = cipherParameters;
- }
-
- if (nonce == null || nonce.Length < 7 || nonce.Length > 13)
- {
- throw new ArgumentException("nonce must have length from 7 to 13 octets");
- }
-
- Reset();
- }
-
- public virtual string AlgorithmName
- {
- get { return cipher.AlgorithmName + "/CCM"; }
- }
-
- public virtual int GetBlockSize()
- {
- return cipher.GetBlockSize();
- }
-
- public virtual void ProcessAadByte(byte input)
- {
- associatedText.WriteByte(input);
- }
-
- public virtual void ProcessAadBytes(byte[] inBytes, int inOff, int len)
- {
- // TODO: Process AAD online
- associatedText.Write(inBytes, inOff, len);
- }
-
- public virtual int ProcessByte(
- byte input,
- byte[] outBytes,
- int outOff)
- {
- data.WriteByte(input);
-
- return 0;
- }
-
- public virtual int ProcessBytes(
- byte[] inBytes,
- int inOff,
- int inLen,
- byte[] outBytes,
- int outOff)
- {
- Check.DataLength(inBytes, inOff, inLen, "Input buffer too short");
-
- data.Write(inBytes, inOff, inLen);
-
- return 0;
- }
-
- public virtual int DoFinal(
- byte[] outBytes,
- int outOff)
- {
-#if PORTABLE
- byte[] input = data.ToArray();
- int inLen = input.Length;
-#else
- byte[] input = data.GetBuffer();
- int inLen = (int)data.Position;
-#endif
-
- int len = ProcessPacket(input, 0, inLen, outBytes, outOff);
-
- Reset();
-
- return len;
- }
-
- public virtual void Reset()
- {
- cipher.Reset();
- associatedText.SetLength(0);
- data.SetLength(0);
- }
-
- /**
- * Returns a byte array containing the mac calculated as part of the
- * last encrypt or decrypt operation.
- *
- * @return the last mac calculated.
- */
- public virtual byte[] GetMac()
- {
- return Arrays.CopyOfRange(macBlock, 0, macSize);
- }
-
- public virtual int GetUpdateOutputSize(
- int len)
- {
- return 0;
- }
-
- public virtual int GetOutputSize(
- int len)
- {
- int totalData = (int)data.Length + len;
-
- if (forEncryption)
- {
- return totalData + macSize;
- }
-
- return totalData < macSize ? 0 : totalData - macSize;
- }
-
- /**
- * Process a packet of data for either CCM decryption or encryption.
- *
- * @param in data for processing.
- * @param inOff offset at which data starts in the input array.
- * @param inLen length of the data in the input array.
- * @return a byte array containing the processed input..
- * @throws IllegalStateException if the cipher is not appropriately set up.
- * @throws InvalidCipherTextException if the input data is truncated or the mac check fails.
- */
- public virtual byte[] ProcessPacket(byte[] input, int inOff, int inLen)
- {
- byte[] output;
-
- if (forEncryption)
- {
- output = new byte[inLen + macSize];
- }
- else
- {
- if (inLen < macSize)
- throw new InvalidCipherTextException("data too short");
-
- output = new byte[inLen - macSize];
- }
-
- ProcessPacket(input, inOff, inLen, output, 0);
-
- return output;
- }
-
- /**
- * Process a packet of data for either CCM decryption or encryption.
- *
- * @param in data for processing.
- * @param inOff offset at which data starts in the input array.
- * @param inLen length of the data in the input array.
- * @param output output array.
- * @param outOff offset into output array to start putting processed bytes.
- * @return the number of bytes added to output.
- * @throws IllegalStateException if the cipher is not appropriately set up.
- * @throws InvalidCipherTextException if the input data is truncated or the mac check fails.
- * @throws DataLengthException if output buffer too short.
- */
- public virtual int ProcessPacket(byte[] input, int inOff, int inLen, byte[] output, int outOff)
- {
- // TODO: handle null keyParam (e.g. via RepeatedKeySpec)
- // Need to keep the CTR and CBC Mac parts around and reset
- if (keyParam == null)
- throw new InvalidOperationException("CCM cipher unitialized.");
-
- int n = nonce.Length;
- int q = 15 - n;
- if (q < 4)
- {
- int limitLen = 1 << (8 * q);
- if (inLen >= limitLen)
- throw new InvalidOperationException("CCM packet too large for choice of q.");
- }
-
- byte[] iv = new byte[BlockSize];
- iv[0] = (byte)((q - 1) & 0x7);
- nonce.CopyTo(iv, 1);
-
- IBlockCipher ctrCipher = new SicBlockCipher(cipher);
- ctrCipher.Init(forEncryption, new ParametersWithIV(keyParam, iv));
-
- int outputLen;
- int inIndex = inOff;
- int outIndex = outOff;
-
- if (forEncryption)
- {
- outputLen = inLen + macSize;
- Check.OutputLength(output, outOff, outputLen, "Output buffer too short.");
-
- CalculateMac(input, inOff, inLen, macBlock);
-
- byte[] encMac = new byte[BlockSize];
- ctrCipher.ProcessBlock(macBlock, 0, encMac, 0); // S0
-
- while (inIndex < (inOff + inLen - BlockSize)) // S1...
- {
- ctrCipher.ProcessBlock(input, inIndex, output, outIndex);
- outIndex += BlockSize;
- inIndex += BlockSize;
- }
-
- byte[] block = new byte[BlockSize];
-
- Array.Copy(input, inIndex, block, 0, inLen + inOff - inIndex);
-
- ctrCipher.ProcessBlock(block, 0, block, 0);
-
- Array.Copy(block, 0, output, outIndex, inLen + inOff - inIndex);
-
- Array.Copy(encMac, 0, output, outOff + inLen, macSize);
- }
- else
- {
- if (inLen < macSize)
- throw new InvalidCipherTextException("data too short");
-
- outputLen = inLen - macSize;
- Check.OutputLength(output, outOff, outputLen, "Output buffer too short.");
-
- Array.Copy(input, inOff + outputLen, macBlock, 0, macSize);
-
- ctrCipher.ProcessBlock(macBlock, 0, macBlock, 0);
-
- for (int i = macSize; i != macBlock.Length; i++)
- {
- macBlock[i] = 0;
- }
-
- while (inIndex < (inOff + outputLen - BlockSize))
- {
- ctrCipher.ProcessBlock(input, inIndex, output, outIndex);
- outIndex += BlockSize;
- inIndex += BlockSize;
- }
-
- byte[] block = new byte[BlockSize];
-
- Array.Copy(input, inIndex, block, 0, outputLen - (inIndex - inOff));
-
- ctrCipher.ProcessBlock(block, 0, block, 0);
-
- Array.Copy(block, 0, output, outIndex, outputLen - (inIndex - inOff));
-
- byte[] calculatedMacBlock = new byte[BlockSize];
-
- CalculateMac(output, outOff, outputLen, calculatedMacBlock);
-
- if (!Arrays.ConstantTimeAreEqual(macBlock, calculatedMacBlock))
- throw new InvalidCipherTextException("mac check in CCM failed");
- }
-
- return outputLen;
- }
-
- private int CalculateMac(byte[] data, int dataOff, int dataLen, byte[] macBlock)
- {
- IMac cMac = new CbcBlockCipherMac(cipher, macSize * 8);
-
- cMac.Init(keyParam);
-
- //
- // build b0
- //
- byte[] b0 = new byte[16];
-
- if (HasAssociatedText())
- {
- b0[0] |= 0x40;
- }
-
- b0[0] |= (byte)((((cMac.GetMacSize() - 2) / 2) & 0x7) << 3);
-
- b0[0] |= (byte)(((15 - nonce.Length) - 1) & 0x7);
-
- Array.Copy(nonce, 0, b0, 1, nonce.Length);
-
- int q = dataLen;
- int count = 1;
- while (q > 0)
- {
- b0[b0.Length - count] = (byte)(q & 0xff);
- q >>= 8;
- count++;
- }
-
- cMac.BlockUpdate(b0, 0, b0.Length);
-
- //
- // process associated text
- //
- if (HasAssociatedText())
- {
- int extra;
-
- int textLength = GetAssociatedTextLength();
- if (textLength < ((1 << 16) - (1 << 8)))
- {
- cMac.Update((byte)(textLength >> 8));
- cMac.Update((byte)textLength);
-
- extra = 2;
- }
- else // can't go any higher than 2^32
- {
- cMac.Update((byte)0xff);
- cMac.Update((byte)0xfe);
- cMac.Update((byte)(textLength >> 24));
- cMac.Update((byte)(textLength >> 16));
- cMac.Update((byte)(textLength >> 8));
- cMac.Update((byte)textLength);
-
- extra = 6;
- }
-
- if (initialAssociatedText != null)
- {
- cMac.BlockUpdate(initialAssociatedText, 0, initialAssociatedText.Length);
- }
- if (associatedText.Position > 0)
- {
-#if PORTABLE
- byte[] input = associatedText.ToArray();
- int len = input.Length;
-#else
- byte[] input = associatedText.GetBuffer();
- int len = (int)associatedText.Position;
-#endif
-
- cMac.BlockUpdate(input, 0, len);
- }
-
- extra = (extra + textLength) % 16;
- if (extra != 0)
- {
- for (int i = extra; i < 16; ++i)
- {
- cMac.Update((byte)0x00);
- }
- }
- }
-
- //
- // add the text
- //
- cMac.BlockUpdate(data, dataOff, dataLen);
-
- return cMac.DoFinal(macBlock, 0);
- }
-
- private int GetAssociatedTextLength()
- {
- return (int)associatedText.Length + ((initialAssociatedText == null) ? 0 : initialAssociatedText.Length);
- }
-
- private bool HasAssociatedText()
- {
- return GetAssociatedTextLength() > 0;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/CfbBlockCipher.cs b/BCCrypto/src/crypto/modes/CfbBlockCipher.cs
deleted file mode 100644
index 4337165..0000000
--- a/BCCrypto/src/crypto/modes/CfbBlockCipher.cs
+++ /dev/null
@@ -1,224 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- /**
- * implements a Cipher-FeedBack (CFB) mode on top of a simple cipher.
- */
- public class CfbBlockCipher
- : IBlockCipher
- {
- private byte[] IV;
- private byte[] cfbV;
- private byte[] cfbOutV;
- private bool encrypting;
-
- private readonly int blockSize;
- private readonly IBlockCipher cipher;
-
- /**
- * Basic constructor.
- *
- * @param cipher the block cipher to be used as the basis of the
- * feedback mode.
- * @param blockSize the block size in bits (note: a multiple of 8)
- */
- public CfbBlockCipher(
- IBlockCipher cipher,
- int bitBlockSize)
- {
- this.cipher = cipher;
- this.blockSize = bitBlockSize / 8;
- this.IV = new byte[cipher.GetBlockSize()];
- this.cfbV = new byte[cipher.GetBlockSize()];
- this.cfbOutV = new byte[cipher.GetBlockSize()];
- }
- /**
- * return the underlying block cipher that we are wrapping.
- *
- * @return the underlying block cipher that we are wrapping.
- */
- public IBlockCipher GetUnderlyingCipher()
- {
- return cipher;
- }
- /**
- * Initialise the cipher and, possibly, the initialisation vector (IV).
- * If an IV isn't passed as part of the parameter, the IV will be all zeros.
- * An IV which is too short is handled in FIPS compliant fashion.
- *
- * @param forEncryption if true the cipher is initialised for
- * encryption, if false for decryption.
- * @param param the key and other data required by the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- this.encrypting = forEncryption;
- if (parameters is ParametersWithIV)
- {
- ParametersWithIV ivParam = (ParametersWithIV) parameters;
- byte[] iv = ivParam.GetIV();
- int diff = IV.Length - iv.Length;
- Array.Copy(iv, 0, IV, diff, iv.Length);
- Array.Clear(IV, 0, diff);
-
- parameters = ivParam.Parameters;
- }
- Reset();
-
- // if it's null, key is to be reused.
- if (parameters != null)
- {
- cipher.Init(true, parameters);
- }
- }
-
- /**
- * return the algorithm name and mode.
- *
- * @return the name of the underlying algorithm followed by "/CFB"
- * and the block size in bits.
- */
- public string AlgorithmName
- {
- get { return cipher.AlgorithmName + "/CFB" + (blockSize * 8); }
- }
-
- public bool IsPartialBlockOkay
- {
- get { return true; }
- }
-
- /**
- * return the block size we are operating at.
- *
- * @return the block size we are operating at (in bytes).
- */
- public int GetBlockSize()
- {
- return blockSize;
- }
-
- /**
- * Process one block of input from the array in and write it to
- * the out array.
- *
- * @param in the array containing the input data.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the output data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @exception DataLengthException if there isn't enough data in in, or
- * space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- * @return the number of bytes processed and produced.
- */
- public int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- return (encrypting)
- ? EncryptBlock(input, inOff, output, outOff)
- : DecryptBlock(input, inOff, output, outOff);
- }
-
- /**
- * Do the appropriate processing for CFB mode encryption.
- *
- * @param in the array containing the data to be encrypted.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the encrypted data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @exception DataLengthException if there isn't enough data in in, or
- * space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- * @return the number of bytes processed and produced.
- */
- public int EncryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- if ((inOff + blockSize) > input.Length)
- {
- throw new DataLengthException("input buffer too short");
- }
- if ((outOff + blockSize) > outBytes.Length)
- {
- throw new DataLengthException("output buffer too short");
- }
- cipher.ProcessBlock(cfbV, 0, cfbOutV, 0);
- //
- // XOR the cfbV with the plaintext producing the ciphertext
- //
- for (int i = 0; i < blockSize; i++)
- {
- outBytes[outOff + i] = (byte)(cfbOutV[i] ^ input[inOff + i]);
- }
- //
- // change over the input block.
- //
- Array.Copy(cfbV, blockSize, cfbV, 0, cfbV.Length - blockSize);
- Array.Copy(outBytes, outOff, cfbV, cfbV.Length - blockSize, blockSize);
- return blockSize;
- }
- /**
- * Do the appropriate processing for CFB mode decryption.
- *
- * @param in the array containing the data to be decrypted.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the encrypted data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @exception DataLengthException if there isn't enough data in in, or
- * space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- * @return the number of bytes processed and produced.
- */
- public int DecryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- if ((inOff + blockSize) > input.Length)
- {
- throw new DataLengthException("input buffer too short");
- }
- if ((outOff + blockSize) > outBytes.Length)
- {
- throw new DataLengthException("output buffer too short");
- }
- cipher.ProcessBlock(cfbV, 0, cfbOutV, 0);
- //
- // change over the input block.
- //
- Array.Copy(cfbV, blockSize, cfbV, 0, cfbV.Length - blockSize);
- Array.Copy(input, inOff, cfbV, cfbV.Length - blockSize, blockSize);
- //
- // XOR the cfbV with the ciphertext producing the plaintext
- //
- for (int i = 0; i < blockSize; i++)
- {
- outBytes[outOff + i] = (byte)(cfbOutV[i] ^ input[inOff + i]);
- }
- return blockSize;
- }
- /**
- * reset the chaining vector back to the IV and reset the underlying
- * cipher.
- */
- public void Reset()
- {
- Array.Copy(IV, 0, cfbV, 0, IV.Length);
- cipher.Reset();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/CtsBlockCipher.cs b/BCCrypto/src/crypto/modes/CtsBlockCipher.cs
deleted file mode 100644
index ff37844..0000000
--- a/BCCrypto/src/crypto/modes/CtsBlockCipher.cs
+++ /dev/null
@@ -1,253 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- /**
- * A Cipher Text Stealing (CTS) mode cipher. CTS allows block ciphers to
- * be used to produce cipher text which is the same outLength as the plain text.
- */
- public class CtsBlockCipher
- : BufferedBlockCipher
- {
- private readonly int blockSize;
-
- /**
- * Create a buffered block cipher that uses Cipher Text Stealing
- *
- * @param cipher the underlying block cipher this buffering object wraps.
- */
- public CtsBlockCipher(
- IBlockCipher cipher)
- {
- // TODO Should this test for acceptable ones instead?
- if (cipher is OfbBlockCipher || cipher is CfbBlockCipher)
- throw new ArgumentException("CtsBlockCipher can only accept ECB, or CBC ciphers");
-
- this.cipher = cipher;
-
- blockSize = cipher.GetBlockSize();
-
- buf = new byte[blockSize * 2];
- bufOff = 0;
- }
-
- /**
- * return the size of the output buffer required for an update of 'length' bytes.
- *
- * @param length the outLength of the input.
- * @return the space required to accommodate a call to update
- * with length bytes of input.
- */
- public override int GetUpdateOutputSize(
- int length)
- {
- int total = length + bufOff;
- int leftOver = total % buf.Length;
-
- if (leftOver == 0)
- {
- return total - buf.Length;
- }
-
- return total - leftOver;
- }
-
- /**
- * return the size of the output buffer required for an update plus a
- * doFinal with an input of length bytes.
- *
- * @param length the outLength of the input.
- * @return the space required to accommodate a call to update and doFinal
- * with length bytes of input.
- */
- public override int GetOutputSize(
- int length)
- {
- return length + bufOff;
- }
-
- /**
- * process a single byte, producing an output block if necessary.
- *
- * @param in the input byte.
- * @param out the space for any output that might be produced.
- * @param outOff the offset from which the output will be copied.
- * @return the number of output bytes copied to out.
- * @exception DataLengthException if there isn't enough space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- */
- public override int ProcessByte(
- byte input,
- byte[] output,
- int outOff)
- {
- int resultLen = 0;
-
- if (bufOff == buf.Length)
- {
- resultLen = cipher.ProcessBlock(buf, 0, output, outOff);
- Debug.Assert(resultLen == blockSize);
-
- Array.Copy(buf, blockSize, buf, 0, blockSize);
- bufOff = blockSize;
- }
-
- buf[bufOff++] = input;
-
- return resultLen;
- }
-
- /**
- * process an array of bytes, producing output if necessary.
- *
- * @param in the input byte array.
- * @param inOff the offset at which the input data starts.
- * @param length the number of bytes to be copied out of the input array.
- * @param out the space for any output that might be produced.
- * @param outOff the offset from which the output will be copied.
- * @return the number of output bytes copied to out.
- * @exception DataLengthException if there isn't enough space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- */
- public override int ProcessBytes(
- byte[] input,
- int inOff,
- int length,
- byte[] output,
- int outOff)
- {
- if (length < 0)
- {
- throw new ArgumentException("Can't have a negative input outLength!");
- }
-
- int blockSize = GetBlockSize();
- int outLength = GetUpdateOutputSize(length);
-
- if (outLength > 0)
- {
- if ((outOff + outLength) > output.Length)
- {
- throw new DataLengthException("output buffer too short");
- }
- }
-
- int resultLen = 0;
- int gapLen = buf.Length - bufOff;
-
- if (length > gapLen)
- {
- Array.Copy(input, inOff, buf, bufOff, gapLen);
-
- resultLen += cipher.ProcessBlock(buf, 0, output, outOff);
- Array.Copy(buf, blockSize, buf, 0, blockSize);
-
- bufOff = blockSize;
-
- length -= gapLen;
- inOff += gapLen;
-
- while (length > blockSize)
- {
- Array.Copy(input, inOff, buf, bufOff, blockSize);
- resultLen += cipher.ProcessBlock(buf, 0, output, outOff + resultLen);
- Array.Copy(buf, blockSize, buf, 0, blockSize);
-
- length -= blockSize;
- inOff += blockSize;
- }
- }
-
- Array.Copy(input, inOff, buf, bufOff, length);
-
- bufOff += length;
-
- return resultLen;
- }
-
- /**
- * Process the last block in the buffer.
- *
- * @param out the array the block currently being held is copied into.
- * @param outOff the offset at which the copying starts.
- * @return the number of output bytes copied to out.
- * @exception DataLengthException if there is insufficient space in out for
- * the output.
- * @exception InvalidOperationException if the underlying cipher is not
- * initialised.
- * @exception InvalidCipherTextException if cipher text decrypts wrongly (in
- * case the exception will never Get thrown).
- */
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- if (bufOff + outOff > output.Length)
- {
- throw new DataLengthException("output buffer too small in doFinal");
- }
-
- int blockSize = cipher.GetBlockSize();
- int length = bufOff - blockSize;
- byte[] block = new byte[blockSize];
-
- if (forEncryption)
- {
- cipher.ProcessBlock(buf, 0, block, 0);
-
- if (bufOff < blockSize)
- {
- throw new DataLengthException("need at least one block of input for CTS");
- }
-
- for (int i = bufOff; i != buf.Length; i++)
- {
- buf[i] = block[i - blockSize];
- }
-
- for (int i = blockSize; i != bufOff; i++)
- {
- buf[i] ^= block[i - blockSize];
- }
-
- IBlockCipher c = (cipher is CbcBlockCipher)
- ? ((CbcBlockCipher)cipher).GetUnderlyingCipher()
- : cipher;
-
- c.ProcessBlock(buf, blockSize, output, outOff);
-
- Array.Copy(block, 0, output, outOff + blockSize, length);
- }
- else
- {
- byte[] lastBlock = new byte[blockSize];
-
- IBlockCipher c = (cipher is CbcBlockCipher)
- ? ((CbcBlockCipher)cipher).GetUnderlyingCipher()
- : cipher;
-
- c.ProcessBlock(buf, 0, block, 0);
-
- for (int i = blockSize; i != bufOff; i++)
- {
- lastBlock[i - blockSize] = (byte)(block[i - blockSize] ^ buf[i]);
- }
-
- Array.Copy(buf, blockSize, block, 0, length);
-
- cipher.ProcessBlock(block, 0, output, outOff);
- Array.Copy(lastBlock, 0, output, outOff + blockSize, length);
- }
-
- int offset = bufOff;
-
- Reset();
-
- return offset;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/EAXBlockCipher.cs b/BCCrypto/src/crypto/modes/EAXBlockCipher.cs
deleted file mode 100644
index 624f385..0000000
--- a/BCCrypto/src/crypto/modes/EAXBlockCipher.cs
+++ /dev/null
@@ -1,379 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- /**
- * A Two-Pass Authenticated-Encryption Scheme Optimized for Simplicity and
- * Efficiency - by M. Bellare, P. Rogaway, D. Wagner.
- *
- * http://www.cs.ucdavis.edu/~rogaway/papers/eax.pdf
- *
- * EAX is an AEAD scheme based on CTR and OMAC1/CMAC, that uses a single block
- * cipher to encrypt and authenticate data. It's on-line (the length of a
- * message isn't needed to begin processing it), has good performances, it's
- * simple and provably secure (provided the underlying block cipher is secure).
- *
- * Of course, this implementations is NOT thread-safe.
- */
- public class EaxBlockCipher
- : IAeadBlockCipher
- {
- private enum Tag : byte { N, H, C };
-
- private SicBlockCipher cipher;
-
- private bool forEncryption;
-
- private int blockSize;
-
- private IMac mac;
-
- private byte[] nonceMac;
- private byte[] associatedTextMac;
- private byte[] macBlock;
-
- private int macSize;
- private byte[] bufBlock;
- private int bufOff;
-
- private bool cipherInitialized;
- private byte[] initialAssociatedText;
-
- /**
- * Constructor that accepts an instance of a block cipher engine.
- *
- * @param cipher the engine to use
- */
- public EaxBlockCipher(
- IBlockCipher cipher)
- {
- blockSize = cipher.GetBlockSize();
- mac = new CMac(cipher);
- macBlock = new byte[blockSize];
- associatedTextMac = new byte[mac.GetMacSize()];
- nonceMac = new byte[mac.GetMacSize()];
- this.cipher = new SicBlockCipher(cipher);
- }
-
- public virtual string AlgorithmName
- {
- get { return cipher.GetUnderlyingCipher().AlgorithmName + "/EAX"; }
- }
-
- public virtual IBlockCipher GetUnderlyingCipher()
- {
- return cipher;
- }
-
- public virtual int GetBlockSize()
- {
- return cipher.GetBlockSize();
- }
-
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- this.forEncryption = forEncryption;
-
- byte[] nonce;
- ICipherParameters keyParam;
-
- if (parameters is AeadParameters)
- {
- AeadParameters param = (AeadParameters) parameters;
-
- nonce = param.GetNonce();
- initialAssociatedText = param.GetAssociatedText();
- macSize = param.MacSize / 8;
- keyParam = param.Key;
- }
- else if (parameters is ParametersWithIV)
- {
- ParametersWithIV param = (ParametersWithIV) parameters;
-
- nonce = param.GetIV();
- initialAssociatedText = null;
- macSize = mac.GetMacSize() / 2;
- keyParam = param.Parameters;
- }
- else
- {
- throw new ArgumentException("invalid parameters passed to EAX");
- }
-
- bufBlock = new byte[forEncryption ? blockSize : (blockSize + macSize)];
-
- byte[] tag = new byte[blockSize];
-
- // Key reuse implemented in CBC mode of underlying CMac
- mac.Init(keyParam);
-
- tag[blockSize - 1] = (byte)Tag.N;
- mac.BlockUpdate(tag, 0, blockSize);
- mac.BlockUpdate(nonce, 0, nonce.Length);
- mac.DoFinal(nonceMac, 0);
-
- // Same BlockCipher underlies this and the mac, so reuse last key on cipher
- cipher.Init(true, new ParametersWithIV(null, nonceMac));
-
- Reset();
- }
-
- private void InitCipher()
- {
- if (cipherInitialized)
- {
- return;
- }
-
- cipherInitialized = true;
-
- mac.DoFinal(associatedTextMac, 0);
-
- byte[] tag = new byte[blockSize];
- tag[blockSize - 1] = (byte)Tag.C;
- mac.BlockUpdate(tag, 0, blockSize);
- }
-
- private void CalculateMac()
- {
- byte[] outC = new byte[blockSize];
- mac.DoFinal(outC, 0);
-
- for (int i = 0; i < macBlock.Length; i++)
- {
- macBlock[i] = (byte)(nonceMac[i] ^ associatedTextMac[i] ^ outC[i]);
- }
- }
-
- public virtual void Reset()
- {
- Reset(true);
- }
-
- private void Reset(
- bool clearMac)
- {
- cipher.Reset(); // TODO Redundant since the mac will reset it?
- mac.Reset();
-
- bufOff = 0;
- Array.Clear(bufBlock, 0, bufBlock.Length);
-
- if (clearMac)
- {
- Array.Clear(macBlock, 0, macBlock.Length);
- }
-
- byte[] tag = new byte[blockSize];
- tag[blockSize - 1] = (byte)Tag.H;
- mac.BlockUpdate(tag, 0, blockSize);
-
- cipherInitialized = false;
-
- if (initialAssociatedText != null)
- {
- ProcessAadBytes(initialAssociatedText, 0, initialAssociatedText.Length);
- }
- }
-
- public virtual void ProcessAadByte(byte input)
- {
- if (cipherInitialized)
- {
- throw new InvalidOperationException("AAD data cannot be added after encryption/decryption processing has begun.");
- }
- mac.Update(input);
- }
-
- public virtual void ProcessAadBytes(byte[] inBytes, int inOff, int len)
- {
- if (cipherInitialized)
- {
- throw new InvalidOperationException("AAD data cannot be added after encryption/decryption processing has begun.");
- }
- mac.BlockUpdate(inBytes, inOff, len);
- }
-
- public virtual int ProcessByte(
- byte input,
- byte[] outBytes,
- int outOff)
- {
- InitCipher();
-
- return Process(input, outBytes, outOff);
- }
-
- public virtual int ProcessBytes(
- byte[] inBytes,
- int inOff,
- int len,
- byte[] outBytes,
- int outOff)
- {
- InitCipher();
-
- int resultLen = 0;
-
- for (int i = 0; i != len; i++)
- {
- resultLen += Process(inBytes[inOff + i], outBytes, outOff + resultLen);
- }
-
- return resultLen;
- }
-
- public virtual int DoFinal(
- byte[] outBytes,
- int outOff)
- {
- InitCipher();
-
- int extra = bufOff;
- byte[] tmp = new byte[bufBlock.Length];
-
- bufOff = 0;
-
- if (forEncryption)
- {
- Check.OutputLength(outBytes, outOff, extra + macSize, "Output buffer too short");
-
- cipher.ProcessBlock(bufBlock, 0, tmp, 0);
-
- Array.Copy(tmp, 0, outBytes, outOff, extra);
-
- mac.BlockUpdate(tmp, 0, extra);
-
- CalculateMac();
-
- Array.Copy(macBlock, 0, outBytes, outOff + extra, macSize);
-
- Reset(false);
-
- return extra + macSize;
- }
- else
- {
- if (extra < macSize)
- throw new InvalidCipherTextException("data too short");
-
- Check.OutputLength(outBytes, outOff, extra - macSize, "Output buffer too short");
-
- if (extra > macSize)
- {
- mac.BlockUpdate(bufBlock, 0, extra - macSize);
-
- cipher.ProcessBlock(bufBlock, 0, tmp, 0);
-
- Array.Copy(tmp, 0, outBytes, outOff, extra - macSize);
- }
-
- CalculateMac();
-
- if (!VerifyMac(bufBlock, extra - macSize))
- throw new InvalidCipherTextException("mac check in EAX failed");
-
- Reset(false);
-
- return extra - macSize;
- }
- }
-
- public virtual byte[] GetMac()
- {
- byte[] mac = new byte[macSize];
-
- Array.Copy(macBlock, 0, mac, 0, macSize);
-
- return mac;
- }
-
- public virtual int GetUpdateOutputSize(
- int len)
- {
- int totalData = len + bufOff;
- if (!forEncryption)
- {
- if (totalData < macSize)
- {
- return 0;
- }
- totalData -= macSize;
- }
- return totalData - totalData % blockSize;
- }
-
- public virtual int GetOutputSize(
- int len)
- {
- int totalData = len + bufOff;
-
- if (forEncryption)
- {
- return totalData + macSize;
- }
-
- return totalData < macSize ? 0 : totalData - macSize;
- }
-
- private int Process(
- byte b,
- byte[] outBytes,
- int outOff)
- {
- bufBlock[bufOff++] = b;
-
- if (bufOff == bufBlock.Length)
- {
- Check.OutputLength(outBytes, outOff, blockSize, "Output buffer is too short");
-
- // TODO Could move the ProcessByte(s) calls to here
-// InitCipher();
-
- int size;
-
- if (forEncryption)
- {
- size = cipher.ProcessBlock(bufBlock, 0, outBytes, outOff);
-
- mac.BlockUpdate(outBytes, outOff, blockSize);
- }
- else
- {
- mac.BlockUpdate(bufBlock, 0, blockSize);
-
- size = cipher.ProcessBlock(bufBlock, 0, outBytes, outOff);
- }
-
- bufOff = 0;
- if (!forEncryption)
- {
- Array.Copy(bufBlock, blockSize, bufBlock, 0, macSize);
- bufOff = macSize;
- }
-
- return size;
- }
-
- return 0;
- }
-
- private bool VerifyMac(byte[] mac, int off)
- {
- int nonEqual = 0;
-
- for (int i = 0; i < macSize; i++)
- {
- nonEqual |= (macBlock[i] ^ mac[off + i]);
- }
-
- return nonEqual == 0;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/GCMBlockCipher.cs b/BCCrypto/src/crypto/modes/GCMBlockCipher.cs
deleted file mode 100644
index a6cd004..0000000
--- a/BCCrypto/src/crypto/modes/GCMBlockCipher.cs
+++ /dev/null
@@ -1,594 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Modes.Gcm;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- ///
- /// Implements the Galois/Counter mode (GCM) detailed in
- /// NIST Special Publication 800-38D.
- ///
- public class GcmBlockCipher
- : IAeadBlockCipher
- {
- private const int BlockSize = 16;
-
- private readonly IBlockCipher cipher;
- private readonly IGcmMultiplier multiplier;
- private IGcmExponentiator exp;
-
- // These fields are set by Init and not modified by processing
- private bool forEncryption;
- private bool initialised;
- private int macSize;
- private byte[] lastKey;
- private byte[] nonce;
- private byte[] initialAssociatedText;
- private byte[] H;
- private byte[] J0;
-
- // These fields are modified during processing
- private byte[] bufBlock;
- private byte[] macBlock;
- private byte[] S, S_at, S_atPre;
- private byte[] counter;
- private uint blocksRemaining;
- private int bufOff;
- private ulong totalLength;
- private byte[] atBlock;
- private int atBlockPos;
- private ulong atLength;
- private ulong atLengthPre;
-
- public GcmBlockCipher(
- IBlockCipher c)
- : this(c, null)
- {
- }
-
- public GcmBlockCipher(
- IBlockCipher c,
- IGcmMultiplier m)
- {
- if (c.GetBlockSize() != BlockSize)
- throw new ArgumentException("cipher required with a block size of " + BlockSize + ".");
-
- if (m == null)
- {
- // TODO Consider a static property specifying default multiplier
- m = new Tables8kGcmMultiplier();
- }
-
- this.cipher = c;
- this.multiplier = m;
- }
-
- public virtual string AlgorithmName
- {
- get { return cipher.AlgorithmName + "/GCM"; }
- }
-
- public IBlockCipher GetUnderlyingCipher()
- {
- return cipher;
- }
-
- public virtual int GetBlockSize()
- {
- return BlockSize;
- }
-
- ///
- /// MAC sizes from 32 bits to 128 bits (must be a multiple of 8) are supported. The default is 128 bits.
- /// Sizes less than 96 are not recommended, but are supported for specialized applications.
- ///
- public virtual void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- this.forEncryption = forEncryption;
- this.macBlock = null;
- this.initialised = true;
-
- KeyParameter keyParam;
- byte[] newNonce = null;
-
- if (parameters is AeadParameters)
- {
- AeadParameters param = (AeadParameters)parameters;
-
- newNonce = param.GetNonce();
- initialAssociatedText = param.GetAssociatedText();
-
- int macSizeBits = param.MacSize;
- if (macSizeBits < 32 || macSizeBits > 128 || macSizeBits % 8 != 0)
- {
- throw new ArgumentException("Invalid value for MAC size: " + macSizeBits);
- }
-
- macSize = macSizeBits / 8;
- keyParam = param.Key;
- }
- else if (parameters is ParametersWithIV)
- {
- ParametersWithIV param = (ParametersWithIV)parameters;
-
- newNonce = param.GetIV();
- initialAssociatedText = null;
- macSize = 16;
- keyParam = (KeyParameter)param.Parameters;
- }
- else
- {
- throw new ArgumentException("invalid parameters passed to GCM");
- }
-
- int bufLength = forEncryption ? BlockSize : (BlockSize + macSize);
- this.bufBlock = new byte[bufLength];
-
- if (newNonce == null || newNonce.Length < 1)
- {
- throw new ArgumentException("IV must be at least 1 byte");
- }
-
- if (forEncryption)
- {
- if (nonce != null && Arrays.AreEqual(nonce, newNonce))
- {
- if (keyParam == null)
- {
- throw new ArgumentException("cannot reuse nonce for GCM encryption");
- }
- if (lastKey != null && Arrays.AreEqual(lastKey, keyParam.GetKey()))
- {
- throw new ArgumentException("cannot reuse nonce for GCM encryption");
- }
- }
- }
-
- nonce = newNonce;
- if (keyParam != null)
- {
- lastKey = keyParam.GetKey();
- }
-
- // TODO Restrict macSize to 16 if nonce length not 12?
-
- // Cipher always used in forward mode
- // if keyParam is null we're reusing the last key.
- if (keyParam != null)
- {
- cipher.Init(true, keyParam);
-
- this.H = new byte[BlockSize];
- cipher.ProcessBlock(H, 0, H, 0);
-
- // if keyParam is null we're reusing the last key and the multiplier doesn't need re-init
- multiplier.Init(H);
- exp = null;
- }
- else if (this.H == null)
- {
- throw new ArgumentException("Key must be specified in initial init");
- }
-
- this.J0 = new byte[BlockSize];
-
- if (nonce.Length == 12)
- {
- Array.Copy(nonce, 0, J0, 0, nonce.Length);
- this.J0[BlockSize - 1] = 0x01;
- }
- else
- {
- gHASH(J0, nonce, nonce.Length);
- byte[] X = new byte[BlockSize];
- Pack.UInt64_To_BE((ulong)nonce.Length * 8UL, X, 8);
- gHASHBlock(J0, X);
- }
-
- this.S = new byte[BlockSize];
- this.S_at = new byte[BlockSize];
- this.S_atPre = new byte[BlockSize];
- this.atBlock = new byte[BlockSize];
- this.atBlockPos = 0;
- this.atLength = 0;
- this.atLengthPre = 0;
- this.counter = Arrays.Clone(J0);
- this.blocksRemaining = uint.MaxValue - 1; // page 8, len(P) <= 2^39 - 256, 1 block used by tag
- this.bufOff = 0;
- this.totalLength = 0;
-
- if (initialAssociatedText != null)
- {
- ProcessAadBytes(initialAssociatedText, 0, initialAssociatedText.Length);
- }
- }
-
- public virtual byte[] GetMac()
- {
- return macBlock == null
- ? new byte[macSize]
- : Arrays.Clone(macBlock);
- }
-
- public virtual int GetOutputSize(
- int len)
- {
- int totalData = len + bufOff;
-
- if (forEncryption)
- {
- return totalData + macSize;
- }
-
- return totalData < macSize ? 0 : totalData - macSize;
- }
-
- public virtual int GetUpdateOutputSize(
- int len)
- {
- int totalData = len + bufOff;
- if (!forEncryption)
- {
- if (totalData < macSize)
- {
- return 0;
- }
- totalData -= macSize;
- }
- return totalData - totalData % BlockSize;
- }
-
- public virtual void ProcessAadByte(byte input)
- {
- CheckStatus();
-
- atBlock[atBlockPos] = input;
- if (++atBlockPos == BlockSize)
- {
- // Hash each block as it fills
- gHASHBlock(S_at, atBlock);
- atBlockPos = 0;
- atLength += BlockSize;
- }
- }
-
- public virtual void ProcessAadBytes(byte[] inBytes, int inOff, int len)
- {
- CheckStatus();
-
- for (int i = 0; i < len; ++i)
- {
- atBlock[atBlockPos] = inBytes[inOff + i];
- if (++atBlockPos == BlockSize)
- {
- // Hash each block as it fills
- gHASHBlock(S_at, atBlock);
- atBlockPos = 0;
- atLength += BlockSize;
- }
- }
- }
-
- private void InitCipher()
- {
- if (atLength > 0)
- {
- Array.Copy(S_at, 0, S_atPre, 0, BlockSize);
- atLengthPre = atLength;
- }
-
- // Finish hash for partial AAD block
- if (atBlockPos > 0)
- {
- gHASHPartial(S_atPre, atBlock, 0, atBlockPos);
- atLengthPre += (uint)atBlockPos;
- }
-
- if (atLengthPre > 0)
- {
- Array.Copy(S_atPre, 0, S, 0, BlockSize);
- }
- }
-
- public virtual int ProcessByte(
- byte input,
- byte[] output,
- int outOff)
- {
- CheckStatus();
-
- bufBlock[bufOff] = input;
- if (++bufOff == bufBlock.Length)
- {
- OutputBlock(output, outOff);
- return BlockSize;
- }
- return 0;
- }
-
- public virtual int ProcessBytes(
- byte[] input,
- int inOff,
- int len,
- byte[] output,
- int outOff)
- {
- CheckStatus();
-
- if (input.Length < (inOff + len))
- throw new DataLengthException("Input buffer too short");
-
- int resultLen = 0;
-
- for (int i = 0; i < len; ++i)
- {
- bufBlock[bufOff] = input[inOff + i];
- if (++bufOff == bufBlock.Length)
- {
- OutputBlock(output, outOff + resultLen);
- resultLen += BlockSize;
- }
- }
-
- return resultLen;
- }
-
- private void OutputBlock(byte[] output, int offset)
- {
- Check.OutputLength(output, offset, BlockSize, "Output buffer too short");
- if (totalLength == 0)
- {
- InitCipher();
- }
- gCTRBlock(bufBlock, output, offset);
- if (forEncryption)
- {
- bufOff = 0;
- }
- else
- {
- Array.Copy(bufBlock, BlockSize, bufBlock, 0, macSize);
- bufOff = macSize;
- }
- }
-
- public int DoFinal(byte[] output, int outOff)
- {
- CheckStatus();
-
- if (totalLength == 0)
- {
- InitCipher();
- }
-
- int extra = bufOff;
-
- if (forEncryption)
- {
- Check.OutputLength(output, outOff, extra + macSize, "Output buffer too short");
- }
- else
- {
- if (extra < macSize)
- throw new InvalidCipherTextException("data too short");
-
- extra -= macSize;
-
- Check.OutputLength(output, outOff, extra, "Output buffer too short");
- }
-
- if (extra > 0)
- {
- gCTRPartial(bufBlock, 0, extra, output, outOff);
- }
-
- atLength += (uint)atBlockPos;
-
- if (atLength > atLengthPre)
- {
- /*
- * Some AAD was sent after the cipher started. We determine the difference b/w the hash value
- * we actually used when the cipher started (S_atPre) and the final hash value calculated (S_at).
- * Then we carry this difference forward by multiplying by H^c, where c is the number of (full or
- * partial) cipher-text blocks produced, and adjust the current hash.
- */
-
- // Finish hash for partial AAD block
- if (atBlockPos > 0)
- {
- gHASHPartial(S_at, atBlock, 0, atBlockPos);
- }
-
- // Find the difference between the AAD hashes
- if (atLengthPre > 0)
- {
- GcmUtilities.Xor(S_at, S_atPre);
- }
-
- // Number of cipher-text blocks produced
- long c = (long)(((totalLength * 8) + 127) >> 7);
-
- // Calculate the adjustment factor
- byte[] H_c = new byte[16];
- if (exp == null)
- {
- exp = new Tables1kGcmExponentiator();
- exp.Init(H);
- }
- exp.ExponentiateX(c, H_c);
-
- // Carry the difference forward
- GcmUtilities.Multiply(S_at, H_c);
-
- // Adjust the current hash
- GcmUtilities.Xor(S, S_at);
- }
-
- // Final gHASH
- byte[] X = new byte[BlockSize];
- Pack.UInt64_To_BE(atLength * 8UL, X, 0);
- Pack.UInt64_To_BE(totalLength * 8UL, X, 8);
-
- gHASHBlock(S, X);
-
- // T = MSBt(GCTRk(J0,S))
- byte[] tag = new byte[BlockSize];
- cipher.ProcessBlock(J0, 0, tag, 0);
- GcmUtilities.Xor(tag, S);
-
- int resultLen = extra;
-
- // We place into macBlock our calculated value for T
- this.macBlock = new byte[macSize];
- Array.Copy(tag, 0, macBlock, 0, macSize);
-
- if (forEncryption)
- {
- // Append T to the message
- Array.Copy(macBlock, 0, output, outOff + bufOff, macSize);
- resultLen += macSize;
- }
- else
- {
- // Retrieve the T value from the message and compare to calculated one
- byte[] msgMac = new byte[macSize];
- Array.Copy(bufBlock, extra, msgMac, 0, macSize);
- if (!Arrays.ConstantTimeAreEqual(this.macBlock, msgMac))
- throw new InvalidCipherTextException("mac check in GCM failed");
- }
-
- Reset(false);
-
- return resultLen;
- }
-
- public virtual void Reset()
- {
- Reset(true);
- }
-
- private void Reset(
- bool clearMac)
- {
- cipher.Reset();
-
- // note: we do not reset the nonce.
-
- S = new byte[BlockSize];
- S_at = new byte[BlockSize];
- S_atPre = new byte[BlockSize];
- atBlock = new byte[BlockSize];
- atBlockPos = 0;
- atLength = 0;
- atLengthPre = 0;
- counter = Arrays.Clone(J0);
- blocksRemaining = uint.MaxValue - 1;
- bufOff = 0;
- totalLength = 0;
-
- if (bufBlock != null)
- {
- Arrays.Fill(bufBlock, 0);
- }
-
- if (clearMac)
- {
- macBlock = null;
- }
-
- if (forEncryption)
- {
- initialised = false;
- }
- else
- {
- if (initialAssociatedText != null)
- {
- ProcessAadBytes(initialAssociatedText, 0, initialAssociatedText.Length);
- }
- }
- }
-
- private void gCTRBlock(byte[] block, byte[] output, int outOff)
- {
- byte[] tmp = GetNextCounterBlock();
-
- GcmUtilities.Xor(tmp, block);
- Array.Copy(tmp, 0, output, outOff, BlockSize);
-
- gHASHBlock(S, forEncryption ? tmp : block);
-
- totalLength += BlockSize;
- }
-
- private void gCTRPartial(byte[] buf, int off, int len, byte[] output, int outOff)
- {
- byte[] tmp = GetNextCounterBlock();
-
- GcmUtilities.Xor(tmp, buf, off, len);
- Array.Copy(tmp, 0, output, outOff, len);
-
- gHASHPartial(S, forEncryption ? tmp : buf, 0, len);
-
- totalLength += (uint)len;
- }
-
- private void gHASH(byte[] Y, byte[] b, int len)
- {
- for (int pos = 0; pos < len; pos += BlockSize)
- {
- int num = System.Math.Min(len - pos, BlockSize);
- gHASHPartial(Y, b, pos, num);
- }
- }
-
- private void gHASHBlock(byte[] Y, byte[] b)
- {
- GcmUtilities.Xor(Y, b);
- multiplier.MultiplyH(Y);
- }
-
- private void gHASHPartial(byte[] Y, byte[] b, int off, int len)
- {
- GcmUtilities.Xor(Y, b, off, len);
- multiplier.MultiplyH(Y);
- }
-
- private byte[] GetNextCounterBlock()
- {
- if (blocksRemaining == 0)
- throw new InvalidOperationException("Attempt to process too many blocks");
-
- blocksRemaining--;
-
- uint c = 1;
- c += counter[15]; counter[15] = (byte)c; c >>= 8;
- c += counter[14]; counter[14] = (byte)c; c >>= 8;
- c += counter[13]; counter[13] = (byte)c; c >>= 8;
- c += counter[12]; counter[12] = (byte)c;
-
- byte[] tmp = new byte[BlockSize];
- // TODO Sure would be nice if ciphers could operate on int[]
- cipher.ProcessBlock(counter, 0, tmp, 0);
- return tmp;
- }
-
- private void CheckStatus()
- {
- if (!initialised)
- {
- if (forEncryption)
- {
- throw new InvalidOperationException("GCM cipher cannot be reused for encryption");
- }
- throw new InvalidOperationException("GCM cipher needs to be initialised");
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/GOFBBlockCipher.cs b/BCCrypto/src/crypto/modes/GOFBBlockCipher.cs
deleted file mode 100644
index 436b58a..0000000
--- a/BCCrypto/src/crypto/modes/GOFBBlockCipher.cs
+++ /dev/null
@@ -1,234 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- /**
- * implements the GOST 28147 OFB counter mode (GCTR).
- */
- public class GOfbBlockCipher
- : IBlockCipher
- {
- private byte[] IV;
- private byte[] ofbV;
- private byte[] ofbOutV;
-
- private readonly int blockSize;
- private readonly IBlockCipher cipher;
-
- bool firstStep = true;
- int N3;
- int N4;
- const int C1 = 16843012; //00000001000000010000000100000100
- const int C2 = 16843009; //00000001000000010000000100000001
-
- /**
- * Basic constructor.
- *
- * @param cipher the block cipher to be used as the basis of the
- * counter mode (must have a 64 bit block size).
- */
- public GOfbBlockCipher(
- IBlockCipher cipher)
- {
- this.cipher = cipher;
- this.blockSize = cipher.GetBlockSize();
-
- if (blockSize != 8)
- {
- throw new ArgumentException("GCTR only for 64 bit block ciphers");
- }
-
- this.IV = new byte[cipher.GetBlockSize()];
- this.ofbV = new byte[cipher.GetBlockSize()];
- this.ofbOutV = new byte[cipher.GetBlockSize()];
- }
-
- /**
- * return the underlying block cipher that we are wrapping.
- *
- * @return the underlying block cipher that we are wrapping.
- */
- public IBlockCipher GetUnderlyingCipher()
- {
- return cipher;
- }
-
- /**
- * Initialise the cipher and, possibly, the initialisation vector (IV).
- * If an IV isn't passed as part of the parameter, the IV will be all zeros.
- * An IV which is too short is handled in FIPS compliant fashion.
- *
- * @param encrypting if true the cipher is initialised for
- * encryption, if false for decryption.
- * @param parameters the key and other data required by the cipher.
- * @exception ArgumentException if the parameters argument is inappropriate.
- */
- public void Init(
- bool forEncryption, //ignored by this CTR mode
- ICipherParameters parameters)
- {
- firstStep = true;
- N3 = 0;
- N4 = 0;
-
- if (parameters is ParametersWithIV)
- {
- ParametersWithIV ivParam = (ParametersWithIV)parameters;
- byte[] iv = ivParam.GetIV();
-
- if (iv.Length < IV.Length)
- {
- // prepend the supplied IV with zeros (per FIPS PUB 81)
- Array.Copy(iv, 0, IV, IV.Length - iv.Length, iv.Length);
- for (int i = 0; i < IV.Length - iv.Length; i++)
- {
- IV[i] = 0;
- }
- }
- else
- {
- Array.Copy(iv, 0, IV, 0, IV.Length);
- }
-
- parameters = ivParam.Parameters;
- }
-
- Reset();
-
- // if it's null, key is to be reused.
- if (parameters != null)
- {
- cipher.Init(true, parameters);
- }
- }
-
- /**
- * return the algorithm name and mode.
- *
- * @return the name of the underlying algorithm followed by "/GCTR"
- * and the block size in bits
- */
- public string AlgorithmName
- {
- get { return cipher.AlgorithmName + "/GCTR"; }
- }
-
- public bool IsPartialBlockOkay
- {
- get { return true; }
- }
-
- /**
- * return the block size we are operating at (in bytes).
- *
- * @return the block size we are operating at (in bytes).
- */
- public int GetBlockSize()
- {
- return blockSize;
- }
-
- /**
- * Process one block of input from the array in and write it to
- * the out array.
- *
- * @param in the array containing the input data.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the output data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @exception DataLengthException if there isn't enough data in in, or
- * space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- * @return the number of bytes processed and produced.
- */
- public int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if ((inOff + blockSize) > input.Length)
- {
- throw new DataLengthException("input buffer too short");
- }
-
- if ((outOff + blockSize) > output.Length)
- {
- throw new DataLengthException("output buffer too short");
- }
-
- if (firstStep)
- {
- firstStep = false;
- cipher.ProcessBlock(ofbV, 0, ofbOutV, 0);
- N3 = bytesToint(ofbOutV, 0);
- N4 = bytesToint(ofbOutV, 4);
- }
- N3 += C2;
- N4 += C1;
- if (N4 < C1) // addition is mod (2**32 - 1)
- {
- if (N4 > 0)
- {
- N4++;
- }
- }
- intTobytes(N3, ofbV, 0);
- intTobytes(N4, ofbV, 4);
-
- cipher.ProcessBlock(ofbV, 0, ofbOutV, 0);
-
- //
- // XOR the ofbV with the plaintext producing the cipher text (and
- // the next input block).
- //
- for (int i = 0; i < blockSize; i++)
- {
- output[outOff + i] = (byte)(ofbOutV[i] ^ input[inOff + i]);
- }
-
- //
- // change over the input block.
- //
- Array.Copy(ofbV, blockSize, ofbV, 0, ofbV.Length - blockSize);
- Array.Copy(ofbOutV, 0, ofbV, ofbV.Length - blockSize, blockSize);
-
- return blockSize;
- }
-
- /**
- * reset the feedback vector back to the IV and reset the underlying
- * cipher.
- */
- public void Reset()
- {
- Array.Copy(IV, 0, ofbV, 0, IV.Length);
-
- cipher.Reset();
- }
-
- //array of bytes to type int
- private int bytesToint(
- byte[] inBytes,
- int inOff)
- {
- return (int)((inBytes[inOff + 3] << 24) & 0xff000000) + ((inBytes[inOff + 2] << 16) & 0xff0000) +
- ((inBytes[inOff + 1] << 8) & 0xff00) + (inBytes[inOff] & 0xff);
- }
-
- //int to array of bytes
- private void intTobytes(
- int num,
- byte[] outBytes,
- int outOff)
- {
- outBytes[outOff + 3] = (byte)(num >> 24);
- outBytes[outOff + 2] = (byte)(num >> 16);
- outBytes[outOff + 1] = (byte)(num >> 8);
- outBytes[outOff] = (byte)num;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/IAeadBlockCipher.cs b/BCCrypto/src/crypto/modes/IAeadBlockCipher.cs
deleted file mode 100644
index 52c4ff4..0000000
--- a/BCCrypto/src/crypto/modes/IAeadBlockCipher.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- ///
- /// A block cipher mode that includes authenticated encryption with a streaming mode
- /// and optional associated data.
- ///
- public interface IAeadBlockCipher
- {
- /// The name of the algorithm this cipher implements.
- string AlgorithmName { get; }
-
- /// The block cipher underlying this algorithm.
- IBlockCipher GetUnderlyingCipher();
-
- /// Initialise the cipher.
- /// Parameter can either be an AeadParameters or a ParametersWithIV object.
- /// Initialise for encryption if true, for decryption if false.
- /// The key or other data required by the cipher.
- void Init(bool forEncryption, ICipherParameters parameters);
-
- /// The block size for this cipher, in bytes.
- int GetBlockSize();
-
- /// Add a single byte to the associated data check.
- /// If the implementation supports it, this will be an online operation and will not retain the associated data.
- /// The byte to be processed.
- void ProcessAadByte(byte input);
-
- /// Add a sequence of bytes to the associated data check.
- /// If the implementation supports it, this will be an online operation and will not retain the associated data.
- /// The input byte array.
- /// The offset into the input array where the data to be processed starts.
- /// The number of bytes to be processed.
- void ProcessAadBytes(byte[] inBytes, int inOff, int len);
-
- /**
- * Encrypt/decrypt a single byte.
- *
- * @param input the byte to be processed.
- * @param outBytes the output buffer the processed byte goes into.
- * @param outOff the offset into the output byte array the processed data starts at.
- * @return the number of bytes written to out.
- * @exception DataLengthException if the output buffer is too small.
- */
- int ProcessByte(byte input, byte[] outBytes, int outOff);
-
- /**
- * Process a block of bytes from in putting the result into out.
- *
- * @param inBytes the input byte array.
- * @param inOff the offset into the in array where the data to be processed starts.
- * @param len the number of bytes to be processed.
- * @param outBytes the output buffer the processed bytes go into.
- * @param outOff the offset into the output byte array the processed data starts at.
- * @return the number of bytes written to out.
- * @exception DataLengthException if the output buffer is too small.
- */
- int ProcessBytes(byte[] inBytes, int inOff, int len, byte[] outBytes, int outOff);
-
- /**
- * Finish the operation either appending or verifying the MAC at the end of the data.
- *
- * @param outBytes space for any resulting output data.
- * @param outOff offset into out to start copying the data at.
- * @return number of bytes written into out.
- * @throws InvalidOperationException if the cipher is in an inappropriate state.
- * @throws InvalidCipherTextException if the MAC fails to match.
- */
- int DoFinal(byte[] outBytes, int outOff);
-
- /**
- * Return the value of the MAC associated with the last stream processed.
- *
- * @return MAC for plaintext data.
- */
- byte[] GetMac();
-
- /**
- * Return the size of the output buffer required for a ProcessBytes
- * an input of len bytes.
- *
- * @param len the length of the input.
- * @return the space required to accommodate a call to ProcessBytes
- * with len bytes of input.
- */
- int GetUpdateOutputSize(int len);
-
- /**
- * Return the size of the output buffer required for a ProcessBytes plus a
- * DoFinal with an input of len bytes.
- *
- * @param len the length of the input.
- * @return the space required to accommodate a call to ProcessBytes and DoFinal
- * with len bytes of input.
- */
- int GetOutputSize(int len);
-
- ///
- /// Reset the cipher to the same state as it was after the last init (if there was one).
- ///
- void Reset();
- }
-}
diff --git a/BCCrypto/src/crypto/modes/KCcmBlockCipher.cs b/BCCrypto/src/crypto/modes/KCcmBlockCipher.cs
deleted file mode 100644
index 4f78214..0000000
--- a/BCCrypto/src/crypto/modes/KCcmBlockCipher.cs
+++ /dev/null
@@ -1,490 +0,0 @@
-using System;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- public class KCcmBlockCipher: IAeadBlockCipher
- {
- private static readonly int BYTES_IN_INT = 4;
- private static readonly int BITS_IN_BYTE = 8;
-
- private static readonly int MAX_MAC_BIT_LENGTH = 512;
- private static readonly int MIN_MAC_BIT_LENGTH = 64;
-
- private IBlockCipher engine;
-
- private int macSize;
- private bool forEncryption;
-
- private byte[] initialAssociatedText;
- private byte[] mac;
- private byte[] macBlock;
-
- private byte[] nonce;
-
- private byte[] G1;
- private byte[] buffer;
-
- private byte[] s;
- private byte[] counter;
-
- private readonly MemoryStream associatedText = new MemoryStream();
- private readonly MemoryStream data = new MemoryStream();
-
- /*
- *
- *
- */
- private int Nb_ = 4;
-
- private void setNb(int Nb)
- {
- if (Nb == 4 || Nb == 6 || Nb == 8)
- {
- Nb_ = Nb;
- }
- else
- {
- throw new ArgumentException("Nb = 4 is recommended by DSTU7624 but can be changed to only 6 or 8 in this implementation");
- }
- }
-
- ///
- /// Base constructor. Nb value is set to 4.
- ///
- /// base cipher to use under CCM.
- public KCcmBlockCipher(IBlockCipher engine): this(engine, 4)
- {
- }
-
- ///
- /// Constructor allowing Nb configuration.
- ///
- /// Nb is a parameter specified in CCM mode of DSTU7624 standard.
- /// This parameter specifies maximum possible length of input.It should
- /// be calculated as follows: Nb = 1 / 8 * (-3 + log[2]Nmax) + 1,
- /// where Nmax - length of input message in bits.For practical reasons
- /// Nmax usually less than 4Gb, e.g. for Nmax = 2^32 - 1, Nb = 4.
- ///
- /// base cipher to use under CCM.
- /// Nb value to use.
- public KCcmBlockCipher(IBlockCipher engine, int Nb)
- {
- this.engine = engine;
- this.macSize = engine.GetBlockSize();
- this.nonce = new byte[engine.GetBlockSize()];
- this.initialAssociatedText = new byte[engine.GetBlockSize()];
- this.mac = new byte[engine.GetBlockSize()];
- this.macBlock = new byte[engine.GetBlockSize()];
- this.G1 = new byte[engine.GetBlockSize()];
- this.buffer = new byte[engine.GetBlockSize()];
- this.s = new byte[engine.GetBlockSize()];
- this.counter = new byte[engine.GetBlockSize()];
- setNb(Nb);
- }
-
- public virtual void Init(bool forEncryption, ICipherParameters parameters)
- {
-
- ICipherParameters cipherParameters;
- if (parameters is AeadParameters)
- {
-
- AeadParameters param = (AeadParameters)parameters;
-
- if (param.MacSize > MAX_MAC_BIT_LENGTH || param.MacSize < MIN_MAC_BIT_LENGTH || param.MacSize % 8 != 0)
- {
- throw new ArgumentException("Invalid mac size specified");
- }
-
- nonce = param.GetNonce();
- macSize = param.MacSize / BITS_IN_BYTE;
- initialAssociatedText = param.GetAssociatedText();
- cipherParameters = param.Key;
- }
- else if (parameters is ParametersWithIV)
- {
- nonce = ((ParametersWithIV)parameters).GetIV();
- macSize = engine.GetBlockSize(); // use default blockSize for MAC if it is not specified
- initialAssociatedText = null;
- cipherParameters = ((ParametersWithIV)parameters).Parameters;
- }
- else
- {
- throw new ArgumentException("Invalid parameters specified");
- }
-
- this.mac = new byte[macSize];
- this.forEncryption = forEncryption;
- engine.Init(true, cipherParameters);
-
- counter[0] = 0x01; // defined in standard
-
- if (initialAssociatedText != null)
- {
- ProcessAadBytes(initialAssociatedText, 0, initialAssociatedText.Length);
- }
- }
-
- public virtual String AlgorithmName
- {
- get
- {
- return engine.AlgorithmName + "/KCCM";
- }
- }
-
- public virtual int GetBlockSize()
- {
- return engine.GetBlockSize();
- }
-
- public virtual IBlockCipher GetUnderlyingCipher()
- {
- return engine;
- }
-
- public virtual void ProcessAadByte(byte input)
- {
- associatedText.WriteByte(input);
- }
-
- public virtual void ProcessAadBytes(byte[] input, int inOff, int len)
- {
- associatedText.Write(input, inOff, len);
- }
-
- private void ProcessAAD(byte[] assocText, int assocOff, int assocLen, int dataLen)
- {
- if (assocLen - assocOff < engine.GetBlockSize())
- {
- throw new ArgumentException("authText buffer too short");
- }
- if (assocLen % engine.GetBlockSize() != 0)
- {
- throw new ArgumentException("padding not supported");
- }
-
- Array.Copy(nonce, 0, G1, 0, nonce.Length - Nb_ - 1);
-
- intToBytes(dataLen, buffer, 0); // for G1
-
- Array.Copy(buffer, 0, G1, nonce.Length - Nb_ - 1, BYTES_IN_INT);
-
- G1[G1.Length - 1] = getFlag(true, macSize);
-
- engine.ProcessBlock(G1, 0, macBlock, 0);
-
- intToBytes(assocLen, buffer, 0); // for G2
-
- if (assocLen <= engine.GetBlockSize() - Nb_)
- {
- for (int byteIndex = 0; byteIndex < assocLen; byteIndex++)
- {
- buffer[byteIndex + Nb_] ^= assocText[assocOff + byteIndex];
- }
-
- for (int byteIndex = 0; byteIndex < engine.GetBlockSize(); byteIndex++)
- {
- macBlock[byteIndex] ^= buffer[byteIndex];
- }
-
- engine.ProcessBlock(macBlock, 0, macBlock, 0);
-
- return;
- }
-
- for (int byteIndex = 0; byteIndex < engine.GetBlockSize(); byteIndex++)
- {
- macBlock[byteIndex] ^= buffer[byteIndex];
- }
-
- engine.ProcessBlock(macBlock, 0, macBlock, 0);
-
- int authLen = assocLen;
- while (authLen != 0)
- {
- for (int byteIndex = 0; byteIndex < engine.GetBlockSize(); byteIndex++)
- {
- macBlock[byteIndex] ^= assocText[byteIndex + assocOff];
- }
-
- engine.ProcessBlock(macBlock, 0, macBlock, 0);
-
- assocOff += engine.GetBlockSize();
- authLen -= engine.GetBlockSize();
- }
- }
-
- public virtual int ProcessByte(byte input, byte[] output, int outOff)
- {
- data.WriteByte(input);
-
- return 0;
- }
-
- public virtual int ProcessBytes(byte[] input, int inOff, int inLen, byte[] output, int outOff)
- {
- Check.DataLength(input, inOff, inLen, "input buffer too short");
-
- data.Write(input, inOff, inLen);
-
- return 0;
- }
-
- public int ProcessPacket(byte[] input, int inOff, int len, byte[] output, int outOff)
- {
- Check.DataLength(input, inOff, len, "input buffer too short");
- Check.OutputLength(output, outOff, len, "output buffer too short");
-
- if (associatedText.Length > 0)
- {
-#if PORTABLE
- byte[] aad = associatedText.ToArray();
- int aadLen = aad.Length;
-#else
- byte[] aad = associatedText.GetBuffer();
- int aadLen = (int)associatedText.Length;
-#endif
-
- int dataLen = forEncryption ? (int)data.Length : ((int)data.Length - macSize);
-
- ProcessAAD(aad, 0, aadLen, dataLen);
- }
-
- if (forEncryption)
- {
- Check.DataLength(len % engine.GetBlockSize() != 0, "partial blocks not supported");
-
- CalculateMac(input, inOff, len);
- engine.ProcessBlock(nonce, 0, s, 0);
-
- int totalLength = len;
- while (totalLength > 0)
- {
- ProcessBlock(input, inOff, len, output, outOff);
- totalLength -= engine.GetBlockSize();
- inOff += engine.GetBlockSize();
- outOff += engine.GetBlockSize();
- }
-
- for (int byteIndex = 0; byteIndex inOff)
- {
- for (int byteIndex = 0; byteIndex 0)
- {
- for (int byteIndex = 0; byteIndex < engine.GetBlockSize(); byteIndex++)
- {
- macBlock[byteIndex] ^= authText[authOff + byteIndex];
- }
-
- engine.ProcessBlock(macBlock, 0, macBlock, 0);
-
- totalLen -= engine.GetBlockSize();
- authOff += engine.GetBlockSize();
- }
- }
-
- public virtual int DoFinal(byte[] output, int outOff)
- {
-#if PORTABLE
- byte[] buf = data.ToArray();
- int bufLen = buf.Length;
-#else
- byte[] buf = data.GetBuffer();
- int bufLen = (int)data.Length;
-#endif
-
- int len = ProcessPacket(buf, 0, bufLen, output, outOff);
-
- Reset();
-
- return len;
- }
-
- public virtual byte[] GetMac()
- {
- return Arrays.Clone(mac);
- }
-
- public virtual int GetUpdateOutputSize(int len)
- {
- return len;
- }
-
- public virtual int GetOutputSize(int len)
- {
- return len + macSize;
- }
-
- public virtual void Reset()
- {
- Arrays.Fill(G1, (byte)0);
- Arrays.Fill(buffer, (byte)0);
- Arrays.Fill(counter, (byte)0);
- Arrays.Fill(macBlock, (byte)0);
-
- counter[0] = 0x01;
- data.SetLength(0);
- associatedText.SetLength(0);
-
- if (initialAssociatedText != null)
- {
- ProcessAadBytes(initialAssociatedText, 0, initialAssociatedText.Length);
- }
- }
-
- private void intToBytes(
- int num,
- byte[] outBytes,
- int outOff)
- {
- outBytes[outOff + 3] = (byte)(num >> 24);
- outBytes[outOff + 2] = (byte)(num >> 16);
- outBytes[outOff + 1] = (byte)(num >> 8);
- outBytes[outOff] = (byte)num;
- }
-
- private byte getFlag(bool authTextPresents, int macSize)
- {
- StringBuilder flagByte = new StringBuilder();
-
- if (authTextPresents)
- {
- flagByte.Append("1");
- }
- else
- {
- flagByte.Append("0");
- }
-
-
- switch (macSize)
- {
- case 8:
- flagByte.Append("010"); // binary 2
- break;
- case 16:
- flagByte.Append("011"); // binary 3
- break;
- case 32:
- flagByte.Append("100"); // binary 4
- break;
- case 48:
- flagByte.Append("101"); // binary 5
- break;
- case 64:
- flagByte.Append("110"); // binary 6
- break;
- }
-
- String binaryNb = Convert.ToString(Nb_ - 1, 2);
- while (binaryNb.Length < 4)
- {
- binaryNb = new StringBuilder(binaryNb).Insert(0, "0").ToString();
- }
-
- flagByte.Append(binaryNb);
-
- return (byte)Convert.ToInt32(flagByte.ToString(), 2);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/KCtrBlockCipher.cs b/BCCrypto/src/crypto/modes/KCtrBlockCipher.cs
deleted file mode 100644
index 918b0ba..0000000
--- a/BCCrypto/src/crypto/modes/KCtrBlockCipher.cs
+++ /dev/null
@@ -1,235 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- /**
- * Implements a Gamming or Counter (CTR) mode on top of a DSTU 7624 block cipher.
- */
- public class KCtrBlockCipher : IStreamCipher, IBlockCipher
- {
- private byte[] IV;
- private byte[] ofbV;
- private byte[] ofbOutV;
- private bool initialised;
-
- private int byteCount;
-
- private readonly int blockSize;
- private readonly IBlockCipher cipher;
-
- /**
- * Basic constructor.
- *
- * @param cipher the block cipher to be used as the basis of the
- * feedback mode.
- */
- public KCtrBlockCipher(IBlockCipher cipher)
- {
- this.cipher = cipher;
- this.IV = new byte[cipher.GetBlockSize()];
- this.blockSize = cipher.GetBlockSize();
-
- this.ofbV = new byte[cipher.GetBlockSize()];
- this.ofbOutV = new byte[cipher.GetBlockSize()];
- }
-
- /**
- * return the underlying block cipher that we are wrapping.
- *
- * @return the underlying block cipher that we are wrapping.
- */
- public IBlockCipher GetUnderlyingCipher()
- {
- return cipher;
- }
- /**
- * Initialise the cipher and, possibly, the initialisation vector (IV).
- * If an IV isn't passed as part of the parameter, the IV will be all zeros.
- * An IV which is too short is handled in FIPS compliant fashion.
- *
- * @param forEncryption if true the cipher is initialised for
- * encryption, if false for decryption.
- * @param param the key and other data required by the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- this.initialised = true;
- if (parameters is ParametersWithIV)
- {
- ParametersWithIV ivParam = (ParametersWithIV)parameters;
- byte[] iv = ivParam.GetIV();
- int diff = IV.Length - iv.Length;
-
- Array.Clear(IV, 0, IV.Length);
- Array.Copy(iv, 0, IV, diff, iv.Length);
-
- parameters = ivParam.Parameters;
- }
- else
- {
- throw new ArgumentException("Invalid parameter passed");
- }
-
- // if it's null, key is to be reused.
- if (parameters != null)
- {
- cipher.Init(true, parameters);
- }
-
- Reset();
- }
-
- /**
- * return the algorithm name and mode.
- *
- * @return the name of the underlying algorithm followed by "/KCTR"
- * and the block size in bits.
- */
- public string AlgorithmName
- {
- get { return cipher.AlgorithmName + "/KCTR"; }
- }
-
- public bool IsPartialBlockOkay
- {
- get { return true; }
- }
-
- /**
- * return the block size we are operating at.
- *
- * @return the block size we are operating at (in bytes).
- */
- public int GetBlockSize()
- {
- return cipher.GetBlockSize();
- }
-
- public byte ReturnByte(byte input)
- {
- return CalculateByte(input);
- }
-
- public void ProcessBytes(byte[] input, int inOff, int len, byte[] output, int outOff)
- {
- if (outOff + len > output.Length)
- {
- throw new DataLengthException("Output buffer too short");
- }
-
- if (inOff + len > input.Length)
- {
- throw new DataLengthException("Input buffer too small");
- }
-
- int inStart = inOff;
- int inEnd = inOff + len;
- int outStart = outOff;
-
- while (inStartRFC 7253 on The OCB
- * Authenticated-Encryption Algorithm, licensed per:
- *
- * License for
- * Open-Source Software Implementations of OCB (Jan 9, 2013) - 'License 1'
- * Under this license, you are authorized to make, use, and distribute open-source software
- * implementations of OCB. This license terminates for you if you sue someone over their open-source
- * software implementation of OCB claiming that you have a patent covering their implementation.
- *
- * This is a non-binding summary of a legal document (the link above). The parameters of the license
- * are specified in the license document and that document is controlling.
- */
- public class OcbBlockCipher
- : IAeadBlockCipher
- {
- private const int BLOCK_SIZE = 16;
-
- private readonly IBlockCipher hashCipher;
- private readonly IBlockCipher mainCipher;
-
- /*
- * CONFIGURATION
- */
- private bool forEncryption;
- private int macSize;
- private byte[] initialAssociatedText;
-
- /*
- * KEY-DEPENDENT
- */
- // NOTE: elements are lazily calculated
- private IList L;
- private byte[] L_Asterisk, L_Dollar;
-
- /*
- * NONCE-DEPENDENT
- */
- private byte[] KtopInput = null;
- private byte[] Stretch = new byte[24];
- private byte[] OffsetMAIN_0 = new byte[16];
-
- /*
- * PER-ENCRYPTION/DECRYPTION
- */
- private byte[] hashBlock, mainBlock;
- private int hashBlockPos, mainBlockPos;
- private long hashBlockCount, mainBlockCount;
- private byte[] OffsetHASH;
- private byte[] Sum;
- private byte[] OffsetMAIN = new byte[16];
- private byte[] Checksum;
-
- // NOTE: The MAC value is preserved after doFinal
- private byte[] macBlock;
-
- public OcbBlockCipher(IBlockCipher hashCipher, IBlockCipher mainCipher)
- {
- if (hashCipher == null)
- throw new ArgumentNullException("hashCipher");
- if (hashCipher.GetBlockSize() != BLOCK_SIZE)
- throw new ArgumentException("must have a block size of " + BLOCK_SIZE, "hashCipher");
- if (mainCipher == null)
- throw new ArgumentNullException("mainCipher");
- if (mainCipher.GetBlockSize() != BLOCK_SIZE)
- throw new ArgumentException("must have a block size of " + BLOCK_SIZE, "mainCipher");
-
- if (!hashCipher.AlgorithmName.Equals(mainCipher.AlgorithmName))
- throw new ArgumentException("'hashCipher' and 'mainCipher' must be the same algorithm");
-
- this.hashCipher = hashCipher;
- this.mainCipher = mainCipher;
- }
-
- public virtual IBlockCipher GetUnderlyingCipher()
- {
- return mainCipher;
- }
-
- public virtual string AlgorithmName
- {
- get { return mainCipher.AlgorithmName + "/OCB"; }
- }
-
- public virtual void Init(bool forEncryption, ICipherParameters parameters)
- {
- bool oldForEncryption = this.forEncryption;
- this.forEncryption = forEncryption;
- this.macBlock = null;
-
- KeyParameter keyParameter;
-
- byte[] N;
- if (parameters is AeadParameters)
- {
- AeadParameters aeadParameters = (AeadParameters) parameters;
-
- N = aeadParameters.GetNonce();
- initialAssociatedText = aeadParameters.GetAssociatedText();
-
- int macSizeBits = aeadParameters.MacSize;
- if (macSizeBits < 64 || macSizeBits > 128 || macSizeBits % 8 != 0)
- throw new ArgumentException("Invalid value for MAC size: " + macSizeBits);
-
- macSize = macSizeBits / 8;
- keyParameter = aeadParameters.Key;
- }
- else if (parameters is ParametersWithIV)
- {
- ParametersWithIV parametersWithIV = (ParametersWithIV) parameters;
-
- N = parametersWithIV.GetIV();
- initialAssociatedText = null;
- macSize = 16;
- keyParameter = (KeyParameter) parametersWithIV.Parameters;
- }
- else
- {
- throw new ArgumentException("invalid parameters passed to OCB");
- }
-
- this.hashBlock = new byte[16];
- this.mainBlock = new byte[forEncryption ? BLOCK_SIZE : (BLOCK_SIZE + macSize)];
-
- if (N == null)
- {
- N = new byte[0];
- }
-
- if (N.Length > 15)
- {
- throw new ArgumentException("IV must be no more than 15 bytes");
- }
-
- /*
- * KEY-DEPENDENT INITIALISATION
- */
-
- if (keyParameter != null)
- {
- // hashCipher always used in forward mode
- hashCipher.Init(true, keyParameter);
- mainCipher.Init(forEncryption, keyParameter);
- KtopInput = null;
- }
- else if (oldForEncryption != forEncryption)
- {
- throw new ArgumentException("cannot change encrypting state without providing key.");
- }
-
- this.L_Asterisk = new byte[16];
- hashCipher.ProcessBlock(L_Asterisk, 0, L_Asterisk, 0);
-
- this.L_Dollar = OCB_double(L_Asterisk);
-
- this.L = Platform.CreateArrayList();
- this.L.Add(OCB_double(L_Dollar));
-
- /*
- * NONCE-DEPENDENT AND PER-ENCRYPTION/DECRYPTION INITIALISATION
- */
-
- int bottom = ProcessNonce(N);
-
- int bits = bottom % 8, bytes = bottom / 8;
- if (bits == 0)
- {
- Array.Copy(Stretch, bytes, OffsetMAIN_0, 0, 16);
- }
- else
- {
- for (int i = 0; i < 16; ++i)
- {
- uint b1 = Stretch[bytes];
- uint b2 = Stretch[++bytes];
- this.OffsetMAIN_0[i] = (byte) ((b1 << bits) | (b2 >> (8 - bits)));
- }
- }
-
- this.hashBlockPos = 0;
- this.mainBlockPos = 0;
-
- this.hashBlockCount = 0;
- this.mainBlockCount = 0;
-
- this.OffsetHASH = new byte[16];
- this.Sum = new byte[16];
- Array.Copy(OffsetMAIN_0, 0, OffsetMAIN, 0, 16);
- this.Checksum = new byte[16];
-
- if (initialAssociatedText != null)
- {
- ProcessAadBytes(initialAssociatedText, 0, initialAssociatedText.Length);
- }
- }
-
- protected virtual int ProcessNonce(byte[] N)
- {
- byte[] nonce = new byte[16];
- Array.Copy(N, 0, nonce, nonce.Length - N.Length, N.Length);
- nonce[0] = (byte)(macSize << 4);
- nonce[15 - N.Length] |= 1;
-
- int bottom = nonce[15] & 0x3F;
- nonce[15] &= 0xC0;
-
- /*
- * When used with incrementing nonces, the cipher is only applied once every 64 inits.
- */
- if (KtopInput == null || !Arrays.AreEqual(nonce, KtopInput))
- {
- byte[] Ktop = new byte[16];
- KtopInput = nonce;
- hashCipher.ProcessBlock(KtopInput, 0, Ktop, 0);
- Array.Copy(Ktop, 0, Stretch, 0, 16);
- for (int i = 0; i < 8; ++i)
- {
- Stretch[16 + i] = (byte)(Ktop[i] ^ Ktop[i + 1]);
- }
- }
-
- return bottom;
- }
-
- public virtual int GetBlockSize()
- {
- return BLOCK_SIZE;
- }
-
- public virtual byte[] GetMac()
- {
- return macBlock == null
- ? new byte[macSize]
- : Arrays.Clone(macBlock);
- }
-
- public virtual int GetOutputSize(int len)
- {
- int totalData = len + mainBlockPos;
- if (forEncryption)
- {
- return totalData + macSize;
- }
- return totalData < macSize ? 0 : totalData - macSize;
- }
-
- public virtual int GetUpdateOutputSize(int len)
- {
- int totalData = len + mainBlockPos;
- if (!forEncryption)
- {
- if (totalData < macSize)
- {
- return 0;
- }
- totalData -= macSize;
- }
- return totalData - totalData % BLOCK_SIZE;
- }
-
- public virtual void ProcessAadByte(byte input)
- {
- hashBlock[hashBlockPos] = input;
- if (++hashBlockPos == hashBlock.Length)
- {
- ProcessHashBlock();
- }
- }
-
- public virtual void ProcessAadBytes(byte[] input, int off, int len)
- {
- for (int i = 0; i < len; ++i)
- {
- hashBlock[hashBlockPos] = input[off + i];
- if (++hashBlockPos == hashBlock.Length)
- {
- ProcessHashBlock();
- }
- }
- }
-
- public virtual int ProcessByte(byte input, byte[] output, int outOff)
- {
- mainBlock[mainBlockPos] = input;
- if (++mainBlockPos == mainBlock.Length)
- {
- ProcessMainBlock(output, outOff);
- return BLOCK_SIZE;
- }
- return 0;
- }
-
- public virtual int ProcessBytes(byte[] input, int inOff, int len, byte[] output, int outOff)
- {
- int resultLen = 0;
-
- for (int i = 0; i < len; ++i)
- {
- mainBlock[mainBlockPos] = input[inOff + i];
- if (++mainBlockPos == mainBlock.Length)
- {
- ProcessMainBlock(output, outOff + resultLen);
- resultLen += BLOCK_SIZE;
- }
- }
-
- return resultLen;
- }
-
- public virtual int DoFinal(byte[] output, int outOff)
- {
- /*
- * For decryption, get the tag from the end of the message
- */
- byte[] tag = null;
- if (!forEncryption) {
- if (mainBlockPos < macSize)
- throw new InvalidCipherTextException("data too short");
-
- mainBlockPos -= macSize;
- tag = new byte[macSize];
- Array.Copy(mainBlock, mainBlockPos, tag, 0, macSize);
- }
-
- /*
- * HASH: Process any final partial block; compute final hash value
- */
- if (hashBlockPos > 0)
- {
- OCB_extend(hashBlock, hashBlockPos);
- UpdateHASH(L_Asterisk);
- }
-
- /*
- * OCB-ENCRYPT/OCB-DECRYPT: Process any final partial block
- */
- if (mainBlockPos > 0)
- {
- if (forEncryption)
- {
- OCB_extend(mainBlock, mainBlockPos);
- Xor(Checksum, mainBlock);
- }
-
- Xor(OffsetMAIN, L_Asterisk);
-
- byte[] Pad = new byte[16];
- hashCipher.ProcessBlock(OffsetMAIN, 0, Pad, 0);
-
- Xor(mainBlock, Pad);
-
- Check.OutputLength(output, outOff, mainBlockPos, "Output buffer too short");
- Array.Copy(mainBlock, 0, output, outOff, mainBlockPos);
-
- if (!forEncryption)
- {
- OCB_extend(mainBlock, mainBlockPos);
- Xor(Checksum, mainBlock);
- }
- }
-
- /*
- * OCB-ENCRYPT/OCB-DECRYPT: Compute raw tag
- */
- Xor(Checksum, OffsetMAIN);
- Xor(Checksum, L_Dollar);
- hashCipher.ProcessBlock(Checksum, 0, Checksum, 0);
- Xor(Checksum, Sum);
-
- this.macBlock = new byte[macSize];
- Array.Copy(Checksum, 0, macBlock, 0, macSize);
-
- /*
- * Validate or append tag and reset this cipher for the next run
- */
- int resultLen = mainBlockPos;
-
- if (forEncryption)
- {
- Check.OutputLength(output, outOff, resultLen + macSize, "Output buffer too short");
-
- // Append tag to the message
- Array.Copy(macBlock, 0, output, outOff + resultLen, macSize);
- resultLen += macSize;
- }
- else
- {
- // Compare the tag from the message with the calculated one
- if (!Arrays.ConstantTimeAreEqual(macBlock, tag))
- throw new InvalidCipherTextException("mac check in OCB failed");
- }
-
- Reset(false);
-
- return resultLen;
- }
-
- public virtual void Reset()
- {
- Reset(true);
- }
-
- protected virtual void Clear(byte[] bs)
- {
- if (bs != null)
- {
- Array.Clear(bs, 0, bs.Length);
- }
- }
-
- protected virtual byte[] GetLSub(int n)
- {
- while (n >= L.Count)
- {
- L.Add(OCB_double((byte[]) L[L.Count - 1]));
- }
- return (byte[])L[n];
- }
-
- protected virtual void ProcessHashBlock()
- {
- /*
- * HASH: Process any whole blocks
- */
- UpdateHASH(GetLSub(OCB_ntz(++hashBlockCount)));
- hashBlockPos = 0;
- }
-
- protected virtual void ProcessMainBlock(byte[] output, int outOff)
- {
- Check.DataLength(output, outOff, BLOCK_SIZE, "Output buffer too short");
-
- /*
- * OCB-ENCRYPT/OCB-DECRYPT: Process any whole blocks
- */
-
- if (forEncryption)
- {
- Xor(Checksum, mainBlock);
- mainBlockPos = 0;
- }
-
- Xor(OffsetMAIN, GetLSub(OCB_ntz(++mainBlockCount)));
-
- Xor(mainBlock, OffsetMAIN);
- mainCipher.ProcessBlock(mainBlock, 0, mainBlock, 0);
- Xor(mainBlock, OffsetMAIN);
-
- Array.Copy(mainBlock, 0, output, outOff, 16);
-
- if (!forEncryption)
- {
- Xor(Checksum, mainBlock);
- Array.Copy(mainBlock, BLOCK_SIZE, mainBlock, 0, macSize);
- mainBlockPos = macSize;
- }
- }
-
- protected virtual void Reset(bool clearMac)
- {
- hashCipher.Reset();
- mainCipher.Reset();
-
- Clear(hashBlock);
- Clear(mainBlock);
-
- hashBlockPos = 0;
- mainBlockPos = 0;
-
- hashBlockCount = 0;
- mainBlockCount = 0;
-
- Clear(OffsetHASH);
- Clear(Sum);
- Array.Copy(OffsetMAIN_0, 0, OffsetMAIN, 0, 16);
- Clear(Checksum);
-
- if (clearMac)
- {
- macBlock = null;
- }
-
- if (initialAssociatedText != null)
- {
- ProcessAadBytes(initialAssociatedText, 0, initialAssociatedText.Length);
- }
- }
-
- protected virtual void UpdateHASH(byte[] LSub)
- {
- Xor(OffsetHASH, LSub);
- Xor(hashBlock, OffsetHASH);
- hashCipher.ProcessBlock(hashBlock, 0, hashBlock, 0);
- Xor(Sum, hashBlock);
- }
-
- protected static byte[] OCB_double(byte[] block)
- {
- byte[] result = new byte[16];
- int carry = ShiftLeft(block, result);
-
- /*
- * NOTE: This construction is an attempt at a constant-time implementation.
- */
- result[15] ^= (byte)(0x87 >> ((1 - carry) << 3));
-
- return result;
- }
-
- protected static void OCB_extend(byte[] block, int pos)
- {
- block[pos] = (byte) 0x80;
- while (++pos < 16)
- {
- block[pos] = 0;
- }
- }
-
- protected static int OCB_ntz(long x)
- {
- if (x == 0)
- {
- return 64;
- }
-
- int n = 0;
- ulong ux = (ulong)x;
- while ((ux & 1UL) == 0UL)
- {
- ++n;
- ux >>= 1;
- }
- return n;
- }
-
- protected static int ShiftLeft(byte[] block, byte[] output)
- {
- int i = 16;
- uint bit = 0;
- while (--i >= 0)
- {
- uint b = block[i];
- output[i] = (byte) ((b << 1) | bit);
- bit = (b >> 7) & 1;
- }
- return (int)bit;
- }
-
- protected static void Xor(byte[] block, byte[] val)
- {
- for (int i = 15; i >= 0; --i)
- {
- block[i] ^= val[i];
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/OfbBlockCipher.cs b/BCCrypto/src/crypto/modes/OfbBlockCipher.cs
deleted file mode 100644
index a99f8c5..0000000
--- a/BCCrypto/src/crypto/modes/OfbBlockCipher.cs
+++ /dev/null
@@ -1,182 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- /**
- * implements a Output-FeedBack (OFB) mode on top of a simple cipher.
- */
- public class OfbBlockCipher
- : IBlockCipher
- {
- private byte[] IV;
- private byte[] ofbV;
- private byte[] ofbOutV;
-
- private readonly int blockSize;
- private readonly IBlockCipher cipher;
-
- /**
- * Basic constructor.
- *
- * @param cipher the block cipher to be used as the basis of the
- * feedback mode.
- * @param blockSize the block size in bits (note: a multiple of 8)
- */
- public OfbBlockCipher(
- IBlockCipher cipher,
- int blockSize)
- {
- this.cipher = cipher;
- this.blockSize = blockSize / 8;
-
- this.IV = new byte[cipher.GetBlockSize()];
- this.ofbV = new byte[cipher.GetBlockSize()];
- this.ofbOutV = new byte[cipher.GetBlockSize()];
- }
-
- /**
- * return the underlying block cipher that we are wrapping.
- *
- * @return the underlying block cipher that we are wrapping.
- */
- public IBlockCipher GetUnderlyingCipher()
- {
- return cipher;
- }
-
- /**
- * Initialise the cipher and, possibly, the initialisation vector (IV).
- * If an IV isn't passed as part of the parameter, the IV will be all zeros.
- * An IV which is too short is handled in FIPS compliant fashion.
- *
- * @param forEncryption if true the cipher is initialised for
- * encryption, if false for decryption.
- * @param param the key and other data required by the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public void Init(
- bool forEncryption, //ignored by this OFB mode
- ICipherParameters parameters)
- {
- if (parameters is ParametersWithIV)
- {
- ParametersWithIV ivParam = (ParametersWithIV)parameters;
- byte[] iv = ivParam.GetIV();
-
- if (iv.Length < IV.Length)
- {
- // prepend the supplied IV with zeros (per FIPS PUB 81)
- Array.Copy(iv, 0, IV, IV.Length - iv.Length, iv.Length);
- for (int i = 0; i < IV.Length - iv.Length; i++)
- {
- IV[i] = 0;
- }
- }
- else
- {
- Array.Copy(iv, 0, IV, 0, IV.Length);
- }
-
- parameters = ivParam.Parameters;
- }
-
- Reset();
-
- // if it's null, key is to be reused.
- if (parameters != null)
- {
- cipher.Init(true, parameters);
- }
- }
-
- /**
- * return the algorithm name and mode.
- *
- * @return the name of the underlying algorithm followed by "/OFB"
- * and the block size in bits
- */
- public string AlgorithmName
- {
- get { return cipher.AlgorithmName + "/OFB" + (blockSize * 8); }
- }
-
- public bool IsPartialBlockOkay
- {
- get { return true; }
- }
-
- /**
- * return the block size we are operating at (in bytes).
- *
- * @return the block size we are operating at (in bytes).
- */
- public int GetBlockSize()
- {
- return blockSize;
- }
-
- /**
- * Process one block of input from the array in and write it to
- * the out array.
- *
- * @param in the array containing the input data.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the output data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @exception DataLengthException if there isn't enough data in in, or
- * space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- * @return the number of bytes processed and produced.
- */
- public int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- if ((inOff + blockSize) > input.Length)
- {
- throw new DataLengthException("input buffer too short");
- }
-
- if ((outOff + blockSize) > output.Length)
- {
- throw new DataLengthException("output buffer too short");
- }
-
- cipher.ProcessBlock(ofbV, 0, ofbOutV, 0);
-
- //
- // XOR the ofbV with the plaintext producing the cipher text (and
- // the next input block).
- //
- for (int i = 0; i < blockSize; i++)
- {
- output[outOff + i] = (byte)(ofbOutV[i] ^ input[inOff + i]);
- }
-
- //
- // change over the input block.
- //
- Array.Copy(ofbV, blockSize, ofbV, 0, ofbV.Length - blockSize);
- Array.Copy(ofbOutV, 0, ofbV, ofbV.Length - blockSize, blockSize);
-
- return blockSize;
- }
-
- /**
- * reset the feedback vector back to the IV and reset the underlying
- * cipher.
- */
- public void Reset()
- {
- Array.Copy(IV, 0, ofbV, 0, IV.Length);
-
- cipher.Reset();
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/modes/OpenPgpCfbBlockCipher.cs b/BCCrypto/src/crypto/modes/OpenPgpCfbBlockCipher.cs
deleted file mode 100644
index 038ca78..0000000
--- a/BCCrypto/src/crypto/modes/OpenPgpCfbBlockCipher.cs
+++ /dev/null
@@ -1,337 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- /**
- * Implements OpenPGP's rather strange version of Cipher-FeedBack (CFB) mode
- * on top of a simple cipher. This class assumes the IV has been prepended
- * to the data stream already, and just accomodates the reset after
- * (blockSize + 2) bytes have been read.
- *
- * For further info see RFC 2440 .
- *
- */
- public class OpenPgpCfbBlockCipher
- : IBlockCipher
- {
- private byte[] IV;
- private byte[] FR;
- private byte[] FRE;
-
- private readonly IBlockCipher cipher;
- private readonly int blockSize;
-
- private int count;
- private bool forEncryption;
-
- /**
- * Basic constructor.
- *
- * @param cipher the block cipher to be used as the basis of the
- * feedback mode.
- */
- public OpenPgpCfbBlockCipher(
- IBlockCipher cipher)
- {
- this.cipher = cipher;
-
- this.blockSize = cipher.GetBlockSize();
- this.IV = new byte[blockSize];
- this.FR = new byte[blockSize];
- this.FRE = new byte[blockSize];
- }
-
- /**
- * return the underlying block cipher that we are wrapping.
- *
- * @return the underlying block cipher that we are wrapping.
- */
- public IBlockCipher GetUnderlyingCipher()
- {
- return cipher;
- }
-
- /**
- * return the algorithm name and mode.
- *
- * @return the name of the underlying algorithm followed by "/PGPCFB"
- * and the block size in bits.
- */
- public string AlgorithmName
- {
- get { return cipher.AlgorithmName + "/OpenPGPCFB"; }
- }
-
- public bool IsPartialBlockOkay
- {
- get { return true; }
- }
-
- /**
- * return the block size we are operating at.
- *
- * @return the block size we are operating at (in bytes).
- */
- public int GetBlockSize()
- {
- return cipher.GetBlockSize();
- }
-
- /**
- * Process one block of input from the array in and write it to
- * the out array.
- *
- * @param in the array containing the input data.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the output data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @exception DataLengthException if there isn't enough data in in, or
- * space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- * @return the number of bytes processed and produced.
- */
- public int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- return (forEncryption) ? EncryptBlock(input, inOff, output, outOff) : DecryptBlock(input, inOff, output, outOff);
- }
-
- /**
- * reset the chaining vector back to the IV and reset the underlying
- * cipher.
- */
- public void Reset()
- {
- count = 0;
-
- Array.Copy(IV, 0, FR, 0, FR.Length);
-
- cipher.Reset();
- }
-
- /**
- * Initialise the cipher and, possibly, the initialisation vector (IV).
- * If an IV isn't passed as part of the parameter, the IV will be all zeros.
- * An IV which is too short is handled in FIPS compliant fashion.
- *
- * @param forEncryption if true the cipher is initialised for
- * encryption, if false for decryption.
- * @param parameters the key and other data required by the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- this.forEncryption = forEncryption;
-
- if (parameters is ParametersWithIV)
- {
- ParametersWithIV ivParam = (ParametersWithIV)parameters;
- byte[] iv = ivParam.GetIV();
-
- if (iv.Length < IV.Length)
- {
- // prepend the supplied IV with zeros (per FIPS PUB 81)
- Array.Copy(iv, 0, IV, IV.Length - iv.Length, iv.Length);
- for (int i = 0; i < IV.Length - iv.Length; i++)
- {
- IV[i] = 0;
- }
- }
- else
- {
- Array.Copy(iv, 0, IV, 0, IV.Length);
- }
-
- parameters = ivParam.Parameters;
- }
-
- Reset();
-
- cipher.Init(true, parameters);
- }
-
- /**
- * Encrypt one byte of data according to CFB mode.
- * @param data the byte to encrypt
- * @param blockOff offset in the current block
- * @returns the encrypted byte
- */
- private byte EncryptByte(byte data, int blockOff)
- {
- return (byte)(FRE[blockOff] ^ data);
- }
-
- /**
- * Do the appropriate processing for CFB IV mode encryption.
- *
- * @param in the array containing the data to be encrypted.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the encrypted data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @exception DataLengthException if there isn't enough data in in, or
- * space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- * @return the number of bytes processed and produced.
- */
- private int EncryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- if ((inOff + blockSize) > input.Length)
- {
- throw new DataLengthException("input buffer too short");
- }
-
- if ((outOff + blockSize) > outBytes.Length)
- {
- throw new DataLengthException("output buffer too short");
- }
-
- if (count > blockSize)
- {
- FR[blockSize - 2] = outBytes[outOff] = EncryptByte(input[inOff], blockSize - 2);
- FR[blockSize - 1] = outBytes[outOff + 1] = EncryptByte(input[inOff + 1], blockSize - 1);
-
- cipher.ProcessBlock(FR, 0, FRE, 0);
-
- for (int n = 2; n < blockSize; n++)
- {
- FR[n - 2] = outBytes[outOff + n] = EncryptByte(input[inOff + n], n - 2);
- }
- }
- else if (count == 0)
- {
- cipher.ProcessBlock(FR, 0, FRE, 0);
-
- for (int n = 0; n < blockSize; n++)
- {
- FR[n] = outBytes[outOff + n] = EncryptByte(input[inOff + n], n);
- }
-
- count += blockSize;
- }
- else if (count == blockSize)
- {
- cipher.ProcessBlock(FR, 0, FRE, 0);
-
- outBytes[outOff] = EncryptByte(input[inOff], 0);
- outBytes[outOff + 1] = EncryptByte(input[inOff + 1], 1);
-
- //
- // do reset
- //
- Array.Copy(FR, 2, FR, 0, blockSize - 2);
- Array.Copy(outBytes, outOff, FR, blockSize - 2, 2);
-
- cipher.ProcessBlock(FR, 0, FRE, 0);
-
- for (int n = 2; n < blockSize; n++)
- {
- FR[n - 2] = outBytes[outOff + n] = EncryptByte(input[inOff + n], n - 2);
- }
-
- count += blockSize;
- }
-
- return blockSize;
- }
-
- /**
- * Do the appropriate processing for CFB IV mode decryption.
- *
- * @param in the array containing the data to be decrypted.
- * @param inOff offset into the in array the data starts at.
- * @param out the array the encrypted data will be copied into.
- * @param outOff the offset into the out array the output will start at.
- * @exception DataLengthException if there isn't enough data in in, or
- * space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- * @return the number of bytes processed and produced.
- */
- private int DecryptBlock(
- byte[] input,
- int inOff,
- byte[] outBytes,
- int outOff)
- {
- if ((inOff + blockSize) > input.Length)
- {
- throw new DataLengthException("input buffer too short");
- }
-
- if ((outOff + blockSize) > outBytes.Length)
- {
- throw new DataLengthException("output buffer too short");
- }
-
- if (count > blockSize)
- {
- byte inVal = input[inOff];
- FR[blockSize - 2] = inVal;
- outBytes[outOff] = EncryptByte(inVal, blockSize - 2);
-
- inVal = input[inOff + 1];
- FR[blockSize - 1] = inVal;
- outBytes[outOff + 1] = EncryptByte(inVal, blockSize - 1);
-
- cipher.ProcessBlock(FR, 0, FRE, 0);
-
- for (int n = 2; n < blockSize; n++)
- {
- inVal = input[inOff + n];
- FR[n - 2] = inVal;
- outBytes[outOff + n] = EncryptByte(inVal, n - 2);
- }
- }
- else if (count == 0)
- {
- cipher.ProcessBlock(FR, 0, FRE, 0);
-
- for (int n = 0; n < blockSize; n++)
- {
- FR[n] = input[inOff + n];
- outBytes[n] = EncryptByte(input[inOff + n], n);
- }
-
- count += blockSize;
- }
- else if (count == blockSize)
- {
- cipher.ProcessBlock(FR, 0, FRE, 0);
-
- byte inVal1 = input[inOff];
- byte inVal2 = input[inOff + 1];
- outBytes[outOff ] = EncryptByte(inVal1, 0);
- outBytes[outOff + 1] = EncryptByte(inVal2, 1);
-
- Array.Copy(FR, 2, FR, 0, blockSize - 2);
-
- FR[blockSize - 2] = inVal1;
- FR[blockSize - 1] = inVal2;
-
- cipher.ProcessBlock(FR, 0, FRE, 0);
-
- for (int n = 2; n < blockSize; n++)
- {
- byte inVal = input[inOff + n];
- FR[n - 2] = inVal;
- outBytes[outOff + n] = EncryptByte(inVal, n - 2);
- }
-
- count += blockSize;
- }
-
- return blockSize;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/SicBlockCipher.cs b/BCCrypto/src/crypto/modes/SicBlockCipher.cs
deleted file mode 100644
index 0bea4a4..0000000
--- a/BCCrypto/src/crypto/modes/SicBlockCipher.cs
+++ /dev/null
@@ -1,120 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Modes
-{
- /**
- * Implements the Segmented Integer Counter (SIC) mode on top of a simple
- * block cipher.
- */
- public class SicBlockCipher
- : IBlockCipher
- {
- private readonly IBlockCipher cipher;
- private readonly int blockSize;
- private readonly byte[] counter;
- private readonly byte[] counterOut;
- private byte[] IV;
-
- /**
- * Basic constructor.
- *
- * @param c the block cipher to be used.
- */
- public SicBlockCipher(IBlockCipher cipher)
- {
- this.cipher = cipher;
- this.blockSize = cipher.GetBlockSize();
- this.counter = new byte[blockSize];
- this.counterOut = new byte[blockSize];
- this.IV = new byte[blockSize];
- }
-
- /**
- * return the underlying block cipher that we are wrapping.
- *
- * @return the underlying block cipher that we are wrapping.
- */
- public virtual IBlockCipher GetUnderlyingCipher()
- {
- return cipher;
- }
-
- public virtual void Init(
- bool forEncryption, //ignored by this CTR mode
- ICipherParameters parameters)
- {
- ParametersWithIV ivParam = parameters as ParametersWithIV;
- if (ivParam == null)
- throw new ArgumentException("CTR/SIC mode requires ParametersWithIV", "parameters");
-
- this.IV = Arrays.Clone(ivParam.GetIV());
-
- if (blockSize < IV.Length)
- throw new ArgumentException("CTR/SIC mode requires IV no greater than: " + blockSize + " bytes.");
-
- int maxCounterSize = System.Math.Min(8, blockSize / 2);
- if (blockSize - IV.Length > maxCounterSize)
- throw new ArgumentException("CTR/SIC mode requires IV of at least: " + (blockSize - maxCounterSize) + " bytes.");
-
- // if null it's an IV changed only.
- if (ivParam.Parameters != null)
- {
- cipher.Init(true, ivParam.Parameters);
- }
-
- Reset();
- }
-
- public virtual string AlgorithmName
- {
- get { return cipher.AlgorithmName + "/SIC"; }
- }
-
- public virtual bool IsPartialBlockOkay
- {
- get { return true; }
- }
-
- public virtual int GetBlockSize()
- {
- return cipher.GetBlockSize();
- }
-
- public virtual int ProcessBlock(
- byte[] input,
- int inOff,
- byte[] output,
- int outOff)
- {
- cipher.ProcessBlock(counter, 0, counterOut, 0);
-
- //
- // XOR the counterOut with the plaintext producing the cipher text
- //
- for (int i = 0; i < counterOut.Length; i++)
- {
- output[outOff + i] = (byte)(counterOut[i] ^ input[inOff + i]);
- }
-
- // Increment the counter
- int j = counter.Length;
- while (--j >= 0 && ++counter[j] == 0)
- {
- }
-
- return counter.Length;
- }
-
- public virtual void Reset()
- {
- Arrays.Fill(counter, (byte)0);
- Array.Copy(IV, 0, counter, 0, IV.Length);
- cipher.Reset();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/gcm/BasicGcmExponentiator.cs b/BCCrypto/src/crypto/modes/gcm/BasicGcmExponentiator.cs
deleted file mode 100644
index 5660a1f..0000000
--- a/BCCrypto/src/crypto/modes/gcm/BasicGcmExponentiator.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Modes.Gcm
-{
- public class BasicGcmExponentiator
- : IGcmExponentiator
- {
- private uint[] x;
-
- public void Init(byte[] x)
- {
- this.x = GcmUtilities.AsUints(x);
- }
-
- public void ExponentiateX(long pow, byte[] output)
- {
- // Initial value is little-endian 1
- uint[] y = GcmUtilities.OneAsUints();
-
- if (pow > 0)
- {
- uint[] powX = Arrays.Clone(x);
- do
- {
- if ((pow & 1L) != 0)
- {
- GcmUtilities.Multiply(y, powX);
- }
- GcmUtilities.Multiply(powX, powX);
- pow >>= 1;
- }
- while (pow > 0);
- }
-
- GcmUtilities.AsBytes(y, output);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/gcm/BasicGcmMultiplier.cs b/BCCrypto/src/crypto/modes/gcm/BasicGcmMultiplier.cs
deleted file mode 100644
index eb89383..0000000
--- a/BCCrypto/src/crypto/modes/gcm/BasicGcmMultiplier.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Modes.Gcm
-{
- public class BasicGcmMultiplier
- : IGcmMultiplier
- {
- private uint[] H;
-
- public void Init(byte[] H)
- {
- this.H = GcmUtilities.AsUints(H);
- }
-
- public void MultiplyH(byte[] x)
- {
- uint[] t = GcmUtilities.AsUints(x);
- GcmUtilities.Multiply(t, H);
- GcmUtilities.AsBytes(t, x);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/gcm/GcmUtilities.cs b/BCCrypto/src/crypto/modes/gcm/GcmUtilities.cs
deleted file mode 100644
index d8ab2ca..0000000
--- a/BCCrypto/src/crypto/modes/gcm/GcmUtilities.cs
+++ /dev/null
@@ -1,319 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Modes.Gcm
-{
- internal abstract class GcmUtilities
- {
- private const uint E1 = 0xe1000000;
- private const ulong E1L = (ulong)E1 << 32;
-
- private static uint[] GenerateLookup()
- {
- uint[] lookup = new uint[256];
-
- for (int c = 0; c < 256; ++c)
- {
- uint v = 0;
- for (int i = 7; i >= 0; --i)
- {
- if ((c & (1 << i)) != 0)
- {
- v ^= (E1 >> (7 - i));
- }
- }
- lookup[c] = v;
- }
-
- return lookup;
- }
-
- private static readonly uint[] LOOKUP = GenerateLookup();
-
- internal static byte[] OneAsBytes()
- {
- byte[] tmp = new byte[16];
- tmp[0] = 0x80;
- return tmp;
- }
-
- internal static uint[] OneAsUints()
- {
- uint[] tmp = new uint[4];
- tmp[0] = 0x80000000;
- return tmp;
- }
-
- internal static ulong[] OneAsUlongs()
- {
- ulong[] tmp = new ulong[2];
- tmp[0] = 1UL << 63;
- return tmp;
- }
-
- internal static byte[] AsBytes(uint[] x)
- {
- return Pack.UInt32_To_BE(x);
- }
-
- internal static void AsBytes(uint[] x, byte[] z)
- {
- Pack.UInt32_To_BE(x, z, 0);
- }
-
- internal static byte[] AsBytes(ulong[] x)
- {
- byte[] z = new byte[16];
- Pack.UInt64_To_BE(x, z, 0);
- return z;
- }
-
- internal static void AsBytes(ulong[] x, byte[] z)
- {
- Pack.UInt64_To_BE(x, z, 0);
- }
-
- internal static uint[] AsUints(byte[] bs)
- {
- uint[] output = new uint[4];
- Pack.BE_To_UInt32(bs, 0, output);
- return output;
- }
-
- internal static void AsUints(byte[] bs, uint[] output)
- {
- Pack.BE_To_UInt32(bs, 0, output);
- }
-
- internal static ulong[] AsUlongs(byte[] x)
- {
- ulong[] z = new ulong[2];
- Pack.BE_To_UInt64(x, 0, z);
- return z;
- }
-
- public static void AsUlongs(byte[] x, ulong[] z)
- {
- Pack.BE_To_UInt64(x, 0, z);
- }
-
- internal static void Multiply(byte[] x, byte[] y)
- {
- uint[] t1 = GcmUtilities.AsUints(x);
- uint[] t2 = GcmUtilities.AsUints(y);
- GcmUtilities.Multiply(t1, t2);
- GcmUtilities.AsBytes(t1, x);
- }
-
- internal static void Multiply(uint[] x, uint[] y)
- {
- uint r00 = x[0], r01 = x[1], r02 = x[2], r03 = x[3];
- uint r10 = 0, r11 = 0, r12 = 0, r13 = 0;
-
- for (int i = 0; i < 4; ++i)
- {
- int bits = (int)y[i];
- for (int j = 0; j < 32; ++j)
- {
- uint m1 = (uint)(bits >> 31); bits <<= 1;
- r10 ^= (r00 & m1);
- r11 ^= (r01 & m1);
- r12 ^= (r02 & m1);
- r13 ^= (r03 & m1);
-
- uint m2 = (uint)((int)(r03 << 31) >> 8);
- r03 = (r03 >> 1) | (r02 << 31);
- r02 = (r02 >> 1) | (r01 << 31);
- r01 = (r01 >> 1) | (r00 << 31);
- r00 = (r00 >> 1) ^ (m2 & E1);
- }
- }
-
- x[0] = r10;
- x[1] = r11;
- x[2] = r12;
- x[3] = r13;
- }
-
- internal static void Multiply(ulong[] x, ulong[] y)
- {
- ulong r00 = x[0], r01 = x[1], r10 = 0, r11 = 0;
-
- for (int i = 0; i < 2; ++i)
- {
- long bits = (long)y[i];
- for (int j = 0; j < 64; ++j)
- {
- ulong m1 = (ulong)(bits >> 63); bits <<= 1;
- r10 ^= (r00 & m1);
- r11 ^= (r01 & m1);
-
- ulong m2 = (ulong)((long)(r01 << 63) >> 8);
- r01 = (r01 >> 1) | (r00 << 63);
- r00 = (r00 >> 1) ^ (m2 & E1L);
- }
- }
-
- x[0] = r10;
- x[1] = r11;
- }
-
- // P is the value with only bit i=1 set
- internal static void MultiplyP(uint[] x)
- {
- uint m = (uint)((int)ShiftRight(x) >> 8);
- x[0] ^= (m & E1);
- }
-
- internal static void MultiplyP(uint[] x, uint[] z)
- {
- uint m = (uint)((int)ShiftRight(x, z) >> 8);
- z[0] ^= (m & E1);
- }
-
- internal static void MultiplyP8(uint[] x)
- {
-// for (int i = 8; i != 0; --i)
-// {
-// MultiplyP(x);
-// }
-
- uint c = ShiftRightN(x, 8);
- x[0] ^= LOOKUP[c >> 24];
- }
-
- internal static void MultiplyP8(uint[] x, uint[] y)
- {
- uint c = ShiftRightN(x, 8, y);
- y[0] ^= LOOKUP[c >> 24];
- }
-
- internal static uint ShiftRight(uint[] x)
- {
- uint b = x[0];
- x[0] = b >> 1;
- uint c = b << 31;
- b = x[1];
- x[1] = (b >> 1) | c;
- c = b << 31;
- b = x[2];
- x[2] = (b >> 1) | c;
- c = b << 31;
- b = x[3];
- x[3] = (b >> 1) | c;
- return b << 31;
- }
-
- internal static uint ShiftRight(uint[] x, uint[] z)
- {
- uint b = x[0];
- z[0] = b >> 1;
- uint c = b << 31;
- b = x[1];
- z[1] = (b >> 1) | c;
- c = b << 31;
- b = x[2];
- z[2] = (b >> 1) | c;
- c = b << 31;
- b = x[3];
- z[3] = (b >> 1) | c;
- return b << 31;
- }
-
- internal static uint ShiftRightN(uint[] x, int n)
- {
- uint b = x[0]; int nInv = 32 - n;
- x[0] = b >> n;
- uint c = b << nInv;
- b = x[1];
- x[1] = (b >> n) | c;
- c = b << nInv;
- b = x[2];
- x[2] = (b >> n) | c;
- c = b << nInv;
- b = x[3];
- x[3] = (b >> n) | c;
- return b << nInv;
- }
-
- internal static uint ShiftRightN(uint[] x, int n, uint[] z)
- {
- uint b = x[0]; int nInv = 32 - n;
- z[0] = b >> n;
- uint c = b << nInv;
- b = x[1];
- z[1] = (b >> n) | c;
- c = b << nInv;
- b = x[2];
- z[2] = (b >> n) | c;
- c = b << nInv;
- b = x[3];
- z[3] = (b >> n) | c;
- return b << nInv;
- }
-
- internal static void Xor(byte[] x, byte[] y)
- {
- int i = 0;
- do
- {
- x[i] ^= y[i]; ++i;
- x[i] ^= y[i]; ++i;
- x[i] ^= y[i]; ++i;
- x[i] ^= y[i]; ++i;
- }
- while (i < 16);
- }
-
- internal static void Xor(byte[] x, byte[] y, int yOff, int yLen)
- {
- while (--yLen >= 0)
- {
- x[yLen] ^= y[yOff + yLen];
- }
- }
-
- internal static void Xor(byte[] x, byte[] y, byte[] z)
- {
- int i = 0;
- do
- {
- z[i] = (byte)(x[i] ^ y[i]); ++i;
- z[i] = (byte)(x[i] ^ y[i]); ++i;
- z[i] = (byte)(x[i] ^ y[i]); ++i;
- z[i] = (byte)(x[i] ^ y[i]); ++i;
- }
- while (i < 16);
- }
-
- internal static void Xor(uint[] x, uint[] y)
- {
- x[0] ^= y[0];
- x[1] ^= y[1];
- x[2] ^= y[2];
- x[3] ^= y[3];
- }
-
- internal static void Xor(uint[] x, uint[] y, uint[] z)
- {
- z[0] = x[0] ^ y[0];
- z[1] = x[1] ^ y[1];
- z[2] = x[2] ^ y[2];
- z[3] = x[3] ^ y[3];
- }
-
- internal static void Xor(ulong[] x, ulong[] y)
- {
- x[0] ^= y[0];
- x[1] ^= y[1];
- }
-
- internal static void Xor(ulong[] x, ulong[] y, ulong[] z)
- {
- z[0] = x[0] ^ y[0];
- z[1] = x[1] ^ y[1];
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/gcm/IGcmExponentiator.cs b/BCCrypto/src/crypto/modes/gcm/IGcmExponentiator.cs
deleted file mode 100644
index 5b4ce9d..0000000
--- a/BCCrypto/src/crypto/modes/gcm/IGcmExponentiator.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Modes.Gcm
-{
- public interface IGcmExponentiator
- {
- void Init(byte[] x);
- void ExponentiateX(long pow, byte[] output);
- }
-}
diff --git a/BCCrypto/src/crypto/modes/gcm/IGcmMultiplier.cs b/BCCrypto/src/crypto/modes/gcm/IGcmMultiplier.cs
deleted file mode 100644
index ec7b906..0000000
--- a/BCCrypto/src/crypto/modes/gcm/IGcmMultiplier.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Modes.Gcm
-{
- public interface IGcmMultiplier
- {
- void Init(byte[] H);
- void MultiplyH(byte[] x);
- }
-}
diff --git a/BCCrypto/src/crypto/modes/gcm/Tables1kGcmExponentiator.cs b/BCCrypto/src/crypto/modes/gcm/Tables1kGcmExponentiator.cs
deleted file mode 100644
index e649d67..0000000
--- a/BCCrypto/src/crypto/modes/gcm/Tables1kGcmExponentiator.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Modes.Gcm
-{
- public class Tables1kGcmExponentiator
- : IGcmExponentiator
- {
- // A lookup table of the power-of-two powers of 'x'
- // - lookupPowX2[i] = x^(2^i)
- private IList lookupPowX2;
-
- public void Init(byte[] x)
- {
- uint[] y = GcmUtilities.AsUints(x);
- if (lookupPowX2 != null && Arrays.AreEqual(y, (uint[])lookupPowX2[0]))
- return;
-
- lookupPowX2 = Platform.CreateArrayList(8);
- lookupPowX2.Add(y);
- }
-
- public void ExponentiateX(long pow, byte[] output)
- {
- uint[] y = GcmUtilities.OneAsUints();
- int bit = 0;
- while (pow > 0)
- {
- if ((pow & 1L) != 0)
- {
- EnsureAvailable(bit);
- GcmUtilities.Multiply(y, (uint[])lookupPowX2[bit]);
- }
- ++bit;
- pow >>= 1;
- }
-
- GcmUtilities.AsBytes(y, output);
- }
-
- private void EnsureAvailable(int bit)
- {
- int count = lookupPowX2.Count;
- if (count <= bit)
- {
- uint[] tmp = (uint[])lookupPowX2[count - 1];
- do
- {
- tmp = Arrays.Clone(tmp);
- GcmUtilities.Multiply(tmp, tmp);
- lookupPowX2.Add(tmp);
- }
- while (++count <= bit);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/gcm/Tables64kGcmMultiplier.cs b/BCCrypto/src/crypto/modes/gcm/Tables64kGcmMultiplier.cs
deleted file mode 100644
index 707b0be..0000000
--- a/BCCrypto/src/crypto/modes/gcm/Tables64kGcmMultiplier.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Modes.Gcm
-{
- public class Tables64kGcmMultiplier
- : IGcmMultiplier
- {
- private byte[] H;
- private uint[][][] M;
-
- public void Init(byte[] H)
- {
- if (M == null)
- {
- M = new uint[16][][];
- }
- else if (Arrays.AreEqual(this.H, H))
- {
- return;
- }
-
- this.H = Arrays.Clone(H);
-
- M[0] = new uint[256][];
- M[0][0] = new uint[4];
- M[0][128] = GcmUtilities.AsUints(H);
- for (int j = 64; j >= 1; j >>= 1)
- {
- uint[] tmp = (uint[])M[0][j + j].Clone();
- GcmUtilities.MultiplyP(tmp);
- M[0][j] = tmp;
- }
- for (int i = 0; ; )
- {
- for (int j = 2; j < 256; j += j)
- {
- for (int k = 1; k < j; ++k)
- {
- uint[] tmp = (uint[])M[i][j].Clone();
- GcmUtilities.Xor(tmp, M[i][k]);
- M[i][j + k] = tmp;
- }
- }
-
- if (++i == 16) return;
-
- M[i] = new uint[256][];
- M[i][0] = new uint[4];
- for (int j = 128; j > 0; j >>= 1)
- {
- uint[] tmp = (uint[])M[i - 1][j].Clone();
- GcmUtilities.MultiplyP8(tmp);
- M[i][j] = tmp;
- }
- }
- }
-
- public void MultiplyH(byte[] x)
- {
- uint[] z = new uint[4];
- for (int i = 0; i != 16; ++i)
- {
- //GcmUtilities.Xor(z, M[i][x[i]]);
- uint[] m = M[i][x[i]];
- z[0] ^= m[0];
- z[1] ^= m[1];
- z[2] ^= m[2];
- z[3] ^= m[3];
- }
-
- Pack.UInt32_To_BE(z, x, 0);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/modes/gcm/Tables8kGcmMultiplier.cs b/BCCrypto/src/crypto/modes/gcm/Tables8kGcmMultiplier.cs
deleted file mode 100644
index 5f3d6c8..0000000
--- a/BCCrypto/src/crypto/modes/gcm/Tables8kGcmMultiplier.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Modes.Gcm
-{
- public class Tables8kGcmMultiplier
- : IGcmMultiplier
- {
- private byte[] H;
- private uint[][][] M;
-
- public void Init(byte[] H)
- {
- if (M == null)
- {
- M = new uint[32][][];
- }
- else if (Arrays.AreEqual(this.H, H))
- {
- return;
- }
-
- this.H = Arrays.Clone(H);
-
- M[0] = new uint[16][];
- M[1] = new uint[16][];
- M[0][0] = new uint[4];
- M[1][0] = new uint[4];
- M[1][8] = GcmUtilities.AsUints(H);
-
- for (int j = 4; j >= 1; j >>= 1)
- {
- uint[] tmp = (uint[])M[1][j + j].Clone();
- GcmUtilities.MultiplyP(tmp);
- M[1][j] = tmp;
- }
-
- {
- uint[] tmp = (uint[])M[1][1].Clone();
- GcmUtilities.MultiplyP(tmp);
- M[0][8] = tmp;
- }
-
- for (int j = 4; j >= 1; j >>= 1)
- {
- uint[] tmp = (uint[])M[0][j + j].Clone();
- GcmUtilities.MultiplyP(tmp);
- M[0][j] = tmp;
- }
-
- for (int i = 0; ; )
- {
- for (int j = 2; j < 16; j += j)
- {
- for (int k = 1; k < j; ++k)
- {
- uint[] tmp = (uint[])M[i][j].Clone();
- GcmUtilities.Xor(tmp, M[i][k]);
- M[i][j + k] = tmp;
- }
- }
-
- if (++i == 32) return;
-
- if (i > 1)
- {
- M[i] = new uint[16][];
- M[i][0] = new uint[4];
- for (int j = 8; j > 0; j >>= 1)
- {
- uint[] tmp = (uint[])M[i - 2][j].Clone();
- GcmUtilities.MultiplyP8(tmp);
- M[i][j] = tmp;
- }
- }
- }
- }
-
- public void MultiplyH(byte[] x)
- {
- uint[] z = new uint[4];
- for (int i = 15; i >= 0; --i)
- {
- //GcmUtilities.Xor(z, M[i + i][x[i] & 0x0f]);
- uint[] m = M[i + i][x[i] & 0x0f];
- z[0] ^= m[0];
- z[1] ^= m[1];
- z[2] ^= m[2];
- z[3] ^= m[3];
- //GcmUtilities.Xor(z, M[i + i + 1][(x[i] & 0xf0) >> 4]);
- m = M[i + i + 1][(x[i] & 0xf0) >> 4];
- z[0] ^= m[0];
- z[1] ^= m[1];
- z[2] ^= m[2];
- z[3] ^= m[3];
- }
-
- Pack.UInt32_To_BE(z, x, 0);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/operators/Asn1Signature.cs b/BCCrypto/src/crypto/operators/Asn1Signature.cs
deleted file mode 100644
index e023c1d..0000000
--- a/BCCrypto/src/crypto/operators/Asn1Signature.cs
+++ /dev/null
@@ -1,555 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Crypto.Operators
-{
- internal class X509Utilities
- {
- private static readonly Asn1Null derNull = DerNull.Instance;
-
- private static readonly IDictionary algorithms = Platform.CreateHashtable();
- private static readonly IDictionary exParams = Platform.CreateHashtable();
- private static readonly ISet noParams = new HashSet();
-
- static X509Utilities()
- {
- algorithms.Add("MD2WITHRSAENCRYPTION", PkcsObjectIdentifiers.MD2WithRsaEncryption);
- algorithms.Add("MD2WITHRSA", PkcsObjectIdentifiers.MD2WithRsaEncryption);
- algorithms.Add("MD5WITHRSAENCRYPTION", PkcsObjectIdentifiers.MD5WithRsaEncryption);
- algorithms.Add("MD5WITHRSA", PkcsObjectIdentifiers.MD5WithRsaEncryption);
- 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("RIPEMD160WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
- algorithms.Add("RIPEMD160WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
- algorithms.Add("RIPEMD128WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
- algorithms.Add("RIPEMD128WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
- algorithms.Add("RIPEMD256WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
- algorithms.Add("RIPEMD256WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
- 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);
- algorithms.Add("GOST3411WITHGOST3410", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
- algorithms.Add("GOST3411WITHGOST3410-94", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
- algorithms.Add("GOST3411WITHECGOST3410", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
- algorithms.Add("GOST3411WITHECGOST3410-2001", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
- algorithms.Add("GOST3411WITHGOST3410-2001", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
-
- //
- // 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);
-
- //
- // RFC 4491
- //
- noParams.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
- noParams.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
-
- //
- // explicit params
- //
- AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1, DerNull.Instance);
- exParams.Add("SHA1WITHRSAANDMGF1", CreatePssParams(sha1AlgId, 20));
-
- AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha224, DerNull.Instance);
- exParams.Add("SHA224WITHRSAANDMGF1", CreatePssParams(sha224AlgId, 28));
-
- AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha256, DerNull.Instance);
- exParams.Add("SHA256WITHRSAANDMGF1", CreatePssParams(sha256AlgId, 32));
-
- AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha384, DerNull.Instance);
- exParams.Add("SHA384WITHRSAANDMGF1", CreatePssParams(sha384AlgId, 48));
-
- AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha512, DerNull.Instance);
- exParams.Add("SHA512WITHRSAANDMGF1", CreatePssParams(sha512AlgId, 64));
- }
-
- /**
- * Return the digest algorithm using one of the standard JCA string
- * representations rather than the algorithm identifier (if possible).
- */
- private static string GetDigestAlgName(
- DerObjectIdentifier digestAlgOID)
- {
- if (PkcsObjectIdentifiers.MD5.Equals(digestAlgOID))
- {
- return "MD5";
- }
- else if (OiwObjectIdentifiers.IdSha1.Equals(digestAlgOID))
- {
- return "SHA1";
- }
- else if (NistObjectIdentifiers.IdSha224.Equals(digestAlgOID))
- {
- return "SHA224";
- }
- else if (NistObjectIdentifiers.IdSha256.Equals(digestAlgOID))
- {
- return "SHA256";
- }
- else if (NistObjectIdentifiers.IdSha384.Equals(digestAlgOID))
- {
- return "SHA384";
- }
- else if (NistObjectIdentifiers.IdSha512.Equals(digestAlgOID))
- {
- return "SHA512";
- }
- else if (TeleTrusTObjectIdentifiers.RipeMD128.Equals(digestAlgOID))
- {
- return "RIPEMD128";
- }
- else if (TeleTrusTObjectIdentifiers.RipeMD160.Equals(digestAlgOID))
- {
- return "RIPEMD160";
- }
- else if (TeleTrusTObjectIdentifiers.RipeMD256.Equals(digestAlgOID))
- {
- return "RIPEMD256";
- }
- else if (CryptoProObjectIdentifiers.GostR3411.Equals(digestAlgOID))
- {
- return "GOST3411";
- }
- else
- {
- return digestAlgOID.Id;
- }
- }
-
- internal static string GetSignatureName(AlgorithmIdentifier sigAlgId)
- {
- Asn1Encodable parameters = sigAlgId.Parameters;
-
- if (parameters != null && !derNull.Equals(parameters))
- {
- if (sigAlgId.Algorithm.Equals(PkcsObjectIdentifiers.IdRsassaPss))
- {
- RsassaPssParameters rsaParams = RsassaPssParameters.GetInstance(parameters);
-
- return GetDigestAlgName(rsaParams.HashAlgorithm.Algorithm) + "withRSAandMGF1";
- }
- if (sigAlgId.Algorithm.Equals(X9ObjectIdentifiers.ECDsaWithSha2))
- {
- Asn1Sequence ecDsaParams = Asn1Sequence.GetInstance(parameters);
-
- return GetDigestAlgName((DerObjectIdentifier)ecDsaParams[0]) + "withECDSA";
- }
- }
-
- return sigAlgId.Algorithm.Id;
- }
-
- private static RsassaPssParameters CreatePssParams(
- AlgorithmIdentifier hashAlgId,
- int saltSize)
- {
- return new RsassaPssParameters(
- hashAlgId,
- new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, hashAlgId),
- new DerInteger(saltSize),
- new DerInteger(1));
- }
-
- internal static DerObjectIdentifier GetAlgorithmOid(
- string algorithmName)
- {
- algorithmName = Platform.ToUpperInvariant(algorithmName);
-
- if (algorithms.Contains(algorithmName))
- {
- return (DerObjectIdentifier) algorithms[algorithmName];
- }
-
- return new DerObjectIdentifier(algorithmName);
- }
-
- internal static AlgorithmIdentifier GetSigAlgID(
- DerObjectIdentifier sigOid,
- string algorithmName)
- {
- if (noParams.Contains(sigOid))
- {
- return new AlgorithmIdentifier(sigOid);
- }
-
- algorithmName = Platform.ToUpperInvariant(algorithmName);
-
- if (exParams.Contains(algorithmName))
- {
- return new AlgorithmIdentifier(sigOid, (Asn1Encodable) exParams[algorithmName]);
- }
-
- return new AlgorithmIdentifier(sigOid, DerNull.Instance);
- }
-
- internal static IEnumerable GetAlgNames()
- {
- return new EnumerableProxy(algorithms.Keys);
- }
- }
-
- internal class SignerBucket
- : Stream
- {
- protected readonly ISigner signer;
-
- public SignerBucket(
- ISigner signer)
- {
- this.signer = signer;
- }
-
- public override int Read(
- byte[] buffer,
- int offset,
- int count)
- {
- throw new NotImplementedException ();
- }
-
- public override int ReadByte()
- {
- throw new NotImplementedException ();
- }
-
- public override void Write(
- byte[] buffer,
- int offset,
- int count)
- {
- if (count > 0)
- {
- signer.BlockUpdate(buffer, offset, count);
- }
- }
-
- public override void WriteByte(
- byte b)
- {
- signer.Update(b);
- }
-
- public override bool CanRead
- {
- get { return false; }
- }
-
- public override bool CanWrite
- {
- get { return true; }
- }
-
- public override bool CanSeek
- {
- get { return false; }
- }
-
- public override long Length
- {
- get { return 0; }
- }
-
- public override long Position
- {
- get { throw new NotImplementedException (); }
- set { throw new NotImplementedException (); }
- }
-
- public override void Flush()
- {
- }
-
- public override long Seek(
- long offset,
- SeekOrigin origin)
- {
- throw new NotImplementedException ();
- }
-
- public override void SetLength(
- long length)
- {
- throw new NotImplementedException ();
- }
- }
-
- ///
- /// Calculator factory class for signature generation in ASN.1 based profiles that use an AlgorithmIdentifier to preserve
- /// signature algorithm details.
- ///
- public class Asn1SignatureFactory: ISignatureFactory
- {
- private readonly AlgorithmIdentifier algID;
- private readonly string algorithm;
- private readonly AsymmetricKeyParameter privateKey;
- private readonly SecureRandom random;
-
- ///
- /// Base constructor.
- ///
- /// The name of the signature algorithm to use.
- /// The private key to be used in the signing operation.
- public Asn1SignatureFactory (string algorithm, AsymmetricKeyParameter privateKey): this(algorithm, privateKey, null)
- {
- }
-
- ///
- /// Constructor which also specifies a source of randomness to be used if one is required.
- ///
- /// The name of the signature algorithm to use.
- /// The private key to be used in the signing operation.
- /// The source of randomness to be used in signature calculation.
- public Asn1SignatureFactory (string algorithm, AsymmetricKeyParameter privateKey, SecureRandom random)
- {
- DerObjectIdentifier sigOid = X509Utilities.GetAlgorithmOid (algorithm);
-
- this.algorithm = algorithm;
- this.privateKey = privateKey;
- this.random = random;
- this.algID = X509Utilities.GetSigAlgID (sigOid, algorithm);
- }
-
- public Object AlgorithmDetails
- {
- get { return this.algID; }
- }
-
- public IStreamCalculator CreateCalculator()
- {
- ISigner sig = SignerUtilities.GetSigner(algorithm);
-
- if (random != null)
- {
- sig.Init(true, new ParametersWithRandom(privateKey, random));
- }
- else
- {
- sig.Init(true, privateKey);
- }
-
- return new SigCalculator(sig);
- }
-
- ///
- /// Allows enumeration of the signature names supported by the verifier provider.
- ///
- public static IEnumerable SignatureAlgNames
- {
- get { return X509Utilities.GetAlgNames(); }
- }
- }
-
- internal class SigCalculator : IStreamCalculator
- {
- private readonly ISigner sig;
- private readonly Stream stream;
-
- internal SigCalculator(ISigner sig)
- {
- this.sig = sig;
- this.stream = new SignerBucket(sig);
- }
-
- public Stream Stream
- {
- get { return stream; }
- }
-
- public object GetResult()
- {
- return new SigResult(sig);
- }
- }
-
- internal class SigResult : IBlockResult
- {
- private readonly ISigner sig;
-
- internal SigResult(ISigner sig)
- {
- this.sig = sig;
- }
-
- public byte[] Collect()
- {
- return sig.GenerateSignature();
- }
-
- public int Collect(byte[] destination, int offset)
- {
- byte[] signature = Collect();
-
- Array.Copy(signature, 0, destination, offset, signature.Length);
-
- return signature.Length;
- }
- }
-
- ///
- /// Verifier class for signature verification in ASN.1 based profiles that use an AlgorithmIdentifier to preserve
- /// signature algorithm details.
- ///
- public class Asn1VerifierFactory: IVerifierFactory
- {
- private readonly AlgorithmIdentifier algID;
- private readonly AsymmetricKeyParameter publicKey;
-
- ///
- /// Base constructor.
- ///
- /// The name of the signature algorithm to use.
- /// The public key to be used in the verification operation.
- public Asn1VerifierFactory (String algorithm, AsymmetricKeyParameter publicKey)
- {
- DerObjectIdentifier sigOid = X509Utilities.GetAlgorithmOid (algorithm);
-
- this.publicKey = publicKey;
- this.algID = X509Utilities.GetSigAlgID (sigOid, algorithm);
- }
-
- public Asn1VerifierFactory (AlgorithmIdentifier algorithm, AsymmetricKeyParameter publicKey)
- {
- this.publicKey = publicKey;
- this.algID = algorithm;
- }
-
- public Object AlgorithmDetails
- {
- get { return this.algID; }
- }
-
- public IStreamCalculator CreateCalculator()
- {
- ISigner sig = SignerUtilities.GetSigner(X509Utilities.GetSignatureName(algID));
-
- sig.Init(false, publicKey);
-
- return new VerifierCalculator(sig);
- }
- }
-
- internal class VerifierCalculator : IStreamCalculator
- {
- private readonly ISigner sig;
- private readonly Stream stream;
-
- internal VerifierCalculator(ISigner sig)
- {
- this.sig = sig;
- this.stream = new SignerBucket(sig);
- }
-
- public Stream Stream
- {
- get { return stream; }
- }
-
- public object GetResult()
- {
- return new VerifierResult(sig);
- }
- }
-
- internal class VerifierResult : IVerifier
- {
- private readonly ISigner sig;
-
- internal VerifierResult(ISigner sig)
- {
- this.sig = sig;
- }
-
- public bool IsVerified(byte[] signature)
- {
- return sig.VerifySignature(signature);
- }
-
- public bool IsVerified(byte[] signature, int off, int length)
- {
- byte[] sigBytes = new byte[length];
-
- Array.Copy(signature, 0, sigBytes, off, sigBytes.Length);
-
- return sig.VerifySignature(signature);
- }
- }
-
- ///
- /// Provider class which supports dynamic creation of signature verifiers.
- ///
- public class Asn1VerifierFactoryProvider: IVerifierFactoryProvider
- {
- private readonly AsymmetricKeyParameter publicKey;
-
- ///
- /// Base constructor - specify the public key to be used in verification.
- ///
- /// The public key to be used in creating verifiers provided by this object.
- public Asn1VerifierFactoryProvider(AsymmetricKeyParameter publicKey)
- {
- this.publicKey = publicKey;
- }
-
- public IVerifierFactory CreateVerifierFactory(Object algorithmDetails)
- {
- return new Asn1VerifierFactory ((AlgorithmIdentifier)algorithmDetails, publicKey);
- }
-
- ///
- /// Allows enumeration of the signature names supported by the verifier provider.
- ///
- public IEnumerable SignatureAlgNames
- {
- get { return X509Utilities.GetAlgNames(); }
- }
- }
-}
-
diff --git a/BCCrypto/src/crypto/paddings/BlockCipherPadding.cs b/BCCrypto/src/crypto/paddings/BlockCipherPadding.cs
deleted file mode 100644
index 33a5f9f..0000000
--- a/BCCrypto/src/crypto/paddings/BlockCipherPadding.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-
-
-namespace Org.BouncyCastle.Crypto.Paddings
-{
- /**
- * Block cipher padders are expected to conform to this interface
- */
- public interface IBlockCipherPadding
- {
- /**
- * Initialise the padder.
- *
- * @param param parameters, if any required.
- */
- void Init(SecureRandom random);
- //throws ArgumentException;
-
- /**
- * Return the name of the algorithm the cipher implements.
- *
- * @return the name of the algorithm the cipher implements.
- */
- string PaddingName { get; }
-
- /**
- * add the pad bytes to the passed in block, returning the
- * number of bytes added.
- */
- int AddPadding(byte[] input, int inOff);
-
- /**
- * return the number of pad bytes present in the block.
- * @exception InvalidCipherTextException if the padding is badly formed
- * or invalid.
- */
- int PadCount(byte[] input);
- //throws InvalidCipherTextException;
- }
-
-}
diff --git a/BCCrypto/src/crypto/paddings/ISO10126d2Padding.cs b/BCCrypto/src/crypto/paddings/ISO10126d2Padding.cs
deleted file mode 100644
index e132a62..0000000
--- a/BCCrypto/src/crypto/paddings/ISO10126d2Padding.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-using System;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-
-
-namespace Org.BouncyCastle.Crypto.Paddings
-{
-
- /**
- * A padder that adds ISO10126-2 padding to a block.
- */
- public class ISO10126d2Padding: IBlockCipherPadding
- {
- private SecureRandom random;
-
- /**
- * Initialise the padder.
- *
- * @param random a SecureRandom if available.
- */
- public void Init(
- SecureRandom random)
- //throws ArgumentException
- {
- this.random = (random != null) ? random : new SecureRandom();
- }
-
- /**
- * Return the name of the algorithm the cipher implements.
- *
- * @return the name of the algorithm the cipher implements.
- */
- public string PaddingName
- {
- get { return "ISO10126-2"; }
- }
-
- /**
- * add the pad bytes to the passed in block, returning the
- * number of bytes added.
- */
- public int AddPadding(
- byte[] input,
- int inOff)
- {
- byte code = (byte)(input.Length - inOff);
-
- while (inOff < (input.Length - 1))
- {
- input[inOff] = (byte)random.NextInt();
- inOff++;
- }
-
- input[inOff] = code;
-
- return code;
- }
-
- /**
- * return the number of pad bytes present in the block.
- */
- public int PadCount(byte[] input)
- //throws InvalidCipherTextException
- {
- int count = input[input.Length - 1] & 0xff;
-
- if (count > input.Length)
- {
- throw new InvalidCipherTextException("pad block corrupted");
- }
-
- return count;
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/paddings/ISO7816d4Padding.cs b/BCCrypto/src/crypto/paddings/ISO7816d4Padding.cs
deleted file mode 100644
index 016b25a..0000000
--- a/BCCrypto/src/crypto/paddings/ISO7816d4Padding.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Paddings
-{
- /**
- * A padder that adds the padding according to the scheme referenced in
- * ISO 7814-4 - scheme 2 from ISO 9797-1. The first byte is 0x80, rest is 0x00
- */
- public class ISO7816d4Padding
- : IBlockCipherPadding
- {
- /**
- * Initialise the padder.
- *
- * @param random - a SecureRandom if available.
- */
- public void Init(
- SecureRandom random)
- {
- // nothing to do.
- }
-
- /**
- * Return the name of the algorithm the padder implements.
- *
- * @return the name of the algorithm the padder implements.
- */
- public string PaddingName
- {
- get { return "ISO7816-4"; }
- }
-
- /**
- * add the pad bytes to the passed in block, returning the
- * number of bytes added.
- */
- public int AddPadding(
- byte[] input,
- int inOff)
- {
- int added = (input.Length - inOff);
-
- input[inOff]= (byte) 0x80;
- inOff ++;
-
- while (inOff < input.Length)
- {
- input[inOff] = (byte) 0;
- inOff++;
- }
-
- return added;
- }
-
- /**
- * return the number of pad bytes present in the block.
- */
- public int PadCount(
- byte[] input)
- {
- int count = input.Length - 1;
-
- while (count > 0 && input[count] == 0)
- {
- count--;
- }
-
- if (input[count] != (byte)0x80)
- {
- throw new InvalidCipherTextException("pad block corrupted");
- }
-
- return input.Length - count;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/paddings/PaddedBufferedBlockCipher.cs b/BCCrypto/src/crypto/paddings/PaddedBufferedBlockCipher.cs
deleted file mode 100644
index 5d2f8cf..0000000
--- a/BCCrypto/src/crypto/paddings/PaddedBufferedBlockCipher.cs
+++ /dev/null
@@ -1,285 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Paddings
-{
- /**
- * A wrapper class that allows block ciphers to be used to process data in
- * a piecemeal fashion with padding. The PaddedBufferedBlockCipher
- * outputs a block only when the buffer is full and more data is being added,
- * or on a doFinal (unless the current block in the buffer is a pad block).
- * The default padding mechanism used is the one outlined in Pkcs5/Pkcs7.
- */
- public class PaddedBufferedBlockCipher
- : BufferedBlockCipher
- {
- private readonly IBlockCipherPadding padding;
-
- /**
- * Create a buffered block cipher with the desired padding.
- *
- * @param cipher the underlying block cipher this buffering object wraps.
- * @param padding the padding type.
- */
- public PaddedBufferedBlockCipher(
- IBlockCipher cipher,
- IBlockCipherPadding padding)
- {
- this.cipher = cipher;
- this.padding = padding;
-
- buf = new byte[cipher.GetBlockSize()];
- bufOff = 0;
- }
-
- /**
- * Create a buffered block cipher Pkcs7 padding
- *
- * @param cipher the underlying block cipher this buffering object wraps.
- */
- public PaddedBufferedBlockCipher(
- IBlockCipher cipher)
- : this(cipher, new Pkcs7Padding()) { }
-
- /**
- * initialise the cipher.
- *
- * @param forEncryption if true the cipher is initialised for
- * encryption, if false for decryption.
- * @param param the key and other data required by the cipher.
- * @exception ArgumentException if the parameters argument is
- * inappropriate.
- */
- public override void Init(
- bool forEncryption,
- ICipherParameters parameters)
- {
- this.forEncryption = forEncryption;
-
- SecureRandom initRandom = null;
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom p = (ParametersWithRandom)parameters;
- initRandom = p.Random;
- parameters = p.Parameters;
- }
-
- Reset();
- padding.Init(initRandom);
- cipher.Init(forEncryption, parameters);
- }
-
- /**
- * return the minimum size of the output buffer required for an update
- * plus a doFinal with an input of len bytes.
- *
- * @param len the length of the input.
- * @return the space required to accommodate a call to update and doFinal
- * with len bytes of input.
- */
- public override int GetOutputSize(
- int length)
- {
- int total = length + bufOff;
- int leftOver = total % buf.Length;
-
- if (leftOver == 0)
- {
- if (forEncryption)
- {
- return total + buf.Length;
- }
-
- return total;
- }
-
- return total - leftOver + buf.Length;
- }
-
- /**
- * return the size of the output buffer required for an update
- * an input of len bytes.
- *
- * @param len the length of the input.
- * @return the space required to accommodate a call to update
- * with len bytes of input.
- */
- public override int GetUpdateOutputSize(
- int length)
- {
- int total = length + bufOff;
- int leftOver = total % buf.Length;
-
- if (leftOver == 0)
- {
- return total - buf.Length;
- }
-
- return total - leftOver;
- }
-
- /**
- * process a single byte, producing an output block if necessary.
- *
- * @param in the input byte.
- * @param out the space for any output that might be produced.
- * @param outOff the offset from which the output will be copied.
- * @return the number of output bytes copied to out.
- * @exception DataLengthException if there isn't enough space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- */
- public override int ProcessByte(
- byte input,
- byte[] output,
- int outOff)
- {
- int resultLen = 0;
-
- if (bufOff == buf.Length)
- {
- resultLen = cipher.ProcessBlock(buf, 0, output, outOff);
- bufOff = 0;
- }
-
- buf[bufOff++] = input;
-
- return resultLen;
- }
-
- /**
- * process an array of bytes, producing output if necessary.
- *
- * @param in the input byte array.
- * @param inOff the offset at which the input data starts.
- * @param len the number of bytes to be copied out of the input array.
- * @param out the space for any output that might be produced.
- * @param outOff the offset from which the output will be copied.
- * @return the number of output bytes copied to out.
- * @exception DataLengthException if there isn't enough space in out.
- * @exception InvalidOperationException if the cipher isn't initialised.
- */
- public override int ProcessBytes(
- byte[] input,
- int inOff,
- int length,
- byte[] output,
- int outOff)
- {
- if (length < 0)
- {
- throw new ArgumentException("Can't have a negative input length!");
- }
-
- int blockSize = GetBlockSize();
- int outLength = GetUpdateOutputSize(length);
-
- if (outLength > 0)
- {
- Check.OutputLength(output, outOff, outLength, "output buffer too short");
- }
-
- int resultLen = 0;
- int gapLen = buf.Length - bufOff;
-
- if (length > gapLen)
- {
- Array.Copy(input, inOff, buf, bufOff, gapLen);
-
- resultLen += cipher.ProcessBlock(buf, 0, output, outOff);
-
- bufOff = 0;
- length -= gapLen;
- inOff += gapLen;
-
- while (length > buf.Length)
- {
- resultLen += cipher.ProcessBlock(input, inOff, output, outOff + resultLen);
-
- length -= blockSize;
- inOff += blockSize;
- }
- }
-
- Array.Copy(input, inOff, buf, bufOff, length);
-
- bufOff += length;
-
- return resultLen;
- }
-
- /**
- * Process the last block in the buffer. If the buffer is currently
- * full and padding needs to be added a call to doFinal will produce
- * 2 * GetBlockSize() bytes.
- *
- * @param out the array the block currently being held is copied into.
- * @param outOff the offset at which the copying starts.
- * @return the number of output bytes copied to out.
- * @exception DataLengthException if there is insufficient space in out for
- * the output or we are decrypting and the input is not block size aligned.
- * @exception InvalidOperationException if the underlying cipher is not
- * initialised.
- * @exception InvalidCipherTextException if padding is expected and not found.
- */
- public override int DoFinal(
- byte[] output,
- int outOff)
- {
- int blockSize = cipher.GetBlockSize();
- int resultLen = 0;
-
- if (forEncryption)
- {
- if (bufOff == blockSize)
- {
- if ((outOff + 2 * blockSize) > output.Length)
- {
- Reset();
-
- throw new OutputLengthException("output buffer too short");
- }
-
- resultLen = cipher.ProcessBlock(buf, 0, output, outOff);
- bufOff = 0;
- }
-
- padding.AddPadding(buf, bufOff);
-
- resultLen += cipher.ProcessBlock(buf, 0, output, outOff + resultLen);
-
- Reset();
- }
- else
- {
- if (bufOff == blockSize)
- {
- resultLen = cipher.ProcessBlock(buf, 0, buf, 0);
- bufOff = 0;
- }
- else
- {
- Reset();
-
- throw new DataLengthException("last block incomplete in decryption");
- }
-
- try
- {
- resultLen -= padding.PadCount(buf);
-
- Array.Copy(buf, 0, output, outOff, resultLen);
- }
- finally
- {
- Reset();
- }
- }
-
- return resultLen;
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/paddings/Pkcs7Padding.cs b/BCCrypto/src/crypto/paddings/Pkcs7Padding.cs
deleted file mode 100644
index 1158564..0000000
--- a/BCCrypto/src/crypto/paddings/Pkcs7Padding.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Paddings
-{
- /**
- * A padder that adds Pkcs7/Pkcs5 padding to a block.
- */
- public class Pkcs7Padding
- : IBlockCipherPadding
- {
- /**
- * Initialise the padder.
- *
- * @param random - a SecureRandom if available.
- */
- public void Init(
- SecureRandom random)
- {
- // nothing to do.
- }
-
- /**
- * Return the name of the algorithm the cipher implements.
- *
- * @return the name of the algorithm the cipher implements.
- */
- public string PaddingName
- {
- get { return "PKCS7"; }
- }
-
- /**
- * add the pad bytes to the passed in block, returning the
- * number of bytes added.
- */
- public int AddPadding(
- byte[] input,
- int inOff)
- {
- byte code = (byte)(input.Length - inOff);
-
- while (inOff < input.Length)
- {
- input[inOff] = code;
- inOff++;
- }
-
- return code;
- }
-
- /**
- * return the number of pad bytes present in the block.
- */
- public int PadCount(
- byte[] input)
- {
- byte countAsByte = input[input.Length - 1];
- int count = countAsByte;
-
- if (count < 1 || count > input.Length)
- throw new InvalidCipherTextException("pad block corrupted");
-
- for (int i = 2; i <= count; i++)
- {
- if (input[input.Length - i] != countAsByte)
- throw new InvalidCipherTextException("pad block corrupted");
- }
-
- return count;
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/paddings/TbcPadding.cs b/BCCrypto/src/crypto/paddings/TbcPadding.cs
deleted file mode 100644
index 74b64e8..0000000
--- a/BCCrypto/src/crypto/paddings/TbcPadding.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using System;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Paddings
-{
-
- /// A padder that adds Trailing-Bit-Compliment padding to a block.
- ///
- /// This padding pads the block out compliment of the last bit
- /// of the plain text.
- ///
- ///
- public class TbcPadding
- : IBlockCipherPadding
- {
- /// Return the name of the algorithm the cipher implements.
- /// the name of the algorithm the cipher implements.
- ///
- public string PaddingName
- {
- get { return "TBC"; }
- }
-
- /// Initialise the padder.
- /// - a SecureRandom if available.
- ///
- public virtual void Init(SecureRandom random)
- {
- // nothing to do.
- }
-
- /// add the pad bytes to the passed in block, returning the
- /// number of bytes added.
- ///
- /// Note: this assumes that the last block of plain text is always
- /// passed to it inside in. i.e. if inOff is zero, indicating the
- /// entire block is to be overwritten with padding the value of in
- /// should be the same as the last block of plain text.
- ///
- ///
- public virtual int AddPadding(byte[] input, int inOff)
- {
- int count = input.Length - inOff;
- byte code;
-
- if (inOff > 0)
- {
- code = (byte)((input[inOff - 1] & 0x01) == 0?0xff:0x00);
- }
- else
- {
- code = (byte)((input[input.Length - 1] & 0x01) == 0?0xff:0x00);
- }
-
- while (inOff < input.Length)
- {
- input[inOff] = code;
- inOff++;
- }
-
- return count;
- }
-
- /// return the number of pad bytes present in the block.
- public virtual int PadCount(byte[] input)
- {
- byte code = input[input.Length - 1];
-
- int index = input.Length - 1;
- while (index > 0 && input[index - 1] == code)
- {
- index--;
- }
-
- return input.Length - index;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/paddings/X923Padding.cs b/BCCrypto/src/crypto/paddings/X923Padding.cs
deleted file mode 100644
index cc1b52b..0000000
--- a/BCCrypto/src/crypto/paddings/X923Padding.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Paddings
-{
- /**
- * A padder that adds X9.23 padding to a block - if a SecureRandom is
- * passed in random padding is assumed, otherwise padding with zeros is used.
- */
- public class X923Padding
- : IBlockCipherPadding
- {
- private SecureRandom random;
-
- /**
- * Initialise the padder.
- *
- * @param random a SecureRandom if one is available.
- */
- public void Init(
- SecureRandom random)
- {
- this.random = random;
- }
-
- /**
- * Return the name of the algorithm the cipher implements.
- *
- * @return the name of the algorithm the cipher implements.
- */
- public string PaddingName
- {
- get { return "X9.23"; }
- }
-
- /**
- * add the pad bytes to the passed in block, returning the
- * number of bytes added.
- */
- public int AddPadding(
- byte[] input,
- int inOff)
- {
- byte code = (byte)(input.Length - inOff);
-
- while (inOff < input.Length - 1)
- {
- if (random == null)
- {
- input[inOff] = 0;
- }
- else
- {
- input[inOff] = (byte)random.NextInt();
- }
- inOff++;
- }
-
- input[inOff] = code;
-
- return code;
- }
-
- /**
- * return the number of pad bytes present in the block.
- */
- public int PadCount(
- byte[] input)
- {
- int count = input[input.Length - 1] & 0xff;
-
- if (count > input.Length)
- {
- throw new InvalidCipherTextException("pad block corrupted");
- }
-
- return count;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/paddings/ZeroBytePadding.cs b/BCCrypto/src/crypto/paddings/ZeroBytePadding.cs
deleted file mode 100644
index 0d55ca4..0000000
--- a/BCCrypto/src/crypto/paddings/ZeroBytePadding.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using System;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Paddings
-{
-
- /// A padder that adds Null byte padding to a block.
- public class ZeroBytePadding : IBlockCipherPadding
- {
- /// Return the name of the algorithm the cipher implements.
- ///
- ///
- /// the name of the algorithm the cipher implements.
- ///
- public string PaddingName
- {
- get { return "ZeroBytePadding"; }
- }
-
- /// Initialise the padder.
- ///
- ///
- /// - a SecureRandom if available.
- ///
- public void Init(SecureRandom random)
- {
- // nothing to do.
- }
-
- /// add the pad bytes to the passed in block, returning the
- /// number of bytes added.
- ///
- public int AddPadding(
- byte[] input,
- int inOff)
- {
- int added = (input.Length - inOff);
-
- while (inOff < input.Length)
- {
- input[inOff] = (byte) 0;
- inOff++;
- }
-
- return added;
- }
-
- /// return the number of pad bytes present in the block.
- public int PadCount(
- byte[] input)
- {
- int count = input.Length;
-
- while (count > 0)
- {
- if (input[count - 1] != 0)
- {
- break;
- }
-
- count--;
- }
-
- return input.Length - count;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/AEADParameters.cs b/BCCrypto/src/crypto/parameters/AEADParameters.cs
deleted file mode 100644
index 825d6b7..0000000
--- a/BCCrypto/src/crypto/parameters/AEADParameters.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class AeadParameters
- : ICipherParameters
- {
- private readonly byte[] associatedText;
- private readonly byte[] nonce;
- private readonly KeyParameter key;
- private readonly int macSize;
-
- /**
- * Base constructor.
- *
- * @param key key to be used by underlying cipher
- * @param macSize macSize in bits
- * @param nonce nonce to be used
- */
- public AeadParameters(KeyParameter key, int macSize, byte[] nonce)
- : this(key, macSize, nonce, null)
- {
- }
-
- /**
- * Base constructor.
- *
- * @param key key to be used by underlying cipher
- * @param macSize macSize in bits
- * @param nonce nonce to be used
- * @param associatedText associated text, if any
- */
- public AeadParameters(
- KeyParameter key,
- int macSize,
- byte[] nonce,
- byte[] associatedText)
- {
- this.key = key;
- this.nonce = nonce;
- this.macSize = macSize;
- this.associatedText = associatedText;
- }
-
- public virtual KeyParameter Key
- {
- get { return key; }
- }
-
- public virtual int MacSize
- {
- get { return macSize; }
- }
-
- public virtual byte[] GetAssociatedText()
- {
- return associatedText;
- }
-
- public virtual byte[] GetNonce()
- {
- return nonce;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/CcmParameters.cs b/BCCrypto/src/crypto/parameters/CcmParameters.cs
deleted file mode 100644
index d445908..0000000
--- a/BCCrypto/src/crypto/parameters/CcmParameters.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- [Obsolete("Use AeadParameters")]
- public class CcmParameters
- : AeadParameters
- {
- /**
- * Base constructor.
- *
- * @param key key to be used by underlying cipher
- * @param macSize macSize in bits
- * @param nonce nonce to be used
- * @param associatedText associated text, if any
- */
- public CcmParameters(
- KeyParameter key,
- int macSize,
- byte[] nonce,
- byte[] associatedText)
- : base(key, macSize, nonce, associatedText)
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DHKeyGenerationParameters.cs b/BCCrypto/src/crypto/parameters/DHKeyGenerationParameters.cs
deleted file mode 100644
index ab3e18f..0000000
--- a/BCCrypto/src/crypto/parameters/DHKeyGenerationParameters.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DHKeyGenerationParameters
- : KeyGenerationParameters
- {
- private readonly DHParameters parameters;
-
- public DHKeyGenerationParameters(
- SecureRandom random,
- DHParameters parameters)
- : base(random, GetStrength(parameters))
- {
- this.parameters = parameters;
- }
-
- public DHParameters Parameters
- {
- get { return parameters; }
- }
-
- internal static int GetStrength(
- DHParameters parameters)
- {
- return parameters.L != 0 ? parameters.L : parameters.P.BitLength;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DHKeyParameters.cs b/BCCrypto/src/crypto/parameters/DHKeyParameters.cs
deleted file mode 100644
index 1a5c138..0000000
--- a/BCCrypto/src/crypto/parameters/DHKeyParameters.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DHKeyParameters
- : AsymmetricKeyParameter
- {
- private readonly DHParameters parameters;
- private readonly DerObjectIdentifier algorithmOid;
-
- protected DHKeyParameters(
- bool isPrivate,
- DHParameters parameters)
- : this(isPrivate, parameters, PkcsObjectIdentifiers.DhKeyAgreement)
- {
- }
-
- protected DHKeyParameters(
- bool isPrivate,
- DHParameters parameters,
- DerObjectIdentifier algorithmOid)
- : base(isPrivate)
- {
- // TODO Should we allow parameters to be null?
- this.parameters = parameters;
- this.algorithmOid = algorithmOid;
- }
-
- public DHParameters Parameters
- {
- get { return parameters; }
- }
-
- public DerObjectIdentifier AlgorithmOid
- {
- get { return algorithmOid; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- DHKeyParameters other = obj as DHKeyParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- DHKeyParameters other)
- {
- return Platform.Equals(parameters, other.parameters)
- && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- int hc = base.GetHashCode();
-
- if (parameters != null)
- {
- hc ^= parameters.GetHashCode();
- }
-
- return hc;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DHParameters.cs b/BCCrypto/src/crypto/parameters/DHParameters.cs
deleted file mode 100644
index bdea124..0000000
--- a/BCCrypto/src/crypto/parameters/DHParameters.cs
+++ /dev/null
@@ -1,185 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DHParameters
- : ICipherParameters
- {
- private const int DefaultMinimumLength = 160;
-
- private readonly BigInteger p, g, q, j;
- private readonly int m, l;
- private readonly DHValidationParameters validation;
-
- private static int GetDefaultMParam(
- int lParam)
- {
- if (lParam == 0)
- return DefaultMinimumLength;
-
- return System.Math.Min(lParam, DefaultMinimumLength);
- }
-
- public DHParameters(
- BigInteger p,
- BigInteger g)
- : this(p, g, null, 0)
- {
- }
-
- public DHParameters(
- BigInteger p,
- BigInteger g,
- BigInteger q)
- : this(p, g, q, 0)
- {
- }
-
- public DHParameters(
- BigInteger p,
- BigInteger g,
- BigInteger q,
- int l)
- : this(p, g, q, GetDefaultMParam(l), l, null, null)
- {
- }
-
- public DHParameters(
- BigInteger p,
- BigInteger g,
- BigInteger q,
- int m,
- int l)
- : this(p, g, q, m, l, null, null)
- {
- }
-
- public DHParameters(
- BigInteger p,
- BigInteger g,
- BigInteger q,
- BigInteger j,
- DHValidationParameters validation)
- : this(p, g, q, DefaultMinimumLength, 0, j, validation)
- {
- }
-
- public DHParameters(
- BigInteger p,
- BigInteger g,
- BigInteger q,
- int m,
- int l,
- BigInteger j,
- DHValidationParameters validation)
- {
- if (p == null)
- throw new ArgumentNullException("p");
- if (g == null)
- throw new ArgumentNullException("g");
- if (!p.TestBit(0))
- throw new ArgumentException("field must be an odd prime", "p");
- if (g.CompareTo(BigInteger.Two) < 0
- || g.CompareTo(p.Subtract(BigInteger.Two)) > 0)
- throw new ArgumentException("generator must in the range [2, p - 2]", "g");
- if (q != null && q.BitLength >= p.BitLength)
- throw new ArgumentException("q too big to be a factor of (p-1)", "q");
- if (m >= p.BitLength)
- throw new ArgumentException("m value must be < bitlength of p", "m");
- if (l != 0)
- {
- // TODO Check this against the Java version, which has 'l > p.BitLength' here
- if (l >= p.BitLength)
- throw new ArgumentException("when l value specified, it must be less than bitlength(p)", "l");
- if (l < m)
- throw new ArgumentException("when l value specified, it may not be less than m value", "l");
- }
- if (j != null && j.CompareTo(BigInteger.Two) < 0)
- throw new ArgumentException("subgroup factor must be >= 2", "j");
-
- // TODO If q, j both provided, validate p = jq + 1 ?
-
- this.p = p;
- this.g = g;
- this.q = q;
- this.m = m;
- this.l = l;
- this.j = j;
- this.validation = validation;
- }
-
- public BigInteger P
- {
- get { return p; }
- }
-
- public BigInteger G
- {
- get { return g; }
- }
-
- public BigInteger Q
- {
- get { return q; }
- }
-
- public BigInteger J
- {
- get { return j; }
- }
-
- /// The minimum bitlength of the private value.
- public int M
- {
- get { return m; }
- }
-
- /// The bitlength of the private value.
- public int L
- {
- get { return l; }
- }
-
- public DHValidationParameters ValidationParameters
- {
- get { return validation; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- DHParameters other = obj as DHParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected virtual bool Equals(
- DHParameters other)
- {
- return p.Equals(other.p)
- && g.Equals(other.g)
- && Platform.Equals(q, other.q);
- }
-
- public override int GetHashCode()
- {
- int hc = p.GetHashCode() ^ g.GetHashCode();
-
- if (q != null)
- {
- hc ^= q.GetHashCode();
- }
-
- return hc;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DHPrivateKeyParameters.cs b/BCCrypto/src/crypto/parameters/DHPrivateKeyParameters.cs
deleted file mode 100644
index fc724df..0000000
--- a/BCCrypto/src/crypto/parameters/DHPrivateKeyParameters.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DHPrivateKeyParameters
- : DHKeyParameters
- {
- private readonly BigInteger x;
-
- public DHPrivateKeyParameters(
- BigInteger x,
- DHParameters parameters)
- : base(true, parameters)
- {
- this.x = x;
- }
-
- public DHPrivateKeyParameters(
- BigInteger x,
- DHParameters parameters,
- DerObjectIdentifier algorithmOid)
- : base(true, parameters, algorithmOid)
- {
- this.x = x;
- }
-
- public BigInteger X
- {
- get { return x; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- DHPrivateKeyParameters other = obj as DHPrivateKeyParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- DHPrivateKeyParameters other)
- {
- return x.Equals(other.x) && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- return x.GetHashCode() ^ base.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DHPublicKeyParameters.cs b/BCCrypto/src/crypto/parameters/DHPublicKeyParameters.cs
deleted file mode 100644
index e7aeeff..0000000
--- a/BCCrypto/src/crypto/parameters/DHPublicKeyParameters.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DHPublicKeyParameters
- : DHKeyParameters
- {
- private static BigInteger Validate(BigInteger y, DHParameters dhParams)
- {
- if (y == null)
- throw new ArgumentNullException("y");
-
- // TLS check
- if (y.CompareTo(BigInteger.Two) < 0 || y.CompareTo(dhParams.P.Subtract(BigInteger.Two)) > 0)
- throw new ArgumentException("invalid DH public key", "y");
-
- // we can't validate without Q.
- if (dhParams.Q != null
- && !y.ModPow(dhParams.Q, dhParams.P).Equals(BigInteger.One))
- {
- throw new ArgumentException("y value does not appear to be in correct group", "y");
- }
-
- return y;
- }
-
- private readonly BigInteger y;
-
- public DHPublicKeyParameters(
- BigInteger y,
- DHParameters parameters)
- : base(false, parameters)
- {
- this.y = Validate(y, parameters);
- }
-
- public DHPublicKeyParameters(
- BigInteger y,
- DHParameters parameters,
- DerObjectIdentifier algorithmOid)
- : base(false, parameters, algorithmOid)
- {
- this.y = Validate(y, parameters);
- }
-
- public virtual BigInteger Y
- {
- get { return y; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- DHPublicKeyParameters other = obj as DHPublicKeyParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- DHPublicKeyParameters other)
- {
- return y.Equals(other.y) && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- return y.GetHashCode() ^ base.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DHValidationParameters.cs b/BCCrypto/src/crypto/parameters/DHValidationParameters.cs
deleted file mode 100644
index 50c0739..0000000
--- a/BCCrypto/src/crypto/parameters/DHValidationParameters.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DHValidationParameters
- {
- private readonly byte[] seed;
- private readonly int counter;
-
- public DHValidationParameters(
- byte[] seed,
- int counter)
- {
- if (seed == null)
- throw new ArgumentNullException("seed");
-
- this.seed = (byte[]) seed.Clone();
- this.counter = counter;
- }
-
- public byte[] GetSeed()
- {
- return (byte[]) seed.Clone();
- }
-
- public int Counter
- {
- get { return counter; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- DHValidationParameters other = obj as DHValidationParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- DHValidationParameters other)
- {
- return counter == other.counter
- && Arrays.AreEqual(this.seed, other.seed);
- }
-
- public override int GetHashCode()
- {
- return counter.GetHashCode() ^ Arrays.GetHashCode(seed);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DSAParameterGenerationParameters.cs b/BCCrypto/src/crypto/parameters/DSAParameterGenerationParameters.cs
deleted file mode 100644
index 7427574..0000000
--- a/BCCrypto/src/crypto/parameters/DSAParameterGenerationParameters.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DsaParameterGenerationParameters
- {
- public const int DigitalSignatureUsage = 1;
- public const int KeyEstablishmentUsage = 2;
-
- private readonly int l;
- private readonly int n;
- private readonly int certainty;
- private readonly SecureRandom random;
- private readonly int usageIndex;
-
- /**
- * Construct without a usage index, this will do a random construction of G.
- *
- * @param L desired length of prime P in bits (the effective key size).
- * @param N desired length of prime Q in bits.
- * @param certainty certainty level for prime number generation.
- * @param random the source of randomness to use.
- */
- public DsaParameterGenerationParameters(int L, int N, int certainty, SecureRandom random)
- : this(L, N, certainty, random, -1)
- {
- }
-
- /**
- * Construct for a specific usage index - this has the effect of using verifiable canonical generation of G.
- *
- * @param L desired length of prime P in bits (the effective key size).
- * @param N desired length of prime Q in bits.
- * @param certainty certainty level for prime number generation.
- * @param random the source of randomness to use.
- * @param usageIndex a valid usage index.
- */
- public DsaParameterGenerationParameters(int L, int N, int certainty, SecureRandom random, int usageIndex)
- {
- this.l = L;
- this.n = N;
- this.certainty = certainty;
- this.random = random;
- this.usageIndex = usageIndex;
- }
-
- public virtual int L
- {
- get { return l; }
- }
-
- public virtual int N
- {
- get { return n; }
- }
-
- public virtual int UsageIndex
- {
- get { return usageIndex; }
- }
-
- public virtual int Certainty
- {
- get { return certainty; }
- }
-
- public virtual SecureRandom Random
- {
- get { return random; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DesEdeParameters.cs b/BCCrypto/src/crypto/parameters/DesEdeParameters.cs
deleted file mode 100644
index 6be56fb..0000000
--- a/BCCrypto/src/crypto/parameters/DesEdeParameters.cs
+++ /dev/null
@@ -1,140 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DesEdeParameters
- : DesParameters
- {
- /*
- * DES-EDE Key length in bytes.
- */
- public const int DesEdeKeyLength = 24;
-
- private static byte[] FixKey(
- byte[] key,
- int keyOff,
- int keyLen)
- {
- byte[] tmp = new byte[24];
-
- switch (keyLen)
- {
- case 16:
- Array.Copy(key, keyOff, tmp, 0, 16);
- Array.Copy(key, keyOff, tmp, 16, 8);
- break;
- case 24:
- Array.Copy(key, keyOff, tmp, 0, 24);
- break;
- default:
- throw new ArgumentException("Bad length for DESede key: " + keyLen, "keyLen");
- }
-
- if (IsWeakKey(tmp))
- throw new ArgumentException("attempt to create weak DESede key");
-
- return tmp;
- }
-
- public DesEdeParameters(
- byte[] key)
- : base(FixKey(key, 0, key.Length))
- {
- }
-
- public DesEdeParameters(
- byte[] key,
- int keyOff,
- int keyLen)
- : base(FixKey(key, keyOff, keyLen))
- {
- }
-
- /**
- * return true if the passed in key is a DES-EDE weak key.
- *
- * @param key bytes making up the key
- * @param offset offset into the byte array the key starts at
- * @param length number of bytes making up the key
- */
- public static bool IsWeakKey(
- byte[] key,
- int offset,
- int length)
- {
- for (int i = offset; i < length; i += DesKeyLength)
- {
- if (DesParameters.IsWeakKey(key, i))
- {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * return true if the passed in key is a DES-EDE weak key.
- *
- * @param key bytes making up the key
- * @param offset offset into the byte array the key starts at
- */
- public static new bool IsWeakKey(
- byte[] key,
- int offset)
- {
- return IsWeakKey(key, offset, key.Length - offset);
- }
-
- public static new bool IsWeakKey(
- byte[] key)
- {
- return IsWeakKey(key, 0, key.Length);
- }
-
- /**
- * return true if the passed in key is a real 2/3 part DES-EDE key.
- *
- * @param key bytes making up the key
- * @param offset offset into the byte array the key starts at
- */
- public static bool IsRealEdeKey(byte[] key, int offset)
- {
- return key.Length == 16 ? IsReal2Key(key, offset) : IsReal3Key(key, offset);
- }
-
- /**
- * return true if the passed in key is a real 2 part DES-EDE key.
- *
- * @param key bytes making up the key
- * @param offset offset into the byte array the key starts at
- */
- public static bool IsReal2Key(byte[] key, int offset)
- {
- bool isValid = false;
- for (int i = offset; i != offset + 8; i++)
- {
- isValid |= (key[i] != key[i + 8]);
- }
- return isValid;
- }
-
- /**
- * return true if the passed in key is a real 3 part DES-EDE key.
- *
- * @param key bytes making up the key
- * @param offset offset into the byte array the key starts at
- */
- public static bool IsReal3Key(byte[] key, int offset)
- {
- bool diff12 = false, diff13 = false, diff23 = false;
- for (int i = offset; i != offset + 8; i++)
- {
- diff12 |= (key[i] != key[i + 8]);
- diff13 |= (key[i] != key[i + 16]);
- diff23 |= (key[i + 8] != key[i + 16]);
- }
- return diff12 && diff13 && diff23;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DesParameters.cs b/BCCrypto/src/crypto/parameters/DesParameters.cs
deleted file mode 100644
index a1f67e2..0000000
--- a/BCCrypto/src/crypto/parameters/DesParameters.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DesParameters
- : KeyParameter
- {
- public DesParameters(
- byte[] key)
- : base(key)
- {
- if (IsWeakKey(key))
- throw new ArgumentException("attempt to create weak DES key");
- }
-
- public DesParameters(
- byte[] key,
- int keyOff,
- int keyLen)
- : base(key, keyOff, keyLen)
- {
- if (IsWeakKey(key, keyOff))
- throw new ArgumentException("attempt to create weak DES key");
- }
-
- /*
- * DES Key Length in bytes.
- */
- public const int DesKeyLength = 8;
-
- /*
- * Table of weak and semi-weak keys taken from Schneier pp281
- */
- private const int N_DES_WEAK_KEYS = 16;
-
- private static readonly byte[] DES_weak_keys =
- {
- /* weak keys */
- (byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01, (byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01,
- (byte)0x1f,(byte)0x1f,(byte)0x1f,(byte)0x1f, (byte)0x0e,(byte)0x0e,(byte)0x0e,(byte)0x0e,
- (byte)0xe0,(byte)0xe0,(byte)0xe0,(byte)0xe0, (byte)0xf1,(byte)0xf1,(byte)0xf1,(byte)0xf1,
- (byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe, (byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe,
-
- /* semi-weak keys */
- (byte)0x01,(byte)0xfe,(byte)0x01,(byte)0xfe, (byte)0x01,(byte)0xfe,(byte)0x01,(byte)0xfe,
- (byte)0x1f,(byte)0xe0,(byte)0x1f,(byte)0xe0, (byte)0x0e,(byte)0xf1,(byte)0x0e,(byte)0xf1,
- (byte)0x01,(byte)0xe0,(byte)0x01,(byte)0xe0, (byte)0x01,(byte)0xf1,(byte)0x01,(byte)0xf1,
- (byte)0x1f,(byte)0xfe,(byte)0x1f,(byte)0xfe, (byte)0x0e,(byte)0xfe,(byte)0x0e,(byte)0xfe,
- (byte)0x01,(byte)0x1f,(byte)0x01,(byte)0x1f, (byte)0x01,(byte)0x0e,(byte)0x01,(byte)0x0e,
- (byte)0xe0,(byte)0xfe,(byte)0xe0,(byte)0xfe, (byte)0xf1,(byte)0xfe,(byte)0xf1,(byte)0xfe,
- (byte)0xfe,(byte)0x01,(byte)0xfe,(byte)0x01, (byte)0xfe,(byte)0x01,(byte)0xfe,(byte)0x01,
- (byte)0xe0,(byte)0x1f,(byte)0xe0,(byte)0x1f, (byte)0xf1,(byte)0x0e,(byte)0xf1,(byte)0x0e,
- (byte)0xe0,(byte)0x01,(byte)0xe0,(byte)0x01, (byte)0xf1,(byte)0x01,(byte)0xf1,(byte)0x01,
- (byte)0xfe,(byte)0x1f,(byte)0xfe,(byte)0x1f, (byte)0xfe,(byte)0x0e,(byte)0xfe,(byte)0x0e,
- (byte)0x1f,(byte)0x01,(byte)0x1f,(byte)0x01, (byte)0x0e,(byte)0x01,(byte)0x0e,(byte)0x01,
- (byte)0xfe,(byte)0xe0,(byte)0xfe,(byte)0xe0, (byte)0xfe,(byte)0xf1,(byte)0xfe,(byte)0xf1
- };
-
- /**
- * DES has 16 weak keys. This method will check
- * if the given DES key material is weak or semi-weak.
- * Key material that is too short is regarded as weak.
- *
- * See "Applied
- * Cryptography" by Bruce Schneier for more information.
- *
- * @return true if the given DES key material is weak or semi-weak,
- * false otherwise.
- */
- public static bool IsWeakKey(
- byte[] key,
- int offset)
- {
- if (key.Length - offset < DesKeyLength)
- throw new ArgumentException("key material too short.");
-
- //nextkey:
- for (int i = 0; i < N_DES_WEAK_KEYS; i++)
- {
- bool unmatch = false;
- for (int j = 0; j < DesKeyLength; j++)
- {
- if (key[j + offset] != DES_weak_keys[i * DesKeyLength + j])
- {
- //continue nextkey;
- unmatch = true;
- break;
- }
- }
-
- if (!unmatch)
- {
- return true;
- }
- }
-
- return false;
- }
-
- public static bool IsWeakKey(
- byte[] key)
- {
- return IsWeakKey(key, 0);
- }
-
- public static byte SetOddParity(byte b)
- {
- uint parity = b ^ 1U;
- parity ^= (parity >> 4);
- parity ^= (parity >> 2);
- parity ^= (parity >> 1);
- parity &= 1U;
-
- return (byte)(b ^ parity);
- }
-
- /**
- * DES Keys use the LSB as the odd parity bit. This can
- * be used to check for corrupt keys.
- *
- * @param bytes the byte array to set the parity on.
- */
- public static void SetOddParity(byte[] bytes)
- {
- for (int i = 0; i < bytes.Length; i++)
- {
- bytes[i] = SetOddParity(bytes[i]);
- }
- }
-
- public static void SetOddParity(byte[] bytes, int off, int len)
- {
- for (int i = 0; i < len; i++)
- {
- bytes[off + i] = SetOddParity(bytes[off + i]);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DsaKeyGenerationParameters.cs b/BCCrypto/src/crypto/parameters/DsaKeyGenerationParameters.cs
deleted file mode 100644
index 86d6f5b..0000000
--- a/BCCrypto/src/crypto/parameters/DsaKeyGenerationParameters.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DsaKeyGenerationParameters
- : KeyGenerationParameters
- {
- private readonly DsaParameters parameters;
-
- public DsaKeyGenerationParameters(
- SecureRandom random,
- DsaParameters parameters)
- : base(random, parameters.P.BitLength - 1)
- {
- this.parameters = parameters;
- }
-
- public DsaParameters Parameters
- {
- get { return parameters; }
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/parameters/DsaKeyParameters.cs b/BCCrypto/src/crypto/parameters/DsaKeyParameters.cs
deleted file mode 100644
index 5fe6d7a..0000000
--- a/BCCrypto/src/crypto/parameters/DsaKeyParameters.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public abstract class DsaKeyParameters
- : AsymmetricKeyParameter
- {
- private readonly DsaParameters parameters;
-
- protected DsaKeyParameters(
- bool isPrivate,
- DsaParameters parameters)
- : base(isPrivate)
- {
- // Note: parameters may be null
- this.parameters = parameters;
- }
-
- public DsaParameters Parameters
- {
- get { return parameters; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- DsaKeyParameters other = obj as DsaKeyParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- DsaKeyParameters other)
- {
- return Platform.Equals(parameters, other.parameters)
- && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- int hc = base.GetHashCode();
-
- if (parameters != null)
- {
- hc ^= parameters.GetHashCode();
- }
-
- return hc;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DsaParameters.cs b/BCCrypto/src/crypto/parameters/DsaParameters.cs
deleted file mode 100644
index 50d080e..0000000
--- a/BCCrypto/src/crypto/parameters/DsaParameters.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DsaParameters
- : ICipherParameters
- {
- private readonly BigInteger p, q , g;
- private readonly DsaValidationParameters validation;
-
- public DsaParameters(
- BigInteger p,
- BigInteger q,
- BigInteger g)
- : this(p, q, g, null)
- {
- }
-
- public DsaParameters(
- BigInteger p,
- BigInteger q,
- BigInteger g,
- DsaValidationParameters parameters)
- {
- if (p == null)
- throw new ArgumentNullException("p");
- if (q == null)
- throw new ArgumentNullException("q");
- if (g == null)
- throw new ArgumentNullException("g");
-
- this.p = p;
- this.q = q;
- this.g = g;
- this.validation = parameters;
- }
-
- public BigInteger P
- {
- get { return p; }
- }
-
- public BigInteger Q
- {
- get { return q; }
- }
-
- public BigInteger G
- {
- get { return g; }
- }
-
- public DsaValidationParameters ValidationParameters
- {
- get { return validation; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- DsaParameters other = obj as DsaParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- DsaParameters other)
- {
- return p.Equals(other.p) && q.Equals(other.q) && g.Equals(other.g);
- }
-
- public override int GetHashCode()
- {
- return p.GetHashCode() ^ q.GetHashCode() ^ g.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DsaPrivateKeyParameters.cs b/BCCrypto/src/crypto/parameters/DsaPrivateKeyParameters.cs
deleted file mode 100644
index 2abdd0e..0000000
--- a/BCCrypto/src/crypto/parameters/DsaPrivateKeyParameters.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DsaPrivateKeyParameters
- : DsaKeyParameters
- {
- private readonly BigInteger x;
-
- public DsaPrivateKeyParameters(
- BigInteger x,
- DsaParameters parameters)
- : base(true, parameters)
- {
- if (x == null)
- throw new ArgumentNullException("x");
-
- this.x = x;
- }
-
- public BigInteger X
- {
- get { return x; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- DsaPrivateKeyParameters other = obj as DsaPrivateKeyParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- DsaPrivateKeyParameters other)
- {
- return x.Equals(other.x) && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- return x.GetHashCode() ^ base.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DsaPublicKeyParameters.cs b/BCCrypto/src/crypto/parameters/DsaPublicKeyParameters.cs
deleted file mode 100644
index 3a81bfd..0000000
--- a/BCCrypto/src/crypto/parameters/DsaPublicKeyParameters.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DsaPublicKeyParameters
- : DsaKeyParameters
- {
- private static BigInteger Validate(BigInteger y, DsaParameters parameters)
- {
- // we can't validate without params, fortunately we can't use the key either...
- if (parameters != null)
- {
- if (y.CompareTo(BigInteger.Two) < 0
- || y.CompareTo(parameters.P.Subtract(BigInteger.Two)) > 0
- || !y.ModPow(parameters.Q, parameters.P).Equals(BigInteger.One))
- {
- throw new ArgumentException("y value does not appear to be in correct group");
- }
- }
-
- return y;
- }
-
- private readonly BigInteger y;
-
- public DsaPublicKeyParameters(
- BigInteger y,
- DsaParameters parameters)
- : base(false, parameters)
- {
- if (y == null)
- throw new ArgumentNullException("y");
-
- this.y = Validate(y, parameters);
- }
-
- public BigInteger Y
- {
- get { return y; }
- }
-
- public override bool Equals(object obj)
- {
- if (obj == this)
- return true;
-
- DsaPublicKeyParameters other = obj as DsaPublicKeyParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- DsaPublicKeyParameters other)
- {
- return y.Equals(other.y) && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- return y.GetHashCode() ^ base.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/DsaValidationParameters.cs b/BCCrypto/src/crypto/parameters/DsaValidationParameters.cs
deleted file mode 100644
index c2f84c7..0000000
--- a/BCCrypto/src/crypto/parameters/DsaValidationParameters.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class DsaValidationParameters
- {
- private readonly byte[] seed;
- private readonly int counter;
- private readonly int usageIndex;
-
- public DsaValidationParameters(byte[] seed, int counter)
- : this(seed, counter, -1)
- {
- }
-
- public DsaValidationParameters(
- byte[] seed,
- int counter,
- int usageIndex)
- {
- if (seed == null)
- throw new ArgumentNullException("seed");
-
- this.seed = (byte[]) seed.Clone();
- this.counter = counter;
- this.usageIndex = usageIndex;
- }
-
- public virtual byte[] GetSeed()
- {
- return (byte[]) seed.Clone();
- }
-
- public virtual int Counter
- {
- get { return counter; }
- }
-
- public virtual int UsageIndex
- {
- get { return usageIndex; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- DsaValidationParameters other = obj as DsaValidationParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected virtual bool Equals(
- DsaValidationParameters other)
- {
- return counter == other.counter
- && Arrays.AreEqual(seed, other.seed);
- }
-
- public override int GetHashCode()
- {
- return counter.GetHashCode() ^ Arrays.GetHashCode(seed);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ECDomainParameters.cs b/BCCrypto/src/crypto/parameters/ECDomainParameters.cs
deleted file mode 100644
index 732fbdf..0000000
--- a/BCCrypto/src/crypto/parameters/ECDomainParameters.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class ECDomainParameters
- {
- internal ECCurve curve;
- internal byte[] seed;
- internal ECPoint g;
- internal BigInteger n;
- internal BigInteger h;
-
- public ECDomainParameters(
- ECCurve curve,
- ECPoint g,
- BigInteger n)
- : this(curve, g, n, BigInteger.One)
- {
- }
-
- public ECDomainParameters(
- ECCurve curve,
- ECPoint g,
- BigInteger n,
- BigInteger h)
- : this(curve, g, n, h, null)
- {
- }
-
- public ECDomainParameters(
- ECCurve curve,
- ECPoint g,
- BigInteger n,
- BigInteger h,
- byte[] seed)
- {
- if (curve == null)
- throw new ArgumentNullException("curve");
- if (g == null)
- throw new ArgumentNullException("g");
- if (n == null)
- throw new ArgumentNullException("n");
- if (h == null)
- throw new ArgumentNullException("h");
-
- this.curve = curve;
- this.g = g.Normalize();
- this.n = n;
- this.h = h;
- this.seed = Arrays.Clone(seed);
- }
-
- public ECCurve Curve
- {
- get { return curve; }
- }
-
- public ECPoint G
- {
- get { return g; }
- }
-
- public BigInteger N
- {
- get { return n; }
- }
-
- public BigInteger H
- {
- get { return h; }
- }
-
- public byte[] GetSeed()
- {
- return Arrays.Clone(seed);
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- ECDomainParameters other = obj as ECDomainParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected virtual bool Equals(
- ECDomainParameters other)
- {
- return curve.Equals(other.curve)
- && g.Equals(other.g)
- && n.Equals(other.n)
- && h.Equals(other.h);
- }
-
- public override int GetHashCode()
- {
- int hc = curve.GetHashCode();
- hc *= 37;
- hc ^= g.GetHashCode();
- hc *= 37;
- hc ^= n.GetHashCode();
- hc *= 37;
- hc ^= h.GetHashCode();
- return hc;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ECKeyGenerationParameters.cs b/BCCrypto/src/crypto/parameters/ECKeyGenerationParameters.cs
deleted file mode 100644
index 9b2b988..0000000
--- a/BCCrypto/src/crypto/parameters/ECKeyGenerationParameters.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class ECKeyGenerationParameters
- : KeyGenerationParameters
- {
- private readonly ECDomainParameters domainParams;
- private readonly DerObjectIdentifier publicKeyParamSet;
-
- public ECKeyGenerationParameters(
- ECDomainParameters domainParameters,
- SecureRandom random)
- : base(random, domainParameters.N.BitLength)
- {
- this.domainParams = domainParameters;
- }
-
- public ECKeyGenerationParameters(
- DerObjectIdentifier publicKeyParamSet,
- SecureRandom random)
- : this(ECKeyParameters.LookupParameters(publicKeyParamSet), random)
- {
- this.publicKeyParamSet = publicKeyParamSet;
- }
-
- public ECDomainParameters DomainParameters
- {
- get { return domainParams; }
- }
-
- public DerObjectIdentifier PublicKeyParamSet
- {
- get { return publicKeyParamSet; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ECKeyParameters.cs b/BCCrypto/src/crypto/parameters/ECKeyParameters.cs
deleted file mode 100644
index 70b3543..0000000
--- a/BCCrypto/src/crypto/parameters/ECKeyParameters.cs
+++ /dev/null
@@ -1,136 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public abstract class ECKeyParameters
- : AsymmetricKeyParameter
- {
- private static readonly string[] algorithms = { "EC", "ECDSA", "ECDH", "ECDHC", "ECGOST3410", "ECMQV" };
-
- private readonly string algorithm;
- private readonly ECDomainParameters parameters;
- private readonly DerObjectIdentifier publicKeyParamSet;
-
- protected ECKeyParameters(
- string algorithm,
- bool isPrivate,
- ECDomainParameters parameters)
- : base(isPrivate)
- {
- if (algorithm == null)
- throw new ArgumentNullException("algorithm");
- if (parameters == null)
- throw new ArgumentNullException("parameters");
-
- this.algorithm = VerifyAlgorithmName(algorithm);
- this.parameters = parameters;
- }
-
- protected ECKeyParameters(
- string algorithm,
- bool isPrivate,
- DerObjectIdentifier publicKeyParamSet)
- : base(isPrivate)
- {
- if (algorithm == null)
- throw new ArgumentNullException("algorithm");
- if (publicKeyParamSet == null)
- throw new ArgumentNullException("publicKeyParamSet");
-
- this.algorithm = VerifyAlgorithmName(algorithm);
- this.parameters = LookupParameters(publicKeyParamSet);
- this.publicKeyParamSet = publicKeyParamSet;
- }
-
- public string AlgorithmName
- {
- get { return algorithm; }
- }
-
- public ECDomainParameters Parameters
- {
- get { return parameters; }
- }
-
- public DerObjectIdentifier PublicKeyParamSet
- {
- get { return publicKeyParamSet; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- ECDomainParameters other = obj as ECDomainParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- ECKeyParameters other)
- {
- return parameters.Equals(other.parameters) && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- return parameters.GetHashCode() ^ base.GetHashCode();
- }
-
- internal ECKeyGenerationParameters CreateKeyGenerationParameters(
- SecureRandom random)
- {
- if (publicKeyParamSet != null)
- {
- return new ECKeyGenerationParameters(publicKeyParamSet, random);
- }
-
- return new ECKeyGenerationParameters(parameters, random);
- }
-
- internal static string VerifyAlgorithmName(string algorithm)
- {
- string upper = Platform.ToUpperInvariant(algorithm);
- if (Array.IndexOf(algorithms, algorithm, 0, algorithms.Length) < 0)
- throw new ArgumentException("unrecognised algorithm: " + algorithm, "algorithm");
- return upper;
- }
-
- internal static ECDomainParameters LookupParameters(
- DerObjectIdentifier publicKeyParamSet)
- {
- if (publicKeyParamSet == null)
- throw new ArgumentNullException("publicKeyParamSet");
-
- ECDomainParameters p = ECGost3410NamedCurves.GetByOid(publicKeyParamSet);
-
- if (p == null)
- {
- X9ECParameters x9 = ECKeyPairGenerator.FindECCurveByOid(publicKeyParamSet);
-
- if (x9 == null)
- {
- throw new ArgumentException("OID is not a valid public key parameter set", "publicKeyParamSet");
- }
-
- p = new ECDomainParameters(x9.Curve, x9.G, x9.N, x9.H, x9.GetSeed());
- }
-
- return p;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ECPrivateKeyParameters.cs b/BCCrypto/src/crypto/parameters/ECPrivateKeyParameters.cs
deleted file mode 100644
index 4d0fa1f..0000000
--- a/BCCrypto/src/crypto/parameters/ECPrivateKeyParameters.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-using System;
-using System.Globalization;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class ECPrivateKeyParameters
- : ECKeyParameters
- {
- private readonly BigInteger d;
-
- public ECPrivateKeyParameters(
- BigInteger d,
- ECDomainParameters parameters)
- : this("EC", d, parameters)
- {
- }
-
- [Obsolete("Use version with explicit 'algorithm' parameter")]
- public ECPrivateKeyParameters(
- BigInteger d,
- DerObjectIdentifier publicKeyParamSet)
- : base("ECGOST3410", true, publicKeyParamSet)
- {
- if (d == null)
- throw new ArgumentNullException("d");
-
- this.d = d;
- }
-
- public ECPrivateKeyParameters(
- string algorithm,
- BigInteger d,
- ECDomainParameters parameters)
- : base(algorithm, true, parameters)
- {
- if (d == null)
- throw new ArgumentNullException("d");
-
- this.d = d;
- }
-
- public ECPrivateKeyParameters(
- string algorithm,
- BigInteger d,
- DerObjectIdentifier publicKeyParamSet)
- : base(algorithm, true, publicKeyParamSet)
- {
- if (d == null)
- throw new ArgumentNullException("d");
-
- this.d = d;
- }
-
- public BigInteger D
- {
- get { return d; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- ECPrivateKeyParameters other = obj as ECPrivateKeyParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- ECPrivateKeyParameters other)
- {
- return d.Equals(other.d) && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- return d.GetHashCode() ^ base.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ECPublicKeyParameters.cs b/BCCrypto/src/crypto/parameters/ECPublicKeyParameters.cs
deleted file mode 100644
index 474e5d8..0000000
--- a/BCCrypto/src/crypto/parameters/ECPublicKeyParameters.cs
+++ /dev/null
@@ -1,101 +0,0 @@
-using System;
-using System.Globalization;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math.EC;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class ECPublicKeyParameters
- : ECKeyParameters
- {
- private static ECPoint Validate(ECPoint q)
- {
- if (q == null)
- throw new ArgumentNullException("q");
- if (q.IsInfinity)
- throw new ArgumentException("point at infinity", "q");
-
- q = q.Normalize();
-
- if (!q.IsValid())
- throw new ArgumentException("point not on curve", "q");
-
- return q;
- }
-
- private readonly ECPoint q;
-
- public ECPublicKeyParameters(
- ECPoint q,
- ECDomainParameters parameters)
- : this("EC", q, parameters)
- {
- }
-
- [Obsolete("Use version with explicit 'algorithm' parameter")]
- public ECPublicKeyParameters(
- ECPoint q,
- DerObjectIdentifier publicKeyParamSet)
- : base("ECGOST3410", false, publicKeyParamSet)
- {
- if (q == null)
- throw new ArgumentNullException("q");
-
- this.q = Validate(q);
- }
-
- public ECPublicKeyParameters(
- string algorithm,
- ECPoint q,
- ECDomainParameters parameters)
- : base(algorithm, false, parameters)
- {
- if (q == null)
- throw new ArgumentNullException("q");
-
- this.q = Validate(q);
- }
-
- public ECPublicKeyParameters(
- string algorithm,
- ECPoint q,
- DerObjectIdentifier publicKeyParamSet)
- : base(algorithm, false, publicKeyParamSet)
- {
- if (q == null)
- throw new ArgumentNullException("q");
-
- this.q = Validate(q);
- }
-
- public ECPoint Q
- {
- get { return q; }
- }
-
- public override bool Equals(object obj)
- {
- if (obj == this)
- return true;
-
- ECPublicKeyParameters other = obj as ECPublicKeyParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- ECPublicKeyParameters other)
- {
- return q.Equals(other.q) && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- return q.GetHashCode() ^ base.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ElGamalKeyGenerationParameters.cs b/BCCrypto/src/crypto/parameters/ElGamalKeyGenerationParameters.cs
deleted file mode 100644
index 40ca70d..0000000
--- a/BCCrypto/src/crypto/parameters/ElGamalKeyGenerationParameters.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class ElGamalKeyGenerationParameters
- : KeyGenerationParameters
- {
- private readonly ElGamalParameters parameters;
-
- public ElGamalKeyGenerationParameters(
- SecureRandom random,
- ElGamalParameters parameters)
- : base(random, GetStrength(parameters))
- {
- this.parameters = parameters;
- }
-
- public ElGamalParameters Parameters
- {
- get { return parameters; }
- }
-
- internal static int GetStrength(
- ElGamalParameters parameters)
- {
- return parameters.L != 0 ? parameters.L : parameters.P.BitLength;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ElGamalKeyParameters.cs b/BCCrypto/src/crypto/parameters/ElGamalKeyParameters.cs
deleted file mode 100644
index 8b6e279..0000000
--- a/BCCrypto/src/crypto/parameters/ElGamalKeyParameters.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class ElGamalKeyParameters
- : AsymmetricKeyParameter
- {
- private readonly ElGamalParameters parameters;
-
- protected ElGamalKeyParameters(
- bool isPrivate,
- ElGamalParameters parameters)
- : base(isPrivate)
- {
- // TODO Should we allow 'parameters' to be null?
- this.parameters = parameters;
- }
-
- public ElGamalParameters Parameters
- {
- get { return parameters; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- ElGamalKeyParameters other = obj as ElGamalKeyParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- ElGamalKeyParameters other)
- {
- return Platform.Equals(parameters, other.parameters)
- && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- int hc = base.GetHashCode();
-
- if (parameters != null)
- {
- hc ^= parameters.GetHashCode();
- }
-
- return hc;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ElGamalParameters.cs b/BCCrypto/src/crypto/parameters/ElGamalParameters.cs
deleted file mode 100644
index ab6d3e7..0000000
--- a/BCCrypto/src/crypto/parameters/ElGamalParameters.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class ElGamalParameters
- : ICipherParameters
- {
- private readonly BigInteger p, g;
- private readonly int l;
-
- public ElGamalParameters(
- BigInteger p,
- BigInteger g)
- : this(p, g, 0)
- {
- }
-
- public ElGamalParameters(
- BigInteger p,
- BigInteger g,
- int l)
- {
- if (p == null)
- throw new ArgumentNullException("p");
- if (g == null)
- throw new ArgumentNullException("g");
-
- this.p = p;
- this.g = g;
- this.l = l;
- }
-
- public BigInteger P
- {
- get { return p; }
- }
-
- /**
- * return the generator - g
- */
- public BigInteger G
- {
- get { return g; }
- }
-
- /**
- * return private value limit - l
- */
- public int L
- {
- get { return l; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- ElGamalParameters other = obj as ElGamalParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- ElGamalParameters other)
- {
- return p.Equals(other.p) && g.Equals(other.g) && l == other.l;
- }
-
- public override int GetHashCode()
- {
- return p.GetHashCode() ^ g.GetHashCode() ^ l;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ElGamalPrivateKeyParameters.cs b/BCCrypto/src/crypto/parameters/ElGamalPrivateKeyParameters.cs
deleted file mode 100644
index 6363f2b..0000000
--- a/BCCrypto/src/crypto/parameters/ElGamalPrivateKeyParameters.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class ElGamalPrivateKeyParameters
- : ElGamalKeyParameters
- {
- private readonly BigInteger x;
-
- public ElGamalPrivateKeyParameters(
- BigInteger x,
- ElGamalParameters parameters)
- : base(true, parameters)
- {
- if (x == null)
- throw new ArgumentNullException("x");
-
- this.x = x;
- }
-
- public BigInteger X
- {
- get { return x; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- ElGamalPrivateKeyParameters other = obj as ElGamalPrivateKeyParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- ElGamalPrivateKeyParameters other)
- {
- return other.x.Equals(x) && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- return x.GetHashCode() ^ base.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ElGamalPublicKeyParameters.cs b/BCCrypto/src/crypto/parameters/ElGamalPublicKeyParameters.cs
deleted file mode 100644
index 25ac625..0000000
--- a/BCCrypto/src/crypto/parameters/ElGamalPublicKeyParameters.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class ElGamalPublicKeyParameters
- : ElGamalKeyParameters
- {
- private readonly BigInteger y;
-
- public ElGamalPublicKeyParameters(
- BigInteger y,
- ElGamalParameters parameters)
- : base(false, parameters)
- {
- if (y == null)
- throw new ArgumentNullException("y");
-
- this.y = y;
- }
-
- public BigInteger Y
- {
- get { return y; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- ElGamalPublicKeyParameters other = obj as ElGamalPublicKeyParameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- ElGamalPublicKeyParameters other)
- {
- return y.Equals(other.y) && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- return y.GetHashCode() ^ base.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/GOST3410KeyGenerationParameters.cs b/BCCrypto/src/crypto/parameters/GOST3410KeyGenerationParameters.cs
deleted file mode 100644
index b06a5d8..0000000
--- a/BCCrypto/src/crypto/parameters/GOST3410KeyGenerationParameters.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class Gost3410KeyGenerationParameters
- : KeyGenerationParameters
- {
- private readonly Gost3410Parameters parameters;
- private readonly DerObjectIdentifier publicKeyParamSet;
-
- public Gost3410KeyGenerationParameters(
- SecureRandom random,
- Gost3410Parameters parameters)
- : base(random, parameters.P.BitLength - 1)
- {
- this.parameters = parameters;
- }
-
- public Gost3410KeyGenerationParameters(
- SecureRandom random,
- DerObjectIdentifier publicKeyParamSet)
- : this(random, LookupParameters(publicKeyParamSet))
- {
- this.publicKeyParamSet = publicKeyParamSet;
- }
-
- public Gost3410Parameters Parameters
- {
- get { return parameters; }
- }
-
- public DerObjectIdentifier PublicKeyParamSet
- {
- get { return publicKeyParamSet; }
- }
-
- private static Gost3410Parameters LookupParameters(
- DerObjectIdentifier publicKeyParamSet)
- {
- if (publicKeyParamSet == null)
- throw new ArgumentNullException("publicKeyParamSet");
-
- Gost3410ParamSetParameters p = Gost3410NamedParameters.GetByOid(publicKeyParamSet);
-
- if (p == null)
- throw new ArgumentException("OID is not a valid CryptoPro public key parameter set", "publicKeyParamSet");
-
- return new Gost3410Parameters(p.P, p.Q, p.A);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/GOST3410KeyParameters.cs b/BCCrypto/src/crypto/parameters/GOST3410KeyParameters.cs
deleted file mode 100644
index f771c4d..0000000
--- a/BCCrypto/src/crypto/parameters/GOST3410KeyParameters.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public abstract class Gost3410KeyParameters
- : AsymmetricKeyParameter
- {
- private readonly Gost3410Parameters parameters;
- private readonly DerObjectIdentifier publicKeyParamSet;
-
- protected Gost3410KeyParameters(
- bool isPrivate,
- Gost3410Parameters parameters)
- : base(isPrivate)
- {
- this.parameters = parameters;
- }
-
- protected Gost3410KeyParameters(
- bool isPrivate,
- DerObjectIdentifier publicKeyParamSet)
- : base(isPrivate)
- {
- this.parameters = LookupParameters(publicKeyParamSet);
- this.publicKeyParamSet = publicKeyParamSet;
- }
-
- public Gost3410Parameters Parameters
- {
- get { return parameters; }
- }
-
- public DerObjectIdentifier PublicKeyParamSet
- {
- get { return publicKeyParamSet; }
- }
-
- // TODO Implement Equals/GetHashCode
-
- private static Gost3410Parameters LookupParameters(
- DerObjectIdentifier publicKeyParamSet)
- {
- if (publicKeyParamSet == null)
- throw new ArgumentNullException("publicKeyParamSet");
-
- Gost3410ParamSetParameters p = Gost3410NamedParameters.GetByOid(publicKeyParamSet);
-
- if (p == null)
- throw new ArgumentException("OID is not a valid CryptoPro public key parameter set", "publicKeyParamSet");
-
- return new Gost3410Parameters(p.P, p.Q, p.A);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/GOST3410Parameters.cs b/BCCrypto/src/crypto/parameters/GOST3410Parameters.cs
deleted file mode 100644
index 2ec167e..0000000
--- a/BCCrypto/src/crypto/parameters/GOST3410Parameters.cs
+++ /dev/null
@@ -1,86 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class Gost3410Parameters
- : ICipherParameters
- {
- private readonly BigInteger p, q, a;
- private readonly Gost3410ValidationParameters validation;
-
- public Gost3410Parameters(
- BigInteger p,
- BigInteger q,
- BigInteger a)
- : this(p, q, a, null)
- {
- }
-
- public Gost3410Parameters(
- BigInteger p,
- BigInteger q,
- BigInteger a,
- Gost3410ValidationParameters validation)
- {
- if (p == null)
- throw new ArgumentNullException("p");
- if (q == null)
- throw new ArgumentNullException("q");
- if (a == null)
- throw new ArgumentNullException("a");
-
- this.p = p;
- this.q = q;
- this.a = a;
- this.validation = validation;
- }
-
- public BigInteger P
- {
- get { return p; }
- }
-
- public BigInteger Q
- {
- get { return q; }
- }
-
- public BigInteger A
- {
- get { return a; }
- }
-
- public Gost3410ValidationParameters ValidationParameters
- {
- get { return validation; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- Gost3410Parameters other = obj as Gost3410Parameters;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- protected bool Equals(
- Gost3410Parameters other)
- {
- return p.Equals(other.p) && q.Equals(other.q) && a.Equals(other.a);
- }
-
- public override int GetHashCode()
- {
- return p.GetHashCode() ^ q.GetHashCode() ^ a.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/GOST3410PrivateKeyParameters.cs b/BCCrypto/src/crypto/parameters/GOST3410PrivateKeyParameters.cs
deleted file mode 100644
index e3a613d..0000000
--- a/BCCrypto/src/crypto/parameters/GOST3410PrivateKeyParameters.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class Gost3410PrivateKeyParameters
- : Gost3410KeyParameters
- {
- private readonly BigInteger x;
-
- public Gost3410PrivateKeyParameters(
- BigInteger x,
- Gost3410Parameters parameters)
- : base(true, parameters)
- {
- if (x.SignValue < 1 || x.BitLength > 256 || x.CompareTo(Parameters.Q) >= 0)
- throw new ArgumentException("Invalid x for GOST3410 private key", "x");
-
- this.x = x;
- }
-
- public Gost3410PrivateKeyParameters(
- BigInteger x,
- DerObjectIdentifier publicKeyParamSet)
- : base(true, publicKeyParamSet)
- {
- if (x.SignValue < 1 || x.BitLength > 256 || x.CompareTo(Parameters.Q) >= 0)
- throw new ArgumentException("Invalid x for GOST3410 private key", "x");
-
- this.x = x;
- }
-
- public BigInteger X
- {
- get { return x; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/GOST3410PublicKeyParameters.cs b/BCCrypto/src/crypto/parameters/GOST3410PublicKeyParameters.cs
deleted file mode 100644
index 96b7e91..0000000
--- a/BCCrypto/src/crypto/parameters/GOST3410PublicKeyParameters.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class Gost3410PublicKeyParameters
- : Gost3410KeyParameters
- {
- private readonly BigInteger y;
-
- public Gost3410PublicKeyParameters(
- BigInteger y,
- Gost3410Parameters parameters)
- : base(false, parameters)
- {
- if (y.SignValue < 1 || y.CompareTo(Parameters.P) >= 0)
- throw new ArgumentException("Invalid y for GOST3410 public key", "y");
-
- this.y = y;
- }
-
- public Gost3410PublicKeyParameters(
- BigInteger y,
- DerObjectIdentifier publicKeyParamSet)
- : base(false, publicKeyParamSet)
- {
- if (y.SignValue < 1 || y.CompareTo(Parameters.P) >= 0)
- throw new ArgumentException("Invalid y for GOST3410 public key", "y");
-
- this.y = y;
- }
-
- public BigInteger Y
- {
- get { return y; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/GOST3410ValidationParameters.cs b/BCCrypto/src/crypto/parameters/GOST3410ValidationParameters.cs
deleted file mode 100644
index 21e5af8..0000000
--- a/BCCrypto/src/crypto/parameters/GOST3410ValidationParameters.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class Gost3410ValidationParameters
- {
- private int x0;
- private int c;
- private long x0L;
- private long cL;
-
- public Gost3410ValidationParameters(
- int x0,
- int c)
- {
- this.x0 = x0;
- this.c = c;
- }
-
- public Gost3410ValidationParameters(
- long x0L,
- long cL)
- {
- this.x0L = x0L;
- this.cL = cL;
- }
-
- public int C { get { return c; } }
- public int X0 { get { return x0; } }
- public long CL { get { return cL; } }
- public long X0L { get { return x0L; } }
-
- public override bool Equals(
- object obj)
- {
- Gost3410ValidationParameters other = obj as Gost3410ValidationParameters;
-
- return other != null
- && other.c == this.c
- && other.x0 == this.x0
- && other.cL == this.cL
- && other.x0L == this.x0L;
- }
-
- public override int GetHashCode()
- {
- return c.GetHashCode() ^ x0.GetHashCode() ^ cL.GetHashCode() ^ x0L.GetHashCode();
- }
-
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/HKDFParameters.cs b/BCCrypto/src/crypto/parameters/HKDFParameters.cs
deleted file mode 100644
index 6d1465e..0000000
--- a/BCCrypto/src/crypto/parameters/HKDFParameters.cs
+++ /dev/null
@@ -1,119 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- /**
- * Parameter class for the HkdfBytesGenerator class.
- */
- public class HkdfParameters
- : IDerivationParameters
- {
- private readonly byte[] ikm;
- private readonly bool skipExpand;
- private readonly byte[] salt;
- private readonly byte[] info;
-
- private HkdfParameters(byte[] ikm, bool skip, byte[] salt, byte[] info)
- {
- if (ikm == null)
- throw new ArgumentNullException("ikm");
-
- this.ikm = Arrays.Clone(ikm);
- this.skipExpand = skip;
-
- if (salt == null || salt.Length == 0)
- {
- this.salt = null;
- }
- else
- {
- this.salt = Arrays.Clone(salt);
- }
-
- if (info == null)
- {
- this.info = new byte[0];
- }
- else
- {
- this.info = Arrays.Clone(info);
- }
- }
-
- /**
- * Generates parameters for HKDF, specifying both the optional salt and
- * optional info. Step 1: Extract won't be skipped.
- *
- * @param ikm the input keying material or seed
- * @param salt the salt to use, may be null for a salt for hashLen zeros
- * @param info the info to use, may be null for an info field of zero bytes
- */
- public HkdfParameters(byte[] ikm, byte[] salt, byte[] info)
- : this(ikm, false, salt, info)
- {
- }
-
- /**
- * Factory method that makes the HKDF skip the extract part of the key
- * derivation function.
- *
- * @param ikm the input keying material or seed, directly used for step 2:
- * Expand
- * @param info the info to use, may be null for an info field of zero bytes
- * @return HKDFParameters that makes the implementation skip step 1
- */
- public static HkdfParameters SkipExtractParameters(byte[] ikm, byte[] info)
- {
- return new HkdfParameters(ikm, true, null, info);
- }
-
- public static HkdfParameters DefaultParameters(byte[] ikm)
- {
- return new HkdfParameters(ikm, false, null, null);
- }
-
- /**
- * Returns the input keying material or seed.
- *
- * @return the keying material
- */
- public virtual byte[] GetIkm()
- {
- return Arrays.Clone(ikm);
- }
-
- /**
- * Returns if step 1: extract has to be skipped or not
- *
- * @return true for skipping, false for no skipping of step 1
- */
- public virtual bool SkipExtract
- {
- get { return skipExpand; }
- }
-
- /**
- * Returns the salt, or null if the salt should be generated as a byte array
- * of HashLen zeros.
- *
- * @return the salt, or null
- */
- public virtual byte[] GetSalt()
- {
- return Arrays.Clone(salt);
- }
-
- /**
- * Returns the info field, which may be empty (null is converted to empty).
- *
- * @return the info field, never null
- */
- public virtual byte[] GetInfo()
- {
- return Arrays.Clone(info);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ISO18033KDFParameters.cs b/BCCrypto/src/crypto/parameters/ISO18033KDFParameters.cs
deleted file mode 100644
index 2d8fff8..0000000
--- a/BCCrypto/src/crypto/parameters/ISO18033KDFParameters.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- /**
- * parameters for Key derivation functions for ISO-18033
- */
- public class Iso18033KdfParameters
- : IDerivationParameters
- {
- byte[] seed;
-
- public Iso18033KdfParameters(
- byte[] seed)
- {
- this.seed = seed;
- }
-
- public byte[] GetSeed()
- {
- return seed;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/IesParameters.cs b/BCCrypto/src/crypto/parameters/IesParameters.cs
deleted file mode 100644
index d306b2c..0000000
--- a/BCCrypto/src/crypto/parameters/IesParameters.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using System;
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- /**
- * parameters for using an integrated cipher in stream mode.
- */
- public class IesParameters : ICipherParameters
- {
- private byte[] derivation;
- private byte[] encoding;
- private int macKeySize;
-
- /**
- * @param derivation the derivation parameter for the KDF function.
- * @param encoding the encoding parameter for the KDF function.
- * @param macKeySize the size of the MAC key (in bits).
- */
- public IesParameters(
- byte[] derivation,
- byte[] encoding,
- int macKeySize)
- {
- this.derivation = derivation;
- this.encoding = encoding;
- this.macKeySize = macKeySize;
- }
-
- public byte[] GetDerivationV()
- {
- return derivation;
- }
-
- public byte[] GetEncodingV()
- {
- return encoding;
- }
-
- public int MacKeySize
- {
- get
- {
- return macKeySize;
- }
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/parameters/IesWithCipherParameters.cs b/BCCrypto/src/crypto/parameters/IesWithCipherParameters.cs
deleted file mode 100644
index 70ef55d..0000000
--- a/BCCrypto/src/crypto/parameters/IesWithCipherParameters.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class IesWithCipherParameters : IesParameters
- {
- private int cipherKeySize;
-
- /**
- * @param derivation the derivation parameter for the KDF function.
- * @param encoding the encoding parameter for the KDF function.
- * @param macKeySize the size of the MAC key (in bits).
- * @param cipherKeySize the size of the associated Cipher key (in bits).
- */
- public IesWithCipherParameters(
- byte[] derivation,
- byte[] encoding,
- int macKeySize,
- int cipherKeySize) : base(derivation, encoding, macKeySize)
- {
- this.cipherKeySize = cipherKeySize;
- }
-
- public int CipherKeySize
- {
- get
- {
- return cipherKeySize;
- }
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/parameters/KdfParameters.cs b/BCCrypto/src/crypto/parameters/KdfParameters.cs
deleted file mode 100644
index bc5c905..0000000
--- a/BCCrypto/src/crypto/parameters/KdfParameters.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using System;
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- /**
- * parameters for Key derivation functions for IEEE P1363a
- */
- public class KdfParameters : IDerivationParameters
- {
- byte[] iv;
- byte[] shared;
-
- public KdfParameters(
- byte[] shared,
- byte[] iv)
- {
- this.shared = shared;
- this.iv = iv;
- }
-
- public byte[] GetSharedSecret()
- {
- return shared;
- }
-
- public byte[] GetIV()
- {
- return iv;
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/parameters/KeyParameter.cs b/BCCrypto/src/crypto/parameters/KeyParameter.cs
deleted file mode 100644
index 8e79a5a..0000000
--- a/BCCrypto/src/crypto/parameters/KeyParameter.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-using System;
-using Org.BouncyCastle.Utilities;
-
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class KeyParameter
- : ICipherParameters
- {
- private byte[] key;
-
- public KeyParameter(
- byte[] key)
- {
- if (key == null)
- throw new ArgumentNullException("key");
-
- this.key = (byte[]) key.Clone();
- }
-
- public KeyParameter(
- byte[] key,
- int keyOff,
- int keyLen)
- {
- if (key == null)
- throw new ArgumentNullException("key");
- if (keyOff < 0 || keyOff > key.Length)
- throw new ArgumentOutOfRangeException("keyOff");
- if (keyLen < 0 || (keyOff + keyLen) > key.Length)
- throw new ArgumentOutOfRangeException("keyLen");
-
- this.key = new byte[keyLen];
- Array.Copy(key, keyOff, this.key, 0, keyLen);
- }
-
- public byte[] GetKey()
- {
- //return (byte[]) key.Clone();
- return key;
- }
-
- public void Reset()
- {
- BufferPool.ReturnBuffer(this.key);
- this.key = null;
- }
-
- public void SetKey( byte[] key )
- {
- SetKey(key, 0, key.Length);
- }
-
- public void SetKey(byte[] key, int keyoff, int keylen)
- {
- this.key = BufferPool.GetBuffer(keylen);
- Array.Copy(key, keyoff, this.key, 0, keylen);
- }
- }
-
-}
diff --git a/BCCrypto/src/crypto/parameters/MgfParameters.cs b/BCCrypto/src/crypto/parameters/MgfParameters.cs
deleted file mode 100644
index 11983b8..0000000
--- a/BCCrypto/src/crypto/parameters/MgfParameters.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- /// Parameters for mask derivation functions.
- public class MgfParameters
- : IDerivationParameters
- {
- private readonly byte[] seed;
-
- public MgfParameters(
- byte[] seed)
- : this(seed, 0, seed.Length)
- {
- }
-
- public MgfParameters(
- byte[] seed,
- int off,
- int len)
- {
- this.seed = new byte[len];
- Array.Copy(seed, off, this.seed, 0, len);
- }
-
- public byte[] GetSeed()
- {
- return (byte[]) seed.Clone();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/MqvPrivateParameters.cs b/BCCrypto/src/crypto/parameters/MqvPrivateParameters.cs
deleted file mode 100644
index 9159cac..0000000
--- a/BCCrypto/src/crypto/parameters/MqvPrivateParameters.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class MqvPrivateParameters
- : ICipherParameters
- {
- private readonly ECPrivateKeyParameters staticPrivateKey;
- private readonly ECPrivateKeyParameters ephemeralPrivateKey;
- private readonly ECPublicKeyParameters ephemeralPublicKey;
-
- public MqvPrivateParameters(
- ECPrivateKeyParameters staticPrivateKey,
- ECPrivateKeyParameters ephemeralPrivateKey)
- : this(staticPrivateKey, ephemeralPrivateKey, null)
- {
- }
-
- public MqvPrivateParameters(
- ECPrivateKeyParameters staticPrivateKey,
- ECPrivateKeyParameters ephemeralPrivateKey,
- ECPublicKeyParameters ephemeralPublicKey)
- {
- if (staticPrivateKey == null)
- throw new ArgumentNullException("staticPrivateKey");
- if (ephemeralPrivateKey == null)
- throw new ArgumentNullException("ephemeralPrivateKey");
-
- ECDomainParameters parameters = staticPrivateKey.Parameters;
- if (!parameters.Equals(ephemeralPrivateKey.Parameters))
- throw new ArgumentException("Static and ephemeral private keys have different domain parameters");
-
- if (ephemeralPublicKey == null)
- {
- ephemeralPublicKey = new ECPublicKeyParameters(
- parameters.G.Multiply(ephemeralPrivateKey.D),
- parameters);
- }
- else if (!parameters.Equals(ephemeralPublicKey.Parameters))
- {
- throw new ArgumentException("Ephemeral public key has different domain parameters");
- }
-
- this.staticPrivateKey = staticPrivateKey;
- this.ephemeralPrivateKey = ephemeralPrivateKey;
- this.ephemeralPublicKey = ephemeralPublicKey;
- }
-
- public virtual ECPrivateKeyParameters StaticPrivateKey
- {
- get { return staticPrivateKey; }
- }
-
- public virtual ECPrivateKeyParameters EphemeralPrivateKey
- {
- get { return ephemeralPrivateKey; }
- }
-
- public virtual ECPublicKeyParameters EphemeralPublicKey
- {
- get { return ephemeralPublicKey; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/MqvPublicParameters.cs b/BCCrypto/src/crypto/parameters/MqvPublicParameters.cs
deleted file mode 100644
index 239afa3..0000000
--- a/BCCrypto/src/crypto/parameters/MqvPublicParameters.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class MqvPublicParameters
- : ICipherParameters
- {
- private readonly ECPublicKeyParameters staticPublicKey;
- private readonly ECPublicKeyParameters ephemeralPublicKey;
-
- public MqvPublicParameters(
- ECPublicKeyParameters staticPublicKey,
- ECPublicKeyParameters ephemeralPublicKey)
- {
- if (staticPublicKey == null)
- throw new ArgumentNullException("staticPublicKey");
- if (ephemeralPublicKey == null)
- throw new ArgumentNullException("ephemeralPublicKey");
- if (!staticPublicKey.Parameters.Equals(ephemeralPublicKey.Parameters))
- throw new ArgumentException("Static and ephemeral public keys have different domain parameters");
-
- this.staticPublicKey = staticPublicKey;
- this.ephemeralPublicKey = ephemeralPublicKey;
- }
-
- public virtual ECPublicKeyParameters StaticPublicKey
- {
- get { return staticPublicKey; }
- }
-
- public virtual ECPublicKeyParameters EphemeralPublicKey
- {
- get { return ephemeralPublicKey; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/NaccacheSternKeyGenerationParameters.cs b/BCCrypto/src/crypto/parameters/NaccacheSternKeyGenerationParameters.cs
deleted file mode 100644
index 44fc906..0000000
--- a/BCCrypto/src/crypto/parameters/NaccacheSternKeyGenerationParameters.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- /**
- * Parameters for NaccacheStern public private key generation. For details on
- * this cipher, please see
- *
- * http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf
- */
- public class NaccacheSternKeyGenerationParameters : KeyGenerationParameters
- {
- // private BigInteger publicExponent;
- private readonly int certainty;
- private readonly int countSmallPrimes;
-
- /**
- * Parameters for generating a NaccacheStern KeyPair.
- *
- * @param random
- * The source of randomness
- * @param strength
- * The desired strength of the Key in Bits
- * @param certainty
- * the probability that the generated primes are not really prime
- * as integer: 2^(-certainty) is then the probability
- * @param countSmallPrimes
- * How many small key factors are desired
- */
- public NaccacheSternKeyGenerationParameters(
- SecureRandom random,
- int strength,
- int certainty,
- int countSmallPrimes)
- : base(random, strength)
- {
- if (countSmallPrimes % 2 == 1)
- throw new ArgumentException("countSmallPrimes must be a multiple of 2");
- if (countSmallPrimes < 30)
- throw new ArgumentException("countSmallPrimes must be >= 30 for security reasons");
-
- this.certainty = certainty;
- this.countSmallPrimes = countSmallPrimes;
- }
-
- /**
- * Parameters for a NaccacheStern KeyPair.
- *
- * @param random
- * The source of randomness
- * @param strength
- * The desired strength of the Key in Bits
- * @param certainty
- * the probability that the generated primes are not really prime
- * as integer: 2^(-certainty) is then the probability
- * @param cntSmallPrimes
- * How many small key factors are desired
- * @param debug
- * Ignored
- */
- [Obsolete("Use version without 'debug' parameter")]
- public NaccacheSternKeyGenerationParameters(
- SecureRandom random,
- int strength,
- int certainty,
- int countSmallPrimes,
- bool debug)
- : this(random, strength, certainty, countSmallPrimes)
- {
- }
-
- /**
- * @return Returns the certainty.
- */
- public int Certainty
- {
- get { return certainty; }
- }
-
- /**
- * @return Returns the countSmallPrimes.
- */
- public int CountSmallPrimes
- {
- get { return countSmallPrimes; }
- }
-
- [Obsolete("Remove: always false")]
- public bool IsDebug
- {
- get { return false; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/NaccacheSternKeyParameters.cs b/BCCrypto/src/crypto/parameters/NaccacheSternKeyParameters.cs
deleted file mode 100644
index 8be7ad8..0000000
--- a/BCCrypto/src/crypto/parameters/NaccacheSternKeyParameters.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- /**
- * Public key parameters for NaccacheStern cipher. For details on this cipher,
- * please see
- *
- * http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf
- */
- public class NaccacheSternKeyParameters : AsymmetricKeyParameter
- {
- private readonly BigInteger g, n;
- private readonly int lowerSigmaBound;
-
- /**
- * @param privateKey
- */
- public NaccacheSternKeyParameters(bool privateKey, BigInteger g, BigInteger n, int lowerSigmaBound)
- : base(privateKey)
- {
- this.g = g;
- this.n = n;
- this.lowerSigmaBound = lowerSigmaBound;
- }
-
- /**
- * @return Returns the g.
- */
- public BigInteger G { get { return g; } }
-
- /**
- * @return Returns the lowerSigmaBound.
- */
- public int LowerSigmaBound { get { return lowerSigmaBound; } }
-
- /**
- * @return Returns the n.
- */
- public BigInteger Modulus { get { return n; } }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/NaccacheSternPrivateKeyParameters.cs b/BCCrypto/src/crypto/parameters/NaccacheSternPrivateKeyParameters.cs
deleted file mode 100644
index 42a0454..0000000
--- a/BCCrypto/src/crypto/parameters/NaccacheSternPrivateKeyParameters.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- /**
- * Private key parameters for NaccacheStern cipher. For details on this cipher,
- * please see
- *
- * http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf
- */
- public class NaccacheSternPrivateKeyParameters : NaccacheSternKeyParameters
- {
- private readonly BigInteger phiN;
- private readonly IList smallPrimes;
-
-#if !(SILVERLIGHT || PORTABLE)
- [Obsolete]
- public NaccacheSternPrivateKeyParameters(
- BigInteger g,
- BigInteger n,
- int lowerSigmaBound,
- ArrayList smallPrimes,
- BigInteger phiN)
- : base(true, g, n, lowerSigmaBound)
- {
- this.smallPrimes = smallPrimes;
- this.phiN = phiN;
- }
-#endif
-
- /**
- * Constructs a NaccacheSternPrivateKey
- *
- * @param g
- * the public enryption parameter g
- * @param n
- * the public modulus n = p*q
- * @param lowerSigmaBound
- * the public lower sigma bound up to which data can be encrypted
- * @param smallPrimes
- * the small primes, of which sigma is constructed in the right
- * order
- * @param phi_n
- * the private modulus phi(n) = (p-1)(q-1)
- */
- public NaccacheSternPrivateKeyParameters(
- BigInteger g,
- BigInteger n,
- int lowerSigmaBound,
- IList smallPrimes,
- BigInteger phiN)
- : base(true, g, n, lowerSigmaBound)
- {
- this.smallPrimes = smallPrimes;
- this.phiN = phiN;
- }
-
- public BigInteger PhiN
- {
- get { return phiN; }
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- [Obsolete("Use 'SmallPrimesList' instead")]
- public ArrayList SmallPrimes
- {
- get { return new ArrayList(smallPrimes); }
- }
-#endif
-
- public IList SmallPrimesList
- {
- get { return smallPrimes; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ParametersWithIV.cs b/BCCrypto/src/crypto/parameters/ParametersWithIV.cs
deleted file mode 100644
index b8e6f42..0000000
--- a/BCCrypto/src/crypto/parameters/ParametersWithIV.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class ParametersWithIV
- : ICipherParameters
- {
- private ICipherParameters parameters;
- private byte[] iv;
-
- public ParametersWithIV(
- ICipherParameters parameters,
- byte[] iv)
- : this(parameters, iv, 0, iv.Length)
- {
- }
-
- public ParametersWithIV(
- ICipherParameters parameters,
- byte[] iv,
- int ivOff,
- int ivLen)
- {
- // NOTE: 'parameters' may be null to imply key re-use
- if (iv == null)
- throw new ArgumentNullException("iv");
-
- this.parameters = parameters;
- this.iv = new byte[ivLen];
- Array.Copy(iv, ivOff, this.iv, 0, ivLen);
- }
-
- public void Set( ICipherParameters parameters, byte[] iv )
- {
- this.parameters = parameters;
- this.iv = BufferPool.GetBuffer(iv.Length);
- Array.Copy(iv, 0, this.iv, 0, this.iv.Length);
- }
-
- public void Reset()
- {
- BufferPool.ReturnBuffer(this.iv);
- this.iv = null;
- }
-
- public byte[] GetIV()
- {
- //return (byte[]) iv.Clone();
- return iv;
- }
-
- public ICipherParameters Parameters
- {
- get { return parameters; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ParametersWithRandom.cs b/BCCrypto/src/crypto/parameters/ParametersWithRandom.cs
deleted file mode 100644
index 276dc26..0000000
--- a/BCCrypto/src/crypto/parameters/ParametersWithRandom.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class ParametersWithRandom
- : ICipherParameters
- {
- private readonly ICipherParameters parameters;
- private readonly SecureRandom random;
-
- public ParametersWithRandom(
- ICipherParameters parameters,
- SecureRandom random)
- {
- if (parameters == null)
- throw new ArgumentNullException("parameters");
- if (random == null)
- throw new ArgumentNullException("random");
-
- this.parameters = parameters;
- this.random = random;
- }
-
- public ParametersWithRandom(
- ICipherParameters parameters)
- : this(parameters, new SecureRandom())
- {
- }
-
- [Obsolete("Use Random property instead")]
- public SecureRandom GetRandom()
- {
- return Random;
- }
-
- public SecureRandom Random
- {
- get { return random; }
- }
-
- public ICipherParameters Parameters
- {
- get { return parameters; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ParametersWithSBox.cs b/BCCrypto/src/crypto/parameters/ParametersWithSBox.cs
deleted file mode 100644
index 6473796..0000000
--- a/BCCrypto/src/crypto/parameters/ParametersWithSBox.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class ParametersWithSBox : ICipherParameters
- {
- private ICipherParameters parameters;
- private byte[] sBox;
-
- public ParametersWithSBox(
- ICipherParameters parameters,
- byte[] sBox)
- {
- this.parameters = parameters;
- this.sBox = sBox;
- }
-
- public byte[] GetSBox() { return sBox; }
-
- public ICipherParameters Parameters { get { return parameters; } }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/ParametersWithSalt.cs b/BCCrypto/src/crypto/parameters/ParametersWithSalt.cs
deleted file mode 100644
index 7f4cd6c..0000000
--- a/BCCrypto/src/crypto/parameters/ParametersWithSalt.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
-
- /// Cipher parameters with a fixed salt value associated with them.
- public class ParametersWithSalt : ICipherParameters
- {
- private byte[] salt;
- private ICipherParameters parameters;
-
- public ParametersWithSalt(ICipherParameters parameters, byte[] salt):this(parameters, salt, 0, salt.Length)
- {
- }
-
- public ParametersWithSalt(ICipherParameters parameters, byte[] salt, int saltOff, int saltLen)
- {
- this.salt = new byte[saltLen];
- this.parameters = parameters;
-
- Array.Copy(salt, saltOff, this.salt, 0, saltLen);
- }
-
- public byte[] GetSalt()
- {
- return salt;
- }
-
- public ICipherParameters Parameters
- {
- get
- {
- return parameters;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/RC2Parameters.cs b/BCCrypto/src/crypto/parameters/RC2Parameters.cs
deleted file mode 100644
index 7a6d5bb..0000000
--- a/BCCrypto/src/crypto/parameters/RC2Parameters.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class RC2Parameters
- : KeyParameter
- {
- private readonly int bits;
-
- public RC2Parameters(
- byte[] key)
- : this(key, (key.Length > 128) ? 1024 : (key.Length * 8))
- {
- }
-
- public RC2Parameters(
- byte[] key,
- int keyOff,
- int keyLen)
- : this(key, keyOff, keyLen, (keyLen > 128) ? 1024 : (keyLen * 8))
- {
- }
-
- public RC2Parameters(
- byte[] key,
- int bits)
- : base(key)
- {
- this.bits = bits;
- }
-
- public RC2Parameters(
- byte[] key,
- int keyOff,
- int keyLen,
- int bits)
- : base(key, keyOff, keyLen)
- {
- this.bits = bits;
- }
-
- public int EffectiveKeyBits
- {
- get { return bits; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/RC5Parameters.cs b/BCCrypto/src/crypto/parameters/RC5Parameters.cs
deleted file mode 100644
index 88a59e1..0000000
--- a/BCCrypto/src/crypto/parameters/RC5Parameters.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class RC5Parameters
- : KeyParameter
- {
- private readonly int rounds;
-
- public RC5Parameters(
- byte[] key,
- int rounds)
- : base(key)
- {
- if (key.Length > 255)
- throw new ArgumentException("RC5 key length can be no greater than 255");
-
- this.rounds = rounds;
- }
-
- public int Rounds
- {
- get { return rounds; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/RSABlindingParameters.cs b/BCCrypto/src/crypto/parameters/RSABlindingParameters.cs
deleted file mode 100644
index 49c7bcc..0000000
--- a/BCCrypto/src/crypto/parameters/RSABlindingParameters.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class RsaBlindingParameters
- : ICipherParameters
- {
- private readonly RsaKeyParameters publicKey;
- private readonly BigInteger blindingFactor;
-
- public RsaBlindingParameters(
- RsaKeyParameters publicKey,
- BigInteger blindingFactor)
- {
- if (publicKey.IsPrivate)
- throw new ArgumentException("RSA parameters should be for a public key");
-
- this.publicKey = publicKey;
- this.blindingFactor = blindingFactor;
- }
-
- public RsaKeyParameters PublicKey
- {
- get { return publicKey; }
- }
-
- public BigInteger BlindingFactor
- {
- get { return blindingFactor; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/RsaKeyGenerationParameters.cs b/BCCrypto/src/crypto/parameters/RsaKeyGenerationParameters.cs
deleted file mode 100644
index 619ab65..0000000
--- a/BCCrypto/src/crypto/parameters/RsaKeyGenerationParameters.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class RsaKeyGenerationParameters
- : KeyGenerationParameters
- {
- private readonly BigInteger publicExponent;
- private readonly int certainty;
-
- public RsaKeyGenerationParameters(
- BigInteger publicExponent,
- SecureRandom random,
- int strength,
- int certainty)
- : base(random, strength)
- {
- this.publicExponent = publicExponent;
- this.certainty = certainty;
- }
-
- public BigInteger PublicExponent
- {
- get { return publicExponent; }
- }
-
- public int Certainty
- {
- get { return certainty; }
- }
-
- public override bool Equals(
- object obj)
- {
- RsaKeyGenerationParameters other = obj as RsaKeyGenerationParameters;
-
- if (other == null)
- {
- return false;
- }
-
- return certainty == other.certainty
- && publicExponent.Equals(other.publicExponent);
- }
-
- public override int GetHashCode()
- {
- return certainty.GetHashCode() ^ publicExponent.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/RsaKeyParameters.cs b/BCCrypto/src/crypto/parameters/RsaKeyParameters.cs
deleted file mode 100644
index 5480f05..0000000
--- a/BCCrypto/src/crypto/parameters/RsaKeyParameters.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class RsaKeyParameters
- : AsymmetricKeyParameter
- {
- // the value is the product of the 132 smallest primes from 3 to 751
- private static BigInteger SmallPrimesProduct = new BigInteger(
- "8138E8A0FCF3A4E84A771D40FD305D7F4AA59306D7251DE54D98AF8FE95729A1" +
- "F73D893FA424CD2EDC8636A6C3285E022B0E3866A565AE8108EED8591CD4FE8D" +
- "2CE86165A978D719EBF647F362D33FCA29CD179FB42401CBAF3DF0C614056F9C" +
- "8F3CFD51E474AFB6BC6974F78DB8ABA8E9E517FDED658591AB7502BD41849462F",
- 16);
-
- private static BigInteger Validate(BigInteger modulus)
- {
- if ((modulus.IntValue & 1) == 0)
- throw new ArgumentException("RSA modulus is even", "modulus");
- if (!modulus.Gcd(SmallPrimesProduct).Equals(BigInteger.One))
- throw new ArgumentException("RSA modulus has a small prime factor");
-
- // TODO: add additional primePower/Composite test - expensive!!
-
- return modulus;
- }
-
- private readonly BigInteger modulus;
- private readonly BigInteger exponent;
-
- public RsaKeyParameters(
- bool isPrivate,
- BigInteger modulus,
- BigInteger exponent)
- : base(isPrivate)
- {
- if (modulus == null)
- throw new ArgumentNullException("modulus");
- if (exponent == null)
- throw new ArgumentNullException("exponent");
- if (modulus.SignValue <= 0)
- throw new ArgumentException("Not a valid RSA modulus", "modulus");
- if (exponent.SignValue <= 0)
- throw new ArgumentException("Not a valid RSA exponent", "exponent");
- if (!isPrivate && (exponent.IntValue & 1) == 0)
- throw new ArgumentException("RSA publicExponent is even", "exponent");
-
- this.modulus = Validate(modulus);
- this.exponent = exponent;
- }
-
- public BigInteger Modulus
- {
- get { return modulus; }
- }
-
- public BigInteger Exponent
- {
- get { return exponent; }
- }
-
- public override bool Equals(
- object obj)
- {
- RsaKeyParameters kp = obj as RsaKeyParameters;
-
- if (kp == null)
- {
- return false;
- }
-
- return kp.IsPrivate == this.IsPrivate
- && kp.Modulus.Equals(this.modulus)
- && kp.Exponent.Equals(this.exponent);
- }
-
- public override int GetHashCode()
- {
- return modulus.GetHashCode() ^ exponent.GetHashCode() ^ IsPrivate.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/RsaPrivateCrtKeyParameters.cs b/BCCrypto/src/crypto/parameters/RsaPrivateCrtKeyParameters.cs
deleted file mode 100644
index 7bd8abd..0000000
--- a/BCCrypto/src/crypto/parameters/RsaPrivateCrtKeyParameters.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public class RsaPrivateCrtKeyParameters
- : RsaKeyParameters
- {
- private readonly BigInteger e, p, q, dP, dQ, qInv;
-
- public RsaPrivateCrtKeyParameters(
- BigInteger modulus,
- BigInteger publicExponent,
- BigInteger privateExponent,
- BigInteger p,
- BigInteger q,
- BigInteger dP,
- BigInteger dQ,
- BigInteger qInv)
- : base(true, modulus, privateExponent)
- {
- ValidateValue(publicExponent, "publicExponent", "exponent");
- ValidateValue(p, "p", "P value");
- ValidateValue(q, "q", "Q value");
- ValidateValue(dP, "dP", "DP value");
- ValidateValue(dQ, "dQ", "DQ value");
- ValidateValue(qInv, "qInv", "InverseQ value");
-
- this.e = publicExponent;
- this.p = p;
- this.q = q;
- this.dP = dP;
- this.dQ = dQ;
- this.qInv = qInv;
- }
-
- public BigInteger PublicExponent
- {
- get { return e; }
- }
-
- public BigInteger P
- {
- get { return p; }
- }
-
- public BigInteger Q
- {
- get { return q; }
- }
-
- public BigInteger DP
- {
- get { return dP; }
- }
-
- public BigInteger DQ
- {
- get { return dQ; }
- }
-
- public BigInteger QInv
- {
- get { return qInv; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- RsaPrivateCrtKeyParameters kp = obj as RsaPrivateCrtKeyParameters;
-
- if (kp == null)
- return false;
-
- return kp.DP.Equals(dP)
- && kp.DQ.Equals(dQ)
- && kp.Exponent.Equals(this.Exponent)
- && kp.Modulus.Equals(this.Modulus)
- && kp.P.Equals(p)
- && kp.Q.Equals(q)
- && kp.PublicExponent.Equals(e)
- && kp.QInv.Equals(qInv);
- }
-
- public override int GetHashCode()
- {
- return DP.GetHashCode() ^ DQ.GetHashCode() ^ Exponent.GetHashCode() ^ Modulus.GetHashCode()
- ^ P.GetHashCode() ^ Q.GetHashCode() ^ PublicExponent.GetHashCode() ^ QInv.GetHashCode();
- }
-
- private static void ValidateValue(BigInteger x, string name, string desc)
- {
- if (x == null)
- throw new ArgumentNullException(name);
- if (x.SignValue <= 0)
- throw new ArgumentException("Not a valid RSA " + desc, name);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/SkeinParameters.cs b/BCCrypto/src/crypto/parameters/SkeinParameters.cs
deleted file mode 100644
index cc57ef5..0000000
--- a/BCCrypto/src/crypto/parameters/SkeinParameters.cs
+++ /dev/null
@@ -1,286 +0,0 @@
-using System;
-using System.Collections;
-using System.Globalization;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
-
- ///
- /// Parameters for the Skein hash function - a series of byte[] strings identified by integer tags.
- ///
- ///
- /// Parameterised Skein can be used for:
- ///
- /// MAC generation, by providing a key .
- /// Randomised hashing, by providing a nonce .
- /// A hash function for digital signatures, associating a
- /// public key with the message digest.
- /// A key derivation function, by providing a
- /// key identifier .
- /// Personalised hashing, by providing a
- /// recommended format or
- /// arbitrary personalisation string.
- ///
- ///
- ///
- ///
- ///
- public class SkeinParameters
- : ICipherParameters
- {
- ///
- /// The parameter type for a secret key, supporting MAC or KDF functions: 0
- ///
- public const int PARAM_TYPE_KEY = 0;
-
- ///
- /// The parameter type for the Skein configuration block: 4
- ///
- public const int PARAM_TYPE_CONFIG = 4;
-
- ///
- /// The parameter type for a personalisation string: 8
- ///
- public const int PARAM_TYPE_PERSONALISATION = 8;
-
- ///
- /// The parameter type for a public key: 12
- ///
- public const int PARAM_TYPE_PUBLIC_KEY = 12;
-
- ///
- /// The parameter type for a key identifier string: 16
- ///
- public const int PARAM_TYPE_KEY_IDENTIFIER = 16;
-
- ///
- /// The parameter type for a nonce: 20
- ///
- public const int PARAM_TYPE_NONCE = 20;
-
- ///
- /// The parameter type for the message: 48
- ///
- public const int PARAM_TYPE_MESSAGE = 48;
-
- ///
- /// The parameter type for the output transformation: 63
- ///
- public const int PARAM_TYPE_OUTPUT = 63;
-
- private IDictionary parameters;
-
- public SkeinParameters()
- : this(Platform.CreateHashtable())
-
- {
- }
-
- private SkeinParameters(IDictionary parameters)
- {
- this.parameters = parameters;
- }
-
- ///
- /// Obtains a map of type (int) to value (byte[]) for the parameters tracked in this object.
- ///
- public IDictionary GetParameters()
- {
- return parameters;
- }
-
- ///
- /// Obtains the value of the key parameter , or null if not
- /// set.
- ///
- /// The key.
- public byte[] GetKey()
- {
- return (byte[])parameters[PARAM_TYPE_KEY];
- }
-
- ///
- /// Obtains the value of the personalisation parameter , or
- /// null if not set.
- ///
- public byte[] GetPersonalisation()
- {
- return (byte[])parameters[PARAM_TYPE_PERSONALISATION];
- }
-
- ///
- /// Obtains the value of the public key parameter , or
- /// null if not set.
- ///
- public byte[] GetPublicKey()
- {
- return (byte[])parameters[PARAM_TYPE_PUBLIC_KEY];
- }
-
- ///
- /// Obtains the value of the key identifier parameter , or
- /// null if not set.
- ///
- public byte[] GetKeyIdentifier()
- {
- return (byte[])parameters[PARAM_TYPE_KEY_IDENTIFIER];
- }
-
- ///
- /// Obtains the value of the nonce parameter , or null if
- /// not set.
- ///
- public byte[] GetNonce()
- {
- return (byte[])parameters[PARAM_TYPE_NONCE];
- }
-
- ///
- /// A builder for .
- ///
- public class Builder
- {
- private IDictionary parameters = Platform.CreateHashtable();
-
- public Builder()
- {
- }
-
- public Builder(IDictionary paramsMap)
- {
- IEnumerator keys = paramsMap.Keys.GetEnumerator();
- while (keys.MoveNext())
- {
- int key = (int)keys.Current;
- parameters.Add(key, paramsMap[key]);
- }
- }
-
- public Builder(SkeinParameters parameters)
- {
- IEnumerator keys = parameters.parameters.Keys.GetEnumerator();
- while (keys.MoveNext())
- {
- int key = (int)keys.Current;
- this.parameters.Add(key, parameters.parameters[key]);
- }
- }
-
- ///
- /// Sets a parameters to apply to the Skein hash function.
- ///
- ///
- /// Parameter types must be in the range 0,5..62, and cannot use the value 48
- /// (reserved for message body).
- ///
- /// Parameters with type < 48 are processed before
- /// the message content, parameters with type > 48
- /// are processed after the message and prior to output.
- ///
- /// the type of the parameter, in the range 5..62.
- /// the byte sequence of the parameter.
- public Builder Set(int type, byte[] value)
- {
- if (value == null)
- {
- throw new ArgumentException("Parameter value must not be null.");
- }
- if ((type != PARAM_TYPE_KEY)
- && (type <= PARAM_TYPE_CONFIG || type >= PARAM_TYPE_OUTPUT || type == PARAM_TYPE_MESSAGE))
- {
- throw new ArgumentException("Parameter types must be in the range 0,5..47,49..62.");
- }
- if (type == PARAM_TYPE_CONFIG)
- {
- throw new ArgumentException("Parameter type " + PARAM_TYPE_CONFIG
- + " is reserved for internal use.");
- }
- this.parameters.Add(type, value);
- return this;
- }
-
- ///
- /// Sets the parameter.
- ///
- public Builder SetKey(byte[] key)
- {
- return Set(PARAM_TYPE_KEY, key);
- }
-
- ///
- /// Sets the parameter.
- ///
- public Builder SetPersonalisation(byte[] personalisation)
- {
- return Set(PARAM_TYPE_PERSONALISATION, personalisation);
- }
-
- ///
- /// Implements the recommended personalisation format for Skein defined in Section 4.11 of
- /// the Skein 1.3 specification.
- ///
- ///
- /// The format is YYYYMMDD email@address distinguisher, encoded to a byte
- /// sequence using UTF-8 encoding.
- ///
- /// the date the personalised application of the Skein was defined.
- /// the email address of the creation of the personalised application.
- /// an arbitrary personalisation string distinguishing the application.
- public Builder SetPersonalisation(DateTime date, string emailAddress, string distinguisher)
- {
- try
- {
- MemoryStream bout = new MemoryStream();
- StreamWriter outBytes = new StreamWriter(bout, System.Text.Encoding.UTF8);
- outBytes.Write(date.ToString("YYYYMMDD", CultureInfo.InvariantCulture));
- outBytes.Write(" ");
- outBytes.Write(emailAddress);
- outBytes.Write(" ");
- outBytes.Write(distinguisher);
- Platform.Dispose(outBytes);
- return Set(PARAM_TYPE_PERSONALISATION, bout.ToArray());
- }
- catch (IOException e)
- {
- throw new InvalidOperationException("Byte I/O failed.", e);
- }
- }
-
- ///
- /// Sets the parameter.
- ///
- public Builder SetPublicKey(byte[] publicKey)
- {
- return Set(PARAM_TYPE_PUBLIC_KEY, publicKey);
- }
-
- ///
- /// Sets the parameter.
- ///
- public Builder SetKeyIdentifier(byte[] keyIdentifier)
- {
- return Set(PARAM_TYPE_KEY_IDENTIFIER, keyIdentifier);
- }
-
- ///
- /// Sets the parameter.
- ///
- public Builder SetNonce(byte[] nonce)
- {
- return Set(PARAM_TYPE_NONCE, nonce);
- }
-
- ///
- /// Constructs a new instance with the parameters provided to this
- /// builder.
- ///
- public SkeinParameters Build()
- {
- return new SkeinParameters(parameters);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/crypto/parameters/Srp6GroupParameters.cs b/BCCrypto/src/crypto/parameters/Srp6GroupParameters.cs
deleted file mode 100644
index 6762dd3..0000000
--- a/BCCrypto/src/crypto/parameters/Srp6GroupParameters.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
- public sealed class Srp6GroupParameters
- {
- private readonly BigInteger n, g;
-
- public Srp6GroupParameters(BigInteger N, BigInteger g)
- {
- this.n = N;
- this.g = g;
- }
-
- public BigInteger G
- {
- get { return g; }
- }
-
- public BigInteger N
- {
- get { return n; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/parameters/TweakableBlockCipherParameters.cs b/BCCrypto/src/crypto/parameters/TweakableBlockCipherParameters.cs
deleted file mode 100644
index f757266..0000000
--- a/BCCrypto/src/crypto/parameters/TweakableBlockCipherParameters.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Parameters
-{
-
- ///
- /// Parameters for tweakable block ciphers.
- ///
- public class TweakableBlockCipherParameters
- : ICipherParameters
- {
- private readonly byte[] tweak;
- private readonly KeyParameter key;
-
- public TweakableBlockCipherParameters(KeyParameter key, byte[] tweak)
- {
- this.key = key;
- this.tweak = Arrays.Clone(tweak);
- }
-
- ///
- /// Gets the key.
- ///
- /// the key to use, or null to use the current key.
- public KeyParameter Key
- {
- get { return key; }
- }
-
- ///
- /// Gets the tweak value.
- ///
- /// The tweak to use, or null to use the current tweak.
- public byte[] Tweak
- {
- get { return tweak; }
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/crypto/prng/BasicEntropySourceProvider.cs b/BCCrypto/src/crypto/prng/BasicEntropySourceProvider.cs
deleted file mode 100644
index 31a8461..0000000
--- a/BCCrypto/src/crypto/prng/BasicEntropySourceProvider.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- /**
- * An EntropySourceProvider where entropy generation is based on a SecureRandom output using SecureRandom.generateSeed().
- */
- public class BasicEntropySourceProvider
- : IEntropySourceProvider
- {
- private readonly SecureRandom mSecureRandom;
- private readonly bool mPredictionResistant;
-
- /**
- * Create a entropy source provider based on the passed in SecureRandom.
- *
- * @param secureRandom the SecureRandom to base EntropySource construction on.
- * @param isPredictionResistant boolean indicating if the SecureRandom is based on prediction resistant entropy or not (true if it is).
- */
- public BasicEntropySourceProvider(SecureRandom secureRandom, bool isPredictionResistant)
- {
- mSecureRandom = secureRandom;
- mPredictionResistant = isPredictionResistant;
- }
-
- /**
- * Return an entropy source that will create bitsRequired bits of entropy on
- * each invocation of getEntropy().
- *
- * @param bitsRequired size (in bits) of entropy to be created by the provided source.
- * @return an EntropySource that generates bitsRequired bits of entropy on each call to its getEntropy() method.
- */
- public IEntropySource Get(int bitsRequired)
- {
- return new BasicEntropySource(mSecureRandom, mPredictionResistant, bitsRequired);
- }
-
- private class BasicEntropySource
- : IEntropySource
- {
- private readonly SecureRandom mSecureRandom;
- private readonly bool mPredictionResistant;
- private readonly int mEntropySize;
-
- internal BasicEntropySource(SecureRandom secureRandom, bool predictionResistant, int entropySize)
- {
- this.mSecureRandom = secureRandom;
- this.mPredictionResistant = predictionResistant;
- this.mEntropySize = entropySize;
- }
-
- bool IEntropySource.IsPredictionResistant
- {
- get { return mPredictionResistant; }
- }
-
- byte[] IEntropySource.GetEntropy()
- {
- // TODO[FIPS] Not all SecureRandom implementations are considered valid entropy sources
- return SecureRandom.GetNextBytes(mSecureRandom, (mEntropySize + 7) / 8);
- }
-
- int IEntropySource.EntropySize
- {
- get { return mEntropySize; }
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/CryptoApiEntropySourceProvider.cs b/BCCrypto/src/crypto/prng/CryptoApiEntropySourceProvider.cs
deleted file mode 100644
index 68579aa..0000000
--- a/BCCrypto/src/crypto/prng/CryptoApiEntropySourceProvider.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-#if !(NETCF_1_0 || PORTABLE)
-using System;
-using System.Security.Cryptography;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- public class CryptoApiEntropySourceProvider
- : IEntropySourceProvider
- {
- private readonly RandomNumberGenerator mRng;
- private readonly bool mPredictionResistant;
-
- public CryptoApiEntropySourceProvider()
- : this(new RNGCryptoServiceProvider(), true)
- {
- }
-
- public CryptoApiEntropySourceProvider(RandomNumberGenerator rng, bool isPredictionResistant)
- {
- if (rng == null)
- throw new ArgumentNullException("rng");
-
- mRng = rng;
- mPredictionResistant = isPredictionResistant;
- }
-
- public IEntropySource Get(int bitsRequired)
- {
- return new CryptoApiEntropySource(mRng, mPredictionResistant, bitsRequired);
- }
-
- private class CryptoApiEntropySource
- : IEntropySource
- {
- private readonly RandomNumberGenerator mRng;
- private readonly bool mPredictionResistant;
- private readonly int mEntropySize;
-
- internal CryptoApiEntropySource(RandomNumberGenerator rng, bool predictionResistant, int entropySize)
- {
- this.mRng = rng;
- this.mPredictionResistant = predictionResistant;
- this.mEntropySize = entropySize;
- }
-
- #region IEntropySource Members
-
- bool IEntropySource.IsPredictionResistant
- {
- get { return mPredictionResistant; }
- }
-
- byte[] IEntropySource.GetEntropy()
- {
- byte[] result = new byte[(mEntropySize + 7) / 8];
- mRng.GetBytes(result);
- return result;
- }
-
- int IEntropySource.EntropySize
- {
- get { return mEntropySize; }
- }
-
- #endregion
- }
- }
-}
-
-#endif
diff --git a/BCCrypto/src/crypto/prng/CryptoApiRandomGenerator.cs b/BCCrypto/src/crypto/prng/CryptoApiRandomGenerator.cs
deleted file mode 100644
index fa5f523..0000000
--- a/BCCrypto/src/crypto/prng/CryptoApiRandomGenerator.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-#if !(NETCF_1_0 || PORTABLE)
-
-using System;
-using System.Security.Cryptography;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- ///
- /// Uses Microsoft's RNGCryptoServiceProvider
- ///
- public class CryptoApiRandomGenerator
- : IRandomGenerator
- {
- private readonly RandomNumberGenerator rndProv;
-
- public CryptoApiRandomGenerator()
- : this(new RNGCryptoServiceProvider())
- {
- }
-
- public CryptoApiRandomGenerator(RandomNumberGenerator rng)
- {
- this.rndProv = rng;
- }
-
- #region IRandomGenerator Members
-
- public virtual void AddSeedMaterial(byte[] seed)
- {
- // We don't care about the seed
- }
-
- public virtual void AddSeedMaterial(long seed)
- {
- // We don't care about the seed
- }
-
- public virtual void NextBytes(byte[] bytes)
- {
- rndProv.GetBytes(bytes);
- }
-
- public virtual void NextBytes(byte[] bytes, int start, int len)
- {
- if (start < 0)
- throw new ArgumentException("Start offset cannot be negative", "start");
- if (bytes.Length < (start + len))
- throw new ArgumentException("Byte array too small for requested offset and length");
-
- if (bytes.Length == len && start == 0)
- {
- NextBytes(bytes);
- }
- else
- {
- byte[] tmpBuf = new byte[len];
- NextBytes(tmpBuf);
- Array.Copy(tmpBuf, 0, bytes, start, len);
- }
- }
-
- #endregion
- }
-}
-
-#endif
diff --git a/BCCrypto/src/crypto/prng/DigestRandomGenerator.cs b/BCCrypto/src/crypto/prng/DigestRandomGenerator.cs
deleted file mode 100644
index f5a2995..0000000
--- a/BCCrypto/src/crypto/prng/DigestRandomGenerator.cs
+++ /dev/null
@@ -1,127 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- /**
- * Random generation based on the digest with counter. Calling AddSeedMaterial will
- * always increase the entropy of the hash.
- *
- * Internal access to the digest is synchronized so a single one of these can be shared.
- *
- */
- public class DigestRandomGenerator
- : IRandomGenerator
- {
- private const long CYCLE_COUNT = 10;
-
- private long stateCounter;
- private long seedCounter;
- private IDigest digest;
- private byte[] state;
- private byte[] seed;
-
- public DigestRandomGenerator(
- IDigest digest)
- {
- this.digest = digest;
-
- this.seed = new byte[digest.GetDigestSize()];
- this.seedCounter = 1;
-
- this.state = new byte[digest.GetDigestSize()];
- this.stateCounter = 1;
- }
-
- public void AddSeedMaterial(
- byte[] inSeed)
- {
- lock (this)
- {
- DigestUpdate(inSeed);
- DigestUpdate(seed);
- DigestDoFinal(seed);
- }
- }
-
- public void AddSeedMaterial(
- long rSeed)
- {
- lock (this)
- {
- DigestAddCounter(rSeed);
- DigestUpdate(seed);
- DigestDoFinal(seed);
- }
- }
-
- public void NextBytes(
- byte[] bytes)
- {
- NextBytes(bytes, 0, bytes.Length);
- }
-
- public void NextBytes(
- byte[] bytes,
- int start,
- int len)
- {
- lock (this)
- {
- int stateOff = 0;
-
- GenerateState();
-
- int end = start + len;
- for (int i = start; i < end; ++i)
- {
- if (stateOff == state.Length)
- {
- GenerateState();
- stateOff = 0;
- }
- bytes[i] = state[stateOff++];
- }
- }
- }
-
- private void CycleSeed()
- {
- DigestUpdate(seed);
- DigestAddCounter(seedCounter++);
- DigestDoFinal(seed);
- }
-
- private void GenerateState()
- {
- DigestAddCounter(stateCounter++);
- DigestUpdate(state);
- DigestUpdate(seed);
- DigestDoFinal(state);
-
- if ((stateCounter % CYCLE_COUNT) == 0)
- {
- CycleSeed();
- }
- }
-
- private void DigestAddCounter(long seedVal)
- {
- byte[] bytes = new byte[8];
- Pack.UInt64_To_LE((ulong)seedVal, bytes);
- digest.BlockUpdate(bytes, 0, bytes.Length);
- }
-
- private void DigestUpdate(byte[] inSeed)
- {
- digest.BlockUpdate(inSeed, 0, inSeed.Length);
- }
-
- private void DigestDoFinal(byte[] result)
- {
- digest.DoFinal(result, 0);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/EntropyUtilities.cs b/BCCrypto/src/crypto/prng/EntropyUtilities.cs
deleted file mode 100644
index 58c8703..0000000
--- a/BCCrypto/src/crypto/prng/EntropyUtilities.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- public abstract class EntropyUtilities
- {
- /**
- * Generate numBytes worth of entropy from the passed in entropy source.
- *
- * @param entropySource the entropy source to request the data from.
- * @param numBytes the number of bytes of entropy requested.
- * @return a byte array populated with the random data.
- */
- public static byte[] GenerateSeed(IEntropySource entropySource, int numBytes)
- {
- byte[] bytes = new byte[numBytes];
- int count = 0;
- while (count < numBytes)
- {
- byte[] entropy = entropySource.GetEntropy();
- int toCopy = System.Math.Min(bytes.Length, numBytes - count);
- Array.Copy(entropy, 0, bytes, count, toCopy);
- count += toCopy;
- }
- return bytes;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/IDrbgProvider.cs b/BCCrypto/src/crypto/prng/IDrbgProvider.cs
deleted file mode 100644
index 5ebf5fd..0000000
--- a/BCCrypto/src/crypto/prng/IDrbgProvider.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Prng.Drbg;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- internal interface IDrbgProvider
- {
- ISP80090Drbg Get(IEntropySource entropySource);
- }
-}
diff --git a/BCCrypto/src/crypto/prng/IRandomGenerator.cs b/BCCrypto/src/crypto/prng/IRandomGenerator.cs
deleted file mode 100644
index 8dbe406..0000000
--- a/BCCrypto/src/crypto/prng/IRandomGenerator.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- /// Generic interface for objects generating random bytes.
- public interface IRandomGenerator
- {
- /// Add more seed material to the generator.
- /// A byte array to be mixed into the generator's state.
- void AddSeedMaterial(byte[] seed);
-
- /// Add more seed material to the generator.
- /// A long value to be mixed into the generator's state.
- void AddSeedMaterial(long seed);
-
- /// Fill byte array with random values.
- /// Array to be filled.
- void NextBytes(byte[] bytes);
-
- /// Fill byte array with random values.
- /// Array to receive bytes.
- /// Index to start filling at.
- /// Length of segment to fill.
- void NextBytes(byte[] bytes, int start, int len);
- }
-}
diff --git a/BCCrypto/src/crypto/prng/ReversedWindowGenerator.cs b/BCCrypto/src/crypto/prng/ReversedWindowGenerator.cs
deleted file mode 100644
index dd28c52..0000000
--- a/BCCrypto/src/crypto/prng/ReversedWindowGenerator.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- ///
- /// Takes bytes generated by an underling RandomGenerator and reverses the order in
- /// each small window (of configurable size).
- ///
- /// Access to internals is synchronized so a single one of these can be shared.
- ///
- ///
- public class ReversedWindowGenerator
- : IRandomGenerator
- {
- private readonly IRandomGenerator generator;
-
- private byte[] window;
- private int windowCount;
-
- public ReversedWindowGenerator(
- IRandomGenerator generator,
- int windowSize)
- {
- if (generator == null)
- throw new ArgumentNullException("generator");
- if (windowSize < 2)
- throw new ArgumentException("Window size must be at least 2", "windowSize");
-
- this.generator = generator;
- this.window = new byte[windowSize];
- }
-
- /// Add more seed material to the generator.
- /// A byte array to be mixed into the generator's state.
- public virtual void AddSeedMaterial(
- byte[] seed)
- {
- lock (this)
- {
- windowCount = 0;
- generator.AddSeedMaterial(seed);
- }
- }
-
- /// Add more seed material to the generator.
- /// A long value to be mixed into the generator's state.
- public virtual void AddSeedMaterial(
- long seed)
- {
- lock (this)
- {
- windowCount = 0;
- generator.AddSeedMaterial(seed);
- }
- }
-
- /// Fill byte array with random values.
- /// Array to be filled.
- public virtual void NextBytes(
- byte[] bytes)
- {
- doNextBytes(bytes, 0, bytes.Length);
- }
-
- /// Fill byte array with random values.
- /// Array to receive bytes.
- /// Index to start filling at.
- /// Length of segment to fill.
- public virtual void NextBytes(
- byte[] bytes,
- int start,
- int len)
- {
- doNextBytes(bytes, start, len);
- }
-
- private void doNextBytes(
- byte[] bytes,
- int start,
- int len)
- {
- lock (this)
- {
- int done = 0;
- while (done < len)
- {
- if (windowCount < 1)
- {
- generator.NextBytes(window, 0, window.Length);
- windowCount = window.Length;
- }
-
- bytes[start + done++] = window[--windowCount];
- }
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/SP800SecureRandom.cs b/BCCrypto/src/crypto/prng/SP800SecureRandom.cs
deleted file mode 100644
index 30c838c..0000000
--- a/BCCrypto/src/crypto/prng/SP800SecureRandom.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Prng.Drbg;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- public class SP800SecureRandom
- : SecureRandom
- {
- private readonly IDrbgProvider mDrbgProvider;
- private readonly bool mPredictionResistant;
- private readonly SecureRandom mRandomSource;
- private readonly IEntropySource mEntropySource;
-
- private ISP80090Drbg mDrbg;
-
- internal SP800SecureRandom(SecureRandom randomSource, IEntropySource entropySource, IDrbgProvider drbgProvider, bool predictionResistant)
- : base((IRandomGenerator)null)
- {
- this.mRandomSource = randomSource;
- this.mEntropySource = entropySource;
- this.mDrbgProvider = drbgProvider;
- this.mPredictionResistant = predictionResistant;
- }
-
- public override void SetSeed(byte[] seed)
- {
- lock (this)
- {
- if (mRandomSource != null)
- {
- this.mRandomSource.SetSeed(seed);
- }
- }
- }
-
- public override void SetSeed(long seed)
- {
- lock (this)
- {
- // this will happen when SecureRandom() is created
- if (mRandomSource != null)
- {
- this.mRandomSource.SetSeed(seed);
- }
- }
- }
-
- public override void NextBytes(byte[] bytes)
- {
- lock (this)
- {
- if (mDrbg == null)
- {
- mDrbg = mDrbgProvider.Get(mEntropySource);
- }
-
- // check if a reseed is required...
- if (mDrbg.Generate(bytes, null, mPredictionResistant) < 0)
- {
- mDrbg.Reseed(null);
- mDrbg.Generate(bytes, null, mPredictionResistant);
- }
- }
- }
-
- public override void NextBytes(byte[] buf, int off, int len)
- {
- byte[] bytes = new byte[len];
- NextBytes(bytes);
- Array.Copy(bytes, 0, buf, off, len);
- }
-
- public override byte[] GenerateSeed(int numBytes)
- {
- return EntropyUtilities.GenerateSeed(mEntropySource, numBytes);
- }
-
- /// Force a reseed of the DRBG.
- /// optional additional input
- public virtual void Reseed(byte[] additionalInput)
- {
- lock (this)
- {
- if (mDrbg == null)
- {
- mDrbg = mDrbgProvider.Get(mEntropySource);
- }
-
- mDrbg.Reseed(additionalInput);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/SP800SecureRandomBuilder.cs b/BCCrypto/src/crypto/prng/SP800SecureRandomBuilder.cs
deleted file mode 100644
index 7199f1a..0000000
--- a/BCCrypto/src/crypto/prng/SP800SecureRandomBuilder.cs
+++ /dev/null
@@ -1,208 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Prng.Drbg;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- /**
- * Builder class for making SecureRandom objects based on SP 800-90A Deterministic Random Bit Generators (DRBG).
- */
- public class SP800SecureRandomBuilder
- {
- private readonly SecureRandom mRandom;
- private readonly IEntropySourceProvider mEntropySourceProvider;
-
- private byte[] mPersonalizationString = null;
- private int mSecurityStrength = 256;
- private int mEntropyBitsRequired = 256;
-
- /**
- * Basic constructor, creates a builder using an EntropySourceProvider based on the default SecureRandom with
- * predictionResistant set to false.
- *
- * Any SecureRandom created from a builder constructed like this will make use of input passed to SecureRandom.setSeed() if
- * the default SecureRandom does for its generateSeed() call.
- *
- */
- public SP800SecureRandomBuilder()
- : this(new SecureRandom(), false)
- {
- }
-
- /**
- * Construct a builder with an EntropySourceProvider based on the passed in SecureRandom and the passed in value
- * for prediction resistance.
- *
- * Any SecureRandom created from a builder constructed like this will make use of input passed to SecureRandom.setSeed() if
- * the passed in SecureRandom does for its generateSeed() call.
- *
- * @param entropySource
- * @param predictionResistant
- */
- public SP800SecureRandomBuilder(SecureRandom entropySource, bool predictionResistant)
- {
- this.mRandom = entropySource;
- this.mEntropySourceProvider = new BasicEntropySourceProvider(entropySource, predictionResistant);
- }
-
- /**
- * Create a builder which makes creates the SecureRandom objects from a specified entropy source provider.
- *
- * Note: If this constructor is used any calls to setSeed() in the resulting SecureRandom will be ignored.
- *
- * @param entropySourceProvider a provider of EntropySource objects.
- */
- public SP800SecureRandomBuilder(IEntropySourceProvider entropySourceProvider)
- {
- this.mRandom = null;
- this.mEntropySourceProvider = entropySourceProvider;
- }
-
- /**
- * Set the personalization string for DRBG SecureRandoms created by this builder
- * @param personalizationString the personalisation string for the underlying DRBG.
- * @return the current builder.
- */
- public SP800SecureRandomBuilder SetPersonalizationString(byte[] personalizationString)
- {
- this.mPersonalizationString = personalizationString;
- return this;
- }
-
- /**
- * Set the security strength required for DRBGs used in building SecureRandom objects.
- *
- * @param securityStrength the security strength (in bits)
- * @return the current builder.
- */
- public SP800SecureRandomBuilder SetSecurityStrength(int securityStrength)
- {
- this.mSecurityStrength = securityStrength;
- return this;
- }
-
- /**
- * Set the amount of entropy bits required for seeding and reseeding DRBGs used in building SecureRandom objects.
- *
- * @param entropyBitsRequired the number of bits of entropy to be requested from the entropy source on each seed/reseed.
- * @return the current builder.
- */
- public SP800SecureRandomBuilder SetEntropyBitsRequired(int entropyBitsRequired)
- {
- this.mEntropyBitsRequired = entropyBitsRequired;
- return this;
- }
-
- /**
- * Build a SecureRandom based on a SP 800-90A Hash DRBG.
- *
- * @param digest digest algorithm to use in the DRBG underneath the SecureRandom.
- * @param nonce nonce value to use in DRBG construction.
- * @param predictionResistant specify whether the underlying DRBG in the resulting SecureRandom should reseed on each request for bytes.
- * @return a SecureRandom supported by a Hash DRBG.
- */
- public SP800SecureRandom BuildHash(IDigest digest, byte[] nonce, bool predictionResistant)
- {
- return new SP800SecureRandom(mRandom, mEntropySourceProvider.Get(mEntropyBitsRequired),
- new HashDrbgProvider(digest, nonce, mPersonalizationString, mSecurityStrength), predictionResistant);
- }
-
- /**
- * Build a SecureRandom based on a SP 800-90A CTR DRBG.
- *
- * @param cipher the block cipher to base the DRBG on.
- * @param keySizeInBits key size in bits to be used with the block cipher.
- * @param nonce nonce value to use in DRBG construction.
- * @param predictionResistant specify whether the underlying DRBG in the resulting SecureRandom should reseed on each request for bytes.
- * @return a SecureRandom supported by a CTR DRBG.
- */
- public SP800SecureRandom BuildCtr(IBlockCipher cipher, int keySizeInBits, byte[] nonce, bool predictionResistant)
- {
- return new SP800SecureRandom(mRandom, mEntropySourceProvider.Get(mEntropyBitsRequired),
- new CtrDrbgProvider(cipher, keySizeInBits, nonce, mPersonalizationString, mSecurityStrength), predictionResistant);
- }
-
- /**
- * Build a SecureRandom based on a SP 800-90A HMAC DRBG.
- *
- * @param hMac HMAC algorithm to use in the DRBG underneath the SecureRandom.
- * @param nonce nonce value to use in DRBG construction.
- * @param predictionResistant specify whether the underlying DRBG in the resulting SecureRandom should reseed on each request for bytes.
- * @return a SecureRandom supported by a HMAC DRBG.
- */
- public SP800SecureRandom BuildHMac(IMac hMac, byte[] nonce, bool predictionResistant)
- {
- return new SP800SecureRandom(mRandom, mEntropySourceProvider.Get(mEntropyBitsRequired),
- new HMacDrbgProvider(hMac, nonce, mPersonalizationString, mSecurityStrength), predictionResistant);
- }
-
- private class HashDrbgProvider
- : IDrbgProvider
- {
- private readonly IDigest mDigest;
- private readonly byte[] mNonce;
- private readonly byte[] mPersonalizationString;
- private readonly int mSecurityStrength;
-
- public HashDrbgProvider(IDigest digest, byte[] nonce, byte[] personalizationString, int securityStrength)
- {
- this.mDigest = digest;
- this.mNonce = nonce;
- this.mPersonalizationString = personalizationString;
- this.mSecurityStrength = securityStrength;
- }
-
- public ISP80090Drbg Get(IEntropySource entropySource)
- {
- return new HashSP800Drbg(mDigest, mSecurityStrength, entropySource, mPersonalizationString, mNonce);
- }
- }
-
- private class HMacDrbgProvider
- : IDrbgProvider
- {
- private readonly IMac mHMac;
- private readonly byte[] mNonce;
- private readonly byte[] mPersonalizationString;
- private readonly int mSecurityStrength;
-
- public HMacDrbgProvider(IMac hMac, byte[] nonce, byte[] personalizationString, int securityStrength)
- {
- this.mHMac = hMac;
- this.mNonce = nonce;
- this.mPersonalizationString = personalizationString;
- this.mSecurityStrength = securityStrength;
- }
-
- public ISP80090Drbg Get(IEntropySource entropySource)
- {
- return new HMacSP800Drbg(mHMac, mSecurityStrength, entropySource, mPersonalizationString, mNonce);
- }
- }
-
- private class CtrDrbgProvider
- : IDrbgProvider
- {
- private readonly IBlockCipher mBlockCipher;
- private readonly int mKeySizeInBits;
- private readonly byte[] mNonce;
- private readonly byte[] mPersonalizationString;
- private readonly int mSecurityStrength;
-
- public CtrDrbgProvider(IBlockCipher blockCipher, int keySizeInBits, byte[] nonce, byte[] personalizationString, int securityStrength)
- {
- this.mBlockCipher = blockCipher;
- this.mKeySizeInBits = keySizeInBits;
- this.mNonce = nonce;
- this.mPersonalizationString = personalizationString;
- this.mSecurityStrength = securityStrength;
- }
-
- public ISP80090Drbg Get(IEntropySource entropySource)
- {
- return new CtrSP800Drbg(mBlockCipher, mKeySizeInBits, mSecurityStrength, entropySource, mPersonalizationString, mNonce);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/ThreadedSeedGenerator.cs b/BCCrypto/src/crypto/prng/ThreadedSeedGenerator.cs
deleted file mode 100644
index 0a38e5f..0000000
--- a/BCCrypto/src/crypto/prng/ThreadedSeedGenerator.cs
+++ /dev/null
@@ -1,129 +0,0 @@
-using System;
-using System.Threading;
-
-#if NO_THREADS
-using System.Threading.Tasks;
-#endif
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- /**
- * A thread based seed generator - one source of randomness.
- *
- * Based on an idea from Marcus Lippert.
- *
- */
- public class ThreadedSeedGenerator
- {
- private class SeedGenerator
- {
-#if NETCF_1_0
- // No volatile keyword, but all fields implicitly volatile anyway
- private int counter = 0;
- private bool stop = false;
-#else
- private volatile int counter = 0;
- private volatile bool stop = false;
-#endif
-
- private void Run(object ignored)
- {
- while (!this.stop)
- {
- this.counter++;
- }
- }
-
- public byte[] GenerateSeed(
- int numBytes,
- bool fast)
- {
-#if SILVERLIGHT || PORTABLE
- return DoGenerateSeed(numBytes, fast);
-#else
- ThreadPriority originalPriority = Thread.CurrentThread.Priority;
- try
- {
- Thread.CurrentThread.Priority = ThreadPriority.Normal;
- return DoGenerateSeed(numBytes, fast);
- }
- finally
- {
- Thread.CurrentThread.Priority = originalPriority;
- }
-#endif
- }
-
- private byte[] DoGenerateSeed(
- int numBytes,
- bool fast)
- {
- this.counter = 0;
- this.stop = false;
-
- byte[] result = new byte[numBytes];
- int last = 0;
- int end = fast ? numBytes : numBytes * 8;
-
-#if NO_THREADS
- Task.Factory.StartNew(() => Run(null), TaskCreationOptions.None);
-#else
- ThreadPool.QueueUserWorkItem(new WaitCallback(Run));
-#endif
-
- for (int i = 0; i < end; i++)
- {
- while (this.counter == last)
- {
- try
- {
-#if PORTABLE
- new AutoResetEvent(false).WaitOne(1);
-#else
- Thread.Sleep(1);
-#endif
- }
- catch (Exception)
- {
- // ignore
- }
- }
-
- last = this.counter;
-
- if (fast)
- {
- result[i] = (byte)last;
- }
- else
- {
- int bytepos = i / 8;
- result[bytepos] = (byte)((result[bytepos] << 1) | (last & 1));
- }
- }
-
- this.stop = true;
-
- return result;
- }
- }
-
- /**
- * Generate seed bytes. Set fast to false for best quality.
- *
- * If fast is set to true, the code should be round about 8 times faster when
- * generating a long sequence of random bytes. 20 bytes of random values using
- * the fast mode take less than half a second on a Nokia e70. If fast is set to false,
- * it takes round about 2500 ms.
- *
- * @param numBytes the number of bytes to generate
- * @param fast true if fast mode should be used
- */
- public byte[] GenerateSeed(
- int numBytes,
- bool fast)
- {
- return new SeedGenerator().GenerateSeed(numBytes, fast);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/VMPCRandomGenerator.cs b/BCCrypto/src/crypto/prng/VMPCRandomGenerator.cs
deleted file mode 100644
index 64f287d..0000000
--- a/BCCrypto/src/crypto/prng/VMPCRandomGenerator.cs
+++ /dev/null
@@ -1,114 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- public class VmpcRandomGenerator
- : IRandomGenerator
- {
- private byte n = 0;
-
- ///
- /// Permutation generated by code:
- ///
- /// // First 1850 fractional digit of Pi number.
- /// byte[] key = new BigInteger("14159265358979323846...5068006422512520511").ToByteArray();
- /// s = 0;
- /// P = new byte[256];
- /// for (int i = 0; i < 256; i++)
- /// {
- /// P[i] = (byte) i;
- /// }
- /// for (int m = 0; m < 768; m++)
- /// {
- /// s = P[(s + P[m & 0xff] + key[m % key.length]) & 0xff];
- /// byte temp = P[m & 0xff];
- /// P[m & 0xff] = P[s & 0xff];
- /// P[s & 0xff] = temp;
- /// }
- ///
- private byte[] P =
- {
- (byte) 0xbb, (byte) 0x2c, (byte) 0x62, (byte) 0x7f, (byte) 0xb5, (byte) 0xaa, (byte) 0xd4,
- (byte) 0x0d, (byte) 0x81, (byte) 0xfe, (byte) 0xb2, (byte) 0x82, (byte) 0xcb, (byte) 0xa0, (byte) 0xa1,
- (byte) 0x08, (byte) 0x18, (byte) 0x71, (byte) 0x56, (byte) 0xe8, (byte) 0x49, (byte) 0x02, (byte) 0x10,
- (byte) 0xc4, (byte) 0xde, (byte) 0x35, (byte) 0xa5, (byte) 0xec, (byte) 0x80, (byte) 0x12, (byte) 0xb8,
- (byte) 0x69, (byte) 0xda, (byte) 0x2f, (byte) 0x75, (byte) 0xcc, (byte) 0xa2, (byte) 0x09, (byte) 0x36,
- (byte) 0x03, (byte) 0x61, (byte) 0x2d, (byte) 0xfd, (byte) 0xe0, (byte) 0xdd, (byte) 0x05, (byte) 0x43,
- (byte) 0x90, (byte) 0xad, (byte) 0xc8, (byte) 0xe1, (byte) 0xaf, (byte) 0x57, (byte) 0x9b, (byte) 0x4c,
- (byte) 0xd8, (byte) 0x51, (byte) 0xae, (byte) 0x50, (byte) 0x85, (byte) 0x3c, (byte) 0x0a, (byte) 0xe4,
- (byte) 0xf3, (byte) 0x9c, (byte) 0x26, (byte) 0x23, (byte) 0x53, (byte) 0xc9, (byte) 0x83, (byte) 0x97,
- (byte) 0x46, (byte) 0xb1, (byte) 0x99, (byte) 0x64, (byte) 0x31, (byte) 0x77, (byte) 0xd5, (byte) 0x1d,
- (byte) 0xd6, (byte) 0x78, (byte) 0xbd, (byte) 0x5e, (byte) 0xb0, (byte) 0x8a, (byte) 0x22, (byte) 0x38,
- (byte) 0xf8, (byte) 0x68, (byte) 0x2b, (byte) 0x2a, (byte) 0xc5, (byte) 0xd3, (byte) 0xf7, (byte) 0xbc,
- (byte) 0x6f, (byte) 0xdf, (byte) 0x04, (byte) 0xe5, (byte) 0x95, (byte) 0x3e, (byte) 0x25, (byte) 0x86,
- (byte) 0xa6, (byte) 0x0b, (byte) 0x8f, (byte) 0xf1, (byte) 0x24, (byte) 0x0e, (byte) 0xd7, (byte) 0x40,
- (byte) 0xb3, (byte) 0xcf, (byte) 0x7e, (byte) 0x06, (byte) 0x15, (byte) 0x9a, (byte) 0x4d, (byte) 0x1c,
- (byte) 0xa3, (byte) 0xdb, (byte) 0x32, (byte) 0x92, (byte) 0x58, (byte) 0x11, (byte) 0x27, (byte) 0xf4,
- (byte) 0x59, (byte) 0xd0, (byte) 0x4e, (byte) 0x6a, (byte) 0x17, (byte) 0x5b, (byte) 0xac, (byte) 0xff,
- (byte) 0x07, (byte) 0xc0, (byte) 0x65, (byte) 0x79, (byte) 0xfc, (byte) 0xc7, (byte) 0xcd, (byte) 0x76,
- (byte) 0x42, (byte) 0x5d, (byte) 0xe7, (byte) 0x3a, (byte) 0x34, (byte) 0x7a, (byte) 0x30, (byte) 0x28,
- (byte) 0x0f, (byte) 0x73, (byte) 0x01, (byte) 0xf9, (byte) 0xd1, (byte) 0xd2, (byte) 0x19, (byte) 0xe9,
- (byte) 0x91, (byte) 0xb9, (byte) 0x5a, (byte) 0xed, (byte) 0x41, (byte) 0x6d, (byte) 0xb4, (byte) 0xc3,
- (byte) 0x9e, (byte) 0xbf, (byte) 0x63, (byte) 0xfa, (byte) 0x1f, (byte) 0x33, (byte) 0x60, (byte) 0x47,
- (byte) 0x89, (byte) 0xf0, (byte) 0x96, (byte) 0x1a, (byte) 0x5f, (byte) 0x93, (byte) 0x3d, (byte) 0x37,
- (byte) 0x4b, (byte) 0xd9, (byte) 0xa8, (byte) 0xc1, (byte) 0x1b, (byte) 0xf6, (byte) 0x39, (byte) 0x8b,
- (byte) 0xb7, (byte) 0x0c, (byte) 0x20, (byte) 0xce, (byte) 0x88, (byte) 0x6e, (byte) 0xb6, (byte) 0x74,
- (byte) 0x8e, (byte) 0x8d, (byte) 0x16, (byte) 0x29, (byte) 0xf2, (byte) 0x87, (byte) 0xf5, (byte) 0xeb,
- (byte) 0x70, (byte) 0xe3, (byte) 0xfb, (byte) 0x55, (byte) 0x9f, (byte) 0xc6, (byte) 0x44, (byte) 0x4a,
- (byte) 0x45, (byte) 0x7d, (byte) 0xe2, (byte) 0x6b, (byte) 0x5c, (byte) 0x6c, (byte) 0x66, (byte) 0xa9,
- (byte) 0x8c, (byte) 0xee, (byte) 0x84, (byte) 0x13, (byte) 0xa7, (byte) 0x1e, (byte) 0x9d, (byte) 0xdc,
- (byte) 0x67, (byte) 0x48, (byte) 0xba, (byte) 0x2e, (byte) 0xe6, (byte) 0xa4, (byte) 0xab, (byte) 0x7c,
- (byte) 0x94, (byte) 0x00, (byte) 0x21, (byte) 0xef, (byte) 0xea, (byte) 0xbe, (byte) 0xca, (byte) 0x72,
- (byte) 0x4f, (byte) 0x52, (byte) 0x98, (byte) 0x3f, (byte) 0xc2, (byte) 0x14, (byte) 0x7b, (byte) 0x3b,
- (byte) 0x54
- };
-
- /// Value generated in the same way as P .
- private byte s = (byte) 0xbe;
-
- public VmpcRandomGenerator()
- {
- }
-
- public virtual void AddSeedMaterial(byte[] seed)
- {
- for (int m = 0; m < seed.Length; m++)
- {
- s = P[(s + P[n & 0xff] + seed[m]) & 0xff];
- byte temp = P[n & 0xff];
- P[n & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- n = (byte) ((n + 1) & 0xff);
- }
- }
-
- public virtual void AddSeedMaterial(long seed)
- {
- AddSeedMaterial(Pack.UInt64_To_BE((ulong)seed));
- }
-
- public virtual void NextBytes(byte[] bytes)
- {
- NextBytes(bytes, 0, bytes.Length);
- }
-
- public virtual void NextBytes(byte[] bytes, int start, int len)
- {
- lock (P)
- {
- int end = start + len;
- for (int i = start; i != end; i++)
- {
- s = P[(s + P[n & 0xff]) & 0xff];
- bytes[i] = P[(P[(P[s & 0xff]) & 0xff] + 1) & 0xff];
- byte temp = P[n & 0xff];
- P[n & 0xff] = P[s & 0xff];
- P[s & 0xff] = temp;
- n = (byte) ((n + 1) & 0xff);
- }
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/X931Rng.cs b/BCCrypto/src/crypto/prng/X931Rng.cs
deleted file mode 100644
index 2bd8e0c..0000000
--- a/BCCrypto/src/crypto/prng/X931Rng.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- internal class X931Rng
- {
- private const long BLOCK64_RESEED_MAX = 1L << (16 - 1);
- private const long BLOCK128_RESEED_MAX = 1L << (24 - 1);
- private const int BLOCK64_MAX_BITS_REQUEST = 1 << (13 - 1);
- private const int BLOCK128_MAX_BITS_REQUEST = 1 << (19 - 1);
-
- private readonly IBlockCipher mEngine;
- private readonly IEntropySource mEntropySource;
-
- private readonly byte[] mDT;
- private readonly byte[] mI;
- private readonly byte[] mR;
-
- private byte[] mV;
-
- private long mReseedCounter = 1;
-
- /**
- *
- * @param engine
- * @param entropySource
- */
- internal X931Rng(IBlockCipher engine, byte[] dateTimeVector, IEntropySource entropySource)
- {
- this.mEngine = engine;
- this.mEntropySource = entropySource;
-
- this.mDT = new byte[engine.GetBlockSize()];
-
- Array.Copy(dateTimeVector, 0, mDT, 0, mDT.Length);
-
- this.mI = new byte[engine.GetBlockSize()];
- this.mR = new byte[engine.GetBlockSize()];
- }
-
- /**
- * Populate a passed in array with random data.
- *
- * @param output output array for generated bits.
- * @param predictionResistant true if a reseed should be forced, false otherwise.
- *
- * @return number of bits generated, -1 if a reseed required.
- */
- internal int Generate(byte[] output, bool predictionResistant)
- {
- if (mR.Length == 8) // 64 bit block size
- {
- if (mReseedCounter > BLOCK64_RESEED_MAX)
- return -1;
-
- if (IsTooLarge(output, BLOCK64_MAX_BITS_REQUEST / 8))
- throw new ArgumentException("Number of bits per request limited to " + BLOCK64_MAX_BITS_REQUEST, "output");
- }
- else
- {
- if (mReseedCounter > BLOCK128_RESEED_MAX)
- return -1;
-
- if (IsTooLarge(output, BLOCK128_MAX_BITS_REQUEST / 8))
- throw new ArgumentException("Number of bits per request limited to " + BLOCK128_MAX_BITS_REQUEST, "output");
- }
-
- if (predictionResistant || mV == null)
- {
- mV = mEntropySource.GetEntropy();
- if (mV.Length != mEngine.GetBlockSize())
- throw new InvalidOperationException("Insufficient entropy returned");
- }
-
- int m = output.Length / mR.Length;
-
- for (int i = 0; i < m; i++)
- {
- mEngine.ProcessBlock(mDT, 0, mI, 0);
- Process(mR, mI, mV);
- Process(mV, mR, mI);
-
- Array.Copy(mR, 0, output, i * mR.Length, mR.Length);
-
- Increment(mDT);
- }
-
- int bytesToCopy = (output.Length - m * mR.Length);
-
- if (bytesToCopy > 0)
- {
- mEngine.ProcessBlock(mDT, 0, mI, 0);
- Process(mR, mI, mV);
- Process(mV, mR, mI);
-
- Array.Copy(mR, 0, output, m * mR.Length, bytesToCopy);
-
- Increment(mDT);
- }
-
- mReseedCounter++;
-
- return output.Length;
- }
-
- /**
- * Reseed the RNG.
- */
- internal void Reseed()
- {
- mV = mEntropySource.GetEntropy();
- if (mV.Length != mEngine.GetBlockSize())
- throw new InvalidOperationException("Insufficient entropy returned");
- mReseedCounter = 1;
- }
-
- internal IEntropySource EntropySource
- {
- get { return mEntropySource; }
- }
-
- private void Process(byte[] res, byte[] a, byte[] b)
- {
- for (int i = 0; i != res.Length; i++)
- {
- res[i] = (byte)(a[i] ^ b[i]);
- }
-
- mEngine.ProcessBlock(res, 0, res, 0);
- }
-
- private void Increment(byte[] val)
- {
- for (int i = val.Length - 1; i >= 0; i--)
- {
- if (++val[i] != 0)
- break;
- }
- }
-
- private static bool IsTooLarge(byte[] bytes, int maxBytes)
- {
- return bytes != null && bytes.Length > maxBytes;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/X931SecureRandom.cs b/BCCrypto/src/crypto/prng/X931SecureRandom.cs
deleted file mode 100644
index d2e4849..0000000
--- a/BCCrypto/src/crypto/prng/X931SecureRandom.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- public class X931SecureRandom
- : SecureRandom
- {
- private readonly bool mPredictionResistant;
- private readonly SecureRandom mRandomSource;
- private readonly X931Rng mDrbg;
-
- internal X931SecureRandom(SecureRandom randomSource, X931Rng drbg, bool predictionResistant)
- : base((IRandomGenerator)null)
- {
- this.mRandomSource = randomSource;
- this.mDrbg = drbg;
- this.mPredictionResistant = predictionResistant;
- }
-
- public override void SetSeed(byte[] seed)
- {
- lock (this)
- {
- if (mRandomSource != null)
- {
- this.mRandomSource.SetSeed(seed);
- }
- }
- }
-
- public override void SetSeed(long seed)
- {
- lock (this)
- {
- // this will happen when SecureRandom() is created
- if (mRandomSource != null)
- {
- this.mRandomSource.SetSeed(seed);
- }
- }
- }
-
- public override void NextBytes(byte[] bytes)
- {
- lock (this)
- {
- // check if a reseed is required...
- if (mDrbg.Generate(bytes, mPredictionResistant) < 0)
- {
- mDrbg.Reseed();
- mDrbg.Generate(bytes, mPredictionResistant);
- }
- }
- }
-
- public override void NextBytes(byte[] buf, int off, int len)
- {
- byte[] bytes = new byte[len];
- NextBytes(bytes);
- Array.Copy(bytes, 0, buf, off, len);
- }
-
- public override byte[] GenerateSeed(int numBytes)
- {
- return EntropyUtilities.GenerateSeed(mDrbg.EntropySource, numBytes);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/X931SecureRandomBuilder.cs b/BCCrypto/src/crypto/prng/X931SecureRandomBuilder.cs
deleted file mode 100644
index 31e9431..0000000
--- a/BCCrypto/src/crypto/prng/X931SecureRandomBuilder.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Crypto.Prng
-{
- public class X931SecureRandomBuilder
- {
- private readonly SecureRandom mRandom; // JDK 1.1 complains on final.
-
- private IEntropySourceProvider mEntropySourceProvider;
- private byte[] mDateTimeVector;
-
- /**
- * Basic constructor, creates a builder using an EntropySourceProvider based on the default SecureRandom with
- * predictionResistant set to false.
- *
- * Any SecureRandom created from a builder constructed like this will make use of input passed to SecureRandom.setSeed() if
- * the default SecureRandom does for its generateSeed() call.
- *
- */
- public X931SecureRandomBuilder()
- : this(new SecureRandom(), false)
- {
- }
-
- /**
- * Construct a builder with an EntropySourceProvider based on the passed in SecureRandom and the passed in value
- * for prediction resistance.
- *
- * Any SecureRandom created from a builder constructed like this will make use of input passed to SecureRandom.setSeed() if
- * the passed in SecureRandom does for its generateSeed() call.
- *
- * @param entropySource
- * @param predictionResistant
- */
- public X931SecureRandomBuilder(SecureRandom entropySource, bool predictionResistant)
- {
- this.mRandom = entropySource;
- this.mEntropySourceProvider = new BasicEntropySourceProvider(mRandom, predictionResistant);
- }
-
- /**
- * Create a builder which makes creates the SecureRandom objects from a specified entropy source provider.
- *
- * Note: If this constructor is used any calls to setSeed() in the resulting SecureRandom will be ignored.
- *
- * @param entropySourceProvider a provider of EntropySource objects.
- */
- public X931SecureRandomBuilder(IEntropySourceProvider entropySourceProvider)
- {
- this.mRandom = null;
- this.mEntropySourceProvider = entropySourceProvider;
- }
-
- public X931SecureRandomBuilder SetDateTimeVector(byte[] dateTimeVector)
- {
- this.mDateTimeVector = dateTimeVector;
- return this;
- }
-
- /**
- * Construct a X9.31 secure random generator using the passed in engine and key. If predictionResistant is true the
- * generator will be reseeded on each request.
- *
- * @param engine a block cipher to use as the operator.
- * @param key the block cipher key to initialise engine with.
- * @param predictionResistant true if engine to be reseeded on each use, false otherwise.
- * @return a SecureRandom.
- */
- public X931SecureRandom Build(IBlockCipher engine, KeyParameter key, bool predictionResistant)
- {
- if (mDateTimeVector == null)
- {
- mDateTimeVector = new byte[engine.GetBlockSize()];
- Pack.UInt64_To_BE((ulong)DateTimeUtilities.CurrentUnixMs(), mDateTimeVector, 0);
- }
-
- engine.Init(true, key);
-
- return new X931SecureRandom(mRandom, new X931Rng(engine, mDateTimeVector, mEntropySourceProvider.Get(engine.GetBlockSize() * 8)), predictionResistant);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/drbg/CtrSP800Drbg.cs b/BCCrypto/src/crypto/prng/drbg/CtrSP800Drbg.cs
deleted file mode 100644
index eca1821..0000000
--- a/BCCrypto/src/crypto/prng/drbg/CtrSP800Drbg.cs
+++ /dev/null
@@ -1,466 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Crypto.Prng.Drbg
-{
- /**
- * A SP800-90A CTR DRBG.
- */
- public class CtrSP800Drbg
- : ISP80090Drbg
- {
- private static readonly long TDEA_RESEED_MAX = 1L << (32 - 1);
- private static readonly long AES_RESEED_MAX = 1L << (48 - 1);
- private static readonly int TDEA_MAX_BITS_REQUEST = 1 << (13 - 1);
- private static readonly int AES_MAX_BITS_REQUEST = 1 << (19 - 1);
-
- private readonly IEntropySource mEntropySource;
- private readonly IBlockCipher mEngine;
- private readonly int mKeySizeInBits;
- private readonly int mSeedLength;
- private readonly int mSecurityStrength;
-
- // internal state
- private byte[] mKey;
- private byte[] mV;
- private long mReseedCounter = 0;
- private bool mIsTdea = false;
-
- /**
- * Construct a SP800-90A CTR DRBG.
- *
- * Minimum entropy requirement is the security strength requested.
- *
- * @param engine underlying block cipher to use to support DRBG
- * @param keySizeInBits size of the key to use with the block cipher.
- * @param securityStrength security strength required (in bits)
- * @param entropySource source of entropy to use for seeding/reseeding.
- * @param personalizationString personalization string to distinguish this DRBG (may be null).
- * @param nonce nonce to further distinguish this DRBG (may be null).
- */
- public CtrSP800Drbg(IBlockCipher engine, int keySizeInBits, int securityStrength, IEntropySource entropySource,
- byte[] personalizationString, byte[] nonce)
- {
- if (securityStrength > 256)
- throw new ArgumentException("Requested security strength is not supported by the derivation function");
- if (GetMaxSecurityStrength(engine, keySizeInBits) < securityStrength)
- throw new ArgumentException("Requested security strength is not supported by block cipher and key size");
- if (entropySource.EntropySize < securityStrength)
- throw new ArgumentException("Not enough entropy for security strength required");
-
- mEntropySource = entropySource;
- mEngine = engine;
-
- mKeySizeInBits = keySizeInBits;
- mSecurityStrength = securityStrength;
- mSeedLength = keySizeInBits + engine.GetBlockSize() * 8;
- mIsTdea = IsTdea(engine);
-
- byte[] entropy = GetEntropy(); // Get_entropy_input
-
- CTR_DRBG_Instantiate_algorithm(entropy, nonce, personalizationString);
- }
-
- private void CTR_DRBG_Instantiate_algorithm(byte[] entropy, byte[] nonce, byte[] personalisationString)
- {
- byte[] seedMaterial = Arrays.ConcatenateAll(entropy, nonce, personalisationString);
- byte[] seed = Block_Cipher_df(seedMaterial, mSeedLength);
-
- int outlen = mEngine.GetBlockSize();
-
- mKey = new byte[(mKeySizeInBits + 7) / 8];
- mV = new byte[outlen];
-
- // mKey & mV are modified by this call
- CTR_DRBG_Update(seed, mKey, mV);
-
- mReseedCounter = 1;
- }
-
- private void CTR_DRBG_Update(byte[] seed, byte[] key, byte[] v)
- {
- byte[] temp = new byte[seed.Length];
- byte[] outputBlock = new byte[mEngine.GetBlockSize()];
-
- int i = 0;
- int outLen = mEngine.GetBlockSize();
-
- mEngine.Init(true, new KeyParameter(ExpandKey(key)));
- while (i*outLen < seed.Length)
- {
- AddOneTo(v);
- mEngine.ProcessBlock(v, 0, outputBlock, 0);
-
- int bytesToCopy = ((temp.Length - i * outLen) > outLen)
- ? outLen : (temp.Length - i * outLen);
-
- Array.Copy(outputBlock, 0, temp, i * outLen, bytesToCopy);
- ++i;
- }
-
- XOR(temp, seed, temp, 0);
-
- Array.Copy(temp, 0, key, 0, key.Length);
- Array.Copy(temp, key.Length, v, 0, v.Length);
- }
-
- private void CTR_DRBG_Reseed_algorithm(byte[] additionalInput)
- {
- byte[] seedMaterial = Arrays.Concatenate(GetEntropy(), additionalInput);
-
- seedMaterial = Block_Cipher_df(seedMaterial, mSeedLength);
-
- CTR_DRBG_Update(seedMaterial, mKey, mV);
-
- mReseedCounter = 1;
- }
-
- private void XOR(byte[] output, byte[] a, byte[] b, int bOff)
- {
- for (int i = 0; i < output.Length; i++)
- {
- output[i] = (byte)(a[i] ^ b[bOff + i]);
- }
- }
-
- private void AddOneTo(byte[] longer)
- {
- uint carry = 1;
- int i = longer.Length;
- while (--i >= 0)
- {
- carry += longer[i];
- longer[i] = (byte)carry;
- carry >>= 8;
- }
- }
-
- private byte[] GetEntropy()
- {
- byte[] entropy = mEntropySource.GetEntropy();
- if (entropy.Length < (mSecurityStrength + 7) / 8)
- throw new InvalidOperationException("Insufficient entropy provided by entropy source");
- return entropy;
- }
-
- // -- Internal state migration ---
-
- private static readonly byte[] K_BITS = Hex.Decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F");
-
- // 1. If (number_of_bits_to_return > max_number_of_bits), then return an
- // ERROR_FLAG.
- // 2. L = len (input_string)/8.
- // 3. N = number_of_bits_to_return/8.
- // Comment: L is the bitstring represention of
- // the integer resulting from len (input_string)/8.
- // L shall be represented as a 32-bit integer.
- //
- // Comment : N is the bitstring represention of
- // the integer resulting from
- // number_of_bits_to_return/8. N shall be
- // represented as a 32-bit integer.
- //
- // 4. S = L || N || input_string || 0x80.
- // 5. While (len (S) mod outlen)
- // Comment : Pad S with zeros, if necessary.
- // 0, S = S || 0x00.
- //
- // Comment : Compute the starting value.
- // 6. temp = the Null string.
- // 7. i = 0.
- // 8. K = Leftmost keylen bits of 0x00010203...1D1E1F.
- // 9. While len (temp) < keylen + outlen, do
- //
- // IV = i || 0outlen - len (i).
- //
- // 9.1
- //
- // temp = temp || BCC (K, (IV || S)).
- //
- // 9.2
- //
- // i = i + 1.
- //
- // 9.3
- //
- // Comment : i shall be represented as a 32-bit
- // integer, i.e., len (i) = 32.
- //
- // Comment: The 32-bit integer represenation of
- // i is padded with zeros to outlen bits.
- //
- // Comment: Compute the requested number of
- // bits.
- //
- // 10. K = Leftmost keylen bits of temp.
- //
- // 11. X = Next outlen bits of temp.
- //
- // 12. temp = the Null string.
- //
- // 13. While len (temp) < number_of_bits_to_return, do
- //
- // 13.1 X = Block_Encrypt (K, X).
- //
- // 13.2 temp = temp || X.
- //
- // 14. requested_bits = Leftmost number_of_bits_to_return of temp.
- //
- // 15. Return SUCCESS and requested_bits.
- private byte[] Block_Cipher_df(byte[] inputString, int bitLength)
- {
- int outLen = mEngine.GetBlockSize();
- int L = inputString.Length; // already in bytes
- int N = bitLength / 8;
- // 4 S = L || N || inputstring || 0x80
- int sLen = 4 + 4 + L + 1;
- int blockLen = ((sLen + outLen - 1) / outLen) * outLen;
- byte[] S = new byte[blockLen];
- copyIntToByteArray(S, L, 0);
- copyIntToByteArray(S, N, 4);
- Array.Copy(inputString, 0, S, 8, L);
- S[8 + L] = (byte)0x80;
- // S already padded with zeros
-
- byte[] temp = new byte[mKeySizeInBits / 8 + outLen];
- byte[] bccOut = new byte[outLen];
-
- byte[] IV = new byte[outLen];
-
- int i = 0;
- byte[] K = new byte[mKeySizeInBits / 8];
- Array.Copy(K_BITS, 0, K, 0, K.Length);
-
- while (i*outLen*8 < mKeySizeInBits + outLen *8)
- {
- copyIntToByteArray(IV, i, 0);
- BCC(bccOut, K, IV, S);
-
- int bytesToCopy = ((temp.Length - i * outLen) > outLen)
- ? outLen
- : (temp.Length - i * outLen);
-
- Array.Copy(bccOut, 0, temp, i * outLen, bytesToCopy);
- ++i;
- }
-
- byte[] X = new byte[outLen];
- Array.Copy(temp, 0, K, 0, K.Length);
- Array.Copy(temp, K.Length, X, 0, X.Length);
-
- temp = new byte[bitLength / 2];
-
- i = 0;
- mEngine.Init(true, new KeyParameter(ExpandKey(K)));
-
- while (i * outLen < temp.Length)
- {
- mEngine.ProcessBlock(X, 0, X, 0);
-
- int bytesToCopy = ((temp.Length - i * outLen) > outLen)
- ? outLen
- : (temp.Length - i * outLen);
-
- Array.Copy(X, 0, temp, i * outLen, bytesToCopy);
- i++;
- }
-
- return temp;
- }
-
- /*
- * 1. chaining_value = 0^outlen
- * . Comment: Set the first chaining value to outlen zeros.
- * 2. n = len (data)/outlen.
- * 3. Starting with the leftmost bits of data, split the data into n blocks of outlen bits
- * each, forming block(1) to block(n).
- * 4. For i = 1 to n do
- * 4.1 input_block = chaining_value ^ block(i) .
- * 4.2 chaining_value = Block_Encrypt (Key, input_block).
- * 5. output_block = chaining_value.
- * 6. Return output_block.
- */
- private void BCC(byte[] bccOut, byte[] k, byte[] iV, byte[] data)
- {
- int outlen = mEngine.GetBlockSize();
- byte[] chainingValue = new byte[outlen]; // initial values = 0
- int n = data.Length / outlen;
-
- byte[] inputBlock = new byte[outlen];
-
- mEngine.Init(true, new KeyParameter(ExpandKey(k)));
-
- mEngine.ProcessBlock(iV, 0, chainingValue, 0);
-
- for (int i = 0; i < n; i++)
- {
- XOR(inputBlock, chainingValue, data, i*outlen);
- mEngine.ProcessBlock(inputBlock, 0, chainingValue, 0);
- }
-
- Array.Copy(chainingValue, 0, bccOut, 0, bccOut.Length);
- }
-
- private void copyIntToByteArray(byte[] buf, int value, int offSet)
- {
- buf[offSet + 0] = ((byte)(value >> 24));
- buf[offSet + 1] = ((byte)(value >> 16));
- buf[offSet + 2] = ((byte)(value >> 8));
- buf[offSet + 3] = ((byte)(value));
- }
-
- /**
- * Return the block size (in bits) of the DRBG.
- *
- * @return the number of bits produced on each internal round of the DRBG.
- */
- public int BlockSize
- {
- get { return mV.Length * 8; }
- }
-
- /**
- * Populate a passed in array with random data.
- *
- * @param output output array for generated bits.
- * @param additionalInput additional input to be added to the DRBG in this step.
- * @param predictionResistant true if a reseed should be forced, false otherwise.
- *
- * @return number of bits generated, -1 if a reseed required.
- */
- public int Generate(byte[] output, byte[] additionalInput, bool predictionResistant)
- {
- if (mIsTdea)
- {
- if (mReseedCounter > TDEA_RESEED_MAX)
- return -1;
-
- if (DrbgUtilities.IsTooLarge(output, TDEA_MAX_BITS_REQUEST / 8))
- throw new ArgumentException("Number of bits per request limited to " + TDEA_MAX_BITS_REQUEST, "output");
- }
- else
- {
- if (mReseedCounter > AES_RESEED_MAX)
- return -1;
-
- if (DrbgUtilities.IsTooLarge(output, AES_MAX_BITS_REQUEST / 8))
- throw new ArgumentException("Number of bits per request limited to " + AES_MAX_BITS_REQUEST, "output");
- }
-
- if (predictionResistant)
- {
- CTR_DRBG_Reseed_algorithm(additionalInput);
- additionalInput = null;
- }
-
- if (additionalInput != null)
- {
- additionalInput = Block_Cipher_df(additionalInput, mSeedLength);
- CTR_DRBG_Update(additionalInput, mKey, mV);
- }
- else
- {
- additionalInput = new byte[mSeedLength];
- }
-
- byte[] tmp = new byte[mV.Length];
-
- mEngine.Init(true, new KeyParameter(ExpandKey(mKey)));
-
- for (int i = 0; i <= output.Length / tmp.Length; i++)
- {
- int bytesToCopy = ((output.Length - i * tmp.Length) > tmp.Length)
- ? tmp.Length
- : (output.Length - i * mV.Length);
-
- if (bytesToCopy != 0)
- {
- AddOneTo(mV);
-
- mEngine.ProcessBlock(mV, 0, tmp, 0);
-
- Array.Copy(tmp, 0, output, i * tmp.Length, bytesToCopy);
- }
- }
-
- CTR_DRBG_Update(additionalInput, mKey, mV);
-
- mReseedCounter++;
-
- return output.Length * 8;
- }
-
- /**
- * Reseed the DRBG.
- *
- * @param additionalInput additional input to be added to the DRBG in this step.
- */
- public void Reseed(byte[] additionalInput)
- {
- CTR_DRBG_Reseed_algorithm(additionalInput);
- }
-
- private bool IsTdea(IBlockCipher cipher)
- {
- return cipher.AlgorithmName.Equals("DESede") || cipher.AlgorithmName.Equals("TDEA");
- }
-
- private int GetMaxSecurityStrength(IBlockCipher cipher, int keySizeInBits)
- {
- if (IsTdea(cipher) && keySizeInBits == 168)
- {
- return 112;
- }
- if (cipher.AlgorithmName.Equals("AES"))
- {
- return keySizeInBits;
- }
-
- return -1;
- }
-
- private byte[] ExpandKey(byte[] key)
- {
- if (mIsTdea)
- {
- // expand key to 192 bits.
- byte[] tmp = new byte[24];
-
- PadKey(key, 0, tmp, 0);
- PadKey(key, 7, tmp, 8);
- PadKey(key, 14, tmp, 16);
-
- return tmp;
- }
- else
- {
- return key;
- }
- }
-
- /**
- * Pad out a key for TDEA, setting odd parity for each byte.
- *
- * @param keyMaster
- * @param keyOff
- * @param tmp
- * @param tmpOff
- */
- private void PadKey(byte[] keyMaster, int keyOff, byte[] tmp, int tmpOff)
- {
- tmp[tmpOff + 0] = (byte)(keyMaster[keyOff + 0] & 0xfe);
- tmp[tmpOff + 1] = (byte)((keyMaster[keyOff + 0] << 7) | ((keyMaster[keyOff + 1] & 0xfc) >> 1));
- tmp[tmpOff + 2] = (byte)((keyMaster[keyOff + 1] << 6) | ((keyMaster[keyOff + 2] & 0xf8) >> 2));
- tmp[tmpOff + 3] = (byte)((keyMaster[keyOff + 2] << 5) | ((keyMaster[keyOff + 3] & 0xf0) >> 3));
- tmp[tmpOff + 4] = (byte)((keyMaster[keyOff + 3] << 4) | ((keyMaster[keyOff + 4] & 0xe0) >> 4));
- tmp[tmpOff + 5] = (byte)((keyMaster[keyOff + 4] << 3) | ((keyMaster[keyOff + 5] & 0xc0) >> 5));
- tmp[tmpOff + 6] = (byte)((keyMaster[keyOff + 5] << 2) | ((keyMaster[keyOff + 6] & 0x80) >> 6));
- tmp[tmpOff + 7] = (byte)(keyMaster[keyOff + 6] << 1);
-
- DesParameters.SetOddParity(tmp, tmpOff, 8);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/drbg/DrbgUtilities.cs b/BCCrypto/src/crypto/prng/drbg/DrbgUtilities.cs
deleted file mode 100644
index d9a1c43..0000000
--- a/BCCrypto/src/crypto/prng/drbg/DrbgUtilities.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Prng.Drbg
-{
- internal class DrbgUtilities
- {
- private static readonly IDictionary maxSecurityStrengths = Platform.CreateHashtable();
-
- static DrbgUtilities()
- {
- maxSecurityStrengths.Add("SHA-1", 128);
-
- maxSecurityStrengths.Add("SHA-224", 192);
- maxSecurityStrengths.Add("SHA-256", 256);
- maxSecurityStrengths.Add("SHA-384", 256);
- maxSecurityStrengths.Add("SHA-512", 256);
-
- maxSecurityStrengths.Add("SHA-512/224", 192);
- maxSecurityStrengths.Add("SHA-512/256", 256);
- }
-
- internal static int GetMaxSecurityStrength(IDigest d)
- {
- return (int)maxSecurityStrengths[d.AlgorithmName];
- }
-
- internal static int GetMaxSecurityStrength(IMac m)
- {
- string name = m.AlgorithmName;
-
- return (int)maxSecurityStrengths[name.Substring(0, name.IndexOf("/"))];
- }
-
- /**
- * Used by both Dual EC and Hash.
- */
- internal static byte[] HashDF(IDigest digest, byte[] seedMaterial, int seedLength)
- {
- // 1. temp = the Null string.
- // 2. .
- // 3. counter = an 8-bit binary value representing the integer "1".
- // 4. For i = 1 to len do
- // Comment : In step 4.1, no_of_bits_to_return
- // is used as a 32-bit string.
- // 4.1 temp = temp || Hash (counter || no_of_bits_to_return ||
- // input_string).
- // 4.2 counter = counter + 1.
- // 5. requested_bits = Leftmost (no_of_bits_to_return) of temp.
- // 6. Return SUCCESS and requested_bits.
- byte[] temp = new byte[(seedLength + 7) / 8];
-
- int len = temp.Length / digest.GetDigestSize();
- int counter = 1;
-
- byte[] dig = new byte[digest.GetDigestSize()];
-
- for (int i = 0; i <= len; i++)
- {
- digest.Update((byte)counter);
-
- digest.Update((byte)(seedLength >> 24));
- digest.Update((byte)(seedLength >> 16));
- digest.Update((byte)(seedLength >> 8));
- digest.Update((byte)seedLength);
-
- digest.BlockUpdate(seedMaterial, 0, seedMaterial.Length);
-
- digest.DoFinal(dig, 0);
-
- int bytesToCopy = ((temp.Length - i * dig.Length) > dig.Length)
- ? dig.Length
- : (temp.Length - i * dig.Length);
- Array.Copy(dig, 0, temp, i * dig.Length, bytesToCopy);
-
- counter++;
- }
-
- // do a left shift to get rid of excess bits.
- if (seedLength % 8 != 0)
- {
- int shift = 8 - (seedLength % 8);
- uint carry = 0;
-
- for (int i = 0; i != temp.Length; i++)
- {
- uint b = temp[i];
- temp[i] = (byte)((b >> shift) | (carry << (8 - shift)));
- carry = b;
- }
- }
-
- return temp;
- }
-
- internal static bool IsTooLarge(byte[] bytes, int maxBytes)
- {
- return bytes != null && bytes.Length > maxBytes;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/drbg/HMacSP800Drbg.cs b/BCCrypto/src/crypto/prng/drbg/HMacSP800Drbg.cs
deleted file mode 100644
index 7833170..0000000
--- a/BCCrypto/src/crypto/prng/drbg/HMacSP800Drbg.cs
+++ /dev/null
@@ -1,186 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Prng.Drbg
-{
- /**
- * A SP800-90A HMAC DRBG.
- */
- public class HMacSP800Drbg
- : ISP80090Drbg
- {
- private readonly static long RESEED_MAX = 1L << (48 - 1);
- private readonly static int MAX_BITS_REQUEST = 1 << (19 - 1);
-
- private readonly byte[] mK;
- private readonly byte[] mV;
- private readonly IEntropySource mEntropySource;
- private readonly IMac mHMac;
- private readonly int mSecurityStrength;
-
- private long mReseedCounter;
-
- /**
- * Construct a SP800-90A Hash DRBG.
- *
- * Minimum entropy requirement is the security strength requested.
- *
- * @param hMac Hash MAC to base the DRBG on.
- * @param securityStrength security strength required (in bits)
- * @param entropySource source of entropy to use for seeding/reseeding.
- * @param personalizationString personalization string to distinguish this DRBG (may be null).
- * @param nonce nonce to further distinguish this DRBG (may be null).
- */
- public HMacSP800Drbg(IMac hMac, int securityStrength, IEntropySource entropySource, byte[] personalizationString, byte[] nonce)
- {
- if (securityStrength > DrbgUtilities.GetMaxSecurityStrength(hMac))
- throw new ArgumentException("Requested security strength is not supported by the derivation function");
- if (entropySource.EntropySize < securityStrength)
- throw new ArgumentException("Not enough entropy for security strength required");
-
- mHMac = hMac;
- mSecurityStrength = securityStrength;
- mEntropySource = entropySource;
-
- byte[] entropy = GetEntropy();
- byte[] seedMaterial = Arrays.ConcatenateAll(entropy, nonce, personalizationString);
-
- mK = new byte[hMac.GetMacSize()];
- mV = new byte[mK.Length];
- Arrays.Fill(mV, (byte)1);
-
- hmac_DRBG_Update(seedMaterial);
-
- mReseedCounter = 1;
- }
-
- private void hmac_DRBG_Update(byte[] seedMaterial)
- {
- hmac_DRBG_Update_Func(seedMaterial, (byte)0x00);
- if (seedMaterial != null)
- {
- hmac_DRBG_Update_Func(seedMaterial, (byte)0x01);
- }
- }
-
- private void hmac_DRBG_Update_Func(byte[] seedMaterial, byte vValue)
- {
- mHMac.Init(new KeyParameter(mK));
-
- mHMac.BlockUpdate(mV, 0, mV.Length);
- mHMac.Update(vValue);
-
- if (seedMaterial != null)
- {
- mHMac.BlockUpdate(seedMaterial, 0, seedMaterial.Length);
- }
-
- mHMac.DoFinal(mK, 0);
-
- mHMac.Init(new KeyParameter(mK));
- mHMac.BlockUpdate(mV, 0, mV.Length);
-
- mHMac.DoFinal(mV, 0);
- }
-
- /**
- * Return the block size (in bits) of the DRBG.
- *
- * @return the number of bits produced on each round of the DRBG.
- */
- public int BlockSize
- {
- get { return mV.Length * 8; }
- }
-
- /**
- * Populate a passed in array with random data.
- *
- * @param output output array for generated bits.
- * @param additionalInput additional input to be added to the DRBG in this step.
- * @param predictionResistant true if a reseed should be forced, false otherwise.
- *
- * @return number of bits generated, -1 if a reseed required.
- */
- public int Generate(byte[] output, byte[] additionalInput, bool predictionResistant)
- {
- int numberOfBits = output.Length * 8;
-
- if (numberOfBits > MAX_BITS_REQUEST)
- throw new ArgumentException("Number of bits per request limited to " + MAX_BITS_REQUEST, "output");
-
- if (mReseedCounter > RESEED_MAX)
- {
- return -1;
- }
-
- if (predictionResistant)
- {
- Reseed(additionalInput);
- additionalInput = null;
- }
-
- // 2.
- if (additionalInput != null)
- {
- hmac_DRBG_Update(additionalInput);
- }
-
- // 3.
- byte[] rv = new byte[output.Length];
-
- int m = output.Length / mV.Length;
-
- mHMac.Init(new KeyParameter(mK));
-
- for (int i = 0; i < m; i++)
- {
- mHMac.BlockUpdate(mV, 0, mV.Length);
- mHMac.DoFinal(mV, 0);
-
- Array.Copy(mV, 0, rv, i * mV.Length, mV.Length);
- }
-
- if (m * mV.Length < rv.Length)
- {
- mHMac.BlockUpdate(mV, 0, mV.Length);
- mHMac.DoFinal(mV, 0);
-
- Array.Copy(mV, 0, rv, m * mV.Length, rv.Length - (m * mV.Length));
- }
-
- hmac_DRBG_Update(additionalInput);
-
- mReseedCounter++;
-
- Array.Copy(rv, 0, output, 0, output.Length);
-
- return numberOfBits;
- }
-
- /**
- * Reseed the DRBG.
- *
- * @param additionalInput additional input to be added to the DRBG in this step.
- */
- public void Reseed(byte[] additionalInput)
- {
- byte[] entropy = GetEntropy();
- byte[] seedMaterial = Arrays.Concatenate(entropy, additionalInput);
-
- hmac_DRBG_Update(seedMaterial);
-
- mReseedCounter = 1;
- }
-
- private byte[] GetEntropy()
- {
- byte[] entropy = mEntropySource.GetEntropy();
- if (entropy.Length < (mSecurityStrength + 7) / 8)
- throw new InvalidOperationException("Insufficient entropy provided by entropy source");
- return entropy;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/drbg/HashSP800Drbg.cs b/BCCrypto/src/crypto/prng/drbg/HashSP800Drbg.cs
deleted file mode 100644
index 493da5a..0000000
--- a/BCCrypto/src/crypto/prng/drbg/HashSP800Drbg.cs
+++ /dev/null
@@ -1,287 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Prng.Drbg
-{
- /**
- * A SP800-90A Hash DRBG.
- */
- public class HashSP800Drbg
- : ISP80090Drbg
- {
- private readonly static byte[] ONE = { 0x01 };
-
- private readonly static long RESEED_MAX = 1L << (48 - 1);
- private readonly static int MAX_BITS_REQUEST = 1 << (19 - 1);
-
- private static readonly IDictionary seedlens = Platform.CreateHashtable();
-
- static HashSP800Drbg()
- {
- seedlens.Add("SHA-1", 440);
- seedlens.Add("SHA-224", 440);
- seedlens.Add("SHA-256", 440);
- seedlens.Add("SHA-512/256", 440);
- seedlens.Add("SHA-512/224", 440);
- seedlens.Add("SHA-384", 888);
- seedlens.Add("SHA-512", 888);
- }
-
- private readonly IDigest mDigest;
- private readonly IEntropySource mEntropySource;
- private readonly int mSecurityStrength;
- private readonly int mSeedLength;
-
- private byte[] mV;
- private byte[] mC;
- private long mReseedCounter;
-
- /**
- * Construct a SP800-90A Hash DRBG.
- *
- * Minimum entropy requirement is the security strength requested.
- *
- * @param digest source digest to use for DRB stream.
- * @param securityStrength security strength required (in bits)
- * @param entropySource source of entropy to use for seeding/reseeding.
- * @param personalizationString personalization string to distinguish this DRBG (may be null).
- * @param nonce nonce to further distinguish this DRBG (may be null).
- */
- public HashSP800Drbg(IDigest digest, int securityStrength, IEntropySource entropySource, byte[] personalizationString, byte[] nonce)
- {
- if (securityStrength > DrbgUtilities.GetMaxSecurityStrength(digest))
- throw new ArgumentException("Requested security strength is not supported by the derivation function");
- if (entropySource.EntropySize < securityStrength)
- throw new ArgumentException("Not enough entropy for security strength required");
-
- mDigest = digest;
- mEntropySource = entropySource;
- mSecurityStrength = securityStrength;
- mSeedLength = (int)seedlens[digest.AlgorithmName];
-
- // 1. seed_material = entropy_input || nonce || personalization_string.
- // 2. seed = Hash_df (seed_material, seedlen).
- // 3. V = seed.
- // 4. C = Hash_df ((0x00 || V), seedlen). Comment: Preceed V with a byte
- // of zeros.
- // 5. reseed_counter = 1.
- // 6. Return V, C, and reseed_counter as the initial_working_state
-
- byte[] entropy = GetEntropy();
- byte[] seedMaterial = Arrays.ConcatenateAll(entropy, nonce, personalizationString);
- byte[] seed = DrbgUtilities.HashDF(mDigest, seedMaterial, mSeedLength);
-
- mV = seed;
- byte[] subV = new byte[mV.Length + 1];
- Array.Copy(mV, 0, subV, 1, mV.Length);
- mC = DrbgUtilities.HashDF(mDigest, subV, mSeedLength);
-
- mReseedCounter = 1;
- }
-
- /**
- * Return the block size (in bits) of the DRBG.
- *
- * @return the number of bits produced on each internal round of the DRBG.
- */
- public int BlockSize
- {
- get { return mDigest.GetDigestSize () * 8; }
- }
-
- /**
- * Populate a passed in array with random data.
- *
- * @param output output array for generated bits.
- * @param additionalInput additional input to be added to the DRBG in this step.
- * @param predictionResistant true if a reseed should be forced, false otherwise.
- *
- * @return number of bits generated, -1 if a reseed required.
- */
- public int Generate(byte[] output, byte[] additionalInput, bool predictionResistant)
- {
- // 1. If reseed_counter > reseed_interval, then return an indication that a
- // reseed is required.
- // 2. If (additional_input != Null), then do
- // 2.1 w = Hash (0x02 || V || additional_input).
- // 2.2 V = (V + w) mod 2^seedlen
- // .
- // 3. (returned_bits) = Hashgen (requested_number_of_bits, V).
- // 4. H = Hash (0x03 || V).
- // 5. V = (V + H + C + reseed_counter) mod 2^seedlen
- // .
- // 6. reseed_counter = reseed_counter + 1.
- // 7. Return SUCCESS, returned_bits, and the new values of V, C, and
- // reseed_counter for the new_working_state.
- int numberOfBits = output.Length * 8;
-
- if (numberOfBits > MAX_BITS_REQUEST)
- throw new ArgumentException("Number of bits per request limited to " + MAX_BITS_REQUEST, "output");
-
- if (mReseedCounter > RESEED_MAX)
- return -1;
-
- if (predictionResistant)
- {
- Reseed(additionalInput);
- additionalInput = null;
- }
-
- // 2.
- if (additionalInput != null)
- {
- byte[] newInput = new byte[1 + mV.Length + additionalInput.Length];
- newInput[0] = 0x02;
- Array.Copy(mV, 0, newInput, 1, mV.Length);
- // TODO: inOff / inLength
- Array.Copy(additionalInput, 0, newInput, 1 + mV.Length, additionalInput.Length);
- byte[] w = Hash(newInput);
-
- AddTo(mV, w);
- }
-
- // 3.
- byte[] rv = hashgen(mV, numberOfBits);
-
- // 4.
- byte[] subH = new byte[mV.Length + 1];
- Array.Copy(mV, 0, subH, 1, mV.Length);
- subH[0] = 0x03;
-
- byte[] H = Hash(subH);
-
- // 5.
- AddTo(mV, H);
- AddTo(mV, mC);
- byte[] c = new byte[4];
- c[0] = (byte)(mReseedCounter >> 24);
- c[1] = (byte)(mReseedCounter >> 16);
- c[2] = (byte)(mReseedCounter >> 8);
- c[3] = (byte)mReseedCounter;
-
- AddTo(mV, c);
-
- mReseedCounter++;
-
- Array.Copy(rv, 0, output, 0, output.Length);
-
- return numberOfBits;
- }
-
- private byte[] GetEntropy()
- {
- byte[] entropy = mEntropySource.GetEntropy();
- if (entropy.Length < (mSecurityStrength + 7) / 8)
- throw new InvalidOperationException("Insufficient entropy provided by entropy source");
- return entropy;
- }
-
- // this will always add the shorter length byte array mathematically to the
- // longer length byte array.
- // be careful....
- private void AddTo(byte[] longer, byte[] shorter)
- {
- int off = longer.Length - shorter.Length;
-
- uint carry = 0;
- int i = shorter.Length;
- while (--i >= 0)
- {
- carry += (uint)longer[off + i] + (uint)shorter[i];
- longer[off + i] = (byte)carry;
- carry >>= 8;
- }
-
- i = off;
- while (--i >= 0)
- {
- carry += longer[i];
- longer[i] = (byte)carry;
- carry >>= 8;
- }
- }
-
- /**
- * Reseed the DRBG.
- *
- * @param additionalInput additional input to be added to the DRBG in this step.
- */
- public void Reseed(byte[] additionalInput)
- {
- // 1. seed_material = 0x01 || V || entropy_input || additional_input.
- //
- // 2. seed = Hash_df (seed_material, seedlen).
- //
- // 3. V = seed.
- //
- // 4. C = Hash_df ((0x00 || V), seedlen).
- //
- // 5. reseed_counter = 1.
- //
- // 6. Return V, C, and reseed_counter for the new_working_state.
- //
- // Comment: Precede with a byte of all zeros.
- byte[] entropy = GetEntropy();
- byte[] seedMaterial = Arrays.ConcatenateAll(ONE, mV, entropy, additionalInput);
- byte[] seed = DrbgUtilities.HashDF(mDigest, seedMaterial, mSeedLength);
-
- mV = seed;
- byte[] subV = new byte[mV.Length + 1];
- subV[0] = 0x00;
- Array.Copy(mV, 0, subV, 1, mV.Length);
- mC = DrbgUtilities.HashDF(mDigest, subV, mSeedLength);
-
- mReseedCounter = 1;
- }
-
- private byte[] Hash(byte[] input)
- {
- byte[] hash = new byte[mDigest.GetDigestSize()];
- DoHash(input, hash);
- return hash;
- }
-
- private void DoHash(byte[] input, byte[] output)
- {
- mDigest.BlockUpdate(input, 0, input.Length);
- mDigest.DoFinal(output, 0);
- }
-
- // 1. m = [requested_number_of_bits / outlen]
- // 2. data = V.
- // 3. W = the Null string.
- // 4. For i = 1 to m
- // 4.1 wi = Hash (data).
- // 4.2 W = W || wi.
- // 4.3 data = (data + 1) mod 2^seedlen
- // .
- // 5. returned_bits = Leftmost (requested_no_of_bits) bits of W.
- private byte[] hashgen(byte[] input, int lengthInBits)
- {
- int digestSize = mDigest.GetDigestSize();
- int m = (lengthInBits / 8) / digestSize;
-
- byte[] data = new byte[input.Length];
- Array.Copy(input, 0, data, 0, input.Length);
-
- byte[] W = new byte[lengthInBits / 8];
-
- byte[] dig = new byte[mDigest.GetDigestSize()];
- for (int i = 0; i <= m; i++)
- {
- DoHash(data, dig);
-
- int bytesToCopy = ((W.Length - i * dig.Length) > dig.Length)
- ? dig.Length
- : (W.Length - i * dig.Length);
- Array.Copy(dig, 0, W, i * dig.Length, bytesToCopy);
-
- AddTo(data, ONE);
- }
-
- return W;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/prng/drbg/ISP80090Drbg.cs b/BCCrypto/src/crypto/prng/drbg/ISP80090Drbg.cs
deleted file mode 100644
index 0e39820..0000000
--- a/BCCrypto/src/crypto/prng/drbg/ISP80090Drbg.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Prng.Drbg
-{
- /**
- * Interface to SP800-90A deterministic random bit generators.
- */
- public interface ISP80090Drbg
- {
- /**
- * Return the block size of the DRBG.
- *
- * @return the block size (in bits) produced by each round of the DRBG.
- */
- int BlockSize { get; }
-
- /**
- * Populate a passed in array with random data.
- *
- * @param output output array for generated bits.
- * @param additionalInput additional input to be added to the DRBG in this step.
- * @param predictionResistant true if a reseed should be forced, false otherwise.
- *
- * @return number of bits generated, -1 if a reseed required.
- */
- int Generate(byte[] output, byte[] additionalInput, bool predictionResistant);
-
- /**
- * Reseed the DRBG.
- *
- * @param additionalInput additional input to be added to the DRBG in this step.
- */
- void Reseed(byte[] additionalInput);
- }
-}
diff --git a/BCCrypto/src/crypto/signers/DsaDigestSigner.cs b/BCCrypto/src/crypto/signers/DsaDigestSigner.cs
deleted file mode 100644
index 0866014..0000000
--- a/BCCrypto/src/crypto/signers/DsaDigestSigner.cs
+++ /dev/null
@@ -1,145 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Crypto.Signers;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- public class DsaDigestSigner
- : ISigner
- {
- private readonly IDigest digest;
- private readonly IDsa dsaSigner;
- private bool forSigning;
-
- public DsaDigestSigner(
- IDsa signer,
- IDigest digest)
- {
- this.digest = digest;
- this.dsaSigner = signer;
- }
-
- public virtual string AlgorithmName
- {
- get { return digest.AlgorithmName + "with" + dsaSigner.AlgorithmName; }
- }
-
- public virtual void Init(
- bool forSigning,
- ICipherParameters parameters)
- {
- this.forSigning = forSigning;
-
- AsymmetricKeyParameter k;
-
- if (parameters is ParametersWithRandom)
- {
- k = (AsymmetricKeyParameter)((ParametersWithRandom)parameters).Parameters;
- }
- else
- {
- k = (AsymmetricKeyParameter)parameters;
- }
-
- if (forSigning && !k.IsPrivate)
- throw new InvalidKeyException("Signing Requires Private Key.");
-
- if (!forSigning && k.IsPrivate)
- throw new InvalidKeyException("Verification Requires Public Key.");
-
- Reset();
-
- dsaSigner.Init(forSigning, parameters);
- }
-
- /**
- * update the internal digest with the byte b
- */
- public virtual void Update(
- byte input)
- {
- digest.Update(input);
- }
-
- /**
- * update the internal digest with the byte array in
- */
- public virtual void BlockUpdate(
- byte[] input,
- int inOff,
- int length)
- {
- digest.BlockUpdate(input, inOff, length);
- }
-
- /**
- * Generate a signature for the message we've been loaded with using
- * the key we were initialised with.
- */
- public virtual byte[] GenerateSignature()
- {
- if (!forSigning)
- throw new InvalidOperationException("DSADigestSigner not initialised for signature generation.");
-
- byte[] hash = new byte[digest.GetDigestSize()];
- digest.DoFinal(hash, 0);
-
- BigInteger[] sig = dsaSigner.GenerateSignature(hash);
-
- return DerEncode(sig[0], sig[1]);
- }
-
- /// true if the internal state represents the signature described in the passed in array.
- public virtual bool VerifySignature(
- byte[] signature)
- {
- if (forSigning)
- throw new InvalidOperationException("DSADigestSigner not initialised for verification");
-
- byte[] hash = new byte[digest.GetDigestSize()];
- digest.DoFinal(hash, 0);
-
- try
- {
- BigInteger[] sig = DerDecode(signature);
- return dsaSigner.VerifySignature(hash, sig[0], sig[1]);
- }
- catch (IOException)
- {
- return false;
- }
- }
-
- /// Reset the internal state
- public virtual void Reset()
- {
- digest.Reset();
- }
-
- private byte[] DerEncode(
- BigInteger r,
- BigInteger s)
- {
- return new DerSequence(new DerInteger(r), new DerInteger(s)).GetDerEncoded();
- }
-
- private BigInteger[] DerDecode(
- byte[] encoding)
- {
- Asn1Sequence s = (Asn1Sequence) Asn1Object.FromByteArray(encoding);
-
- return new BigInteger[]
- {
- ((DerInteger) s[0]).Value,
- ((DerInteger) s[1]).Value
- };
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/DsaSigner.cs b/BCCrypto/src/crypto/signers/DsaSigner.cs
deleted file mode 100644
index bb28add..0000000
--- a/BCCrypto/src/crypto/signers/DsaSigner.cs
+++ /dev/null
@@ -1,156 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- /**
- * The Digital Signature Algorithm - as described in "Handbook of Applied
- * Cryptography", pages 452 - 453.
- */
- public class DsaSigner
- : IDsa
- {
- protected readonly IDsaKCalculator kCalculator;
-
- protected DsaKeyParameters key = null;
- protected SecureRandom random = null;
-
- /**
- * Default configuration, random K values.
- */
- public DsaSigner()
- {
- this.kCalculator = new RandomDsaKCalculator();
- }
-
- /**
- * Configuration with an alternate, possibly deterministic calculator of K.
- *
- * @param kCalculator a K value calculator.
- */
- public DsaSigner(IDsaKCalculator kCalculator)
- {
- this.kCalculator = kCalculator;
- }
-
- public virtual string AlgorithmName
- {
- get { return "DSA"; }
- }
-
- public virtual void Init(bool forSigning, ICipherParameters parameters)
- {
- SecureRandom providedRandom = null;
-
- if (forSigning)
- {
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom)parameters;
-
- providedRandom = rParam.Random;
- parameters = rParam.Parameters;
- }
-
- if (!(parameters is DsaPrivateKeyParameters))
- throw new InvalidKeyException("DSA private key required for signing");
-
- this.key = (DsaPrivateKeyParameters)parameters;
- }
- else
- {
- if (!(parameters is DsaPublicKeyParameters))
- throw new InvalidKeyException("DSA public key required for verification");
-
- this.key = (DsaPublicKeyParameters)parameters;
- }
-
- this.random = InitSecureRandom(forSigning && !kCalculator.IsDeterministic, providedRandom);
- }
-
- /**
- * Generate a signature for the given message using the key we were
- * initialised with. For conventional DSA the message should be a SHA-1
- * hash of the message of interest.
- *
- * @param message the message that will be verified later.
- */
- public virtual BigInteger[] GenerateSignature(byte[] message)
- {
- DsaParameters parameters = key.Parameters;
- BigInteger q = parameters.Q;
- BigInteger m = CalculateE(q, message);
- BigInteger x = ((DsaPrivateKeyParameters)key).X;
-
- if (kCalculator.IsDeterministic)
- {
- kCalculator.Init(q, x, message);
- }
- else
- {
- kCalculator.Init(q, random);
- }
-
- BigInteger k = kCalculator.NextK();
-
- BigInteger r = parameters.G.ModPow(k, parameters.P).Mod(q);
-
- k = k.ModInverse(q).Multiply(m.Add(x.Multiply(r)));
-
- BigInteger s = k.Mod(q);
-
- return new BigInteger[]{ r, s };
- }
-
- /**
- * return true if the value r and s represent a DSA signature for
- * the passed in message for standard DSA the message should be a
- * SHA-1 hash of the real message to be verified.
- */
- public virtual bool VerifySignature(byte[] message, BigInteger r, BigInteger s)
- {
- DsaParameters parameters = key.Parameters;
- BigInteger q = parameters.Q;
- BigInteger m = CalculateE(q, message);
-
- if (r.SignValue <= 0 || q.CompareTo(r) <= 0)
- {
- return false;
- }
-
- if (s.SignValue <= 0 || q.CompareTo(s) <= 0)
- {
- return false;
- }
-
- BigInteger w = s.ModInverse(q);
-
- BigInteger u1 = m.Multiply(w).Mod(q);
- BigInteger u2 = r.Multiply(w).Mod(q);
-
- BigInteger p = parameters.P;
- u1 = parameters.G.ModPow(u1, p);
- u2 = ((DsaPublicKeyParameters)key).Y.ModPow(u2, p);
-
- BigInteger v = u1.Multiply(u2).Mod(p).Mod(q);
-
- return v.Equals(r);
- }
-
- protected virtual BigInteger CalculateE(BigInteger n, byte[] message)
- {
- int length = System.Math.Min(message.Length, n.BitLength / 8);
-
- return new BigInteger(1, message, 0, length);
- }
-
- protected virtual SecureRandom InitSecureRandom(bool needed, SecureRandom provided)
- {
- return !needed ? null : (provided != null) ? provided : new SecureRandom();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/ECDsaSigner.cs b/BCCrypto/src/crypto/signers/ECDsaSigner.cs
deleted file mode 100644
index 520507b..0000000
--- a/BCCrypto/src/crypto/signers/ECDsaSigner.cs
+++ /dev/null
@@ -1,240 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- /**
- * EC-DSA as described in X9.62
- */
- public class ECDsaSigner
- : IDsa
- {
- private static readonly BigInteger Eight = BigInteger.ValueOf(8);
-
- protected readonly IDsaKCalculator kCalculator;
-
- protected ECKeyParameters key = null;
- protected SecureRandom random = null;
-
- /**
- * Default configuration, random K values.
- */
- public ECDsaSigner()
- {
- this.kCalculator = new RandomDsaKCalculator();
- }
-
- /**
- * Configuration with an alternate, possibly deterministic calculator of K.
- *
- * @param kCalculator a K value calculator.
- */
- public ECDsaSigner(IDsaKCalculator kCalculator)
- {
- this.kCalculator = kCalculator;
- }
-
- public virtual string AlgorithmName
- {
- get { return "ECDSA"; }
- }
-
- public virtual void Init(bool forSigning, ICipherParameters parameters)
- {
- SecureRandom providedRandom = null;
-
- if (forSigning)
- {
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom)parameters;
-
- providedRandom = rParam.Random;
- parameters = rParam.Parameters;
- }
-
- if (!(parameters is ECPrivateKeyParameters))
- throw new InvalidKeyException("EC private key required for signing");
-
- this.key = (ECPrivateKeyParameters)parameters;
- }
- else
- {
- if (!(parameters is ECPublicKeyParameters))
- throw new InvalidKeyException("EC public key required for verification");
-
- this.key = (ECPublicKeyParameters)parameters;
- }
-
- this.random = InitSecureRandom(forSigning && !kCalculator.IsDeterministic, providedRandom);
- }
-
- // 5.3 pg 28
- /**
- * Generate a signature for the given message using the key we were
- * initialised with. For conventional DSA the message should be a SHA-1
- * hash of the message of interest.
- *
- * @param message the message that will be verified later.
- */
- public virtual BigInteger[] GenerateSignature(byte[] message)
- {
- ECDomainParameters ec = key.Parameters;
- BigInteger n = ec.N;
- BigInteger e = CalculateE(n, message);
- BigInteger d = ((ECPrivateKeyParameters)key).D;
-
- if (kCalculator.IsDeterministic)
- {
- kCalculator.Init(n, d, message);
- }
- else
- {
- kCalculator.Init(n, random);
- }
-
- BigInteger r, s;
-
- ECMultiplier basePointMultiplier = CreateBasePointMultiplier();
-
- // 5.3.2
- do // Generate s
- {
- BigInteger k;
- do // Generate r
- {
- k = kCalculator.NextK();
-
- ECPoint p = basePointMultiplier.Multiply(ec.G, k).Normalize();
-
- // 5.3.3
- r = p.AffineXCoord.ToBigInteger().Mod(n);
- }
- while (r.SignValue == 0);
-
- s = k.ModInverse(n).Multiply(e.Add(d.Multiply(r))).Mod(n);
- }
- while (s.SignValue == 0);
-
- return new BigInteger[]{ r, s };
- }
-
- // 5.4 pg 29
- /**
- * return true if the value r and s represent a DSA signature for
- * the passed in message (for standard DSA the message should be
- * a SHA-1 hash of the real message to be verified).
- */
- public virtual bool VerifySignature(byte[] message, BigInteger r, BigInteger s)
- {
- BigInteger n = key.Parameters.N;
-
- // r and s should both in the range [1,n-1]
- if (r.SignValue < 1 || s.SignValue < 1
- || r.CompareTo(n) >= 0 || s.CompareTo(n) >= 0)
- {
- return false;
- }
-
- BigInteger e = CalculateE(n, message);
- BigInteger c = s.ModInverse(n);
-
- BigInteger u1 = e.Multiply(c).Mod(n);
- BigInteger u2 = r.Multiply(c).Mod(n);
-
- ECPoint G = key.Parameters.G;
- ECPoint Q = ((ECPublicKeyParameters) key).Q;
-
- ECPoint point = ECAlgorithms.SumOfTwoMultiplies(G, u1, Q, u2);
-
- if (point.IsInfinity)
- return false;
-
- /*
- * If possible, avoid normalizing the point (to save a modular inversion in the curve field).
- *
- * There are ~cofactor elements of the curve field that reduce (modulo the group order) to 'r'.
- * If the cofactor is known and small, we generate those possible field values and project each
- * of them to the same "denominator" (depending on the particular projective coordinates in use)
- * as the calculated point.X. If any of the projected values matches point.X, then we have:
- * (point.X / Denominator mod p) mod n == r
- * as required, and verification succeeds.
- *
- * Based on an original idea by Gregory Maxwell (https://github.com/gmaxwell), as implemented in
- * the libsecp256k1 project (https://github.com/bitcoin/secp256k1).
- */
- ECCurve curve = point.Curve;
- if (curve != null)
- {
- BigInteger cofactor = curve.Cofactor;
- if (cofactor != null && cofactor.CompareTo(Eight) <= 0)
- {
- ECFieldElement D = GetDenominator(curve.CoordinateSystem, point);
- if (D != null && !D.IsZero)
- {
- ECFieldElement X = point.XCoord;
- while (curve.IsValidFieldElement(r))
- {
- ECFieldElement R = curve.FromBigInteger(r).Multiply(D);
- if (R.Equals(X))
- {
- return true;
- }
- r = r.Add(n);
- }
- return false;
- }
- }
- }
-
- BigInteger v = point.Normalize().AffineXCoord.ToBigInteger().Mod(n);
- return v.Equals(r);
- }
-
- protected virtual BigInteger CalculateE(BigInteger n, byte[] message)
- {
- int messageBitLength = message.Length * 8;
- BigInteger trunc = new BigInteger(1, message);
-
- if (n.BitLength < messageBitLength)
- {
- trunc = trunc.ShiftRight(messageBitLength - n.BitLength);
- }
-
- return trunc;
- }
-
- protected virtual ECMultiplier CreateBasePointMultiplier()
- {
- return new FixedPointCombMultiplier();
- }
-
- protected virtual ECFieldElement GetDenominator(int coordinateSystem, ECPoint p)
- {
- switch (coordinateSystem)
- {
- case ECCurve.COORD_HOMOGENEOUS:
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- case ECCurve.COORD_SKEWED:
- return p.GetZCoord(0);
- case ECCurve.COORD_JACOBIAN:
- case ECCurve.COORD_JACOBIAN_CHUDNOVSKY:
- case ECCurve.COORD_JACOBIAN_MODIFIED:
- return p.GetZCoord(0).Square();
- default:
- return null;
- }
- }
-
- protected virtual SecureRandom InitSecureRandom(bool needed, SecureRandom provided)
- {
- return !needed ? null : (provided != null) ? provided : new SecureRandom();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/ECGOST3410Signer.cs b/BCCrypto/src/crypto/signers/ECGOST3410Signer.cs
deleted file mode 100644
index 28ab79c..0000000
--- a/BCCrypto/src/crypto/signers/ECGOST3410Signer.cs
+++ /dev/null
@@ -1,162 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- /**
- * GOST R 34.10-2001 Signature Algorithm
- */
- public class ECGost3410Signer
- : IDsa
- {
- private ECKeyParameters key;
- private SecureRandom random;
-
- public virtual string AlgorithmName
- {
- get { return "ECGOST3410"; }
- }
-
- public virtual void Init(
- bool forSigning,
- ICipherParameters parameters)
- {
- if (forSigning)
- {
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom)parameters;
-
- this.random = rParam.Random;
- parameters = rParam.Parameters;
- }
- else
- {
- this.random = new SecureRandom();
- }
-
- if (!(parameters is ECPrivateKeyParameters))
- throw new InvalidKeyException("EC private key required for signing");
-
- this.key = (ECPrivateKeyParameters) parameters;
- }
- else
- {
- if (!(parameters is ECPublicKeyParameters))
- throw new InvalidKeyException("EC public key required for verification");
-
- this.key = (ECPublicKeyParameters)parameters;
- }
- }
-
- /**
- * generate a signature for the given message using the key we were
- * initialised with. For conventional GOST3410 the message should be a GOST3411
- * hash of the message of interest.
- *
- * @param message the message that will be verified later.
- */
- public virtual BigInteger[] GenerateSignature(
- byte[] message)
- {
- byte[] mRev = new byte[message.Length]; // conversion is little-endian
- for (int i = 0; i != mRev.Length; i++)
- {
- mRev[i] = message[mRev.Length - 1 - i];
- }
-
- BigInteger e = new BigInteger(1, mRev);
-
- ECDomainParameters ec = key.Parameters;
- BigInteger n = ec.N;
- BigInteger d = ((ECPrivateKeyParameters)key).D;
-
- BigInteger r, s = null;
-
- ECMultiplier basePointMultiplier = CreateBasePointMultiplier();
-
- do // generate s
- {
- BigInteger k;
- do // generate r
- {
- do
- {
- k = new BigInteger(n.BitLength, random);
- }
- while (k.SignValue == 0);
-
- ECPoint p = basePointMultiplier.Multiply(ec.G, k).Normalize();
-
- r = p.AffineXCoord.ToBigInteger().Mod(n);
- }
- while (r.SignValue == 0);
-
- s = (k.Multiply(e)).Add(d.Multiply(r)).Mod(n);
- }
- while (s.SignValue == 0);
-
- return new BigInteger[]{ r, s };
- }
-
- /**
- * return true if the value r and s represent a GOST3410 signature for
- * the passed in message (for standard GOST3410 the message should be
- * a GOST3411 hash of the real message to be verified).
- */
- public virtual bool VerifySignature(
- byte[] message,
- BigInteger r,
- BigInteger s)
- {
- byte[] mRev = new byte[message.Length]; // conversion is little-endian
- for (int i = 0; i != mRev.Length; i++)
- {
- mRev[i] = message[mRev.Length - 1 - i];
- }
-
- BigInteger e = new BigInteger(1, mRev);
- BigInteger n = key.Parameters.N;
-
- // r in the range [1,n-1]
- if (r.CompareTo(BigInteger.One) < 0 || r.CompareTo(n) >= 0)
- {
- return false;
- }
-
- // s in the range [1,n-1]
- if (s.CompareTo(BigInteger.One) < 0 || s.CompareTo(n) >= 0)
- {
- return false;
- }
-
- BigInteger v = e.ModInverse(n);
-
- BigInteger z1 = s.Multiply(v).Mod(n);
- BigInteger z2 = (n.Subtract(r)).Multiply(v).Mod(n);
-
- ECPoint G = key.Parameters.G; // P
- ECPoint Q = ((ECPublicKeyParameters)key).Q;
-
- ECPoint point = ECAlgorithms.SumOfTwoMultiplies(G, z1, Q, z2).Normalize();
-
- if (point.IsInfinity)
- return false;
-
- BigInteger R = point.AffineXCoord.ToBigInteger().Mod(n);
-
- return R.Equals(r);
- }
-
- protected virtual ECMultiplier CreateBasePointMultiplier()
- {
- return new FixedPointCombMultiplier();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/ECNRSigner.cs b/BCCrypto/src/crypto/signers/ECNRSigner.cs
deleted file mode 100644
index bb21a49..0000000
--- a/BCCrypto/src/crypto/signers/ECNRSigner.cs
+++ /dev/null
@@ -1,188 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- /**
- * EC-NR as described in IEEE 1363-2000
- */
- public class ECNRSigner
- : IDsa
- {
- private bool forSigning;
- private ECKeyParameters key;
- private SecureRandom random;
-
- public virtual string AlgorithmName
- {
- get { return "ECNR"; }
- }
-
- public virtual void Init(
- bool forSigning,
- ICipherParameters parameters)
- {
- this.forSigning = forSigning;
-
- if (forSigning)
- {
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom) parameters;
-
- this.random = rParam.Random;
- parameters = rParam.Parameters;
- }
- else
- {
- this.random = new SecureRandom();
- }
-
- if (!(parameters is ECPrivateKeyParameters))
- throw new InvalidKeyException("EC private key required for signing");
-
- this.key = (ECPrivateKeyParameters) parameters;
- }
- else
- {
- if (!(parameters is ECPublicKeyParameters))
- throw new InvalidKeyException("EC public key required for verification");
-
- this.key = (ECPublicKeyParameters) parameters;
- }
- }
-
- // Section 7.2.5 ECSP-NR, pg 34
- /**
- * generate a signature for the given message using the key we were
- * initialised with. Generally, the order of the curve should be at
- * least as long as the hash of the message of interest, and with
- * ECNR it *must* be at least as long.
- *
- * @param digest the digest to be signed.
- * @exception DataLengthException if the digest is longer than the key allows
- */
- public virtual BigInteger[] GenerateSignature(
- byte[] message)
- {
- if (!this.forSigning)
- {
- // not properly initilaized... deal with it
- throw new InvalidOperationException("not initialised for signing");
- }
-
- BigInteger n = ((ECPrivateKeyParameters) this.key).Parameters.N;
- int nBitLength = n.BitLength;
-
- BigInteger e = new BigInteger(1, message);
- int eBitLength = e.BitLength;
-
- ECPrivateKeyParameters privKey = (ECPrivateKeyParameters)key;
-
- if (eBitLength > nBitLength)
- {
- throw new DataLengthException("input too large for ECNR key.");
- }
-
- BigInteger r = null;
- BigInteger s = null;
-
- AsymmetricCipherKeyPair tempPair;
- do // generate r
- {
- // generate another, but very temporary, key pair using
- // the same EC parameters
- ECKeyPairGenerator keyGen = new ECKeyPairGenerator();
-
- keyGen.Init(new ECKeyGenerationParameters(privKey.Parameters, this.random));
-
- tempPair = keyGen.GenerateKeyPair();
-
- // BigInteger Vx = tempPair.getPublic().getW().getAffineX();
- ECPublicKeyParameters V = (ECPublicKeyParameters) tempPair.Public; // get temp's public key
- BigInteger Vx = V.Q.AffineXCoord.ToBigInteger(); // get the point's x coordinate
-
- r = Vx.Add(e).Mod(n);
- }
- while (r.SignValue == 0);
-
- // generate s
- BigInteger x = privKey.D; // private key value
- BigInteger u = ((ECPrivateKeyParameters) tempPair.Private).D; // temp's private key value
- s = u.Subtract(r.Multiply(x)).Mod(n);
-
- return new BigInteger[]{ r, s };
- }
-
- // Section 7.2.6 ECVP-NR, pg 35
- /**
- * return true if the value r and s represent a signature for the
- * message passed in. Generally, the order of the curve should be at
- * least as long as the hash of the message of interest, and with
- * ECNR, it *must* be at least as long. But just in case the signer
- * applied mod(n) to the longer digest, this implementation will
- * apply mod(n) during verification.
- *
- * @param digest the digest to be verified.
- * @param r the r value of the signature.
- * @param s the s value of the signature.
- * @exception DataLengthException if the digest is longer than the key allows
- */
- public virtual bool VerifySignature(
- byte[] message,
- BigInteger r,
- BigInteger s)
- {
- if (this.forSigning)
- {
- // not properly initilaized... deal with it
- throw new InvalidOperationException("not initialised for verifying");
- }
-
- ECPublicKeyParameters pubKey = (ECPublicKeyParameters)key;
- BigInteger n = pubKey.Parameters.N;
- int nBitLength = n.BitLength;
-
- BigInteger e = new BigInteger(1, message);
- int eBitLength = e.BitLength;
-
- if (eBitLength > nBitLength)
- {
- throw new DataLengthException("input too large for ECNR key.");
- }
-
- // r in the range [1,n-1]
- if (r.CompareTo(BigInteger.One) < 0 || r.CompareTo(n) >= 0)
- {
- return false;
- }
-
- // s in the range [0,n-1] NB: ECNR spec says 0
- if (s.CompareTo(BigInteger.Zero) < 0 || s.CompareTo(n) >= 0)
- {
- return false;
- }
-
- // compute P = sG + rW
-
- ECPoint G = pubKey.Parameters.G;
- ECPoint W = pubKey.Q;
- // calculate P using Bouncy math
- ECPoint P = ECAlgorithms.SumOfTwoMultiplies(G, s, W, r).Normalize();
-
- if (P.IsInfinity)
- return false;
-
- BigInteger x = P.AffineXCoord.ToBigInteger();
- BigInteger t = r.Subtract(x).Mod(n);
-
- return t.Equals(e);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/GOST3410DigestSigner.cs b/BCCrypto/src/crypto/signers/GOST3410DigestSigner.cs
deleted file mode 100644
index bc32808..0000000
--- a/BCCrypto/src/crypto/signers/GOST3410DigestSigner.cs
+++ /dev/null
@@ -1,145 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Crypto.Signers;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- public class Gost3410DigestSigner
- : ISigner
- {
- private readonly IDigest digest;
- private readonly IDsa dsaSigner;
- private bool forSigning;
-
- public Gost3410DigestSigner(
- IDsa signer,
- IDigest digest)
- {
- this.dsaSigner = signer;
- this.digest = digest;
- }
-
- public virtual string AlgorithmName
- {
- get { return digest.AlgorithmName + "with" + dsaSigner.AlgorithmName; }
- }
-
- public virtual void Init(
- bool forSigning,
- ICipherParameters parameters)
- {
- this.forSigning = forSigning;
-
- AsymmetricKeyParameter k;
- if (parameters is ParametersWithRandom)
- {
- k = (AsymmetricKeyParameter)((ParametersWithRandom)parameters).Parameters;
- }
- else
- {
- k = (AsymmetricKeyParameter)parameters;
- }
-
- if (forSigning && !k.IsPrivate)
- {
- throw new InvalidKeyException("Signing Requires Private Key.");
- }
-
- if (!forSigning && k.IsPrivate)
- {
- throw new InvalidKeyException("Verification Requires Public Key.");
- }
-
- Reset();
-
- dsaSigner.Init(forSigning, parameters);
- }
-
- /**
- * update the internal digest with the byte b
- */
- public virtual void Update(
- byte input)
- {
- digest.Update(input);
- }
-
- /**
- * update the internal digest with the byte array in
- */
- public virtual void BlockUpdate(
- byte[] input,
- int inOff,
- int length)
- {
- digest.BlockUpdate(input, inOff, length);
- }
-
- /**
- * Generate a signature for the message we've been loaded with using
- * the key we were initialised with.
- */
- public virtual byte[] GenerateSignature()
- {
- if (!forSigning)
- throw new InvalidOperationException("GOST3410DigestSigner not initialised for signature generation.");
-
- byte[] hash = new byte[digest.GetDigestSize()];
- digest.DoFinal(hash, 0);
-
- try
- {
- BigInteger[] sig = dsaSigner.GenerateSignature(hash);
- byte[] sigBytes = new byte[64];
-
- // TODO Add methods to allow writing BigInteger to existing byte array?
- byte[] r = sig[0].ToByteArrayUnsigned();
- byte[] s = sig[1].ToByteArrayUnsigned();
- s.CopyTo(sigBytes, 32 - s.Length);
- r.CopyTo(sigBytes, 64 - r.Length);
- return sigBytes;
- }
- catch (Exception e)
- {
- throw new SignatureException(e.Message, e);
- }
- }
-
- /// true if the internal state represents the signature described in the passed in array.
- public virtual bool VerifySignature(
- byte[] signature)
- {
- if (forSigning)
- throw new InvalidOperationException("DSADigestSigner not initialised for verification");
-
- byte[] hash = new byte[digest.GetDigestSize()];
- digest.DoFinal(hash, 0);
-
- BigInteger R, S;
- try
- {
- R = new BigInteger(1, signature, 32, 32);
- S = new BigInteger(1, signature, 0, 32);
- }
- catch (Exception e)
- {
- throw new SignatureException("error decoding signature bytes.", e);
- }
-
- return dsaSigner.VerifySignature(hash, R, S);
- }
-
- /// Reset the internal state
- public virtual void Reset()
- {
- digest.Reset();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/GOST3410Signer.cs b/BCCrypto/src/crypto/signers/GOST3410Signer.cs
deleted file mode 100644
index f1832ae..0000000
--- a/BCCrypto/src/crypto/signers/GOST3410Signer.cs
+++ /dev/null
@@ -1,132 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- /**
- * Gost R 34.10-94 Signature Algorithm
- */
- public class Gost3410Signer
- : IDsa
- {
- private Gost3410KeyParameters key;
- private SecureRandom random;
-
- public virtual string AlgorithmName
- {
- get { return "GOST3410"; }
- }
-
- public virtual void Init(
- bool forSigning,
- ICipherParameters parameters)
- {
- if (forSigning)
- {
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom rParam = (ParametersWithRandom)parameters;
-
- this.random = rParam.Random;
- parameters = rParam.Parameters;
- }
- else
- {
- this.random = new SecureRandom();
- }
-
- if (!(parameters is Gost3410PrivateKeyParameters))
- throw new InvalidKeyException("GOST3410 private key required for signing");
-
- this.key = (Gost3410PrivateKeyParameters) parameters;
- }
- else
- {
- if (!(parameters is Gost3410PublicKeyParameters))
- throw new InvalidKeyException("GOST3410 public key required for signing");
-
- this.key = (Gost3410PublicKeyParameters) parameters;
- }
- }
-
- /**
- * generate a signature for the given message using the key we were
- * initialised with. For conventional Gost3410 the message should be a Gost3411
- * hash of the message of interest.
- *
- * @param message the message that will be verified later.
- */
- public virtual BigInteger[] GenerateSignature(
- byte[] message)
- {
- byte[] mRev = new byte[message.Length]; // conversion is little-endian
- for (int i = 0; i != mRev.Length; i++)
- {
- mRev[i] = message[mRev.Length - 1 - i];
- }
-
- BigInteger m = new BigInteger(1, mRev);
- Gost3410Parameters parameters = key.Parameters;
- BigInteger k;
-
- do
- {
- k = new BigInteger(parameters.Q.BitLength, random);
- }
- while (k.CompareTo(parameters.Q) >= 0);
-
- BigInteger r = parameters.A.ModPow(k, parameters.P).Mod(parameters.Q);
-
- BigInteger s = k.Multiply(m).
- Add(((Gost3410PrivateKeyParameters)key).X.Multiply(r)).
- Mod(parameters.Q);
-
- return new BigInteger[]{ r, s };
- }
-
- /**
- * return true if the value r and s represent a Gost3410 signature for
- * the passed in message for standard Gost3410 the message should be a
- * Gost3411 hash of the real message to be verified.
- */
- public virtual bool VerifySignature(
- byte[] message,
- BigInteger r,
- BigInteger s)
- {
- byte[] mRev = new byte[message.Length]; // conversion is little-endian
- for (int i = 0; i != mRev.Length; i++)
- {
- mRev[i] = message[mRev.Length - 1 - i];
- }
-
- BigInteger m = new BigInteger(1, mRev);
- Gost3410Parameters parameters = key.Parameters;
-
- if (r.SignValue < 0 || parameters.Q.CompareTo(r) <= 0)
- {
- return false;
- }
-
- if (s.SignValue < 0 || parameters.Q.CompareTo(s) <= 0)
- {
- return false;
- }
-
- BigInteger v = m.ModPow(parameters.Q.Subtract(BigInteger.Two), parameters.Q);
-
- BigInteger z1 = s.Multiply(v).Mod(parameters.Q);
- BigInteger z2 = (parameters.Q.Subtract(r)).Multiply(v).Mod(parameters.Q);
-
- z1 = parameters.A.ModPow(z1, parameters.P);
- z2 = ((Gost3410PublicKeyParameters)key).Y.ModPow(z2, parameters.P);
-
- BigInteger u = z1.Multiply(z2).Mod(parameters.P).Mod(parameters.Q);
-
- return u.Equals(r);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/GenericSigner.cs b/BCCrypto/src/crypto/signers/GenericSigner.cs
deleted file mode 100644
index a551217..0000000
--- a/BCCrypto/src/crypto/signers/GenericSigner.cs
+++ /dev/null
@@ -1,130 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- public class GenericSigner
- : ISigner
- {
- private readonly IAsymmetricBlockCipher engine;
- private readonly IDigest digest;
- private bool forSigning;
-
- public GenericSigner(
- IAsymmetricBlockCipher engine,
- IDigest digest)
- {
- this.engine = engine;
- this.digest = digest;
- }
-
- public virtual string AlgorithmName
- {
- get { return "Generic(" + engine.AlgorithmName + "/" + digest.AlgorithmName + ")"; }
- }
-
- /**
- * initialise the signer for signing or verification.
- *
- * @param forSigning
- * true if for signing, false otherwise
- * @param parameters
- * necessary parameters.
- */
- public virtual void Init(bool forSigning, ICipherParameters parameters)
- {
- this.forSigning = forSigning;
-
- AsymmetricKeyParameter k;
- if (parameters is ParametersWithRandom)
- {
- k = (AsymmetricKeyParameter)((ParametersWithRandom)parameters).Parameters;
- }
- else
- {
- k = (AsymmetricKeyParameter)parameters;
- }
-
- if (forSigning && !k.IsPrivate)
- throw new InvalidKeyException("Signing requires private key.");
-
- if (!forSigning && k.IsPrivate)
- throw new InvalidKeyException("Verification requires public key.");
-
- Reset();
-
- engine.Init(forSigning, parameters);
- }
-
- /**
- * update the internal digest with the byte b
- */
- public virtual void Update(byte input)
- {
- digest.Update(input);
- }
-
- /**
- * update the internal digest with the byte array in
- */
- public virtual void BlockUpdate(byte[] input, int inOff, int length)
- {
- digest.BlockUpdate(input, inOff, length);
- }
-
- /**
- * Generate a signature for the message we've been loaded with using the key
- * we were initialised with.
- */
- public virtual byte[] GenerateSignature()
- {
- if (!forSigning)
- throw new InvalidOperationException("GenericSigner not initialised for signature generation.");
-
- byte[] hash = new byte[digest.GetDigestSize()];
- digest.DoFinal(hash, 0);
-
- return engine.ProcessBlock(hash, 0, hash.Length);
- }
-
- /**
- * return true if the internal state represents the signature described in
- * the passed in array.
- */
- public virtual bool VerifySignature(byte[] signature)
- {
- if (forSigning)
- throw new InvalidOperationException("GenericSigner not initialised for verification");
-
- byte[] hash = new byte[digest.GetDigestSize()];
- digest.DoFinal(hash, 0);
-
- try
- {
- byte[] sig = engine.ProcessBlock(signature, 0, signature.Length);
-
- // Extend with leading zeroes to match the digest size, if necessary.
- if (sig.Length < hash.Length)
- {
- byte[] tmp = new byte[hash.Length];
- Array.Copy(sig, 0, tmp, tmp.Length - sig.Length, sig.Length);
- sig = tmp;
- }
-
- return Arrays.ConstantTimeAreEqual(sig, hash);
- }
- catch (Exception)
- {
- return false;
- }
- }
-
- public virtual void Reset()
- {
- digest.Reset();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/HMacDsaKCalculator.cs b/BCCrypto/src/crypto/signers/HMacDsaKCalculator.cs
deleted file mode 100644
index 8231197..0000000
--- a/BCCrypto/src/crypto/signers/HMacDsaKCalculator.cs
+++ /dev/null
@@ -1,150 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- /**
- * A deterministic K calculator based on the algorithm in section 3.2 of RFC 6979.
- */
- public class HMacDsaKCalculator
- : IDsaKCalculator
- {
- private readonly HMac hMac;
- private readonly byte[] K;
- private readonly byte[] V;
-
- private BigInteger n;
-
- /**
- * Base constructor.
- *
- * @param digest digest to build the HMAC on.
- */
- public HMacDsaKCalculator(IDigest digest)
- {
- this.hMac = new HMac(digest);
- this.V = new byte[hMac.GetMacSize()];
- this.K = new byte[hMac.GetMacSize()];
- }
-
- public virtual bool IsDeterministic
- {
- get { return true; }
- }
-
- public virtual void Init(BigInteger n, SecureRandom random)
- {
- throw new InvalidOperationException("Operation not supported");
- }
-
- public void Init(BigInteger n, BigInteger d, byte[] message)
- {
- this.n = n;
-
- Arrays.Fill(V, (byte)0x01);
- Arrays.Fill(K, (byte)0);
-
- byte[] x = new byte[(n.BitLength + 7) / 8];
- byte[] dVal = BigIntegers.AsUnsignedByteArray(d);
-
- Array.Copy(dVal, 0, x, x.Length - dVal.Length, dVal.Length);
-
- byte[] m = new byte[(n.BitLength + 7) / 8];
-
- BigInteger mInt = BitsToInt(message);
-
- if (mInt.CompareTo(n) >= 0)
- {
- mInt = mInt.Subtract(n);
- }
-
- byte[] mVal = BigIntegers.AsUnsignedByteArray(mInt);
-
- Array.Copy(mVal, 0, m, m.Length - mVal.Length, mVal.Length);
-
- hMac.Init(new KeyParameter(K));
-
- hMac.BlockUpdate(V, 0, V.Length);
- hMac.Update((byte)0x00);
- hMac.BlockUpdate(x, 0, x.Length);
- hMac.BlockUpdate(m, 0, m.Length);
-
- hMac.DoFinal(K, 0);
-
- hMac.Init(new KeyParameter(K));
-
- hMac.BlockUpdate(V, 0, V.Length);
-
- hMac.DoFinal(V, 0);
-
- hMac.BlockUpdate(V, 0, V.Length);
- hMac.Update((byte)0x01);
- hMac.BlockUpdate(x, 0, x.Length);
- hMac.BlockUpdate(m, 0, m.Length);
-
- hMac.DoFinal(K, 0);
-
- hMac.Init(new KeyParameter(K));
-
- hMac.BlockUpdate(V, 0, V.Length);
-
- hMac.DoFinal(V, 0);
- }
-
- public virtual BigInteger NextK()
- {
- byte[] t = new byte[((n.BitLength + 7) / 8)];
-
- for (;;)
- {
- int tOff = 0;
-
- while (tOff < t.Length)
- {
- hMac.BlockUpdate(V, 0, V.Length);
-
- hMac.DoFinal(V, 0);
-
- int len = System.Math.Min(t.Length - tOff, V.Length);
- Array.Copy(V, 0, t, tOff, len);
- tOff += len;
- }
-
- BigInteger k = BitsToInt(t);
-
- if (k.SignValue > 0 && k.CompareTo(n) < 0)
- {
- return k;
- }
-
- hMac.BlockUpdate(V, 0, V.Length);
- hMac.Update((byte)0x00);
-
- hMac.DoFinal(K, 0);
-
- hMac.Init(new KeyParameter(K));
-
- hMac.BlockUpdate(V, 0, V.Length);
-
- hMac.DoFinal(V, 0);
- }
- }
-
- private BigInteger BitsToInt(byte[] t)
- {
- BigInteger v = new BigInteger(1, t);
-
- if (t.Length * 8 > n.BitLength)
- {
- v = v.ShiftRight(t.Length * 8 - n.BitLength);
- }
-
- return v;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/IDsaKCalculator.cs b/BCCrypto/src/crypto/signers/IDsaKCalculator.cs
deleted file mode 100644
index 645186d..0000000
--- a/BCCrypto/src/crypto/signers/IDsaKCalculator.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- /**
- * Interface define calculators of K values for DSA/ECDSA.
- */
- public interface IDsaKCalculator
- {
- /**
- * Return true if this calculator is deterministic, false otherwise.
- *
- * @return true if deterministic, otherwise false.
- */
- bool IsDeterministic { get; }
-
- /**
- * Non-deterministic initialiser.
- *
- * @param n the order of the DSA group.
- * @param random a source of randomness.
- */
- void Init(BigInteger n, SecureRandom random);
-
- /**
- * Deterministic initialiser.
- *
- * @param n the order of the DSA group.
- * @param d the DSA private value.
- * @param message the message being signed.
- */
- void Init(BigInteger n, BigInteger d, byte[] message);
-
- /**
- * Return the next valid value of K.
- *
- * @return a K value.
- */
- BigInteger NextK();
- }
-}
diff --git a/BCCrypto/src/crypto/signers/Iso9796d2PssSigner.cs b/BCCrypto/src/crypto/signers/Iso9796d2PssSigner.cs
deleted file mode 100644
index 6b80370..0000000
--- a/BCCrypto/src/crypto/signers/Iso9796d2PssSigner.cs
+++ /dev/null
@@ -1,619 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- /// ISO9796-2 - mechanism using a hash function with recovery (scheme 2 and 3).
- ///
- /// Note: the usual length for the salt is the length of the hash
- /// function used in bytes.
- ///
- public class Iso9796d2PssSigner
- : ISignerWithRecovery
- {
- ///
- /// Return a reference to the recoveredMessage message.
- ///
- /// The full/partial recoveredMessage message.
- ///
- public byte[] GetRecoveredMessage()
- {
- return recoveredMessage;
- }
-
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerImplicit = 0xBC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerRipeMD160 = 0x31CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerRipeMD128 = 0x32CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerSha1 = 0x33CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerSha256 = 0x34CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerSha512 = 0x35CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerSha384 = 0x36CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerWhirlpool = 0x37CC;
-
- private IDigest digest;
- private IAsymmetricBlockCipher cipher;
-
- private SecureRandom random;
- private byte[] standardSalt;
-
- private int hLen;
- private int trailer;
- private int keyBits;
- private byte[] block;
- private byte[] mBuf;
- private int messageLength;
- private readonly int saltLength;
- private bool fullMessage;
- private byte[] recoveredMessage;
-
- private byte[] preSig;
- private byte[] preBlock;
- private int preMStart;
- private int preTLength;
-
- ///
- /// Generate a signer with either implicit or explicit trailers for ISO9796-2, scheme 2 or 3.
- ///
- /// base cipher to use for signature creation/verification
- /// digest to use.
- /// length of salt in bytes.
- /// whether or not the trailer is implicit or gives the hash.
- public Iso9796d2PssSigner(
- IAsymmetricBlockCipher cipher,
- IDigest digest,
- int saltLength,
- bool isImplicit)
- {
- this.cipher = cipher;
- this.digest = digest;
- this.hLen = digest.GetDigestSize();
- this.saltLength = saltLength;
-
- if (isImplicit)
- {
- trailer = IsoTrailers.TRAILER_IMPLICIT;
- }
- else if (IsoTrailers.NoTrailerAvailable(digest))
- {
- throw new ArgumentException("no valid trailer", "digest");
- }
- else
- {
- trailer = IsoTrailers.GetTrailer(digest);
- }
- }
-
- /// Constructor for a signer with an explicit digest trailer.
- ///
- ///
- /// cipher to use.
- ///
- /// digest to sign with.
- ///
- /// length of salt in bytes.
- ///
- public Iso9796d2PssSigner(
- IAsymmetricBlockCipher cipher,
- IDigest digest,
- int saltLength)
- : this(cipher, digest, saltLength, false)
- {
- }
-
- public virtual string AlgorithmName
- {
- get { return digest.AlgorithmName + "with" + "ISO9796-2S2"; }
- }
-
- /// Initialise the signer.
- /// true if for signing, false if for verification.
- /// parameters for signature generation/verification. If the
- /// parameters are for generation they should be a ParametersWithRandom,
- /// a ParametersWithSalt, or just an RsaKeyParameters object. If RsaKeyParameters
- /// are passed in a SecureRandom will be created.
- ///
- /// if wrong parameter type or a fixed
- /// salt is passed in which is the wrong length.
- ///
- public virtual void Init(
- bool forSigning,
- ICipherParameters parameters)
- {
- RsaKeyParameters kParam;
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom p = (ParametersWithRandom) parameters;
-
- kParam = (RsaKeyParameters) p.Parameters;
-
- if (forSigning)
- {
- random = p.Random;
- }
- }
- else if (parameters is ParametersWithSalt)
- {
- if (!forSigning)
- throw new ArgumentException("ParametersWithSalt only valid for signing", "parameters");
-
- ParametersWithSalt p = (ParametersWithSalt) parameters;
-
- kParam = (RsaKeyParameters) p.Parameters;
- standardSalt = p.GetSalt();
-
- if (standardSalt.Length != saltLength)
- throw new ArgumentException("Fixed salt is of wrong length");
- }
- else
- {
- kParam = (RsaKeyParameters) parameters;
-
- if (forSigning)
- {
- random = new SecureRandom();
- }
- }
-
- cipher.Init(forSigning, kParam);
-
- keyBits = kParam.Modulus.BitLength;
-
- block = new byte[(keyBits + 7) / 8];
-
- if (trailer == IsoTrailers.TRAILER_IMPLICIT)
- {
- mBuf = new byte[block.Length - digest.GetDigestSize() - saltLength - 1 - 1];
- }
- else
- {
- mBuf = new byte[block.Length - digest.GetDigestSize() - saltLength - 1 - 2];
- }
-
- Reset();
- }
-
- /// compare two byte arrays - constant time.
- private bool IsSameAs(byte[] a, byte[] b)
- {
- if (messageLength != b.Length)
- {
- return false;
- }
-
- bool isOkay = true;
-
- for (int i = 0; i != b.Length; i++)
- {
- if (a[i] != b[i])
- {
- isOkay = false;
- }
- }
-
- return isOkay;
- }
-
- /// clear possible sensitive data
- private void ClearBlock(
- byte[] block)
- {
- Array.Clear(block, 0, block.Length);
- }
-
- public virtual void UpdateWithRecoveredMessage(
- byte[] signature)
- {
- byte[] block = cipher.ProcessBlock(signature, 0, signature.Length);
-
- //
- // adjust block size for leading zeroes if necessary
- //
- if (block.Length < (keyBits + 7) / 8)
- {
- byte[] tmp = new byte[(keyBits + 7) / 8];
-
- Array.Copy(block, 0, tmp, tmp.Length - block.Length, block.Length);
- ClearBlock(block);
- block = tmp;
- }
-
- int tLength;
-
- if (((block[block.Length - 1] & 0xFF) ^ 0xBC) == 0)
- {
- tLength = 1;
- }
- else
- {
- int sigTrail = ((block[block.Length - 2] & 0xFF) << 8) | (block[block.Length - 1] & 0xFF);
-
- if (IsoTrailers.NoTrailerAvailable(digest))
- throw new ArgumentException("unrecognised hash in signature");
-
- if (sigTrail != IsoTrailers.GetTrailer(digest))
- throw new InvalidOperationException("signer initialised with wrong digest for trailer " + sigTrail);
-
- tLength = 2;
- }
-
- //
- // calculate H(m2)
- //
- byte[] m2Hash = new byte[hLen];
- digest.DoFinal(m2Hash, 0);
-
- //
- // remove the mask
- //
- byte[] dbMask = MaskGeneratorFunction1(block, block.Length - hLen - tLength, hLen, block.Length - hLen - tLength);
- for (int i = 0; i != dbMask.Length; i++)
- {
- block[i] ^= dbMask[i];
- }
-
- block[0] &= 0x7f;
-
- //
- // find out how much padding we've got
- //
- int mStart = 0;
-
- while (mStart < block.Length)
- {
- if (block[mStart++] == 0x01)
- break;
- }
-
- if (mStart >= block.Length)
- {
- ClearBlock(block);
- }
-
- fullMessage = (mStart > 1);
-
- recoveredMessage = new byte[dbMask.Length - mStart - saltLength];
-
- Array.Copy(block, mStart, recoveredMessage, 0, recoveredMessage.Length);
- recoveredMessage.CopyTo(mBuf, 0);
-
- preSig = signature;
- preBlock = block;
- preMStart = mStart;
- preTLength = tLength;
- }
-
- /// update the internal digest with the byte b
- public virtual void Update(
- byte input)
- {
- if (preSig == null && messageLength < mBuf.Length)
- {
- mBuf[messageLength++] = input;
- }
- else
- {
- digest.Update(input);
- }
- }
-
- /// update the internal digest with the byte array in
- public virtual void BlockUpdate(
- byte[] input,
- int inOff,
- int length)
- {
- if (preSig == null)
- {
- while (length > 0 && messageLength < mBuf.Length)
- {
- this.Update(input[inOff]);
- inOff++;
- length--;
- }
- }
-
- if (length > 0)
- {
- digest.BlockUpdate(input, inOff, length);
- }
- }
-
- /// reset the internal state
- public virtual void Reset()
- {
- digest.Reset();
- messageLength = 0;
- if (mBuf != null)
- {
- ClearBlock(mBuf);
- }
- if (recoveredMessage != null)
- {
- ClearBlock(recoveredMessage);
- recoveredMessage = null;
- }
- fullMessage = false;
- if (preSig != null)
- {
- preSig = null;
- ClearBlock(preBlock);
- preBlock = null;
- }
- }
-
- /// Generate a signature for the loaded message using the key we were
- /// initialised with.
- ///
- public virtual byte[] GenerateSignature()
- {
- int digSize = digest.GetDigestSize();
- byte[] m2Hash = new byte[digSize];
- digest.DoFinal(m2Hash, 0);
-
- byte[] C = new byte[8];
- LtoOSP(messageLength * 8, C);
-
- digest.BlockUpdate(C, 0, C.Length);
- digest.BlockUpdate(mBuf, 0, messageLength);
- digest.BlockUpdate(m2Hash, 0, m2Hash.Length);
-
- byte[] salt;
- if (standardSalt != null)
- {
- salt = standardSalt;
- }
- else
- {
- salt = new byte[saltLength];
- random.NextBytes(salt);
- }
-
- digest.BlockUpdate(salt, 0, salt.Length);
-
- byte[] hash = new byte[digest.GetDigestSize()];
- digest.DoFinal(hash, 0);
-
- int tLength = 2;
- if (trailer == IsoTrailers.TRAILER_IMPLICIT)
- {
- tLength = 1;
- }
-
- int off = block.Length - messageLength - salt.Length - hLen - tLength - 1;
-
- block[off] = (byte) (0x01);
-
- Array.Copy(mBuf, 0, block, off + 1, messageLength);
- Array.Copy(salt, 0, block, off + 1 + messageLength, salt.Length);
-
- byte[] dbMask = MaskGeneratorFunction1(hash, 0, hash.Length, block.Length - hLen - tLength);
- for (int i = 0; i != dbMask.Length; i++)
- {
- block[i] ^= dbMask[i];
- }
-
- Array.Copy(hash, 0, block, block.Length - hLen - tLength, hLen);
-
- if (trailer == IsoTrailers.TRAILER_IMPLICIT)
- {
- block[block.Length - 1] = (byte)IsoTrailers.TRAILER_IMPLICIT;
- }
- else
- {
- block[block.Length - 2] = (byte) ((uint)trailer >> 8);
- block[block.Length - 1] = (byte) trailer;
- }
-
- block[0] &= (byte) (0x7f);
-
- byte[] b = cipher.ProcessBlock(block, 0, block.Length);
-
- ClearBlock(mBuf);
- ClearBlock(block);
- messageLength = 0;
-
- return b;
- }
-
- /// return true if the signature represents a ISO9796-2 signature
- /// for the passed in message.
- ///
- public virtual bool VerifySignature(
- byte[] signature)
- {
- //
- // calculate H(m2)
- //
- byte[] m2Hash = new byte[hLen];
- digest.DoFinal(m2Hash, 0);
-
- byte[] block;
- int tLength;
- int mStart = 0;
-
- if (preSig == null)
- {
- try
- {
- UpdateWithRecoveredMessage(signature);
- }
- catch (Exception)
- {
- return false;
- }
- }
- else
- {
- if (!Arrays.AreEqual(preSig, signature))
- {
- throw new InvalidOperationException("UpdateWithRecoveredMessage called on different signature");
- }
- }
-
- block = preBlock;
- mStart = preMStart;
- tLength = preTLength;
-
- preSig = null;
- preBlock = null;
-
- //
- // check the hashes
- //
- byte[] C = new byte[8];
- LtoOSP(recoveredMessage.Length * 8, C);
-
- digest.BlockUpdate(C, 0, C.Length);
-
- if (recoveredMessage.Length != 0)
- {
- digest.BlockUpdate(recoveredMessage, 0, recoveredMessage.Length);
- }
-
- digest.BlockUpdate(m2Hash, 0, m2Hash.Length);
-
- // Update for the salt
- if (standardSalt != null)
- {
- digest.BlockUpdate(standardSalt, 0, standardSalt.Length);
- }
- else
- {
- digest.BlockUpdate(block, mStart + recoveredMessage.Length, saltLength);
- }
-
- byte[] hash = new byte[digest.GetDigestSize()];
- digest.DoFinal(hash, 0);
-
- int off = block.Length - tLength - hash.Length;
-
- bool isOkay = true;
-
- for (int i = 0; i != hash.Length; i++)
- {
- if (hash[i] != block[off + i])
- {
- isOkay = false;
- }
- }
-
- ClearBlock(block);
- ClearBlock(hash);
-
- if (!isOkay)
- {
- fullMessage = false;
- messageLength = 0;
- ClearBlock(recoveredMessage);
- return false;
- }
-
- //
- // if they've input a message check what we've recovered against
- // what was input.
- //
- if (messageLength != 0)
- {
- if (!IsSameAs(mBuf, recoveredMessage))
- {
- messageLength = 0;
- ClearBlock(mBuf);
- return false;
- }
- }
-
- messageLength = 0;
-
- ClearBlock(mBuf);
- return true;
- }
-
- ///
- /// Return true if the full message was recoveredMessage.
- ///
- /// true on full message recovery, false otherwise, or if not sure.
- ///
- public virtual bool HasFullMessage()
- {
- return fullMessage;
- }
-
- /// int to octet string.
- /// int to octet string.
- private void ItoOSP(
- int i,
- byte[] sp)
- {
- sp[0] = (byte)((uint)i >> 24);
- sp[1] = (byte)((uint)i >> 16);
- sp[2] = (byte)((uint)i >> 8);
- sp[3] = (byte)((uint)i >> 0);
- }
-
- /// long to octet string.
- private void LtoOSP(long l, byte[] sp)
- {
- sp[0] = (byte)((ulong)l >> 56);
- sp[1] = (byte)((ulong)l >> 48);
- sp[2] = (byte)((ulong)l >> 40);
- sp[3] = (byte)((ulong)l >> 32);
- sp[4] = (byte)((ulong)l >> 24);
- sp[5] = (byte)((ulong)l >> 16);
- sp[6] = (byte)((ulong)l >> 8);
- sp[7] = (byte)((ulong)l >> 0);
- }
-
- /// mask generator function, as described in Pkcs1v2.
- private byte[] MaskGeneratorFunction1(
- byte[] Z,
- int zOff,
- int zLen,
- int length)
- {
- byte[] mask = new byte[length];
- byte[] hashBuf = new byte[hLen];
- byte[] C = new byte[4];
- int counter = 0;
-
- digest.Reset();
-
- do
- {
- ItoOSP(counter, C);
-
- digest.BlockUpdate(Z, zOff, zLen);
- digest.BlockUpdate(C, 0, C.Length);
- digest.DoFinal(hashBuf, 0);
-
- Array.Copy(hashBuf, 0, mask, counter * hLen, hLen);
- }
- while (++counter < (length / hLen));
-
- if ((counter * hLen) < length)
- {
- ItoOSP(counter, C);
-
- digest.BlockUpdate(Z, zOff, zLen);
- digest.BlockUpdate(C, 0, C.Length);
- digest.DoFinal(hashBuf, 0);
-
- Array.Copy(hashBuf, 0, mask, counter * hLen, mask.Length - (counter * hLen));
- }
-
- return mask;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/Iso9796d2Signer.cs b/BCCrypto/src/crypto/signers/Iso9796d2Signer.cs
deleted file mode 100644
index 3039130..0000000
--- a/BCCrypto/src/crypto/signers/Iso9796d2Signer.cs
+++ /dev/null
@@ -1,556 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- /// ISO9796-2 - mechanism using a hash function with recovery (scheme 1)
- public class Iso9796d2Signer : ISignerWithRecovery
- {
- ///
- /// Return a reference to the recoveredMessage message.
- ///
- /// The full/partial recoveredMessage message.
- ///
- public byte[] GetRecoveredMessage()
- {
- return recoveredMessage;
- }
-
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerImplicit = 0xBC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerRipeMD160 = 0x31CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerRipeMD128 = 0x32CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerSha1 = 0x33CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerSha256 = 0x34CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerSha512 = 0x35CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerSha384 = 0x36CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TrailerWhirlpool = 0x37CC;
-
- private IDigest digest;
- private IAsymmetricBlockCipher cipher;
-
- private int trailer;
- private int keyBits;
- private byte[] block;
- private byte[] mBuf;
- private int messageLength;
- private bool fullMessage;
- private byte[] recoveredMessage;
-
- private byte[] preSig;
- private byte[] preBlock;
-
- ///
- /// Generate a signer with either implicit or explicit trailers for ISO9796-2.
- ///
- /// base cipher to use for signature creation/verification
- /// digest to use.
- /// whether or not the trailer is implicit or gives the hash.
- public Iso9796d2Signer(
- IAsymmetricBlockCipher cipher,
- IDigest digest,
- bool isImplicit)
- {
- this.cipher = cipher;
- this.digest = digest;
-
- if (isImplicit)
- {
- trailer = IsoTrailers.TRAILER_IMPLICIT;
- }
- else if (IsoTrailers.NoTrailerAvailable(digest))
- {
- throw new ArgumentException("no valid trailer", "digest");
- }
- else
- {
- trailer = IsoTrailers.GetTrailer(digest);
- }
- }
-
- /// Constructor for a signer with an explicit digest trailer.
- ///
- ///
- /// cipher to use.
- ///
- /// digest to sign with.
- ///
- public Iso9796d2Signer(IAsymmetricBlockCipher cipher, IDigest digest)
- : this(cipher, digest, false)
- {
- }
-
- public virtual string AlgorithmName
- {
- get { return digest.AlgorithmName + "with" + "ISO9796-2S1"; }
- }
-
- public virtual void Init(bool forSigning, ICipherParameters parameters)
- {
- RsaKeyParameters kParam = (RsaKeyParameters) parameters;
-
- cipher.Init(forSigning, kParam);
-
- keyBits = kParam.Modulus.BitLength;
-
- block = new byte[(keyBits + 7) / 8];
- if (trailer == IsoTrailers.TRAILER_IMPLICIT)
- {
- mBuf = new byte[block.Length - digest.GetDigestSize() - 2];
- }
- else
- {
- mBuf = new byte[block.Length - digest.GetDigestSize() - 3];
- }
-
- Reset();
- }
-
- /// compare two byte arrays - constant time.
- private bool IsSameAs(byte[] a, byte[] b)
- {
- int checkLen;
- if (messageLength > mBuf.Length)
- {
- if (mBuf.Length > b.Length)
- {
- return false;
- }
-
- checkLen = mBuf.Length;
- }
- else
- {
- if (messageLength != b.Length)
- {
- return false;
- }
-
- checkLen = b.Length;
- }
-
- bool isOkay = true;
-
- for (int i = 0; i != checkLen; i++)
- {
- if (a[i] != b[i])
- {
- isOkay = false;
- }
- }
-
- return isOkay;
- }
-
- /// clear possible sensitive data
- private void ClearBlock(
- byte[] block)
- {
- Array.Clear(block, 0, block.Length);
- }
-
- public virtual void UpdateWithRecoveredMessage(
- byte[] signature)
- {
- byte[] block = cipher.ProcessBlock(signature, 0, signature.Length);
-
- if (((block[0] & 0xC0) ^ 0x40) != 0)
- throw new InvalidCipherTextException("malformed signature");
-
- if (((block[block.Length - 1] & 0xF) ^ 0xC) != 0)
- throw new InvalidCipherTextException("malformed signature");
-
- int delta = 0;
-
- if (((block[block.Length - 1] & 0xFF) ^ 0xBC) == 0)
- {
- delta = 1;
- }
- else
- {
- int sigTrail = ((block[block.Length - 2] & 0xFF) << 8) | (block[block.Length - 1] & 0xFF);
-
- if (IsoTrailers.NoTrailerAvailable(digest))
- throw new ArgumentException("unrecognised hash in signature");
-
- if (sigTrail != IsoTrailers.GetTrailer(digest))
- throw new InvalidOperationException("signer initialised with wrong digest for trailer " + sigTrail);
-
- delta = 2;
- }
-
- //
- // find out how much padding we've got
- //
- int mStart = 0;
-
- for (mStart = 0; mStart != block.Length; mStart++)
- {
- if (((block[mStart] & 0x0f) ^ 0x0a) == 0)
- break;
- }
-
- mStart++;
-
- int off = block.Length - delta - digest.GetDigestSize();
-
- //
- // there must be at least one byte of message string
- //
- if ((off - mStart) <= 0)
- throw new InvalidCipherTextException("malformed block");
-
- //
- // if we contain the whole message as well, check the hash of that.
- //
- if ((block[0] & 0x20) == 0)
- {
- fullMessage = true;
-
- recoveredMessage = new byte[off - mStart];
- Array.Copy(block, mStart, recoveredMessage, 0, recoveredMessage.Length);
- }
- else
- {
- fullMessage = false;
-
- recoveredMessage = new byte[off - mStart];
- Array.Copy(block, mStart, recoveredMessage, 0, recoveredMessage.Length);
- }
-
- preSig = signature;
- preBlock = block;
-
- digest.BlockUpdate(recoveredMessage, 0, recoveredMessage.Length);
- messageLength = recoveredMessage.Length;
- recoveredMessage.CopyTo(mBuf, 0);
- }
-
- /// update the internal digest with the byte b
- public virtual void Update(
- byte input)
- {
- digest.Update(input);
-
- if (messageLength < mBuf.Length)
- {
- mBuf[messageLength] = input;
- }
-
- messageLength++;
- }
-
- /// update the internal digest with the byte array in
- public virtual void BlockUpdate(
- byte[] input,
- int inOff,
- int length)
- {
- while (length > 0 && messageLength < mBuf.Length)
- {
- //for (int i = 0; i < length && (i + messageLength) < mBuf.Length; i++)
- //{
- // mBuf[messageLength + i] = input[inOff + i];
- //}
- this.Update(input[inOff]);
- inOff++;
- length--;
- }
-
- digest.BlockUpdate(input, inOff, length);
- messageLength += length;
- }
-
- /// reset the internal state
- public virtual void Reset()
- {
- digest.Reset();
- messageLength = 0;
- ClearBlock(mBuf);
-
- if (recoveredMessage != null)
- {
- ClearBlock(recoveredMessage);
- }
-
- recoveredMessage = null;
- fullMessage = false;
-
- if (preSig != null)
- {
- preSig = null;
- ClearBlock(preBlock);
- preBlock = null;
- }
- }
-
- /// Generate a signature for the loaded message using the key we were
- /// initialised with.
- ///
- public virtual byte[] GenerateSignature()
- {
- int digSize = digest.GetDigestSize();
-
- int t = 0;
- int delta = 0;
-
- if (trailer == IsoTrailers.TRAILER_IMPLICIT)
- {
- t = 8;
- delta = block.Length - digSize - 1;
- digest.DoFinal(block, delta);
- block[block.Length - 1] = (byte)IsoTrailers.TRAILER_IMPLICIT;
- }
- else
- {
- t = 16;
- delta = block.Length - digSize - 2;
- digest.DoFinal(block, delta);
- block[block.Length - 2] = (byte) ((uint)trailer >> 8);
- block[block.Length - 1] = (byte) trailer;
- }
-
- byte header = 0;
- int x = (digSize + messageLength) * 8 + t + 4 - keyBits;
-
- if (x > 0)
- {
- int mR = messageLength - ((x + 7) / 8);
- header = (byte) (0x60);
-
- delta -= mR;
-
- Array.Copy(mBuf, 0, block, delta, mR);
- }
- else
- {
- header = (byte) (0x40);
- delta -= messageLength;
-
- Array.Copy(mBuf, 0, block, delta, messageLength);
- }
-
- if ((delta - 1) > 0)
- {
- for (int i = delta - 1; i != 0; i--)
- {
- block[i] = (byte) 0xbb;
- }
- block[delta - 1] ^= (byte) 0x01;
- block[0] = (byte) 0x0b;
- block[0] |= header;
- }
- else
- {
- block[0] = (byte) 0x0a;
- block[0] |= header;
- }
-
- byte[] b = cipher.ProcessBlock(block, 0, block.Length);
-
- messageLength = 0;
-
- ClearBlock(mBuf);
- ClearBlock(block);
-
- return b;
- }
-
- /// return true if the signature represents a ISO9796-2 signature
- /// for the passed in message.
- ///
- public virtual bool VerifySignature(byte[] signature)
- {
- byte[] block;
-
- if (preSig == null)
- {
- try
- {
- block = cipher.ProcessBlock(signature, 0, signature.Length);
- }
- catch (Exception)
- {
- return false;
- }
- }
- else
- {
- if (!Arrays.AreEqual(preSig, signature))
- throw new InvalidOperationException("updateWithRecoveredMessage called on different signature");
-
- block = preBlock;
-
- preSig = null;
- preBlock = null;
- }
-
- if (((block[0] & 0xC0) ^ 0x40) != 0)
- return ReturnFalse(block);
-
- if (((block[block.Length - 1] & 0xF) ^ 0xC) != 0)
- return ReturnFalse(block);
-
- int delta = 0;
-
- if (((block[block.Length - 1] & 0xFF) ^ 0xBC) == 0)
- {
- delta = 1;
- }
- else
- {
- int sigTrail = ((block[block.Length - 2] & 0xFF) << 8) | (block[block.Length - 1] & 0xFF);
-
- if (IsoTrailers.NoTrailerAvailable(digest))
- throw new ArgumentException("unrecognised hash in signature");
-
- if (sigTrail != IsoTrailers.GetTrailer(digest))
- throw new InvalidOperationException("signer initialised with wrong digest for trailer " + sigTrail);
-
- delta = 2;
- }
-
- //
- // find out how much padding we've got
- //
- int mStart = 0;
- for (; mStart != block.Length; mStart++)
- {
- if (((block[mStart] & 0x0f) ^ 0x0a) == 0)
- {
- break;
- }
- }
-
- mStart++;
-
- //
- // check the hashes
- //
- byte[] hash = new byte[digest.GetDigestSize()];
-
- int off = block.Length - delta - hash.Length;
-
- //
- // there must be at least one byte of message string
- //
- if ((off - mStart) <= 0)
- {
- return ReturnFalse(block);
- }
-
- //
- // if we contain the whole message as well, check the hash of that.
- //
- if ((block[0] & 0x20) == 0)
- {
- fullMessage = true;
-
- // check right number of bytes passed in.
- if (messageLength > off - mStart)
- {
- return ReturnFalse(block);
- }
-
- digest.Reset();
- digest.BlockUpdate(block, mStart, off - mStart);
- digest.DoFinal(hash, 0);
-
- bool isOkay = true;
-
- for (int i = 0; i != hash.Length; i++)
- {
- block[off + i] ^= hash[i];
- if (block[off + i] != 0)
- {
- isOkay = false;
- }
- }
-
- if (!isOkay)
- {
- return ReturnFalse(block);
- }
-
- recoveredMessage = new byte[off - mStart];
- Array.Copy(block, mStart, recoveredMessage, 0, recoveredMessage.Length);
- }
- else
- {
- fullMessage = false;
-
- digest.DoFinal(hash, 0);
-
- bool isOkay = true;
-
- for (int i = 0; i != hash.Length; i++)
- {
- block[off + i] ^= hash[i];
- if (block[off + i] != 0)
- {
- isOkay = false;
- }
- }
-
- if (!isOkay)
- {
- return ReturnFalse(block);
- }
-
- recoveredMessage = new byte[off - mStart];
- Array.Copy(block, mStart, recoveredMessage, 0, recoveredMessage.Length);
- }
-
- //
- // if they've input a message check what we've recovered against
- // what was input.
- //
- if (messageLength != 0)
- {
- if (!IsSameAs(mBuf, recoveredMessage))
- {
- return ReturnFalse(block);
- }
- }
-
- ClearBlock(mBuf);
- ClearBlock(block);
-
- messageLength = 0;
-
- return true;
- }
-
- private bool ReturnFalse(byte[] block)
- {
- messageLength = 0;
-
- ClearBlock(mBuf);
- ClearBlock(block);
-
- return false;
- }
-
- ///
- /// Return true if the full message was recoveredMessage.
- ///
- /// true on full message recovery, false otherwise.
- ///
- public virtual bool HasFullMessage()
- {
- return fullMessage;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/IsoTrailers.cs b/BCCrypto/src/crypto/signers/IsoTrailers.cs
deleted file mode 100644
index 497ffaf..0000000
--- a/BCCrypto/src/crypto/signers/IsoTrailers.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- public class IsoTrailers
- {
- public const int TRAILER_IMPLICIT = 0xBC;
- public const int TRAILER_RIPEMD160 = 0x31CC;
- public const int TRAILER_RIPEMD128 = 0x32CC;
- public const int TRAILER_SHA1 = 0x33CC;
- public const int TRAILER_SHA256 = 0x34CC;
- public const int TRAILER_SHA512 = 0x35CC;
- public const int TRAILER_SHA384 = 0x36CC;
- public const int TRAILER_WHIRLPOOL = 0x37CC;
- public const int TRAILER_SHA224 = 0x38CC;
- public const int TRAILER_SHA512_224 = 0x39CC;
- public const int TRAILER_SHA512_256 = 0x40CC;
-
- private static IDictionary CreateTrailerMap()
- {
- IDictionary trailers = Platform.CreateHashtable();
-
- trailers.Add("RIPEMD128", TRAILER_RIPEMD128);
- trailers.Add("RIPEMD160", TRAILER_RIPEMD160);
-
- trailers.Add("SHA-1", TRAILER_SHA1);
- trailers.Add("SHA-224", TRAILER_SHA224);
- trailers.Add("SHA-256", TRAILER_SHA256);
- trailers.Add("SHA-384", TRAILER_SHA384);
- trailers.Add("SHA-512", TRAILER_SHA512);
- trailers.Add("SHA-512/224", TRAILER_SHA512_224);
- trailers.Add("SHA-512/256", TRAILER_SHA512_256);
-
- trailers.Add("Whirlpool", TRAILER_WHIRLPOOL);
-
- return CollectionUtilities.ReadOnly(trailers);
- }
-
- // IDictionary is (string -> Int32)
- private static readonly IDictionary trailerMap = CreateTrailerMap();
-
- public static int GetTrailer(IDigest digest)
- {
- return (int)trailerMap[digest.AlgorithmName];
- }
-
- public static bool NoTrailerAvailable(IDigest digest)
- {
- return !trailerMap.Contains(digest.AlgorithmName);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/PssSigner.cs b/BCCrypto/src/crypto/signers/PssSigner.cs
deleted file mode 100644
index 23b7c0f..0000000
--- a/BCCrypto/src/crypto/signers/PssSigner.cs
+++ /dev/null
@@ -1,386 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- /// RSA-PSS as described in Pkcs# 1 v 2.1.
- ///
- /// Note: the usual value for the salt length is the number of
- /// bytes in the hash function.
- ///
- public class PssSigner
- : ISigner
- {
- public const byte TrailerImplicit = (byte)0xBC;
-
- private readonly IDigest contentDigest1, contentDigest2;
- private readonly IDigest mgfDigest;
- private readonly IAsymmetricBlockCipher cipher;
-
- private SecureRandom random;
-
- private int hLen;
- private int mgfhLen;
- private int sLen;
- private bool sSet;
- private int emBits;
- private byte[] salt;
- private byte[] mDash;
- private byte[] block;
- private byte trailer;
-
- public static PssSigner CreateRawSigner(
- IAsymmetricBlockCipher cipher,
- IDigest digest)
- {
- return new PssSigner(cipher, new NullDigest(), digest, digest, digest.GetDigestSize(), null, TrailerImplicit);
- }
-
- public static PssSigner CreateRawSigner(
- IAsymmetricBlockCipher cipher,
- IDigest contentDigest,
- IDigest mgfDigest,
- int saltLen,
- byte trailer)
- {
- return new PssSigner(cipher, new NullDigest(), contentDigest, mgfDigest, saltLen, null, trailer);
- }
-
- public PssSigner(
- IAsymmetricBlockCipher cipher,
- IDigest digest)
- : this(cipher, digest, digest.GetDigestSize())
- {
- }
-
- /// Basic constructor
- /// the asymmetric cipher to use.
- /// the digest to use.
- /// the length of the salt to use (in bytes).
- public PssSigner(
- IAsymmetricBlockCipher cipher,
- IDigest digest,
- int saltLen)
- : this(cipher, digest, saltLen, TrailerImplicit)
- {
- }
-
- /// Basic constructor
- /// the asymmetric cipher to use.
- /// the digest to use.
- /// the fixed salt to be used.
- public PssSigner(
- IAsymmetricBlockCipher cipher,
- IDigest digest,
- byte[] salt)
- : this(cipher, digest, digest, digest, salt.Length, salt, TrailerImplicit)
- {
- }
-
- public PssSigner(
- IAsymmetricBlockCipher cipher,
- IDigest contentDigest,
- IDigest mgfDigest,
- int saltLen)
- : this(cipher, contentDigest, mgfDigest, saltLen, TrailerImplicit)
- {
- }
-
- public PssSigner(
- IAsymmetricBlockCipher cipher,
- IDigest contentDigest,
- IDigest mgfDigest,
- byte[] salt)
- : this(cipher, contentDigest, contentDigest, mgfDigest, salt.Length, salt, TrailerImplicit)
- {
- }
-
- public PssSigner(
- IAsymmetricBlockCipher cipher,
- IDigest digest,
- int saltLen,
- byte trailer)
- : this(cipher, digest, digest, saltLen, TrailerImplicit)
- {
- }
-
- public PssSigner(
- IAsymmetricBlockCipher cipher,
- IDigest contentDigest,
- IDigest mgfDigest,
- int saltLen,
- byte trailer)
- : this(cipher, contentDigest, contentDigest, mgfDigest, saltLen, null, trailer)
- {
- }
-
- private PssSigner(
- IAsymmetricBlockCipher cipher,
- IDigest contentDigest1,
- IDigest contentDigest2,
- IDigest mgfDigest,
- int saltLen,
- byte[] salt,
- byte trailer)
- {
- this.cipher = cipher;
- this.contentDigest1 = contentDigest1;
- this.contentDigest2 = contentDigest2;
- this.mgfDigest = mgfDigest;
- this.hLen = contentDigest2.GetDigestSize();
- this.mgfhLen = mgfDigest.GetDigestSize();
- this.sLen = saltLen;
- this.sSet = salt != null;
- if (sSet)
- {
- this.salt = salt;
- }
- else
- {
- this.salt = new byte[saltLen];
- }
- this.mDash = new byte[8 + saltLen + hLen];
- this.trailer = trailer;
- }
-
- public virtual string AlgorithmName
- {
- get { return mgfDigest.AlgorithmName + "withRSAandMGF1"; }
- }
-
- public virtual void Init(
- bool forSigning,
- ICipherParameters parameters)
- {
- if (parameters is ParametersWithRandom)
- {
- ParametersWithRandom p = (ParametersWithRandom) parameters;
-
- parameters = p.Parameters;
- random = p.Random;
- }
- else
- {
- if (forSigning)
- {
- random = new SecureRandom();
- }
- }
-
- cipher.Init(forSigning, parameters);
-
- RsaKeyParameters kParam;
- if (parameters is RsaBlindingParameters)
- {
- kParam = ((RsaBlindingParameters) parameters).PublicKey;
- }
- else
- {
- kParam = (RsaKeyParameters) parameters;
- }
-
- emBits = kParam.Modulus.BitLength - 1;
-
- if (emBits < (8 * hLen + 8 * sLen + 9))
- throw new ArgumentException("key too small for specified hash and salt lengths");
-
- block = new byte[(emBits + 7) / 8];
- }
-
- /// clear possible sensitive data
- private void ClearBlock(
- byte[] block)
- {
- Array.Clear(block, 0, block.Length);
- }
-
- /// update the internal digest with the byte b
- public virtual void Update(
- byte input)
- {
- contentDigest1.Update(input);
- }
-
- /// update the internal digest with the byte array in
- public virtual void BlockUpdate(
- byte[] input,
- int inOff,
- int length)
- {
- contentDigest1.BlockUpdate(input, inOff, length);
- }
-
- /// reset the internal state
- public virtual void Reset()
- {
- contentDigest1.Reset();
- }
-
- /// Generate a signature for the message we've been loaded with using
- /// the key we were initialised with.
- ///
- public virtual byte[] GenerateSignature()
- {
- contentDigest1.DoFinal(mDash, mDash.Length - hLen - sLen);
-
- if (sLen != 0)
- {
- if (!sSet)
- {
- random.NextBytes(salt);
- }
- salt.CopyTo(mDash, mDash.Length - sLen);
- }
-
- byte[] h = new byte[hLen];
-
- contentDigest2.BlockUpdate(mDash, 0, mDash.Length);
-
- contentDigest2.DoFinal(h, 0);
-
- block[block.Length - sLen - 1 - hLen - 1] = (byte) (0x01);
- salt.CopyTo(block, block.Length - sLen - hLen - 1);
-
- byte[] dbMask = MaskGeneratorFunction1(h, 0, h.Length, block.Length - hLen - 1);
- for (int i = 0; i != dbMask.Length; i++)
- {
- block[i] ^= dbMask[i];
- }
-
- block[0] &= (byte) ((0xff >> ((block.Length * 8) - emBits)));
-
- h.CopyTo(block, block.Length - hLen - 1);
-
- block[block.Length - 1] = trailer;
-
- byte[] b = cipher.ProcessBlock(block, 0, block.Length);
-
- ClearBlock(block);
-
- return b;
- }
-
- /// return true if the internal state represents the signature described
- /// in the passed in array.
- ///
- public virtual bool VerifySignature(
- byte[] signature)
- {
- contentDigest1.DoFinal(mDash, mDash.Length - hLen - sLen);
-
- byte[] b = cipher.ProcessBlock(signature, 0, signature.Length);
- b.CopyTo(block, block.Length - b.Length);
-
- if (block[block.Length - 1] != trailer)
- {
- ClearBlock(block);
- return false;
- }
-
- byte[] dbMask = MaskGeneratorFunction1(block, block.Length - hLen - 1, hLen, block.Length - hLen - 1);
-
- for (int i = 0; i != dbMask.Length; i++)
- {
- block[i] ^= dbMask[i];
- }
-
- block[0] &= (byte) ((0xff >> ((block.Length * 8) - emBits)));
-
- for (int i = 0; i != block.Length - hLen - sLen - 2; i++)
- {
- if (block[i] != 0)
- {
- ClearBlock(block);
- return false;
- }
- }
-
- if (block[block.Length - hLen - sLen - 2] != 0x01)
- {
- ClearBlock(block);
- return false;
- }
-
- if (sSet)
- {
- Array.Copy(salt, 0, mDash, mDash.Length - sLen, sLen);
- }
- else
- {
- Array.Copy(block, block.Length - sLen - hLen - 1, mDash, mDash.Length - sLen, sLen);
- }
-
- contentDigest2.BlockUpdate(mDash, 0, mDash.Length);
- contentDigest2.DoFinal(mDash, mDash.Length - hLen);
-
- for (int i = block.Length - hLen - 1, j = mDash.Length - hLen; j != mDash.Length; i++, j++)
- {
- if ((block[i] ^ mDash[j]) != 0)
- {
- ClearBlock(mDash);
- ClearBlock(block);
- return false;
- }
- }
-
- ClearBlock(mDash);
- ClearBlock(block);
-
- return true;
- }
-
- /// int to octet string.
- private void ItoOSP(
- int i,
- byte[] sp)
- {
- sp[0] = (byte)((uint) i >> 24);
- sp[1] = (byte)((uint) i >> 16);
- sp[2] = (byte)((uint) i >> 8);
- sp[3] = (byte)((uint) i >> 0);
- }
-
- /// mask generator function, as described in Pkcs1v2.
- private byte[] MaskGeneratorFunction1(
- byte[] Z,
- int zOff,
- int zLen,
- int length)
- {
- byte[] mask = new byte[length];
- byte[] hashBuf = new byte[mgfhLen];
- byte[] C = new byte[4];
- int counter = 0;
-
- mgfDigest.Reset();
-
- while (counter < (length / mgfhLen))
- {
- ItoOSP(counter, C);
-
- mgfDigest.BlockUpdate(Z, zOff, zLen);
- mgfDigest.BlockUpdate(C, 0, C.Length);
- mgfDigest.DoFinal(hashBuf, 0);
-
- hashBuf.CopyTo(mask, counter * mgfhLen);
- ++counter;
- }
-
- if ((counter * mgfhLen) < length)
- {
- ItoOSP(counter, C);
-
- mgfDigest.BlockUpdate(Z, zOff, zLen);
- mgfDigest.BlockUpdate(C, 0, C.Length);
- mgfDigest.DoFinal(hashBuf, 0);
-
- Array.Copy(hashBuf, 0, mask, counter * mgfhLen, mask.Length - (counter * mgfhLen));
- }
-
- return mask;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/RandomDsaKCalculator.cs b/BCCrypto/src/crypto/signers/RandomDsaKCalculator.cs
deleted file mode 100644
index 022cc26..0000000
--- a/BCCrypto/src/crypto/signers/RandomDsaKCalculator.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- public class RandomDsaKCalculator
- : IDsaKCalculator
- {
- private BigInteger q;
- private SecureRandom random;
-
- public virtual bool IsDeterministic
- {
- get { return false; }
- }
-
- public virtual void Init(BigInteger n, SecureRandom random)
- {
- this.q = n;
- this.random = random;
- }
-
- public virtual void Init(BigInteger n, BigInteger d, byte[] message)
- {
- throw new InvalidOperationException("Operation not supported");
- }
-
- public virtual BigInteger NextK()
- {
- int qBitLength = q.BitLength;
-
- BigInteger k;
- do
- {
- k = new BigInteger(qBitLength, random);
- }
- while (k.SignValue < 1 || k.CompareTo(q) >= 0);
-
- return k;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/RsaDigestSigner.cs b/BCCrypto/src/crypto/signers/RsaDigestSigner.cs
deleted file mode 100644
index d9b19cf..0000000
--- a/BCCrypto/src/crypto/signers/RsaDigestSigner.cs
+++ /dev/null
@@ -1,217 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.Utilities;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Encodings;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Signers;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- public class RsaDigestSigner
- : ISigner
- {
- private readonly IAsymmetricBlockCipher rsaEngine = new Pkcs1Encoding(new RsaBlindedEngine());
- private readonly AlgorithmIdentifier algId;
- private readonly IDigest digest;
- private bool forSigning;
-
- private static readonly IDictionary oidMap = Platform.CreateHashtable();
-
- ///
- /// Load oid table.
- ///
- static RsaDigestSigner()
- {
- oidMap["RIPEMD128"] = TeleTrusTObjectIdentifiers.RipeMD128;
- oidMap["RIPEMD160"] = TeleTrusTObjectIdentifiers.RipeMD160;
- oidMap["RIPEMD256"] = TeleTrusTObjectIdentifiers.RipeMD256;
-
- oidMap["SHA-1"] = X509ObjectIdentifiers.IdSha1;
- oidMap["SHA-224"] = NistObjectIdentifiers.IdSha224;
- oidMap["SHA-256"] = NistObjectIdentifiers.IdSha256;
- oidMap["SHA-384"] = NistObjectIdentifiers.IdSha384;
- oidMap["SHA-512"] = NistObjectIdentifiers.IdSha512;
-
- oidMap["MD2"] = PkcsObjectIdentifiers.MD2;
- oidMap["MD4"] = PkcsObjectIdentifiers.MD4;
- oidMap["MD5"] = PkcsObjectIdentifiers.MD5;
- }
-
- public RsaDigestSigner(IDigest digest)
- : this(digest, (DerObjectIdentifier)oidMap[digest.AlgorithmName])
- {
- }
-
- public RsaDigestSigner(IDigest digest, DerObjectIdentifier digestOid)
- : this(digest, new AlgorithmIdentifier(digestOid, DerNull.Instance))
- {
- }
-
- public RsaDigestSigner(IDigest digest, AlgorithmIdentifier algId)
- {
- this.digest = digest;
- this.algId = algId;
- }
-
- public virtual string AlgorithmName
- {
- get { return digest.AlgorithmName + "withRSA"; }
- }
-
- /**
- * Initialise the signer for signing or verification.
- *
- * @param forSigning true if for signing, false otherwise
- * @param param necessary parameters.
- */
- public virtual void Init(
- bool forSigning,
- ICipherParameters parameters)
- {
- this.forSigning = forSigning;
- AsymmetricKeyParameter k;
-
- if (parameters is ParametersWithRandom)
- {
- k = (AsymmetricKeyParameter)((ParametersWithRandom)parameters).Parameters;
- }
- else
- {
- k = (AsymmetricKeyParameter)parameters;
- }
-
- if (forSigning && !k.IsPrivate)
- throw new InvalidKeyException("Signing requires private key.");
-
- if (!forSigning && k.IsPrivate)
- throw new InvalidKeyException("Verification requires public key.");
-
- Reset();
-
- rsaEngine.Init(forSigning, parameters);
- }
-
- /**
- * update the internal digest with the byte b
- */
- public virtual void Update(
- byte input)
- {
- digest.Update(input);
- }
-
- /**
- * update the internal digest with the byte array in
- */
- public virtual void BlockUpdate(
- byte[] input,
- int inOff,
- int length)
- {
- digest.BlockUpdate(input, inOff, length);
- }
-
- /**
- * Generate a signature for the message we've been loaded with using
- * the key we were initialised with.
- */
- public virtual byte[] GenerateSignature()
- {
- if (!forSigning)
- throw new InvalidOperationException("RsaDigestSigner not initialised for signature generation.");
-
- byte[] hash = new byte[digest.GetDigestSize()];
- digest.DoFinal(hash, 0);
-
- byte[] data = DerEncode(hash);
- return rsaEngine.ProcessBlock(data, 0, data.Length);
- }
-
- /**
- * return true if the internal state represents the signature described
- * in the passed in array.
- */
- public virtual bool VerifySignature(
- byte[] signature)
- {
- if (forSigning)
- throw new InvalidOperationException("RsaDigestSigner not initialised for verification");
-
- byte[] hash = new byte[digest.GetDigestSize()];
- digest.DoFinal(hash, 0);
-
- byte[] sig;
- byte[] expected;
-
- try
- {
- sig = rsaEngine.ProcessBlock(signature, 0, signature.Length);
- expected = DerEncode(hash);
- }
- catch (Exception)
- {
- return false;
- }
-
- if (sig.Length == expected.Length)
- {
- return Arrays.ConstantTimeAreEqual(sig, expected);
- }
- else if (sig.Length == expected.Length - 2) // NULL left out
- {
- int sigOffset = sig.Length - hash.Length - 2;
- int expectedOffset = expected.Length - hash.Length - 2;
-
- expected[1] -= 2; // adjust lengths
- expected[3] -= 2;
-
- int nonEqual = 0;
-
- for (int i = 0; i < hash.Length; i++)
- {
- nonEqual |= (sig[sigOffset + i] ^ expected[expectedOffset + i]);
- }
-
- for (int i = 0; i < sigOffset; i++)
- {
- nonEqual |= (sig[i] ^ expected[i]); // check header less NULL
- }
-
- return nonEqual == 0;
- }
- else
- {
- return false;
- }
- }
-
- public virtual void Reset()
- {
- digest.Reset();
- }
-
- private byte[] DerEncode(byte[] hash)
- {
- if (algId == null)
- {
- // For raw RSA, the DigestInfo must be prepared externally
- return hash;
- }
-
- DigestInfo dInfo = new DigestInfo(algId, hash);
-
- return dInfo.GetDerEncoded();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/signers/X931Signer.cs b/BCCrypto/src/crypto/signers/X931Signer.cs
deleted file mode 100644
index c6e44ba..0000000
--- a/BCCrypto/src/crypto/signers/X931Signer.cs
+++ /dev/null
@@ -1,225 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Signers
-{
- /**
- * X9.31-1998 - signing using a hash.
- *
- * The message digest hash, H, is encapsulated to form a byte string as follows
- *
- *
- * EB = 06 || PS || 0xBA || H || TRAILER
- *
- * where PS is a string of bytes all of value 0xBB of length such that |EB|=|n|, and TRAILER is the ISO/IEC 10118 part number†for the digest. The byte string, EB, is converted to an integer value, the message representative, f.
- */
- public class X931Signer
- : ISigner
- {
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TRAILER_IMPLICIT = 0xBC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TRAILER_RIPEMD160 = 0x31CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TRAILER_RIPEMD128 = 0x32CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TRAILER_SHA1 = 0x33CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TRAILER_SHA256 = 0x34CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TRAILER_SHA512 = 0x35CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TRAILER_SHA384 = 0x36CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TRAILER_WHIRLPOOL = 0x37CC;
- [Obsolete("Use 'IsoTrailers' instead")]
- public const int TRAILER_SHA224 = 0x38CC;
-
- private IDigest digest;
- private IAsymmetricBlockCipher cipher;
- private RsaKeyParameters kParam;
-
- private int trailer;
- private int keyBits;
- private byte[] block;
-
- /**
- * Generate a signer with either implicit or explicit trailers for X9.31.
- *
- * @param cipher base cipher to use for signature creation/verification
- * @param digest digest to use.
- * @param implicit whether or not the trailer is implicit or gives the hash.
- */
- public X931Signer(IAsymmetricBlockCipher cipher, IDigest digest, bool isImplicit)
- {
- this.cipher = cipher;
- this.digest = digest;
-
- if (isImplicit)
- {
- trailer = IsoTrailers.TRAILER_IMPLICIT;
- }
- else if (IsoTrailers.NoTrailerAvailable(digest))
- {
- throw new ArgumentException("no valid trailer", "digest");
- }
- else
- {
- trailer = IsoTrailers.GetTrailer(digest);
- }
- }
-
- public virtual string AlgorithmName
- {
- get { return digest.AlgorithmName + "with" + cipher.AlgorithmName + "/X9.31"; }
- }
-
- /**
- * Constructor for a signer with an explicit digest trailer.
- *
- * @param cipher cipher to use.
- * @param digest digest to sign with.
- */
- public X931Signer(IAsymmetricBlockCipher cipher, IDigest digest)
- : this(cipher, digest, false)
- {
- }
-
- public virtual void Init(bool forSigning, ICipherParameters parameters)
- {
- kParam = (RsaKeyParameters)parameters;
-
- cipher.Init(forSigning, kParam);
-
- keyBits = kParam.Modulus.BitLength;
-
- block = new byte[(keyBits + 7) / 8];
-
- Reset();
- }
-
- /// clear possible sensitive data
- private void ClearBlock(byte[] block)
- {
- Array.Clear(block, 0, block.Length);
- }
-
- /**
- * update the internal digest with the byte b
- */
- public virtual void Update(byte b)
- {
- digest.Update(b);
- }
-
- /**
- * update the internal digest with the byte array in
- */
- public virtual void BlockUpdate(byte[] input, int off, int len)
- {
- digest.BlockUpdate(input, off, len);
- }
-
- /**
- * reset the internal state
- */
- public virtual void Reset()
- {
- digest.Reset();
- }
-
- /**
- * generate a signature for the loaded message using the key we were
- * initialised with.
- */
- public virtual byte[] GenerateSignature()
- {
- CreateSignatureBlock();
-
- BigInteger t = new BigInteger(1, cipher.ProcessBlock(block, 0, block.Length));
- ClearBlock(block);
-
- t = t.Min(kParam.Modulus.Subtract(t));
-
- return BigIntegers.AsUnsignedByteArray((kParam.Modulus.BitLength + 7) / 8, t);
- }
-
- private void CreateSignatureBlock()
- {
- int digSize = digest.GetDigestSize();
-
- int delta;
- if (trailer == IsoTrailers.TRAILER_IMPLICIT)
- {
- delta = block.Length - digSize - 1;
- digest.DoFinal(block, delta);
- block[block.Length - 1] = (byte)IsoTrailers.TRAILER_IMPLICIT;
- }
- else
- {
- delta = block.Length - digSize - 2;
- digest.DoFinal(block, delta);
- block[block.Length - 2] = (byte)(trailer >> 8);
- block[block.Length - 1] = (byte)trailer;
- }
-
- block[0] = 0x6b;
- for (int i = delta - 2; i != 0; i--)
- {
- block[i] = (byte)0xbb;
- }
- block[delta - 1] = (byte)0xba;
- }
-
- /**
- * return true if the signature represents a ISO9796-2 signature
- * for the passed in message.
- */
- public virtual bool VerifySignature(byte[] signature)
- {
- try
- {
- block = cipher.ProcessBlock(signature, 0, signature.Length);
- }
- catch (Exception)
- {
- return false;
- }
-
- BigInteger t = new BigInteger(1, block);
- BigInteger f;
-
- if ((t.IntValue & 15) == 12)
- {
- f = t;
- }
- else
- {
- t = kParam.Modulus.Subtract(t);
- if ((t.IntValue & 15) == 12)
- {
- f = t;
- }
- else
- {
- return false;
- }
- }
-
- CreateSignatureBlock();
-
- byte[] fBlock = BigIntegers.AsUnsignedByteArray(block.Length, f);
-
- bool rv = Arrays.ConstantTimeAreEqual(block, fBlock);
-
- ClearBlock(block);
- ClearBlock(fBlock);
-
- return rv;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AEAD_Chacha20_Poly1305.cs b/BCCrypto/src/crypto/tls/AEAD_Chacha20_Poly1305.cs
deleted file mode 100644
index 75f9cae..0000000
--- a/BCCrypto/src/crypto/tls/AEAD_Chacha20_Poly1305.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Crypto.Tls;
-
-namespace Org.BouncyCastle.Crypto.TlsExt
-{
- public class AEAD_Chacha20_Poly1305
- {
- private static readonly byte[] Zeroes = new byte[15];
- private static ChaCha7539Engine cipher;
-
- private static IMac _mac = new Poly1305();
-
- private static ParametersWithIV _temp_Params;
- private static KeyParameter _encryptKey;
- private static KeyParameter _decryptKey;
- private static KeyParameter _macKey;
-
- private static object mutex = new object();
-
- public static int Encrypt(byte[] plaintext, int offset, int len, byte[] additionalData, byte[] nonce, byte[] key, byte[] outBuffer)
- {
- lock (mutex) {
- if (cipher == null)
- cipher = new ChaCha7539Engine();
- else
- cipher.Reset();
-
- if (_encryptKey == null)
- _encryptKey = new KeyParameter(key);
- else {
- _encryptKey.Reset();
- _encryptKey.SetKey(key);
- }
-
- if (_temp_Params == null)
- _temp_Params = new ParametersWithIV(_encryptKey, nonce);
- else {
- _temp_Params.Reset();
- _temp_Params.Set(_encryptKey, nonce);
- }
-
- cipher.Init(true, _temp_Params);
-
- byte[] firstBlock = BufferPool.GetBuffer(64);
- KeyParameter macKey = GenerateRecordMacKey(cipher, firstBlock);
-
- cipher.ProcessBytes(plaintext, offset, len, outBuffer, 0);
-
- byte[] mac = BufferPool.GetBuffer(16);
- int macsize = CalculateRecordMac(macKey, additionalData, outBuffer, 0, len, mac);
- Array.Copy(mac, 0, outBuffer, len, macsize);
-
- BufferPool.ReturnBuffer(mac);
- BufferPool.ReturnBuffer(firstBlock);
-
- return len + 16;
- }
- }
-
- public static int Decrypt(byte[] ciphertext, int offset, int len, byte[] additionalData, byte[] nonce, byte[] key, byte[] outBuffer)
- {
- lock (mutex) {
- if (cipher == null)
- cipher = new ChaCha7539Engine();
- else
- cipher.Reset();
-
- if (_decryptKey == null)
- _decryptKey = new KeyParameter(key);
- else {
- _decryptKey.Reset();
- _decryptKey.SetKey(key);
- }
-
- if (_temp_Params == null)
- _temp_Params = new ParametersWithIV(_decryptKey, nonce);
- else {
- _temp_Params.Reset();
- _temp_Params.Set(_decryptKey, nonce);
- }
-
- cipher.Init(false, _temp_Params);
-
- byte[] firstBlock = BufferPool.GetBuffer(64);
- KeyParameter macKey = GenerateRecordMacKey(cipher, firstBlock);
-
- int plaintextLength = len - 16;
-
- byte[] calculatedMac = BufferPool.GetBuffer(16);
- CalculateRecordMac(macKey, additionalData, ciphertext, offset, plaintextLength, calculatedMac);
-
- byte[] receivedMac = BufferPool.GetBuffer(16);
- Array.Copy(ciphertext, offset + plaintextLength, receivedMac, 0, receivedMac.Length);
-
- if (!Arrays.ConstantTimeAreEqual(calculatedMac, receivedMac)) {
- BufferPool.ReturnBuffer(calculatedMac);
- BufferPool.ReturnBuffer(receivedMac);
- BufferPool.ReturnBuffer(firstBlock);
-
- throw new TlsFatalAlert(AlertDescription.bad_record_mac);
- }
-
- BufferPool.ReturnBuffer(calculatedMac);
- BufferPool.ReturnBuffer(receivedMac);
- BufferPool.ReturnBuffer(firstBlock);
-
- cipher.ProcessBytes(ciphertext, offset, plaintextLength, outBuffer, 0);
- return plaintextLength;
- }
- }
-
- protected static KeyParameter GenerateRecordMacKey(IStreamCipher cipher, byte[] firstBlock)
- {
- cipher.ProcessBytes(firstBlock, 0, firstBlock.Length, firstBlock, 0);
-
- if (_macKey == null)
- _macKey = new KeyParameter(firstBlock, 0, 32);
- else {
- _macKey.Reset();
- _macKey.SetKey(firstBlock, 0, 32);
- }
-
- Arrays.Fill(firstBlock, (byte)0);
- return _macKey;
- }
-
- protected static int CalculateRecordMac(KeyParameter macKey, byte[] additionalData, byte[] buf, int off, int len, byte[] outMac)
- {
- _mac.Reset();
- _mac.Init(macKey);
-
- UpdateRecordMacText(_mac, additionalData, 0, additionalData.Length);
- UpdateRecordMacText(_mac, buf, off, len);
- UpdateRecordMacLength(_mac, additionalData.Length);
- UpdateRecordMacLength(_mac, len);
-
- return MacUtilities.DoFinalOut(_mac, outMac);
- }
-
- protected static void UpdateRecordMacLength(IMac mac, int len)
- {
- byte[] longLen = BufferPool.GetBuffer(8);
- Pack.UInt64_To_LE((ulong)len, longLen);
- mac.BlockUpdate(longLen, 0, longLen.Length);
- BufferPool.ReturnBuffer(longLen);
- }
-
- protected static void UpdateRecordMacText(IMac mac, byte[] buf, int off, int len)
- {
- mac.BlockUpdate(buf, off, len);
-
- int partial = len % 16;
- if (partial != 0)
- {
- mac.BlockUpdate(Zeroes, 0, 16 - partial);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AbstractTlsAgreementCredentials.cs b/BCCrypto/src/crypto/tls/AbstractTlsAgreementCredentials.cs
deleted file mode 100644
index 2d7af80..0000000
--- a/BCCrypto/src/crypto/tls/AbstractTlsAgreementCredentials.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class AbstractTlsAgreementCredentials
- : AbstractTlsCredentials, TlsAgreementCredentials
- {
- ///
- public abstract byte[] GenerateAgreement(AsymmetricKeyParameter peerPublicKey);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AbstractTlsCipherFactory.cs b/BCCrypto/src/crypto/tls/AbstractTlsCipherFactory.cs
deleted file mode 100644
index 141ee65..0000000
--- a/BCCrypto/src/crypto/tls/AbstractTlsCipherFactory.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class AbstractTlsCipherFactory
- : TlsCipherFactory
- {
- ///
- public virtual TlsCipher CreateCipher(TlsContext context, int encryptionAlgorithm, int macAlgorithm)
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AbstractTlsClient.cs b/BCCrypto/src/crypto/tls/AbstractTlsClient.cs
deleted file mode 100644
index be4702e..0000000
--- a/BCCrypto/src/crypto/tls/AbstractTlsClient.cs
+++ /dev/null
@@ -1,256 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class AbstractTlsClient
- : AbstractTlsPeer, TlsClient
- {
- protected TlsCipherFactory mCipherFactory;
-
- protected TlsClientContext mContext;
-
- protected IList mSupportedSignatureAlgorithms;
- protected int[] mNamedCurves;
- protected byte[] mClientECPointFormats, mServerECPointFormats;
-
- protected int mSelectedCipherSuite;
- protected short mSelectedCompressionMethod;
-
- public AbstractTlsClient()
- : this(new DefaultTlsCipherFactory())
- {
- }
-
- public AbstractTlsClient(TlsCipherFactory cipherFactory)
- {
- this.mCipherFactory = cipherFactory;
- }
-
- protected virtual bool AllowUnexpectedServerExtension(int extensionType, byte[] extensionData)
- {
- switch (extensionType)
- {
- case ExtensionType.elliptic_curves:
- /*
- * Exception added based on field reports that some servers do send this, although the
- * Supported Elliptic Curves Extension is clearly intended to be client-only. If
- * present, we still require that it is a valid EllipticCurveList.
- */
- TlsEccUtilities.ReadSupportedEllipticCurvesExtension(extensionData);
- return true;
- default:
- return false;
- }
- }
-
- protected virtual void CheckForUnexpectedServerExtension(IDictionary serverExtensions, int extensionType)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(serverExtensions, extensionType);
- if (extensionData != null && !AllowUnexpectedServerExtension(extensionType, extensionData))
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
-
- public virtual void Init(TlsClientContext context)
- {
- this.mContext = context;
- }
-
- public virtual TlsSession GetSessionToResume()
- {
- return null;
- }
-
- public virtual ProtocolVersion ClientHelloRecordLayerVersion
- {
- get
- {
- // "{03,00}"
- //return ProtocolVersion.SSLv3;
-
- // "the lowest version number supported by the client"
- //return MinimumVersion;
-
- // "the value of ClientHello.client_version"
- return ClientVersion;
- }
- }
-
- public virtual ProtocolVersion ClientVersion
- {
- get { return ProtocolVersion.TLSv12; }
- }
-
- public virtual bool IsFallback
- {
- /*
- * RFC 7507 4. The TLS_FALLBACK_SCSV cipher suite value is meant for use by clients that
- * repeat a connection attempt with a downgraded protocol (perform a "fallback retry") in
- * order to work around interoperability problems with legacy servers.
- */
- get { return false; }
- }
-
- public virtual IDictionary GetClientExtensions()
- {
- IDictionary clientExtensions = null;
-
- ProtocolVersion clientVersion = mContext.ClientVersion;
-
- /*
- * RFC 5246 7.4.1.4.1. Note: this extension is not meaningful for TLS versions prior to 1.2.
- * Clients MUST NOT offer it if they are offering prior versions.
- */
- if (TlsUtilities.IsSignatureAlgorithmsExtensionAllowed(clientVersion))
- {
- // TODO Provide a way for the user to specify the acceptable hash/signature algorithms.
-
- this.mSupportedSignatureAlgorithms = TlsUtilities.GetDefaultSupportedSignatureAlgorithms();
-
- clientExtensions = TlsExtensionsUtilities.EnsureExtensionsInitialised(clientExtensions);
-
- TlsUtilities.AddSignatureAlgorithmsExtension(clientExtensions, mSupportedSignatureAlgorithms);
- }
-
- if (TlsEccUtilities.ContainsEccCipherSuites(GetCipherSuites()))
- {
- /*
- * RFC 4492 5.1. A client that proposes ECC cipher suites in its ClientHello message
- * appends these extensions (along with any others), enumerating the curves it supports
- * and the point formats it can parse. Clients SHOULD send both the Supported Elliptic
- * Curves Extension and the Supported Point Formats Extension.
- */
- /*
- * TODO Could just add all the curves since we support them all, but users may not want
- * to use unnecessarily large fields. Need configuration options.
- */
- this.mNamedCurves = new int[]{ NamedCurve.secp256r1, NamedCurve.secp384r1 };
- this.mClientECPointFormats = new byte[]{ ECPointFormat.uncompressed,
- ECPointFormat.ansiX962_compressed_prime, ECPointFormat.ansiX962_compressed_char2, };
-
- clientExtensions = TlsExtensionsUtilities.EnsureExtensionsInitialised(clientExtensions);
-
- TlsEccUtilities.AddSupportedEllipticCurvesExtension(clientExtensions, mNamedCurves);
- TlsEccUtilities.AddSupportedPointFormatsExtension(clientExtensions, mClientECPointFormats);
- }
-
- return clientExtensions;
- }
-
- public virtual ProtocolVersion MinimumVersion
- {
- get { return ProtocolVersion.TLSv10; }
- }
-
- public virtual void NotifyServerVersion(ProtocolVersion serverVersion)
- {
- if (!MinimumVersion.IsEqualOrEarlierVersionOf(serverVersion))
- throw new TlsFatalAlert(AlertDescription.protocol_version);
- }
-
- public abstract int[] GetCipherSuites();
-
- public virtual byte[] GetCompressionMethods()
- {
- return new byte[]{ CompressionMethod.cls_null };
- }
-
- public virtual void NotifySessionID(byte[] sessionID)
- {
- // Currently ignored
- }
-
- public virtual void NotifySelectedCipherSuite(int selectedCipherSuite)
- {
- this.mSelectedCipherSuite = selectedCipherSuite;
- }
-
- public virtual void NotifySelectedCompressionMethod(byte selectedCompressionMethod)
- {
- this.mSelectedCompressionMethod = selectedCompressionMethod;
- }
-
- public virtual void ProcessServerExtensions(IDictionary serverExtensions)
- {
- /*
- * TlsProtocol implementation validates that any server extensions received correspond to
- * client extensions sent. By default, we don't send any, and this method is not called.
- */
- if (serverExtensions != null)
- {
- /*
- * RFC 5246 7.4.1.4.1. Servers MUST NOT send this extension.
- */
- CheckForUnexpectedServerExtension(serverExtensions, ExtensionType.signature_algorithms);
-
- CheckForUnexpectedServerExtension(serverExtensions, ExtensionType.elliptic_curves);
-
- if (TlsEccUtilities.IsEccCipherSuite(this.mSelectedCipherSuite))
- {
- this.mServerECPointFormats = TlsEccUtilities.GetSupportedPointFormatsExtension(serverExtensions);
- }
- else
- {
- CheckForUnexpectedServerExtension(serverExtensions, ExtensionType.ec_point_formats);
- }
-
- /*
- * RFC 7685 3. The server MUST NOT echo the extension.
- */
- CheckForUnexpectedServerExtension(serverExtensions, ExtensionType.padding);
- }
- }
-
- public virtual void ProcessServerSupplementalData(IList serverSupplementalData)
- {
- if (serverSupplementalData != null)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- public abstract TlsKeyExchange GetKeyExchange();
-
- public abstract TlsAuthentication GetAuthentication();
-
- public virtual IList GetClientSupplementalData()
- {
- return null;
- }
-
- public override TlsCompression GetCompression()
- {
- switch (mSelectedCompressionMethod)
- {
- case CompressionMethod.cls_null:
- return new TlsNullCompression();
-
- case CompressionMethod.DEFLATE:
- return new TlsDeflateCompression();
-
- default:
- /*
- * Note: internal error here; the TlsProtocol implementation verifies that the
- * server-selected compression method was in the list of client-offered compression
- * methods, so if we now can't produce an implementation, we shouldn't have offered it!
- */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public override TlsCipher GetCipher()
- {
- int encryptionAlgorithm = TlsUtilities.GetEncryptionAlgorithm(mSelectedCipherSuite);
- int macAlgorithm = TlsUtilities.GetMacAlgorithm(mSelectedCipherSuite);
-
- return mCipherFactory.CreateCipher(mContext, encryptionAlgorithm, macAlgorithm);
- }
-
- public virtual void NotifyNewSessionTicket(NewSessionTicket newSessionTicket)
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AbstractTlsContext.cs b/BCCrypto/src/crypto/tls/AbstractTlsContext.cs
deleted file mode 100644
index ae7efc6..0000000
--- a/BCCrypto/src/crypto/tls/AbstractTlsContext.cs
+++ /dev/null
@@ -1,152 +0,0 @@
-using System;
-using System.Threading;
-
-using Org.BouncyCastle.Crypto.Prng;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- internal abstract class AbstractTlsContext
- : TlsContext
- {
- private static long counter = Times.NanoTime();
-
-#if NETCF_1_0
- private static object counterLock = new object();
- private static long NextCounterValue()
- {
- lock (counterLock)
- {
- return ++counter;
- }
- }
-#else
- private static long NextCounterValue()
- {
- return Interlocked.Increment(ref counter);
- }
-#endif
-
- private readonly IRandomGenerator mNonceRandom;
- private readonly SecureRandom mSecureRandom;
- private readonly SecurityParameters mSecurityParameters;
-
- private ProtocolVersion mClientVersion = null;
- private ProtocolVersion mServerVersion = null;
- private TlsSession mSession = null;
- private object mUserObject = null;
-
- internal AbstractTlsContext(SecureRandom secureRandom, SecurityParameters securityParameters)
- {
- IDigest d = TlsUtilities.CreateHash(HashAlgorithm.sha256);
- byte[] seed = new byte[d.GetDigestSize()];
- secureRandom.NextBytes(seed);
-
- this.mNonceRandom = new DigestRandomGenerator(d);
- mNonceRandom.AddSeedMaterial(NextCounterValue());
- mNonceRandom.AddSeedMaterial(Times.NanoTime());
- mNonceRandom.AddSeedMaterial(seed);
-
- this.mSecureRandom = secureRandom;
- this.mSecurityParameters = securityParameters;
- }
-
- public virtual IRandomGenerator NonceRandomGenerator
- {
- get { return mNonceRandom; }
- }
-
- public virtual SecureRandom SecureRandom
- {
- get { return mSecureRandom; }
- }
-
- public virtual SecurityParameters SecurityParameters
- {
- get { return mSecurityParameters; }
- }
-
- public abstract bool IsServer { get; }
-
- public virtual ProtocolVersion ClientVersion
- {
- get { return mClientVersion; }
- }
-
- internal virtual void SetClientVersion(ProtocolVersion clientVersion)
- {
- this.mClientVersion = clientVersion;
- }
-
- public virtual ProtocolVersion ServerVersion
- {
- get { return mServerVersion; }
- }
-
- internal virtual void SetServerVersion(ProtocolVersion serverVersion)
- {
- this.mServerVersion = serverVersion;
- }
-
- public virtual TlsSession ResumableSession
- {
- get { return mSession; }
- }
-
- internal virtual void SetResumableSession(TlsSession session)
- {
- this.mSession = session;
- }
-
- public virtual object UserObject
- {
- get { return mUserObject; }
- set { this.mUserObject = value; }
- }
-
- public virtual byte[] ExportKeyingMaterial(string asciiLabel, byte[] context_value, int length)
- {
- /*
- * TODO[session-hash]
- *
- * draft-ietf-tls-session-hash-04 5.4. If a client or server chooses to continue with a full
- * handshake without the extended master secret extension, [..] the client or server MUST
- * NOT export any key material based on the new master secret for any subsequent
- * application-level authentication. In particular, it MUST disable [RFC5705] [..].
- */
-
- if (context_value != null && !TlsUtilities.IsValidUint16(context_value.Length))
- throw new ArgumentException("must have length less than 2^16 (or be null)", "context_value");
-
- SecurityParameters sp = SecurityParameters;
- byte[] cr = sp.ClientRandom, sr = sp.ServerRandom;
-
- int seedLength = cr.Length + sr.Length;
- if (context_value != null)
- {
- seedLength += (2 + context_value.Length);
- }
-
- byte[] seed = new byte[seedLength];
- int seedPos = 0;
-
- Array.Copy(cr, 0, seed, seedPos, cr.Length);
- seedPos += cr.Length;
- Array.Copy(sr, 0, seed, seedPos, sr.Length);
- seedPos += sr.Length;
- if (context_value != null)
- {
- TlsUtilities.WriteUint16(context_value.Length, seed, seedPos);
- seedPos += 2;
- Array.Copy(context_value, 0, seed, seedPos, context_value.Length);
- seedPos += context_value.Length;
- }
-
- if (seedPos != seedLength)
- throw new InvalidOperationException("error in calculation of seed for export");
-
- return TlsUtilities.PRF(this, sp.MasterSecret, asciiLabel, seed, length);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AbstractTlsCredentials.cs b/BCCrypto/src/crypto/tls/AbstractTlsCredentials.cs
deleted file mode 100644
index 6411b81..0000000
--- a/BCCrypto/src/crypto/tls/AbstractTlsCredentials.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class AbstractTlsCredentials
- : TlsCredentials
- {
- public abstract Certificate Certificate { get; }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AbstractTlsEncryptionCredentials.cs b/BCCrypto/src/crypto/tls/AbstractTlsEncryptionCredentials.cs
deleted file mode 100644
index 05b129c..0000000
--- a/BCCrypto/src/crypto/tls/AbstractTlsEncryptionCredentials.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class AbstractTlsEncryptionCredentials
- : AbstractTlsCredentials, TlsEncryptionCredentials
- {
- ///
- public abstract byte[] DecryptPreMasterSecret(byte[] encryptedPreMasterSecret);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AbstractTlsKeyExchange.cs b/BCCrypto/src/crypto/tls/AbstractTlsKeyExchange.cs
deleted file mode 100644
index 294b249..0000000
--- a/BCCrypto/src/crypto/tls/AbstractTlsKeyExchange.cs
+++ /dev/null
@@ -1,177 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class AbstractTlsKeyExchange
- : TlsKeyExchange
- {
- protected readonly int mKeyExchange;
- protected IList mSupportedSignatureAlgorithms;
-
- protected TlsContext mContext;
-
- protected AbstractTlsKeyExchange(int keyExchange, IList supportedSignatureAlgorithms)
- {
- this.mKeyExchange = keyExchange;
- this.mSupportedSignatureAlgorithms = supportedSignatureAlgorithms;
- }
-
- protected virtual DigitallySigned ParseSignature(Stream input)
- {
- DigitallySigned signature = DigitallySigned.Parse(mContext, input);
- SignatureAndHashAlgorithm signatureAlgorithm = signature.Algorithm;
- if (signatureAlgorithm != null)
- {
- TlsUtilities.VerifySupportedSignatureAlgorithm(mSupportedSignatureAlgorithms, signatureAlgorithm);
- }
- return signature;
- }
-
- public virtual void Init(TlsContext context)
- {
- this.mContext = context;
-
- ProtocolVersion clientVersion = context.ClientVersion;
-
- if (TlsUtilities.IsSignatureAlgorithmsExtensionAllowed(clientVersion))
- {
- /*
- * RFC 5246 7.4.1.4.1. If the client does not send the signature_algorithms extension,
- * the server MUST do the following:
- *
- * - If the negotiated key exchange algorithm is one of (RSA, DHE_RSA, DH_RSA, RSA_PSK,
- * ECDH_RSA, ECDHE_RSA), behave as if client had sent the value {sha1,rsa}.
- *
- * - If the negotiated key exchange algorithm is one of (DHE_DSS, DH_DSS), behave as if
- * the client had sent the value {sha1,dsa}.
- *
- * - If the negotiated key exchange algorithm is one of (ECDH_ECDSA, ECDHE_ECDSA),
- * behave as if the client had sent value {sha1,ecdsa}.
- */
- if (this.mSupportedSignatureAlgorithms == null)
- {
- switch (mKeyExchange)
- {
- case KeyExchangeAlgorithm.DH_DSS:
- case KeyExchangeAlgorithm.DHE_DSS:
- case KeyExchangeAlgorithm.SRP_DSS:
- {
- this.mSupportedSignatureAlgorithms = TlsUtilities.GetDefaultDssSignatureAlgorithms();
- break;
- }
-
- case KeyExchangeAlgorithm.ECDH_ECDSA:
- case KeyExchangeAlgorithm.ECDHE_ECDSA:
- {
- this.mSupportedSignatureAlgorithms = TlsUtilities.GetDefaultECDsaSignatureAlgorithms();
- break;
- }
-
- case KeyExchangeAlgorithm.DH_RSA:
- case KeyExchangeAlgorithm.DHE_RSA:
- case KeyExchangeAlgorithm.ECDH_RSA:
- case KeyExchangeAlgorithm.ECDHE_RSA:
- case KeyExchangeAlgorithm.RSA:
- case KeyExchangeAlgorithm.RSA_PSK:
- case KeyExchangeAlgorithm.SRP_RSA:
- {
- this.mSupportedSignatureAlgorithms = TlsUtilities.GetDefaultRsaSignatureAlgorithms();
- break;
- }
-
- case KeyExchangeAlgorithm.DHE_PSK:
- case KeyExchangeAlgorithm.ECDHE_PSK:
- case KeyExchangeAlgorithm.PSK:
- case KeyExchangeAlgorithm.SRP:
- break;
-
- default:
- throw new InvalidOperationException("unsupported key exchange algorithm");
- }
- }
-
- }
- else if (this.mSupportedSignatureAlgorithms != null)
- {
- throw new InvalidOperationException("supported_signature_algorithms not allowed for " + clientVersion);
- }
- }
-
- public abstract void SkipServerCredentials();
-
- public virtual void ProcessServerCertificate(Certificate serverCertificate)
- {
- if (mSupportedSignatureAlgorithms == null)
- {
- /*
- * TODO RFC 2246 7.4.2. Unless otherwise specified, the signing algorithm for the
- * certificate must be the same as the algorithm for the certificate key.
- */
- }
- else
- {
- /*
- * TODO RFC 5246 7.4.2. If the client provided a "signature_algorithms" extension, then
- * all certificates provided by the server MUST be signed by a hash/signature algorithm
- * pair that appears in that extension.
- */
- }
- }
-
- public virtual void ProcessServerCredentials(TlsCredentials serverCredentials)
- {
- ProcessServerCertificate(serverCredentials.Certificate);
- }
-
- public virtual bool RequiresServerKeyExchange
- {
- get { return false; }
- }
-
- public virtual byte[] GenerateServerKeyExchange()
- {
- if (RequiresServerKeyExchange)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- return null;
- }
-
- public virtual void SkipServerKeyExchange()
- {
- if (RequiresServerKeyExchange)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- public virtual void ProcessServerKeyExchange(Stream input)
- {
- if (!RequiresServerKeyExchange)
- {
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- }
-
- public abstract void ValidateCertificateRequest(CertificateRequest certificateRequest);
-
- public virtual void SkipClientCredentials()
- {
- }
-
- public abstract void ProcessClientCredentials(TlsCredentials clientCredentials);
-
- public virtual void ProcessClientCertificate(Certificate clientCertificate)
- {
- }
-
- public abstract void GenerateClientKeyExchange(Stream output);
-
- public virtual void ProcessClientKeyExchange(Stream input)
- {
- // Key exchange implementation MUST support client key exchange
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public abstract byte[] GeneratePremasterSecret();
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AbstractTlsPeer.cs b/BCCrypto/src/crypto/tls/AbstractTlsPeer.cs
deleted file mode 100644
index 81a5338..0000000
--- a/BCCrypto/src/crypto/tls/AbstractTlsPeer.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class AbstractTlsPeer
- : TlsPeer
- {
- public virtual bool ShouldUseGmtUnixTime()
- {
- /*
- * draft-mathewson-no-gmtunixtime-00 2. For the reasons we discuss above, we recommend that
- * TLS implementors MUST by default set the entire value the ClientHello.Random and
- * ServerHello.Random fields, including gmt_unix_time, to a cryptographically random
- * sequence.
- */
- return false;
- }
-
- public virtual void NotifySecureRenegotiation(bool secureRenegotiation)
- {
- if (!secureRenegotiation)
- {
- /*
- * RFC 5746 3.4/3.6. In this case, some clients/servers may want to terminate the handshake instead
- * of continuing; see Section 4.1/4.3 for discussion.
- */
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
- }
- }
-
- public abstract TlsCompression GetCompression();
-
- public abstract TlsCipher GetCipher();
-
- public virtual void NotifyAlertRaised(byte alertLevel, byte alertDescription, string message, Exception cause)
- {
- }
-
- public virtual void NotifyAlertReceived(byte alertLevel, byte alertDescription)
- {
- }
-
- public virtual void NotifyHandshakeComplete()
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AbstractTlsServer.cs b/BCCrypto/src/crypto/tls/AbstractTlsServer.cs
deleted file mode 100644
index 52a79c9..0000000
--- a/BCCrypto/src/crypto/tls/AbstractTlsServer.cs
+++ /dev/null
@@ -1,351 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class AbstractTlsServer
- : AbstractTlsPeer, TlsServer
- {
- protected TlsCipherFactory mCipherFactory;
-
- protected TlsServerContext mContext;
-
- protected ProtocolVersion mClientVersion;
- protected int[] mOfferedCipherSuites;
- protected byte[] mOfferedCompressionMethods;
- protected IDictionary mClientExtensions;
-
- protected bool mEncryptThenMacOffered;
- protected short mMaxFragmentLengthOffered;
- protected bool mTruncatedHMacOffered;
- protected IList mSupportedSignatureAlgorithms;
- protected bool mEccCipherSuitesOffered;
- protected int[] mNamedCurves;
- protected byte[] mClientECPointFormats, mServerECPointFormats;
-
- protected ProtocolVersion mServerVersion;
- protected int mSelectedCipherSuite;
- protected byte mSelectedCompressionMethod;
- protected IDictionary mServerExtensions;
-
- public AbstractTlsServer()
- : this(new DefaultTlsCipherFactory())
- {
- }
-
- public AbstractTlsServer(TlsCipherFactory cipherFactory)
- {
- this.mCipherFactory = cipherFactory;
- }
-
- protected virtual bool AllowEncryptThenMac
- {
- get { return true; }
- }
-
- protected virtual bool AllowTruncatedHMac
- {
- get { return false; }
- }
-
- protected virtual IDictionary CheckServerExtensions()
- {
- return this.mServerExtensions = TlsExtensionsUtilities.EnsureExtensionsInitialised(this.mServerExtensions);
- }
-
- protected abstract int[] GetCipherSuites();
-
- protected byte[] GetCompressionMethods()
- {
- return new byte[] { CompressionMethod.cls_null };
- }
-
- protected virtual ProtocolVersion MaximumVersion
- {
- get { return ProtocolVersion.TLSv11; }
- }
-
- protected virtual ProtocolVersion MinimumVersion
- {
- get { return ProtocolVersion.TLSv10; }
- }
-
- protected virtual bool SupportsClientEccCapabilities(int[] namedCurves, byte[] ecPointFormats)
- {
- // NOTE: BC supports all the current set of point formats so we don't check them here
-
- if (namedCurves == null)
- {
- /*
- * RFC 4492 4. A client that proposes ECC cipher suites may choose not to include these
- * extensions. In this case, the server is free to choose any one of the elliptic curves
- * or point formats [...].
- */
- return TlsEccUtilities.HasAnySupportedNamedCurves();
- }
-
- for (int i = 0; i < namedCurves.Length; ++i)
- {
- int namedCurve = namedCurves[i];
- if (NamedCurve.IsValid(namedCurve)
- && (!NamedCurve.RefersToASpecificNamedCurve(namedCurve) || TlsEccUtilities.IsSupportedNamedCurve(namedCurve)))
- {
- return true;
- }
- }
-
- return false;
- }
-
- public virtual void Init(TlsServerContext context)
- {
- this.mContext = context;
- }
-
- public virtual void NotifyClientVersion(ProtocolVersion clientVersion)
- {
- this.mClientVersion = clientVersion;
- }
-
- public virtual void NotifyFallback(bool isFallback)
- {
- /*
- * RFC 7507 3. If TLS_FALLBACK_SCSV appears in ClientHello.cipher_suites and the highest
- * protocol version supported by the server is higher than the version indicated in
- * ClientHello.client_version, the server MUST respond with a fatal inappropriate_fallback
- * alert [..].
- */
- if (isFallback && MaximumVersion.IsLaterVersionOf(mClientVersion))
- throw new TlsFatalAlert(AlertDescription.inappropriate_fallback);
- }
-
- public virtual void NotifyOfferedCipherSuites(int[] offeredCipherSuites)
- {
- this.mOfferedCipherSuites = offeredCipherSuites;
- this.mEccCipherSuitesOffered = TlsEccUtilities.ContainsEccCipherSuites(this.mOfferedCipherSuites);
- }
-
- public virtual void NotifyOfferedCompressionMethods(byte[] offeredCompressionMethods)
- {
- this.mOfferedCompressionMethods = offeredCompressionMethods;
- }
-
- public virtual void ProcessClientExtensions(IDictionary clientExtensions)
- {
- this.mClientExtensions = clientExtensions;
-
- if (clientExtensions != null)
- {
- this.mEncryptThenMacOffered = TlsExtensionsUtilities.HasEncryptThenMacExtension(clientExtensions);
-
- this.mMaxFragmentLengthOffered = TlsExtensionsUtilities.GetMaxFragmentLengthExtension(clientExtensions);
- if (mMaxFragmentLengthOffered >= 0 && !MaxFragmentLength.IsValid((byte)mMaxFragmentLengthOffered))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- this.mTruncatedHMacOffered = TlsExtensionsUtilities.HasTruncatedHMacExtension(clientExtensions);
-
- this.mSupportedSignatureAlgorithms = TlsUtilities.GetSignatureAlgorithmsExtension(clientExtensions);
- if (this.mSupportedSignatureAlgorithms != null)
- {
- /*
- * RFC 5246 7.4.1.4.1. Note: this extension is not meaningful for TLS versions prior
- * to 1.2. Clients MUST NOT offer it if they are offering prior versions.
- */
- if (!TlsUtilities.IsSignatureAlgorithmsExtensionAllowed(mClientVersion))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- this.mNamedCurves = TlsEccUtilities.GetSupportedEllipticCurvesExtension(clientExtensions);
- this.mClientECPointFormats = TlsEccUtilities.GetSupportedPointFormatsExtension(clientExtensions);
- }
-
- /*
- * RFC 4429 4. The client MUST NOT include these extensions in the ClientHello message if it
- * does not propose any ECC cipher suites.
- *
- * NOTE: This was overly strict as there may be ECC cipher suites that we don't recognize.
- * Also, draft-ietf-tls-negotiated-ff-dhe will be overloading the 'elliptic_curves'
- * extension to explicitly allow FFDHE (i.e. non-ECC) groups.
- */
- //if (!this.mEccCipherSuitesOffered && (this.mNamedCurves != null || this.mClientECPointFormats != null))
- // throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- public virtual ProtocolVersion GetServerVersion()
- {
- if (MinimumVersion.IsEqualOrEarlierVersionOf(mClientVersion))
- {
- ProtocolVersion maximumVersion = MaximumVersion;
- if (mClientVersion.IsEqualOrEarlierVersionOf(maximumVersion))
- {
- return mServerVersion = mClientVersion;
- }
- if (mClientVersion.IsLaterVersionOf(maximumVersion))
- {
- return mServerVersion = maximumVersion;
- }
- }
- throw new TlsFatalAlert(AlertDescription.protocol_version);
- }
-
- public virtual int GetSelectedCipherSuite()
- {
- /*
- * RFC 5246 7.4.3. In order to negotiate correctly, the server MUST check any candidate
- * cipher suites against the "signature_algorithms" extension before selecting them. This is
- * somewhat inelegant but is a compromise designed to minimize changes to the original
- * cipher suite design.
- */
- IList sigAlgs = TlsUtilities.GetUsableSignatureAlgorithms(this.mSupportedSignatureAlgorithms);
-
- /*
- * RFC 4429 5.1. A server that receives a ClientHello containing one or both of these
- * extensions MUST use the client's enumerated capabilities to guide its selection of an
- * appropriate cipher suite. One of the proposed ECC cipher suites must be negotiated only
- * if the server can successfully complete the handshake while using the curves and point
- * formats supported by the client [...].
- */
- bool eccCipherSuitesEnabled = SupportsClientEccCapabilities(this.mNamedCurves, this.mClientECPointFormats);
-
- int[] cipherSuites = GetCipherSuites();
- for (int i = 0; i < cipherSuites.Length; ++i)
- {
- int cipherSuite = cipherSuites[i];
-
- if (Arrays.Contains(this.mOfferedCipherSuites, cipherSuite)
- && (eccCipherSuitesEnabled || !TlsEccUtilities.IsEccCipherSuite(cipherSuite))
- && TlsUtilities.IsValidCipherSuiteForVersion(cipherSuite, mServerVersion)
- && TlsUtilities.IsValidCipherSuiteForSignatureAlgorithms(cipherSuite, sigAlgs))
- {
- return this.mSelectedCipherSuite = cipherSuite;
- }
- }
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
- }
-
- public virtual byte GetSelectedCompressionMethod()
- {
- byte[] compressionMethods = GetCompressionMethods();
- for (int i = 0; i < compressionMethods.Length; ++i)
- {
- if (Arrays.Contains(mOfferedCompressionMethods, compressionMethods[i]))
- {
- return this.mSelectedCompressionMethod = compressionMethods[i];
- }
- }
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
- }
-
- // IDictionary is (Int32 -> byte[])
- public virtual IDictionary GetServerExtensions()
- {
- if (this.mEncryptThenMacOffered && AllowEncryptThenMac)
- {
- /*
- * RFC 7366 3. If a server receives an encrypt-then-MAC request extension from a client
- * and then selects a stream or Authenticated Encryption with Associated Data (AEAD)
- * ciphersuite, it MUST NOT send an encrypt-then-MAC response extension back to the
- * client.
- */
- if (TlsUtilities.IsBlockCipherSuite(this.mSelectedCipherSuite))
- {
- TlsExtensionsUtilities.AddEncryptThenMacExtension(CheckServerExtensions());
- }
- }
-
- if (this.mMaxFragmentLengthOffered >= 0
- && TlsUtilities.IsValidUint8(mMaxFragmentLengthOffered)
- && MaxFragmentLength.IsValid((byte)mMaxFragmentLengthOffered))
- {
- TlsExtensionsUtilities.AddMaxFragmentLengthExtension(CheckServerExtensions(), (byte)mMaxFragmentLengthOffered);
- }
-
- if (this.mTruncatedHMacOffered && AllowTruncatedHMac)
- {
- TlsExtensionsUtilities.AddTruncatedHMacExtension(CheckServerExtensions());
- }
-
- if (this.mClientECPointFormats != null && TlsEccUtilities.IsEccCipherSuite(this.mSelectedCipherSuite))
- {
- /*
- * RFC 4492 5.2. A server that selects an ECC cipher suite in response to a ClientHello
- * message including a Supported Point Formats Extension appends this extension (along
- * with others) to its ServerHello message, enumerating the point formats it can parse.
- */
- this.mServerECPointFormats = new byte[]{ ECPointFormat.uncompressed,
- ECPointFormat.ansiX962_compressed_prime, ECPointFormat.ansiX962_compressed_char2, };
-
- TlsEccUtilities.AddSupportedPointFormatsExtension(CheckServerExtensions(), mServerECPointFormats);
- }
-
- return mServerExtensions;
- }
-
- public virtual IList GetServerSupplementalData()
- {
- return null;
- }
-
- public abstract TlsCredentials GetCredentials();
-
- public virtual CertificateStatus GetCertificateStatus()
- {
- return null;
- }
-
- public abstract TlsKeyExchange GetKeyExchange();
-
- public virtual CertificateRequest GetCertificateRequest()
- {
- return null;
- }
-
- public virtual void ProcessClientSupplementalData(IList clientSupplementalData)
- {
- if (clientSupplementalData != null)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- public virtual void NotifyClientCertificate(Certificate clientCertificate)
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public override TlsCompression GetCompression()
- {
- switch (mSelectedCompressionMethod)
- {
- case CompressionMethod.cls_null:
- return new TlsNullCompression();
-
- default:
- /*
- * Note: internal error here; we selected the compression method, so if we now can't
- * produce an implementation, we shouldn't have chosen it!
- */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public override TlsCipher GetCipher()
- {
- int encryptionAlgorithm = TlsUtilities.GetEncryptionAlgorithm(mSelectedCipherSuite);
- int macAlgorithm = TlsUtilities.GetMacAlgorithm(mSelectedCipherSuite);
-
- return mCipherFactory.CreateCipher(mContext, encryptionAlgorithm, macAlgorithm);
- }
-
- public virtual NewSessionTicket GetNewSessionTicket()
- {
- /*
- * RFC 5077 3.3. If the server determines that it does not want to include a ticket after it
- * has included the SessionTicket extension in the ServerHello, then it sends a zero-length
- * ticket in the NewSessionTicket handshake message.
- */
- return new NewSessionTicket(0L, TlsUtilities.EmptyBytes);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AbstractTlsSigner.cs b/BCCrypto/src/crypto/tls/AbstractTlsSigner.cs
deleted file mode 100644
index 1f4aabf..0000000
--- a/BCCrypto/src/crypto/tls/AbstractTlsSigner.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class AbstractTlsSigner
- : TlsSigner
- {
- protected TlsContext mContext;
-
- public virtual void Init(TlsContext context)
- {
- this.mContext = context;
- }
-
- public virtual byte[] GenerateRawSignature(AsymmetricKeyParameter privateKey, byte[] md5AndSha1)
- {
- return GenerateRawSignature(null, privateKey, md5AndSha1);
- }
-
- public abstract byte[] GenerateRawSignature(SignatureAndHashAlgorithm algorithm,
- AsymmetricKeyParameter privateKey, byte[] hash);
-
- public virtual bool VerifyRawSignature(byte[] sigBytes, AsymmetricKeyParameter publicKey, byte[] md5AndSha1)
- {
- return VerifyRawSignature(null, sigBytes, publicKey, md5AndSha1);
- }
-
- public abstract bool VerifyRawSignature(SignatureAndHashAlgorithm algorithm, byte[] sigBytes,
- AsymmetricKeyParameter publicKey, byte[] hash);
-
- public virtual ISigner CreateSigner(AsymmetricKeyParameter privateKey)
- {
- return CreateSigner(null, privateKey);
- }
-
- public abstract ISigner CreateSigner(SignatureAndHashAlgorithm algorithm, AsymmetricKeyParameter privateKey);
-
- public virtual ISigner CreateVerifyer(AsymmetricKeyParameter publicKey)
- {
- return CreateVerifyer(null, publicKey);
- }
-
- public abstract ISigner CreateVerifyer(SignatureAndHashAlgorithm algorithm, AsymmetricKeyParameter publicKey);
-
- public abstract bool IsValidPublicKey(AsymmetricKeyParameter publicKey);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AbstractTlsSignerCredentials.cs b/BCCrypto/src/crypto/tls/AbstractTlsSignerCredentials.cs
deleted file mode 100644
index 886c46c..0000000
--- a/BCCrypto/src/crypto/tls/AbstractTlsSignerCredentials.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class AbstractTlsSignerCredentials
- : AbstractTlsCredentials, TlsSignerCredentials
- {
- ///
- public abstract byte[] GenerateCertificateSignature(byte[] hash);
-
- public virtual SignatureAndHashAlgorithm SignatureAndHashAlgorithm
- {
- get
- {
- throw new InvalidOperationException("TlsSignerCredentials implementation does not support (D)TLS 1.2+");
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AlertDescription.cs b/BCCrypto/src/crypto/tls/AlertDescription.cs
deleted file mode 100644
index 4e2464b..0000000
--- a/BCCrypto/src/crypto/tls/AlertDescription.cs
+++ /dev/null
@@ -1,304 +0,0 @@
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// RFC 5246 7.2
- ///
- public abstract class AlertDescription
- {
- /**
- * This message notifies the recipient that the sender will not send any more messages on this
- * connection. Note that as of TLS 1.1, failure to properly close a connection no longer
- * requires that a session not be resumed. This is a change from TLS 1.0 ("The session becomes
- * unresumable if any connection is terminated without proper close_notify messages with level
- * equal to warning.") to conform with widespread implementation practice.
- */
- public const byte close_notify = 0;
-
- /**
- * An inappropriate message was received. This alert is always fatal and should never be
- * observed in communication between proper implementations.
- */
- public const byte unexpected_message = 10;
-
- /**
- * This alert is returned if a record is received with an incorrect MAC. This alert also MUST be
- * returned if an alert is sent because a TLSCiphertext decrypted in an invalid way: either it
- * wasn't an even multiple of the block length, or its padding values, when checked, weren't
- * correct. This message is always fatal and should never be observed in communication between
- * proper implementations (except when messages were corrupted in the network).
- */
- public const byte bad_record_mac = 20;
-
- /**
- * This alert was used in some earlier versions of TLS, and may have permitted certain attacks
- * against the CBC mode [CBCATT]. It MUST NOT be sent by compliant implementations.
- */
- public const byte decryption_failed = 21;
-
- /**
- * A TLSCiphertext record was received that had a length more than 2^14+2048 bytes, or a record
- * decrypted to a TLSCompressed record with more than 2^14+1024 bytes. This message is always
- * fatal and should never be observed in communication between proper implementations (except
- * when messages were corrupted in the network).
- */
- public const byte record_overflow = 22;
-
- /**
- * The decompression function received improper input (e.g., data that would expand to excessive
- * length). This message is always fatal and should never be observed in communication between
- * proper implementations.
- */
- public const byte decompression_failure = 30;
-
- /**
- * Reception of a handshake_failure alert message indicates that the sender was unable to
- * negotiate an acceptable set of security parameters given the options available. This is a
- * fatal error.
- */
- public const byte handshake_failure = 40;
-
- /**
- * This alert was used in SSLv3 but not any version of TLS. It MUST NOT be sent by compliant
- * implementations.
- */
- public const byte no_certificate = 41;
-
- /**
- * A certificate was corrupt, contained signatures that did not verify correctly, etc.
- */
- public const byte bad_certificate = 42;
-
- /**
- * A certificate was of an unsupported type.
- */
- public const byte unsupported_certificate = 43;
-
- /**
- * A certificate was revoked by its signer.
- */
- public const byte certificate_revoked = 44;
-
- /**
- * A certificate has expired or is not currently valid.
- */
- public const byte certificate_expired = 45;
-
- /**
- * Some other (unspecified) issue arose in processing the certificate, rendering it
- * unacceptable.
- */
- public const byte certificate_unknown = 46;
-
- /**
- * A field in the handshake was out of range or inconsistent with other fields. This message is
- * always fatal.
- */
- public const byte illegal_parameter = 47;
-
- /**
- * A valid certificate chain or partial chain was received, but the certificate was not accepted
- * because the CA certificate could not be located or couldn't be matched with a known, trusted
- * CA. This message is always fatal.
- */
- public const byte unknown_ca = 48;
-
- /**
- * A valid certificate was received, but when access control was applied, the sender decided not
- * to proceed with negotiation. This message is always fatal.
- */
- public const byte access_denied = 49;
-
- /**
- * A message could not be decoded because some field was out of the specified range or the
- * length of the message was incorrect. This message is always fatal and should never be
- * observed in communication between proper implementations (except when messages were corrupted
- * in the network).
- */
- public const byte decode_error = 50;
-
- /**
- * A handshake cryptographic operation failed, including being unable to correctly verify a
- * signature or validate a Finished message. This message is always fatal.
- */
- public const byte decrypt_error = 51;
-
- /**
- * This alert was used in some earlier versions of TLS. It MUST NOT be sent by compliant
- * implementations.
- */
- public const byte export_restriction = 60;
-
- /**
- * The protocol version the client has attempted to negotiate is recognized but not supported.
- * (For example, old protocol versions might be avoided for security reasons.) This message is
- * always fatal.
- */
- public const byte protocol_version = 70;
-
- /**
- * Returned instead of handshake_failure when a negotiation has failed specifically because the
- * server requires ciphers more secure than those supported by the client. This message is
- * always fatal.
- */
- public const byte insufficient_security = 71;
-
- /**
- * An internal error unrelated to the peer or the correctness of the protocol (such as a memory
- * allocation failure) makes it impossible to continue. This message is always fatal.
- */
- public const byte internal_error = 80;
-
- /**
- * This handshake is being canceled for some reason unrelated to a protocol failure. If the user
- * cancels an operation after the handshake is complete, just closing the connection by sending
- * a close_notify is more appropriate. This alert should be followed by a close_notify. This
- * message is generally a warning.
- */
- public const byte user_canceled = 90;
-
- /**
- * Sent by the client in response to a hello request or by the server in response to a client
- * hello after initial handshaking. Either of these would normally lead to renegotiation; when
- * that is not appropriate, the recipient should respond with this alert. At that point, the
- * original requester can decide whether to proceed with the connection. One case where this
- * would be appropriate is where a server has spawned a process to satisfy a request; the
- * process might receive security parameters (key length, authentication, etc.) at startup, and
- * it might be difficult to communicate changes to these parameters after that point. This
- * message is always a warning.
- */
- public const byte no_renegotiation = 100;
-
- /**
- * Sent by clients that receive an extended server hello containing an extension that they did
- * not put in the corresponding client hello. This message is always fatal.
- */
- public const byte unsupported_extension = 110;
-
- /*
- * RFC 3546
- */
-
- /**
- * This alert is sent by servers who are unable to retrieve a certificate chain from the URL
- * supplied by the client (see Section 3.3). This message MAY be fatal - for example if client
- * authentication is required by the server for the handshake to continue and the server is
- * unable to retrieve the certificate chain, it may send a fatal alert.
- */
- public const byte certificate_unobtainable = 111;
-
- /**
- * This alert is sent by servers that receive a server_name extension request, but do not
- * recognize the server name. This message MAY be fatal.
- */
- public const byte unrecognized_name = 112;
-
- /**
- * This alert is sent by clients that receive an invalid certificate status response (see
- * Section 3.6). This message is always fatal.
- */
- public const byte bad_certificate_status_response = 113;
-
- /**
- * This alert is sent by servers when a certificate hash does not match a client provided
- * certificate_hash. This message is always fatal.
- */
- public const byte bad_certificate_hash_value = 114;
-
- /*
- * RFC 4279
- */
-
- /**
- * If the server does not recognize the PSK identity, it MAY respond with an
- * "unknown_psk_identity" alert message.
- */
- public const byte unknown_psk_identity = 115;
-
- /*
- * RFC 7507
- */
-
- /**
- * If TLS_FALLBACK_SCSV appears in ClientHello.cipher_suites and the highest protocol version
- * supported by the server is higher than the version indicated in ClientHello.client_version,
- * the server MUST respond with a fatal inappropriate_fallback alert [..].
- */
- public const byte inappropriate_fallback = 86;
-
- public static string GetName(byte alertDescription)
- {
- switch (alertDescription)
- {
- case close_notify:
- return "close_notify";
- case unexpected_message:
- return "unexpected_message";
- case bad_record_mac:
- return "bad_record_mac";
- case decryption_failed:
- return "decryption_failed";
- case record_overflow:
- return "record_overflow";
- case decompression_failure:
- return "decompression_failure";
- case handshake_failure:
- return "handshake_failure";
- case no_certificate:
- return "no_certificate";
- case bad_certificate:
- return "bad_certificate";
- case unsupported_certificate:
- return "unsupported_certificate";
- case certificate_revoked:
- return "certificate_revoked";
- case certificate_expired:
- return "certificate_expired";
- case certificate_unknown:
- return "certificate_unknown";
- case illegal_parameter:
- return "illegal_parameter";
- case unknown_ca:
- return "unknown_ca";
- case access_denied:
- return "access_denied";
- case decode_error:
- return "decode_error";
- case decrypt_error:
- return "decrypt_error";
- case export_restriction:
- return "export_restriction";
- case protocol_version:
- return "protocol_version";
- case insufficient_security:
- return "insufficient_security";
- case internal_error:
- return "internal_error";
- case user_canceled:
- return "user_canceled";
- case no_renegotiation:
- return "no_renegotiation";
- case unsupported_extension:
- return "unsupported_extension";
- case certificate_unobtainable:
- return "certificate_unobtainable";
- case unrecognized_name:
- return "unrecognized_name";
- case bad_certificate_status_response:
- return "bad_certificate_status_response";
- case bad_certificate_hash_value:
- return "bad_certificate_hash_value";
- case unknown_psk_identity:
- return "unknown_psk_identity";
- case inappropriate_fallback:
- return "inappropriate_fallback";
- default:
- return "UNKNOWN";
- }
- }
-
- public static string GetText(byte alertDescription)
- {
- return GetName(alertDescription) + "(" + alertDescription + ")";
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/AlertLevel.cs b/BCCrypto/src/crypto/tls/AlertLevel.cs
deleted file mode 100644
index 9461a0b..0000000
--- a/BCCrypto/src/crypto/tls/AlertLevel.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// RFC 5246 7.2
- ///
- public abstract class AlertLevel
- {
- public const byte warning = 1;
- public const byte fatal = 2;
-
- public static string GetName(byte alertDescription)
- {
- switch (alertDescription)
- {
- case warning:
- return "warning";
- case fatal:
- return "fatal";
- default:
- return "UNKNOWN";
- }
- }
-
- public static string GetText(byte alertDescription)
- {
- return GetName(alertDescription) + "(" + alertDescription + ")";
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/BasicTlsPskIdentity.cs b/BCCrypto/src/crypto/tls/BasicTlsPskIdentity.cs
deleted file mode 100644
index db59544..0000000
--- a/BCCrypto/src/crypto/tls/BasicTlsPskIdentity.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class BasicTlsPskIdentity
- : TlsPskIdentity
- {
- protected byte[] mIdentity;
- protected byte[] mPsk;
-
- public BasicTlsPskIdentity(byte[] identity, byte[] psk)
- {
- this.mIdentity = Arrays.Clone(identity);
- this.mPsk = Arrays.Clone(psk);
- }
-
- public BasicTlsPskIdentity(string identity, byte[] psk)
- {
- this.mIdentity = Strings.ToUtf8ByteArray(identity);
- this.mPsk = Arrays.Clone(psk);
- }
-
- public virtual void SkipIdentityHint()
- {
- }
-
- public virtual void NotifyIdentityHint(byte[] psk_identity_hint)
- {
- }
-
- public virtual byte[] GetPskIdentity()
- {
- return mIdentity;
- }
-
- public virtual byte[] GetPsk()
- {
- return mPsk;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/BulkCipherAlgorithm.cs b/BCCrypto/src/crypto/tls/BulkCipherAlgorithm.cs
deleted file mode 100644
index 07ff8dc..0000000
--- a/BCCrypto/src/crypto/tls/BulkCipherAlgorithm.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// RFC 2246
- ///
- /// Note that the values here are implementation-specific and arbitrary. It is recommended not to
- /// depend on the particular values (e.g. serialization).
- ///
- public abstract class BulkCipherAlgorithm
- {
- public const int cls_null = 0;
- public const int rc4 = 1;
- public const int rc2 = 2;
- public const int des = 3;
- public const int cls_3des = 4;
- public const int des40 = 5;
-
- /*
- * RFC 4346
- */
- public const int aes = 6;
- public const int idea = 7;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ByteQueue.cs b/BCCrypto/src/crypto/tls/ByteQueue.cs
deleted file mode 100644
index b4df685..0000000
--- a/BCCrypto/src/crypto/tls/ByteQueue.cs
+++ /dev/null
@@ -1,211 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// A queue for bytes.
- ///
- /// This file could be more optimized.
- ///
- ///
- public class ByteQueue
- {
- /// The smallest number which can be written as 2^x which is bigger than i.
- public static int NextTwoPow(
- int i)
- {
- /*
- * This code is based of a lot of code I found on the Internet
- * which mostly referenced a book called "Hacking delight".
- *
- */
- i |= (i >> 1);
- i |= (i >> 2);
- i |= (i >> 4);
- i |= (i >> 8);
- i |= (i >> 16);
- return i + 1;
- }
-
- /**
- * The initial size for our buffer.
- */
- private const int DefaultCapacity = 1024;
-
- /**
- * The buffer where we store our data.
- */
- private byte[] databuf;
-
- /**
- * How many bytes at the beginning of the buffer are skipped.
- */
- private int skipped = 0;
-
- /**
- * How many bytes in the buffer are valid data.
- */
- private int available = 0;
-
- private bool readOnlyBuf = false;
-
- public ByteQueue()
- : this(DefaultCapacity)
- {
- }
-
- public ByteQueue(int capacity)
- {
- this.databuf = capacity == 0 ? TlsUtilities.EmptyBytes : new byte[capacity];
- }
-
- public ByteQueue(byte[] buf, int off, int len)
- {
- this.databuf = buf;
- this.skipped = off;
- this.available = len;
- this.readOnlyBuf = true;
- }
-
- /// Add some data to our buffer.
- /// A byte-array to read data from.
- /// How many bytes to skip at the beginning of the array.
- /// How many bytes to read from the array.
- public void AddData(
- byte[] data,
- int offset,
- int len)
- {
- if (readOnlyBuf)
- throw new InvalidOperationException("Cannot add data to read-only buffer");
-
- if ((skipped + available + len) > databuf.Length)
- {
- int desiredSize = ByteQueue.NextTwoPow(available + len);
- if (desiredSize > databuf.Length)
- {
- byte[] tmp = new byte[desiredSize];
- Array.Copy(databuf, skipped, tmp, 0, available);
- databuf = tmp;
- }
- else
- {
- Array.Copy(databuf, skipped, databuf, 0, available);
- }
- skipped = 0;
- }
-
- Array.Copy(data, offset, databuf, skipped + available, len);
- available += len;
- }
-
- /// The number of bytes which are available in this buffer.
- public int Available
- {
- get { return available; }
- }
-
- /// Copy some bytes from the beginning of the data to the provided Stream .
- /// The Stream to copy the bytes to.
- /// How many bytes to copy.
- /// If insufficient data is available.
- /// If there is a problem copying the data.
- public void CopyTo(Stream output, int length)
- {
- if (length > available)
- throw new InvalidOperationException("Cannot copy " + length + " bytes, only got " + available);
-
- output.Write(databuf, skipped, length);
- }
-
- /// Read data from the buffer.
- /// The buffer where the read data will be copied to.
- /// How many bytes to skip at the beginning of buf.
- /// How many bytes to read at all.
- /// How many bytes from our data to skip.
- public void Read(
- byte[] buf,
- int offset,
- int len,
- int skip)
- {
- if ((buf.Length - offset) < len)
- {
- throw new ArgumentException("Buffer size of " + buf.Length + " is too small for a read of " + len + " bytes");
- }
- if ((available - skip) < len)
- {
- throw new InvalidOperationException("Not enough data to read");
- }
- Array.Copy(databuf, skipped + skip, buf, offset, len);
- }
-
- /// Return a MemoryStream over some bytes at the beginning of the data.
- /// How many bytes will be readable.
- /// A MemoryStream over the data.
- /// If insufficient data is available.
- public MemoryStream ReadFrom(int length)
- {
- if (length > available)
- throw new InvalidOperationException("Cannot read " + length + " bytes, only got " + available);
-
- int position = skipped;
-
- available -= length;
- skipped += length;
-
- return new MemoryStream(databuf, position, length, false);
- }
-
- /// Remove some bytes from our data from the beginning.
- /// How many bytes to remove.
- public void RemoveData(
- int i)
- {
- if (i > available)
- {
- throw new InvalidOperationException("Cannot remove " + i + " bytes, only got " + available);
- }
-
- /*
- * Skip the data.
- */
- available -= i;
- skipped += i;
- }
-
- public void RemoveData(byte[] buf, int off, int len, int skip)
- {
- Read(buf, off, len, skip);
- RemoveData(skip + len);
- }
-
- public byte[] RemoveData(int len, int skip)
- {
- byte[] buf = new byte[len];
- RemoveData(buf, 0, len, skip);
- return buf;
- }
-
- public void Shrink()
- {
- if (available == 0)
- {
- databuf = TlsUtilities.EmptyBytes;
- skipped = 0;
- }
- else
- {
- int desiredSize = ByteQueue.NextTwoPow(available);
- if (desiredSize < databuf.Length)
- {
- byte[] tmp = new byte[desiredSize];
- Array.Copy(databuf, skipped, tmp, 0, available);
- databuf = tmp;
- skipped = 0;
- }
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ByteQueueStream.cs b/BCCrypto/src/crypto/tls/ByteQueueStream.cs
deleted file mode 100644
index 249e609..0000000
--- a/BCCrypto/src/crypto/tls/ByteQueueStream.cs
+++ /dev/null
@@ -1,110 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class ByteQueueStream
- : Stream
- {
- private readonly ByteQueue buffer;
-
- public ByteQueueStream()
- {
- this.buffer = new ByteQueue();
- }
-
- public virtual int Available
- {
- get { return buffer.Available; }
- }
-
- public override bool CanRead
- {
- get { return true; }
- }
-
- public override bool CanSeek
- {
- get { return false; }
- }
-
- public override bool CanWrite
- {
- get { return true; }
- }
-
- public override void Flush()
- {
- }
-
- public override long Length
- {
- get { throw new NotSupportedException(); }
- }
-
- public virtual int Peek(byte[] buf)
- {
- int bytesToRead = System.Math.Min(buffer.Available, buf.Length);
- buffer.Read(buf, 0, bytesToRead, 0);
- return bytesToRead;
- }
-
- public override long Position
- {
- get { throw new NotSupportedException(); }
- set { throw new NotSupportedException(); }
- }
-
- public virtual int Read(byte[] buf)
- {
- return Read(buf, 0, buf.Length);
- }
-
- public override int Read(byte[] buf, int off, int len)
- {
- int bytesToRead = System.Math.Min(buffer.Available, len);
- buffer.RemoveData(buf, off, bytesToRead, 0);
- return bytesToRead;
- }
-
- public override int ReadByte()
- {
- if (buffer.Available == 0)
- return -1;
-
- return buffer.RemoveData(1, 0)[0] & 0xFF;
- }
-
- public override long Seek(long offset, SeekOrigin origin)
- {
- throw new NotSupportedException();
- }
-
- public override void SetLength(long value)
- {
- throw new NotSupportedException();
- }
-
- public virtual int Skip(int n)
- {
- int bytesToSkip = System.Math.Min(buffer.Available, n);
- buffer.RemoveData(bytesToSkip);
- return bytesToSkip;
- }
-
- public virtual void Write(byte[] buf)
- {
- buffer.AddData(buf, 0, buf.Length);
- }
-
- public override void Write(byte[] buf, int off, int len)
- {
- buffer.AddData(buf, off, len);
- }
-
- public override void WriteByte(byte b)
- {
- buffer.AddData(new byte[]{ b }, 0, 1);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/CertChainType.cs b/BCCrypto/src/crypto/tls/CertChainType.cs
deleted file mode 100644
index cbb1834..0000000
--- a/BCCrypto/src/crypto/tls/CertChainType.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /*
- * RFC 3546 3.3.
- */
- public abstract class CertChainType
- {
- public const byte individual_certs = 0;
- public const byte pkipath = 1;
-
- public static bool IsValid(byte certChainType)
- {
- return certChainType >= individual_certs && certChainType <= pkipath;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/Certificate.cs b/BCCrypto/src/crypto/tls/Certificate.cs
deleted file mode 100644
index e047999..0000000
--- a/BCCrypto/src/crypto/tls/Certificate.cs
+++ /dev/null
@@ -1,136 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * Parsing and encoding of a Certificate struct from RFC 4346.
- *
- *
- * opaque ASN.1Cert<2^24-1>;
- *
- * struct {
- * ASN.1Cert certificate_list<0..2^24-1>;
- * } Certificate;
- *
- *
- * @see Org.BouncyCastle.Asn1.X509.X509CertificateStructure
- */
- public class Certificate
- {
- public static readonly Certificate EmptyChain = new Certificate(new X509CertificateStructure[0]);
-
- /**
- * The certificates.
- */
- protected readonly X509CertificateStructure[] mCertificateList;
-
- public Certificate(X509CertificateStructure[] certificateList)
- {
- if (certificateList == null)
- throw new ArgumentNullException("certificateList");
-
- this.mCertificateList = certificateList;
- }
-
- /**
- * @return an array of {@link org.bouncycastle.asn1.x509.Certificate} representing a certificate
- * chain.
- */
- public virtual X509CertificateStructure[] GetCertificateList()
- {
- return CloneCertificateList();
- }
-
- public virtual X509CertificateStructure GetCertificateAt(int index)
- {
- return mCertificateList[index];
- }
-
- public virtual int Length
- {
- get { return mCertificateList.Length; }
- }
-
- /**
- * @return true if this certificate chain contains no certificates, or
- * false otherwise.
- */
- public virtual bool IsEmpty
- {
- get { return mCertificateList.Length == 0; }
- }
-
- /**
- * Encode this {@link Certificate} to a {@link Stream}.
- *
- * @param output the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- IList derEncodings = Platform.CreateArrayList(mCertificateList.Length);
-
- int totalLength = 0;
- foreach (Asn1Encodable asn1Cert in mCertificateList)
- {
- byte[] derEncoding = asn1Cert.GetEncoded(Asn1Encodable.Der);
- derEncodings.Add(derEncoding);
- totalLength += derEncoding.Length + 3;
- }
-
- TlsUtilities.CheckUint24(totalLength);
- TlsUtilities.WriteUint24(totalLength, output);
-
- foreach (byte[] derEncoding in derEncodings)
- {
- TlsUtilities.WriteOpaque24(derEncoding, output);
- }
- }
-
- /**
- * Parse a {@link Certificate} from a {@link Stream}.
- *
- * @param input the {@link Stream} to parse from.
- * @return a {@link Certificate} object.
- * @throws IOException
- */
- public static Certificate Parse(Stream input)
- {
- int totalLength = TlsUtilities.ReadUint24(input);
- if (totalLength == 0)
- {
- return EmptyChain;
- }
-
- byte[] certListData = TlsUtilities.ReadFully(totalLength, input);
-
- MemoryStream buf = new MemoryStream(certListData, false);
-
- IList certificate_list = Platform.CreateArrayList();
- while (buf.Position < buf.Length)
- {
- byte[] berEncoding = TlsUtilities.ReadOpaque24(buf);
- Asn1Object asn1Cert = TlsUtilities.ReadAsn1Object(berEncoding);
- certificate_list.Add(X509CertificateStructure.GetInstance(asn1Cert));
- }
-
- X509CertificateStructure[] certificateList = new X509CertificateStructure[certificate_list.Count];
- for (int i = 0; i < certificate_list.Count; ++i)
- {
- certificateList[i] = (X509CertificateStructure)certificate_list[i];
- }
- return new Certificate(certificateList);
- }
-
- protected virtual X509CertificateStructure[] CloneCertificateList()
- {
- return (X509CertificateStructure[])mCertificateList.Clone();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/CertificateRequest.cs b/BCCrypto/src/crypto/tls/CertificateRequest.cs
deleted file mode 100644
index f3dcb3b..0000000
--- a/BCCrypto/src/crypto/tls/CertificateRequest.cs
+++ /dev/null
@@ -1,156 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * Parsing and encoding of a CertificateRequest struct from RFC 4346.
- *
- *
- * struct {
- * ClientCertificateType certificate_types<1..2^8-1>;
- * DistinguishedName certificate_authorities<3..2^16-1>
- * } CertificateRequest;
- *
- *
- * @see ClientCertificateType
- * @see X509Name
- */
- public class CertificateRequest
- {
- protected readonly byte[] mCertificateTypes;
- protected readonly IList mSupportedSignatureAlgorithms;
- protected readonly IList mCertificateAuthorities;
-
- /**
- * @param certificateTypes see {@link ClientCertificateType} for valid constants.
- * @param certificateAuthorities an {@link IList} of {@link X509Name}.
- */
- public CertificateRequest(byte[] certificateTypes, IList supportedSignatureAlgorithms,
- IList certificateAuthorities)
- {
- this.mCertificateTypes = certificateTypes;
- this.mSupportedSignatureAlgorithms = supportedSignatureAlgorithms;
- this.mCertificateAuthorities = certificateAuthorities;
- }
-
- /**
- * @return an array of certificate types
- * @see {@link ClientCertificateType}
- */
- public virtual byte[] CertificateTypes
- {
- get { return mCertificateTypes; }
- }
-
- /**
- * @return an {@link IList} of {@link SignatureAndHashAlgorithm} (or null before TLS 1.2).
- */
- public virtual IList SupportedSignatureAlgorithms
- {
- get { return mSupportedSignatureAlgorithms; }
- }
-
- /**
- * @return an {@link IList} of {@link X509Name}
- */
- public virtual IList CertificateAuthorities
- {
- get { return mCertificateAuthorities; }
- }
-
- /**
- * Encode this {@link CertificateRequest} to a {@link Stream}.
- *
- * @param output the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- if (mCertificateTypes == null || mCertificateTypes.Length == 0)
- {
- TlsUtilities.WriteUint8(0, output);
- }
- else
- {
- TlsUtilities.WriteUint8ArrayWithUint8Length(mCertificateTypes, output);
- }
-
- if (mSupportedSignatureAlgorithms != null)
- {
- // TODO Check whether SignatureAlgorithm.anonymous is allowed here
- TlsUtilities.EncodeSupportedSignatureAlgorithms(mSupportedSignatureAlgorithms, false, output);
- }
-
- if (mCertificateAuthorities == null || mCertificateAuthorities.Count < 1)
- {
- TlsUtilities.WriteUint16(0, output);
- }
- else
- {
- IList derEncodings = Platform.CreateArrayList(mCertificateAuthorities.Count);
-
- int totalLength = 0;
- foreach (Asn1Encodable certificateAuthority in mCertificateAuthorities)
- {
- byte[] derEncoding = certificateAuthority.GetEncoded(Asn1Encodable.Der);
- derEncodings.Add(derEncoding);
- totalLength += derEncoding.Length + 2;
- }
-
- TlsUtilities.CheckUint16(totalLength);
- TlsUtilities.WriteUint16(totalLength, output);
-
- foreach (byte[] derEncoding in derEncodings)
- {
- TlsUtilities.WriteOpaque16(derEncoding, output);
- }
- }
- }
-
- /**
- * Parse a {@link CertificateRequest} from a {@link Stream}.
- *
- * @param context
- * the {@link TlsContext} of the current connection.
- * @param input
- * the {@link Stream} to parse from.
- * @return a {@link CertificateRequest} object.
- * @throws IOException
- */
- public static CertificateRequest Parse(TlsContext context, Stream input)
- {
- int numTypes = TlsUtilities.ReadUint8(input);
- byte[] certificateTypes = new byte[numTypes];
- for (int i = 0; i < numTypes; ++i)
- {
- certificateTypes[i] = TlsUtilities.ReadUint8(input);
- }
-
- IList supportedSignatureAlgorithms = null;
- if (TlsUtilities.IsTlsV12(context))
- {
- // TODO Check whether SignatureAlgorithm.anonymous is allowed here
- supportedSignatureAlgorithms = TlsUtilities.ParseSupportedSignatureAlgorithms(false, input);
- }
-
- IList certificateAuthorities = Platform.CreateArrayList();
- byte[] certAuthData = TlsUtilities.ReadOpaque16(input);
- MemoryStream bis = new MemoryStream(certAuthData, false);
- while (bis.Position < bis.Length)
- {
- byte[] derEncoding = TlsUtilities.ReadOpaque16(bis);
- Asn1Object asn1 = TlsUtilities.ReadDerObject(derEncoding);
- // TODO Switch to X500Name when available
- certificateAuthorities.Add(X509Name.GetInstance(asn1));
- }
-
- return new CertificateRequest(certificateTypes, supportedSignatureAlgorithms, certificateAuthorities);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/CertificateStatus.cs b/BCCrypto/src/crypto/tls/CertificateStatus.cs
deleted file mode 100644
index 0f95475..0000000
--- a/BCCrypto/src/crypto/tls/CertificateStatus.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class CertificateStatus
- {
- protected readonly byte mStatusType;
- protected readonly object mResponse;
-
- public CertificateStatus(byte statusType, object response)
- {
- if (!IsCorrectType(statusType, response))
- throw new ArgumentException("not an instance of the correct type", "response");
-
- this.mStatusType = statusType;
- this.mResponse = response;
- }
-
- public virtual byte StatusType
- {
- get { return mStatusType; }
- }
-
- public virtual object Response
- {
- get { return mResponse; }
- }
-
- public virtual OcspResponse GetOcspResponse()
- {
- if (!IsCorrectType(CertificateStatusType.ocsp, mResponse))
- throw new InvalidOperationException("'response' is not an OcspResponse");
-
- return (OcspResponse)mResponse;
- }
-
- /**
- * Encode this {@link CertificateStatus} to a {@link Stream}.
- *
- * @param output
- * the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- TlsUtilities.WriteUint8(mStatusType, output);
-
- switch (mStatusType)
- {
- case CertificateStatusType.ocsp:
- byte[] derEncoding = ((OcspResponse)mResponse).GetEncoded(Asn1Encodable.Der);
- TlsUtilities.WriteOpaque24(derEncoding, output);
- break;
- default:
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- /**
- * Parse a {@link CertificateStatus} from a {@link Stream}.
- *
- * @param input
- * the {@link Stream} to parse from.
- * @return a {@link CertificateStatus} object.
- * @throws IOException
- */
- public static CertificateStatus Parse(Stream input)
- {
- byte status_type = TlsUtilities.ReadUint8(input);
- object response;
-
- switch (status_type)
- {
- case CertificateStatusType.ocsp:
- {
- byte[] derEncoding = TlsUtilities.ReadOpaque24(input);
- response = OcspResponse.GetInstance(TlsUtilities.ReadDerObject(derEncoding));
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.decode_error);
- }
-
- return new CertificateStatus(status_type, response);
- }
-
- protected static bool IsCorrectType(byte statusType, object response)
- {
- switch (statusType)
- {
- case CertificateStatusType.ocsp:
- return response is OcspResponse;
- default:
- throw new ArgumentException("unsupported value", "statusType");
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/CertificateStatusRequest.cs b/BCCrypto/src/crypto/tls/CertificateStatusRequest.cs
deleted file mode 100644
index 9587d7d..0000000
--- a/BCCrypto/src/crypto/tls/CertificateStatusRequest.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class CertificateStatusRequest
- {
- protected readonly byte mStatusType;
- protected readonly object mRequest;
-
- public CertificateStatusRequest(byte statusType, Object request)
- {
- if (!IsCorrectType(statusType, request))
- throw new ArgumentException("not an instance of the correct type", "request");
-
- this.mStatusType = statusType;
- this.mRequest = request;
- }
-
- public virtual byte StatusType
- {
- get { return mStatusType; }
- }
-
- public virtual object Request
- {
- get { return mRequest; }
- }
-
- public virtual OcspStatusRequest GetOcspStatusRequest()
- {
- if (!IsCorrectType(CertificateStatusType.ocsp, mRequest))
- throw new InvalidOperationException("'request' is not an OCSPStatusRequest");
-
- return (OcspStatusRequest)mRequest;
- }
-
- /**
- * Encode this {@link CertificateStatusRequest} to a {@link Stream}.
- *
- * @param output
- * the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- TlsUtilities.WriteUint8(mStatusType, output);
-
- switch (mStatusType)
- {
- case CertificateStatusType.ocsp:
- ((OcspStatusRequest)mRequest).Encode(output);
- break;
- default:
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- /**
- * Parse a {@link CertificateStatusRequest} from a {@link Stream}.
- *
- * @param input
- * the {@link Stream} to parse from.
- * @return a {@link CertificateStatusRequest} object.
- * @throws IOException
- */
- public static CertificateStatusRequest Parse(Stream input)
- {
- byte status_type = TlsUtilities.ReadUint8(input);
- object result;
-
- switch (status_type)
- {
- case CertificateStatusType.ocsp:
- result = OcspStatusRequest.Parse(input);
- break;
- default:
- throw new TlsFatalAlert(AlertDescription.decode_error);
- }
-
- return new CertificateStatusRequest(status_type, result);
- }
-
- protected static bool IsCorrectType(byte statusType, object request)
- {
- switch (statusType)
- {
- case CertificateStatusType.ocsp:
- return request is OcspStatusRequest;
- default:
- throw new ArgumentException("unsupported value", "statusType");
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/CertificateStatusType.cs b/BCCrypto/src/crypto/tls/CertificateStatusType.cs
deleted file mode 100644
index 54b741b..0000000
--- a/BCCrypto/src/crypto/tls/CertificateStatusType.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class CertificateStatusType
- {
- /*
- * RFC 3546 3.6
- */
- public const byte ocsp = 1;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/CertificateType.cs b/BCCrypto/src/crypto/tls/CertificateType.cs
deleted file mode 100644
index 47ec05c..0000000
--- a/BCCrypto/src/crypto/tls/CertificateType.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * RFC 6091
- */
- public class CertificateType
- {
- public const byte X509 = 0;
- public const byte OpenPGP = 1;
-
- /*
- * RFC 7250
- */
- public const byte RawPublicKey = 2;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/CertificateUrl.cs b/BCCrypto/src/crypto/tls/CertificateUrl.cs
deleted file mode 100644
index aff9995..0000000
--- a/BCCrypto/src/crypto/tls/CertificateUrl.cs
+++ /dev/null
@@ -1,125 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /*
- * RFC 3546 3.3
- */
- public class CertificateUrl
- {
- protected readonly byte mType;
- protected readonly IList mUrlAndHashList;
-
- /**
- * @param type
- * see {@link CertChainType} for valid constants.
- * @param urlAndHashList
- * a {@link IList} of {@link UrlAndHash}.
- */
- public CertificateUrl(byte type, IList urlAndHashList)
- {
- if (!CertChainType.IsValid(type))
- throw new ArgumentException("not a valid CertChainType value", "type");
- if (urlAndHashList == null || urlAndHashList.Count < 1)
- throw new ArgumentException("must have length > 0", "urlAndHashList");
-
- this.mType = type;
- this.mUrlAndHashList = urlAndHashList;
- }
-
- /**
- * @return {@link CertChainType}
- */
- public virtual byte Type
- {
- get { return mType; }
- }
-
- /**
- * @return an {@link IList} of {@link UrlAndHash}
- */
- public virtual IList UrlAndHashList
- {
- get { return mUrlAndHashList; }
- }
-
- /**
- * Encode this {@link CertificateUrl} to a {@link Stream}.
- *
- * @param output the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- TlsUtilities.WriteUint8(this.mType, output);
-
- ListBuffer16 buf = new ListBuffer16();
- foreach (UrlAndHash urlAndHash in this.mUrlAndHashList)
- {
- urlAndHash.Encode(buf);
- }
- buf.EncodeTo(output);
- }
-
- /**
- * Parse a {@link CertificateUrl} from a {@link Stream}.
- *
- * @param context
- * the {@link TlsContext} of the current connection.
- * @param input
- * the {@link Stream} to parse from.
- * @return a {@link CertificateUrl} object.
- * @throws IOException
- */
- public static CertificateUrl parse(TlsContext context, Stream input)
- {
- byte type = TlsUtilities.ReadUint8(input);
- if (!CertChainType.IsValid(type))
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- int totalLength = TlsUtilities.ReadUint16(input);
- if (totalLength < 1)
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- byte[] urlAndHashListData = TlsUtilities.ReadFully(totalLength, input);
-
- MemoryStream buf = new MemoryStream(urlAndHashListData, false);
-
- IList url_and_hash_list = Platform.CreateArrayList();
- while (buf.Position < buf.Length)
- {
- UrlAndHash url_and_hash = UrlAndHash.Parse(context, buf);
- url_and_hash_list.Add(url_and_hash);
- }
-
- return new CertificateUrl(type, url_and_hash_list);
- }
-
- // TODO Could be more generally useful
- internal class ListBuffer16
- : MemoryStream
- {
- internal ListBuffer16()
- {
- // Reserve space for length
- TlsUtilities.WriteUint16(0, this);
- }
-
- internal void EncodeTo(Stream output)
- {
- // Patch actual length back in
- long length = Length - 2;
- TlsUtilities.CheckUint16(length);
- this.Position = 0;
- TlsUtilities.WriteUint16((int)length, this);
- Streams.WriteBufTo(this, output);
- Platform.Dispose(this);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/Chacha20Poly1305.cs b/BCCrypto/src/crypto/tls/Chacha20Poly1305.cs
deleted file mode 100644
index 5832714..0000000
--- a/BCCrypto/src/crypto/tls/Chacha20Poly1305.cs
+++ /dev/null
@@ -1,232 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * draft-ietf-tls-chacha20-poly1305-04
- */
- public class Chacha20Poly1305
- : TlsCipher
- {
- private static readonly byte[] Zeroes = new byte[15];
-
- protected readonly TlsContext context;
-
- protected readonly ChaCha7539Engine encryptCipher, decryptCipher;
- protected readonly byte[] encryptIV, decryptIV;
-
- ///
- public Chacha20Poly1305(TlsContext context)
- {
- if (!TlsUtilities.IsTlsV12(context))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- this.context = context;
-
- int cipherKeySize = 32;
- // TODO SecurityParameters.fixed_iv_length
- int fixed_iv_length = 12;
- // TODO SecurityParameters.record_iv_length = 0
-
- int key_block_size = (2 * cipherKeySize) + (2 * fixed_iv_length);
-
- byte[] key_block = TlsUtilities.CalculateKeyBlock(context, key_block_size);
-
- int offset = 0;
-
- KeyParameter client_write_key = new KeyParameter(key_block, offset, cipherKeySize);
- offset += cipherKeySize;
- KeyParameter server_write_key = new KeyParameter(key_block, offset, cipherKeySize);
- offset += cipherKeySize;
- byte[] client_write_IV = Arrays.CopyOfRange(key_block, offset, offset + fixed_iv_length);
- offset += fixed_iv_length;
- byte[] server_write_IV = Arrays.CopyOfRange(key_block, offset, offset + fixed_iv_length);
- offset += fixed_iv_length;
-
- if (offset != key_block_size)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- this.encryptCipher = new ChaCha7539Engine();
- this.decryptCipher = new ChaCha7539Engine();
-
- KeyParameter encryptKey, decryptKey;
- if (context.IsServer)
- {
- encryptKey = server_write_key;
- decryptKey = client_write_key;
- this.encryptIV = server_write_IV;
- this.decryptIV = client_write_IV;
- }
- else
- {
- encryptKey = client_write_key;
- decryptKey = server_write_key;
- this.encryptIV = client_write_IV;
- this.decryptIV = server_write_IV;
- }
-
- this.encryptCipher.Init(true, new ParametersWithIV(encryptKey, encryptIV));
- this.decryptCipher.Init(false, new ParametersWithIV(decryptKey, decryptIV));
- }
-
- public virtual int GetPlaintextLimit(int ciphertextLimit)
- {
- return ciphertextLimit - 16;
- }
-
- ///
- public virtual byte[] EncodePlaintext(long seqNo, byte type, byte[] plaintext, int offset, int len)
- {
- KeyParameter macKey = InitRecord(encryptCipher, true, seqNo, encryptIV);
-
- byte[] output = new byte[len + 16];
- encryptCipher.ProcessBytes(plaintext, offset, len, output, 0);
-
- byte[] additionalData = GetAdditionalData(seqNo, type, len);
- byte[] mac = CalculateRecordMac(macKey, additionalData, output, 0, len);
- Array.Copy(mac, 0, output, len, mac.Length);
-
- return output;
- }
-
- public virtual byte[] EncodePlaintext(long seqNo, byte[] plaintext, int offset, int len, byte[] additionalData)
- {
- KeyParameter macKey = InitRecord(encryptCipher, true, seqNo, encryptIV);
-
- byte[] output = new byte[len + 16];
- encryptCipher.ProcessBytes(plaintext, offset, len, output, 0);
-
- byte[] mac = CalculateRecordMac(macKey, additionalData, output, 0, len);
- Array.Copy(mac, 0, output, len, mac.Length);
-
- return output;
- }
-
- ///
- public virtual byte[] DecodeCiphertext(long seqNo, byte type, byte[] ciphertext, int offset, int len)
- {
- if (GetPlaintextLimit(len) < 0)
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- KeyParameter macKey = InitRecord(decryptCipher, false, seqNo, decryptIV);
-
- int plaintextLength = len - 16;
-
- byte[] additionalData = GetAdditionalData(seqNo, type, plaintextLength);
- byte[] calculatedMac = CalculateRecordMac(macKey, additionalData, ciphertext, offset, plaintextLength);
- byte[] receivedMac = Arrays.CopyOfRange(ciphertext, offset + plaintextLength, offset + len);
-
- if (!Arrays.ConstantTimeAreEqual(calculatedMac, receivedMac))
- throw new TlsFatalAlert(AlertDescription.bad_record_mac);
-
- byte[] output = new byte[plaintextLength];
- decryptCipher.ProcessBytes(ciphertext, offset, plaintextLength, output, 0);
- return output;
- }
-
- public virtual byte[] DecodeCiphertext(long seqNo, byte[] ciphertext, int offset, int len, byte[] additionalData)
- {
- if (GetPlaintextLimit(len) < 0)
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- KeyParameter macKey = InitRecord(decryptCipher, false, seqNo, decryptIV);
-
- int plaintextLength = len - 16;
-
- byte[] calculatedMac = CalculateRecordMac(macKey, additionalData, ciphertext, offset, plaintextLength);
- byte[] receivedMac = Arrays.CopyOfRange(ciphertext, offset + plaintextLength, offset + len);
-
- if (!Arrays.ConstantTimeAreEqual(calculatedMac, receivedMac))
- throw new TlsFatalAlert(AlertDescription.bad_record_mac);
-
- byte[] output = new byte[plaintextLength];
- decryptCipher.ProcessBytes(ciphertext, offset, plaintextLength, output, 0);
- return output;
- }
-
- protected virtual KeyParameter InitRecord(IStreamCipher cipher, bool forEncryption, long seqNo, byte[] iv)
- {
- byte[] nonce = CalculateNonce(seqNo, iv);
- cipher.Init(forEncryption, new ParametersWithIV(null, nonce));
- return GenerateRecordMacKey(cipher);
- }
-
- protected virtual byte[] CalculateNonce(long seqNo, byte[] iv)
- {
- byte[] nonce = new byte[12];
- TlsUtilities.WriteUint64(seqNo, nonce, 4);
-
- for (int i = 0; i < 12; ++i)
- {
- nonce[i] ^= iv[i];
- }
-
- return nonce;
- }
-
- protected virtual KeyParameter GenerateRecordMacKey(IStreamCipher cipher)
- {
- byte[] firstBlock = new byte[64];
- cipher.ProcessBytes(firstBlock, 0, firstBlock.Length, firstBlock, 0);
-
- KeyParameter macKey = new KeyParameter(firstBlock, 0, 32);
- Arrays.Fill(firstBlock, (byte)0);
- return macKey;
- }
-
- protected virtual byte[] CalculateRecordMac(KeyParameter macKey, byte[] additionalData, byte[] buf, int off, int len)
- {
- IMac mac = new Poly1305();
- mac.Init(macKey);
-
- UpdateRecordMacText(mac, additionalData, 0, additionalData.Length);
- UpdateRecordMacText(mac, buf, off, len);
- UpdateRecordMacLength(mac, additionalData.Length);
- UpdateRecordMacLength(mac, len);
-
- return MacUtilities.DoFinal(mac);
- }
-
- protected virtual void UpdateRecordMacLength(IMac mac, int len)
- {
- byte[] longLen = Pack.UInt64_To_LE((ulong)len);
- mac.BlockUpdate(longLen, 0, longLen.Length);
- }
-
- protected virtual void UpdateRecordMacText(IMac mac, byte[] buf, int off, int len)
- {
- mac.BlockUpdate(buf, off, len);
-
- int partial = len % 16;
- if (partial != 0)
- {
- mac.BlockUpdate(Zeroes, 0, 16 - partial);
- }
- }
-
- ///
- protected virtual byte[] GetAdditionalData(long seqNo, byte type, int len)
- {
- /*
- * additional_data = seq_num + TLSCompressed.type + TLSCompressed.version +
- * TLSCompressed.length
- */
- byte[] additional_data = new byte[13];
- TlsUtilities.WriteUint64(seqNo, additional_data, 0);
- TlsUtilities.WriteUint8(type, additional_data, 8);
- TlsUtilities.WriteVersion(context.ServerVersion, additional_data, 9);
- TlsUtilities.WriteUint16(len, additional_data, 11);
-
- return additional_data;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ChangeCipherSpec.cs b/BCCrypto/src/crypto/tls/ChangeCipherSpec.cs
deleted file mode 100644
index 323de91..0000000
--- a/BCCrypto/src/crypto/tls/ChangeCipherSpec.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class ChangeCipherSpec
- {
- public const byte change_cipher_spec = 1;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/CipherSuite.cs b/BCCrypto/src/crypto/tls/CipherSuite.cs
deleted file mode 100644
index 679a8be..0000000
--- a/BCCrypto/src/crypto/tls/CipherSuite.cs
+++ /dev/null
@@ -1,377 +0,0 @@
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// RFC 2246 A.5
- ///
- public abstract class CipherSuite
- {
- public const int TLS_NULL_WITH_NULL_NULL = 0x0000;
- public const int TLS_RSA_WITH_NULL_MD5 = 0x0001;
- public const int TLS_RSA_WITH_NULL_SHA = 0x0002;
- public const int TLS_RSA_EXPORT_WITH_RC4_40_MD5 = 0x0003;
- public const int TLS_RSA_WITH_RC4_128_MD5 = 0x0004;
- public const int TLS_RSA_WITH_RC4_128_SHA = 0x0005;
- public const int TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = 0x0006;
- public const int TLS_RSA_WITH_IDEA_CBC_SHA = 0x0007;
- public const int TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = 0x0008;
- public const int TLS_RSA_WITH_DES_CBC_SHA = 0x0009;
- public const int TLS_RSA_WITH_3DES_EDE_CBC_SHA = 0x000A;
- public const int TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = 0x000B;
- public const int TLS_DH_DSS_WITH_DES_CBC_SHA = 0x000C;
- public const int TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = 0x000D;
- public const int TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = 0x000E;
- public const int TLS_DH_RSA_WITH_DES_CBC_SHA = 0x000F;
- public const int TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = 0x0010;
- public const int TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = 0x0011;
- public const int TLS_DHE_DSS_WITH_DES_CBC_SHA = 0x0012;
- public const int TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 0x0013;
- public const int TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = 0x0014;
- public const int TLS_DHE_RSA_WITH_DES_CBC_SHA = 0x0015;
- public const int TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 0x0016;
- public const int TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 = 0x0017;
- public const int TLS_DH_anon_WITH_RC4_128_MD5 = 0x0018;
- public const int TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA = 0x0019;
- public const int TLS_DH_anon_WITH_DES_CBC_SHA = 0x001A;
- public const int TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = 0x001B;
-
- /*
- * Note: The cipher suite values { 0x00, 0x1C } and { 0x00, 0x1D } are reserved to avoid
- * collision with Fortezza-based cipher suites in SSL 3.
- */
-
- /*
- * RFC 3268
- */
- public const int TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F;
- public const int TLS_DH_DSS_WITH_AES_128_CBC_SHA = 0x0030;
- public const int TLS_DH_RSA_WITH_AES_128_CBC_SHA = 0x0031;
- public const int TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032;
- public const int TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033;
- public const int TLS_DH_anon_WITH_AES_128_CBC_SHA = 0x0034;
- public const int TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035;
- public const int TLS_DH_DSS_WITH_AES_256_CBC_SHA = 0x0036;
- public const int TLS_DH_RSA_WITH_AES_256_CBC_SHA = 0x0037;
- public const int TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038;
- public const int TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039;
- public const int TLS_DH_anon_WITH_AES_256_CBC_SHA = 0x003A;
-
- /*
- * RFC 5932
- */
- public const int TLS_RSA_WITH_CAMELLIA_128_CBC_SHA = 0x0041;
- public const int TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA = 0x0042;
- public const int TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA = 0x0043;
- public const int TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA = 0x0044;
- public const int TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA = 0x0045;
- public const int TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA = 0x0046;
-
- public const int TLS_RSA_WITH_CAMELLIA_256_CBC_SHA = 0x0084;
- public const int TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA = 0x0085;
- public const int TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA = 0x0086;
- public const int TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA = 0x0087;
- public const int TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA = 0x0088;
- public const int TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA = 0x0089;
-
- public const int TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 = 0x00BA;
- public const int TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 = 0x00BB;
- public const int TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 = 0x00BC;
- public const int TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 = 0x00BD;
- public const int TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 = 0x00BE;
- public const int TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256 = 0x00BF;
-
- public const int TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C0;
- public const int TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C1;
- public const int TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C2;
- public const int TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C3;
- public const int TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C4;
- public const int TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C5;
-
- /*
- * RFC 4162
- */
- public const int TLS_RSA_WITH_SEED_CBC_SHA = 0x0096;
- public const int TLS_DH_DSS_WITH_SEED_CBC_SHA = 0x0097;
- public const int TLS_DH_RSA_WITH_SEED_CBC_SHA = 0x0098;
- public const int TLS_DHE_DSS_WITH_SEED_CBC_SHA = 0x0099;
- public const int TLS_DHE_RSA_WITH_SEED_CBC_SHA = 0x009A;
- public const int TLS_DH_anon_WITH_SEED_CBC_SHA = 0x009B;
-
- /*
- * RFC 4279
- */
- public const int TLS_PSK_WITH_RC4_128_SHA = 0x008A;
- public const int TLS_PSK_WITH_3DES_EDE_CBC_SHA = 0x008B;
- public const int TLS_PSK_WITH_AES_128_CBC_SHA = 0x008C;
- public const int TLS_PSK_WITH_AES_256_CBC_SHA = 0x008D;
- public const int TLS_DHE_PSK_WITH_RC4_128_SHA = 0x008E;
- public const int TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA = 0x008F;
- public const int TLS_DHE_PSK_WITH_AES_128_CBC_SHA = 0x0090;
- public const int TLS_DHE_PSK_WITH_AES_256_CBC_SHA = 0x0091;
- public const int TLS_RSA_PSK_WITH_RC4_128_SHA = 0x0092;
- public const int TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA = 0x0093;
- public const int TLS_RSA_PSK_WITH_AES_128_CBC_SHA = 0x0094;
- public const int TLS_RSA_PSK_WITH_AES_256_CBC_SHA = 0x0095;
-
- /*
- * RFC 4492
- */
- public const int TLS_ECDH_ECDSA_WITH_NULL_SHA = 0xC001;
- public const int TLS_ECDH_ECDSA_WITH_RC4_128_SHA = 0xC002;
- public const int TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA = 0xC003;
- public const int TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA = 0xC004;
- public const int TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA = 0xC005;
- public const int TLS_ECDHE_ECDSA_WITH_NULL_SHA = 0xC006;
- public const int TLS_ECDHE_ECDSA_WITH_RC4_128_SHA = 0xC007;
- public const int TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA = 0xC008;
- public const int TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009;
- public const int TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A;
- public const int TLS_ECDH_RSA_WITH_NULL_SHA = 0xC00B;
- public const int TLS_ECDH_RSA_WITH_RC4_128_SHA = 0xC00C;
- public const int TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA = 0xC00D;
- public const int TLS_ECDH_RSA_WITH_AES_128_CBC_SHA = 0xC00E;
- public const int TLS_ECDH_RSA_WITH_AES_256_CBC_SHA = 0xC00F;
- public const int TLS_ECDHE_RSA_WITH_NULL_SHA = 0xC010;
- public const int TLS_ECDHE_RSA_WITH_RC4_128_SHA = 0xC011;
- public const int TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA = 0xC012;
- public const int TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013;
- public const int TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014;
- public const int TLS_ECDH_anon_WITH_NULL_SHA = 0xC015;
- public const int TLS_ECDH_anon_WITH_RC4_128_SHA = 0xC016;
- public const int TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA = 0xC017;
- public const int TLS_ECDH_anon_WITH_AES_128_CBC_SHA = 0xC018;
- public const int TLS_ECDH_anon_WITH_AES_256_CBC_SHA = 0xC019;
-
- /*
- * RFC 4785
- */
- public const int TLS_PSK_WITH_NULL_SHA = 0x002C;
- public const int TLS_DHE_PSK_WITH_NULL_SHA = 0x002D;
- public const int TLS_RSA_PSK_WITH_NULL_SHA = 0x002E;
-
- /*
- * RFC 5054
- */
- public const int TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA = 0xC01A;
- public const int TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA = 0xC01B;
- public const int TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA = 0xC01C;
- public const int TLS_SRP_SHA_WITH_AES_128_CBC_SHA = 0xC01D;
- public const int TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA = 0xC01E;
- public const int TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA = 0xC01F;
- public const int TLS_SRP_SHA_WITH_AES_256_CBC_SHA = 0xC020;
- public const int TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA = 0xC021;
- public const int TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA = 0xC022;
-
- /*
- * RFC 5246
- */
- public const int TLS_RSA_WITH_NULL_SHA256 = 0x003B;
- public const int TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C;
- public const int TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D;
- public const int TLS_DH_DSS_WITH_AES_128_CBC_SHA256 = 0x003E;
- public const int TLS_DH_RSA_WITH_AES_128_CBC_SHA256 = 0x003F;
- public const int TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040;
- public const int TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067;
- public const int TLS_DH_DSS_WITH_AES_256_CBC_SHA256 = 0x0068;
- public const int TLS_DH_RSA_WITH_AES_256_CBC_SHA256 = 0x0069;
- public const int TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A;
- public const int TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B;
- public const int TLS_DH_anon_WITH_AES_128_CBC_SHA256 = 0x006C;
- public const int TLS_DH_anon_WITH_AES_256_CBC_SHA256 = 0x006D;
-
- /*
- * RFC 5288
- */
- public const int TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C;
- public const int TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D;
- public const int TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E;
- public const int TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F;
- public const int TLS_DH_RSA_WITH_AES_128_GCM_SHA256 = 0x00A0;
- public const int TLS_DH_RSA_WITH_AES_256_GCM_SHA384 = 0x00A1;
- public const int TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2;
- public const int TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3;
- public const int TLS_DH_DSS_WITH_AES_128_GCM_SHA256 = 0x00A4;
- public const int TLS_DH_DSS_WITH_AES_256_GCM_SHA384 = 0x00A5;
- public const int TLS_DH_anon_WITH_AES_128_GCM_SHA256 = 0x00A6;
- public const int TLS_DH_anon_WITH_AES_256_GCM_SHA384 = 0x00A7;
-
- /*
- * RFC 5289
- */
- public const int TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023;
- public const int TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024;
- public const int TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC025;
- public const int TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC026;
- public const int TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027;
- public const int TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028;
- public const int TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 = 0xC029;
- public const int TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 = 0xC02A;
- public const int TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B;
- public const int TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C;
- public const int TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02D;
- public const int TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02E;
- public const int TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F;
- public const int TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030;
- public const int TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 = 0xC031;
- public const int TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 = 0xC032;
-
- /*
- * RFC 5487
- */
- public const int TLS_PSK_WITH_AES_128_GCM_SHA256 = 0x00A8;
- public const int TLS_PSK_WITH_AES_256_GCM_SHA384 = 0x00A9;
- public const int TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 = 0x00AA;
- public const int TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 = 0x00AB;
- public const int TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 = 0x00AC;
- public const int TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 = 0x00AD;
- public const int TLS_PSK_WITH_AES_128_CBC_SHA256 = 0x00AE;
- public const int TLS_PSK_WITH_AES_256_CBC_SHA384 = 0x00AF;
- public const int TLS_PSK_WITH_NULL_SHA256 = 0x00B0;
- public const int TLS_PSK_WITH_NULL_SHA384 = 0x00B1;
- public const int TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 = 0x00B2;
- public const int TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 = 0x00B3;
- public const int TLS_DHE_PSK_WITH_NULL_SHA256 = 0x00B4;
- public const int TLS_DHE_PSK_WITH_NULL_SHA384 = 0x00B5;
- public const int TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 = 0x00B6;
- public const int TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 = 0x00B7;
- public const int TLS_RSA_PSK_WITH_NULL_SHA256 = 0x00B8;
- public const int TLS_RSA_PSK_WITH_NULL_SHA384 = 0x00B9;
-
- /*
- * RFC 5489
- */
- public const int TLS_ECDHE_PSK_WITH_RC4_128_SHA = 0xC033;
- public const int TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA = 0xC034;
- public const int TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA = 0xC035;
- public const int TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA = 0xC036;
- public const int TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 = 0xC037;
- public const int TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 = 0xC038;
- public const int TLS_ECDHE_PSK_WITH_NULL_SHA = 0xC039;
- public const int TLS_ECDHE_PSK_WITH_NULL_SHA256 = 0xC03A;
- public const int TLS_ECDHE_PSK_WITH_NULL_SHA384 = 0xC03B;
-
- /*
- * RFC 5746
- */
- public const int TLS_EMPTY_RENEGOTIATION_INFO_SCSV = 0x00FF;
-
- /*
- * RFC 6367
- */
- public const int TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 = 0xC072;
- public const int TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 = 0xC073;
- public const int TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 = 0xC074;
- public const int TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 = 0xC075;
- public const int TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 = 0xC076;
- public const int TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 = 0xC077;
- public const int TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 = 0xC078;
- public const int TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 = 0xC079;
-
- public const int TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC07A;
- public const int TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC07B;
- public const int TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC07C;
- public const int TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC07D;
- public const int TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC07E;
- public const int TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC07F;
- public const int TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256 = 0xC080;
- public const int TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384 = 0xC081;
- public const int TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256 = 0xC082;
- public const int TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384 = 0xC083;
- public const int TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256 = 0xC084;
- public const int TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384 = 0xC085;
- public const int TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC086;
- public const int TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC087;
- public const int TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC088;
- public const int TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC089;
- public const int TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC08A;
- public const int TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC08B;
- public const int TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC08C;
- public const int TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC08D;
-
- public const int TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 = 0xC08E;
- public const int TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 = 0xC08F;
- public const int TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 = 0xC090;
- public const int TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 = 0xC091;
- public const int TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 = 0xC092;
- public const int TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 = 0xC093;
- public const int TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 = 0xC094;
- public const int TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 = 0xC095;
- public const int TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 = 0xC096;
- public const int TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 = 0xC097;
- public const int TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 = 0xC098;
- public const int TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 = 0xC099;
- public const int TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 = 0xC09A;
- public const int TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 = 0xC09B;
-
- /*
- * RFC 6655
- */
- public const int TLS_RSA_WITH_AES_128_CCM = 0xC09C;
- public const int TLS_RSA_WITH_AES_256_CCM = 0xC09D;
- public const int TLS_DHE_RSA_WITH_AES_128_CCM = 0xC09E;
- public const int TLS_DHE_RSA_WITH_AES_256_CCM = 0xC09F;
- public const int TLS_RSA_WITH_AES_128_CCM_8 = 0xC0A0;
- public const int TLS_RSA_WITH_AES_256_CCM_8 = 0xC0A1;
- public const int TLS_DHE_RSA_WITH_AES_128_CCM_8 = 0xC0A2;
- public const int TLS_DHE_RSA_WITH_AES_256_CCM_8 = 0xC0A3;
- public const int TLS_PSK_WITH_AES_128_CCM = 0xC0A4;
- public const int TLS_PSK_WITH_AES_256_CCM = 0xC0A5;
- public const int TLS_DHE_PSK_WITH_AES_128_CCM = 0xC0A6;
- public const int TLS_DHE_PSK_WITH_AES_256_CCM = 0xC0A7;
- public const int TLS_PSK_WITH_AES_128_CCM_8 = 0xC0A8;
- public const int TLS_PSK_WITH_AES_256_CCM_8 = 0xC0A9;
- public const int TLS_PSK_DHE_WITH_AES_128_CCM_8 = 0xC0AA;
- public const int TLS_PSK_DHE_WITH_AES_256_CCM_8 = 0xC0AB;
-
- /*
- * RFC 7251
- */
- public const int TLS_ECDHE_ECDSA_WITH_AES_128_CCM = 0xC0AC;
- public const int TLS_ECDHE_ECDSA_WITH_AES_256_CCM = 0xC0AD;
- public const int TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 = 0xC0AE;
- public const int TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 = 0xC0AF;
-
- /*
- * RFC 7507
- */
- public const int TLS_FALLBACK_SCSV = 0x5600;
-
- /*
- * draft-ietf-tls-chacha20-poly1305-04
- */
- public const int DRAFT_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA8;
- public const int DRAFT_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA9;
- public const int DRAFT_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAA;
- public const int DRAFT_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAB;
- public const int DRAFT_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAC;
- public const int DRAFT_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAD;
- public const int DRAFT_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAE;
-
- /*
- * draft-zauner-tls-aes-ocb-04 (code points TBD)
- */
- public const int DRAFT_TLS_DHE_RSA_WITH_AES_128_OCB = 0xFF00;
- public const int DRAFT_TLS_DHE_RSA_WITH_AES_256_OCB = 0xFF01;
- public const int DRAFT_TLS_ECDHE_RSA_WITH_AES_128_OCB = 0xFF02;
- public const int DRAFT_TLS_ECDHE_RSA_WITH_AES_256_OCB = 0xFF03;
- public const int DRAFT_TLS_ECDHE_ECDSA_WITH_AES_128_OCB = 0xFF04;
- public const int DRAFT_TLS_ECDHE_ECDSA_WITH_AES_256_OCB = 0xFF05;
- public const int DRAFT_TLS_PSK_WITH_AES_128_OCB = 0xFF10;
- public const int DRAFT_TLS_PSK_WITH_AES_256_OCB = 0xFF11;
- public const int DRAFT_TLS_DHE_PSK_WITH_AES_128_OCB = 0xFF12;
- public const int DRAFT_TLS_DHE_PSK_WITH_AES_256_OCB = 0xFF13;
- public const int DRAFT_TLS_ECDHE_PSK_WITH_AES_128_OCB = 0xFF14;
- public const int DRAFT_TLS_ECDHE_PSK_WITH_AES_256_OCB = 0xFF15;
-
- public static bool IsScsv(int cipherSuite)
- {
- switch (cipherSuite)
- {
- case TLS_EMPTY_RENEGOTIATION_INFO_SCSV:
- case TLS_FALLBACK_SCSV:
- return true;
- default:
- return false;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/CipherType.cs b/BCCrypto/src/crypto/tls/CipherType.cs
deleted file mode 100644
index b2ad7d8..0000000
--- a/BCCrypto/src/crypto/tls/CipherType.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// RFC 2246
- ///
- /// Note that the values here are implementation-specific and arbitrary. It is recommended not to
- /// depend on the particular values (e.g. serialization).
- ///
- public abstract class CipherType
- {
- public const int stream = 0;
- public const int block = 1;
-
- /*
- * RFC 5246
- */
- public const int aead = 2;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ClientAuthenticationType.cs b/BCCrypto/src/crypto/tls/ClientAuthenticationType.cs
deleted file mode 100644
index dd248f3..0000000
--- a/BCCrypto/src/crypto/tls/ClientAuthenticationType.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class ClientAuthenticationType
- {
- /*
- * RFC 5077 4
- */
- public const byte anonymous = 0;
- public const byte certificate_based = 1;
- public const byte psk = 2;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ClientCertificateType.cs b/BCCrypto/src/crypto/tls/ClientCertificateType.cs
deleted file mode 100644
index a291a46..0000000
--- a/BCCrypto/src/crypto/tls/ClientCertificateType.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class ClientCertificateType
- {
- /*
- * RFC 4346 7.4.4
- */
- public const byte rsa_sign = 1;
- public const byte dss_sign = 2;
- public const byte rsa_fixed_dh = 3;
- public const byte dss_fixed_dh = 4;
- public const byte rsa_ephemeral_dh_RESERVED = 5;
- public const byte dss_ephemeral_dh_RESERVED = 6;
- public const byte fortezza_dms_RESERVED = 20;
-
- /*
- * RFC 4492 5.5
- */
- public const byte ecdsa_sign = 64;
- public const byte rsa_fixed_ecdh = 65;
- public const byte ecdsa_fixed_ecdh = 66;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/CombinedHash.cs b/BCCrypto/src/crypto/tls/CombinedHash.cs
deleted file mode 100644
index 74a52d5..0000000
--- a/BCCrypto/src/crypto/tls/CombinedHash.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * A combined hash, which implements md5(m) || sha1(m).
- */
- internal class CombinedHash
- : TlsHandshakeHash
- {
- protected TlsContext mContext;
- protected IDigest mMd5;
- protected IDigest mSha1;
-
- internal CombinedHash()
- {
- this.mMd5 = TlsUtilities.CreateHash(HashAlgorithm.md5);
- this.mSha1 = TlsUtilities.CreateHash(HashAlgorithm.sha1);
- }
-
- internal CombinedHash(CombinedHash t)
- {
- this.mContext = t.mContext;
- this.mMd5 = TlsUtilities.CloneHash(HashAlgorithm.md5, t.mMd5);
- this.mSha1 = TlsUtilities.CloneHash(HashAlgorithm.sha1, t.mSha1);
- }
-
- public virtual void Init(TlsContext context)
- {
- this.mContext = context;
- }
-
- public virtual TlsHandshakeHash NotifyPrfDetermined()
- {
- return this;
- }
-
- public virtual void TrackHashAlgorithm(byte hashAlgorithm)
- {
- throw new InvalidOperationException("CombinedHash only supports calculating the legacy PRF for handshake hash");
- }
-
- public virtual void SealHashAlgorithms()
- {
- }
-
- public virtual TlsHandshakeHash StopTracking()
- {
- return new CombinedHash(this);
- }
-
- public virtual IDigest ForkPrfHash()
- {
- return new CombinedHash(this);
- }
-
- public virtual byte[] GetFinalHash(byte hashAlgorithm)
- {
- throw new InvalidOperationException("CombinedHash doesn't support multiple hashes");
- }
-
- public virtual string AlgorithmName
- {
- get { return mMd5.AlgorithmName + " and " + mSha1.AlgorithmName; }
- }
-
- public virtual int GetByteLength()
- {
- return System.Math.Max(mMd5.GetByteLength(), mSha1.GetByteLength());
- }
-
- public virtual int GetDigestSize()
- {
- return mMd5.GetDigestSize() + mSha1.GetDigestSize();
- }
-
- public virtual void Update(byte input)
- {
- mMd5.Update(input);
- mSha1.Update(input);
- }
-
- /**
- * @see org.bouncycastle.crypto.Digest#update(byte[], int, int)
- */
- public virtual void BlockUpdate(byte[] input, int inOff, int len)
- {
- mMd5.BlockUpdate(input, inOff, len);
- mSha1.BlockUpdate(input, inOff, len);
- }
-
- /**
- * @see org.bouncycastle.crypto.Digest#doFinal(byte[], int)
- */
- public virtual int DoFinal(byte[] output, int outOff)
- {
- if (mContext != null && TlsUtilities.IsSsl(mContext))
- {
- Ssl3Complete(mMd5, Ssl3Mac.IPAD, Ssl3Mac.OPAD, 48);
- Ssl3Complete(mSha1, Ssl3Mac.IPAD, Ssl3Mac.OPAD, 40);
- }
-
- int i1 = mMd5.DoFinal(output, outOff);
- int i2 = mSha1.DoFinal(output, outOff + i1);
- return i1 + i2;
- }
-
- /**
- * @see org.bouncycastle.crypto.Digest#reset()
- */
- public virtual void Reset()
- {
- mMd5.Reset();
- mSha1.Reset();
- }
-
- protected virtual void Ssl3Complete(IDigest d, byte[] ipad, byte[] opad, int padLength)
- {
- byte[] master_secret = mContext.SecurityParameters.masterSecret;
-
- d.BlockUpdate(master_secret, 0, master_secret.Length);
- d.BlockUpdate(ipad, 0, padLength);
-
- byte[] tmp = DigestUtilities.DoFinal(d);
-
- d.BlockUpdate(master_secret, 0, master_secret.Length);
- d.BlockUpdate(opad, 0, padLength);
- d.BlockUpdate(tmp, 0, tmp.Length);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/CompressionMethod.cs b/BCCrypto/src/crypto/tls/CompressionMethod.cs
deleted file mode 100644
index 89c1f5f..0000000
--- a/BCCrypto/src/crypto/tls/CompressionMethod.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// RFC 2246 6.1
- ///
- public abstract class CompressionMethod
- {
- public const byte cls_null = 0;
-
- /*
- * RFC 3749 2
- */
- public const byte DEFLATE = 1;
-
- /*
- * Values from 224 decimal (0xE0) through 255 decimal (0xFF)
- * inclusive are reserved for private use.
- */
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ConnectionEnd.cs b/BCCrypto/src/crypto/tls/ConnectionEnd.cs
deleted file mode 100644
index afc9460..0000000
--- a/BCCrypto/src/crypto/tls/ConnectionEnd.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// RFC 2246
- ///
- /// Note that the values here are implementation-specific and arbitrary. It is recommended not to
- /// depend on the particular values (e.g. serialization).
- ///
- public abstract class ConnectionEnd
- {
- public const int server = 0;
- public const int client = 1;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ContentType.cs b/BCCrypto/src/crypto/tls/ContentType.cs
deleted file mode 100644
index d6ab438..0000000
--- a/BCCrypto/src/crypto/tls/ContentType.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * RFC 2246 6.2.1
- */
- public abstract class ContentType
- {
- public const byte change_cipher_spec = 20;
- public const byte alert = 21;
- public const byte handshake = 22;
- public const byte application_data = 23;
- public const byte heartbeat = 24;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DatagramTransport.cs b/BCCrypto/src/crypto/tls/DatagramTransport.cs
deleted file mode 100644
index 524a8b1..0000000
--- a/BCCrypto/src/crypto/tls/DatagramTransport.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface DatagramTransport
- {
- ///
- int GetReceiveLimit();
-
- ///
- int GetSendLimit();
-
- ///
- int Receive(byte[] buf, int off, int len, int waitMillis);
-
- ///
- void Send(byte[] buf, int off, int len);
-
- ///
- void Close();
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DefaultTlsAgreementCredentials.cs b/BCCrypto/src/crypto/tls/DefaultTlsAgreementCredentials.cs
deleted file mode 100644
index fab9788..0000000
--- a/BCCrypto/src/crypto/tls/DefaultTlsAgreementCredentials.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Agreement;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class DefaultTlsAgreementCredentials
- : AbstractTlsAgreementCredentials
- {
- protected readonly Certificate mCertificate;
- protected readonly AsymmetricKeyParameter mPrivateKey;
-
- protected readonly IBasicAgreement mBasicAgreement;
- protected readonly bool mTruncateAgreement;
-
- public DefaultTlsAgreementCredentials(Certificate certificate, AsymmetricKeyParameter privateKey)
- {
- if (certificate == null)
- throw new ArgumentNullException("certificate");
- if (certificate.IsEmpty)
- throw new ArgumentException("cannot be empty", "certificate");
- if (privateKey == null)
- throw new ArgumentNullException("privateKey");
- if (!privateKey.IsPrivate)
- throw new ArgumentException("must be private", "privateKey");
-
- if (privateKey is DHPrivateKeyParameters)
- {
- mBasicAgreement = new DHBasicAgreement();
- mTruncateAgreement = true;
- }
- else if (privateKey is ECPrivateKeyParameters)
- {
- mBasicAgreement = new ECDHBasicAgreement();
- mTruncateAgreement = false;
- }
- else
- {
- throw new ArgumentException("type not supported: " + Platform.GetTypeName(privateKey), "privateKey");
- }
-
- this.mCertificate = certificate;
- this.mPrivateKey = privateKey;
- }
-
- public override Certificate Certificate
- {
- get { return mCertificate; }
- }
-
- ///
- public override byte[] GenerateAgreement(AsymmetricKeyParameter peerPublicKey)
- {
- mBasicAgreement.Init(mPrivateKey);
- BigInteger agreementValue = mBasicAgreement.CalculateAgreement(peerPublicKey);
-
- if (mTruncateAgreement)
- {
- return BigIntegers.AsUnsignedByteArray(agreementValue);
- }
-
- return BigIntegers.AsUnsignedByteArray(mBasicAgreement.GetFieldSize(), agreementValue);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DefaultTlsCipherFactory.cs b/BCCrypto/src/crypto/tls/DefaultTlsCipherFactory.cs
deleted file mode 100644
index af0ec12..0000000
--- a/BCCrypto/src/crypto/tls/DefaultTlsCipherFactory.cs
+++ /dev/null
@@ -1,227 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Modes;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class DefaultTlsCipherFactory
- : AbstractTlsCipherFactory
- {
- ///
- public override TlsCipher CreateCipher(TlsContext context, int encryptionAlgorithm, int macAlgorithm)
- {
- switch (encryptionAlgorithm)
- {
- case EncryptionAlgorithm.cls_3DES_EDE_CBC:
- return CreateDesEdeCipher(context, macAlgorithm);
- case EncryptionAlgorithm.AES_128_CBC:
- return CreateAESCipher(context, 16, macAlgorithm);
- case EncryptionAlgorithm.AES_128_CCM:
- // NOTE: Ignores macAlgorithm
- return CreateCipher_Aes_Ccm(context, 16, 16);
- case EncryptionAlgorithm.AES_128_CCM_8:
- // NOTE: Ignores macAlgorithm
- return CreateCipher_Aes_Ccm(context, 16, 8);
- case EncryptionAlgorithm.AES_128_GCM:
- // NOTE: Ignores macAlgorithm
- return CreateCipher_Aes_Gcm(context, 16, 16);
- case EncryptionAlgorithm.AES_128_OCB_TAGLEN96:
- // NOTE: Ignores macAlgorithm
- return CreateCipher_Aes_Ocb(context, 16, 12);
- case EncryptionAlgorithm.AES_256_CBC:
- return CreateAESCipher(context, 32, macAlgorithm);
- case EncryptionAlgorithm.AES_256_CCM:
- // NOTE: Ignores macAlgorithm
- return CreateCipher_Aes_Ccm(context, 32, 16);
- case EncryptionAlgorithm.AES_256_CCM_8:
- // NOTE: Ignores macAlgorithm
- return CreateCipher_Aes_Ccm(context, 32, 8);
- case EncryptionAlgorithm.AES_256_GCM:
- // NOTE: Ignores macAlgorithm
- return CreateCipher_Aes_Gcm(context, 32, 16);
- case EncryptionAlgorithm.AES_256_OCB_TAGLEN96:
- // NOTE: Ignores macAlgorithm
- return CreateCipher_Aes_Ocb(context, 32, 12);
- case EncryptionAlgorithm.CAMELLIA_128_CBC:
- return CreateCamelliaCipher(context, 16, macAlgorithm);
- case EncryptionAlgorithm.CAMELLIA_128_GCM:
- // NOTE: Ignores macAlgorithm
- return CreateCipher_Camellia_Gcm(context, 16, 16);
- case EncryptionAlgorithm.CAMELLIA_256_CBC:
- return CreateCamelliaCipher(context, 32, macAlgorithm);
- case EncryptionAlgorithm.CAMELLIA_256_GCM:
- // NOTE: Ignores macAlgorithm
- return CreateCipher_Camellia_Gcm(context, 32, 16);
- case EncryptionAlgorithm.CHACHA20_POLY1305:
- // NOTE: Ignores macAlgorithm
- return CreateChaCha20Poly1305(context);
- case EncryptionAlgorithm.NULL:
- return CreateNullCipher(context, macAlgorithm);
- case EncryptionAlgorithm.RC4_128:
- return CreateRC4Cipher(context, 16, macAlgorithm);
- case EncryptionAlgorithm.SEED_CBC:
- return CreateSeedCipher(context, macAlgorithm);
- default:
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- ///
- protected virtual TlsBlockCipher CreateAESCipher(TlsContext context, int cipherKeySize, int macAlgorithm)
- {
- return new TlsBlockCipher(context, CreateAesBlockCipher(), CreateAesBlockCipher(),
- CreateHMacDigest(macAlgorithm), CreateHMacDigest(macAlgorithm), cipherKeySize);
- }
-
- ///
- protected virtual TlsBlockCipher CreateCamelliaCipher(TlsContext context, int cipherKeySize, int macAlgorithm)
- {
- return new TlsBlockCipher(context, CreateCamelliaBlockCipher(),
- CreateCamelliaBlockCipher(), CreateHMacDigest(macAlgorithm),
- CreateHMacDigest(macAlgorithm), cipherKeySize);
- }
-
- ///
- protected virtual TlsCipher CreateChaCha20Poly1305(TlsContext context)
- {
- return new Chacha20Poly1305(context);
- }
-
- ///
- protected virtual TlsAeadCipher CreateCipher_Aes_Ccm(TlsContext context, int cipherKeySize, int macSize)
- {
- return new TlsAeadCipher(context, CreateAeadBlockCipher_Aes_Ccm(),
- CreateAeadBlockCipher_Aes_Ccm(), cipherKeySize, macSize);
- }
-
- ///
- protected virtual TlsAeadCipher CreateCipher_Aes_Gcm(TlsContext context, int cipherKeySize, int macSize)
- {
- return new TlsAeadCipher(context, CreateAeadBlockCipher_Aes_Gcm(),
- CreateAeadBlockCipher_Aes_Gcm(), cipherKeySize, macSize);
- }
-
- ///
- protected virtual TlsAeadCipher CreateCipher_Aes_Ocb(TlsContext context, int cipherKeySize, int macSize)
- {
- return new TlsAeadCipher(context, CreateAeadBlockCipher_Aes_Ocb(),
- CreateAeadBlockCipher_Aes_Ocb(), cipherKeySize, macSize, TlsAeadCipher.NONCE_DRAFT_CHACHA20_POLY1305);
- }
-
- ///
- protected virtual TlsAeadCipher CreateCipher_Camellia_Gcm(TlsContext context, int cipherKeySize, int macSize)
- {
- return new TlsAeadCipher(context, CreateAeadBlockCipher_Camellia_Gcm(),
- CreateAeadBlockCipher_Camellia_Gcm(), cipherKeySize, macSize);
- }
-
- ///
- protected virtual TlsBlockCipher CreateDesEdeCipher(TlsContext context, int macAlgorithm)
- {
- return new TlsBlockCipher(context, CreateDesEdeBlockCipher(), CreateDesEdeBlockCipher(),
- CreateHMacDigest(macAlgorithm), CreateHMacDigest(macAlgorithm), 24);
- }
-
- ///
- protected virtual TlsNullCipher CreateNullCipher(TlsContext context, int macAlgorithm)
- {
- return new TlsNullCipher(context, CreateHMacDigest(macAlgorithm),
- CreateHMacDigest(macAlgorithm));
- }
-
- ///
- protected virtual TlsStreamCipher CreateRC4Cipher(TlsContext context, int cipherKeySize, int macAlgorithm)
- {
- return new TlsStreamCipher(context, CreateRC4StreamCipher(), CreateRC4StreamCipher(),
- CreateHMacDigest(macAlgorithm), CreateHMacDigest(macAlgorithm), cipherKeySize, false);
- }
-
- ///
- protected virtual TlsBlockCipher CreateSeedCipher(TlsContext context, int macAlgorithm)
- {
- return new TlsBlockCipher(context, CreateSeedBlockCipher(), CreateSeedBlockCipher(),
- CreateHMacDigest(macAlgorithm), CreateHMacDigest(macAlgorithm), 16);
- }
-
- protected virtual IBlockCipher CreateAesEngine()
- {
- return new AesEngine();
- }
-
- protected virtual IBlockCipher CreateCamelliaEngine()
- {
- return new CamelliaEngine();
- }
-
- protected virtual IBlockCipher CreateAesBlockCipher()
- {
- return new CbcBlockCipher(CreateAesEngine());
- }
-
- protected virtual IAeadBlockCipher CreateAeadBlockCipher_Aes_Ccm()
- {
- return new CcmBlockCipher(CreateAesEngine());
- }
-
- protected virtual IAeadBlockCipher CreateAeadBlockCipher_Aes_Gcm()
- {
- // TODO Consider allowing custom configuration of multiplier
- return new GcmBlockCipher(CreateAesEngine());
- }
-
- protected virtual IAeadBlockCipher CreateAeadBlockCipher_Aes_Ocb()
- {
- return new OcbBlockCipher(CreateAesEngine(), CreateAesEngine());
- }
-
- protected virtual IAeadBlockCipher CreateAeadBlockCipher_Camellia_Gcm()
- {
- // TODO Consider allowing custom configuration of multiplier
- return new GcmBlockCipher(CreateCamelliaEngine());
- }
-
- protected virtual IBlockCipher CreateCamelliaBlockCipher()
- {
- return new CbcBlockCipher(CreateCamelliaEngine());
- }
-
- protected virtual IBlockCipher CreateDesEdeBlockCipher()
- {
- return new CbcBlockCipher(new DesEdeEngine());
- }
-
- protected virtual IStreamCipher CreateRC4StreamCipher()
- {
- return new RC4Engine();
- }
-
- protected virtual IBlockCipher CreateSeedBlockCipher()
- {
- return new CbcBlockCipher(new SeedEngine());
- }
-
- ///
- protected virtual IDigest CreateHMacDigest(int macAlgorithm)
- {
- switch (macAlgorithm)
- {
- case MacAlgorithm.cls_null:
- return null;
- case MacAlgorithm.hmac_md5:
- return TlsUtilities.CreateHash(HashAlgorithm.md5);
- case MacAlgorithm.hmac_sha1:
- return TlsUtilities.CreateHash(HashAlgorithm.sha1);
- case MacAlgorithm.hmac_sha256:
- return TlsUtilities.CreateHash(HashAlgorithm.sha256);
- case MacAlgorithm.hmac_sha384:
- return TlsUtilities.CreateHash(HashAlgorithm.sha384);
- case MacAlgorithm.hmac_sha512:
- return TlsUtilities.CreateHash(HashAlgorithm.sha512);
- default:
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DefaultTlsClient.cs b/BCCrypto/src/crypto/tls/DefaultTlsClient.cs
deleted file mode 100644
index 32a86e5..0000000
--- a/BCCrypto/src/crypto/tls/DefaultTlsClient.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class DefaultTlsClient
- : AbstractTlsClient
- {
- public DefaultTlsClient()
- : base()
- {
- }
-
- public DefaultTlsClient(TlsCipherFactory cipherFactory)
- : base(cipherFactory)
- {
- }
-
- public override int[] GetCipherSuites()
- {
- return new int[]
- {
- CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
- CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
- CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
- CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
- CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
- CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
- CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,
- CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,
- CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
- CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
- CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
- CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
- CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256,
- CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256,
- CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA,
- };
- }
-
- public override TlsKeyExchange GetKeyExchange()
- {
- int keyExchangeAlgorithm = TlsUtilities.GetKeyExchangeAlgorithm(mSelectedCipherSuite);
-
- switch (keyExchangeAlgorithm)
- {
- case KeyExchangeAlgorithm.DH_anon:
- case KeyExchangeAlgorithm.DH_DSS:
- case KeyExchangeAlgorithm.DH_RSA:
- return CreateDHKeyExchange(keyExchangeAlgorithm);
-
- case KeyExchangeAlgorithm.DHE_DSS:
- case KeyExchangeAlgorithm.DHE_RSA:
- return CreateDheKeyExchange(keyExchangeAlgorithm);
-
- case KeyExchangeAlgorithm.ECDH_anon:
- case KeyExchangeAlgorithm.ECDH_ECDSA:
- case KeyExchangeAlgorithm.ECDH_RSA:
- return CreateECDHKeyExchange(keyExchangeAlgorithm);
-
- case KeyExchangeAlgorithm.ECDHE_ECDSA:
- case KeyExchangeAlgorithm.ECDHE_RSA:
- return CreateECDheKeyExchange(keyExchangeAlgorithm);
-
- case KeyExchangeAlgorithm.RSA:
- return CreateRsaKeyExchange();
-
- default:
- /*
- * Note: internal error here; the TlsProtocol implementation verifies that the
- * server-selected cipher suite was in the list of client-offered cipher suites, so if
- * we now can't produce an implementation, we shouldn't have offered it!
- */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- protected virtual TlsKeyExchange CreateDHKeyExchange(int keyExchange)
- {
- return new TlsDHKeyExchange(keyExchange, mSupportedSignatureAlgorithms, null);
- }
-
- protected virtual TlsKeyExchange CreateDheKeyExchange(int keyExchange)
- {
- return new TlsDheKeyExchange(keyExchange, mSupportedSignatureAlgorithms, null);
- }
-
- protected virtual TlsKeyExchange CreateECDHKeyExchange(int keyExchange)
- {
- return new TlsECDHKeyExchange(keyExchange, mSupportedSignatureAlgorithms, mNamedCurves, mClientECPointFormats,
- mServerECPointFormats);
- }
-
- protected virtual TlsKeyExchange CreateECDheKeyExchange(int keyExchange)
- {
- return new TlsECDheKeyExchange(keyExchange, mSupportedSignatureAlgorithms, mNamedCurves, mClientECPointFormats,
- mServerECPointFormats);
- }
-
- protected virtual TlsKeyExchange CreateRsaKeyExchange()
- {
- return new TlsRsaKeyExchange(mSupportedSignatureAlgorithms);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DefaultTlsEncryptionCredentials.cs b/BCCrypto/src/crypto/tls/DefaultTlsEncryptionCredentials.cs
deleted file mode 100644
index 5348ee8..0000000
--- a/BCCrypto/src/crypto/tls/DefaultTlsEncryptionCredentials.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class DefaultTlsEncryptionCredentials
- : AbstractTlsEncryptionCredentials
- {
- protected readonly TlsContext mContext;
- protected readonly Certificate mCertificate;
- protected readonly AsymmetricKeyParameter mPrivateKey;
-
- public DefaultTlsEncryptionCredentials(TlsContext context, Certificate certificate,
- AsymmetricKeyParameter privateKey)
- {
- if (certificate == null)
- throw new ArgumentNullException("certificate");
- if (certificate.IsEmpty)
- throw new ArgumentException("cannot be empty", "certificate");
- if (privateKey == null)
- throw new ArgumentNullException("'privateKey' cannot be null");
- if (!privateKey.IsPrivate)
- throw new ArgumentException("must be private", "privateKey");
-
- if (privateKey is RsaKeyParameters)
- {
- }
- else
- {
- throw new ArgumentException("type not supported: " + Platform.GetTypeName(privateKey), "privateKey");
- }
-
- this.mContext = context;
- this.mCertificate = certificate;
- this.mPrivateKey = privateKey;
- }
-
- public override Certificate Certificate
- {
- get { return mCertificate; }
- }
-
- ///
- public override byte[] DecryptPreMasterSecret(byte[] encryptedPreMasterSecret)
- {
- return TlsRsaUtilities.SafeDecryptPreMasterSecret(mContext, (RsaKeyParameters)mPrivateKey, encryptedPreMasterSecret);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DefaultTlsServer.cs b/BCCrypto/src/crypto/tls/DefaultTlsServer.cs
deleted file mode 100644
index 8b9a7c9..0000000
--- a/BCCrypto/src/crypto/tls/DefaultTlsServer.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Agreement;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class DefaultTlsServer
- : AbstractTlsServer
- {
- public DefaultTlsServer()
- : base()
- {
- }
-
- public DefaultTlsServer(TlsCipherFactory cipherFactory)
- : base(cipherFactory)
- {
- }
-
- protected virtual TlsSignerCredentials GetDsaSignerCredentials()
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- protected virtual TlsSignerCredentials GetECDsaSignerCredentials()
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- protected virtual TlsEncryptionCredentials GetRsaEncryptionCredentials()
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- protected virtual TlsSignerCredentials GetRsaSignerCredentials()
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- protected virtual DHParameters GetDHParameters()
- {
- return DHStandardGroups.rfc3526_2048;
- }
-
- protected override int[] GetCipherSuites()
- {
- return new int[]
- {
- CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
- CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
- CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
- CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
- CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
- CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
- CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
- CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
- CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
- CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
- CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
- CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
- CipherSuite.TLS_RSA_WITH_AES_256_GCM_SHA384,
- CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256,
- CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256,
- CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256,
- CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA,
- CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA,
- };
- }
-
- public override TlsCredentials GetCredentials()
- {
- int keyExchangeAlgorithm = TlsUtilities.GetKeyExchangeAlgorithm(mSelectedCipherSuite);
-
- switch (keyExchangeAlgorithm)
- {
- case KeyExchangeAlgorithm.DHE_DSS:
- return GetDsaSignerCredentials();
-
- case KeyExchangeAlgorithm.DH_anon:
- case KeyExchangeAlgorithm.ECDH_anon:
- return null;
-
- case KeyExchangeAlgorithm.ECDHE_ECDSA:
- return GetECDsaSignerCredentials();
-
- case KeyExchangeAlgorithm.DHE_RSA:
- case KeyExchangeAlgorithm.ECDHE_RSA:
- return GetRsaSignerCredentials();
-
- case KeyExchangeAlgorithm.RSA:
- return GetRsaEncryptionCredentials();
-
- default:
- /* Note: internal error here; selected a key exchange we don't implement! */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public override TlsKeyExchange GetKeyExchange()
- {
- int keyExchangeAlgorithm = TlsUtilities.GetKeyExchangeAlgorithm(mSelectedCipherSuite);
-
- switch (keyExchangeAlgorithm)
- {
- case KeyExchangeAlgorithm.DH_anon:
- case KeyExchangeAlgorithm.DH_DSS:
- case KeyExchangeAlgorithm.DH_RSA:
- return CreateDHKeyExchange(keyExchangeAlgorithm);
-
- case KeyExchangeAlgorithm.DHE_DSS:
- case KeyExchangeAlgorithm.DHE_RSA:
- return CreateDheKeyExchange(keyExchangeAlgorithm);
-
- case KeyExchangeAlgorithm.ECDH_anon:
- case KeyExchangeAlgorithm.ECDH_ECDSA:
- case KeyExchangeAlgorithm.ECDH_RSA:
- return CreateECDHKeyExchange(keyExchangeAlgorithm);
-
- case KeyExchangeAlgorithm.ECDHE_ECDSA:
- case KeyExchangeAlgorithm.ECDHE_RSA:
- return CreateECDheKeyExchange(keyExchangeAlgorithm);
-
- case KeyExchangeAlgorithm.RSA:
- return CreateRsaKeyExchange();
-
- default:
- /*
- * Note: internal error here; the TlsProtocol implementation verifies that the
- * server-selected cipher suite was in the list of client-offered cipher suites, so if
- * we now can't produce an implementation, we shouldn't have offered it!
- */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- protected virtual TlsKeyExchange CreateDHKeyExchange(int keyExchange)
- {
- return new TlsDHKeyExchange(keyExchange, mSupportedSignatureAlgorithms, GetDHParameters());
- }
-
- protected virtual TlsKeyExchange CreateDheKeyExchange(int keyExchange)
- {
- return new TlsDheKeyExchange(keyExchange, mSupportedSignatureAlgorithms, GetDHParameters());
- }
-
- protected virtual TlsKeyExchange CreateECDHKeyExchange(int keyExchange)
- {
- return new TlsECDHKeyExchange(keyExchange, mSupportedSignatureAlgorithms, mNamedCurves, mClientECPointFormats,
- mServerECPointFormats);
- }
-
- protected virtual TlsKeyExchange CreateECDheKeyExchange(int keyExchange)
- {
- return new TlsECDheKeyExchange(keyExchange, mSupportedSignatureAlgorithms, mNamedCurves, mClientECPointFormats,
- mServerECPointFormats);
- }
-
- protected virtual TlsKeyExchange CreateRsaKeyExchange()
- {
- return new TlsRsaKeyExchange(mSupportedSignatureAlgorithms);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DefaultTlsSignerCredentials.cs b/BCCrypto/src/crypto/tls/DefaultTlsSignerCredentials.cs
deleted file mode 100644
index 0ff732a..0000000
--- a/BCCrypto/src/crypto/tls/DefaultTlsSignerCredentials.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class DefaultTlsSignerCredentials
- : AbstractTlsSignerCredentials
- {
- protected readonly TlsContext mContext;
- protected readonly Certificate mCertificate;
- protected readonly AsymmetricKeyParameter mPrivateKey;
- protected readonly SignatureAndHashAlgorithm mSignatureAndHashAlgorithm;
-
- protected readonly TlsSigner mSigner;
-
- public DefaultTlsSignerCredentials(TlsContext context, Certificate certificate, AsymmetricKeyParameter privateKey)
- : this(context, certificate, privateKey, null)
- {
- }
-
- public DefaultTlsSignerCredentials(TlsContext context, Certificate certificate, AsymmetricKeyParameter privateKey,
- SignatureAndHashAlgorithm signatureAndHashAlgorithm)
- {
- if (certificate == null)
- throw new ArgumentNullException("certificate");
- if (certificate.IsEmpty)
- throw new ArgumentException("cannot be empty", "clientCertificate");
- if (privateKey == null)
- throw new ArgumentNullException("privateKey");
- if (!privateKey.IsPrivate)
- throw new ArgumentException("must be private", "privateKey");
- if (TlsUtilities.IsTlsV12(context) && signatureAndHashAlgorithm == null)
- throw new ArgumentException("cannot be null for (D)TLS 1.2+", "signatureAndHashAlgorithm");
-
- if (privateKey is RsaKeyParameters)
- {
- mSigner = new TlsRsaSigner();
- }
- else if (privateKey is DsaPrivateKeyParameters)
- {
- mSigner = new TlsDssSigner();
- }
- else if (privateKey is ECPrivateKeyParameters)
- {
- mSigner = new TlsECDsaSigner();
- }
- else
- {
- throw new ArgumentException("type not supported: " + Platform.GetTypeName(privateKey), "privateKey");
- }
-
- this.mSigner.Init(context);
-
- this.mContext = context;
- this.mCertificate = certificate;
- this.mPrivateKey = privateKey;
- this.mSignatureAndHashAlgorithm = signatureAndHashAlgorithm;
- }
-
- public override Certificate Certificate
- {
- get { return mCertificate; }
- }
-
- ///
- public override byte[] GenerateCertificateSignature(byte[] hash)
- {
- try
- {
- if (TlsUtilities.IsTlsV12(mContext))
- {
- return mSigner.GenerateRawSignature(mSignatureAndHashAlgorithm, mPrivateKey, hash);
- }
- else
- {
- return mSigner.GenerateRawSignature(mPrivateKey, hash);
- }
- }
- catch (CryptoException e)
- {
- throw new TlsFatalAlert(AlertDescription.internal_error, e);
- }
- }
-
- public override SignatureAndHashAlgorithm SignatureAndHashAlgorithm
- {
- get { return mSignatureAndHashAlgorithm; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DefaultTlsSrpGroupVerifier.cs b/BCCrypto/src/crypto/tls/DefaultTlsSrpGroupVerifier.cs
deleted file mode 100644
index cc933bf..0000000
--- a/BCCrypto/src/crypto/tls/DefaultTlsSrpGroupVerifier.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto.Agreement.Srp;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class DefaultTlsSrpGroupVerifier
- : TlsSrpGroupVerifier
- {
- protected static readonly IList DefaultGroups = Platform.CreateArrayList();
-
- static DefaultTlsSrpGroupVerifier()
- {
- DefaultGroups.Add(Srp6StandardGroups.rfc5054_1024);
- DefaultGroups.Add(Srp6StandardGroups.rfc5054_1536);
- DefaultGroups.Add(Srp6StandardGroups.rfc5054_2048);
- DefaultGroups.Add(Srp6StandardGroups.rfc5054_3072);
- DefaultGroups.Add(Srp6StandardGroups.rfc5054_4096);
- DefaultGroups.Add(Srp6StandardGroups.rfc5054_6144);
- DefaultGroups.Add(Srp6StandardGroups.rfc5054_8192);
- }
-
- // Vector is (SRP6GroupParameters)
- protected readonly IList mGroups;
-
- /**
- * Accept only the group parameters specified in RFC 5054 Appendix A.
- */
- public DefaultTlsSrpGroupVerifier()
- : this(DefaultGroups)
- {
- }
-
- /**
- * Specify a custom set of acceptable group parameters.
- *
- * @param groups a {@link Vector} of acceptable {@link SRP6GroupParameters}
- */
- public DefaultTlsSrpGroupVerifier(IList groups)
- {
- this.mGroups = groups;
- }
-
- public virtual bool Accept(Srp6GroupParameters group)
- {
- foreach (Srp6GroupParameters entry in mGroups)
- {
- if (AreGroupsEqual(group, entry))
- {
- return true;
- }
- }
- return false;
- }
-
- protected virtual bool AreGroupsEqual(Srp6GroupParameters a, Srp6GroupParameters b)
- {
- return a == b || (AreParametersEqual(a.N, b.N) && AreParametersEqual(a.G, b.G));
- }
-
- protected virtual bool AreParametersEqual(BigInteger a, BigInteger b)
- {
- return a == b || a.Equals(b);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DeferredHash.cs b/BCCrypto/src/crypto/tls/DeferredHash.cs
deleted file mode 100644
index f402f26..0000000
--- a/BCCrypto/src/crypto/tls/DeferredHash.cs
+++ /dev/null
@@ -1,201 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * Buffers input until the hash algorithm is determined.
- */
- internal class DeferredHash
- : TlsHandshakeHash
- {
- protected const int BUFFERING_HASH_LIMIT = 4;
-
- protected TlsContext mContext;
-
- private DigestInputBuffer mBuf;
- private IDictionary mHashes;
- private int mPrfHashAlgorithm;
-
- internal DeferredHash()
- {
- this.mBuf = new DigestInputBuffer();
- this.mHashes = Platform.CreateHashtable();
- this.mPrfHashAlgorithm = -1;
- }
-
- private DeferredHash(byte prfHashAlgorithm, IDigest prfHash)
- {
- this.mBuf = null;
- this.mHashes = Platform.CreateHashtable();
- this.mPrfHashAlgorithm = prfHashAlgorithm;
- mHashes[prfHashAlgorithm] = prfHash;
- }
-
- public virtual void Init(TlsContext context)
- {
- this.mContext = context;
- }
-
- public virtual TlsHandshakeHash NotifyPrfDetermined()
- {
- int prfAlgorithm = mContext.SecurityParameters.PrfAlgorithm;
- if (prfAlgorithm == PrfAlgorithm.tls_prf_legacy)
- {
- CombinedHash legacyHash = new CombinedHash();
- legacyHash.Init(mContext);
- mBuf.UpdateDigest(legacyHash);
- return legacyHash.NotifyPrfDetermined();
- }
-
- this.mPrfHashAlgorithm = TlsUtilities.GetHashAlgorithmForPrfAlgorithm(prfAlgorithm);
-
- CheckTrackingHash((byte)mPrfHashAlgorithm);
-
- return this;
- }
-
- public virtual void TrackHashAlgorithm(byte hashAlgorithm)
- {
- if (mBuf == null)
- throw new InvalidOperationException("Too late to track more hash algorithms");
-
- CheckTrackingHash(hashAlgorithm);
- }
-
- public virtual void SealHashAlgorithms()
- {
- CheckStopBuffering();
- }
-
- public virtual TlsHandshakeHash StopTracking()
- {
- byte prfHashAlgorithm = (byte)mPrfHashAlgorithm;
- IDigest prfHash = TlsUtilities.CloneHash(prfHashAlgorithm, (IDigest)mHashes[prfHashAlgorithm]);
- if (mBuf != null)
- {
- mBuf.UpdateDigest(prfHash);
- }
- DeferredHash result = new DeferredHash(prfHashAlgorithm, prfHash);
- result.Init(mContext);
- return result;
- }
-
- public virtual IDigest ForkPrfHash()
- {
- CheckStopBuffering();
-
- byte prfHashAlgorithm = (byte)mPrfHashAlgorithm;
- if (mBuf != null)
- {
- IDigest prfHash = TlsUtilities.CreateHash(prfHashAlgorithm);
- mBuf.UpdateDigest(prfHash);
- return prfHash;
- }
-
- return TlsUtilities.CloneHash(prfHashAlgorithm, (IDigest)mHashes[prfHashAlgorithm]);
- }
-
- public virtual byte[] GetFinalHash(byte hashAlgorithm)
- {
- IDigest d = (IDigest)mHashes[hashAlgorithm];
- if (d == null)
- throw new InvalidOperationException("HashAlgorithm." + HashAlgorithm.GetText(hashAlgorithm) + " is not being tracked");
-
- d = TlsUtilities.CloneHash(hashAlgorithm, d);
- if (mBuf != null)
- {
- mBuf.UpdateDigest(d);
- }
-
- return DigestUtilities.DoFinal(d);
- }
-
- public virtual string AlgorithmName
- {
- get { throw new InvalidOperationException("Use Fork() to get a definite IDigest"); }
- }
-
- public virtual int GetByteLength()
- {
- throw new InvalidOperationException("Use Fork() to get a definite IDigest");
- }
-
- public virtual int GetDigestSize()
- {
- throw new InvalidOperationException("Use Fork() to get a definite IDigest");
- }
-
- public virtual void Update(byte input)
- {
- if (mBuf != null)
- {
- mBuf.WriteByte(input);
- return;
- }
-
- foreach (IDigest hash in mHashes.Values)
- {
- hash.Update(input);
- }
- }
-
- public virtual void BlockUpdate(byte[] input, int inOff, int len)
- {
- if (mBuf != null)
- {
- mBuf.Write(input, inOff, len);
- return;
- }
-
- foreach (IDigest hash in mHashes.Values)
- {
- hash.BlockUpdate(input, inOff, len);
- }
- }
-
- public virtual int DoFinal(byte[] output, int outOff)
- {
- throw new InvalidOperationException("Use Fork() to get a definite IDigest");
- }
-
- public virtual void Reset()
- {
- if (mBuf != null)
- {
- mBuf.SetLength(0);
- return;
- }
-
- foreach (IDigest hash in mHashes.Values)
- {
- hash.Reset();
- }
- }
-
- protected virtual void CheckStopBuffering()
- {
- if (mBuf != null && mHashes.Count <= BUFFERING_HASH_LIMIT)
- {
- foreach (IDigest hash in mHashes.Values)
- {
- mBuf.UpdateDigest(hash);
- }
-
- this.mBuf = null;
- }
- }
-
- protected virtual void CheckTrackingHash(byte hashAlgorithm)
- {
- if (!mHashes.Contains(hashAlgorithm))
- {
- IDigest hash = TlsUtilities.CreateHash(hashAlgorithm);
- mHashes[hashAlgorithm] = hash;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DigestInputBuffer.cs b/BCCrypto/src/crypto/tls/DigestInputBuffer.cs
deleted file mode 100644
index 4435b40..0000000
--- a/BCCrypto/src/crypto/tls/DigestInputBuffer.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- internal class DigestInputBuffer
- : MemoryStream
- {
- internal void UpdateDigest(IDigest d)
- {
- Streams.WriteBufTo(this, new DigStream(d));
- }
-
- private class DigStream
- : BaseOutputStream
- {
- private readonly IDigest d;
-
- internal DigStream(IDigest d)
- {
- this.d = d;
- }
-
- public override void WriteByte(byte b)
- {
- d.Update(b);
- }
-
- public override void Write(byte[] buf, int off, int len)
- {
- d.BlockUpdate(buf, off, len);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DigitallySigned.cs b/BCCrypto/src/crypto/tls/DigitallySigned.cs
deleted file mode 100644
index 8b7344f..0000000
--- a/BCCrypto/src/crypto/tls/DigitallySigned.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class DigitallySigned
- {
- protected readonly SignatureAndHashAlgorithm mAlgorithm;
- protected readonly byte[] mSignature;
-
- public DigitallySigned(SignatureAndHashAlgorithm algorithm, byte[] signature)
- {
- if (signature == null)
- throw new ArgumentNullException("signature");
-
- this.mAlgorithm = algorithm;
- this.mSignature = signature;
- }
-
- /**
- * @return a {@link SignatureAndHashAlgorithm} (or null before TLS 1.2).
- */
- public virtual SignatureAndHashAlgorithm Algorithm
- {
- get { return mAlgorithm; }
- }
-
- public virtual byte[] Signature
- {
- get { return mSignature; }
- }
-
- /**
- * Encode this {@link DigitallySigned} to a {@link Stream}.
- *
- * @param output
- * the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- if (mAlgorithm != null)
- {
- mAlgorithm.Encode(output);
- }
- TlsUtilities.WriteOpaque16(mSignature, output);
- }
-
- /**
- * Parse a {@link DigitallySigned} from a {@link Stream}.
- *
- * @param context
- * the {@link TlsContext} of the current connection.
- * @param input
- * the {@link Stream} to parse from.
- * @return a {@link DigitallySigned} object.
- * @throws IOException
- */
- public static DigitallySigned Parse(TlsContext context, Stream input)
- {
- SignatureAndHashAlgorithm algorithm = null;
- if (TlsUtilities.IsTlsV12(context))
- {
- algorithm = SignatureAndHashAlgorithm.Parse(input);
- }
- byte[] signature = TlsUtilities.ReadOpaque16(input);
- return new DigitallySigned(algorithm, signature);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DtlsClientProtocol.cs b/BCCrypto/src/crypto/tls/DtlsClientProtocol.cs
deleted file mode 100644
index ae6e6a5..0000000
--- a/BCCrypto/src/crypto/tls/DtlsClientProtocol.cs
+++ /dev/null
@@ -1,857 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class DtlsClientProtocol
- : DtlsProtocol
- {
- public DtlsClientProtocol(SecureRandom secureRandom)
- : base(secureRandom)
- {
- }
-
- public virtual DtlsTransport Connect(TlsClient client, DatagramTransport transport)
- {
- if (client == null)
- throw new ArgumentNullException("client");
- if (transport == null)
- throw new ArgumentNullException("transport");
-
- SecurityParameters securityParameters = new SecurityParameters();
- securityParameters.entity = ConnectionEnd.client;
-
- ClientHandshakeState state = new ClientHandshakeState();
- state.client = client;
- state.clientContext = new TlsClientContextImpl(mSecureRandom, securityParameters);
-
- securityParameters.clientRandom = TlsProtocol.CreateRandomBlock(client.ShouldUseGmtUnixTime(),
- state.clientContext.NonceRandomGenerator);
-
- client.Init(state.clientContext);
-
- DtlsRecordLayer recordLayer = new DtlsRecordLayer(transport, state.clientContext, client, ContentType.handshake);
-
- TlsSession sessionToResume = state.client.GetSessionToResume();
- if (sessionToResume != null && sessionToResume.IsResumable)
- {
- SessionParameters sessionParameters = sessionToResume.ExportSessionParameters();
- if (sessionParameters != null)
- {
- state.tlsSession = sessionToResume;
- state.sessionParameters = sessionParameters;
- }
- }
-
- try
- {
- return ClientHandshake(state, recordLayer);
- }
- catch (TlsFatalAlert fatalAlert)
- {
- AbortClientHandshake(state, recordLayer, fatalAlert.AlertDescription);
- throw fatalAlert;
- }
- catch (IOException e)
- {
- AbortClientHandshake(state, recordLayer, AlertDescription.internal_error);
- throw e;
- }
- catch (Exception e)
- {
- AbortClientHandshake(state, recordLayer, AlertDescription.internal_error);
- throw new TlsFatalAlert(AlertDescription.internal_error, e);
- }
- finally
- {
- securityParameters.Clear();
- }
- }
-
- internal virtual void AbortClientHandshake(ClientHandshakeState state, DtlsRecordLayer recordLayer, byte alertDescription)
- {
- recordLayer.Fail(alertDescription);
- InvalidateSession(state);
- }
-
- internal virtual DtlsTransport ClientHandshake(ClientHandshakeState state, DtlsRecordLayer recordLayer)
- {
- SecurityParameters securityParameters = state.clientContext.SecurityParameters;
- DtlsReliableHandshake handshake = new DtlsReliableHandshake(state.clientContext, recordLayer);
-
- byte[] clientHelloBody = GenerateClientHello(state, state.client);
-
- recordLayer.SetWriteVersion(ProtocolVersion.DTLSv10);
-
- handshake.SendMessage(HandshakeType.client_hello, clientHelloBody);
-
- DtlsReliableHandshake.Message serverMessage = handshake.ReceiveMessage();
-
- while (serverMessage.Type == HandshakeType.hello_verify_request)
- {
- ProtocolVersion recordLayerVersion = recordLayer.ReadVersion;
- ProtocolVersion client_version = state.clientContext.ClientVersion;
-
- /*
- * RFC 6347 4.2.1 DTLS 1.2 server implementations SHOULD use DTLS version 1.0 regardless of
- * the version of TLS that is expected to be negotiated. DTLS 1.2 and 1.0 clients MUST use
- * the version solely to indicate packet formatting (which is the same in both DTLS 1.2 and
- * 1.0) and not as part of version negotiation.
- */
- if (!recordLayerVersion.IsEqualOrEarlierVersionOf(client_version))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- recordLayer.ReadVersion = null;
-
- byte[] cookie = ProcessHelloVerifyRequest(state, serverMessage.Body);
- byte[] patched = PatchClientHelloWithCookie(clientHelloBody, cookie);
-
- handshake.ResetHandshakeMessagesDigest();
- handshake.SendMessage(HandshakeType.client_hello, patched);
-
- serverMessage = handshake.ReceiveMessage();
- }
-
- if (serverMessage.Type == HandshakeType.server_hello)
- {
- ProtocolVersion recordLayerVersion = recordLayer.ReadVersion;
- ReportServerVersion(state, recordLayerVersion);
- recordLayer.SetWriteVersion(recordLayerVersion);
-
- ProcessServerHello(state, serverMessage.Body);
- }
- else
- {
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- handshake.NotifyHelloComplete();
-
- ApplyMaxFragmentLengthExtension(recordLayer, securityParameters.maxFragmentLength);
-
- if (state.resumedSession)
- {
- securityParameters.masterSecret = Arrays.Clone(state.sessionParameters.MasterSecret);
- recordLayer.InitPendingEpoch(state.client.GetCipher());
-
- // NOTE: Calculated exclusive of the actual Finished message from the server
- byte[] resExpectedServerVerifyData = TlsUtilities.CalculateVerifyData(state.clientContext, ExporterLabel.server_finished,
- TlsProtocol.GetCurrentPrfHash(state.clientContext, handshake.HandshakeHash, null));
- ProcessFinished(handshake.ReceiveMessageBody(HandshakeType.finished), resExpectedServerVerifyData);
-
- // NOTE: Calculated exclusive of the Finished message itself
- byte[] resClientVerifyData = TlsUtilities.CalculateVerifyData(state.clientContext, ExporterLabel.client_finished,
- TlsProtocol.GetCurrentPrfHash(state.clientContext, handshake.HandshakeHash, null));
- handshake.SendMessage(HandshakeType.finished, resClientVerifyData);
-
- handshake.Finish();
-
- state.clientContext.SetResumableSession(state.tlsSession);
-
- state.client.NotifyHandshakeComplete();
-
- return new DtlsTransport(recordLayer);
- }
-
- InvalidateSession(state);
-
- if (state.selectedSessionID.Length > 0)
- {
- state.tlsSession = new TlsSessionImpl(state.selectedSessionID, null);
- }
-
- serverMessage = handshake.ReceiveMessage();
-
- if (serverMessage.Type == HandshakeType.supplemental_data)
- {
- ProcessServerSupplementalData(state, serverMessage.Body);
- serverMessage = handshake.ReceiveMessage();
- }
- else
- {
- state.client.ProcessServerSupplementalData(null);
- }
-
- state.keyExchange = state.client.GetKeyExchange();
- state.keyExchange.Init(state.clientContext);
-
- Certificate serverCertificate = null;
-
- if (serverMessage.Type == HandshakeType.certificate)
- {
- serverCertificate = ProcessServerCertificate(state, serverMessage.Body);
- serverMessage = handshake.ReceiveMessage();
- }
- else
- {
- // Okay, Certificate is optional
- state.keyExchange.SkipServerCredentials();
- }
-
- // TODO[RFC 3546] Check whether empty certificates is possible, allowed, or excludes CertificateStatus
- if (serverCertificate == null || serverCertificate.IsEmpty)
- {
- state.allowCertificateStatus = false;
- }
-
- if (serverMessage.Type == HandshakeType.certificate_status)
- {
- ProcessCertificateStatus(state, serverMessage.Body);
- serverMessage = handshake.ReceiveMessage();
- }
- else
- {
- // Okay, CertificateStatus is optional
- }
-
- if (serverMessage.Type == HandshakeType.server_key_exchange)
- {
- ProcessServerKeyExchange(state, serverMessage.Body);
- serverMessage = handshake.ReceiveMessage();
- }
- else
- {
- // Okay, ServerKeyExchange is optional
- state.keyExchange.SkipServerKeyExchange();
- }
-
- if (serverMessage.Type == HandshakeType.certificate_request)
- {
- ProcessCertificateRequest(state, serverMessage.Body);
-
- /*
- * TODO Give the client a chance to immediately select the CertificateVerify hash
- * algorithm here to avoid tracking the other hash algorithms unnecessarily?
- */
- TlsUtilities.TrackHashAlgorithms(handshake.HandshakeHash,
- state.certificateRequest.SupportedSignatureAlgorithms);
-
- serverMessage = handshake.ReceiveMessage();
- }
- else
- {
- // Okay, CertificateRequest is optional
- }
-
- if (serverMessage.Type == HandshakeType.server_hello_done)
- {
- if (serverMessage.Body.Length != 0)
- {
- throw new TlsFatalAlert(AlertDescription.decode_error);
- }
- }
- else
- {
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- handshake.HandshakeHash.SealHashAlgorithms();
-
- IList clientSupplementalData = state.client.GetClientSupplementalData();
- if (clientSupplementalData != null)
- {
- byte[] supplementalDataBody = GenerateSupplementalData(clientSupplementalData);
- handshake.SendMessage(HandshakeType.supplemental_data, supplementalDataBody);
- }
-
- if (state.certificateRequest != null)
- {
- state.clientCredentials = state.authentication.GetClientCredentials(state.certificateRequest);
-
- /*
- * RFC 5246 If no suitable certificate is available, the client MUST send a certificate
- * message containing no certificates.
- *
- * NOTE: In previous RFCs, this was SHOULD instead of MUST.
- */
- Certificate clientCertificate = null;
- if (state.clientCredentials != null)
- {
- clientCertificate = state.clientCredentials.Certificate;
- }
- if (clientCertificate == null)
- {
- clientCertificate = Certificate.EmptyChain;
- }
-
- byte[] certificateBody = GenerateCertificate(clientCertificate);
- handshake.SendMessage(HandshakeType.certificate, certificateBody);
- }
-
- if (state.clientCredentials != null)
- {
- state.keyExchange.ProcessClientCredentials(state.clientCredentials);
- }
- else
- {
- state.keyExchange.SkipClientCredentials();
- }
-
- byte[] clientKeyExchangeBody = GenerateClientKeyExchange(state);
- handshake.SendMessage(HandshakeType.client_key_exchange, clientKeyExchangeBody);
-
- TlsHandshakeHash prepareFinishHash = handshake.PrepareToFinish();
- securityParameters.sessionHash = TlsProtocol.GetCurrentPrfHash(state.clientContext, prepareFinishHash, null);
-
- TlsProtocol.EstablishMasterSecret(state.clientContext, state.keyExchange);
- recordLayer.InitPendingEpoch(state.client.GetCipher());
-
- if (state.clientCredentials != null && state.clientCredentials is TlsSignerCredentials)
- {
- TlsSignerCredentials signerCredentials = (TlsSignerCredentials)state.clientCredentials;
-
- /*
- * RFC 5246 4.7. digitally-signed element needs SignatureAndHashAlgorithm from TLS 1.2
- */
- SignatureAndHashAlgorithm signatureAndHashAlgorithm = TlsUtilities.GetSignatureAndHashAlgorithm(
- state.clientContext, signerCredentials);
-
- byte[] hash;
- if (signatureAndHashAlgorithm == null)
- {
- hash = securityParameters.SessionHash;
- }
- else
- {
- hash = prepareFinishHash.GetFinalHash(signatureAndHashAlgorithm.Hash);
- }
-
- byte[] signature = signerCredentials.GenerateCertificateSignature(hash);
- DigitallySigned certificateVerify = new DigitallySigned(signatureAndHashAlgorithm, signature);
- byte[] certificateVerifyBody = GenerateCertificateVerify(state, certificateVerify);
- handshake.SendMessage(HandshakeType.certificate_verify, certificateVerifyBody);
- }
-
- // NOTE: Calculated exclusive of the Finished message itself
- byte[] clientVerifyData = TlsUtilities.CalculateVerifyData(state.clientContext, ExporterLabel.client_finished,
- TlsProtocol.GetCurrentPrfHash(state.clientContext, handshake.HandshakeHash, null));
- handshake.SendMessage(HandshakeType.finished, clientVerifyData);
-
- if (state.expectSessionTicket)
- {
- serverMessage = handshake.ReceiveMessage();
- if (serverMessage.Type == HandshakeType.session_ticket)
- {
- ProcessNewSessionTicket(state, serverMessage.Body);
- }
- else
- {
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- }
-
- // NOTE: Calculated exclusive of the actual Finished message from the server
- byte[] expectedServerVerifyData = TlsUtilities.CalculateVerifyData(state.clientContext, ExporterLabel.server_finished,
- TlsProtocol.GetCurrentPrfHash(state.clientContext, handshake.HandshakeHash, null));
- ProcessFinished(handshake.ReceiveMessageBody(HandshakeType.finished), expectedServerVerifyData);
-
- handshake.Finish();
-
- if (state.tlsSession != null)
- {
- state.sessionParameters = new SessionParameters.Builder()
- .SetCipherSuite(securityParameters.CipherSuite)
- .SetCompressionAlgorithm(securityParameters.CompressionAlgorithm)
- .SetMasterSecret(securityParameters.MasterSecret)
- .SetPeerCertificate(serverCertificate)
- .SetPskIdentity(securityParameters.PskIdentity)
- .SetSrpIdentity(securityParameters.SrpIdentity)
- // TODO Consider filtering extensions that aren't relevant to resumed sessions
- .SetServerExtensions(state.serverExtensions)
- .Build();
-
- state.tlsSession = TlsUtilities.ImportSession(state.tlsSession.SessionID, state.sessionParameters);
-
- state.clientContext.SetResumableSession(state.tlsSession);
- }
-
- state.client.NotifyHandshakeComplete();
-
- return new DtlsTransport(recordLayer);
- }
-
- protected virtual byte[] GenerateCertificateVerify(ClientHandshakeState state, DigitallySigned certificateVerify)
- {
- MemoryStream buf = new MemoryStream();
- certificateVerify.Encode(buf);
- return buf.ToArray();
- }
-
- protected virtual byte[] GenerateClientHello(ClientHandshakeState state, TlsClient client)
- {
- MemoryStream buf = new MemoryStream();
-
- ProtocolVersion client_version = client.ClientVersion;
- if (!client_version.IsDtls)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- TlsClientContextImpl context = state.clientContext;
-
- context.SetClientVersion(client_version);
- TlsUtilities.WriteVersion(client_version, buf);
-
- SecurityParameters securityParameters = context.SecurityParameters;
- buf.Write(securityParameters.ClientRandom, 0, securityParameters.ClientRandom.Length);
-
- // Session ID
- byte[] session_id = TlsUtilities.EmptyBytes;
- if (state.tlsSession != null)
- {
- session_id = state.tlsSession.SessionID;
- if (session_id == null || session_id.Length > 32)
- {
- session_id = TlsUtilities.EmptyBytes;
- }
- }
- TlsUtilities.WriteOpaque8(session_id, buf);
-
- // Cookie
- TlsUtilities.WriteOpaque8(TlsUtilities.EmptyBytes, buf);
-
- bool fallback = client.IsFallback;
-
- /*
- * Cipher suites
- */
- state.offeredCipherSuites = client.GetCipherSuites();
-
- // Integer -> byte[]
- state.clientExtensions = client.GetClientExtensions();
-
- // Cipher Suites (and SCSV)
- {
- /*
- * RFC 5746 3.4. The client MUST include either an empty "renegotiation_info" extension,
- * or the TLS_EMPTY_RENEGOTIATION_INFO_SCSV signaling cipher suite value in the
- * ClientHello. Including both is NOT RECOMMENDED.
- */
- byte[] renegExtData = TlsUtilities.GetExtensionData(state.clientExtensions, ExtensionType.renegotiation_info);
- bool noRenegExt = (null == renegExtData);
-
- bool noRenegSCSV = !Arrays.Contains(state.offeredCipherSuites, CipherSuite.TLS_EMPTY_RENEGOTIATION_INFO_SCSV);
-
- if (noRenegExt && noRenegSCSV)
- {
- // TODO Consider whether to default to a client extension instead
- state.offeredCipherSuites = Arrays.Append(state.offeredCipherSuites, CipherSuite.TLS_EMPTY_RENEGOTIATION_INFO_SCSV);
- }
-
- /*
- * RFC 7507 4. If a client sends a ClientHello.client_version containing a lower value
- * than the latest (highest-valued) version supported by the client, it SHOULD include
- * the TLS_FALLBACK_SCSV cipher suite value in ClientHello.cipher_suites [..]. (The
- * client SHOULD put TLS_FALLBACK_SCSV after all cipher suites that it actually intends
- * to negotiate.)
- */
- if (fallback && !Arrays.Contains(state.offeredCipherSuites, CipherSuite.TLS_FALLBACK_SCSV))
- {
- state.offeredCipherSuites = Arrays.Append(state.offeredCipherSuites, CipherSuite.TLS_FALLBACK_SCSV);
- }
-
- TlsUtilities.WriteUint16ArrayWithUint16Length(state.offeredCipherSuites, buf);
- }
-
- // TODO Add support for compression
- // Compression methods
- // state.offeredCompressionMethods = client.getCompressionMethods();
- state.offeredCompressionMethods = new byte[]{ CompressionMethod.cls_null };
-
- TlsUtilities.WriteUint8ArrayWithUint8Length(state.offeredCompressionMethods, buf);
-
- // Extensions
- if (state.clientExtensions != null)
- {
- TlsProtocol.WriteExtensions(buf, state.clientExtensions);
- }
-
- return buf.ToArray();
- }
-
- protected virtual byte[] GenerateClientKeyExchange(ClientHandshakeState state)
- {
- MemoryStream buf = new MemoryStream();
- state.keyExchange.GenerateClientKeyExchange(buf);
- return buf.ToArray();
- }
-
- protected virtual void InvalidateSession(ClientHandshakeState state)
- {
- if (state.sessionParameters != null)
- {
- state.sessionParameters.Clear();
- state.sessionParameters = null;
- }
-
- if (state.tlsSession != null)
- {
- state.tlsSession.Invalidate();
- state.tlsSession = null;
- }
- }
-
- protected virtual void ProcessCertificateRequest(ClientHandshakeState state, byte[] body)
- {
- if (state.authentication == null)
- {
- /*
- * RFC 2246 7.4.4. It is a fatal handshake_failure alert for an anonymous server to
- * request client identification.
- */
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
- }
-
- MemoryStream buf = new MemoryStream(body, false);
-
- state.certificateRequest = CertificateRequest.Parse(state.clientContext, buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- state.keyExchange.ValidateCertificateRequest(state.certificateRequest);
- }
-
- protected virtual void ProcessCertificateStatus(ClientHandshakeState state, byte[] body)
- {
- if (!state.allowCertificateStatus)
- {
- /*
- * RFC 3546 3.6. If a server returns a "CertificateStatus" message, then the
- * server MUST have included an extension of type "status_request" with empty
- * "extension_data" in the extended server hello..
- */
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- MemoryStream buf = new MemoryStream(body, false);
-
- state.certificateStatus = CertificateStatus.Parse(buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- // TODO[RFC 3546] Figure out how to provide this to the client/authentication.
- }
-
- protected virtual byte[] ProcessHelloVerifyRequest(ClientHandshakeState state, byte[] body)
- {
- MemoryStream buf = new MemoryStream(body, false);
-
- ProtocolVersion server_version = TlsUtilities.ReadVersion(buf);
- byte[] cookie = TlsUtilities.ReadOpaque8(buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- // TODO Seems this behaviour is not yet in line with OpenSSL for DTLS 1.2
- // reportServerVersion(state, server_version);
- if (!server_version.IsEqualOrEarlierVersionOf(state.clientContext.ClientVersion))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- /*
- * RFC 6347 This specification increases the cookie size limit to 255 bytes for greater
- * future flexibility. The limit remains 32 for previous versions of DTLS.
- */
- if (!ProtocolVersion.DTLSv12.IsEqualOrEarlierVersionOf(server_version) && cookie.Length > 32)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- return cookie;
- }
-
- protected virtual void ProcessNewSessionTicket(ClientHandshakeState state, byte[] body)
- {
- MemoryStream buf = new MemoryStream(body, false);
-
- NewSessionTicket newSessionTicket = NewSessionTicket.Parse(buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- state.client.NotifyNewSessionTicket(newSessionTicket);
- }
-
- protected virtual Certificate ProcessServerCertificate(ClientHandshakeState state, byte[] body)
- {
- MemoryStream buf = new MemoryStream(body, false);
-
- Certificate serverCertificate = Certificate.Parse(buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- state.keyExchange.ProcessServerCertificate(serverCertificate);
- state.authentication = state.client.GetAuthentication();
- state.authentication.NotifyServerCertificate(serverCertificate);
-
- return serverCertificate;
- }
-
- protected virtual void ProcessServerHello(ClientHandshakeState state, byte[] body)
- {
- SecurityParameters securityParameters = state.clientContext.SecurityParameters;
-
- MemoryStream buf = new MemoryStream(body, false);
-
- {
- ProtocolVersion server_version = TlsUtilities.ReadVersion(buf);
- ReportServerVersion(state, server_version);
- }
-
- securityParameters.serverRandom = TlsUtilities.ReadFully(32, buf);
-
- state.selectedSessionID = TlsUtilities.ReadOpaque8(buf);
- if (state.selectedSessionID.Length > 32)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- state.client.NotifySessionID(state.selectedSessionID);
- state.resumedSession = state.selectedSessionID.Length > 0 && state.tlsSession != null
- && Arrays.AreEqual(state.selectedSessionID, state.tlsSession.SessionID);
-
- int selectedCipherSuite = TlsUtilities.ReadUint16(buf);
- if (!Arrays.Contains(state.offeredCipherSuites, selectedCipherSuite)
- || selectedCipherSuite == CipherSuite.TLS_NULL_WITH_NULL_NULL
- || CipherSuite.IsScsv(selectedCipherSuite)
- || !TlsUtilities.IsValidCipherSuiteForVersion(selectedCipherSuite, state.clientContext.ServerVersion))
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- ValidateSelectedCipherSuite(selectedCipherSuite, AlertDescription.illegal_parameter);
- state.client.NotifySelectedCipherSuite(selectedCipherSuite);
-
- byte selectedCompressionMethod = TlsUtilities.ReadUint8(buf);
- if (!Arrays.Contains(state.offeredCompressionMethods, selectedCompressionMethod))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- state.client.NotifySelectedCompressionMethod(selectedCompressionMethod);
-
- /*
- * RFC3546 2.2 The extended server hello message format MAY be sent in place of the server
- * hello message when the client has requested extended functionality via the extended
- * client hello message specified in Section 2.1. ... Note that the extended server hello
- * message is only sent in response to an extended client hello message. This prevents the
- * possibility that the extended server hello message could "break" existing TLS 1.0
- * clients.
- */
-
- /*
- * TODO RFC 3546 2.3 If [...] the older session is resumed, then the server MUST ignore
- * extensions appearing in the client hello, and send a server hello containing no
- * extensions.
- */
-
- // Integer -> byte[]
- state.serverExtensions = TlsProtocol.ReadExtensions(buf);
-
- /*
- * RFC 3546 2.2 Note that the extended server hello message is only sent in response to an
- * extended client hello message. However, see RFC 5746 exception below. We always include
- * the SCSV, so an Extended Server Hello is always allowed.
- */
- if (state.serverExtensions != null)
- {
- foreach (int extType in state.serverExtensions.Keys)
- {
- /*
- * RFC 5746 3.6. Note that sending a "renegotiation_info" extension in response to a
- * ClientHello containing only the SCSV is an explicit exception to the prohibition
- * in RFC 5246, Section 7.4.1.4, on the server sending unsolicited extensions and is
- * only allowed because the client is signaling its willingness to receive the
- * extension via the TLS_EMPTY_RENEGOTIATION_INFO_SCSV SCSV.
- */
- if (extType == ExtensionType.renegotiation_info)
- continue;
-
- /*
- * RFC 5246 7.4.1.4 An extension type MUST NOT appear in the ServerHello unless the
- * same extension type appeared in the corresponding ClientHello. If a client
- * receives an extension type in ServerHello that it did not request in the
- * associated ClientHello, it MUST abort the handshake with an unsupported_extension
- * fatal alert.
- */
- if (null == TlsUtilities.GetExtensionData(state.clientExtensions, extType))
- throw new TlsFatalAlert(AlertDescription.unsupported_extension);
-
- /*
- * RFC 3546 2.3. If [...] the older session is resumed, then the server MUST ignore
- * extensions appearing in the client hello, and send a server hello containing no
- * extensions[.]
- */
- if (state.resumedSession)
- {
- // TODO[compat-gnutls] GnuTLS test server sends server extensions e.g. ec_point_formats
- // TODO[compat-openssl] OpenSSL test server sends server extensions e.g. ec_point_formats
- // TODO[compat-polarssl] PolarSSL test server sends server extensions e.g. ec_point_formats
- //throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
- }
-
- /*
- * RFC 5746 3.4. Client Behavior: Initial Handshake
- */
- {
- /*
- * When a ServerHello is received, the client MUST check if it includes the
- * "renegotiation_info" extension:
- */
- byte[] renegExtData = TlsUtilities.GetExtensionData(state.serverExtensions, ExtensionType.renegotiation_info);
- if (renegExtData != null)
- {
- /*
- * If the extension is present, set the secure_renegotiation flag to TRUE. The
- * client MUST then verify that the length of the "renegotiated_connection"
- * field is zero, and if it is not, MUST abort the handshake (by sending a fatal
- * handshake_failure alert).
- */
- state.secure_renegotiation = true;
-
- if (!Arrays.ConstantTimeAreEqual(renegExtData, TlsProtocol.CreateRenegotiationInfo(TlsUtilities.EmptyBytes)))
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
- }
- }
-
- // TODO[compat-gnutls] GnuTLS test server fails to send renegotiation_info extension when resuming
- state.client.NotifySecureRenegotiation(state.secure_renegotiation);
-
- IDictionary sessionClientExtensions = state.clientExtensions, sessionServerExtensions = state.serverExtensions;
- if (state.resumedSession)
- {
- if (selectedCipherSuite != state.sessionParameters.CipherSuite
- || selectedCompressionMethod != state.sessionParameters.CompressionAlgorithm)
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- sessionClientExtensions = null;
- sessionServerExtensions = state.sessionParameters.ReadServerExtensions();
- }
-
- securityParameters.cipherSuite = selectedCipherSuite;
- securityParameters.compressionAlgorithm = selectedCompressionMethod;
-
- if (sessionServerExtensions != null)
- {
- {
- /*
- * RFC 7366 3. If a server receives an encrypt-then-MAC request extension from a client
- * and then selects a stream or Authenticated Encryption with Associated Data (AEAD)
- * ciphersuite, it MUST NOT send an encrypt-then-MAC response extension back to the
- * client.
- */
- bool serverSentEncryptThenMAC = TlsExtensionsUtilities.HasEncryptThenMacExtension(sessionServerExtensions);
- if (serverSentEncryptThenMAC && !TlsUtilities.IsBlockCipherSuite(securityParameters.CipherSuite))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- securityParameters.encryptThenMac = serverSentEncryptThenMAC;
- }
-
- securityParameters.extendedMasterSecret = TlsExtensionsUtilities.HasExtendedMasterSecretExtension(sessionServerExtensions);
-
- securityParameters.maxFragmentLength = EvaluateMaxFragmentLengthExtension(state.resumedSession,
- sessionClientExtensions, sessionServerExtensions, AlertDescription.illegal_parameter);
-
- securityParameters.truncatedHMac = TlsExtensionsUtilities.HasTruncatedHMacExtension(sessionServerExtensions);
-
- /*
- * TODO It's surprising that there's no provision to allow a 'fresh' CertificateStatus to be
- * sent in a session resumption handshake.
- */
- state.allowCertificateStatus = !state.resumedSession
- && TlsUtilities.HasExpectedEmptyExtensionData(sessionServerExtensions, ExtensionType.status_request,
- AlertDescription.illegal_parameter);
-
- state.expectSessionTicket = !state.resumedSession
- && TlsUtilities.HasExpectedEmptyExtensionData(sessionServerExtensions, ExtensionType.session_ticket,
- AlertDescription.illegal_parameter);
- }
-
- /*
- * TODO[session-hash]
- *
- * draft-ietf-tls-session-hash-04 4. Clients and servers SHOULD NOT accept handshakes
- * that do not use the extended master secret [..]. (and see 5.2, 5.3)
- */
-
- if (sessionClientExtensions != null)
- {
- state.client.ProcessServerExtensions(sessionServerExtensions);
- }
-
- securityParameters.prfAlgorithm = TlsProtocol.GetPrfAlgorithm(state.clientContext,
- securityParameters.CipherSuite);
-
- /*
- * RFC 5246 7.4.9. Any cipher suite which does not explicitly specify verify_data_length has
- * a verify_data_length equal to 12. This includes all existing cipher suites.
- */
- securityParameters.verifyDataLength = 12;
- }
-
- protected virtual void ProcessServerKeyExchange(ClientHandshakeState state, byte[] body)
- {
- MemoryStream buf = new MemoryStream(body, false);
-
- state.keyExchange.ProcessServerKeyExchange(buf);
-
- TlsProtocol.AssertEmpty(buf);
- }
-
- protected virtual void ProcessServerSupplementalData(ClientHandshakeState state, byte[] body)
- {
- MemoryStream buf = new MemoryStream(body, false);
- IList serverSupplementalData = TlsProtocol.ReadSupplementalDataMessage(buf);
- state.client.ProcessServerSupplementalData(serverSupplementalData);
- }
-
- protected virtual void ReportServerVersion(ClientHandshakeState state, ProtocolVersion server_version)
- {
- TlsClientContextImpl clientContext = state.clientContext;
- ProtocolVersion currentServerVersion = clientContext.ServerVersion;
- if (null == currentServerVersion)
- {
- clientContext.SetServerVersion(server_version);
- state.client.NotifyServerVersion(server_version);
- }
- else if (!currentServerVersion.Equals(server_version))
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
-
- protected static byte[] PatchClientHelloWithCookie(byte[] clientHelloBody, byte[] cookie)
- {
- int sessionIDPos = 34;
- int sessionIDLength = TlsUtilities.ReadUint8(clientHelloBody, sessionIDPos);
-
- int cookieLengthPos = sessionIDPos + 1 + sessionIDLength;
- int cookiePos = cookieLengthPos + 1;
-
- byte[] patched = new byte[clientHelloBody.Length + cookie.Length];
- Array.Copy(clientHelloBody, 0, patched, 0, cookieLengthPos);
- TlsUtilities.CheckUint8(cookie.Length);
- TlsUtilities.WriteUint8((byte)cookie.Length, patched, cookieLengthPos);
- Array.Copy(cookie, 0, patched, cookiePos, cookie.Length);
- Array.Copy(clientHelloBody, cookiePos, patched, cookiePos + cookie.Length, clientHelloBody.Length - cookiePos);
-
- return patched;
- }
-
- protected internal class ClientHandshakeState
- {
- internal TlsClient client = null;
- internal TlsClientContextImpl clientContext = null;
- internal TlsSession tlsSession = null;
- internal SessionParameters sessionParameters = null;
- internal SessionParameters.Builder sessionParametersBuilder = null;
- internal int[] offeredCipherSuites = null;
- internal byte[] offeredCompressionMethods = null;
- internal IDictionary clientExtensions = null;
- internal IDictionary serverExtensions = null;
- internal byte[] selectedSessionID = null;
- internal bool resumedSession = false;
- internal bool secure_renegotiation = false;
- internal bool allowCertificateStatus = false;
- internal bool expectSessionTicket = false;
- internal TlsKeyExchange keyExchange = null;
- internal TlsAuthentication authentication = null;
- internal CertificateStatus certificateStatus = null;
- internal CertificateRequest certificateRequest = null;
- internal TlsCredentials clientCredentials = null;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DtlsEpoch.cs b/BCCrypto/src/crypto/tls/DtlsEpoch.cs
deleted file mode 100644
index 91fffa5..0000000
--- a/BCCrypto/src/crypto/tls/DtlsEpoch.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- internal class DtlsEpoch
- {
- private readonly DtlsReplayWindow mReplayWindow = new DtlsReplayWindow();
-
- private readonly int mEpoch;
- private readonly TlsCipher mCipher;
-
- private long mSequenceNumber = 0;
-
- internal DtlsEpoch(int epoch, TlsCipher cipher)
- {
- if (epoch < 0)
- throw new ArgumentException("must be >= 0", "epoch");
- if (cipher == null)
- throw new ArgumentNullException("cipher");
-
- this.mEpoch = epoch;
- this.mCipher = cipher;
- }
-
- internal long AllocateSequenceNumber()
- {
- // TODO Check for overflow
- return mSequenceNumber++;
- }
-
- internal TlsCipher Cipher
- {
- get { return mCipher; }
- }
-
- internal int Epoch
- {
- get { return mEpoch; }
- }
-
- internal DtlsReplayWindow ReplayWindow
- {
- get { return mReplayWindow; }
- }
-
- internal long SequenceNumber
- {
- get { return mSequenceNumber; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DtlsHandshakeRetransmit.cs b/BCCrypto/src/crypto/tls/DtlsHandshakeRetransmit.cs
deleted file mode 100644
index 8bfae78..0000000
--- a/BCCrypto/src/crypto/tls/DtlsHandshakeRetransmit.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- interface DtlsHandshakeRetransmit
- {
- ///
- void ReceivedHandshakeRecord(int epoch, byte[] buf, int off, int len);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DtlsProtocol.cs b/BCCrypto/src/crypto/tls/DtlsProtocol.cs
deleted file mode 100644
index e4ebd43..0000000
--- a/BCCrypto/src/crypto/tls/DtlsProtocol.cs
+++ /dev/null
@@ -1,92 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class DtlsProtocol
- {
- protected readonly SecureRandom mSecureRandom;
-
- protected DtlsProtocol(SecureRandom secureRandom)
- {
- if (secureRandom == null)
- throw new ArgumentNullException("secureRandom");
-
- this.mSecureRandom = secureRandom;
- }
-
- ///
- protected virtual void ProcessFinished(byte[] body, byte[] expected_verify_data)
- {
- MemoryStream buf = new MemoryStream(body, false);
-
- byte[] verify_data = TlsUtilities.ReadFully(expected_verify_data.Length, buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- if (!Arrays.ConstantTimeAreEqual(expected_verify_data, verify_data))
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
- }
-
- ///
- internal static void ApplyMaxFragmentLengthExtension(DtlsRecordLayer recordLayer, short maxFragmentLength)
- {
- if (maxFragmentLength >= 0)
- {
- if (!MaxFragmentLength.IsValid((byte)maxFragmentLength))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- int plainTextLimit = 1 << (8 + maxFragmentLength);
- recordLayer.SetPlaintextLimit(plainTextLimit);
- }
- }
-
- ///
- protected static short EvaluateMaxFragmentLengthExtension(bool resumedSession, IDictionary clientExtensions,
- IDictionary serverExtensions, byte alertDescription)
- {
- short maxFragmentLength = TlsExtensionsUtilities.GetMaxFragmentLengthExtension(serverExtensions);
- if (maxFragmentLength >= 0)
- {
- if (!MaxFragmentLength.IsValid((byte)maxFragmentLength)
- || (!resumedSession && maxFragmentLength != TlsExtensionsUtilities
- .GetMaxFragmentLengthExtension(clientExtensions)))
- {
- throw new TlsFatalAlert(alertDescription);
- }
- }
- return maxFragmentLength;
- }
-
- ///
- protected static byte[] GenerateCertificate(Certificate certificate)
- {
- MemoryStream buf = new MemoryStream();
- certificate.Encode(buf);
- return buf.ToArray();
- }
-
- ///
- protected static byte[] GenerateSupplementalData(IList supplementalData)
- {
- MemoryStream buf = new MemoryStream();
- TlsProtocol.WriteSupplementalData(buf, supplementalData);
- return buf.ToArray();
- }
-
- ///
- protected static void ValidateSelectedCipherSuite(int selectedCipherSuite, byte alertDescription)
- {
- switch (TlsUtilities.GetEncryptionAlgorithm(selectedCipherSuite))
- {
- case EncryptionAlgorithm.RC4_40:
- case EncryptionAlgorithm.RC4_128:
- throw new TlsFatalAlert(alertDescription);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DtlsReassembler.cs b/BCCrypto/src/crypto/tls/DtlsReassembler.cs
deleted file mode 100644
index 11fe609..0000000
--- a/BCCrypto/src/crypto/tls/DtlsReassembler.cs
+++ /dev/null
@@ -1,125 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- class DtlsReassembler
- {
- private readonly byte mMsgType;
- private readonly byte[] mBody;
-
- private readonly IList mMissing = Platform.CreateArrayList();
-
- internal DtlsReassembler(byte msg_type, int length)
- {
- this.mMsgType = msg_type;
- this.mBody = new byte[length];
- this.mMissing.Add(new Range(0, length));
- }
-
- internal byte MsgType
- {
- get { return mMsgType; }
- }
-
- internal byte[] GetBodyIfComplete()
- {
- return mMissing.Count == 0 ? mBody : null;
- }
-
- internal void ContributeFragment(byte msg_type, int length, byte[] buf, int off, int fragment_offset,
- int fragment_length)
- {
- int fragment_end = fragment_offset + fragment_length;
-
- if (this.mMsgType != msg_type || this.mBody.Length != length || fragment_end > length)
- {
- return;
- }
-
- if (fragment_length == 0)
- {
- // NOTE: Empty messages still require an empty fragment to complete it
- if (fragment_offset == 0 && mMissing.Count > 0)
- {
- Range firstRange = (Range)mMissing[0];
- if (firstRange.End == 0)
- {
- mMissing.RemoveAt(0);
- }
- }
- return;
- }
-
- for (int i = 0; i < mMissing.Count; ++i)
- {
- Range range = (Range)mMissing[i];
- if (range.Start >= fragment_end)
- {
- break;
- }
- if (range.End > fragment_offset)
- {
-
- int copyStart = System.Math.Max(range.Start, fragment_offset);
- int copyEnd = System.Math.Min(range.End, fragment_end);
- int copyLength = copyEnd - copyStart;
-
- Array.Copy(buf, off + copyStart - fragment_offset, mBody, copyStart,
- copyLength);
-
- if (copyStart == range.Start)
- {
- if (copyEnd == range.End)
- {
- mMissing.RemoveAt(i--);
- }
- else
- {
- range.Start = copyEnd;
- }
- }
- else
- {
- if (copyEnd != range.End)
- {
- mMissing.Insert(++i, new Range(copyEnd, range.End));
- }
- range.End = copyStart;
- }
- }
- }
- }
-
- internal void Reset()
- {
- this.mMissing.Clear();
- this.mMissing.Add(new Range(0, mBody.Length));
- }
-
- private class Range
- {
- private int mStart, mEnd;
-
- internal Range(int start, int end)
- {
- this.mStart = start;
- this.mEnd = end;
- }
-
- public int Start
- {
- get { return mStart; }
- set { this.mStart = value; }
- }
-
- public int End
- {
- get { return mEnd; }
- set { this.mEnd = value; }
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DtlsRecordLayer.cs b/BCCrypto/src/crypto/tls/DtlsRecordLayer.cs
deleted file mode 100644
index 3c3e182..0000000
--- a/BCCrypto/src/crypto/tls/DtlsRecordLayer.cs
+++ /dev/null
@@ -1,525 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- internal class DtlsRecordLayer
- : DatagramTransport
- {
- private const int RECORD_HEADER_LENGTH = 13;
- private const int MAX_FRAGMENT_LENGTH = 1 << 14;
- private const long TCP_MSL = 1000L * 60 * 2;
- private const long RETRANSMIT_TIMEOUT = TCP_MSL * 2;
-
- private readonly DatagramTransport mTransport;
- private readonly TlsContext mContext;
- private readonly TlsPeer mPeer;
-
- private readonly ByteQueue mRecordQueue = new ByteQueue();
-
- private volatile bool mClosed = false;
- private volatile bool mFailed = false;
- private volatile ProtocolVersion mReadVersion = null, mWriteVersion = null;
- private volatile bool mInHandshake;
- private volatile int mPlaintextLimit;
- private DtlsEpoch mCurrentEpoch, mPendingEpoch;
- private DtlsEpoch mReadEpoch, mWriteEpoch;
-
- private DtlsHandshakeRetransmit mRetransmit = null;
- private DtlsEpoch mRetransmitEpoch = null;
- private long mRetransmitExpiry = 0;
-
- internal DtlsRecordLayer(DatagramTransport transport, TlsContext context, TlsPeer peer, byte contentType)
- {
- this.mTransport = transport;
- this.mContext = context;
- this.mPeer = peer;
-
- this.mInHandshake = true;
-
- this.mCurrentEpoch = new DtlsEpoch(0, new TlsNullCipher(context));
- this.mPendingEpoch = null;
- this.mReadEpoch = mCurrentEpoch;
- this.mWriteEpoch = mCurrentEpoch;
-
- SetPlaintextLimit(MAX_FRAGMENT_LENGTH);
- }
-
- internal virtual void SetPlaintextLimit(int plaintextLimit)
- {
- this.mPlaintextLimit = plaintextLimit;
- }
-
- internal virtual ProtocolVersion ReadVersion
- {
- get { return mReadVersion; }
- set { this.mReadVersion = value; }
- }
-
- internal virtual void SetWriteVersion(ProtocolVersion writeVersion)
- {
- this.mWriteVersion = writeVersion;
- }
-
- internal virtual void InitPendingEpoch(TlsCipher pendingCipher)
- {
- if (mPendingEpoch != null)
- throw new InvalidOperationException();
-
- /*
- * TODO "In order to ensure that any given sequence/epoch pair is unique, implementations
- * MUST NOT allow the same epoch value to be reused within two times the TCP maximum segment
- * lifetime."
- */
-
- // TODO Check for overflow
- this.mPendingEpoch = new DtlsEpoch(mWriteEpoch.Epoch + 1, pendingCipher);
- }
-
- internal virtual void HandshakeSuccessful(DtlsHandshakeRetransmit retransmit)
- {
- if (mReadEpoch == mCurrentEpoch || mWriteEpoch == mCurrentEpoch)
- {
- // TODO
- throw new InvalidOperationException();
- }
-
- if (retransmit != null)
- {
- this.mRetransmit = retransmit;
- this.mRetransmitEpoch = mCurrentEpoch;
- this.mRetransmitExpiry = DateTimeUtilities.CurrentUnixMs() + RETRANSMIT_TIMEOUT;
- }
-
- this.mInHandshake = false;
- this.mCurrentEpoch = mPendingEpoch;
- this.mPendingEpoch = null;
- }
-
- internal virtual void ResetWriteEpoch()
- {
- if (mRetransmitEpoch != null)
- {
- this.mWriteEpoch = mRetransmitEpoch;
- }
- else
- {
- this.mWriteEpoch = mCurrentEpoch;
- }
- }
-
- public virtual int GetReceiveLimit()
- {
- return System.Math.Min(this.mPlaintextLimit,
- mReadEpoch.Cipher.GetPlaintextLimit(mTransport.GetReceiveLimit() - RECORD_HEADER_LENGTH));
- }
-
- public virtual int GetSendLimit()
- {
- return System.Math.Min(this.mPlaintextLimit,
- mWriteEpoch.Cipher.GetPlaintextLimit(mTransport.GetSendLimit() - RECORD_HEADER_LENGTH));
- }
-
- public virtual int Receive(byte[] buf, int off, int len, int waitMillis)
- {
- byte[] record = null;
-
- for (;;)
- {
- int receiveLimit = System.Math.Min(len, GetReceiveLimit()) + RECORD_HEADER_LENGTH;
- if (record == null || record.Length < receiveLimit)
- {
- record = new byte[receiveLimit];
- }
-
- try
- {
- if (mRetransmit != null && DateTimeUtilities.CurrentUnixMs() > mRetransmitExpiry)
- {
- mRetransmit = null;
- mRetransmitEpoch = null;
- }
-
- int received = ReceiveRecord(record, 0, receiveLimit, waitMillis);
- if (received < 0)
- {
- return received;
- }
- if (received < RECORD_HEADER_LENGTH)
- {
- continue;
- }
- int length = TlsUtilities.ReadUint16(record, 11);
- if (received != (length + RECORD_HEADER_LENGTH))
- {
- continue;
- }
-
- byte type = TlsUtilities.ReadUint8(record, 0);
-
- // TODO Support user-specified custom protocols?
- switch (type)
- {
- case ContentType.alert:
- case ContentType.application_data:
- case ContentType.change_cipher_spec:
- case ContentType.handshake:
- case ContentType.heartbeat:
- break;
- default:
- // TODO Exception?
- continue;
- }
-
- int epoch = TlsUtilities.ReadUint16(record, 3);
-
- DtlsEpoch recordEpoch = null;
- if (epoch == mReadEpoch.Epoch)
- {
- recordEpoch = mReadEpoch;
- }
- else if (type == ContentType.handshake && mRetransmitEpoch != null
- && epoch == mRetransmitEpoch.Epoch)
- {
- recordEpoch = mRetransmitEpoch;
- }
-
- if (recordEpoch == null)
- {
- continue;
- }
-
- long seq = TlsUtilities.ReadUint48(record, 5);
- if (recordEpoch.ReplayWindow.ShouldDiscard(seq))
- {
- continue;
- }
-
- ProtocolVersion version = TlsUtilities.ReadVersion(record, 1);
- if (!version.IsDtls)
- {
- continue;
- }
-
- if (mReadVersion != null && !mReadVersion.Equals(version))
- {
- continue;
- }
-
- byte[] plaintext = recordEpoch.Cipher.DecodeCiphertext(
- GetMacSequenceNumber(recordEpoch.Epoch, seq), type, record, RECORD_HEADER_LENGTH,
- received - RECORD_HEADER_LENGTH);
-
- recordEpoch.ReplayWindow.ReportAuthenticated(seq);
-
- if (plaintext.Length > this.mPlaintextLimit)
- {
- continue;
- }
-
- if (mReadVersion == null)
- {
- mReadVersion = version;
- }
-
- switch (type)
- {
- case ContentType.alert:
- {
- if (plaintext.Length == 2)
- {
- byte alertLevel = plaintext[0];
- byte alertDescription = plaintext[1];
-
- mPeer.NotifyAlertReceived(alertLevel, alertDescription);
-
- if (alertLevel == AlertLevel.fatal)
- {
- Failed();
- throw new TlsFatalAlert(alertDescription);
- }
-
- // TODO Can close_notify be a fatal alert?
- if (alertDescription == AlertDescription.close_notify)
- {
- CloseTransport();
- }
- }
-
- continue;
- }
- case ContentType.application_data:
- {
- if (mInHandshake)
- {
- // TODO Consider buffering application data for new epoch that arrives
- // out-of-order with the Finished message
- continue;
- }
- break;
- }
- case ContentType.change_cipher_spec:
- {
- // Implicitly receive change_cipher_spec and change to pending cipher state
-
- for (int i = 0; i < plaintext.Length; ++i)
- {
- byte message = TlsUtilities.ReadUint8(plaintext, i);
- if (message != ChangeCipherSpec.change_cipher_spec)
- {
- continue;
- }
-
- if (mPendingEpoch != null)
- {
- mReadEpoch = mPendingEpoch;
- }
- }
-
- continue;
- }
- case ContentType.handshake:
- {
- if (!mInHandshake)
- {
- if (mRetransmit != null)
- {
- mRetransmit.ReceivedHandshakeRecord(epoch, plaintext, 0, plaintext.Length);
- }
-
- // TODO Consider support for HelloRequest
- continue;
- }
- break;
- }
- case ContentType.heartbeat:
- {
- // TODO[RFC 6520]
- continue;
- }
- }
-
- /*
- * NOTE: If we receive any non-handshake data in the new epoch implies the peer has
- * received our final flight.
- */
- if (!mInHandshake && mRetransmit != null)
- {
- this.mRetransmit = null;
- this.mRetransmitEpoch = null;
- }
-
- Array.Copy(plaintext, 0, buf, off, plaintext.Length);
- return plaintext.Length;
- }
- catch (IOException e)
- {
- // NOTE: Assume this is a timeout for the moment
- throw e;
- }
- }
- }
-
- ///
- public virtual void Send(byte[] buf, int off, int len)
- {
- byte contentType = ContentType.application_data;
-
- if (this.mInHandshake || this.mWriteEpoch == this.mRetransmitEpoch)
- {
- contentType = ContentType.handshake;
-
- byte handshakeType = TlsUtilities.ReadUint8(buf, off);
- if (handshakeType == HandshakeType.finished)
- {
- DtlsEpoch nextEpoch = null;
- if (this.mInHandshake)
- {
- nextEpoch = mPendingEpoch;
- }
- else if (this.mWriteEpoch == this.mRetransmitEpoch)
- {
- nextEpoch = mCurrentEpoch;
- }
-
- if (nextEpoch == null)
- {
- // TODO
- throw new InvalidOperationException();
- }
-
- // Implicitly send change_cipher_spec and change to pending cipher state
-
- // TODO Send change_cipher_spec and finished records in single datagram?
- byte[] data = new byte[]{ 1 };
- SendRecord(ContentType.change_cipher_spec, data, 0, data.Length);
-
- mWriteEpoch = nextEpoch;
- }
- }
-
- SendRecord(contentType, buf, off, len);
- }
-
- public virtual void Close()
- {
- if (!mClosed)
- {
- if (mInHandshake)
- {
- Warn(AlertDescription.user_canceled, "User canceled handshake");
- }
- CloseTransport();
- }
- }
-
- internal virtual void Failed()
- {
- if (!mClosed)
- {
- mFailed = true;
-
- CloseTransport();
- }
- }
-
- internal virtual void Fail(byte alertDescription)
- {
- if (!mClosed)
- {
- try
- {
- RaiseAlert(AlertLevel.fatal, alertDescription, null, null);
- }
- catch (Exception)
- {
- // Ignore
- }
-
- mFailed = true;
-
- CloseTransport();
- }
- }
-
- internal virtual void Warn(byte alertDescription, string message)
- {
- RaiseAlert(AlertLevel.warning, alertDescription, message, null);
- }
-
- private void CloseTransport()
- {
- if (!mClosed)
- {
- /*
- * RFC 5246 7.2.1. Unless some other fatal alert has been transmitted, each party is
- * required to send a close_notify alert before closing the write side of the
- * connection. The other party MUST respond with a close_notify alert of its own and
- * close down the connection immediately, discarding any pending writes.
- */
-
- try
- {
- if (!mFailed)
- {
- Warn(AlertDescription.close_notify, null);
- }
- mTransport.Close();
- }
- catch (Exception)
- {
- // Ignore
- }
-
- mClosed = true;
- }
- }
-
- private void RaiseAlert(byte alertLevel, byte alertDescription, string message, Exception cause)
- {
- mPeer.NotifyAlertRaised(alertLevel, alertDescription, message, cause);
-
- byte[] error = new byte[2];
- error[0] = (byte)alertLevel;
- error[1] = (byte)alertDescription;
-
- SendRecord(ContentType.alert, error, 0, 2);
- }
-
- private int ReceiveRecord(byte[] buf, int off, int len, int waitMillis)
- {
- if (mRecordQueue.Available > 0)
- {
- int length = 0;
- if (mRecordQueue.Available >= RECORD_HEADER_LENGTH)
- {
- byte[] lengthBytes = new byte[2];
- mRecordQueue.Read(lengthBytes, 0, 2, 11);
- length = TlsUtilities.ReadUint16(lengthBytes, 0);
- }
-
- int received = System.Math.Min(mRecordQueue.Available, RECORD_HEADER_LENGTH + length);
- mRecordQueue.RemoveData(buf, off, received, 0);
- return received;
- }
-
- {
- int received = mTransport.Receive(buf, off, len, waitMillis);
- if (received >= RECORD_HEADER_LENGTH)
- {
- int fragmentLength = TlsUtilities.ReadUint16(buf, off + 11);
- int recordLength = RECORD_HEADER_LENGTH + fragmentLength;
- if (received > recordLength)
- {
- mRecordQueue.AddData(buf, off + recordLength, received - recordLength);
- received = recordLength;
- }
- }
- return received;
- }
- }
-
- private void SendRecord(byte contentType, byte[] buf, int off, int len)
- {
- // Never send anything until a valid ClientHello has been received
- if (mWriteVersion == null)
- return;
-
- if (len > this.mPlaintextLimit)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- /*
- * RFC 5246 6.2.1 Implementations MUST NOT send zero-length fragments of Handshake, Alert,
- * or ChangeCipherSpec content types.
- */
- if (len < 1 && contentType != ContentType.application_data)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- int recordEpoch = mWriteEpoch.Epoch;
- long recordSequenceNumber = mWriteEpoch.AllocateSequenceNumber();
-
- byte[] ciphertext = mWriteEpoch.Cipher.EncodePlaintext(
- GetMacSequenceNumber(recordEpoch, recordSequenceNumber), contentType, buf, off, len);
-
- // TODO Check the ciphertext length?
-
- byte[] record = new byte[ciphertext.Length + RECORD_HEADER_LENGTH];
- TlsUtilities.WriteUint8(contentType, record, 0);
- ProtocolVersion version = mWriteVersion;
- TlsUtilities.WriteVersion(version, record, 1);
- TlsUtilities.WriteUint16(recordEpoch, record, 3);
- TlsUtilities.WriteUint48(recordSequenceNumber, record, 5);
- TlsUtilities.WriteUint16(ciphertext.Length, record, 11);
- Array.Copy(ciphertext, 0, record, RECORD_HEADER_LENGTH, ciphertext.Length);
-
- mTransport.Send(record, 0, record.Length);
- }
-
- private static long GetMacSequenceNumber(int epoch, long sequence_number)
- {
- return ((epoch & 0xFFFFFFFFL) << 48) | sequence_number;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DtlsReliableHandshake.cs b/BCCrypto/src/crypto/tls/DtlsReliableHandshake.cs
deleted file mode 100644
index 18a4176..0000000
--- a/BCCrypto/src/crypto/tls/DtlsReliableHandshake.cs
+++ /dev/null
@@ -1,451 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- internal class DtlsReliableHandshake
- {
- private const int MAX_RECEIVE_AHEAD = 10;
-
- private readonly DtlsRecordLayer mRecordLayer;
-
- private TlsHandshakeHash mHandshakeHash;
-
- private IDictionary mCurrentInboundFlight = Platform.CreateHashtable();
- private IDictionary mPreviousInboundFlight = null;
- private IList mOutboundFlight = Platform.CreateArrayList();
- private bool mSending = true;
-
- private int mMessageSeq = 0, mNextReceiveSeq = 0;
-
- internal DtlsReliableHandshake(TlsContext context, DtlsRecordLayer transport)
- {
- this.mRecordLayer = transport;
- this.mHandshakeHash = new DeferredHash();
- this.mHandshakeHash.Init(context);
- }
-
- internal void NotifyHelloComplete()
- {
- this.mHandshakeHash = mHandshakeHash.NotifyPrfDetermined();
- }
-
- internal TlsHandshakeHash HandshakeHash
- {
- get { return mHandshakeHash; }
- }
-
- internal TlsHandshakeHash PrepareToFinish()
- {
- TlsHandshakeHash result = mHandshakeHash;
- this.mHandshakeHash = mHandshakeHash.StopTracking();
- return result;
- }
-
- internal void SendMessage(byte msg_type, byte[] body)
- {
- TlsUtilities.CheckUint24(body.Length);
-
- if (!mSending)
- {
- CheckInboundFlight();
- mSending = true;
- mOutboundFlight.Clear();
- }
-
- Message message = new Message(mMessageSeq++, msg_type, body);
-
- mOutboundFlight.Add(message);
-
- WriteMessage(message);
- UpdateHandshakeMessagesDigest(message);
- }
-
- internal byte[] ReceiveMessageBody(byte msg_type)
- {
- Message message = ReceiveMessage();
- if (message.Type != msg_type)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- return message.Body;
- }
-
- internal Message ReceiveMessage()
- {
- if (mSending)
- {
- mSending = false;
- PrepareInboundFlight();
- }
-
- // Check if we already have the next message waiting
- {
- DtlsReassembler next = (DtlsReassembler)mCurrentInboundFlight[mNextReceiveSeq];
- if (next != null)
- {
- byte[] body = next.GetBodyIfComplete();
- if (body != null)
- {
- mPreviousInboundFlight = null;
- return UpdateHandshakeMessagesDigest(new Message(mNextReceiveSeq++, next.MsgType, body));
- }
- }
- }
-
- byte[] buf = null;
-
- // TODO Check the conditions under which we should reset this
- int readTimeoutMillis = 1000;
-
- for (;;)
- {
- int receiveLimit = mRecordLayer.GetReceiveLimit();
- if (buf == null || buf.Length < receiveLimit)
- {
- buf = new byte[receiveLimit];
- }
-
- // TODO Handle records containing multiple handshake messages
-
- try
- {
- for (; ; )
- {
- int received = mRecordLayer.Receive(buf, 0, receiveLimit, readTimeoutMillis);
- if (received < 0)
- {
- break;
- }
- if (received < 12)
- {
- continue;
- }
- int fragment_length = TlsUtilities.ReadUint24(buf, 9);
- if (received != (fragment_length + 12))
- {
- continue;
- }
- int seq = TlsUtilities.ReadUint16(buf, 4);
- if (seq > (mNextReceiveSeq + MAX_RECEIVE_AHEAD))
- {
- continue;
- }
- byte msg_type = TlsUtilities.ReadUint8(buf, 0);
- int length = TlsUtilities.ReadUint24(buf, 1);
- int fragment_offset = TlsUtilities.ReadUint24(buf, 6);
- if (fragment_offset + fragment_length > length)
- {
- continue;
- }
-
- if (seq < mNextReceiveSeq)
- {
- /*
- * NOTE: If we Receive the previous flight of incoming messages in full
- * again, retransmit our last flight
- */
- if (mPreviousInboundFlight != null)
- {
- DtlsReassembler reassembler = (DtlsReassembler)mPreviousInboundFlight[seq];
- if (reassembler != null)
- {
- reassembler.ContributeFragment(msg_type, length, buf, 12, fragment_offset,
- fragment_length);
-
- if (CheckAll(mPreviousInboundFlight))
- {
- ResendOutboundFlight();
-
- /*
- * TODO[DTLS] implementations SHOULD back off handshake packet
- * size during the retransmit backoff.
- */
- readTimeoutMillis = System.Math.Min(readTimeoutMillis * 2, 60000);
-
- ResetAll(mPreviousInboundFlight);
- }
- }
- }
- }
- else
- {
- DtlsReassembler reassembler = (DtlsReassembler)mCurrentInboundFlight[seq];
- if (reassembler == null)
- {
- reassembler = new DtlsReassembler(msg_type, length);
- mCurrentInboundFlight[seq] = reassembler;
- }
-
- reassembler.ContributeFragment(msg_type, length, buf, 12, fragment_offset, fragment_length);
-
- if (seq == mNextReceiveSeq)
- {
- byte[] body = reassembler.GetBodyIfComplete();
- if (body != null)
- {
- mPreviousInboundFlight = null;
- return UpdateHandshakeMessagesDigest(new Message(mNextReceiveSeq++,
- reassembler.MsgType, body));
- }
- }
- }
- }
- }
- catch (IOException)
- {
- // NOTE: Assume this is a timeout for the moment
- }
-
- ResendOutboundFlight();
-
- /*
- * TODO[DTLS] implementations SHOULD back off handshake packet size during the
- * retransmit backoff.
- */
- readTimeoutMillis = System.Math.Min(readTimeoutMillis * 2, 60000);
- }
- }
-
- internal void Finish()
- {
- DtlsHandshakeRetransmit retransmit = null;
- if (!mSending)
- {
- CheckInboundFlight();
- }
- else if (mCurrentInboundFlight != null)
- {
- /*
- * RFC 6347 4.2.4. In addition, for at least twice the default MSL defined for [TCP],
- * when in the FINISHED state, the node that transmits the last flight (the server in an
- * ordinary handshake or the client in a resumed handshake) MUST respond to a retransmit
- * of the peer's last flight with a retransmit of the last flight.
- */
- retransmit = new Retransmit(this);
- }
-
- mRecordLayer.HandshakeSuccessful(retransmit);
- }
-
- internal void ResetHandshakeMessagesDigest()
- {
- mHandshakeHash.Reset();
- }
-
- private void HandleRetransmittedHandshakeRecord(int epoch, byte[] buf, int off, int len)
- {
- /*
- * TODO Need to handle the case where the previous inbound flight contains
- * messages from two epochs.
- */
- if (len < 12)
- return;
- int fragment_length = TlsUtilities.ReadUint24(buf, off + 9);
- if (len != (fragment_length + 12))
- return;
- int seq = TlsUtilities.ReadUint16(buf, off + 4);
- if (seq >= mNextReceiveSeq)
- return;
-
- byte msg_type = TlsUtilities.ReadUint8(buf, off);
-
- // TODO This is a hack that only works until we try to support renegotiation
- int expectedEpoch = msg_type == HandshakeType.finished ? 1 : 0;
- if (epoch != expectedEpoch)
- return;
-
- int length = TlsUtilities.ReadUint24(buf, off + 1);
- int fragment_offset = TlsUtilities.ReadUint24(buf, off + 6);
- if (fragment_offset + fragment_length > length)
- return;
-
- DtlsReassembler reassembler = (DtlsReassembler)mCurrentInboundFlight[seq];
- if (reassembler != null)
- {
- reassembler.ContributeFragment(msg_type, length, buf, off + 12, fragment_offset,
- fragment_length);
- if (CheckAll(mCurrentInboundFlight))
- {
- ResendOutboundFlight();
- ResetAll(mCurrentInboundFlight);
- }
- }
- }
-
- /**
- * Check that there are no "extra" messages left in the current inbound flight
- */
- private void CheckInboundFlight()
- {
- foreach (int key in mCurrentInboundFlight.Keys)
- {
- if (key >= mNextReceiveSeq)
- {
- // TODO Should this be considered an error?
- }
- }
- }
-
- private void PrepareInboundFlight()
- {
- ResetAll(mCurrentInboundFlight);
- mPreviousInboundFlight = mCurrentInboundFlight;
- mCurrentInboundFlight = Platform.CreateHashtable();
- }
-
- private void ResendOutboundFlight()
- {
- mRecordLayer.ResetWriteEpoch();
- for (int i = 0; i < mOutboundFlight.Count; ++i)
- {
- WriteMessage((Message)mOutboundFlight[i]);
- }
- }
-
- private Message UpdateHandshakeMessagesDigest(Message message)
- {
- if (message.Type != HandshakeType.hello_request)
- {
- byte[] body = message.Body;
- byte[] buf = new byte[12];
- TlsUtilities.WriteUint8(message.Type, buf, 0);
- TlsUtilities.WriteUint24(body.Length, buf, 1);
- TlsUtilities.WriteUint16(message.Seq, buf, 4);
- TlsUtilities.WriteUint24(0, buf, 6);
- TlsUtilities.WriteUint24(body.Length, buf, 9);
- mHandshakeHash.BlockUpdate(buf, 0, buf.Length);
- mHandshakeHash.BlockUpdate(body, 0, body.Length);
- }
- return message;
- }
-
- private void WriteMessage(Message message)
- {
- int sendLimit = mRecordLayer.GetSendLimit();
- int fragmentLimit = sendLimit - 12;
-
- // TODO Support a higher minimum fragment size?
- if (fragmentLimit < 1)
- {
- // TODO Should we be throwing an exception here?
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- int length = message.Body.Length;
-
- // NOTE: Must still send a fragment if body is empty
- int fragment_offset = 0;
- do
- {
- int fragment_length = System.Math.Min(length - fragment_offset, fragmentLimit);
- WriteHandshakeFragment(message, fragment_offset, fragment_length);
- fragment_offset += fragment_length;
- }
- while (fragment_offset < length);
- }
-
- private void WriteHandshakeFragment(Message message, int fragment_offset, int fragment_length)
- {
- RecordLayerBuffer fragment = new RecordLayerBuffer(12 + fragment_length);
- TlsUtilities.WriteUint8(message.Type, fragment);
- TlsUtilities.WriteUint24(message.Body.Length, fragment);
- TlsUtilities.WriteUint16(message.Seq, fragment);
- TlsUtilities.WriteUint24(fragment_offset, fragment);
- TlsUtilities.WriteUint24(fragment_length, fragment);
- fragment.Write(message.Body, fragment_offset, fragment_length);
-
- fragment.SendToRecordLayer(mRecordLayer);
- }
-
- private static bool CheckAll(IDictionary inboundFlight)
- {
- foreach (DtlsReassembler r in inboundFlight.Values)
- {
- if (r.GetBodyIfComplete() == null)
- {
- return false;
- }
- }
- return true;
- }
-
- private static void ResetAll(IDictionary inboundFlight)
- {
- foreach (DtlsReassembler r in inboundFlight.Values)
- {
- r.Reset();
- }
- }
-
- internal class Message
- {
- private readonly int mMessageSeq;
- private readonly byte mMsgType;
- private readonly byte[] mBody;
-
- internal Message(int message_seq, byte msg_type, byte[] body)
- {
- this.mMessageSeq = message_seq;
- this.mMsgType = msg_type;
- this.mBody = body;
- }
-
- public int Seq
- {
- get { return mMessageSeq; }
- }
-
- public byte Type
- {
- get { return mMsgType; }
- }
-
- public byte[] Body
- {
- get { return mBody; }
- }
- }
-
- internal class RecordLayerBuffer
- : MemoryStream
- {
- internal RecordLayerBuffer(int size)
- : base(size)
- {
- }
-
- internal void SendToRecordLayer(DtlsRecordLayer recordLayer)
- {
-#if PORTABLE
- byte[] buf = ToArray();
- int bufLen = buf.Length;
-#else
- byte[] buf = GetBuffer();
- int bufLen = (int)Length;
-#endif
-
- recordLayer.Send(buf, 0, bufLen);
- Platform.Dispose(this);
- }
- }
-
- internal class Retransmit
- : DtlsHandshakeRetransmit
- {
- private readonly DtlsReliableHandshake mOuter;
-
- internal Retransmit(DtlsReliableHandshake outer)
- {
- this.mOuter = outer;
- }
-
- public void ReceivedHandshakeRecord(int epoch, byte[] buf, int off, int len)
- {
- mOuter.HandleRetransmittedHandshakeRecord(epoch, buf, off, len);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DtlsReplayWindow.cs b/BCCrypto/src/crypto/tls/DtlsReplayWindow.cs
deleted file mode 100644
index ea18e80..0000000
--- a/BCCrypto/src/crypto/tls/DtlsReplayWindow.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * RFC 4347 4.1.2.5 Anti-replay
- *
- * Support fast rejection of duplicate records by maintaining a sliding receive window
- */
- internal class DtlsReplayWindow
- {
- private const long VALID_SEQ_MASK = 0x0000FFFFFFFFFFFFL;
-
- private const long WINDOW_SIZE = 64L;
-
- private long mLatestConfirmedSeq = -1;
- private long mBitmap = 0;
-
- /**
- * Check whether a received record with the given sequence number should be rejected as a duplicate.
- *
- * @param seq the 48-bit DTLSPlainText.sequence_number field of a received record.
- * @return true if the record should be discarded without further processing.
- */
- internal bool ShouldDiscard(long seq)
- {
- if ((seq & VALID_SEQ_MASK) != seq)
- return true;
-
- if (seq <= mLatestConfirmedSeq)
- {
- long diff = mLatestConfirmedSeq - seq;
- if (diff >= WINDOW_SIZE)
- return true;
- if ((mBitmap & (1L << (int)diff)) != 0)
- return true;
- }
-
- return false;
- }
-
- /**
- * Report that a received record with the given sequence number passed authentication checks.
- *
- * @param seq the 48-bit DTLSPlainText.sequence_number field of an authenticated record.
- */
- internal void ReportAuthenticated(long seq)
- {
- if ((seq & VALID_SEQ_MASK) != seq)
- throw new ArgumentException("out of range", "seq");
-
- if (seq <= mLatestConfirmedSeq)
- {
- long diff = mLatestConfirmedSeq - seq;
- if (diff < WINDOW_SIZE)
- {
- mBitmap |= (1L << (int)diff);
- }
- }
- else
- {
- long diff = seq - mLatestConfirmedSeq;
- if (diff >= WINDOW_SIZE)
- {
- mBitmap = 1;
- }
- else
- {
- mBitmap <<= (int)diff;
- mBitmap |= 1;
- }
- mLatestConfirmedSeq = seq;
- }
- }
-
- /**
- * When a new epoch begins, sequence numbers begin again at 0
- */
- internal void Reset()
- {
- mLatestConfirmedSeq = -1;
- mBitmap = 0;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DtlsServerProtocol.cs b/BCCrypto/src/crypto/tls/DtlsServerProtocol.cs
deleted file mode 100644
index 3032269..0000000
--- a/BCCrypto/src/crypto/tls/DtlsServerProtocol.cs
+++ /dev/null
@@ -1,696 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class DtlsServerProtocol
- : DtlsProtocol
- {
- protected bool mVerifyRequests = true;
-
- public DtlsServerProtocol(SecureRandom secureRandom)
- : base(secureRandom)
- {
- }
-
- public virtual bool VerifyRequests
- {
- get { return mVerifyRequests; }
- set { this.mVerifyRequests = value; }
- }
-
- public virtual DtlsTransport Accept(TlsServer server, DatagramTransport transport)
- {
- if (server == null)
- throw new ArgumentNullException("server");
- if (transport == null)
- throw new ArgumentNullException("transport");
-
- SecurityParameters securityParameters = new SecurityParameters();
- securityParameters.entity = ConnectionEnd.server;
-
- ServerHandshakeState state = new ServerHandshakeState();
- state.server = server;
- state.serverContext = new TlsServerContextImpl(mSecureRandom, securityParameters);
-
- securityParameters.serverRandom = TlsProtocol.CreateRandomBlock(server.ShouldUseGmtUnixTime(),
- state.serverContext.NonceRandomGenerator);
-
- server.Init(state.serverContext);
-
- DtlsRecordLayer recordLayer = new DtlsRecordLayer(transport, state.serverContext, server, ContentType.handshake);
-
- // TODO Need to handle sending of HelloVerifyRequest without entering a full connection
-
- try
- {
- return ServerHandshake(state, recordLayer);
- }
- catch (TlsFatalAlert fatalAlert)
- {
- AbortServerHandshake(state, recordLayer, fatalAlert.AlertDescription);
- throw fatalAlert;
- }
- catch (IOException e)
- {
- AbortServerHandshake(state, recordLayer, AlertDescription.internal_error);
- throw e;
- }
- catch (Exception e)
- {
- AbortServerHandshake(state, recordLayer, AlertDescription.internal_error);
- throw new TlsFatalAlert(AlertDescription.internal_error, e);
- }
- finally
- {
- securityParameters.Clear();
- }
- }
-
- internal virtual void AbortServerHandshake(ServerHandshakeState state, DtlsRecordLayer recordLayer, byte alertDescription)
- {
- recordLayer.Fail(alertDescription);
- InvalidateSession(state);
- }
-
- internal virtual DtlsTransport ServerHandshake(ServerHandshakeState state, DtlsRecordLayer recordLayer)
- {
- SecurityParameters securityParameters = state.serverContext.SecurityParameters;
- DtlsReliableHandshake handshake = new DtlsReliableHandshake(state.serverContext, recordLayer);
-
- DtlsReliableHandshake.Message clientMessage = handshake.ReceiveMessage();
-
- // NOTE: DTLSRecordLayer requires any DTLS version, we don't otherwise constrain this
- //ProtocolVersion recordLayerVersion = recordLayer.ReadVersion;
-
- if (clientMessage.Type == HandshakeType.client_hello)
- {
- ProcessClientHello(state, clientMessage.Body);
- }
- else
- {
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- {
- byte[] serverHelloBody = GenerateServerHello(state);
-
- ApplyMaxFragmentLengthExtension(recordLayer, securityParameters.maxFragmentLength);
-
- ProtocolVersion recordLayerVersion = state.serverContext.ServerVersion;
- recordLayer.ReadVersion = recordLayerVersion;
- recordLayer.SetWriteVersion(recordLayerVersion);
-
- handshake.SendMessage(HandshakeType.server_hello, serverHelloBody);
- }
-
- handshake.NotifyHelloComplete();
-
- IList serverSupplementalData = state.server.GetServerSupplementalData();
- if (serverSupplementalData != null)
- {
- byte[] supplementalDataBody = GenerateSupplementalData(serverSupplementalData);
- handshake.SendMessage(HandshakeType.supplemental_data, supplementalDataBody);
- }
-
- state.keyExchange = state.server.GetKeyExchange();
- state.keyExchange.Init(state.serverContext);
-
- state.serverCredentials = state.server.GetCredentials();
-
- Certificate serverCertificate = null;
-
- if (state.serverCredentials == null)
- {
- state.keyExchange.SkipServerCredentials();
- }
- else
- {
- state.keyExchange.ProcessServerCredentials(state.serverCredentials);
-
- serverCertificate = state.serverCredentials.Certificate;
- byte[] certificateBody = GenerateCertificate(serverCertificate);
- handshake.SendMessage(HandshakeType.certificate, certificateBody);
- }
-
- // TODO[RFC 3546] Check whether empty certificates is possible, allowed, or excludes CertificateStatus
- if (serverCertificate == null || serverCertificate.IsEmpty)
- {
- state.allowCertificateStatus = false;
- }
-
- if (state.allowCertificateStatus)
- {
- CertificateStatus certificateStatus = state.server.GetCertificateStatus();
- if (certificateStatus != null)
- {
- byte[] certificateStatusBody = GenerateCertificateStatus(state, certificateStatus);
- handshake.SendMessage(HandshakeType.certificate_status, certificateStatusBody);
- }
- }
-
- byte[] serverKeyExchange = state.keyExchange.GenerateServerKeyExchange();
- if (serverKeyExchange != null)
- {
- handshake.SendMessage(HandshakeType.server_key_exchange, serverKeyExchange);
- }
-
- if (state.serverCredentials != null)
- {
- state.certificateRequest = state.server.GetCertificateRequest();
- if (state.certificateRequest != null)
- {
- if (TlsUtilities.IsTlsV12(state.serverContext) != (state.certificateRequest.SupportedSignatureAlgorithms != null))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- state.keyExchange.ValidateCertificateRequest(state.certificateRequest);
-
- byte[] certificateRequestBody = GenerateCertificateRequest(state, state.certificateRequest);
- handshake.SendMessage(HandshakeType.certificate_request, certificateRequestBody);
-
- TlsUtilities.TrackHashAlgorithms(handshake.HandshakeHash,
- state.certificateRequest.SupportedSignatureAlgorithms);
- }
- }
-
- handshake.SendMessage(HandshakeType.server_hello_done, TlsUtilities.EmptyBytes);
-
- handshake.HandshakeHash.SealHashAlgorithms();
-
- clientMessage = handshake.ReceiveMessage();
-
- if (clientMessage.Type == HandshakeType.supplemental_data)
- {
- ProcessClientSupplementalData(state, clientMessage.Body);
- clientMessage = handshake.ReceiveMessage();
- }
- else
- {
- state.server.ProcessClientSupplementalData(null);
- }
-
- if (state.certificateRequest == null)
- {
- state.keyExchange.SkipClientCredentials();
- }
- else
- {
- if (clientMessage.Type == HandshakeType.certificate)
- {
- ProcessClientCertificate(state, clientMessage.Body);
- clientMessage = handshake.ReceiveMessage();
- }
- else
- {
- if (TlsUtilities.IsTlsV12(state.serverContext))
- {
- /*
- * RFC 5246 If no suitable certificate is available, the client MUST send a
- * certificate message containing no certificates.
- *
- * NOTE: In previous RFCs, this was SHOULD instead of MUST.
- */
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- NotifyClientCertificate(state, Certificate.EmptyChain);
- }
- }
-
- if (clientMessage.Type == HandshakeType.client_key_exchange)
- {
- ProcessClientKeyExchange(state, clientMessage.Body);
- }
- else
- {
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- TlsHandshakeHash prepareFinishHash = handshake.PrepareToFinish();
- securityParameters.sessionHash = TlsProtocol.GetCurrentPrfHash(state.serverContext, prepareFinishHash, null);
-
- TlsProtocol.EstablishMasterSecret(state.serverContext, state.keyExchange);
- recordLayer.InitPendingEpoch(state.server.GetCipher());
-
- /*
- * RFC 5246 7.4.8 This message is only sent following a client certificate that has signing
- * capability (i.e., all certificates except those containing fixed Diffie-Hellman
- * parameters).
- */
- if (ExpectCertificateVerifyMessage(state))
- {
- byte[] certificateVerifyBody = handshake.ReceiveMessageBody(HandshakeType.certificate_verify);
- ProcessCertificateVerify(state, certificateVerifyBody, prepareFinishHash);
- }
-
- // NOTE: Calculated exclusive of the actual Finished message from the client
- byte[] expectedClientVerifyData = TlsUtilities.CalculateVerifyData(state.serverContext, ExporterLabel.client_finished,
- TlsProtocol.GetCurrentPrfHash(state.serverContext, handshake.HandshakeHash, null));
- ProcessFinished(handshake.ReceiveMessageBody(HandshakeType.finished), expectedClientVerifyData);
-
- if (state.expectSessionTicket)
- {
- NewSessionTicket newSessionTicket = state.server.GetNewSessionTicket();
- byte[] newSessionTicketBody = GenerateNewSessionTicket(state, newSessionTicket);
- handshake.SendMessage(HandshakeType.session_ticket, newSessionTicketBody);
- }
-
- // NOTE: Calculated exclusive of the Finished message itself
- byte[] serverVerifyData = TlsUtilities.CalculateVerifyData(state.serverContext, ExporterLabel.server_finished,
- TlsProtocol.GetCurrentPrfHash(state.serverContext, handshake.HandshakeHash, null));
- handshake.SendMessage(HandshakeType.finished, serverVerifyData);
-
- handshake.Finish();
-
- state.server.NotifyHandshakeComplete();
-
- return new DtlsTransport(recordLayer);
- }
-
- protected virtual void InvalidateSession(ServerHandshakeState state)
- {
- if (state.sessionParameters != null)
- {
- state.sessionParameters.Clear();
- state.sessionParameters = null;
- }
-
- if (state.tlsSession != null)
- {
- state.tlsSession.Invalidate();
- state.tlsSession = null;
- }
- }
-
- protected virtual byte[] GenerateCertificateRequest(ServerHandshakeState state, CertificateRequest certificateRequest)
- {
- MemoryStream buf = new MemoryStream();
- certificateRequest.Encode(buf);
- return buf.ToArray();
- }
-
- protected virtual byte[] GenerateCertificateStatus(ServerHandshakeState state, CertificateStatus certificateStatus)
- {
- MemoryStream buf = new MemoryStream();
- certificateStatus.Encode(buf);
- return buf.ToArray();
- }
-
- protected virtual byte[] GenerateNewSessionTicket(ServerHandshakeState state, NewSessionTicket newSessionTicket)
- {
- MemoryStream buf = new MemoryStream();
- newSessionTicket.Encode(buf);
- return buf.ToArray();
- }
-
- protected virtual byte[] GenerateServerHello(ServerHandshakeState state)
- {
- SecurityParameters securityParameters = state.serverContext.SecurityParameters;
-
- MemoryStream buf = new MemoryStream();
-
- {
- ProtocolVersion server_version = state.server.GetServerVersion();
- if (!server_version.IsEqualOrEarlierVersionOf(state.serverContext.ClientVersion))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- // TODO Read RFCs for guidance on the expected record layer version number
- // recordStream.setReadVersion(server_version);
- // recordStream.setWriteVersion(server_version);
- // recordStream.setRestrictReadVersion(true);
- state.serverContext.SetServerVersion(server_version);
-
- TlsUtilities.WriteVersion(state.serverContext.ServerVersion, buf);
- }
-
- buf.Write(securityParameters.ServerRandom, 0, securityParameters.ServerRandom.Length);
-
- /*
- * The server may return an empty session_id to indicate that the session will not be cached
- * and therefore cannot be resumed.
- */
- TlsUtilities.WriteOpaque8(TlsUtilities.EmptyBytes, buf);
-
- int selectedCipherSuite = state.server.GetSelectedCipherSuite();
- if (!Arrays.Contains(state.offeredCipherSuites, selectedCipherSuite)
- || selectedCipherSuite == CipherSuite.TLS_NULL_WITH_NULL_NULL
- || CipherSuite.IsScsv(selectedCipherSuite)
- || !TlsUtilities.IsValidCipherSuiteForVersion(selectedCipherSuite, state.serverContext.ServerVersion))
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- ValidateSelectedCipherSuite(selectedCipherSuite, AlertDescription.internal_error);
- securityParameters.cipherSuite = selectedCipherSuite;
-
- byte selectedCompressionMethod = state.server.GetSelectedCompressionMethod();
- if (!Arrays.Contains(state.offeredCompressionMethods, selectedCompressionMethod))
- throw new TlsFatalAlert(AlertDescription.internal_error);
- securityParameters.compressionAlgorithm = selectedCompressionMethod;
-
- TlsUtilities.WriteUint16(selectedCipherSuite, buf);
- TlsUtilities.WriteUint8(selectedCompressionMethod, buf);
-
- state.serverExtensions = state.server.GetServerExtensions();
-
- /*
- * RFC 5746 3.6. Server Behavior: Initial Handshake
- */
- if (state.secure_renegotiation)
- {
- byte[] renegExtData = TlsUtilities.GetExtensionData(state.serverExtensions, ExtensionType.renegotiation_info);
- bool noRenegExt = (null == renegExtData);
-
- if (noRenegExt)
- {
- /*
- * Note that sending a "renegotiation_info" extension in response to a ClientHello
- * containing only the SCSV is an explicit exception to the prohibition in RFC 5246,
- * Section 7.4.1.4, on the server sending unsolicited extensions and is only allowed
- * because the client is signaling its willingness to receive the extension via the
- * TLS_EMPTY_RENEGOTIATION_INFO_SCSV SCSV.
- */
-
- /*
- * If the secure_renegotiation flag is set to TRUE, the server MUST include an empty
- * "renegotiation_info" extension in the ServerHello message.
- */
- state.serverExtensions = TlsExtensionsUtilities.EnsureExtensionsInitialised(state.serverExtensions);
- state.serverExtensions[ExtensionType.renegotiation_info] = TlsProtocol.CreateRenegotiationInfo(TlsUtilities.EmptyBytes);
- }
- }
-
- if (securityParameters.extendedMasterSecret)
- {
- state.serverExtensions = TlsExtensionsUtilities.EnsureExtensionsInitialised(state.serverExtensions);
- TlsExtensionsUtilities.AddExtendedMasterSecretExtension(state.serverExtensions);
- }
-
- /*
- * TODO RFC 3546 2.3 If [...] the older session is resumed, then the server MUST ignore
- * extensions appearing in the client hello, and send a server hello containing no
- * extensions.
- */
-
- if (state.serverExtensions != null)
- {
- securityParameters.encryptThenMac = TlsExtensionsUtilities.HasEncryptThenMacExtension(state.serverExtensions);
-
- securityParameters.maxFragmentLength = EvaluateMaxFragmentLengthExtension(state.resumedSession,
- state.clientExtensions, state.serverExtensions, AlertDescription.internal_error);
-
- securityParameters.truncatedHMac = TlsExtensionsUtilities.HasTruncatedHMacExtension(state.serverExtensions);
-
- /*
- * TODO It's surprising that there's no provision to allow a 'fresh' CertificateStatus to be sent in
- * a session resumption handshake.
- */
- state.allowCertificateStatus = !state.resumedSession
- && TlsUtilities.HasExpectedEmptyExtensionData(state.serverExtensions, ExtensionType.status_request,
- AlertDescription.internal_error);
-
- state.expectSessionTicket = !state.resumedSession
- && TlsUtilities.HasExpectedEmptyExtensionData(state.serverExtensions, ExtensionType.session_ticket,
- AlertDescription.internal_error);
-
- TlsProtocol.WriteExtensions(buf, state.serverExtensions);
- }
-
- securityParameters.prfAlgorithm = TlsProtocol.GetPrfAlgorithm(state.serverContext,
- securityParameters.CipherSuite);
-
- /*
- * RFC 5246 7.4.9. Any cipher suite which does not explicitly specify verify_data_length
- * has a verify_data_length equal to 12. This includes all existing cipher suites.
- */
- securityParameters.verifyDataLength = 12;
-
- return buf.ToArray();
- }
-
- protected virtual void NotifyClientCertificate(ServerHandshakeState state, Certificate clientCertificate)
- {
- if (state.certificateRequest == null)
- throw new InvalidOperationException();
-
- if (state.clientCertificate != null)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- state.clientCertificate = clientCertificate;
-
- if (clientCertificate.IsEmpty)
- {
- state.keyExchange.SkipClientCredentials();
- }
- else
- {
-
- /*
- * TODO RFC 5246 7.4.6. If the certificate_authorities list in the certificate request
- * message was non-empty, one of the certificates in the certificate chain SHOULD be
- * issued by one of the listed CAs.
- */
-
- state.clientCertificateType = TlsUtilities.GetClientCertificateType(clientCertificate,
- state.serverCredentials.Certificate);
-
- state.keyExchange.ProcessClientCertificate(clientCertificate);
- }
-
- /*
- * RFC 5246 7.4.6. If the client does not send any certificates, the server MAY at its
- * discretion either continue the handshake without client authentication, or respond with a
- * fatal handshake_failure alert. Also, if some aspect of the certificate chain was
- * unacceptable (e.g., it was not signed by a known, trusted CA), the server MAY at its
- * discretion either continue the handshake (considering the client unauthenticated) or send
- * a fatal alert.
- */
- state.server.NotifyClientCertificate(clientCertificate);
- }
-
- protected virtual void ProcessClientCertificate(ServerHandshakeState state, byte[] body)
- {
- MemoryStream buf = new MemoryStream(body, false);
-
- Certificate clientCertificate = Certificate.Parse(buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- NotifyClientCertificate(state, clientCertificate);
- }
-
- protected virtual void ProcessCertificateVerify(ServerHandshakeState state, byte[] body, TlsHandshakeHash prepareFinishHash)
- {
- if (state.certificateRequest == null)
- throw new InvalidOperationException();
-
- MemoryStream buf = new MemoryStream(body, false);
-
- TlsServerContextImpl context = state.serverContext;
- DigitallySigned clientCertificateVerify = DigitallySigned.Parse(context, buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- // Verify the CertificateVerify message contains a correct signature.
- try
- {
- SignatureAndHashAlgorithm signatureAlgorithm = clientCertificateVerify.Algorithm;
-
- byte[] hash;
- if (TlsUtilities.IsTlsV12(context))
- {
- TlsUtilities.VerifySupportedSignatureAlgorithm(state.certificateRequest.SupportedSignatureAlgorithms, signatureAlgorithm);
- hash = prepareFinishHash.GetFinalHash(signatureAlgorithm.Hash);
- }
- else
- {
- hash = context.SecurityParameters.SessionHash;
- }
-
- X509CertificateStructure x509Cert = state.clientCertificate.GetCertificateAt(0);
- SubjectPublicKeyInfo keyInfo = x509Cert.SubjectPublicKeyInfo;
- AsymmetricKeyParameter publicKey = PublicKeyFactory.CreateKey(keyInfo);
-
- TlsSigner tlsSigner = TlsUtilities.CreateTlsSigner((byte)state.clientCertificateType);
- tlsSigner.Init(context);
- if (!tlsSigner.VerifyRawSignature(signatureAlgorithm, clientCertificateVerify.Signature, publicKey, hash))
- throw new TlsFatalAlert(AlertDescription.decrypt_error);
- }
- catch (TlsFatalAlert e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new TlsFatalAlert(AlertDescription.decrypt_error, e);
- }
- }
-
- protected virtual void ProcessClientHello(ServerHandshakeState state, byte[] body)
- {
- MemoryStream buf = new MemoryStream(body, false);
-
- // TODO Read RFCs for guidance on the expected record layer version number
- ProtocolVersion client_version = TlsUtilities.ReadVersion(buf);
- if (!client_version.IsDtls)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- /*
- * Read the client random
- */
- byte[] client_random = TlsUtilities.ReadFully(32, buf);
-
- byte[] sessionID = TlsUtilities.ReadOpaque8(buf);
- if (sessionID.Length > 32)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- // TODO RFC 4347 has the cookie length restricted to 32, but not in RFC 6347
- byte[] cookie = TlsUtilities.ReadOpaque8(buf);
-
- int cipher_suites_length = TlsUtilities.ReadUint16(buf);
- if (cipher_suites_length < 2 || (cipher_suites_length & 1) != 0)
- {
- throw new TlsFatalAlert(AlertDescription.decode_error);
- }
-
- /*
- * NOTE: "If the session_id field is not empty (implying a session resumption request) this
- * vector must include at least the cipher_suite from that session."
- */
- state.offeredCipherSuites = TlsUtilities.ReadUint16Array(cipher_suites_length / 2, buf);
-
- int compression_methods_length = TlsUtilities.ReadUint8(buf);
- if (compression_methods_length < 1)
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- state.offeredCompressionMethods = TlsUtilities.ReadUint8Array(compression_methods_length, buf);
-
- /*
- * TODO RFC 3546 2.3 If [...] the older session is resumed, then the server MUST ignore
- * extensions appearing in the client hello, and send a server hello containing no
- * extensions.
- */
- state.clientExtensions = TlsProtocol.ReadExtensions(buf);
-
- TlsServerContextImpl context = state.serverContext;
- SecurityParameters securityParameters = context.SecurityParameters;
-
- /*
- * TODO[session-hash]
- *
- * draft-ietf-tls-session-hash-04 4. Clients and servers SHOULD NOT accept handshakes
- * that do not use the extended master secret [..]. (and see 5.2, 5.3)
- */
- securityParameters.extendedMasterSecret = TlsExtensionsUtilities.HasExtendedMasterSecretExtension(state.clientExtensions);
-
- context.SetClientVersion(client_version);
-
- state.server.NotifyClientVersion(client_version);
- state.server.NotifyFallback(Arrays.Contains(state.offeredCipherSuites, CipherSuite.TLS_FALLBACK_SCSV));
-
- securityParameters.clientRandom = client_random;
-
- state.server.NotifyOfferedCipherSuites(state.offeredCipherSuites);
- state.server.NotifyOfferedCompressionMethods(state.offeredCompressionMethods);
-
- /*
- * RFC 5746 3.6. Server Behavior: Initial Handshake
- */
- {
- /*
- * RFC 5746 3.4. The client MUST include either an empty "renegotiation_info" extension,
- * or the TLS_EMPTY_RENEGOTIATION_INFO_SCSV signaling cipher suite value in the
- * ClientHello. Including both is NOT RECOMMENDED.
- */
-
- /*
- * When a ClientHello is received, the server MUST check if it includes the
- * TLS_EMPTY_RENEGOTIATION_INFO_SCSV SCSV. If it does, set the secure_renegotiation flag
- * to TRUE.
- */
- if (Arrays.Contains(state.offeredCipherSuites, CipherSuite.TLS_EMPTY_RENEGOTIATION_INFO_SCSV))
- {
- state.secure_renegotiation = true;
- }
-
- /*
- * The server MUST check if the "renegotiation_info" extension is included in the
- * ClientHello.
- */
- byte[] renegExtData = TlsUtilities.GetExtensionData(state.clientExtensions, ExtensionType.renegotiation_info);
- if (renegExtData != null)
- {
- /*
- * If the extension is present, set secure_renegotiation flag to TRUE. The
- * server MUST then verify that the length of the "renegotiated_connection"
- * field is zero, and if it is not, MUST abort the handshake.
- */
- state.secure_renegotiation = true;
-
- if (!Arrays.ConstantTimeAreEqual(renegExtData, TlsProtocol.CreateRenegotiationInfo(TlsUtilities.EmptyBytes)))
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
- }
- }
-
- state.server.NotifySecureRenegotiation(state.secure_renegotiation);
-
- if (state.clientExtensions != null)
- {
- // NOTE: Validates the padding extension data, if present
- TlsExtensionsUtilities.GetPaddingExtension(state.clientExtensions);
-
- state.server.ProcessClientExtensions(state.clientExtensions);
- }
- }
-
- protected virtual void ProcessClientKeyExchange(ServerHandshakeState state, byte[] body)
- {
- MemoryStream buf = new MemoryStream(body, false);
-
- state.keyExchange.ProcessClientKeyExchange(buf);
-
- TlsProtocol.AssertEmpty(buf);
- }
-
- protected virtual void ProcessClientSupplementalData(ServerHandshakeState state, byte[] body)
- {
- MemoryStream buf = new MemoryStream(body, false);
- IList clientSupplementalData = TlsProtocol.ReadSupplementalDataMessage(buf);
- state.server.ProcessClientSupplementalData(clientSupplementalData);
- }
-
- protected virtual bool ExpectCertificateVerifyMessage(ServerHandshakeState state)
- {
- return state.clientCertificateType >= 0 && TlsUtilities.HasSigningCapability((byte)state.clientCertificateType);
- }
-
- protected internal class ServerHandshakeState
- {
- internal TlsServer server = null;
- internal TlsServerContextImpl serverContext = null;
- internal TlsSession tlsSession = null;
- internal SessionParameters sessionParameters = null;
- internal SessionParameters.Builder sessionParametersBuilder = null;
- internal int[] offeredCipherSuites = null;
- internal byte[] offeredCompressionMethods = null;
- internal IDictionary clientExtensions = null;
- internal IDictionary serverExtensions = null;
- internal bool resumedSession = false;
- internal bool secure_renegotiation = false;
- internal bool allowCertificateStatus = false;
- internal bool expectSessionTicket = false;
- internal TlsKeyExchange keyExchange = null;
- internal TlsCredentials serverCredentials = null;
- internal CertificateRequest certificateRequest = null;
- internal short clientCertificateType = -1;
- internal Certificate clientCertificate = null;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/DtlsTransport.cs b/BCCrypto/src/crypto/tls/DtlsTransport.cs
deleted file mode 100644
index 5c60733..0000000
--- a/BCCrypto/src/crypto/tls/DtlsTransport.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class DtlsTransport
- : DatagramTransport
- {
- private readonly DtlsRecordLayer mRecordLayer;
-
- internal DtlsTransport(DtlsRecordLayer recordLayer)
- {
- this.mRecordLayer = recordLayer;
- }
-
- public virtual int GetReceiveLimit()
- {
- return mRecordLayer.GetReceiveLimit();
- }
-
- public virtual int GetSendLimit()
- {
- return mRecordLayer.GetSendLimit();
- }
-
- public virtual int Receive(byte[] buf, int off, int len, int waitMillis)
- {
- try
- {
- return mRecordLayer.Receive(buf, off, len, waitMillis);
- }
- catch (TlsFatalAlert fatalAlert)
- {
- mRecordLayer.Fail(fatalAlert.AlertDescription);
- throw fatalAlert;
- }
- catch (IOException e)
- {
- mRecordLayer.Fail(AlertDescription.internal_error);
- throw e;
- }
- catch (Exception e)
- {
- mRecordLayer.Fail(AlertDescription.internal_error);
- throw new TlsFatalAlert(AlertDescription.internal_error, e);
- }
- }
-
- public virtual void Send(byte[] buf, int off, int len)
- {
- try
- {
- mRecordLayer.Send(buf, off, len);
- }
- catch (TlsFatalAlert fatalAlert)
- {
- mRecordLayer.Fail(fatalAlert.AlertDescription);
- throw fatalAlert;
- }
- catch (IOException e)
- {
- mRecordLayer.Fail(AlertDescription.internal_error);
- throw e;
- }
- catch (Exception e)
- {
- mRecordLayer.Fail(AlertDescription.internal_error);
- throw new TlsFatalAlert(AlertDescription.internal_error, e);
- }
- }
-
- public virtual void Close()
- {
- mRecordLayer.Close();
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ECBasisType.cs b/BCCrypto/src/crypto/tls/ECBasisType.cs
deleted file mode 100644
index 5416e17..0000000
--- a/BCCrypto/src/crypto/tls/ECBasisType.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// RFC 4492 5.4. (Errata ID: 2389)
- public abstract class ECBasisType
- {
- public const byte ec_basis_trinomial = 1;
- public const byte ec_basis_pentanomial = 2;
-
- public static bool IsValid(byte ecBasisType)
- {
- return ecBasisType >= ec_basis_trinomial && ecBasisType <= ec_basis_pentanomial;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ECCurveType.cs b/BCCrypto/src/crypto/tls/ECCurveType.cs
deleted file mode 100644
index 1b352e9..0000000
--- a/BCCrypto/src/crypto/tls/ECCurveType.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// RFC 4492 5.4
- ///
- public abstract class ECCurveType
- {
- /**
- * Indicates the elliptic curve domain parameters are conveyed verbosely, and the
- * underlying finite field is a prime field.
- */
- public const byte explicit_prime = 1;
-
- /**
- * Indicates the elliptic curve domain parameters are conveyed verbosely, and the
- * underlying finite field is a characteristic-2 field.
- */
- public const byte explicit_char2 = 2;
-
- /**
- * Indicates that a named curve is used. This option SHOULD be used when applicable.
- */
- public const byte named_curve = 3;
-
- /*
- * Values 248 through 255 are reserved for private use.
- */
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ECPointFormat.cs b/BCCrypto/src/crypto/tls/ECPointFormat.cs
deleted file mode 100644
index 21b0fdd..0000000
--- a/BCCrypto/src/crypto/tls/ECPointFormat.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// RFC 4492 5.1.2
- ///
- public abstract class ECPointFormat
- {
- public const byte uncompressed = 0;
- public const byte ansiX962_compressed_prime = 1;
- public const byte ansiX962_compressed_char2 = 2;
-
- /*
- * reserved (248..255)
- */
- }
-}
diff --git a/BCCrypto/src/crypto/tls/EncryptionAlgorithm.cs b/BCCrypto/src/crypto/tls/EncryptionAlgorithm.cs
deleted file mode 100644
index 45eef18..0000000
--- a/BCCrypto/src/crypto/tls/EncryptionAlgorithm.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// RFC 2246
- ///
- /// Note that the values here are implementation-specific and arbitrary. It is recommended not to
- /// depend on the particular values (e.g. serialization).
- ///
- public abstract class EncryptionAlgorithm
- {
- public const int NULL = 0;
- public const int RC4_40 = 1;
- public const int RC4_128 = 2;
- public const int RC2_CBC_40 = 3;
- public const int IDEA_CBC = 4;
- public const int DES40_CBC = 5;
- public const int DES_CBC = 6;
- public const int cls_3DES_EDE_CBC = 7;
-
- /*
- * RFC 3268
- */
- public const int AES_128_CBC = 8;
- public const int AES_256_CBC = 9;
-
- /*
- * RFC 5289
- */
- public const int AES_128_GCM = 10;
- public const int AES_256_GCM = 11;
-
- /*
- * RFC 4132
- */
- public const int CAMELLIA_128_CBC = 12;
- public const int CAMELLIA_256_CBC = 13;
-
- /*
- * RFC 4162
- */
- public const int SEED_CBC = 14;
-
- /*
- * RFC 6655
- */
- public const int AES_128_CCM = 15;
- public const int AES_128_CCM_8 = 16;
- public const int AES_256_CCM = 17;
- public const int AES_256_CCM_8 = 18;
-
- /*
- * RFC 6367
- */
- public const int CAMELLIA_128_GCM = 19;
- public const int CAMELLIA_256_GCM = 20;
-
- /*
- * RFC 7905
- */
- public const int CHACHA20_POLY1305 = 21;
-
- /*
- * draft-zauner-tls-aes-ocb-04
- */
- public const int AES_128_OCB_TAGLEN96 = 103;
- public const int AES_256_OCB_TAGLEN96 = 104;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ExporterLabel.cs b/BCCrypto/src/crypto/tls/ExporterLabel.cs
deleted file mode 100644
index 5970769..0000000
--- a/BCCrypto/src/crypto/tls/ExporterLabel.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// RFC 5705
- public abstract class ExporterLabel
- {
- /*
- * RFC 5246
- */
- public const string client_finished = "client finished";
- public const string server_finished = "server finished";
- public const string master_secret = "master secret";
- public const string key_expansion = "key expansion";
-
- /*
- * RFC 5216
- */
- public const string client_EAP_encryption = "client EAP encryption";
-
- /*
- * RFC 5281
- */
- public const string ttls_keying_material = "ttls keying material";
- public const string ttls_challenge = "ttls challenge";
-
- /*
- * RFC 5764
- */
- public const string dtls_srtp = "EXTRACTOR-dtls_srtp";
-
- /*
- * draft-ietf-tls-session-hash-04
- */
- public static readonly string extended_master_secret = "extended master secret";
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ExtensionType.cs b/BCCrypto/src/crypto/tls/ExtensionType.cs
deleted file mode 100644
index f17210b..0000000
--- a/BCCrypto/src/crypto/tls/ExtensionType.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class ExtensionType
- {
- /*
- * RFC 2546 2.3.
- */
- public const int server_name = 0;
- public const int max_fragment_length = 1;
- public const int client_certificate_url = 2;
- public const int trusted_ca_keys = 3;
- public const int truncated_hmac = 4;
- public const int status_request = 5;
-
- /*
- * RFC 4681
- */
- public const int user_mapping = 6;
-
- /*
- * RFC 5878
- */
- public const int client_authz = 7;
- public const int server_authz = 8;
-
- /*
- * RFC RFC6091
- */
- public const int cert_type = 9;
-
- /*
- * draft-ietf-tls-negotiated-ff-dhe-10
- */
- public const int supported_groups = 10;
-
- /*
- * RFC 4492 5.1.
- */
- [Obsolete("Use 'supported_groups' instead")]
- public const int elliptic_curves = supported_groups;
- public const int ec_point_formats = 11;
-
- /*
- * RFC 5054 2.8.1.
- */
- public const int srp = 12;
-
- /*
- * RFC 5246 7.4.1.4.
- */
- public const int signature_algorithms = 13;
-
- /*
- * RFC 5764 9.
- */
- public const int use_srtp = 14;
-
- /*
- * RFC 6520 6.
- */
- public const int heartbeat = 15;
-
- /*
- * RFC 7301
- */
- public const int application_layer_protocol_negotiation = 16;
-
- /*
- * RFC 6961
- */
- public const int status_request_v2 = 17;
-
- /*
- * RFC 6962
- */
- public const int signed_certificate_timestamp = 18;
-
- /*
- * RFC 7250
- */
- public const int client_certificate_type = 19;
- public const int server_certificate_type = 20;
-
- /*
- * RFC 7685
- */
- public const int padding = 21;
-
- /*
- * RFC 7366
- */
- public const int encrypt_then_mac = 22;
-
- /*
- * RFC 7627
- */
- public const int extended_master_secret = 23;
-
- /*
- * draft-ietf-tokbind-negotiation-08
- */
- public static readonly int DRAFT_token_binding = 24;
-
- /*
- * RFC 7924
- */
- public const int cached_info = 25;
-
- /*
- * RFC 5077 7.
- */
- public const int session_ticket = 35;
-
- /*
- * draft-ietf-tls-negotiated-ff-dhe-01
- *
- * WARNING: Placeholder value; the real value is TBA
- */
- public static readonly int negotiated_ff_dhe_groups = 101;
-
- /*
- * RFC 5746 3.2.
- */
- public const int renegotiation_info = 0xff01;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/FiniteFieldDheGroup.cs b/BCCrypto/src/crypto/tls/FiniteFieldDheGroup.cs
deleted file mode 100644
index 4375049..0000000
--- a/BCCrypto/src/crypto/tls/FiniteFieldDheGroup.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /*
- * draft-ietf-tls-negotiated-ff-dhe-01
- */
- public abstract class FiniteFieldDheGroup
- {
- public const byte ffdhe2432 = 0;
- public const byte ffdhe3072 = 1;
- public const byte ffdhe4096 = 2;
- public const byte ffdhe6144 = 3;
- public const byte ffdhe8192 = 4;
-
- public static bool IsValid(byte group)
- {
- return group >= ffdhe2432 && group <= ffdhe8192;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/HandshakeType.cs b/BCCrypto/src/crypto/tls/HandshakeType.cs
deleted file mode 100644
index e63042a..0000000
--- a/BCCrypto/src/crypto/tls/HandshakeType.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class HandshakeType
- {
- /*
- * RFC 2246 7.4
- */
- public const byte hello_request = 0;
- public const byte client_hello = 1;
- public const byte server_hello = 2;
- public const byte certificate = 11;
- public const byte server_key_exchange = 12;
- public const byte certificate_request = 13;
- public const byte server_hello_done = 14;
- public const byte certificate_verify = 15;
- public const byte client_key_exchange = 16;
- public const byte finished = 20;
-
- /*
- * RFC 3546 2.4
- */
- public const byte certificate_url = 21;
- public const byte certificate_status = 22;
-
- /*
- * (DTLS) RFC 4347 4.3.2
- */
- public const byte hello_verify_request = 3;
-
- /*
- * RFC 4680
- */
- public const byte supplemental_data = 23;
-
- /*
- * RFC 5077
- */
- public const byte session_ticket = 4;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/HashAlgorithm.cs b/BCCrypto/src/crypto/tls/HashAlgorithm.cs
deleted file mode 100644
index 0f38e2d..0000000
--- a/BCCrypto/src/crypto/tls/HashAlgorithm.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// RFC 5246 7.4.1.4.1
- public abstract class HashAlgorithm
- {
- public const byte none = 0;
- public const byte md5 = 1;
- public const byte sha1 = 2;
- public const byte sha224 = 3;
- public const byte sha256 = 4;
- public const byte sha384 = 5;
- public const byte sha512 = 6;
-
- public static string GetName(byte hashAlgorithm)
- {
- switch (hashAlgorithm)
- {
- case none:
- return "none";
- case md5:
- return "md5";
- case sha1:
- return "sha1";
- case sha224:
- return "sha224";
- case sha256:
- return "sha256";
- case sha384:
- return "sha384";
- case sha512:
- return "sha512";
- default:
- return "UNKNOWN";
- }
- }
-
- public static string GetText(byte hashAlgorithm)
- {
- return GetName(hashAlgorithm) + "(" + hashAlgorithm + ")";
- }
-
- public static bool IsPrivate(byte hashAlgorithm)
- {
- return 224 <= hashAlgorithm && hashAlgorithm <= 255;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/HeartbeatExtension.cs b/BCCrypto/src/crypto/tls/HeartbeatExtension.cs
deleted file mode 100644
index 0498372..0000000
--- a/BCCrypto/src/crypto/tls/HeartbeatExtension.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class HeartbeatExtension
- {
- protected readonly byte mMode;
-
- public HeartbeatExtension(byte mode)
- {
- if (!HeartbeatMode.IsValid(mode))
- throw new ArgumentException("not a valid HeartbeatMode value", "mode");
-
- this.mMode = mode;
- }
-
- public virtual byte Mode
- {
- get { return mMode; }
- }
-
- /**
- * Encode this {@link HeartbeatExtension} to a {@link Stream}.
- *
- * @param output
- * the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- TlsUtilities.WriteUint8(mMode, output);
- }
-
- /**
- * Parse a {@link HeartbeatExtension} from a {@link Stream}.
- *
- * @param input
- * the {@link Stream} to parse from.
- * @return a {@link HeartbeatExtension} object.
- * @throws IOException
- */
- public static HeartbeatExtension Parse(Stream input)
- {
- byte mode = TlsUtilities.ReadUint8(input);
- if (!HeartbeatMode.IsValid(mode))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- return new HeartbeatExtension(mode);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/HeartbeatMessage.cs b/BCCrypto/src/crypto/tls/HeartbeatMessage.cs
deleted file mode 100644
index 3f22f7e..0000000
--- a/BCCrypto/src/crypto/tls/HeartbeatMessage.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class HeartbeatMessage
- {
- protected readonly byte mType;
- protected readonly byte[] mPayload;
- protected readonly int mPaddingLength;
-
- public HeartbeatMessage(byte type, byte[] payload, int paddingLength)
- {
- if (!HeartbeatMessageType.IsValid(type))
- throw new ArgumentException("not a valid HeartbeatMessageType value", "type");
- if (payload == null || payload.Length >= (1 << 16))
- throw new ArgumentException("must have length < 2^16", "payload");
- if (paddingLength < 16)
- throw new ArgumentException("must be at least 16", "paddingLength");
-
- this.mType = type;
- this.mPayload = payload;
- this.mPaddingLength = paddingLength;
- }
-
- /**
- * Encode this {@link HeartbeatMessage} to a {@link Stream}.
- *
- * @param output
- * the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(TlsContext context, Stream output)
- {
- TlsUtilities.WriteUint8(mType, output);
-
- TlsUtilities.CheckUint16(mPayload.Length);
- TlsUtilities.WriteUint16(mPayload.Length, output);
- output.Write(mPayload, 0, mPayload.Length);
-
- byte[] padding = new byte[mPaddingLength];
- context.NonceRandomGenerator.NextBytes(padding);
- output.Write(padding, 0, padding.Length);
- }
-
- /**
- * Parse a {@link HeartbeatMessage} from a {@link Stream}.
- *
- * @param input
- * the {@link Stream} to parse from.
- * @return a {@link HeartbeatMessage} object.
- * @throws IOException
- */
- public static HeartbeatMessage Parse(Stream input)
- {
- byte type = TlsUtilities.ReadUint8(input);
- if (!HeartbeatMessageType.IsValid(type))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- int payload_length = TlsUtilities.ReadUint16(input);
-
- PayloadBuffer buf = new PayloadBuffer();
- Streams.PipeAll(input, buf);
-
- byte[] payload = buf.ToTruncatedByteArray(payload_length);
- if (payload == null)
- {
- /*
- * RFC 6520 4. If the payload_length of a received HeartbeatMessage is too large, the
- * received HeartbeatMessage MUST be discarded silently.
- */
- return null;
- }
-
- TlsUtilities.CheckUint16(buf.Length);
- int padding_length = (int)buf.Length - payload.Length;
-
- /*
- * RFC 6520 4. The padding of a received HeartbeatMessage message MUST be ignored
- */
- return new HeartbeatMessage(type, payload, padding_length);
- }
-
- internal class PayloadBuffer
- : MemoryStream
- {
- internal byte[] ToTruncatedByteArray(int payloadLength)
- {
- /*
- * RFC 6520 4. The padding_length MUST be at least 16.
- */
- int minimumCount = payloadLength + 16;
- if (Length < minimumCount)
- return null;
-
-#if PORTABLE
- byte[] buf = ToArray();
-#else
- byte[] buf = GetBuffer();
-#endif
-
- return Arrays.CopyOf(buf, payloadLength);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/HeartbeatMessageType.cs b/BCCrypto/src/crypto/tls/HeartbeatMessageType.cs
deleted file mode 100644
index 57a4b86..0000000
--- a/BCCrypto/src/crypto/tls/HeartbeatMessageType.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /*
- * RFC 6520 3.
- */
- public abstract class HeartbeatMessageType
- {
- public const byte heartbeat_request = 1;
- public const byte heartbeat_response = 2;
-
- public static bool IsValid(byte heartbeatMessageType)
- {
- return heartbeatMessageType >= heartbeat_request && heartbeatMessageType <= heartbeat_response;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/HeartbeatMode.cs b/BCCrypto/src/crypto/tls/HeartbeatMode.cs
deleted file mode 100644
index f1570a8..0000000
--- a/BCCrypto/src/crypto/tls/HeartbeatMode.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /*
- * RFC 6520
- */
- public abstract class HeartbeatMode
- {
- public const byte peer_allowed_to_send = 1;
- public const byte peer_not_allowed_to_send = 2;
-
- public static bool IsValid(byte heartbeatMode)
- {
- return heartbeatMode >= peer_allowed_to_send && heartbeatMode <= peer_not_allowed_to_send;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/KeyExchangeAlgorithm.cs b/BCCrypto/src/crypto/tls/KeyExchangeAlgorithm.cs
deleted file mode 100644
index 9b1b3ba..0000000
--- a/BCCrypto/src/crypto/tls/KeyExchangeAlgorithm.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// RFC 2246
- ///
- /// Note that the values here are implementation-specific and arbitrary. It is recommended not to
- /// depend on the particular values (e.g. serialization).
- ///
- public abstract class KeyExchangeAlgorithm
- {
- public const int NULL = 0;
- public const int RSA = 1;
- public const int RSA_EXPORT = 2;
- public const int DHE_DSS = 3;
- public const int DHE_DSS_EXPORT = 4;
- public const int DHE_RSA = 5;
- public const int DHE_RSA_EXPORT = 6;
- public const int DH_DSS = 7;
- public const int DH_DSS_EXPORT = 8;
- public const int DH_RSA = 9;
- public const int DH_RSA_EXPORT = 10;
- public const int DH_anon = 11;
- public const int DH_anon_EXPORT = 12;
-
- /*
- * RFC 4279
- */
- public const int PSK = 13;
- public const int DHE_PSK = 14;
- public const int RSA_PSK = 15;
-
- /*
- * RFC 4429
- */
- public const int ECDH_ECDSA = 16;
- public const int ECDHE_ECDSA = 17;
- public const int ECDH_RSA = 18;
- public const int ECDHE_RSA = 19;
- public const int ECDH_anon = 20;
-
- /*
- * RFC 5054
- */
- public const int SRP = 21;
- public const int SRP_DSS = 22;
- public const int SRP_RSA = 23;
-
- /*
- * RFC 5489
- */
- public const int ECDHE_PSK = 24;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/MacAlgorithm.cs b/BCCrypto/src/crypto/tls/MacAlgorithm.cs
deleted file mode 100644
index e4aa88d..0000000
--- a/BCCrypto/src/crypto/tls/MacAlgorithm.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// RFC 2246
- ///
- /// Note that the values here are implementation-specific and arbitrary. It is recommended not to
- /// depend on the particular values (e.g. serialization).
- ///
- public abstract class MacAlgorithm
- {
- public const int cls_null = 0;
- public const int md5 = 1;
- public const int sha = 2;
-
- /*
- * RFC 5246
- */
- public const int hmac_md5 = md5;
- public const int hmac_sha1 = sha;
- public const int hmac_sha256 = 3;
- public const int hmac_sha384 = 4;
- public const int hmac_sha512 = 5;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/MaxFragmentLength.cs b/BCCrypto/src/crypto/tls/MaxFragmentLength.cs
deleted file mode 100644
index 5b10b35..0000000
--- a/BCCrypto/src/crypto/tls/MaxFragmentLength.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class MaxFragmentLength
- {
- /*
- * RFC 3546 3.2.
- */
- public const byte pow2_9 = 1;
- public const byte pow2_10 = 2;
- public const byte pow2_11 = 3;
- public const byte pow2_12 = 4;
-
- public static bool IsValid(byte maxFragmentLength)
- {
- return maxFragmentLength >= pow2_9 && maxFragmentLength <= pow2_12;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/NameType.cs b/BCCrypto/src/crypto/tls/NameType.cs
deleted file mode 100644
index 7821642..0000000
--- a/BCCrypto/src/crypto/tls/NameType.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class NameType
- {
- /*
- * RFC 3546 3.1.
- */
- public const byte host_name = 0;
-
- public static bool IsValid(byte nameType)
- {
- return nameType == host_name;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/NamedCurve.cs b/BCCrypto/src/crypto/tls/NamedCurve.cs
deleted file mode 100644
index b8aa0ec..0000000
--- a/BCCrypto/src/crypto/tls/NamedCurve.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Sec;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// RFC 4492 5.1.1
- /// The named curves defined here are those specified in SEC 2 [13]. Note that many of
- /// these curves are also recommended in ANSI X9.62 [7] and FIPS 186-2 [11]. Values 0xFE00
- /// through 0xFEFF are reserved for private use. Values 0xFF01 and 0xFF02 indicate that the
- /// client supports arbitrary prime and characteristic-2 curves, respectively (the curve
- /// parameters must be encoded explicitly in ECParameters).
- ///
- public abstract class NamedCurve
- {
- public const int sect163k1 = 1;
- public const int sect163r1 = 2;
- public const int sect163r2 = 3;
- public const int sect193r1 = 4;
- public const int sect193r2 = 5;
- public const int sect233k1 = 6;
- public const int sect233r1 = 7;
- public const int sect239k1 = 8;
- public const int sect283k1 = 9;
- public const int sect283r1 = 10;
- public const int sect409k1 = 11;
- public const int sect409r1 = 12;
- public const int sect571k1 = 13;
- public const int sect571r1 = 14;
- public const int secp160k1 = 15;
- public const int secp160r1 = 16;
- public const int secp160r2 = 17;
- public const int secp192k1 = 18;
- public const int secp192r1 = 19;
- public const int secp224k1 = 20;
- public const int secp224r1 = 21;
- public const int secp256k1 = 22;
- public const int secp256r1 = 23;
- public const int secp384r1 = 24;
- public const int secp521r1 = 25;
-
- /*
- * RFC 7027
- */
- public const int brainpoolP256r1 = 26;
- public const int brainpoolP384r1 = 27;
- public const int brainpoolP512r1 = 28;
-
- /*
- * reserved (0xFE00..0xFEFF)
- */
-
- public const int arbitrary_explicit_prime_curves = 0xFF01;
- public const int arbitrary_explicit_char2_curves = 0xFF02;
-
- public static bool IsValid(int namedCurve)
- {
- return (namedCurve >= sect163k1 && namedCurve <= brainpoolP512r1)
- || (namedCurve >= arbitrary_explicit_prime_curves && namedCurve <= arbitrary_explicit_char2_curves);
- }
-
- public static bool RefersToASpecificNamedCurve(int namedCurve)
- {
- switch (namedCurve)
- {
- case arbitrary_explicit_prime_curves:
- case arbitrary_explicit_char2_curves:
- return false;
- default:
- return true;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/NewSessionTicket.cs b/BCCrypto/src/crypto/tls/NewSessionTicket.cs
deleted file mode 100644
index a84026b..0000000
--- a/BCCrypto/src/crypto/tls/NewSessionTicket.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class NewSessionTicket
- {
- protected readonly long mTicketLifetimeHint;
- protected readonly byte[] mTicket;
-
- public NewSessionTicket(long ticketLifetimeHint, byte[] ticket)
- {
- this.mTicketLifetimeHint = ticketLifetimeHint;
- this.mTicket = ticket;
- }
-
- public virtual long TicketLifetimeHint
- {
- get { return mTicketLifetimeHint; }
- }
-
- public virtual byte[] Ticket
- {
- get { return mTicket; }
- }
-
- /**
- * Encode this {@link NewSessionTicket} to a {@link Stream}.
- *
- * @param output the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- TlsUtilities.WriteUint32(mTicketLifetimeHint, output);
- TlsUtilities.WriteOpaque16(mTicket, output);
- }
-
- /**
- * Parse a {@link NewSessionTicket} from a {@link Stream}.
- *
- * @param input the {@link Stream} to parse from.
- * @return a {@link NewSessionTicket} object.
- * @throws IOException
- */
- public static NewSessionTicket Parse(Stream input)
- {
- long ticketLifetimeHint = TlsUtilities.ReadUint32(input);
- byte[] ticket = TlsUtilities.ReadOpaque16(input);
- return new NewSessionTicket(ticketLifetimeHint, ticket);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/OcspStatusRequest.cs b/BCCrypto/src/crypto/tls/OcspStatusRequest.cs
deleted file mode 100644
index d9203a3..0000000
--- a/BCCrypto/src/crypto/tls/OcspStatusRequest.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * RFC 3546 3.6
- */
- public class OcspStatusRequest
- {
- protected readonly IList mResponderIDList;
- protected readonly X509Extensions mRequestExtensions;
-
- /**
- * @param responderIDList
- * an {@link IList} of {@link ResponderID}, specifying the list of trusted OCSP
- * responders. An empty list has the special meaning that the responders are
- * implicitly known to the server - e.g., by prior arrangement.
- * @param requestExtensions
- * OCSP request extensions. A null value means that there are no extensions.
- */
- public OcspStatusRequest(IList responderIDList, X509Extensions requestExtensions)
- {
- this.mResponderIDList = responderIDList;
- this.mRequestExtensions = requestExtensions;
- }
-
- /**
- * @return an {@link IList} of {@link ResponderID}
- */
- public virtual IList ResponderIDList
- {
- get { return mResponderIDList; }
- }
-
- /**
- * @return OCSP request extensions
- */
- public virtual X509Extensions RequestExtensions
- {
- get { return mRequestExtensions; }
- }
-
- /**
- * Encode this {@link OcspStatusRequest} to a {@link Stream}.
- *
- * @param output
- * the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- if (mResponderIDList == null || mResponderIDList.Count < 1)
- {
- TlsUtilities.WriteUint16(0, output);
- }
- else
- {
- MemoryStream buf = new MemoryStream();
- for (int i = 0; i < mResponderIDList.Count; ++i)
- {
- ResponderID responderID = (ResponderID)mResponderIDList[i];
- byte[] derEncoding = responderID.GetEncoded(Asn1Encodable.Der);
- TlsUtilities.WriteOpaque16(derEncoding, buf);
- }
- TlsUtilities.CheckUint16(buf.Length);
- TlsUtilities.WriteUint16((int)buf.Length, output);
- Streams.WriteBufTo(buf, output);
- }
-
- if (mRequestExtensions == null)
- {
- TlsUtilities.WriteUint16(0, output);
- }
- else
- {
- byte[] derEncoding = mRequestExtensions.GetEncoded(Asn1Encodable.Der);
- TlsUtilities.CheckUint16(derEncoding.Length);
- TlsUtilities.WriteUint16(derEncoding.Length, output);
- output.Write(derEncoding, 0, derEncoding.Length);
- }
- }
-
- /**
- * Parse a {@link OcspStatusRequest} from a {@link Stream}.
- *
- * @param input
- * the {@link Stream} to parse from.
- * @return an {@link OcspStatusRequest} object.
- * @throws IOException
- */
- public static OcspStatusRequest Parse(Stream input)
- {
- IList responderIDList = Platform.CreateArrayList();
- {
- int length = TlsUtilities.ReadUint16(input);
- if (length > 0)
- {
- byte[] data = TlsUtilities.ReadFully(length, input);
- MemoryStream buf = new MemoryStream(data, false);
- do
- {
- byte[] derEncoding = TlsUtilities.ReadOpaque16(buf);
- ResponderID responderID = ResponderID.GetInstance(TlsUtilities.ReadDerObject(derEncoding));
- responderIDList.Add(responderID);
- }
- while (buf.Position < buf.Length);
- }
- }
-
- X509Extensions requestExtensions = null;
- {
- int length = TlsUtilities.ReadUint16(input);
- if (length > 0)
- {
- byte[] derEncoding = TlsUtilities.ReadFully(length, input);
- requestExtensions = X509Extensions.GetInstance(TlsUtilities.ReadDerObject(derEncoding));
- }
- }
-
- return new OcspStatusRequest(responderIDList, requestExtensions);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/PrfAlgorithm.cs b/BCCrypto/src/crypto/tls/PrfAlgorithm.cs
deleted file mode 100644
index 871241b..0000000
--- a/BCCrypto/src/crypto/tls/PrfAlgorithm.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// RFC 5246
- ///
- /// Note that the values here are implementation-specific and arbitrary. It is recommended not to
- /// depend on the particular values (e.g. serialization).
- ///
- public abstract class PrfAlgorithm
- {
- /*
- * Placeholder to refer to the legacy TLS algorithm
- */
- public const int tls_prf_legacy = 0;
-
- public const int tls_prf_sha256 = 1;
-
- /*
- * Implied by RFC 5288
- */
- public const int tls_prf_sha384 = 2;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ProtocolVersion.cs b/BCCrypto/src/crypto/tls/ProtocolVersion.cs
deleted file mode 100644
index b0d5518..0000000
--- a/BCCrypto/src/crypto/tls/ProtocolVersion.cs
+++ /dev/null
@@ -1,159 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public sealed class ProtocolVersion
- {
- public static readonly ProtocolVersion SSLv3 = new ProtocolVersion(0x0300, "SSL 3.0");
- public static readonly ProtocolVersion TLSv10 = new ProtocolVersion(0x0301, "TLS 1.0");
- public static readonly ProtocolVersion TLSv11 = new ProtocolVersion(0x0302, "TLS 1.1");
- public static readonly ProtocolVersion TLSv12 = new ProtocolVersion(0x0303, "TLS 1.2");
- public static readonly ProtocolVersion DTLSv10 = new ProtocolVersion(0xFEFF, "DTLS 1.0");
- public static readonly ProtocolVersion DTLSv12 = new ProtocolVersion(0xFEFD, "DTLS 1.2");
-
- private readonly int version;
- private readonly String name;
-
- private ProtocolVersion(int v, String name)
- {
- this.version = v & 0xffff;
- this.name = name;
- }
-
- public int FullVersion
- {
- get { return version; }
- }
-
- public int MajorVersion
- {
- get { return version >> 8; }
- }
-
- public int MinorVersion
- {
- get { return version & 0xff; }
- }
-
- public bool IsDtls
- {
- get { return MajorVersion == 0xFE; }
- }
-
- public bool IsSsl
- {
- get { return this == SSLv3; }
- }
-
- public bool IsTls
- {
- get { return MajorVersion == 0x03; }
- }
-
- public ProtocolVersion GetEquivalentTLSVersion()
- {
- if (!IsDtls)
- {
- return this;
- }
- if (this == DTLSv10)
- {
- return TLSv11;
- }
- return TLSv12;
- }
-
- public bool IsEqualOrEarlierVersionOf(ProtocolVersion version)
- {
- if (MajorVersion != version.MajorVersion)
- {
- return false;
- }
- int diffMinorVersion = version.MinorVersion - MinorVersion;
- return IsDtls ? diffMinorVersion <= 0 : diffMinorVersion >= 0;
- }
-
- public bool IsLaterVersionOf(ProtocolVersion version)
- {
- if (MajorVersion != version.MajorVersion)
- {
- return false;
- }
- int diffMinorVersion = version.MinorVersion - MinorVersion;
- return IsDtls ? diffMinorVersion > 0 : diffMinorVersion < 0;
- }
-
- public override bool Equals(object other)
- {
- return this == other || (other is ProtocolVersion && Equals((ProtocolVersion)other));
- }
-
- public bool Equals(ProtocolVersion other)
- {
- return other != null && this.version == other.version;
- }
-
- public override int GetHashCode()
- {
- return version;
- }
-
- ///
- public static ProtocolVersion Get(int major, int minor)
- {
- switch (major)
- {
- case 0x03:
- {
- switch (minor)
- {
- case 0x00:
- return SSLv3;
- case 0x01:
- return TLSv10;
- case 0x02:
- return TLSv11;
- case 0x03:
- return TLSv12;
- }
- return GetUnknownVersion(major, minor, "TLS");
- }
- case 0xFE:
- {
- switch (minor)
- {
- case 0xFF:
- return DTLSv10;
- case 0xFE:
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- case 0xFD:
- return DTLSv12;
- }
- return GetUnknownVersion(major, minor, "DTLS");
- }
- default:
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
- }
-
- public override string ToString()
- {
- return name;
- }
-
- private static ProtocolVersion GetUnknownVersion(int major, int minor, string prefix)
- {
- TlsUtilities.CheckUint8(major);
- TlsUtilities.CheckUint8(minor);
-
- int v = (major << 8) | minor;
- String hex = Platform.ToUpperInvariant(Convert.ToString(0x10000 | v, 16).Substring(1));
- return new ProtocolVersion(v, prefix + " 0x" + hex);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/PskTlsClient.cs b/BCCrypto/src/crypto/tls/PskTlsClient.cs
deleted file mode 100644
index 2ef80dc..0000000
--- a/BCCrypto/src/crypto/tls/PskTlsClient.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class PskTlsClient
- : AbstractTlsClient
- {
- protected TlsPskIdentity mPskIdentity;
-
- public PskTlsClient(TlsPskIdentity pskIdentity)
- : this(new DefaultTlsCipherFactory(), pskIdentity)
- {
- }
-
- public PskTlsClient(TlsCipherFactory cipherFactory, TlsPskIdentity pskIdentity)
- : base(cipherFactory)
- {
- this.mPskIdentity = pskIdentity;
- }
-
- public override int[] GetCipherSuites()
- {
- return new int[]
- {
- CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,
- CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA,
- CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,
- CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA
- };
- }
-
- public override TlsKeyExchange GetKeyExchange()
- {
- int keyExchangeAlgorithm = TlsUtilities.GetKeyExchangeAlgorithm(mSelectedCipherSuite);
-
- switch (keyExchangeAlgorithm)
- {
- case KeyExchangeAlgorithm.DHE_PSK:
- case KeyExchangeAlgorithm.ECDHE_PSK:
- case KeyExchangeAlgorithm.PSK:
- case KeyExchangeAlgorithm.RSA_PSK:
- return CreatePskKeyExchange(keyExchangeAlgorithm);
-
- default:
- /*
- * Note: internal error here; the TlsProtocol implementation verifies that the
- * server-selected cipher suite was in the list of client-offered cipher suites, so if
- * we now can't produce an implementation, we shouldn't have offered it!
- */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public override TlsAuthentication GetAuthentication()
- {
- /*
- * Note: This method is not called unless a server certificate is sent, which may be the
- * case e.g. for RSA_PSK key exchange.
- */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- protected virtual TlsKeyExchange CreatePskKeyExchange(int keyExchange)
- {
- return new TlsPskKeyExchange(keyExchange, mSupportedSignatureAlgorithms, mPskIdentity, null, null, mNamedCurves,
- mClientECPointFormats, mServerECPointFormats);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/PskTlsServer.cs b/BCCrypto/src/crypto/tls/PskTlsServer.cs
deleted file mode 100644
index d6f54db..0000000
--- a/BCCrypto/src/crypto/tls/PskTlsServer.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Agreement;
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class PskTlsServer
- : AbstractTlsServer
- {
- protected TlsPskIdentityManager mPskIdentityManager;
-
- public PskTlsServer(TlsPskIdentityManager pskIdentityManager)
- : this(new DefaultTlsCipherFactory(), pskIdentityManager)
- {
- }
-
- public PskTlsServer(TlsCipherFactory cipherFactory, TlsPskIdentityManager pskIdentityManager)
- : base(cipherFactory)
- {
- this.mPskIdentityManager = pskIdentityManager;
- }
-
- protected virtual TlsEncryptionCredentials GetRsaEncryptionCredentials()
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- protected virtual DHParameters GetDHParameters()
- {
- return DHStandardGroups.rfc3526_2048;
- }
-
- protected override int[] GetCipherSuites()
- {
- return new int[]
- {
- CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,
- CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA,
- CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,
- CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA
- };
- }
-
- public override TlsCredentials GetCredentials()
- {
- int keyExchangeAlgorithm = TlsUtilities.GetKeyExchangeAlgorithm(mSelectedCipherSuite);
-
- switch (keyExchangeAlgorithm)
- {
- case KeyExchangeAlgorithm.DHE_PSK:
- case KeyExchangeAlgorithm.ECDHE_PSK:
- case KeyExchangeAlgorithm.PSK:
- return null;
-
- case KeyExchangeAlgorithm.RSA_PSK:
- return GetRsaEncryptionCredentials();
-
- default:
- /* Note: internal error here; selected a key exchange we don't implement! */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public override TlsKeyExchange GetKeyExchange()
- {
- int keyExchangeAlgorithm = TlsUtilities.GetKeyExchangeAlgorithm(mSelectedCipherSuite);
-
- switch (keyExchangeAlgorithm)
- {
- case KeyExchangeAlgorithm.DHE_PSK:
- case KeyExchangeAlgorithm.ECDHE_PSK:
- case KeyExchangeAlgorithm.PSK:
- case KeyExchangeAlgorithm.RSA_PSK:
- return CreatePskKeyExchange(keyExchangeAlgorithm);
-
- default:
- /*
- * Note: internal error here; the TlsProtocol implementation verifies that the
- * server-selected cipher suite was in the list of client-offered cipher suites, so if
- * we now can't produce an implementation, we shouldn't have offered it!
- */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- protected virtual TlsKeyExchange CreatePskKeyExchange(int keyExchange)
- {
- return new TlsPskKeyExchange(keyExchange, mSupportedSignatureAlgorithms, null, mPskIdentityManager,
- GetDHParameters(), mNamedCurves, mClientECPointFormats, mServerECPointFormats);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/RecordStream.cs b/BCCrypto/src/crypto/tls/RecordStream.cs
deleted file mode 100644
index 5d556ad..0000000
--- a/BCCrypto/src/crypto/tls/RecordStream.cs
+++ /dev/null
@@ -1,412 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// An implementation of the TLS 1.0/1.1/1.2 record layer, allowing downgrade to SSLv3.
- internal class RecordStream
- {
- private const int DEFAULT_PLAINTEXT_LIMIT = (1 << 14);
-
- internal const int TLS_HEADER_SIZE = 5;
- internal const int TLS_HEADER_TYPE_OFFSET = 0;
- internal const int TLS_HEADER_VERSION_OFFSET = 1;
- internal const int TLS_HEADER_LENGTH_OFFSET = 3;
-
- private TlsProtocol mHandler;
- private Stream mInput;
- private Stream mOutput;
- private TlsCompression mPendingCompression = null, mReadCompression = null, mWriteCompression = null;
- private TlsCipher mPendingCipher = null, mReadCipher = null, mWriteCipher = null;
- private SequenceNumber mReadSeqNo = new SequenceNumber(), mWriteSeqNo = new SequenceNumber();
- private MemoryStream mBuffer = new MemoryStream();
-
- private TlsHandshakeHash mHandshakeHash = null;
- private readonly BaseOutputStream mHandshakeHashUpdater;
-
- private ProtocolVersion mReadVersion = null, mWriteVersion = null;
- private bool mRestrictReadVersion = true;
-
- private int mPlaintextLimit, mCompressedLimit, mCiphertextLimit;
-
- internal RecordStream(TlsProtocol handler, Stream input, Stream output)
- {
- this.mHandler = handler;
- this.mInput = input;
- this.mOutput = output;
- this.mReadCompression = new TlsNullCompression();
- this.mWriteCompression = this.mReadCompression;
- this.mHandshakeHashUpdater = new HandshakeHashUpdateStream(this);
- }
-
- internal virtual void Init(TlsContext context)
- {
- this.mReadCipher = new TlsNullCipher(context);
- this.mWriteCipher = this.mReadCipher;
- this.mHandshakeHash = new DeferredHash();
- this.mHandshakeHash.Init(context);
-
- SetPlaintextLimit(DEFAULT_PLAINTEXT_LIMIT);
- }
-
- internal virtual int GetPlaintextLimit()
- {
- return mPlaintextLimit;
- }
-
- internal virtual void SetPlaintextLimit(int plaintextLimit)
- {
- this.mPlaintextLimit = plaintextLimit;
- this.mCompressedLimit = this.mPlaintextLimit + 1024;
- this.mCiphertextLimit = this.mCompressedLimit + 1024;
- }
-
- internal virtual ProtocolVersion ReadVersion
- {
- get { return mReadVersion; }
- set { this.mReadVersion = value; }
- }
-
- internal virtual void SetWriteVersion(ProtocolVersion writeVersion)
- {
- this.mWriteVersion = writeVersion;
- }
-
- /**
- * RFC 5246 E.1. "Earlier versions of the TLS specification were not fully clear on what the
- * record layer version number (TLSPlaintext.version) should contain when sending ClientHello
- * (i.e., before it is known which version of the protocol will be employed). Thus, TLS servers
- * compliant with this specification MUST accept any value {03,XX} as the record layer version
- * number for ClientHello."
- */
- internal virtual void SetRestrictReadVersion(bool enabled)
- {
- this.mRestrictReadVersion = enabled;
- }
-
- internal virtual void SetPendingConnectionState(TlsCompression tlsCompression, TlsCipher tlsCipher)
- {
- this.mPendingCompression = tlsCompression;
- this.mPendingCipher = tlsCipher;
- }
-
- internal virtual void SentWriteCipherSpec()
- {
- if (mPendingCompression == null || mPendingCipher == null)
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
-
- this.mWriteCompression = this.mPendingCompression;
- this.mWriteCipher = this.mPendingCipher;
- this.mWriteSeqNo = new SequenceNumber();
- }
-
- internal virtual void ReceivedReadCipherSpec()
- {
- if (mPendingCompression == null || mPendingCipher == null)
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
-
- this.mReadCompression = this.mPendingCompression;
- this.mReadCipher = this.mPendingCipher;
- this.mReadSeqNo = new SequenceNumber();
- }
-
- internal virtual void FinaliseHandshake()
- {
- if (mReadCompression != mPendingCompression || mWriteCompression != mPendingCompression
- || mReadCipher != mPendingCipher || mWriteCipher != mPendingCipher)
- {
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
- }
- this.mPendingCompression = null;
- this.mPendingCipher = null;
- }
-
- internal virtual void CheckRecordHeader(byte[] recordHeader)
- {
- byte type = TlsUtilities.ReadUint8(recordHeader, TLS_HEADER_TYPE_OFFSET);
-
- /*
- * RFC 5246 6. If a TLS implementation receives an unexpected record type, it MUST send an
- * unexpected_message alert.
- */
- CheckType(type, AlertDescription.unexpected_message);
-
- if (!mRestrictReadVersion)
- {
- int version = TlsUtilities.ReadVersionRaw(recordHeader, TLS_HEADER_VERSION_OFFSET);
- if ((version & 0xffffff00) != 0x0300)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- else
- {
- ProtocolVersion version = TlsUtilities.ReadVersion(recordHeader, TLS_HEADER_VERSION_OFFSET);
- if (mReadVersion == null)
- {
- // Will be set later in 'readRecord'
- }
- else if (!version.Equals(mReadVersion))
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
-
- int length = TlsUtilities.ReadUint16(recordHeader, TLS_HEADER_LENGTH_OFFSET);
-
- CheckLength(length, mCiphertextLimit, AlertDescription.record_overflow);
- }
-
- internal virtual bool ReadRecord()
- {
- byte[] recordHeader = TlsUtilities.ReadAllOrNothing(TLS_HEADER_SIZE, mInput);
- if (recordHeader == null)
- return false;
-
- byte type = TlsUtilities.ReadUint8(recordHeader, TLS_HEADER_TYPE_OFFSET);
-
- /*
- * RFC 5246 6. If a TLS implementation receives an unexpected record type, it MUST send an
- * unexpected_message alert.
- */
- CheckType(type, AlertDescription.unexpected_message);
-
- if (!mRestrictReadVersion)
- {
- int version = TlsUtilities.ReadVersionRaw(recordHeader, TLS_HEADER_VERSION_OFFSET);
- if ((version & 0xffffff00) != 0x0300)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- else
- {
- ProtocolVersion version = TlsUtilities.ReadVersion(recordHeader, TLS_HEADER_VERSION_OFFSET);
- if (mReadVersion == null)
- {
- mReadVersion = version;
- }
- else if (!version.Equals(mReadVersion))
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
-
- int length = TlsUtilities.ReadUint16(recordHeader, TLS_HEADER_LENGTH_OFFSET);
-
- CheckLength(length, mCiphertextLimit, AlertDescription.record_overflow);
-
- byte[] plaintext = DecodeAndVerify(type, mInput, length);
- mHandler.ProcessRecord(type, plaintext, 0, plaintext.Length);
- return true;
- }
-
- internal virtual byte[] DecodeAndVerify(byte type, Stream input, int len)
- {
- byte[] buf = TlsUtilities.ReadFully(len, input);
-
- long seqNo = mReadSeqNo.NextValue(AlertDescription.unexpected_message);
- byte[] decoded = mReadCipher.DecodeCiphertext(seqNo, type, buf, 0, buf.Length);
-
- CheckLength(decoded.Length, mCompressedLimit, AlertDescription.record_overflow);
-
- /*
- * TODO 5246 6.2.2. Implementation note: Decompression functions are responsible for
- * ensuring that messages cannot cause internal buffer overflows.
- */
- Stream cOut = mReadCompression.Decompress(mBuffer);
- if (cOut != mBuffer)
- {
- cOut.Write(decoded, 0, decoded.Length);
- cOut.Flush();
- decoded = GetBufferContents();
- }
-
- /*
- * RFC 5246 6.2.2. If the decompression function encounters a TLSCompressed.fragment that
- * would decompress to a length in excess of 2^14 bytes, it should report a fatal
- * decompression failure error.
- */
- CheckLength(decoded.Length, mPlaintextLimit, AlertDescription.decompression_failure);
-
- /*
- * RFC 5246 6.2.1 Implementations MUST NOT send zero-length fragments of Handshake, Alert,
- * or ChangeCipherSpec content types.
- */
- if (decoded.Length < 1 && type != ContentType.application_data)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- return decoded;
- }
-
- internal virtual void WriteRecord(byte type, byte[] plaintext, int plaintextOffset, int plaintextLength)
- {
- // Never send anything until a valid ClientHello has been received
- if (mWriteVersion == null)
- return;
-
- /*
- * RFC 5246 6. Implementations MUST NOT send record types not defined in this document
- * unless negotiated by some extension.
- */
- CheckType(type, AlertDescription.internal_error);
-
- /*
- * RFC 5246 6.2.1 The length should not exceed 2^14.
- */
- CheckLength(plaintextLength, mPlaintextLimit, AlertDescription.internal_error);
-
- /*
- * RFC 5246 6.2.1 Implementations MUST NOT send zero-length fragments of Handshake, Alert,
- * or ChangeCipherSpec content types.
- */
- if (plaintextLength < 1 && type != ContentType.application_data)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- Stream cOut = mWriteCompression.Compress(mBuffer);
-
- long seqNo = mWriteSeqNo.NextValue(AlertDescription.internal_error);
-
- byte[] ciphertext;
- if (cOut == mBuffer)
- {
- ciphertext = mWriteCipher.EncodePlaintext(seqNo, type, plaintext, plaintextOffset, plaintextLength);
- }
- else
- {
- cOut.Write(plaintext, plaintextOffset, plaintextLength);
- cOut.Flush();
- byte[] compressed = GetBufferContents();
-
- /*
- * RFC 5246 6.2.2. Compression must be lossless and may not increase the content length
- * by more than 1024 bytes.
- */
- CheckLength(compressed.Length, plaintextLength + 1024, AlertDescription.internal_error);
-
- ciphertext = mWriteCipher.EncodePlaintext(seqNo, type, compressed, 0, compressed.Length);
- }
-
- /*
- * RFC 5246 6.2.3. The length may not exceed 2^14 + 2048.
- */
- CheckLength(ciphertext.Length, mCiphertextLimit, AlertDescription.internal_error);
-
- byte[] record = new byte[ciphertext.Length + TLS_HEADER_SIZE];
- TlsUtilities.WriteUint8(type, record, TLS_HEADER_TYPE_OFFSET);
- TlsUtilities.WriteVersion(mWriteVersion, record, TLS_HEADER_VERSION_OFFSET);
- TlsUtilities.WriteUint16(ciphertext.Length, record, TLS_HEADER_LENGTH_OFFSET);
- Array.Copy(ciphertext, 0, record, TLS_HEADER_SIZE, ciphertext.Length);
- mOutput.Write(record, 0, record.Length);
- mOutput.Flush();
- }
-
- internal virtual void NotifyHelloComplete()
- {
- this.mHandshakeHash = mHandshakeHash.NotifyPrfDetermined();
- }
-
- internal virtual TlsHandshakeHash HandshakeHash
- {
- get { return mHandshakeHash; }
- }
-
- internal virtual Stream HandshakeHashUpdater
- {
- get { return mHandshakeHashUpdater; }
- }
-
- internal virtual TlsHandshakeHash PrepareToFinish()
- {
- TlsHandshakeHash result = mHandshakeHash;
- this.mHandshakeHash = mHandshakeHash.StopTracking();
- return result;
- }
-
- internal virtual void SafeClose()
- {
- try
- {
- Platform.Dispose(mInput);
- }
- catch (IOException)
- {
- }
-
- try
- {
- Platform.Dispose(mOutput);
- }
- catch (IOException)
- {
- }
- }
-
- internal virtual void Flush()
- {
- mOutput.Flush();
- }
-
- private byte[] GetBufferContents()
- {
- byte[] contents = mBuffer.ToArray();
- mBuffer.SetLength(0);
- return contents;
- }
-
- private static void CheckType(byte type, byte alertDescription)
- {
- switch (type)
- {
- case ContentType.application_data:
- case ContentType.alert:
- case ContentType.change_cipher_spec:
- case ContentType.handshake:
- //case ContentType.heartbeat:
- break;
- default:
- throw new TlsFatalAlert(alertDescription);
- }
- }
-
- private static void CheckLength(int length, int limit, byte alertDescription)
- {
- if (length > limit)
- throw new TlsFatalAlert(alertDescription);
- }
-
- private class HandshakeHashUpdateStream
- : BaseOutputStream
- {
- private readonly RecordStream mOuter;
- public HandshakeHashUpdateStream(RecordStream mOuter)
- {
- this.mOuter = mOuter;
- }
-
- public override void Write(byte[] buf, int off, int len)
- {
- mOuter.mHandshakeHash.BlockUpdate(buf, off, len);
- }
- }
-
- private class SequenceNumber
- {
- private long value = 0L;
- private bool exhausted = false;
-
- internal long NextValue(byte alertDescription)
- {
- if (exhausted)
- {
- throw new TlsFatalAlert(alertDescription);
- }
- long result = value;
- if (++value == 0)
- {
- exhausted = true;
- }
- return result;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/SecurityParameters.cs b/BCCrypto/src/crypto/tls/SecurityParameters.cs
deleted file mode 100644
index 3b85158..0000000
--- a/BCCrypto/src/crypto/tls/SecurityParameters.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class SecurityParameters
- {
- internal int entity = -1;
- internal int cipherSuite = -1;
- internal byte compressionAlgorithm = CompressionMethod.cls_null;
- internal int prfAlgorithm = -1;
- internal int verifyDataLength = -1;
- internal byte[] masterSecret = null;
- internal byte[] clientRandom = null;
- internal byte[] serverRandom = null;
- internal byte[] sessionHash = null;
- internal byte[] pskIdentity = null;
- internal byte[] srpIdentity = null;
-
- // TODO Keep these internal, since it's maybe not the ideal place for them
- internal short maxFragmentLength = -1;
- internal bool truncatedHMac = false;
- internal bool encryptThenMac = false;
- internal bool extendedMasterSecret = false;
-
- internal virtual void Clear()
- {
- if (this.masterSecret != null)
- {
- Arrays.Fill(this.masterSecret, (byte)0);
- this.masterSecret = null;
- }
- }
-
- /**
- * @return {@link ConnectionEnd}
- */
- public virtual int Entity
- {
- get { return entity; }
- }
-
- /**
- * @return {@link CipherSuite}
- */
- public virtual int CipherSuite
- {
- get { return cipherSuite; }
- }
-
- /**
- * @return {@link CompressionMethod}
- */
- public byte CompressionAlgorithm
- {
- get { return compressionAlgorithm; }
- }
-
- /**
- * @return {@link PRFAlgorithm}
- */
- public virtual int PrfAlgorithm
- {
- get { return prfAlgorithm; }
- }
-
- public virtual int VerifyDataLength
- {
- get { return verifyDataLength; }
- }
-
- public virtual byte[] MasterSecret
- {
- get { return masterSecret; }
- }
-
- public virtual byte[] ClientRandom
- {
- get { return clientRandom; }
- }
-
- public virtual byte[] ServerRandom
- {
- get { return serverRandom; }
- }
-
- public virtual byte[] SessionHash
- {
- get { return sessionHash; }
- }
-
- public virtual byte[] PskIdentity
- {
- get { return pskIdentity; }
- }
-
- public virtual byte[] SrpIdentity
- {
- get { return srpIdentity; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ServerDHParams.cs b/BCCrypto/src/crypto/tls/ServerDHParams.cs
deleted file mode 100644
index b092627..0000000
--- a/BCCrypto/src/crypto/tls/ServerDHParams.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class ServerDHParams
- {
- protected readonly DHPublicKeyParameters mPublicKey;
-
- public ServerDHParams(DHPublicKeyParameters publicKey)
- {
- if (publicKey == null)
- throw new ArgumentNullException("publicKey");
-
- this.mPublicKey = publicKey;
- }
-
- public virtual DHPublicKeyParameters PublicKey
- {
- get { return mPublicKey; }
- }
-
- /**
- * Encode this {@link ServerDHParams} to a {@link Stream}.
- *
- * @param output
- * the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- DHParameters dhParameters = mPublicKey.Parameters;
- BigInteger Ys = mPublicKey.Y;
-
- TlsDHUtilities.WriteDHParameter(dhParameters.P, output);
- TlsDHUtilities.WriteDHParameter(dhParameters.G, output);
- TlsDHUtilities.WriteDHParameter(Ys, output);
- }
-
- /**
- * Parse a {@link ServerDHParams} from a {@link Stream}.
- *
- * @param input
- * the {@link Stream} to parse from.
- * @return a {@link ServerDHParams} object.
- * @throws IOException
- */
- public static ServerDHParams Parse(Stream input)
- {
- BigInteger p = TlsDHUtilities.ReadDHParameter(input);
- BigInteger g = TlsDHUtilities.ReadDHParameter(input);
- BigInteger Ys = TlsDHUtilities.ReadDHParameter(input);
-
- return new ServerDHParams(
- TlsDHUtilities.ValidateDHPublicKey(new DHPublicKeyParameters(Ys, new DHParameters(p, g))));
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ServerName.cs b/BCCrypto/src/crypto/tls/ServerName.cs
deleted file mode 100644
index 508c2dd..0000000
--- a/BCCrypto/src/crypto/tls/ServerName.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class ServerName
- {
- protected readonly byte mNameType;
- protected readonly object mName;
-
- public ServerName(byte nameType, object name)
- {
- if (!IsCorrectType(nameType, name))
- throw new ArgumentException("not an instance of the correct type", "name");
-
- this.mNameType = nameType;
- this.mName = name;
- }
-
- public virtual byte NameType
- {
- get { return mNameType; }
- }
-
- public virtual object Name
- {
- get { return mName; }
- }
-
- public virtual string GetHostName()
- {
- if (!IsCorrectType(Tls.NameType.host_name, mName))
- throw new InvalidOperationException("'name' is not a HostName string");
-
- return (string)mName;
- }
-
- /**
- * Encode this {@link ServerName} to a {@link Stream}.
- *
- * @param output
- * the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- TlsUtilities.WriteUint8(mNameType, output);
-
- switch (mNameType)
- {
- case Tls.NameType.host_name:
- byte[] asciiEncoding = Strings.ToAsciiByteArray((string)mName);
- if (asciiEncoding.Length < 1)
- throw new TlsFatalAlert(AlertDescription.internal_error);
- TlsUtilities.WriteOpaque16(asciiEncoding, output);
- break;
- default:
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- /**
- * Parse a {@link ServerName} from a {@link Stream}.
- *
- * @param input
- * the {@link Stream} to parse from.
- * @return a {@link ServerName} object.
- * @throws IOException
- */
- public static ServerName Parse(Stream input)
- {
- byte name_type = TlsUtilities.ReadUint8(input);
- object name;
-
- switch (name_type)
- {
- case Tls.NameType.host_name:
- {
- byte[] asciiEncoding = TlsUtilities.ReadOpaque16(input);
- if (asciiEncoding.Length < 1)
- throw new TlsFatalAlert(AlertDescription.decode_error);
- name = Strings.FromAsciiByteArray(asciiEncoding);
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.decode_error);
- }
-
- return new ServerName(name_type, name);
- }
-
- protected static bool IsCorrectType(byte nameType, object name)
- {
- switch (nameType)
- {
- case Tls.NameType.host_name:
- return name is string;
- default:
- throw new ArgumentException("unsupported value", "name");
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ServerNameList.cs b/BCCrypto/src/crypto/tls/ServerNameList.cs
deleted file mode 100644
index ed4e593..0000000
--- a/BCCrypto/src/crypto/tls/ServerNameList.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class ServerNameList
- {
- protected readonly IList mServerNameList;
-
- /**
- * @param serverNameList an {@link IList} of {@link ServerName}.
- */
- public ServerNameList(IList serverNameList)
- {
- if (serverNameList == null)
- throw new ArgumentNullException("serverNameList");
-
- this.mServerNameList = serverNameList;
- }
-
- /**
- * @return an {@link IList} of {@link ServerName}.
- */
- public virtual IList ServerNames
- {
- get { return mServerNameList; }
- }
-
- /**
- * Encode this {@link ServerNameList} to a {@link Stream}.
- *
- * @param output
- * the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- MemoryStream buf = new MemoryStream();
-
- byte[] nameTypesSeen = TlsUtilities.EmptyBytes;
- foreach (ServerName entry in ServerNames)
- {
- nameTypesSeen = CheckNameType(nameTypesSeen, entry.NameType);
- if (nameTypesSeen == null)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- entry.Encode(buf);
- }
-
- TlsUtilities.CheckUint16(buf.Length);
- TlsUtilities.WriteUint16((int)buf.Length, output);
- Streams.WriteBufTo(buf, output);
- }
-
- /**
- * Parse a {@link ServerNameList} from a {@link Stream}.
- *
- * @param input
- * the {@link Stream} to parse from.
- * @return a {@link ServerNameList} object.
- * @throws IOException
- */
- public static ServerNameList Parse(Stream input)
- {
- int length = TlsUtilities.ReadUint16(input);
- if (length < 1)
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- byte[] data = TlsUtilities.ReadFully(length, input);
-
- MemoryStream buf = new MemoryStream(data, false);
-
- byte[] nameTypesSeen = TlsUtilities.EmptyBytes;
- IList server_name_list = Platform.CreateArrayList();
- while (buf.Position < buf.Length)
- {
- ServerName entry = ServerName.Parse(buf);
-
- nameTypesSeen = CheckNameType(nameTypesSeen, entry.NameType);
- if (nameTypesSeen == null)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- server_name_list.Add(entry);
- }
-
- return new ServerNameList(server_name_list);
- }
-
- private static byte[] CheckNameType(byte[] nameTypesSeen, byte nameType)
- {
- /*
- * RFC 6066 3. The ServerNameList MUST NOT contain more than one name of the same
- * name_type.
- */
- if (!NameType.IsValid(nameType) || Arrays.Contains(nameTypesSeen, nameType))
- return null;
-
- return Arrays.Append(nameTypesSeen, nameType);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ServerOnlyTlsAuthentication.cs b/BCCrypto/src/crypto/tls/ServerOnlyTlsAuthentication.cs
deleted file mode 100644
index 4858897..0000000
--- a/BCCrypto/src/crypto/tls/ServerOnlyTlsAuthentication.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class ServerOnlyTlsAuthentication
- : TlsAuthentication
- {
- public abstract void NotifyServerCertificate(Certificate serverCertificate);
-
- public TlsCredentials GetClientCredentials(CertificateRequest certificateRequest)
- {
- return null;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/ServerSrpParams.cs b/BCCrypto/src/crypto/tls/ServerSrpParams.cs
deleted file mode 100644
index 556ac53..0000000
--- a/BCCrypto/src/crypto/tls/ServerSrpParams.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class ServerSrpParams
- {
- protected BigInteger m_N, m_g, m_B;
- protected byte[] m_s;
-
- public ServerSrpParams(BigInteger N, BigInteger g, byte[] s, BigInteger B)
- {
- this.m_N = N;
- this.m_g = g;
- this.m_s = Arrays.Clone(s);
- this.m_B = B;
- }
-
- public virtual BigInteger B
- {
- get { return m_B; }
- }
-
- public virtual BigInteger G
- {
- get { return m_g; }
- }
-
- public virtual BigInteger N
- {
- get { return m_N; }
- }
-
- public virtual byte[] S
- {
- get { return m_s; }
- }
-
- /**
- * Encode this {@link ServerSRPParams} to an {@link OutputStream}.
- *
- * @param output
- * the {@link OutputStream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- TlsSrpUtilities.WriteSrpParameter(m_N, output);
- TlsSrpUtilities.WriteSrpParameter(m_g, output);
- TlsUtilities.WriteOpaque8(m_s, output);
- TlsSrpUtilities.WriteSrpParameter(m_B, output);
- }
-
- /**
- * Parse a {@link ServerSRPParams} from an {@link InputStream}.
- *
- * @param input
- * the {@link InputStream} to parse from.
- * @return a {@link ServerSRPParams} object.
- * @throws IOException
- */
- public static ServerSrpParams Parse(Stream input)
- {
- BigInteger N = TlsSrpUtilities.ReadSrpParameter(input);
- BigInteger g = TlsSrpUtilities.ReadSrpParameter(input);
- byte[] s = TlsUtilities.ReadOpaque8(input);
- BigInteger B = TlsSrpUtilities.ReadSrpParameter(input);
-
- return new ServerSrpParams(N, g, s, B);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/SessionParameters.cs b/BCCrypto/src/crypto/tls/SessionParameters.cs
deleted file mode 100644
index a1eb5f2..0000000
--- a/BCCrypto/src/crypto/tls/SessionParameters.cs
+++ /dev/null
@@ -1,165 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public sealed class SessionParameters
- {
- public sealed class Builder
- {
- private int mCipherSuite = -1;
- private short mCompressionAlgorithm = -1;
- private byte[] mMasterSecret = null;
- private Certificate mPeerCertificate = null;
- private byte[] mPskIdentity = null;
- private byte[] mSrpIdentity = null;
- private byte[] mEncodedServerExtensions = null;
-
- public Builder()
- {
- }
-
- public SessionParameters Build()
- {
- Validate(this.mCipherSuite >= 0, "cipherSuite");
- Validate(this.mCompressionAlgorithm >= 0, "compressionAlgorithm");
- Validate(this.mMasterSecret != null, "masterSecret");
- return new SessionParameters(mCipherSuite, (byte)mCompressionAlgorithm, mMasterSecret, mPeerCertificate,
- mPskIdentity, mSrpIdentity, mEncodedServerExtensions);
- }
-
- public Builder SetCipherSuite(int cipherSuite)
- {
- this.mCipherSuite = cipherSuite;
- return this;
- }
-
- public Builder SetCompressionAlgorithm(byte compressionAlgorithm)
- {
- this.mCompressionAlgorithm = compressionAlgorithm;
- return this;
- }
-
- public Builder SetMasterSecret(byte[] masterSecret)
- {
- this.mMasterSecret = masterSecret;
- return this;
- }
-
- public Builder SetPeerCertificate(Certificate peerCertificate)
- {
- this.mPeerCertificate = peerCertificate;
- return this;
- }
-
- public Builder SetPskIdentity(byte[] pskIdentity)
- {
- this.mPskIdentity = pskIdentity;
- return this;
- }
-
- public Builder SetSrpIdentity(byte[] srpIdentity)
- {
- this.mSrpIdentity = srpIdentity;
- return this;
- }
-
- public Builder SetServerExtensions(IDictionary serverExtensions)
- {
- if (serverExtensions == null)
- {
- mEncodedServerExtensions = null;
- }
- else
- {
- MemoryStream buf = new MemoryStream();
- TlsProtocol.WriteExtensions(buf, serverExtensions);
- mEncodedServerExtensions = buf.ToArray();
- }
- return this;
- }
-
- private void Validate(bool condition, string parameter)
- {
- if (!condition)
- throw new InvalidOperationException("Required session parameter '" + parameter + "' not configured");
- }
- }
-
- private int mCipherSuite;
- private byte mCompressionAlgorithm;
- private byte[] mMasterSecret;
- private Certificate mPeerCertificate;
- private byte[] mPskIdentity;
- private byte[] mSrpIdentity;
- private byte[] mEncodedServerExtensions;
-
- private SessionParameters(int cipherSuite, byte compressionAlgorithm, byte[] masterSecret,
- Certificate peerCertificate, byte[] pskIdentity, byte[] srpIdentity, byte[] encodedServerExtensions)
- {
- this.mCipherSuite = cipherSuite;
- this.mCompressionAlgorithm = compressionAlgorithm;
- this.mMasterSecret = Arrays.Clone(masterSecret);
- this.mPeerCertificate = peerCertificate;
- this.mPskIdentity = Arrays.Clone(pskIdentity);
- this.mSrpIdentity = Arrays.Clone(srpIdentity);
- this.mEncodedServerExtensions = encodedServerExtensions;
- }
-
- public void Clear()
- {
- if (this.mMasterSecret != null)
- {
- Arrays.Fill(this.mMasterSecret, (byte)0);
- }
- }
-
- public SessionParameters Copy()
- {
- return new SessionParameters(mCipherSuite, mCompressionAlgorithm, mMasterSecret, mPeerCertificate,
- mPskIdentity, mSrpIdentity, mEncodedServerExtensions);
- }
-
- public int CipherSuite
- {
- get { return mCipherSuite; }
- }
-
- public byte CompressionAlgorithm
- {
- get { return mCompressionAlgorithm; }
- }
-
- public byte[] MasterSecret
- {
- get { return mMasterSecret; }
- }
-
- public Certificate PeerCertificate
- {
- get { return mPeerCertificate; }
- }
-
- public byte[] PskIdentity
- {
- get { return mPskIdentity; }
- }
-
- public byte[] SrpIdentity
- {
- get { return mSrpIdentity; }
- }
-
- public IDictionary ReadServerExtensions()
- {
- if (mEncodedServerExtensions == null)
- return null;
-
- MemoryStream buf = new MemoryStream(mEncodedServerExtensions, false);
- return TlsProtocol.ReadExtensions(buf);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/SignatureAlgorithm.cs b/BCCrypto/src/crypto/tls/SignatureAlgorithm.cs
deleted file mode 100644
index 35b9617..0000000
--- a/BCCrypto/src/crypto/tls/SignatureAlgorithm.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * RFC 5246 7.4.1.4.1 (in RFC 2246, there were no specific values assigned)
- */
- public abstract class SignatureAlgorithm
- {
- public const byte anonymous = 0;
- public const byte rsa = 1;
- public const byte dsa = 2;
- public const byte ecdsa = 3;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/SignatureAndHashAlgorithm.cs b/BCCrypto/src/crypto/tls/SignatureAndHashAlgorithm.cs
deleted file mode 100644
index f74205b..0000000
--- a/BCCrypto/src/crypto/tls/SignatureAndHashAlgorithm.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * RFC 5246 7.4.1.4.1
- */
- public class SignatureAndHashAlgorithm
- {
- protected readonly byte mHash;
- protected readonly byte mSignature;
-
- /**
- * @param hash {@link HashAlgorithm}
- * @param signature {@link SignatureAlgorithm}
- */
- public SignatureAndHashAlgorithm(byte hash, byte signature)
- {
- if (!TlsUtilities.IsValidUint8(hash))
- {
- throw new ArgumentException("should be a uint8", "hash");
- }
- if (!TlsUtilities.IsValidUint8(signature))
- {
- throw new ArgumentException("should be a uint8", "signature");
- }
- if (signature == SignatureAlgorithm.anonymous)
- {
- throw new ArgumentException("MUST NOT be \"anonymous\"", "signature");
- }
-
- this.mHash = hash;
- this.mSignature = signature;
- }
-
- /**
- * @return {@link HashAlgorithm}
- */
- public virtual byte Hash
- {
- get { return mHash; }
- }
-
- /**
- * @return {@link SignatureAlgorithm}
- */
- public virtual byte Signature
- {
- get { return mSignature; }
- }
-
- public override bool Equals(object obj)
- {
- if (!(obj is SignatureAndHashAlgorithm))
- {
- return false;
- }
- SignatureAndHashAlgorithm other = (SignatureAndHashAlgorithm)obj;
- return other.Hash == Hash && other.Signature == Signature;
- }
-
- public override int GetHashCode()
- {
- return ((int)Hash << 16) | (int)Signature;
- }
-
- /**
- * Encode this {@link SignatureAndHashAlgorithm} to a {@link Stream}.
- *
- * @param output the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- TlsUtilities.WriteUint8(Hash, output);
- TlsUtilities.WriteUint8(Signature, output);
- }
-
- /**
- * Parse a {@link SignatureAndHashAlgorithm} from a {@link Stream}.
- *
- * @param input the {@link Stream} to parse from.
- * @return a {@link SignatureAndHashAlgorithm} object.
- * @throws IOException
- */
- public static SignatureAndHashAlgorithm Parse(Stream input)
- {
- byte hash = TlsUtilities.ReadUint8(input);
- byte signature = TlsUtilities.ReadUint8(input);
- return new SignatureAndHashAlgorithm(hash, signature);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/SignerInputBuffer.cs b/BCCrypto/src/crypto/tls/SignerInputBuffer.cs
deleted file mode 100644
index 7bc6962..0000000
--- a/BCCrypto/src/crypto/tls/SignerInputBuffer.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- internal class SignerInputBuffer
- : MemoryStream
- {
- internal void UpdateSigner(ISigner s)
- {
- Streams.WriteBufTo(this, new SigStream(s));
- }
-
- private class SigStream
- : BaseOutputStream
- {
- private readonly ISigner s;
-
- internal SigStream(ISigner s)
- {
- this.s = s;
- }
-
- public override void WriteByte(byte b)
- {
- s.Update(b);
- }
-
- public override void Write(byte[] buf, int off, int len)
- {
- s.BlockUpdate(buf, off, len);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/SimulatedTlsSrpIdentityManager.cs b/BCCrypto/src/crypto/tls/SimulatedTlsSrpIdentityManager.cs
deleted file mode 100644
index 3e9737c..0000000
--- a/BCCrypto/src/crypto/tls/SimulatedTlsSrpIdentityManager.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Agreement.Srp;
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * An implementation of {@link TlsSRPIdentityManager} that simulates the existence of "unknown" identities
- * to obscure the fact that there is no verifier for them.
- */
- public class SimulatedTlsSrpIdentityManager
- : TlsSrpIdentityManager
- {
- private static readonly byte[] PREFIX_PASSWORD = Strings.ToByteArray("password");
- private static readonly byte[] PREFIX_SALT = Strings.ToByteArray("salt");
-
- /**
- * Create a {@link SimulatedTlsSRPIdentityManager} that implements the algorithm from RFC 5054 2.5.1.3
- *
- * @param group the {@link SRP6GroupParameters} defining the group that SRP is operating in
- * @param seedKey the secret "seed key" referred to in RFC 5054 2.5.1.3
- * @return an instance of {@link SimulatedTlsSRPIdentityManager}
- */
- public static SimulatedTlsSrpIdentityManager GetRfc5054Default(Srp6GroupParameters group, byte[] seedKey)
- {
- Srp6VerifierGenerator verifierGenerator = new Srp6VerifierGenerator();
- verifierGenerator.Init(group, TlsUtilities.CreateHash(HashAlgorithm.sha1));
-
- HMac mac = new HMac(TlsUtilities.CreateHash(HashAlgorithm.sha1));
- mac.Init(new KeyParameter(seedKey));
-
- return new SimulatedTlsSrpIdentityManager(group, verifierGenerator, mac);
- }
-
- protected readonly Srp6GroupParameters mGroup;
- protected readonly Srp6VerifierGenerator mVerifierGenerator;
- protected readonly IMac mMac;
-
- public SimulatedTlsSrpIdentityManager(Srp6GroupParameters group, Srp6VerifierGenerator verifierGenerator, IMac mac)
- {
- this.mGroup = group;
- this.mVerifierGenerator = verifierGenerator;
- this.mMac = mac;
- }
-
- public virtual TlsSrpLoginParameters GetLoginParameters(byte[] identity)
- {
- mMac.BlockUpdate(PREFIX_SALT, 0, PREFIX_SALT.Length);
- mMac.BlockUpdate(identity, 0, identity.Length);
-
- byte[] salt = new byte[mMac.GetMacSize()];
- mMac.DoFinal(salt, 0);
-
- mMac.BlockUpdate(PREFIX_PASSWORD, 0, PREFIX_PASSWORD.Length);
- mMac.BlockUpdate(identity, 0, identity.Length);
-
- byte[] password = new byte[mMac.GetMacSize()];
- mMac.DoFinal(password, 0);
-
- BigInteger verifier = mVerifierGenerator.GenerateVerifier(salt, identity, password);
-
- return new TlsSrpLoginParameters(mGroup, verifier, salt);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/SrpTlsClient.cs b/BCCrypto/src/crypto/tls/SrpTlsClient.cs
deleted file mode 100644
index df16077..0000000
--- a/BCCrypto/src/crypto/tls/SrpTlsClient.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class SrpTlsClient
- : AbstractTlsClient
- {
- protected TlsSrpGroupVerifier mGroupVerifier;
-
- protected byte[] mIdentity;
- protected byte[] mPassword;
-
- public SrpTlsClient(byte[] identity, byte[] password)
- : this(new DefaultTlsCipherFactory(), new DefaultTlsSrpGroupVerifier(), identity, password)
- {
- }
-
- public SrpTlsClient(TlsCipherFactory cipherFactory, byte[] identity, byte[] password)
- : this(cipherFactory, new DefaultTlsSrpGroupVerifier(), identity, password)
- {
- }
-
- public SrpTlsClient(TlsCipherFactory cipherFactory, TlsSrpGroupVerifier groupVerifier,
- byte[] identity, byte[] password)
- : base(cipherFactory)
- {
- this.mGroupVerifier = groupVerifier;
- this.mIdentity = Arrays.Clone(identity);
- this.mPassword = Arrays.Clone(password);
- }
-
- protected virtual bool RequireSrpServerExtension
- {
- // No explicit guidance in RFC 5054; by default an (empty) extension from server is optional
- get { return false; }
- }
-
- public override int[] GetCipherSuites()
- {
- return new int[]
- {
- CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA
- };
- }
-
- public override IDictionary GetClientExtensions()
- {
- IDictionary clientExtensions = TlsExtensionsUtilities.EnsureExtensionsInitialised(base.GetClientExtensions());
- TlsSrpUtilities.AddSrpExtension(clientExtensions, this.mIdentity);
- return clientExtensions;
- }
-
- public override void ProcessServerExtensions(IDictionary serverExtensions)
- {
- if (!TlsUtilities.HasExpectedEmptyExtensionData(serverExtensions, ExtensionType.srp,
- AlertDescription.illegal_parameter))
- {
- if (RequireSrpServerExtension)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- base.ProcessServerExtensions(serverExtensions);
- }
-
- public override TlsKeyExchange GetKeyExchange()
- {
- int keyExchangeAlgorithm = TlsUtilities.GetKeyExchangeAlgorithm(mSelectedCipherSuite);
-
- switch (keyExchangeAlgorithm)
- {
- case KeyExchangeAlgorithm.SRP:
- case KeyExchangeAlgorithm.SRP_DSS:
- case KeyExchangeAlgorithm.SRP_RSA:
- return CreateSrpKeyExchange(keyExchangeAlgorithm);
-
- default:
- /*
- * Note: internal error here; the TlsProtocol implementation verifies that the
- * server-selected cipher suite was in the list of client-offered cipher suites, so if
- * we now can't produce an implementation, we shouldn't have offered it!
- */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public override TlsAuthentication GetAuthentication()
- {
- /*
- * Note: This method is not called unless a server certificate is sent, which may be the
- * case e.g. for SRP_DSS or SRP_RSA key exchange.
- */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- protected virtual TlsKeyExchange CreateSrpKeyExchange(int keyExchange)
- {
- return new TlsSrpKeyExchange(keyExchange, mSupportedSignatureAlgorithms, mGroupVerifier, mIdentity, mPassword);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/SrpTlsServer.cs b/BCCrypto/src/crypto/tls/SrpTlsServer.cs
deleted file mode 100644
index f978783..0000000
--- a/BCCrypto/src/crypto/tls/SrpTlsServer.cs
+++ /dev/null
@@ -1,121 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class SrpTlsServer
- : AbstractTlsServer
- {
- protected TlsSrpIdentityManager mSrpIdentityManager;
-
- protected byte[] mSrpIdentity = null;
- protected TlsSrpLoginParameters mLoginParameters = null;
-
- public SrpTlsServer(TlsSrpIdentityManager srpIdentityManager)
- : this(new DefaultTlsCipherFactory(), srpIdentityManager)
- {
- }
-
- public SrpTlsServer(TlsCipherFactory cipherFactory, TlsSrpIdentityManager srpIdentityManager)
- : base(cipherFactory)
- {
- this.mSrpIdentityManager = srpIdentityManager;
- }
-
- protected virtual TlsSignerCredentials GetDsaSignerCredentials()
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- protected virtual TlsSignerCredentials GetRsaSignerCredentials()
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- protected override int[] GetCipherSuites()
- {
- return new int[]
- {
- CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA,
- CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA,
- CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA,
- CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA,
- CipherSuite.TLS_SRP_SHA_WITH_AES_256_CBC_SHA,
- CipherSuite.TLS_SRP_SHA_WITH_AES_128_CBC_SHA
- };
- }
-
- public override void ProcessClientExtensions(IDictionary clientExtensions)
- {
- base.ProcessClientExtensions(clientExtensions);
-
- this.mSrpIdentity = TlsSrpUtilities.GetSrpExtension(clientExtensions);
- }
-
- public override int GetSelectedCipherSuite()
- {
- int cipherSuite = base.GetSelectedCipherSuite();
-
- if (TlsSrpUtilities.IsSrpCipherSuite(cipherSuite))
- {
- if (mSrpIdentity != null)
- {
- this.mLoginParameters = mSrpIdentityManager.GetLoginParameters(mSrpIdentity);
- }
-
- if (mLoginParameters == null)
- throw new TlsFatalAlert(AlertDescription.unknown_psk_identity);
- }
-
- return cipherSuite;
- }
-
- public override TlsCredentials GetCredentials()
- {
- int keyExchangeAlgorithm = TlsUtilities.GetKeyExchangeAlgorithm(mSelectedCipherSuite);
-
- switch (keyExchangeAlgorithm)
- {
- case KeyExchangeAlgorithm.SRP:
- return null;
-
- case KeyExchangeAlgorithm.SRP_DSS:
- return GetDsaSignerCredentials();
-
- case KeyExchangeAlgorithm.SRP_RSA:
- return GetRsaSignerCredentials();
-
- default:
- /* Note: internal error here; selected a key exchange we don't implement! */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public override TlsKeyExchange GetKeyExchange()
- {
- int keyExchangeAlgorithm = TlsUtilities.GetKeyExchangeAlgorithm(mSelectedCipherSuite);
-
- switch (keyExchangeAlgorithm)
- {
- case KeyExchangeAlgorithm.SRP:
- case KeyExchangeAlgorithm.SRP_DSS:
- case KeyExchangeAlgorithm.SRP_RSA:
- return CreateSrpKeyExchange(keyExchangeAlgorithm);
-
- default:
- /*
- * Note: internal error here; the TlsProtocol implementation verifies that the
- * server-selected cipher suite was in the list of client-offered cipher suites, so if
- * we now can't produce an implementation, we shouldn't have offered it!
- */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- protected virtual TlsKeyExchange CreateSrpKeyExchange(int keyExchange)
- {
- return new TlsSrpKeyExchange(keyExchange, mSupportedSignatureAlgorithms, mSrpIdentity, mLoginParameters);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/SrtpProtectionProfile.cs b/BCCrypto/src/crypto/tls/SrtpProtectionProfile.cs
deleted file mode 100644
index 6e9091b..0000000
--- a/BCCrypto/src/crypto/tls/SrtpProtectionProfile.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class SrtpProtectionProfile
- {
- /*
- * RFC 5764 4.1.2.
- */
- public const int SRTP_AES128_CM_HMAC_SHA1_80 = 0x0001;
- public const int SRTP_AES128_CM_HMAC_SHA1_32 = 0x0002;
- public const int SRTP_NULL_HMAC_SHA1_80 = 0x0005;
- public const int SRTP_NULL_HMAC_SHA1_32 = 0x0006;
-
- /*
- * RFC 7714 14.2.
- */
- public const int SRTP_AEAD_AES_128_GCM = 0x0007;
- public const int SRTP_AEAD_AES_256_GCM = 0x0008;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/Ssl3Mac.cs b/BCCrypto/src/crypto/tls/Ssl3Mac.cs
deleted file mode 100644
index 8bdb342..0000000
--- a/BCCrypto/src/crypto/tls/Ssl3Mac.cs
+++ /dev/null
@@ -1,110 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * HMAC implementation based on original internet draft for HMAC (RFC 2104)
- *
- * The difference is that padding is concatentated versus XORed with the key
- *
- * H(K + opad, H(K + ipad, text))
- */
- public class Ssl3Mac
- : IMac
- {
- private const byte IPAD_BYTE = 0x36;
- private const byte OPAD_BYTE = 0x5C;
-
- internal static readonly byte[] IPAD = GenPad(IPAD_BYTE, 48);
- internal static readonly byte[] OPAD = GenPad(OPAD_BYTE, 48);
-
- private readonly IDigest digest;
- private readonly int padLength;
-
- private byte[] secret;
-
- /**
- * Base constructor for one of the standard digest algorithms that the byteLength of
- * the algorithm is know for. Behaviour is undefined for digests other than MD5 or SHA1.
- *
- * @param digest the digest.
- */
- public Ssl3Mac(IDigest digest)
- {
- this.digest = digest;
-
- if (digest.GetDigestSize() == 20)
- {
- this.padLength = 40;
- }
- else
- {
- this.padLength = 48;
- }
- }
-
- public virtual string AlgorithmName
- {
- get { return digest.AlgorithmName + "/SSL3MAC"; }
- }
-
- public virtual void Init(ICipherParameters parameters)
- {
- secret = Arrays.Clone(((KeyParameter)parameters).GetKey());
-
- Reset();
- }
-
- public virtual int GetMacSize()
- {
- return digest.GetDigestSize();
- }
-
- public virtual void Update(byte input)
- {
- digest.Update(input);
- }
-
- public virtual void BlockUpdate(byte[] input, int inOff, int len)
- {
- digest.BlockUpdate(input, inOff, len);
- }
-
- public virtual int DoFinal(byte[] output, int outOff)
- {
- byte[] tmp = new byte[digest.GetDigestSize()];
- digest.DoFinal(tmp, 0);
-
- digest.BlockUpdate(secret, 0, secret.Length);
- digest.BlockUpdate(OPAD, 0, padLength);
- digest.BlockUpdate(tmp, 0, tmp.Length);
-
- int len = digest.DoFinal(output, outOff);
-
- Reset();
-
- return len;
- }
-
- /**
- * Reset the mac generator.
- */
- public virtual void Reset()
- {
- digest.Reset();
- digest.BlockUpdate(secret, 0, secret.Length);
- digest.BlockUpdate(IPAD, 0, padLength);
- }
-
- private static byte[] GenPad(byte b, int count)
- {
- byte[] padding = new byte[count];
- Arrays.Fill(padding, b);
- return padding;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/SupplementalDataEntry.cs b/BCCrypto/src/crypto/tls/SupplementalDataEntry.cs
deleted file mode 100644
index 5adc4fa..0000000
--- a/BCCrypto/src/crypto/tls/SupplementalDataEntry.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class SupplementalDataEntry
- {
- protected readonly int mDataType;
- protected readonly byte[] mData;
-
- public SupplementalDataEntry(int dataType, byte[] data)
- {
- this.mDataType = dataType;
- this.mData = data;
- }
-
- public virtual int DataType
- {
- get { return mDataType; }
- }
-
- public virtual byte[] Data
- {
- get { return mData; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/SupplementalDataType.cs b/BCCrypto/src/crypto/tls/SupplementalDataType.cs
deleted file mode 100644
index 79511c5..0000000
--- a/BCCrypto/src/crypto/tls/SupplementalDataType.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// RFC 4680
- public abstract class SupplementalDataType
- {
- /*
- * RFC 4681
- */
- public const int user_mapping_data = 0;
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsAeadCipher.cs b/BCCrypto/src/crypto/tls/TlsAeadCipher.cs
deleted file mode 100644
index cc0575c..0000000
--- a/BCCrypto/src/crypto/tls/TlsAeadCipher.cs
+++ /dev/null
@@ -1,249 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsAeadCipher
- : TlsCipher
- {
- // TODO[draft-zauner-tls-aes-ocb-04] Apply data volume limit described in section 8.4
-
- public const int NONCE_RFC5288 = 1;
-
- /*
- * draft-zauner-tls-aes-ocb-04 specifies the nonce construction from draft-ietf-tls-chacha20-poly1305-04
- */
- internal const int NONCE_DRAFT_CHACHA20_POLY1305 = 2;
-
- protected readonly TlsContext context;
- protected readonly int macSize;
- // TODO SecurityParameters.record_iv_length
- protected readonly int record_iv_length;
-
- protected readonly IAeadBlockCipher encryptCipher;
- protected readonly IAeadBlockCipher decryptCipher;
-
- protected readonly byte[] encryptImplicitNonce, decryptImplicitNonce;
-
- protected readonly int nonceMode;
-
- ///
- public TlsAeadCipher(TlsContext context, IAeadBlockCipher clientWriteCipher, IAeadBlockCipher serverWriteCipher,
- int cipherKeySize, int macSize)
- : this(context, clientWriteCipher, serverWriteCipher, cipherKeySize, macSize, NONCE_RFC5288)
- {
- }
-
- ///
- internal TlsAeadCipher(TlsContext context, IAeadBlockCipher clientWriteCipher, IAeadBlockCipher serverWriteCipher,
- int cipherKeySize, int macSize, int nonceMode)
- {
- if (!TlsUtilities.IsTlsV12(context))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- this.nonceMode = nonceMode;
-
- // TODO SecurityParameters.fixed_iv_length
- int fixed_iv_length;
-
- switch (nonceMode)
- {
- case NONCE_RFC5288:
- fixed_iv_length = 4;
- this.record_iv_length = 8;
- break;
- case NONCE_DRAFT_CHACHA20_POLY1305:
- fixed_iv_length = 12;
- this.record_iv_length = 0;
- break;
- default:
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- this.context = context;
- this.macSize = macSize;
-
- int key_block_size = (2 * cipherKeySize) + (2 * fixed_iv_length);
-
- byte[] key_block = TlsUtilities.CalculateKeyBlock(context, key_block_size);
-
- int offset = 0;
-
- KeyParameter client_write_key = new KeyParameter(key_block, offset, cipherKeySize);
- offset += cipherKeySize;
- KeyParameter server_write_key = new KeyParameter(key_block, offset, cipherKeySize);
- offset += cipherKeySize;
- byte[] client_write_IV = Arrays.CopyOfRange(key_block, offset, offset + fixed_iv_length);
- offset += fixed_iv_length;
- byte[] server_write_IV = Arrays.CopyOfRange(key_block, offset, offset + fixed_iv_length);
- offset += fixed_iv_length;
-
- if (offset != key_block_size)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- KeyParameter encryptKey, decryptKey;
- if (context.IsServer)
- {
- this.encryptCipher = serverWriteCipher;
- this.decryptCipher = clientWriteCipher;
- this.encryptImplicitNonce = server_write_IV;
- this.decryptImplicitNonce = client_write_IV;
- encryptKey = server_write_key;
- decryptKey = client_write_key;
- }
- else
- {
- this.encryptCipher = clientWriteCipher;
- this.decryptCipher = serverWriteCipher;
- this.encryptImplicitNonce = client_write_IV;
- this.decryptImplicitNonce = server_write_IV;
- encryptKey = client_write_key;
- decryptKey = server_write_key;
- }
-
- byte[] dummyNonce = new byte[fixed_iv_length + record_iv_length];
-
- this.encryptCipher.Init(true, new AeadParameters(encryptKey, 8 * macSize, dummyNonce));
- this.decryptCipher.Init(false, new AeadParameters(decryptKey, 8 * macSize, dummyNonce));
- }
-
- public virtual int GetPlaintextLimit(int ciphertextLimit)
- {
- // TODO We ought to be able to ask the decryptCipher (independently of it's current state!)
- return ciphertextLimit - macSize - record_iv_length;
- }
-
- ///
- public virtual byte[] EncodePlaintext(long seqNo, byte type, byte[] plaintext, int offset, int len)
- {
- byte[] nonce = new byte[encryptImplicitNonce.Length + record_iv_length];
-
- switch (nonceMode)
- {
- case NONCE_RFC5288:
- Array.Copy(encryptImplicitNonce, 0, nonce, 0, encryptImplicitNonce.Length);
- // RFC 5288/6655: The nonce_explicit MAY be the 64-bit sequence number.
- TlsUtilities.WriteUint64(seqNo, nonce, encryptImplicitNonce.Length);
- break;
- case NONCE_DRAFT_CHACHA20_POLY1305:
- TlsUtilities.WriteUint64(seqNo, nonce, nonce.Length - 8);
- for (int i = 0; i < encryptImplicitNonce.Length; ++i)
- {
- nonce[i] ^= encryptImplicitNonce[i];
- }
- break;
- default:
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- int plaintextOffset = offset;
- int plaintextLength = len;
- int ciphertextLength = encryptCipher.GetOutputSize(plaintextLength);
-
- byte[] output = new byte[record_iv_length + ciphertextLength];
- if (record_iv_length != 0)
- {
- Array.Copy(nonce, nonce.Length - record_iv_length, output, 0, record_iv_length);
- }
- int outputPos = record_iv_length;
-
- byte[] additionalData = GetAdditionalData(seqNo, type, plaintextLength);
- AeadParameters parameters = new AeadParameters(null, 8 * macSize, nonce, additionalData);
-
- try
- {
- encryptCipher.Init(true, parameters);
- outputPos += encryptCipher.ProcessBytes(plaintext, plaintextOffset, plaintextLength, output, outputPos);
- outputPos += encryptCipher.DoFinal(output, outputPos);
- }
- catch (Exception e)
- {
- throw new TlsFatalAlert(AlertDescription.internal_error, e);
- }
-
- if (outputPos != output.Length)
- {
- // NOTE: Existing AEAD cipher implementations all give exact output lengths
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- return output;
- }
-
- ///
- public virtual byte[] DecodeCiphertext(long seqNo, byte type, byte[] ciphertext, int offset, int len)
- {
- if (GetPlaintextLimit(len) < 0)
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- byte[] nonce = new byte[decryptImplicitNonce.Length + record_iv_length];
-
- switch (nonceMode)
- {
- case NONCE_RFC5288:
- Array.Copy(decryptImplicitNonce, 0, nonce, 0, decryptImplicitNonce.Length);
- Array.Copy(ciphertext, offset, nonce, nonce.Length - record_iv_length, record_iv_length);
- break;
- case NONCE_DRAFT_CHACHA20_POLY1305:
- TlsUtilities.WriteUint64(seqNo, nonce, nonce.Length - 8);
- for (int i = 0; i < decryptImplicitNonce.Length; ++i)
- {
- nonce[i] ^= decryptImplicitNonce[i];
- }
- break;
- default:
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- int ciphertextOffset = offset + record_iv_length;
- int ciphertextLength = len - record_iv_length;
- int plaintextLength = decryptCipher.GetOutputSize(ciphertextLength);
-
- byte[] output = new byte[plaintextLength];
- int outputPos = 0;
-
- byte[] additionalData = GetAdditionalData(seqNo, type, plaintextLength);
- AeadParameters parameters = new AeadParameters(null, 8 * macSize, nonce, additionalData);
-
- try
- {
- decryptCipher.Init(false, parameters);
- outputPos += decryptCipher.ProcessBytes(ciphertext, ciphertextOffset, ciphertextLength, output, outputPos);
- outputPos += decryptCipher.DoFinal(output, outputPos);
- }
- catch (Exception e)
- {
- throw new TlsFatalAlert(AlertDescription.bad_record_mac, e);
- }
-
- if (outputPos != output.Length)
- {
- // NOTE: Existing AEAD cipher implementations all give exact output lengths
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- return output;
- }
-
- ///
- protected virtual byte[] GetAdditionalData(long seqNo, byte type, int len)
- {
- /*
- * additional_data = seq_num + TLSCompressed.type + TLSCompressed.version +
- * TLSCompressed.length
- */
-
- byte[] additional_data = new byte[13];
- TlsUtilities.WriteUint64(seqNo, additional_data, 0);
- TlsUtilities.WriteUint8(type, additional_data, 8);
- TlsUtilities.WriteVersion(context.ServerVersion, additional_data, 9);
- TlsUtilities.WriteUint16(len, additional_data, 11);
-
- return additional_data;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsAgreementCredentials.cs b/BCCrypto/src/crypto/tls/TlsAgreementCredentials.cs
deleted file mode 100644
index 7c64072..0000000
--- a/BCCrypto/src/crypto/tls/TlsAgreementCredentials.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsAgreementCredentials
- : TlsCredentials
- {
- ///
- byte[] GenerateAgreement(AsymmetricKeyParameter peerPublicKey);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsAuthentication.cs b/BCCrypto/src/crypto/tls/TlsAuthentication.cs
deleted file mode 100644
index 9aea5e4..0000000
--- a/BCCrypto/src/crypto/tls/TlsAuthentication.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsAuthentication
- {
- ///
- /// Called by the protocol handler to report the server certificate.
- ///
- ///
- /// This method is responsible for certificate verification and validation
- ///
- /// The server received
- ///
- void NotifyServerCertificate(Certificate serverCertificate);
-
- ///
- /// Return client credentials in response to server's certificate request
- ///
- ///
- /// A containing server certificate request details
- ///
- ///
- /// A to be used for client authentication
- /// (or null for no client authentication)
- ///
- ///
- TlsCredentials GetClientCredentials(CertificateRequest certificateRequest);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsBlockCipher.cs b/BCCrypto/src/crypto/tls/TlsBlockCipher.cs
deleted file mode 100644
index 76b476a..0000000
--- a/BCCrypto/src/crypto/tls/TlsBlockCipher.cs
+++ /dev/null
@@ -1,395 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// A generic TLS 1.0-1.2 / SSLv3 block cipher. This can be used for AES or 3DES for example.
- ///
- public class TlsBlockCipher
- : TlsCipher
- {
- protected readonly TlsContext context;
- protected readonly byte[] randomData;
- protected readonly bool useExplicitIV;
- protected readonly bool encryptThenMac;
-
- protected readonly IBlockCipher encryptCipher;
- protected readonly IBlockCipher decryptCipher;
-
- protected readonly TlsMac mWriteMac;
- protected readonly TlsMac mReadMac;
-
- public virtual TlsMac WriteMac
- {
- get { return mWriteMac; }
- }
-
- public virtual TlsMac ReadMac
- {
- get { return mReadMac; }
- }
-
- ///
- public TlsBlockCipher(TlsContext context, IBlockCipher clientWriteCipher, IBlockCipher serverWriteCipher,
- IDigest clientWriteDigest, IDigest serverWriteDigest, int cipherKeySize)
- {
- this.context = context;
-
- this.randomData = new byte[256];
- context.NonceRandomGenerator.NextBytes(randomData);
-
- this.useExplicitIV = TlsUtilities.IsTlsV11(context);
- this.encryptThenMac = context.SecurityParameters.encryptThenMac;
-
- int key_block_size = (2 * cipherKeySize) + clientWriteDigest.GetDigestSize()
- + serverWriteDigest.GetDigestSize();
-
- // From TLS 1.1 onwards, block ciphers don't need client_write_IV
- if (!useExplicitIV)
- {
- key_block_size += clientWriteCipher.GetBlockSize() + serverWriteCipher.GetBlockSize();
- }
-
- byte[] key_block = TlsUtilities.CalculateKeyBlock(context, key_block_size);
-
- int offset = 0;
-
- TlsMac clientWriteMac = new TlsMac(context, clientWriteDigest, key_block, offset,
- clientWriteDigest.GetDigestSize());
- offset += clientWriteDigest.GetDigestSize();
- TlsMac serverWriteMac = new TlsMac(context, serverWriteDigest, key_block, offset,
- serverWriteDigest.GetDigestSize());
- offset += serverWriteDigest.GetDigestSize();
-
- KeyParameter client_write_key = new KeyParameter(key_block, offset, cipherKeySize);
- offset += cipherKeySize;
- KeyParameter server_write_key = new KeyParameter(key_block, offset, cipherKeySize);
- offset += cipherKeySize;
-
- byte[] client_write_IV, server_write_IV;
- if (useExplicitIV)
- {
- client_write_IV = new byte[clientWriteCipher.GetBlockSize()];
- server_write_IV = new byte[serverWriteCipher.GetBlockSize()];
- }
- else
- {
- client_write_IV = Arrays.CopyOfRange(key_block, offset, offset + clientWriteCipher.GetBlockSize());
- offset += clientWriteCipher.GetBlockSize();
- server_write_IV = Arrays.CopyOfRange(key_block, offset, offset + serverWriteCipher.GetBlockSize());
- offset += serverWriteCipher.GetBlockSize();
- }
-
- if (offset != key_block_size)
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- ICipherParameters encryptParams, decryptParams;
- if (context.IsServer)
- {
- this.mWriteMac = serverWriteMac;
- this.mReadMac = clientWriteMac;
- this.encryptCipher = serverWriteCipher;
- this.decryptCipher = clientWriteCipher;
- encryptParams = new ParametersWithIV(server_write_key, server_write_IV);
- decryptParams = new ParametersWithIV(client_write_key, client_write_IV);
- }
- else
- {
- this.mWriteMac = clientWriteMac;
- this.mReadMac = serverWriteMac;
- this.encryptCipher = clientWriteCipher;
- this.decryptCipher = serverWriteCipher;
- encryptParams = new ParametersWithIV(client_write_key, client_write_IV);
- decryptParams = new ParametersWithIV(server_write_key, server_write_IV);
- }
-
- this.encryptCipher.Init(true, encryptParams);
- this.decryptCipher.Init(false, decryptParams);
- }
-
- public virtual int GetPlaintextLimit(int ciphertextLimit)
- {
- int blockSize = encryptCipher.GetBlockSize();
- int macSize = mWriteMac.Size;
-
- int plaintextLimit = ciphertextLimit;
-
- // An explicit IV consumes 1 block
- if (useExplicitIV)
- {
- plaintextLimit -= blockSize;
- }
-
- // Leave room for the MAC, and require block-alignment
- if (encryptThenMac)
- {
- plaintextLimit -= macSize;
- plaintextLimit -= plaintextLimit % blockSize;
- }
- else
- {
- plaintextLimit -= plaintextLimit % blockSize;
- plaintextLimit -= macSize;
- }
-
- // Minimum 1 byte of padding
- --plaintextLimit;
-
- return plaintextLimit;
- }
-
- public virtual byte[] EncodePlaintext(long seqNo, byte type, byte[] plaintext, int offset, int len)
- {
- int blockSize = encryptCipher.GetBlockSize();
- int macSize = mWriteMac.Size;
-
- ProtocolVersion version = context.ServerVersion;
-
- int enc_input_length = len;
- if (!encryptThenMac)
- {
- enc_input_length += macSize;
- }
-
- int padding_length = blockSize - 1 - (enc_input_length % blockSize);
-
- /*
- * Don't use variable-length padding with truncated MACs.
- *
- * See "Tag Size Does Matter: Attacks and Proofs for the TLS Record Protocol", Paterson,
- * Ristenpart, Shrimpton.
- */
- if (encryptThenMac || !context.SecurityParameters.truncatedHMac)
- {
- // TODO[DTLS] Consider supporting in DTLS (without exceeding send limit though)
- if (!version.IsDtls && !version.IsSsl)
- {
- // Add a random number of extra blocks worth of padding
- int maxExtraPadBlocks = (255 - padding_length) / blockSize;
- int actualExtraPadBlocks = ChooseExtraPadBlocks(context.SecureRandom, maxExtraPadBlocks);
- padding_length += actualExtraPadBlocks * blockSize;
- }
- }
-
- int totalSize = len + macSize + padding_length + 1;
- if (useExplicitIV)
- {
- totalSize += blockSize;
- }
-
- byte[] outBuf = new byte[totalSize];
- int outOff = 0;
-
- if (useExplicitIV)
- {
- byte[] explicitIV = new byte[blockSize];
- context.NonceRandomGenerator.NextBytes(explicitIV);
-
- encryptCipher.Init(true, new ParametersWithIV(null, explicitIV));
-
- Array.Copy(explicitIV, 0, outBuf, outOff, blockSize);
- outOff += blockSize;
- }
-
- int blocks_start = outOff;
-
- Array.Copy(plaintext, offset, outBuf, outOff, len);
- outOff += len;
-
- if (!encryptThenMac)
- {
- byte[] mac = mWriteMac.CalculateMac(seqNo, type, plaintext, offset, len);
- Array.Copy(mac, 0, outBuf, outOff, mac.Length);
- outOff += mac.Length;
- }
-
- for (int i = 0; i <= padding_length; i++)
- {
- outBuf[outOff++] = (byte)padding_length;
- }
-
- for (int i = blocks_start; i < outOff; i += blockSize)
- {
- encryptCipher.ProcessBlock(outBuf, i, outBuf, i);
- }
-
- if (encryptThenMac)
- {
- byte[] mac = mWriteMac.CalculateMac(seqNo, type, outBuf, 0, outOff);
- Array.Copy(mac, 0, outBuf, outOff, mac.Length);
- outOff += mac.Length;
- }
-
- // assert outBuf.length == outOff;
-
- return outBuf;
- }
-
- ///
- public virtual byte[] DecodeCiphertext(long seqNo, byte type, byte[] ciphertext, int offset, int len)
- {
- int blockSize = decryptCipher.GetBlockSize();
- int macSize = mReadMac.Size;
-
- int minLen = blockSize;
- if (encryptThenMac)
- {
- minLen += macSize;
- }
- else
- {
- minLen = System.Math.Max(minLen, macSize + 1);
- }
-
- if (useExplicitIV)
- {
- minLen += blockSize;
- }
-
- if (len < minLen)
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- int blocks_length = len;
- if (encryptThenMac)
- {
- blocks_length -= macSize;
- }
-
- if (blocks_length % blockSize != 0)
- throw new TlsFatalAlert(AlertDescription.decryption_failed);
-
- if (encryptThenMac)
- {
- int end = offset + len;
- byte[] receivedMac = Arrays.CopyOfRange(ciphertext, end - macSize, end);
- byte[] calculatedMac = mReadMac.CalculateMac(seqNo, type, ciphertext, offset, len - macSize);
-
- bool badMacEtm = !Arrays.ConstantTimeAreEqual(calculatedMac, receivedMac);
- if (badMacEtm)
- {
- /*
- * RFC 7366 3. The MAC SHALL be evaluated before any further processing such as
- * decryption is performed, and if the MAC verification fails, then processing SHALL
- * terminate immediately. For TLS, a fatal bad_record_mac MUST be generated [2]. For
- * DTLS, the record MUST be discarded, and a fatal bad_record_mac MAY be generated
- * [4]. This immediate response to a bad MAC eliminates any timing channels that may
- * be available through the use of manipulated packet data.
- */
- throw new TlsFatalAlert(AlertDescription.bad_record_mac);
- }
- }
-
- if (useExplicitIV)
- {
- decryptCipher.Init(false, new ParametersWithIV(null, ciphertext, offset, blockSize));
-
- offset += blockSize;
- blocks_length -= blockSize;
- }
-
- for (int i = 0; i < blocks_length; i += blockSize)
- {
- decryptCipher.ProcessBlock(ciphertext, offset + i, ciphertext, offset + i);
- }
-
- // If there's anything wrong with the padding, this will return zero
- int totalPad = CheckPaddingConstantTime(ciphertext, offset, blocks_length, blockSize, encryptThenMac ? 0 : macSize);
- bool badMac = (totalPad == 0);
-
- int dec_output_length = blocks_length - totalPad;
-
- if (!encryptThenMac)
- {
- dec_output_length -= macSize;
- int macInputLen = dec_output_length;
- int macOff = offset + macInputLen;
- byte[] receivedMac = Arrays.CopyOfRange(ciphertext, macOff, macOff + macSize);
- byte[] calculatedMac = mReadMac.CalculateMacConstantTime(seqNo, type, ciphertext, offset, macInputLen,
- blocks_length - macSize, randomData);
-
- badMac |= !Arrays.ConstantTimeAreEqual(calculatedMac, receivedMac);
- }
-
- if (badMac)
- throw new TlsFatalAlert(AlertDescription.bad_record_mac);
-
- return Arrays.CopyOfRange(ciphertext, offset, offset + dec_output_length);
- }
-
- protected virtual int CheckPaddingConstantTime(byte[] buf, int off, int len, int blockSize, int macSize)
- {
- int end = off + len;
- byte lastByte = buf[end - 1];
- int padlen = lastByte & 0xff;
- int totalPad = padlen + 1;
-
- int dummyIndex = 0;
- byte padDiff = 0;
-
- if ((TlsUtilities.IsSsl(context) && totalPad > blockSize) || (macSize + totalPad > len))
- {
- totalPad = 0;
- }
- else
- {
- int padPos = end - totalPad;
- do
- {
- padDiff |= (byte)(buf[padPos++] ^ lastByte);
- }
- while (padPos < end);
-
- dummyIndex = totalPad;
-
- if (padDiff != 0)
- {
- totalPad = 0;
- }
- }
-
- // Run some extra dummy checks so the number of checks is always constant
- {
- byte[] dummyPad = randomData;
- while (dummyIndex < 256)
- {
- padDiff |= (byte)(dummyPad[dummyIndex++] ^ lastByte);
- }
- // Ensure the above loop is not eliminated
- dummyPad[0] ^= padDiff;
- }
-
- return totalPad;
- }
-
- protected virtual int ChooseExtraPadBlocks(SecureRandom r, int max)
- {
- // return r.NextInt(max + 1);
-
- int x = r.NextInt();
- int n = LowestBitSet(x);
- return System.Math.Min(n, max);
- }
-
- protected virtual int LowestBitSet(int x)
- {
- if (x == 0)
- return 32;
-
- uint ux = (uint)x;
- int n = 0;
- while ((ux & 1U) == 0)
- {
- ++n;
- ux >>= 1;
- }
- return n;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsCipher.cs b/BCCrypto/src/crypto/tls/TlsCipher.cs
deleted file mode 100644
index 7bd8573..0000000
--- a/BCCrypto/src/crypto/tls/TlsCipher.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsCipher
- {
- int GetPlaintextLimit(int ciphertextLimit);
-
- ///
- byte[] EncodePlaintext(long seqNo, byte type, byte[] plaintext, int offset, int len);
-
- ///
- byte[] DecodeCiphertext(long seqNo, byte type, byte[] ciphertext, int offset, int len);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsCipherFactory.cs b/BCCrypto/src/crypto/tls/TlsCipherFactory.cs
deleted file mode 100644
index 4e1fe0e..0000000
--- a/BCCrypto/src/crypto/tls/TlsCipherFactory.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsCipherFactory
- {
- ///
- TlsCipher CreateCipher(TlsContext context, int encryptionAlgorithm, int macAlgorithm);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsClient.cs b/BCCrypto/src/crypto/tls/TlsClient.cs
deleted file mode 100644
index 73f1690..0000000
--- a/BCCrypto/src/crypto/tls/TlsClient.cs
+++ /dev/null
@@ -1,148 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsClient
- : TlsPeer
- {
- ///
- /// Called at the start of a new TLS session, before any other methods.
- ///
- ///
- /// A
- ///
- void Init(TlsClientContext context);
-
- /// Return the session this client wants to resume, if any.
- /// Note that the peer's certificate chain for the session (if any) may need to be periodically revalidated.
- ///
- /// A representing the resumable session to be used for this connection,
- /// or null to use a new session.
- ///
- TlsSession GetSessionToResume();
-
- ///
- /// Return the to use for the TLSPlaintext.version field prior to
- /// receiving the server version. NOTE: This method is not called for DTLS.
- ///
- ///
- /// See RFC 5246 E.1.: "TLS clients that wish to negotiate with older servers MAY send any value
- /// {03,XX} as the record layer version number. Typical values would be {03,00}, the lowest
- /// version number supported by the client, and the value of ClientHello.client_version. No
- /// single value will guarantee interoperability with all old servers, but this is a complex
- /// topic beyond the scope of this document."
- ///
- /// The to use.
- ProtocolVersion ClientHelloRecordLayerVersion { get; }
-
- ProtocolVersion ClientVersion { get; }
-
- bool IsFallback { get; }
-
- ///
- /// Get the list of cipher suites that this client supports.
- ///
- ///
- /// An array of values, each specifying a supported cipher suite.
- ///
- int[] GetCipherSuites();
-
- ///
- /// Get the list of compression methods that this client supports.
- ///
- ///
- /// An array of values, each specifying a supported compression method.
- ///
- byte[] GetCompressionMethods();
-
- ///
- /// Get the (optional) table of client extensions to be included in (extended) client hello.
- ///
- ///
- /// A (Int32 -> byte[]). May be null.
- ///
- ///
- IDictionary GetClientExtensions();
-
- ///
- void NotifyServerVersion(ProtocolVersion selectedVersion);
-
- ///
- /// Notifies the client of the session_id sent in the ServerHello.
- ///
- /// An array of
- void NotifySessionID(byte[] sessionID);
-
- ///
- /// Report the cipher suite that was selected by the server.
- ///
- ///
- /// The protocol handler validates this value against the offered cipher suites
- ///
- ///
- ///
- /// A
- ///
- void NotifySelectedCipherSuite(int selectedCipherSuite);
-
- ///
- /// Report the compression method that was selected by the server.
- ///
- ///
- /// The protocol handler validates this value against the offered compression methods
- ///
- ///
- ///
- /// A
- ///
- void NotifySelectedCompressionMethod(byte selectedCompressionMethod);
-
- ///
- /// Report the extensions from an extended server hello.
- ///
- ///
- /// Will only be called if we returned a non-null result from .
- ///
- ///
- /// A (Int32 -> byte[])
- ///
- void ProcessServerExtensions(IDictionary serverExtensions);
-
- /// A list of
- ///
- void ProcessServerSupplementalData(IList serverSupplementalData);
-
- ///
- /// Return an implementation of to negotiate the key exchange
- /// part of the protocol.
- ///
- ///
- /// A
- ///
- ///
- TlsKeyExchange GetKeyExchange();
-
- ///
- /// Return an implementation of to handle authentication
- /// part of the protocol.
- ///
- ///
- TlsAuthentication GetAuthentication();
-
- /// A list of
- ///
- IList GetClientSupplementalData();
-
- /// RFC 5077 3.3. NewSessionTicket Handshake Message
- ///
- /// This method will be called (only) when a NewSessionTicket handshake message is received. The
- /// ticket is opaque to the client and clients MUST NOT examine the ticket under the assumption
- /// that it complies with e.g. RFC 5077 4. Recommended Ticket Construction .
- ///
- /// The ticket
- ///
- void NotifyNewSessionTicket(NewSessionTicket newSessionTicket);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsClientContext.cs b/BCCrypto/src/crypto/tls/TlsClientContext.cs
deleted file mode 100644
index b077d0a..0000000
--- a/BCCrypto/src/crypto/tls/TlsClientContext.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsClientContext
- : TlsContext
- {
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsClientContextImpl.cs b/BCCrypto/src/crypto/tls/TlsClientContextImpl.cs
deleted file mode 100644
index 674d689..0000000
--- a/BCCrypto/src/crypto/tls/TlsClientContextImpl.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- internal class TlsClientContextImpl
- : AbstractTlsContext, TlsClientContext
- {
- internal TlsClientContextImpl(SecureRandom secureRandom, SecurityParameters securityParameters)
- : base(secureRandom, securityParameters)
- {
- }
-
- public override bool IsServer
- {
- get { return false; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsClientProtocol.cs b/BCCrypto/src/crypto/tls/TlsClientProtocol.cs
deleted file mode 100644
index 0ea84c0..0000000
--- a/BCCrypto/src/crypto/tls/TlsClientProtocol.cs
+++ /dev/null
@@ -1,912 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsClientProtocol
- : TlsProtocol
- {
- protected TlsClient mTlsClient = null;
- internal TlsClientContextImpl mTlsClientContext = null;
-
- protected byte[] mSelectedSessionID = null;
-
- protected TlsKeyExchange mKeyExchange = null;
- protected TlsAuthentication mAuthentication = null;
-
- protected CertificateStatus mCertificateStatus = null;
- protected CertificateRequest mCertificateRequest = null;
-
- /**
- * Constructor for blocking mode.
- * @param stream The bi-directional stream of data to/from the server
- * @param secureRandom Random number generator for various cryptographic functions
- */
- public TlsClientProtocol(Stream stream, SecureRandom secureRandom)
- : base(stream, secureRandom)
- {
- }
-
- /**
- * Constructor for blocking mode.
- * @param input The stream of data from the server
- * @param output The stream of data to the server
- * @param secureRandom Random number generator for various cryptographic functions
- */
- public TlsClientProtocol(Stream input, Stream output, SecureRandom secureRandom)
- : base(input, output, secureRandom)
- {
- }
-
- /**
- * Constructor for non-blocking mode.
- *
- * When data is received, use {@link #offerInput(java.nio.ByteBuffer)} to
- * provide the received ciphertext, then use
- * {@link #readInput(byte[], int, int)} to read the corresponding cleartext.
- *
- * Similarly, when data needs to be sent, use
- * {@link #offerOutput(byte[], int, int)} to provide the cleartext, then use
- * {@link #readOutput(byte[], int, int)} to get the corresponding
- * ciphertext.
- *
- * @param secureRandom
- * Random number generator for various cryptographic functions
- */
- public TlsClientProtocol(SecureRandom secureRandom)
- : base(secureRandom)
- {
- }
-
- /**
- * Initiates a TLS handshake in the role of client.
- *
- * In blocking mode, this will not return until the handshake is complete.
- * In non-blocking mode, use {@link TlsPeer#NotifyHandshakeComplete()} to
- * receive a callback when the handshake is complete.
- *
- * @param tlsClient The {@link TlsClient} to use for the handshake.
- * @throws IOException If in blocking mode and handshake was not successful.
- */
- public virtual void Connect(TlsClient tlsClient)
- {
- if (tlsClient == null)
- throw new ArgumentNullException("tlsClient");
- if (this.mTlsClient != null)
- throw new InvalidOperationException("'Connect' can only be called once");
-
- this.mTlsClient = tlsClient;
-
- this.mSecurityParameters = new SecurityParameters();
- this.mSecurityParameters.entity = ConnectionEnd.client;
-
- this.mTlsClientContext = new TlsClientContextImpl(mSecureRandom, mSecurityParameters);
-
- this.mSecurityParameters.clientRandom = CreateRandomBlock(tlsClient.ShouldUseGmtUnixTime(),
- mTlsClientContext.NonceRandomGenerator);
-
- this.mTlsClient.Init(mTlsClientContext);
- this.mRecordStream.Init(mTlsClientContext);
-
- TlsSession sessionToResume = tlsClient.GetSessionToResume();
- if (sessionToResume != null && sessionToResume.IsResumable)
- {
- SessionParameters sessionParameters = sessionToResume.ExportSessionParameters();
- if (sessionParameters != null)
- {
- this.mTlsSession = sessionToResume;
- this.mSessionParameters = sessionParameters;
- }
- }
-
- SendClientHelloMessage();
- this.mConnectionState = CS_CLIENT_HELLO;
-
- BlockForHandshake();
- }
-
- protected override void CleanupHandshake()
- {
- base.CleanupHandshake();
-
- this.mSelectedSessionID = null;
- this.mKeyExchange = null;
- this.mAuthentication = null;
- this.mCertificateStatus = null;
- this.mCertificateRequest = null;
- }
-
- protected override TlsContext Context
- {
- get { return mTlsClientContext; }
- }
-
- internal override AbstractTlsContext ContextAdmin
- {
- get { return mTlsClientContext; }
- }
-
- protected override TlsPeer Peer
- {
- get { return mTlsClient; }
- }
-
- protected override void HandleHandshakeMessage(byte type, MemoryStream buf)
- {
- if (this.mResumedSession)
- {
- if (type != HandshakeType.finished || this.mConnectionState != CS_SERVER_HELLO)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- ProcessFinishedMessage(buf);
- this.mConnectionState = CS_SERVER_FINISHED;
-
- SendFinishedMessage();
- this.mConnectionState = CS_CLIENT_FINISHED;
-
- CompleteHandshake();
- return;
- }
-
- switch (type)
- {
- case HandshakeType.certificate:
- {
- switch (this.mConnectionState)
- {
- case CS_SERVER_HELLO:
- case CS_SERVER_SUPPLEMENTAL_DATA:
- {
- if (this.mConnectionState == CS_SERVER_HELLO)
- {
- HandleSupplementalData(null);
- }
-
- // Parse the Certificate message and Send to cipher suite
-
- this.mPeerCertificate = Certificate.Parse(buf);
-
- AssertEmpty(buf);
-
- // TODO[RFC 3546] Check whether empty certificates is possible, allowed, or excludes CertificateStatus
- if (this.mPeerCertificate == null || this.mPeerCertificate.IsEmpty)
- {
- this.mAllowCertificateStatus = false;
- }
-
- this.mKeyExchange.ProcessServerCertificate(this.mPeerCertificate);
-
- this.mAuthentication = mTlsClient.GetAuthentication();
- this.mAuthentication.NotifyServerCertificate(this.mPeerCertificate);
-
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- this.mConnectionState = CS_SERVER_CERTIFICATE;
- break;
- }
- case HandshakeType.certificate_status:
- {
- switch (this.mConnectionState)
- {
- case CS_SERVER_CERTIFICATE:
- {
- if (!this.mAllowCertificateStatus)
- {
- /*
- * RFC 3546 3.6. If a server returns a "CertificateStatus" message, then the
- * server MUST have included an extension of type "status_request" with empty
- * "extension_data" in the extended server hello..
- */
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- this.mCertificateStatus = CertificateStatus.Parse(buf);
-
- AssertEmpty(buf);
-
- // TODO[RFC 3546] Figure out how to provide this to the client/authentication.
-
- this.mConnectionState = CS_CERTIFICATE_STATUS;
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- break;
- }
- case HandshakeType.finished:
- {
- switch (this.mConnectionState)
- {
- case CS_CLIENT_FINISHED:
- case CS_SERVER_SESSION_TICKET:
- {
- if (this.mConnectionState == CS_CLIENT_FINISHED && this.mExpectSessionTicket)
- {
- /*
- * RFC 5077 3.3. This message MUST be sent if the server included a
- * SessionTicket extension in the ServerHello.
- */
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- ProcessFinishedMessage(buf);
- this.mConnectionState = CS_SERVER_FINISHED;
-
- CompleteHandshake();
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- break;
- }
- case HandshakeType.server_hello:
- {
- switch (this.mConnectionState)
- {
- case CS_CLIENT_HELLO:
- {
- ReceiveServerHelloMessage(buf);
- this.mConnectionState = CS_SERVER_HELLO;
-
- this.mRecordStream.NotifyHelloComplete();
-
- ApplyMaxFragmentLengthExtension();
-
- if (this.mResumedSession)
- {
- this.mSecurityParameters.masterSecret = Arrays.Clone(this.mSessionParameters.MasterSecret);
- this.mRecordStream.SetPendingConnectionState(Peer.GetCompression(), Peer.GetCipher());
-
- SendChangeCipherSpecMessage();
- }
- else
- {
- InvalidateSession();
-
- if (this.mSelectedSessionID.Length > 0)
- {
- this.mTlsSession = new TlsSessionImpl(this.mSelectedSessionID, null);
- }
- }
-
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- break;
- }
- case HandshakeType.supplemental_data:
- {
- switch (this.mConnectionState)
- {
- case CS_SERVER_HELLO:
- {
- HandleSupplementalData(ReadSupplementalDataMessage(buf));
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- break;
- }
- case HandshakeType.server_hello_done:
- {
- switch (this.mConnectionState)
- {
- case CS_SERVER_HELLO:
- case CS_SERVER_SUPPLEMENTAL_DATA:
- case CS_SERVER_CERTIFICATE:
- case CS_CERTIFICATE_STATUS:
- case CS_SERVER_KEY_EXCHANGE:
- case CS_CERTIFICATE_REQUEST:
- {
- if (mConnectionState < CS_SERVER_SUPPLEMENTAL_DATA)
- {
- HandleSupplementalData(null);
- }
-
- if (mConnectionState < CS_SERVER_CERTIFICATE)
- {
- // There was no server certificate message; check it's OK
- this.mKeyExchange.SkipServerCredentials();
- this.mAuthentication = null;
- }
-
- if (mConnectionState < CS_SERVER_KEY_EXCHANGE)
- {
- // There was no server key exchange message; check it's OK
- this.mKeyExchange.SkipServerKeyExchange();
- }
-
- AssertEmpty(buf);
-
- this.mConnectionState = CS_SERVER_HELLO_DONE;
-
- this.mRecordStream.HandshakeHash.SealHashAlgorithms();
-
- IList clientSupplementalData = mTlsClient.GetClientSupplementalData();
- if (clientSupplementalData != null)
- {
- SendSupplementalDataMessage(clientSupplementalData);
- }
- this.mConnectionState = CS_CLIENT_SUPPLEMENTAL_DATA;
-
- TlsCredentials clientCreds = null;
- if (mCertificateRequest == null)
- {
- this.mKeyExchange.SkipClientCredentials();
- }
- else
- {
- clientCreds = this.mAuthentication.GetClientCredentials(mCertificateRequest);
-
- if (clientCreds == null)
- {
- this.mKeyExchange.SkipClientCredentials();
-
- /*
- * RFC 5246 If no suitable certificate is available, the client MUST Send a
- * certificate message containing no certificates.
- *
- * NOTE: In previous RFCs, this was SHOULD instead of MUST.
- */
- SendCertificateMessage(Certificate.EmptyChain);
- }
- else
- {
- this.mKeyExchange.ProcessClientCredentials(clientCreds);
-
- SendCertificateMessage(clientCreds.Certificate);
- }
- }
-
- this.mConnectionState = CS_CLIENT_CERTIFICATE;
-
- /*
- * Send the client key exchange message, depending on the key exchange we are using
- * in our CipherSuite.
- */
- SendClientKeyExchangeMessage();
- this.mConnectionState = CS_CLIENT_KEY_EXCHANGE;
-
- if (TlsUtilities.IsSsl(Context))
- {
- EstablishMasterSecret(Context, mKeyExchange);
- }
-
- TlsHandshakeHash prepareFinishHash = mRecordStream.PrepareToFinish();
- this.mSecurityParameters.sessionHash = GetCurrentPrfHash(Context, prepareFinishHash, null);
-
- if (!TlsUtilities.IsSsl(Context))
- {
- EstablishMasterSecret(Context, mKeyExchange);
- }
-
- mRecordStream.SetPendingConnectionState(Peer.GetCompression(), Peer.GetCipher());
-
- if (clientCreds != null && clientCreds is TlsSignerCredentials)
- {
- TlsSignerCredentials signerCredentials = (TlsSignerCredentials)clientCreds;
-
- /*
- * RFC 5246 4.7. digitally-signed element needs SignatureAndHashAlgorithm from TLS 1.2
- */
- SignatureAndHashAlgorithm signatureAndHashAlgorithm = TlsUtilities.GetSignatureAndHashAlgorithm(
- Context, signerCredentials);
-
- byte[] hash;
- if (signatureAndHashAlgorithm == null)
- {
- hash = mSecurityParameters.SessionHash;
- }
- else
- {
- hash = prepareFinishHash.GetFinalHash(signatureAndHashAlgorithm.Hash);
- }
-
- byte[] signature = signerCredentials.GenerateCertificateSignature(hash);
- DigitallySigned certificateVerify = new DigitallySigned(signatureAndHashAlgorithm, signature);
- SendCertificateVerifyMessage(certificateVerify);
-
- this.mConnectionState = CS_CERTIFICATE_VERIFY;
- }
-
- SendChangeCipherSpecMessage();
- SendFinishedMessage();
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- this.mConnectionState = CS_CLIENT_FINISHED;
- break;
- }
- case HandshakeType.server_key_exchange:
- {
- switch (this.mConnectionState)
- {
- case CS_SERVER_HELLO:
- case CS_SERVER_SUPPLEMENTAL_DATA:
- case CS_SERVER_CERTIFICATE:
- case CS_CERTIFICATE_STATUS:
- {
- if (mConnectionState < CS_SERVER_SUPPLEMENTAL_DATA)
- {
- HandleSupplementalData(null);
- }
-
- if (mConnectionState < CS_SERVER_CERTIFICATE)
- {
- // There was no server certificate message; check it's OK
- this.mKeyExchange.SkipServerCredentials();
- this.mAuthentication = null;
- }
-
- this.mKeyExchange.ProcessServerKeyExchange(buf);
-
- AssertEmpty(buf);
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- this.mConnectionState = CS_SERVER_KEY_EXCHANGE;
- break;
- }
- case HandshakeType.certificate_request:
- {
- switch (this.mConnectionState)
- {
- case CS_SERVER_CERTIFICATE:
- case CS_CERTIFICATE_STATUS:
- case CS_SERVER_KEY_EXCHANGE:
- {
- if (this.mConnectionState != CS_SERVER_KEY_EXCHANGE)
- {
- // There was no server key exchange message; check it's OK
- this.mKeyExchange.SkipServerKeyExchange();
- }
-
- if (this.mAuthentication == null)
- {
- /*
- * RFC 2246 7.4.4. It is a fatal handshake_failure alert for an anonymous server
- * to request client identification.
- */
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
- }
-
- this.mCertificateRequest = CertificateRequest.Parse(Context, buf);
-
- AssertEmpty(buf);
-
- this.mKeyExchange.ValidateCertificateRequest(this.mCertificateRequest);
-
- /*
- * TODO Give the client a chance to immediately select the CertificateVerify hash
- * algorithm here to avoid tracking the other hash algorithms unnecessarily?
- */
- TlsUtilities.TrackHashAlgorithms(this.mRecordStream.HandshakeHash,
- this.mCertificateRequest.SupportedSignatureAlgorithms);
-
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- this.mConnectionState = CS_CERTIFICATE_REQUEST;
- break;
- }
- case HandshakeType.session_ticket:
- {
- switch (this.mConnectionState)
- {
- case CS_CLIENT_FINISHED:
- {
- if (!this.mExpectSessionTicket)
- {
- /*
- * RFC 5077 3.3. This message MUST NOT be sent if the server did not include a
- * SessionTicket extension in the ServerHello.
- */
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- /*
- * RFC 5077 3.4. If the client receives a session ticket from the server, then it
- * discards any Session ID that was sent in the ServerHello.
- */
- InvalidateSession();
-
- ReceiveNewSessionTicketMessage(buf);
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- this.mConnectionState = CS_SERVER_SESSION_TICKET;
- break;
- }
- case HandshakeType.hello_request:
- {
- AssertEmpty(buf);
-
- /*
- * RFC 2246 7.4.1.1 Hello request This message will be ignored by the client if the
- * client is currently negotiating a session. This message may be ignored by the client
- * if it does not wish to renegotiate a session, or the client may, if it wishes,
- * respond with a no_renegotiation alert.
- */
- if (this.mConnectionState == CS_END)
- {
- RefuseRenegotiation();
- }
- break;
- }
- case HandshakeType.client_hello:
- case HandshakeType.client_key_exchange:
- case HandshakeType.certificate_verify:
- case HandshakeType.hello_verify_request:
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- }
-
- protected virtual void HandleSupplementalData(IList serverSupplementalData)
- {
- this.mTlsClient.ProcessServerSupplementalData(serverSupplementalData);
- this.mConnectionState = CS_SERVER_SUPPLEMENTAL_DATA;
-
- this.mKeyExchange = mTlsClient.GetKeyExchange();
- this.mKeyExchange.Init(Context);
- }
-
- protected virtual void ReceiveNewSessionTicketMessage(MemoryStream buf)
- {
- NewSessionTicket newSessionTicket = NewSessionTicket.Parse(buf);
-
- AssertEmpty(buf);
-
- mTlsClient.NotifyNewSessionTicket(newSessionTicket);
- }
-
- protected virtual void ReceiveServerHelloMessage(MemoryStream buf)
- {
- {
- ProtocolVersion server_version = TlsUtilities.ReadVersion(buf);
- if (server_version.IsDtls)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- // Check that this matches what the server is Sending in the record layer
- if (!server_version.Equals(this.mRecordStream.ReadVersion))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- ProtocolVersion client_version = Context.ClientVersion;
- if (!server_version.IsEqualOrEarlierVersionOf(client_version))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- this.mRecordStream.SetWriteVersion(server_version);
- ContextAdmin.SetServerVersion(server_version);
- this.mTlsClient.NotifyServerVersion(server_version);
- }
-
- /*
- * Read the server random
- */
- this.mSecurityParameters.serverRandom = TlsUtilities.ReadFully(32, buf);
-
- this.mSelectedSessionID = TlsUtilities.ReadOpaque8(buf);
- if (this.mSelectedSessionID.Length > 32)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- this.mTlsClient.NotifySessionID(this.mSelectedSessionID);
- this.mResumedSession = this.mSelectedSessionID.Length > 0 && this.mTlsSession != null
- && Arrays.AreEqual(this.mSelectedSessionID, this.mTlsSession.SessionID);
-
- /*
- * Find out which CipherSuite the server has chosen and check that it was one of the offered
- * ones, and is a valid selection for the negotiated version.
- */
- int selectedCipherSuite = TlsUtilities.ReadUint16(buf);
- if (!Arrays.Contains(this.mOfferedCipherSuites, selectedCipherSuite)
- || selectedCipherSuite == CipherSuite.TLS_NULL_WITH_NULL_NULL
- || CipherSuite.IsScsv(selectedCipherSuite)
- || !TlsUtilities.IsValidCipherSuiteForVersion(selectedCipherSuite, Context.ServerVersion))
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- this.mTlsClient.NotifySelectedCipherSuite(selectedCipherSuite);
-
- /*
- * Find out which CompressionMethod the server has chosen and check that it was one of the
- * offered ones.
- */
- byte selectedCompressionMethod = TlsUtilities.ReadUint8(buf);
- if (!Arrays.Contains(this.mOfferedCompressionMethods, selectedCompressionMethod))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- this.mTlsClient.NotifySelectedCompressionMethod(selectedCompressionMethod);
-
- /*
- * RFC3546 2.2 The extended server hello message format MAY be sent in place of the server
- * hello message when the client has requested extended functionality via the extended
- * client hello message specified in Section 2.1. ... Note that the extended server hello
- * message is only sent in response to an extended client hello message. This prevents the
- * possibility that the extended server hello message could "break" existing TLS 1.0
- * clients.
- */
- this.mServerExtensions = ReadExtensions(buf);
-
- /*
- * RFC 3546 2.2 Note that the extended server hello message is only sent in response to an
- * extended client hello message.
- *
- * However, see RFC 5746 exception below. We always include the SCSV, so an Extended Server
- * Hello is always allowed.
- */
- if (this.mServerExtensions != null)
- {
- foreach (int extType in this.mServerExtensions.Keys)
- {
- /*
- * RFC 5746 3.6. Note that Sending a "renegotiation_info" extension in response to a
- * ClientHello containing only the SCSV is an explicit exception to the prohibition
- * in RFC 5246, Section 7.4.1.4, on the server Sending unsolicited extensions and is
- * only allowed because the client is signaling its willingness to receive the
- * extension via the TLS_EMPTY_RENEGOTIATION_INFO_SCSV SCSV.
- */
- if (extType == ExtensionType.renegotiation_info)
- continue;
-
- /*
- * RFC 5246 7.4.1.4 An extension type MUST NOT appear in the ServerHello unless the
- * same extension type appeared in the corresponding ClientHello. If a client
- * receives an extension type in ServerHello that it did not request in the
- * associated ClientHello, it MUST abort the handshake with an unsupported_extension
- * fatal alert.
- */
- if (null == TlsUtilities.GetExtensionData(this.mClientExtensions, extType))
- throw new TlsFatalAlert(AlertDescription.unsupported_extension);
-
- /*
- * RFC 3546 2.3. If [...] the older session is resumed, then the server MUST ignore
- * extensions appearing in the client hello, and Send a server hello containing no
- * extensions[.]
- */
- if (this.mResumedSession)
- {
- // TODO[compat-gnutls] GnuTLS test server Sends server extensions e.g. ec_point_formats
- // TODO[compat-openssl] OpenSSL test server Sends server extensions e.g. ec_point_formats
- // TODO[compat-polarssl] PolarSSL test server Sends server extensions e.g. ec_point_formats
- // throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
- }
-
- /*
- * RFC 5746 3.4. Client Behavior: Initial Handshake
- */
- {
- /*
- * When a ServerHello is received, the client MUST check if it includes the
- * "renegotiation_info" extension:
- */
- byte[] renegExtData = TlsUtilities.GetExtensionData(this.mServerExtensions, ExtensionType.renegotiation_info);
- if (renegExtData != null)
- {
- /*
- * If the extension is present, set the secure_renegotiation flag to TRUE. The
- * client MUST then verify that the length of the "renegotiated_connection"
- * field is zero, and if it is not, MUST abort the handshake (by Sending a fatal
- * handshake_failure alert).
- */
- this.mSecureRenegotiation = true;
-
- if (!Arrays.ConstantTimeAreEqual(renegExtData, CreateRenegotiationInfo(TlsUtilities.EmptyBytes)))
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
- }
- }
-
- // TODO[compat-gnutls] GnuTLS test server fails to Send renegotiation_info extension when resuming
- this.mTlsClient.NotifySecureRenegotiation(this.mSecureRenegotiation);
-
- IDictionary sessionClientExtensions = mClientExtensions, sessionServerExtensions = mServerExtensions;
- if (this.mResumedSession)
- {
- if (selectedCipherSuite != this.mSessionParameters.CipherSuite
- || selectedCompressionMethod != this.mSessionParameters.CompressionAlgorithm)
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- sessionClientExtensions = null;
- sessionServerExtensions = this.mSessionParameters.ReadServerExtensions();
- }
-
- this.mSecurityParameters.cipherSuite = selectedCipherSuite;
- this.mSecurityParameters.compressionAlgorithm = selectedCompressionMethod;
-
- if (sessionServerExtensions != null)
- {
- {
- /*
- * RFC 7366 3. If a server receives an encrypt-then-MAC request extension from a client
- * and then selects a stream or Authenticated Encryption with Associated Data (AEAD)
- * ciphersuite, it MUST NOT send an encrypt-then-MAC response extension back to the
- * client.
- */
- bool serverSentEncryptThenMAC = TlsExtensionsUtilities.HasEncryptThenMacExtension(sessionServerExtensions);
- if (serverSentEncryptThenMAC && !TlsUtilities.IsBlockCipherSuite(selectedCipherSuite))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- this.mSecurityParameters.encryptThenMac = serverSentEncryptThenMAC;
- }
-
- this.mSecurityParameters.extendedMasterSecret = TlsExtensionsUtilities.HasExtendedMasterSecretExtension(sessionServerExtensions);
-
- this.mSecurityParameters.maxFragmentLength = ProcessMaxFragmentLengthExtension(sessionClientExtensions,
- sessionServerExtensions, AlertDescription.illegal_parameter);
-
- this.mSecurityParameters.truncatedHMac = TlsExtensionsUtilities.HasTruncatedHMacExtension(sessionServerExtensions);
-
- /*
- * TODO It's surprising that there's no provision to allow a 'fresh' CertificateStatus to be sent in
- * a session resumption handshake.
- */
- this.mAllowCertificateStatus = !this.mResumedSession
- && TlsUtilities.HasExpectedEmptyExtensionData(sessionServerExtensions, ExtensionType.status_request,
- AlertDescription.illegal_parameter);
-
- this.mExpectSessionTicket = !this.mResumedSession
- && TlsUtilities.HasExpectedEmptyExtensionData(sessionServerExtensions, ExtensionType.session_ticket,
- AlertDescription.illegal_parameter);
- }
-
- /*
- * TODO[session-hash]
- *
- * draft-ietf-tls-session-hash-04 4. Clients and servers SHOULD NOT accept handshakes
- * that do not use the extended master secret [..]. (and see 5.2, 5.3)
- */
-
- if (sessionClientExtensions != null)
- {
- this.mTlsClient.ProcessServerExtensions(sessionServerExtensions);
- }
-
- this.mSecurityParameters.prfAlgorithm = GetPrfAlgorithm(Context, this.mSecurityParameters.CipherSuite);
-
- /*
- * RFC 5246 7.4.9. Any cipher suite which does not explicitly specify
- * verify_data_length has a verify_data_length equal to 12. This includes all
- * existing cipher suites.
- */
- this.mSecurityParameters.verifyDataLength = 12;
- }
-
- protected virtual void SendCertificateVerifyMessage(DigitallySigned certificateVerify)
- {
- HandshakeMessage message = new HandshakeMessage(HandshakeType.certificate_verify);
-
- certificateVerify.Encode(message);
-
- message.WriteToRecordStream(this);
- }
-
- protected virtual void SendClientHelloMessage()
- {
- this.mRecordStream.SetWriteVersion(this.mTlsClient.ClientHelloRecordLayerVersion);
-
- ProtocolVersion client_version = this.mTlsClient.ClientVersion;
- if (client_version.IsDtls)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- ContextAdmin.SetClientVersion(client_version);
-
- /*
- * TODO RFC 5077 3.4. When presenting a ticket, the client MAY generate and include a
- * Session ID in the TLS ClientHello.
- */
- byte[] session_id = TlsUtilities.EmptyBytes;
- if (this.mTlsSession != null)
- {
- session_id = this.mTlsSession.SessionID;
- if (session_id == null || session_id.Length > 32)
- {
- session_id = TlsUtilities.EmptyBytes;
- }
- }
-
- bool fallback = this.mTlsClient.IsFallback;
-
- this.mOfferedCipherSuites = this.mTlsClient.GetCipherSuites();
-
- this.mOfferedCompressionMethods = this.mTlsClient.GetCompressionMethods();
-
- if (session_id.Length > 0 && this.mSessionParameters != null)
- {
- if (!Arrays.Contains(this.mOfferedCipherSuites, mSessionParameters.CipherSuite)
- || !Arrays.Contains(this.mOfferedCompressionMethods, mSessionParameters.CompressionAlgorithm))
- {
- session_id = TlsUtilities.EmptyBytes;
- }
- }
-
- this.mClientExtensions = this.mTlsClient.GetClientExtensions();
-
- HandshakeMessage message = new HandshakeMessage(HandshakeType.client_hello);
-
- TlsUtilities.WriteVersion(client_version, message);
-
- message.Write(this.mSecurityParameters.ClientRandom);
-
- TlsUtilities.WriteOpaque8(session_id, message);
-
- // Cipher Suites (and SCSV)
- {
- /*
- * RFC 5746 3.4. The client MUST include either an empty "renegotiation_info" extension,
- * or the TLS_EMPTY_RENEGOTIATION_INFO_SCSV signaling cipher suite value in the
- * ClientHello. Including both is NOT RECOMMENDED.
- */
- byte[] renegExtData = TlsUtilities.GetExtensionData(mClientExtensions, ExtensionType.renegotiation_info);
- bool noRenegExt = (null == renegExtData);
-
- bool noRenegScsv = !Arrays.Contains(mOfferedCipherSuites, CipherSuite.TLS_EMPTY_RENEGOTIATION_INFO_SCSV);
-
- if (noRenegExt && noRenegScsv)
- {
- // TODO Consider whether to default to a client extension instead
- // this.mClientExtensions = TlsExtensionsUtilities.EnsureExtensionsInitialised(this.mClientExtensions);
- // this.mClientExtensions[ExtensionType.renegotiation_info] = CreateRenegotiationInfo(TlsUtilities.EmptyBytes);
- this.mOfferedCipherSuites = Arrays.Append(mOfferedCipherSuites, CipherSuite.TLS_EMPTY_RENEGOTIATION_INFO_SCSV);
- }
-
- /*
- * RFC 7507 4. If a client sends a ClientHello.client_version containing a lower value
- * than the latest (highest-valued) version supported by the client, it SHOULD include
- * the TLS_FALLBACK_SCSV cipher suite value in ClientHello.cipher_suites [..]. (The
- * client SHOULD put TLS_FALLBACK_SCSV after all cipher suites that it actually intends
- * to negotiate.)
- */
- if (fallback && !Arrays.Contains(mOfferedCipherSuites, CipherSuite.TLS_FALLBACK_SCSV))
- {
- this.mOfferedCipherSuites = Arrays.Append(mOfferedCipherSuites, CipherSuite.TLS_FALLBACK_SCSV);
- }
-
- TlsUtilities.WriteUint16ArrayWithUint16Length(mOfferedCipherSuites, message);
- }
-
- TlsUtilities.WriteUint8ArrayWithUint8Length(mOfferedCompressionMethods, message);
-
- if (mClientExtensions != null)
- {
- WriteExtensions(message, mClientExtensions);
- }
-
- message.WriteToRecordStream(this);
- }
-
- protected virtual void SendClientKeyExchangeMessage()
- {
- HandshakeMessage message = new HandshakeMessage(HandshakeType.client_key_exchange);
-
- this.mKeyExchange.GenerateClientKeyExchange(message);
-
- message.WriteToRecordStream(this);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsCompression.cs b/BCCrypto/src/crypto/tls/TlsCompression.cs
deleted file mode 100644
index 177d64b..0000000
--- a/BCCrypto/src/crypto/tls/TlsCompression.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsCompression
- {
- Stream Compress(Stream output);
-
- Stream Decompress(Stream output);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsContext.cs b/BCCrypto/src/crypto/tls/TlsContext.cs
deleted file mode 100644
index d066723..0000000
--- a/BCCrypto/src/crypto/tls/TlsContext.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Prng;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsContext
- {
- IRandomGenerator NonceRandomGenerator { get; }
-
- SecureRandom SecureRandom { get; }
-
- SecurityParameters SecurityParameters { get; }
-
- bool IsServer { get; }
-
- ProtocolVersion ClientVersion { get; }
-
- ProtocolVersion ServerVersion { get; }
-
- /**
- * Used to get the resumable session, if any, used by this connection. Only available after the
- * handshake has successfully completed.
- *
- * @return A {@link TlsSession} representing the resumable session used by this connection, or
- * null if no resumable session available.
- * @see TlsPeer#NotifyHandshakeComplete()
- */
- TlsSession ResumableSession { get; }
-
- object UserObject { get; set; }
-
- /**
- * Export keying material according to RFC 5705: "Keying Material Exporters for TLS".
- *
- * @param asciiLabel indicates which application will use the exported keys.
- * @param context_value allows the application using the exporter to mix its own data with the TLS PRF for
- * the exporter output.
- * @param length the number of bytes to generate
- * @return a pseudorandom bit string of 'length' bytes generated from the master_secret.
- */
- byte[] ExportKeyingMaterial(string asciiLabel, byte[] context_value, int length);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsCredentials.cs b/BCCrypto/src/crypto/tls/TlsCredentials.cs
deleted file mode 100644
index 5c5f1c0..0000000
--- a/BCCrypto/src/crypto/tls/TlsCredentials.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsCredentials
- {
- Certificate Certificate { get; }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsDHKeyExchange.cs b/BCCrypto/src/crypto/tls/TlsDHKeyExchange.cs
deleted file mode 100644
index d179068..0000000
--- a/BCCrypto/src/crypto/tls/TlsDHKeyExchange.cs
+++ /dev/null
@@ -1,259 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// (D)TLS DH key exchange.
- public class TlsDHKeyExchange
- : AbstractTlsKeyExchange
- {
- protected TlsSigner mTlsSigner;
- protected DHParameters mDHParameters;
-
- protected AsymmetricKeyParameter mServerPublicKey;
- protected TlsAgreementCredentials mAgreementCredentials;
-
- protected DHPrivateKeyParameters mDHAgreePrivateKey;
- protected DHPublicKeyParameters mDHAgreePublicKey;
-
- public TlsDHKeyExchange(int keyExchange, IList supportedSignatureAlgorithms, DHParameters dhParameters)
- : base(keyExchange, supportedSignatureAlgorithms)
- {
- switch (keyExchange)
- {
- case KeyExchangeAlgorithm.DH_anon:
- case KeyExchangeAlgorithm.DH_RSA:
- case KeyExchangeAlgorithm.DH_DSS:
- this.mTlsSigner = null;
- break;
- case KeyExchangeAlgorithm.DHE_RSA:
- this.mTlsSigner = new TlsRsaSigner();
- break;
- case KeyExchangeAlgorithm.DHE_DSS:
- this.mTlsSigner = new TlsDssSigner();
- break;
- default:
- throw new InvalidOperationException("unsupported key exchange algorithm");
- }
-
- this.mDHParameters = dhParameters;
- }
-
- public override void Init(TlsContext context)
- {
- base.Init(context);
-
- if (this.mTlsSigner != null)
- {
- this.mTlsSigner.Init(context);
- }
- }
-
- public override void SkipServerCredentials()
- {
- if (mKeyExchange != KeyExchangeAlgorithm.DH_anon)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- public override void ProcessServerCertificate(Certificate serverCertificate)
- {
- if (mKeyExchange == KeyExchangeAlgorithm.DH_anon)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- if (serverCertificate.IsEmpty)
- throw new TlsFatalAlert(AlertDescription.bad_certificate);
-
- X509CertificateStructure x509Cert = serverCertificate.GetCertificateAt(0);
-
- SubjectPublicKeyInfo keyInfo = x509Cert.SubjectPublicKeyInfo;
- try
- {
- this.mServerPublicKey = PublicKeyFactory.CreateKey(keyInfo);
- }
- catch (Exception e)
- {
- throw new TlsFatalAlert(AlertDescription.unsupported_certificate, e);
- }
-
- if (mTlsSigner == null)
- {
- try
- {
- this.mDHAgreePublicKey = TlsDHUtilities.ValidateDHPublicKey((DHPublicKeyParameters)this.mServerPublicKey);
- this.mDHParameters = ValidateDHParameters(mDHAgreePublicKey.Parameters);
- }
- catch (InvalidCastException e)
- {
- throw new TlsFatalAlert(AlertDescription.certificate_unknown, e);
- }
-
- TlsUtilities.ValidateKeyUsage(x509Cert, KeyUsage.KeyAgreement);
- }
- else
- {
- if (!mTlsSigner.IsValidPublicKey(this.mServerPublicKey))
- {
- throw new TlsFatalAlert(AlertDescription.certificate_unknown);
- }
-
- TlsUtilities.ValidateKeyUsage(x509Cert, KeyUsage.DigitalSignature);
- }
-
- base.ProcessServerCertificate(serverCertificate);
- }
-
- public override bool RequiresServerKeyExchange
- {
- get
- {
- switch (mKeyExchange)
- {
- case KeyExchangeAlgorithm.DH_anon:
- case KeyExchangeAlgorithm.DHE_DSS:
- case KeyExchangeAlgorithm.DHE_RSA:
- return true;
- default:
- return false;
- }
- }
- }
-
- public override byte[] GenerateServerKeyExchange()
- {
- if (!RequiresServerKeyExchange)
- return null;
-
- // DH_anon is handled here, DHE_* in a subclass
-
- MemoryStream buf = new MemoryStream();
- this.mDHAgreePrivateKey = TlsDHUtilities.GenerateEphemeralServerKeyExchange(mContext.SecureRandom,
- this.mDHParameters, buf);
- return buf.ToArray();
- }
-
- public override void ProcessServerKeyExchange(Stream input)
- {
- if (!RequiresServerKeyExchange)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- // DH_anon is handled here, DHE_* in a subclass
-
- ServerDHParams dhParams = ServerDHParams.Parse(input);
-
- this.mDHAgreePublicKey = TlsDHUtilities.ValidateDHPublicKey(dhParams.PublicKey);
- this.mDHParameters = ValidateDHParameters(mDHAgreePublicKey.Parameters);
- }
-
- public override void ValidateCertificateRequest(CertificateRequest certificateRequest)
- {
- if (mKeyExchange == KeyExchangeAlgorithm.DH_anon)
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
-
- byte[] types = certificateRequest.CertificateTypes;
- for (int i = 0; i < types.Length; ++i)
- {
- switch (types[i])
- {
- case ClientCertificateType.rsa_sign:
- case ClientCertificateType.dss_sign:
- case ClientCertificateType.rsa_fixed_dh:
- case ClientCertificateType.dss_fixed_dh:
- case ClientCertificateType.ecdsa_sign:
- break;
- default:
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
- }
-
- public override void ProcessClientCredentials(TlsCredentials clientCredentials)
- {
- if (mKeyExchange == KeyExchangeAlgorithm.DH_anon)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- if (clientCredentials is TlsAgreementCredentials)
- {
- // TODO Validate client cert has matching parameters (see 'areCompatibleParameters')?
-
- this.mAgreementCredentials = (TlsAgreementCredentials)clientCredentials;
- }
- else if (clientCredentials is TlsSignerCredentials)
- {
- // OK
- }
- else
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public override void GenerateClientKeyExchange(Stream output)
- {
- /*
- * RFC 2246 7.4.7.2 If the client certificate already contains a suitable Diffie-Hellman
- * key, then Yc is implicit and does not need to be sent again. In this case, the Client Key
- * Exchange message will be sent, but will be empty.
- */
- if (mAgreementCredentials == null)
- {
- this.mDHAgreePrivateKey = TlsDHUtilities.GenerateEphemeralClientKeyExchange(mContext.SecureRandom,
- mDHParameters, output);
- }
- }
-
- public override void ProcessClientCertificate(Certificate clientCertificate)
- {
- if (mKeyExchange == KeyExchangeAlgorithm.DH_anon)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- // TODO Extract the public key
- // TODO If the certificate is 'fixed', take the public key as dhAgreePublicKey
- }
-
- public override void ProcessClientKeyExchange(Stream input)
- {
- if (mDHAgreePublicKey != null)
- {
- // For dss_fixed_dh and rsa_fixed_dh, the key arrived in the client certificate
- return;
- }
-
- BigInteger Yc = TlsDHUtilities.ReadDHParameter(input);
-
- this.mDHAgreePublicKey = TlsDHUtilities.ValidateDHPublicKey(new DHPublicKeyParameters(Yc, mDHParameters));
- }
-
- public override byte[] GeneratePremasterSecret()
- {
- if (mAgreementCredentials != null)
- {
- return mAgreementCredentials.GenerateAgreement(mDHAgreePublicKey);
- }
-
- if (mDHAgreePrivateKey != null)
- {
- return TlsDHUtilities.CalculateDHBasicAgreement(mDHAgreePublicKey, mDHAgreePrivateKey);
- }
-
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- protected virtual int MinimumPrimeBits
- {
- get { return 1024; }
- }
-
- protected virtual DHParameters ValidateDHParameters(DHParameters parameters)
- {
- if (parameters.P.BitLength < MinimumPrimeBits)
- throw new TlsFatalAlert(AlertDescription.insufficient_security);
-
- return TlsDHUtilities.ValidateDHParameters(parameters);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsDHUtilities.cs b/BCCrypto/src/crypto/tls/TlsDHUtilities.cs
deleted file mode 100644
index 6df61cb..0000000
--- a/BCCrypto/src/crypto/tls/TlsDHUtilities.cs
+++ /dev/null
@@ -1,462 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Agreement;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class TlsDHUtilities
- {
- internal static readonly BigInteger Two = BigInteger.Two;
-
- /*
- * TODO[draft-ietf-tls-negotiated-ff-dhe-01] Move these groups to DHStandardGroups once reaches RFC
- */
- private static BigInteger FromHex(String hex)
- {
- return new BigInteger(1, Hex.Decode(hex));
- }
-
- private static DHParameters FromSafeP(String hexP)
- {
- BigInteger p = FromHex(hexP), q = p.ShiftRight(1);
- return new DHParameters(p, Two, q);
- }
-
- private static readonly string draft_ffdhe2432_p =
- "FFFFFFFFFFFFFFFFADF85458A2BB4A9AAFDC5620273D3CF1"
- + "D8B9C583CE2D3695A9E13641146433FBCC939DCE249B3EF9"
- + "7D2FE363630C75D8F681B202AEC4617AD3DF1ED5D5FD6561"
- + "2433F51F5F066ED0856365553DED1AF3B557135E7F57C935"
- + "984F0C70E0E68B77E2A689DAF3EFE8721DF158A136ADE735"
- + "30ACCA4F483A797ABC0AB182B324FB61D108A94BB2C8E3FB"
- + "B96ADAB760D7F4681D4F42A3DE394DF4AE56EDE76372BB19"
- + "0B07A7C8EE0A6D709E02FCE1CDF7E2ECC03404CD28342F61"
- + "9172FE9CE98583FF8E4F1232EEF28183C3FE3B1B4C6FAD73"
- + "3BB5FCBC2EC22005C58EF1837D1683B2C6F34A26C1B2EFFA"
- + "886B4238611FCFDCDE355B3B6519035BBC34F4DEF99C0238"
- + "61B46FC9D6E6C9077AD91D2691F7F7EE598CB0FAC186D91C"
- + "AEFE13098533C8B3FFFFFFFFFFFFFFFF";
- internal static readonly DHParameters draft_ffdhe2432 = FromSafeP(draft_ffdhe2432_p);
-
- private static readonly string draft_ffdhe3072_p =
- "FFFFFFFFFFFFFFFFADF85458A2BB4A9AAFDC5620273D3CF1"
- + "D8B9C583CE2D3695A9E13641146433FBCC939DCE249B3EF9"
- + "7D2FE363630C75D8F681B202AEC4617AD3DF1ED5D5FD6561"
- + "2433F51F5F066ED0856365553DED1AF3B557135E7F57C935"
- + "984F0C70E0E68B77E2A689DAF3EFE8721DF158A136ADE735"
- + "30ACCA4F483A797ABC0AB182B324FB61D108A94BB2C8E3FB"
- + "B96ADAB760D7F4681D4F42A3DE394DF4AE56EDE76372BB19"
- + "0B07A7C8EE0A6D709E02FCE1CDF7E2ECC03404CD28342F61"
- + "9172FE9CE98583FF8E4F1232EEF28183C3FE3B1B4C6FAD73"
- + "3BB5FCBC2EC22005C58EF1837D1683B2C6F34A26C1B2EFFA"
- + "886B4238611FCFDCDE355B3B6519035BBC34F4DEF99C0238"
- + "61B46FC9D6E6C9077AD91D2691F7F7EE598CB0FAC186D91C"
- + "AEFE130985139270B4130C93BC437944F4FD4452E2D74DD3"
- + "64F2E21E71F54BFF5CAE82AB9C9DF69EE86D2BC522363A0D"
- + "ABC521979B0DEADA1DBF9A42D5C4484E0ABCD06BFA53DDEF"
- + "3C1B20EE3FD59D7C25E41D2B66C62E37FFFFFFFFFFFFFFFF";
- internal static readonly DHParameters draft_ffdhe3072 = FromSafeP(draft_ffdhe3072_p);
-
- private static readonly string draft_ffdhe4096_p =
- "FFFFFFFFFFFFFFFFADF85458A2BB4A9AAFDC5620273D3CF1"
- + "D8B9C583CE2D3695A9E13641146433FBCC939DCE249B3EF9"
- + "7D2FE363630C75D8F681B202AEC4617AD3DF1ED5D5FD6561"
- + "2433F51F5F066ED0856365553DED1AF3B557135E7F57C935"
- + "984F0C70E0E68B77E2A689DAF3EFE8721DF158A136ADE735"
- + "30ACCA4F483A797ABC0AB182B324FB61D108A94BB2C8E3FB"
- + "B96ADAB760D7F4681D4F42A3DE394DF4AE56EDE76372BB19"
- + "0B07A7C8EE0A6D709E02FCE1CDF7E2ECC03404CD28342F61"
- + "9172FE9CE98583FF8E4F1232EEF28183C3FE3B1B4C6FAD73"
- + "3BB5FCBC2EC22005C58EF1837D1683B2C6F34A26C1B2EFFA"
- + "886B4238611FCFDCDE355B3B6519035BBC34F4DEF99C0238"
- + "61B46FC9D6E6C9077AD91D2691F7F7EE598CB0FAC186D91C"
- + "AEFE130985139270B4130C93BC437944F4FD4452E2D74DD3"
- + "64F2E21E71F54BFF5CAE82AB9C9DF69EE86D2BC522363A0D"
- + "ABC521979B0DEADA1DBF9A42D5C4484E0ABCD06BFA53DDEF"
- + "3C1B20EE3FD59D7C25E41D2B669E1EF16E6F52C3164DF4FB"
- + "7930E9E4E58857B6AC7D5F42D69F6D187763CF1D55034004"
- + "87F55BA57E31CC7A7135C886EFB4318AED6A1E012D9E6832"
- + "A907600A918130C46DC778F971AD0038092999A333CB8B7A"
- + "1A1DB93D7140003C2A4ECEA9F98D0ACC0A8291CDCEC97DCF"
- + "8EC9B55A7F88A46B4DB5A851F44182E1C68A007E5E655F6A"
- + "FFFFFFFFFFFFFFFF";
- internal static readonly DHParameters draft_ffdhe4096 = FromSafeP(draft_ffdhe4096_p);
-
- private static readonly string draft_ffdhe6144_p =
- "FFFFFFFFFFFFFFFFADF85458A2BB4A9AAFDC5620273D3CF1"
- + "D8B9C583CE2D3695A9E13641146433FBCC939DCE249B3EF9"
- + "7D2FE363630C75D8F681B202AEC4617AD3DF1ED5D5FD6561"
- + "2433F51F5F066ED0856365553DED1AF3B557135E7F57C935"
- + "984F0C70E0E68B77E2A689DAF3EFE8721DF158A136ADE735"
- + "30ACCA4F483A797ABC0AB182B324FB61D108A94BB2C8E3FB"
- + "B96ADAB760D7F4681D4F42A3DE394DF4AE56EDE76372BB19"
- + "0B07A7C8EE0A6D709E02FCE1CDF7E2ECC03404CD28342F61"
- + "9172FE9CE98583FF8E4F1232EEF28183C3FE3B1B4C6FAD73"
- + "3BB5FCBC2EC22005C58EF1837D1683B2C6F34A26C1B2EFFA"
- + "886B4238611FCFDCDE355B3B6519035BBC34F4DEF99C0238"
- + "61B46FC9D6E6C9077AD91D2691F7F7EE598CB0FAC186D91C"
- + "AEFE130985139270B4130C93BC437944F4FD4452E2D74DD3"
- + "64F2E21E71F54BFF5CAE82AB9C9DF69EE86D2BC522363A0D"
- + "ABC521979B0DEADA1DBF9A42D5C4484E0ABCD06BFA53DDEF"
- + "3C1B20EE3FD59D7C25E41D2B669E1EF16E6F52C3164DF4FB"
- + "7930E9E4E58857B6AC7D5F42D69F6D187763CF1D55034004"
- + "87F55BA57E31CC7A7135C886EFB4318AED6A1E012D9E6832"
- + "A907600A918130C46DC778F971AD0038092999A333CB8B7A"
- + "1A1DB93D7140003C2A4ECEA9F98D0ACC0A8291CDCEC97DCF"
- + "8EC9B55A7F88A46B4DB5A851F44182E1C68A007E5E0DD902"
- + "0BFD64B645036C7A4E677D2C38532A3A23BA4442CAF53EA6"
- + "3BB454329B7624C8917BDD64B1C0FD4CB38E8C334C701C3A"
- + "CDAD0657FCCFEC719B1F5C3E4E46041F388147FB4CFDB477"
- + "A52471F7A9A96910B855322EDB6340D8A00EF092350511E3"
- + "0ABEC1FFF9E3A26E7FB29F8C183023C3587E38DA0077D9B4"
- + "763E4E4B94B2BBC194C6651E77CAF992EEAAC0232A281BF6"
- + "B3A739C1226116820AE8DB5847A67CBEF9C9091B462D538C"
- + "D72B03746AE77F5E62292C311562A846505DC82DB854338A"
- + "E49F5235C95B91178CCF2DD5CACEF403EC9D1810C6272B04"
- + "5B3B71F9DC6B80D63FDD4A8E9ADB1E6962A69526D43161C1"
- + "A41D570D7938DAD4A40E329CD0E40E65FFFFFFFFFFFFFFFF";
- internal static readonly DHParameters draft_ffdhe6144 = FromSafeP(draft_ffdhe6144_p);
-
- private static readonly string draft_ffdhe8192_p =
- "FFFFFFFFFFFFFFFFADF85458A2BB4A9AAFDC5620273D3CF1"
- + "D8B9C583CE2D3695A9E13641146433FBCC939DCE249B3EF9"
- + "7D2FE363630C75D8F681B202AEC4617AD3DF1ED5D5FD6561"
- + "2433F51F5F066ED0856365553DED1AF3B557135E7F57C935"
- + "984F0C70E0E68B77E2A689DAF3EFE8721DF158A136ADE735"
- + "30ACCA4F483A797ABC0AB182B324FB61D108A94BB2C8E3FB"
- + "B96ADAB760D7F4681D4F42A3DE394DF4AE56EDE76372BB19"
- + "0B07A7C8EE0A6D709E02FCE1CDF7E2ECC03404CD28342F61"
- + "9172FE9CE98583FF8E4F1232EEF28183C3FE3B1B4C6FAD73"
- + "3BB5FCBC2EC22005C58EF1837D1683B2C6F34A26C1B2EFFA"
- + "886B4238611FCFDCDE355B3B6519035BBC34F4DEF99C0238"
- + "61B46FC9D6E6C9077AD91D2691F7F7EE598CB0FAC186D91C"
- + "AEFE130985139270B4130C93BC437944F4FD4452E2D74DD3"
- + "64F2E21E71F54BFF5CAE82AB9C9DF69EE86D2BC522363A0D"
- + "ABC521979B0DEADA1DBF9A42D5C4484E0ABCD06BFA53DDEF"
- + "3C1B20EE3FD59D7C25E41D2B669E1EF16E6F52C3164DF4FB"
- + "7930E9E4E58857B6AC7D5F42D69F6D187763CF1D55034004"
- + "87F55BA57E31CC7A7135C886EFB4318AED6A1E012D9E6832"
- + "A907600A918130C46DC778F971AD0038092999A333CB8B7A"
- + "1A1DB93D7140003C2A4ECEA9F98D0ACC0A8291CDCEC97DCF"
- + "8EC9B55A7F88A46B4DB5A851F44182E1C68A007E5E0DD902"
- + "0BFD64B645036C7A4E677D2C38532A3A23BA4442CAF53EA6"
- + "3BB454329B7624C8917BDD64B1C0FD4CB38E8C334C701C3A"
- + "CDAD0657FCCFEC719B1F5C3E4E46041F388147FB4CFDB477"
- + "A52471F7A9A96910B855322EDB6340D8A00EF092350511E3"
- + "0ABEC1FFF9E3A26E7FB29F8C183023C3587E38DA0077D9B4"
- + "763E4E4B94B2BBC194C6651E77CAF992EEAAC0232A281BF6"
- + "B3A739C1226116820AE8DB5847A67CBEF9C9091B462D538C"
- + "D72B03746AE77F5E62292C311562A846505DC82DB854338A"
- + "E49F5235C95B91178CCF2DD5CACEF403EC9D1810C6272B04"
- + "5B3B71F9DC6B80D63FDD4A8E9ADB1E6962A69526D43161C1"
- + "A41D570D7938DAD4A40E329CCFF46AAA36AD004CF600C838"
- + "1E425A31D951AE64FDB23FCEC9509D43687FEB69EDD1CC5E"
- + "0B8CC3BDF64B10EF86B63142A3AB8829555B2F747C932665"
- + "CB2C0F1CC01BD70229388839D2AF05E454504AC78B758282"
- + "2846C0BA35C35F5C59160CC046FD8251541FC68C9C86B022"
- + "BB7099876A460E7451A8A93109703FEE1C217E6C3826E52C"
- + "51AA691E0E423CFC99E9E31650C1217B624816CDAD9A95F9"
- + "D5B8019488D9C0A0A1FE3075A577E23183F81D4A3F2FA457"
- + "1EFC8CE0BA8A4FE8B6855DFE72B0A66EDED2FBABFBE58A30"
- + "FAFABE1C5D71A87E2F741EF8C1FE86FEA6BBFDE530677F0D"
- + "97D11D49F7A8443D0822E506A9F4614E011E2A94838FF88C"
- + "D68C8BB7C5C6424CFFFFFFFFFFFFFFFF";
- internal static readonly DHParameters draft_ffdhe8192 = FromSafeP(draft_ffdhe8192_p);
-
-
- public static void AddNegotiatedDheGroupsClientExtension(IDictionary extensions, byte[] dheGroups)
- {
- extensions[ExtensionType.negotiated_ff_dhe_groups] = CreateNegotiatedDheGroupsClientExtension(dheGroups);
- }
-
- public static void AddNegotiatedDheGroupsServerExtension(IDictionary extensions, byte dheGroup)
- {
- extensions[ExtensionType.negotiated_ff_dhe_groups] = CreateNegotiatedDheGroupsServerExtension(dheGroup);
- }
-
- public static byte[] GetNegotiatedDheGroupsClientExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.negotiated_ff_dhe_groups);
- return extensionData == null ? null : ReadNegotiatedDheGroupsClientExtension(extensionData);
- }
-
- public static short GetNegotiatedDheGroupsServerExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.negotiated_ff_dhe_groups);
- return extensionData == null ? (short)-1 : (short)ReadNegotiatedDheGroupsServerExtension(extensionData);
- }
-
- public static byte[] CreateNegotiatedDheGroupsClientExtension(byte[] dheGroups)
- {
- if (dheGroups == null || dheGroups.Length < 1 || dheGroups.Length > 255)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- return TlsUtilities.EncodeUint8ArrayWithUint8Length(dheGroups);
- }
-
- public static byte[] CreateNegotiatedDheGroupsServerExtension(byte dheGroup)
- {
- return TlsUtilities.EncodeUint8(dheGroup);
- }
-
- public static byte[] ReadNegotiatedDheGroupsClientExtension(byte[] extensionData)
- {
- byte[] dheGroups = TlsUtilities.DecodeUint8ArrayWithUint8Length(extensionData);
- if (dheGroups.Length < 1)
- throw new TlsFatalAlert(AlertDescription.decode_error);
- return dheGroups;
- }
-
- public static byte ReadNegotiatedDheGroupsServerExtension(byte[] extensionData)
- {
- return TlsUtilities.DecodeUint8(extensionData);
- }
-
- public static DHParameters GetParametersForDHEGroup(short dheGroup)
- {
- switch (dheGroup)
- {
- case FiniteFieldDheGroup.ffdhe2432:
- return draft_ffdhe2432;
- case FiniteFieldDheGroup.ffdhe3072:
- return draft_ffdhe3072;
- case FiniteFieldDheGroup.ffdhe4096:
- return draft_ffdhe4096;
- case FiniteFieldDheGroup.ffdhe6144:
- return draft_ffdhe6144;
- case FiniteFieldDheGroup.ffdhe8192:
- return draft_ffdhe8192;
- default:
- return null;
- }
- }
-
- public static bool ContainsDheCipherSuites(int[] cipherSuites)
- {
- for (int i = 0; i < cipherSuites.Length; ++i)
- {
- if (IsDheCipherSuite(cipherSuites[i]))
- return true;
- }
- return false;
- }
-
- public static bool IsDheCipherSuite(int cipherSuite)
- {
- switch (cipherSuite)
- {
- /*
- * RFC 2246
- */
- case CipherSuite.TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_DES_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_DES_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
-
- /*
- * RFC 3268
- */
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
-
- /*
- * RFC 5932
- */
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
-
- /*
- * RFC 4162
- */
- case CipherSuite.TLS_DHE_DSS_WITH_SEED_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_SEED_CBC_SHA:
-
- /*
- * RFC 4279
- */
- case CipherSuite.TLS_DHE_PSK_WITH_RC4_128_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA:
-
- /*
- * RFC 4785
- */
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA:
-
- /*
- * RFC 5246
- */
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
-
- /*
- * RFC 5288
- */
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
-
- /*
- * RFC 5487
- */
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA384:
-
- /*
- * RFC 6367
- */
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
-
- /*
- * RFC 6655
- */
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CCM:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CCM:
- case CipherSuite.TLS_PSK_DHE_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_PSK_DHE_WITH_AES_256_CCM_8:
-
- /*
- * draft-ietf-tls-chacha20-poly1305-04
- */
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
-
- /*
- * draft-zauner-tls-aes-ocb-04
- */
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_256_OCB:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_256_OCB:
-
- return true;
-
- default:
- return false;
- }
- }
-
- public static bool AreCompatibleParameters(DHParameters a, DHParameters b)
- {
- return a.P.Equals(b.P) && a.G.Equals(b.G)
- && (a.Q == null || b.Q == null || a.Q.Equals(b.Q));
- }
-
- public static byte[] CalculateDHBasicAgreement(DHPublicKeyParameters publicKey,
- DHPrivateKeyParameters privateKey)
- {
- DHBasicAgreement basicAgreement = new DHBasicAgreement();
- basicAgreement.Init(privateKey);
- BigInteger agreementValue = basicAgreement.CalculateAgreement(publicKey);
-
- /*
- * RFC 5246 8.1.2. Leading bytes of Z that contain all zero bits are stripped before it is
- * used as the pre_master_secret.
- */
- return BigIntegers.AsUnsignedByteArray(agreementValue);
- }
-
- public static AsymmetricCipherKeyPair GenerateDHKeyPair(SecureRandom random, DHParameters dhParams)
- {
- DHBasicKeyPairGenerator dhGen = new DHBasicKeyPairGenerator();
- dhGen.Init(new DHKeyGenerationParameters(random, dhParams));
- return dhGen.GenerateKeyPair();
- }
-
- public static DHPrivateKeyParameters GenerateEphemeralClientKeyExchange(SecureRandom random,
- DHParameters dhParams, Stream output)
- {
- AsymmetricCipherKeyPair kp = GenerateDHKeyPair(random, dhParams);
-
- DHPublicKeyParameters dhPublic = (DHPublicKeyParameters)kp.Public;
- WriteDHParameter(dhPublic.Y, output);
-
- return (DHPrivateKeyParameters)kp.Private;
- }
-
- public static DHPrivateKeyParameters GenerateEphemeralServerKeyExchange(SecureRandom random,
- DHParameters dhParams, Stream output)
- {
- AsymmetricCipherKeyPair kp = GenerateDHKeyPair(random, dhParams);
-
- DHPublicKeyParameters dhPublic = (DHPublicKeyParameters)kp.Public;
- new ServerDHParams(dhPublic).Encode(output);
-
- return (DHPrivateKeyParameters)kp.Private;
- }
-
- public static DHParameters ValidateDHParameters(DHParameters parameters)
- {
- BigInteger p = parameters.P;
- BigInteger g = parameters.G;
-
- if (!p.IsProbablePrime(2))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- if (g.CompareTo(Two) < 0 || g.CompareTo(p.Subtract(Two)) > 0)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
-
- return parameters;
- }
-
- public static DHPublicKeyParameters ValidateDHPublicKey(DHPublicKeyParameters key)
- {
- DHParameters parameters = ValidateDHParameters(key.Parameters);
-
- BigInteger Y = key.Y;
- if (Y.CompareTo(Two) < 0 || Y.CompareTo(parameters.P.Subtract(Two)) > 0)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- // TODO See RFC 2631 for more discussion of Diffie-Hellman validation
-
- return key;
- }
-
- public static BigInteger ReadDHParameter(Stream input)
- {
- return new BigInteger(1, TlsUtilities.ReadOpaque16(input));
- }
-
- public static void WriteDHParameter(BigInteger x, Stream output)
- {
- TlsUtilities.WriteOpaque16(BigIntegers.AsUnsignedByteArray(x), output);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsDeflateCompression.cs b/BCCrypto/src/crypto/tls/TlsDeflateCompression.cs
deleted file mode 100644
index 9e11529..0000000
--- a/BCCrypto/src/crypto/tls/TlsDeflateCompression.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.Zlib;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsDeflateCompression : TlsCompression
- {
- public const int LEVEL_NONE = JZlib.Z_NO_COMPRESSION;
- public const int LEVEL_FASTEST = JZlib.Z_BEST_SPEED;
- public const int LEVEL_SMALLEST = JZlib.Z_BEST_COMPRESSION;
- public const int LEVEL_DEFAULT = JZlib.Z_DEFAULT_COMPRESSION;
-
- protected readonly ZStream zIn, zOut;
-
- public TlsDeflateCompression()
- : this(LEVEL_DEFAULT)
- {
- }
-
- public TlsDeflateCompression(int level)
- {
- this.zIn = new ZStream();
- this.zIn.inflateInit();
-
- this.zOut = new ZStream();
- this.zOut.deflateInit(level);
- }
-
- public virtual Stream Compress(Stream output)
- {
- return new DeflateOutputStream(output, zOut, true);
- }
-
- public virtual Stream Decompress(Stream output)
- {
- return new DeflateOutputStream(output, zIn, false);
- }
-
- protected class DeflateOutputStream : ZOutputStream
- {
- public DeflateOutputStream(Stream output, ZStream z, bool compress)
- : base(output, z)
- {
- this.compress = compress;
-
- /*
- * See discussion at http://www.bolet.org/~pornin/deflate-flush.html .
- */
- this.FlushMode = JZlib.Z_SYNC_FLUSH;
- }
-
- public override void Flush()
- {
- /*
- * TODO The inflateSyncPoint doesn't appear to work the way I hoped at the moment.
- * In any case, we may like to accept PARTIAL_FLUSH input, not just SYNC_FLUSH.
- * It's not clear how to check this in the Inflater.
- */
- //if (!this.compress && (z == null || z.istate == null || z.istate.inflateSyncPoint(z) <= 0))
- //{
- // throw new TlsFatalAlert(AlertDescription.decompression_failure);
- //}
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsDheKeyExchange.cs b/BCCrypto/src/crypto/tls/TlsDheKeyExchange.cs
deleted file mode 100644
index cdd6292..0000000
--- a/BCCrypto/src/crypto/tls/TlsDheKeyExchange.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsDheKeyExchange
- : TlsDHKeyExchange
- {
- protected TlsSignerCredentials mServerCredentials = null;
-
- public TlsDheKeyExchange(int keyExchange, IList supportedSignatureAlgorithms, DHParameters dhParameters)
- : base(keyExchange, supportedSignatureAlgorithms, dhParameters)
- {
- }
-
- public override void ProcessServerCredentials(TlsCredentials serverCredentials)
- {
- if (!(serverCredentials is TlsSignerCredentials))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- ProcessServerCertificate(serverCredentials.Certificate);
-
- this.mServerCredentials = (TlsSignerCredentials)serverCredentials;
- }
-
- public override byte[] GenerateServerKeyExchange()
- {
- if (this.mDHParameters == null)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- DigestInputBuffer buf = new DigestInputBuffer();
-
- this.mDHAgreePrivateKey = TlsDHUtilities.GenerateEphemeralServerKeyExchange(mContext.SecureRandom,
- this.mDHParameters, buf);
-
- /*
- * RFC 5246 4.7. digitally-signed element needs SignatureAndHashAlgorithm from TLS 1.2
- */
- SignatureAndHashAlgorithm signatureAndHashAlgorithm = TlsUtilities.GetSignatureAndHashAlgorithm(
- mContext, mServerCredentials);
-
- IDigest d = TlsUtilities.CreateHash(signatureAndHashAlgorithm);
-
- SecurityParameters securityParameters = mContext.SecurityParameters;
- d.BlockUpdate(securityParameters.clientRandom, 0, securityParameters.clientRandom.Length);
- d.BlockUpdate(securityParameters.serverRandom, 0, securityParameters.serverRandom.Length);
- buf.UpdateDigest(d);
-
- byte[] hash = DigestUtilities.DoFinal(d);
-
- byte[] signature = mServerCredentials.GenerateCertificateSignature(hash);
-
- DigitallySigned signed_params = new DigitallySigned(signatureAndHashAlgorithm, signature);
- signed_params.Encode(buf);
-
- return buf.ToArray();
- }
-
- public override void ProcessServerKeyExchange(Stream input)
- {
- SecurityParameters securityParameters = mContext.SecurityParameters;
-
- SignerInputBuffer buf = new SignerInputBuffer();
- Stream teeIn = new TeeInputStream(input, buf);
-
- ServerDHParams dhParams = ServerDHParams.Parse(teeIn);
-
- DigitallySigned signed_params = ParseSignature(input);
-
- ISigner signer = InitVerifyer(mTlsSigner, signed_params.Algorithm, securityParameters);
- buf.UpdateSigner(signer);
- if (!signer.VerifySignature(signed_params.Signature))
- throw new TlsFatalAlert(AlertDescription.decrypt_error);
-
- this.mDHAgreePublicKey = TlsDHUtilities.ValidateDHPublicKey(dhParams.PublicKey);
- this.mDHParameters = ValidateDHParameters(mDHAgreePublicKey.Parameters);
- }
-
- protected virtual ISigner InitVerifyer(TlsSigner tlsSigner, SignatureAndHashAlgorithm algorithm,
- SecurityParameters securityParameters)
- {
- ISigner signer = tlsSigner.CreateVerifyer(algorithm, this.mServerPublicKey);
- signer.BlockUpdate(securityParameters.clientRandom, 0, securityParameters.clientRandom.Length);
- signer.BlockUpdate(securityParameters.serverRandom, 0, securityParameters.serverRandom.Length);
- return signer;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsDsaSigner.cs b/BCCrypto/src/crypto/tls/TlsDsaSigner.cs
deleted file mode 100644
index f0c1e94..0000000
--- a/BCCrypto/src/crypto/tls/TlsDsaSigner.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Signers;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class TlsDsaSigner
- : AbstractTlsSigner
- {
- public override byte[] GenerateRawSignature(SignatureAndHashAlgorithm algorithm,
- AsymmetricKeyParameter privateKey, byte[] hash)
- {
- ISigner signer = MakeSigner(algorithm, true, true,
- new ParametersWithRandom(privateKey, this.mContext.SecureRandom));
- if (algorithm == null)
- {
- // Note: Only use the SHA1 part of the (MD5/SHA1) hash
- signer.BlockUpdate(hash, 16, 20);
- }
- else
- {
- signer.BlockUpdate(hash, 0, hash.Length);
- }
- return signer.GenerateSignature();
- }
-
- public override bool VerifyRawSignature(SignatureAndHashAlgorithm algorithm, byte[] sigBytes,
- AsymmetricKeyParameter publicKey, byte[] hash)
- {
- ISigner signer = MakeSigner(algorithm, true, false, publicKey);
- if (algorithm == null)
- {
- // Note: Only use the SHA1 part of the (MD5/SHA1) hash
- signer.BlockUpdate(hash, 16, 20);
- }
- else
- {
- signer.BlockUpdate(hash, 0, hash.Length);
- }
- return signer.VerifySignature(sigBytes);
- }
-
- public override ISigner CreateSigner(SignatureAndHashAlgorithm algorithm, AsymmetricKeyParameter privateKey)
- {
- return MakeSigner(algorithm, false, true, privateKey);
- }
-
- public override ISigner CreateVerifyer(SignatureAndHashAlgorithm algorithm, AsymmetricKeyParameter publicKey)
- {
- return MakeSigner(algorithm, false, false, publicKey);
- }
-
- protected virtual ICipherParameters MakeInitParameters(bool forSigning, ICipherParameters cp)
- {
- return cp;
- }
-
- protected virtual ISigner MakeSigner(SignatureAndHashAlgorithm algorithm, bool raw, bool forSigning,
- ICipherParameters cp)
- {
- if ((algorithm != null) != TlsUtilities.IsTlsV12(mContext))
- throw new InvalidOperationException();
-
- if (algorithm != null && algorithm.Signature != SignatureAlgorithm)
- throw new InvalidOperationException();
-
- byte hashAlgorithm = algorithm == null ? HashAlgorithm.sha1 : algorithm.Hash;
- IDigest d = raw ? new NullDigest() : TlsUtilities.CreateHash(hashAlgorithm);
-
- ISigner s = new DsaDigestSigner(CreateDsaImpl(hashAlgorithm), d);
- s.Init(forSigning, MakeInitParameters(forSigning, cp));
- return s;
- }
-
- protected abstract byte SignatureAlgorithm { get; }
-
- protected abstract IDsa CreateDsaImpl(byte hashAlgorithm);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsDssSigner.cs b/BCCrypto/src/crypto/tls/TlsDssSigner.cs
deleted file mode 100644
index 707ef38..0000000
--- a/BCCrypto/src/crypto/tls/TlsDssSigner.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Signers;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsDssSigner
- : TlsDsaSigner
- {
- public override bool IsValidPublicKey(AsymmetricKeyParameter publicKey)
- {
- return publicKey is DsaPublicKeyParameters;
- }
-
- protected override IDsa CreateDsaImpl(byte hashAlgorithm)
- {
- return new DsaSigner(new HMacDsaKCalculator(TlsUtilities.CreateHash(hashAlgorithm)));
- }
-
- protected override byte SignatureAlgorithm
- {
- get { return Tls.SignatureAlgorithm.dsa; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsECDHKeyExchange.cs b/BCCrypto/src/crypto/tls/TlsECDHKeyExchange.cs
deleted file mode 100644
index c508fb9..0000000
--- a/BCCrypto/src/crypto/tls/TlsECDHKeyExchange.cs
+++ /dev/null
@@ -1,252 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// (D)TLS ECDH key exchange (see RFC 4492).
- public class TlsECDHKeyExchange
- : AbstractTlsKeyExchange
- {
- protected TlsSigner mTlsSigner;
- protected int[] mNamedCurves;
- protected byte[] mClientECPointFormats, mServerECPointFormats;
-
- protected AsymmetricKeyParameter mServerPublicKey;
- protected TlsAgreementCredentials mAgreementCredentials;
-
- protected ECPrivateKeyParameters mECAgreePrivateKey;
- protected ECPublicKeyParameters mECAgreePublicKey;
-
- public TlsECDHKeyExchange(int keyExchange, IList supportedSignatureAlgorithms, int[] namedCurves,
- byte[] clientECPointFormats, byte[] serverECPointFormats)
- : base(keyExchange, supportedSignatureAlgorithms)
- {
- switch (keyExchange)
- {
- case KeyExchangeAlgorithm.ECDHE_RSA:
- this.mTlsSigner = new TlsRsaSigner();
- break;
- case KeyExchangeAlgorithm.ECDHE_ECDSA:
- this.mTlsSigner = new TlsECDsaSigner();
- break;
- case KeyExchangeAlgorithm.ECDH_anon:
- case KeyExchangeAlgorithm.ECDH_RSA:
- case KeyExchangeAlgorithm.ECDH_ECDSA:
- this.mTlsSigner = null;
- break;
- default:
- throw new InvalidOperationException("unsupported key exchange algorithm");
- }
-
- this.mNamedCurves = namedCurves;
- this.mClientECPointFormats = clientECPointFormats;
- this.mServerECPointFormats = serverECPointFormats;
- }
-
- public override void Init(TlsContext context)
- {
- base.Init(context);
-
- if (this.mTlsSigner != null)
- {
- this.mTlsSigner.Init(context);
- }
- }
-
- public override void SkipServerCredentials()
- {
- if (mKeyExchange != KeyExchangeAlgorithm.ECDH_anon)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- public override void ProcessServerCertificate(Certificate serverCertificate)
- {
- if (mKeyExchange == KeyExchangeAlgorithm.ECDH_anon)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- if (serverCertificate.IsEmpty)
- throw new TlsFatalAlert(AlertDescription.bad_certificate);
-
- X509CertificateStructure x509Cert = serverCertificate.GetCertificateAt(0);
-
- SubjectPublicKeyInfo keyInfo = x509Cert.SubjectPublicKeyInfo;
- try
- {
- this.mServerPublicKey = PublicKeyFactory.CreateKey(keyInfo);
- }
- catch (Exception e)
- {
- throw new TlsFatalAlert(AlertDescription.unsupported_certificate, e);
- }
-
- if (mTlsSigner == null)
- {
- try
- {
- this.mECAgreePublicKey = TlsEccUtilities.ValidateECPublicKey((ECPublicKeyParameters) this.mServerPublicKey);
- }
- catch (InvalidCastException e)
- {
- throw new TlsFatalAlert(AlertDescription.certificate_unknown, e);
- }
-
- TlsUtilities.ValidateKeyUsage(x509Cert, KeyUsage.KeyAgreement);
- }
- else
- {
- if (!mTlsSigner.IsValidPublicKey(this.mServerPublicKey))
- throw new TlsFatalAlert(AlertDescription.certificate_unknown);
-
- TlsUtilities.ValidateKeyUsage(x509Cert, KeyUsage.DigitalSignature);
- }
-
- base.ProcessServerCertificate(serverCertificate);
- }
-
- public override bool RequiresServerKeyExchange
- {
- get
- {
- switch (mKeyExchange)
- {
- case KeyExchangeAlgorithm.ECDH_anon:
- case KeyExchangeAlgorithm.ECDHE_ECDSA:
- case KeyExchangeAlgorithm.ECDHE_RSA:
- return true;
- default:
- return false;
- }
- }
- }
-
- public override byte[] GenerateServerKeyExchange()
- {
- if (!RequiresServerKeyExchange)
- return null;
-
- // ECDH_anon is handled here, ECDHE_* in a subclass
-
- MemoryStream buf = new MemoryStream();
- this.mECAgreePrivateKey = TlsEccUtilities.GenerateEphemeralServerKeyExchange(mContext.SecureRandom, mNamedCurves,
- mClientECPointFormats, buf);
- return buf.ToArray();
- }
-
- public override void ProcessServerKeyExchange(Stream input)
- {
- if (!RequiresServerKeyExchange)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- // ECDH_anon is handled here, ECDHE_* in a subclass
-
- ECDomainParameters curve_params = TlsEccUtilities.ReadECParameters(mNamedCurves, mClientECPointFormats, input);
-
- byte[] point = TlsUtilities.ReadOpaque8(input);
-
- this.mECAgreePublicKey = TlsEccUtilities.ValidateECPublicKey(TlsEccUtilities.DeserializeECPublicKey(
- mClientECPointFormats, curve_params, point));
- }
-
- public override void ValidateCertificateRequest(CertificateRequest certificateRequest)
- {
- if (mKeyExchange == KeyExchangeAlgorithm.ECDH_anon)
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
-
- /*
- * RFC 4492 3. [...] The ECDSA_fixed_ECDH and RSA_fixed_ECDH mechanisms are usable with
- * ECDH_ECDSA and ECDH_RSA. Their use with ECDHE_ECDSA and ECDHE_RSA is prohibited because
- * the use of a long-term ECDH client key would jeopardize the forward secrecy property of
- * these algorithms.
- */
- byte[] types = certificateRequest.CertificateTypes;
- for (int i = 0; i < types.Length; ++i)
- {
- switch (types[i])
- {
- case ClientCertificateType.rsa_sign:
- case ClientCertificateType.dss_sign:
- case ClientCertificateType.ecdsa_sign:
- case ClientCertificateType.rsa_fixed_ecdh:
- case ClientCertificateType.ecdsa_fixed_ecdh:
- break;
- default:
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
- }
-
- public override void ProcessClientCredentials(TlsCredentials clientCredentials)
- {
- if (mKeyExchange == KeyExchangeAlgorithm.ECDH_anon)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- if (clientCredentials is TlsAgreementCredentials)
- {
- // TODO Validate client cert has matching parameters (see 'TlsEccUtilities.AreOnSameCurve')?
-
- this.mAgreementCredentials = (TlsAgreementCredentials)clientCredentials;
- }
- else if (clientCredentials is TlsSignerCredentials)
- {
- // OK
- }
- else
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public override void GenerateClientKeyExchange(Stream output)
- {
- if (mAgreementCredentials == null)
- {
- this.mECAgreePrivateKey = TlsEccUtilities.GenerateEphemeralClientKeyExchange(mContext.SecureRandom,
- mServerECPointFormats, mECAgreePublicKey.Parameters, output);
- }
- }
-
- public override void ProcessClientCertificate(Certificate clientCertificate)
- {
- if (mKeyExchange == KeyExchangeAlgorithm.ECDH_anon)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- // TODO Extract the public key
- // TODO If the certificate is 'fixed', take the public key as mECAgreeClientPublicKey
- }
-
- public override void ProcessClientKeyExchange(Stream input)
- {
- if (mECAgreePublicKey != null)
- {
- // For ecdsa_fixed_ecdh and rsa_fixed_ecdh, the key arrived in the client certificate
- return;
- }
-
- byte[] point = TlsUtilities.ReadOpaque8(input);
-
- ECDomainParameters curve_params = this.mECAgreePrivateKey.Parameters;
-
- this.mECAgreePublicKey = TlsEccUtilities.ValidateECPublicKey(TlsEccUtilities.DeserializeECPublicKey(
- mServerECPointFormats, curve_params, point));
- }
-
- public override byte[] GeneratePremasterSecret()
- {
- if (mAgreementCredentials != null)
- {
- return mAgreementCredentials.GenerateAgreement(mECAgreePublicKey);
- }
-
- if (mECAgreePrivateKey != null)
- {
- return TlsEccUtilities.CalculateECDHBasicAgreement(mECAgreePublicKey, mECAgreePrivateKey);
- }
-
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsECDheKeyExchange.cs b/BCCrypto/src/crypto/tls/TlsECDheKeyExchange.cs
deleted file mode 100644
index e0553b3..0000000
--- a/BCCrypto/src/crypto/tls/TlsECDheKeyExchange.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// (D)TLS ECDHE key exchange (see RFC 4492).
- public class TlsECDheKeyExchange
- : TlsECDHKeyExchange
- {
- protected TlsSignerCredentials mServerCredentials = null;
-
- public TlsECDheKeyExchange(int keyExchange, IList supportedSignatureAlgorithms, int[] namedCurves,
- byte[] clientECPointFormats, byte[] serverECPointFormats)
- : base(keyExchange, supportedSignatureAlgorithms, namedCurves, clientECPointFormats, serverECPointFormats)
- {
- }
-
- public override void ProcessServerCredentials(TlsCredentials serverCredentials)
- {
- if (!(serverCredentials is TlsSignerCredentials))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- ProcessServerCertificate(serverCredentials.Certificate);
-
- this.mServerCredentials = (TlsSignerCredentials)serverCredentials;
- }
-
- public override byte[] GenerateServerKeyExchange()
- {
- DigestInputBuffer buf = new DigestInputBuffer();
-
- this.mECAgreePrivateKey = TlsEccUtilities.GenerateEphemeralServerKeyExchange(mContext.SecureRandom, mNamedCurves,
- mClientECPointFormats, buf);
-
- /*
- * RFC 5246 4.7. digitally-signed element needs SignatureAndHashAlgorithm from TLS 1.2
- */
- SignatureAndHashAlgorithm signatureAndHashAlgorithm = TlsUtilities.GetSignatureAndHashAlgorithm(
- mContext, mServerCredentials);
-
- IDigest d = TlsUtilities.CreateHash(signatureAndHashAlgorithm);
-
- SecurityParameters securityParameters = mContext.SecurityParameters;
- d.BlockUpdate(securityParameters.clientRandom, 0, securityParameters.clientRandom.Length);
- d.BlockUpdate(securityParameters.serverRandom, 0, securityParameters.serverRandom.Length);
- buf.UpdateDigest(d);
-
- byte[] hash = DigestUtilities.DoFinal(d);
-
- byte[] signature = mServerCredentials.GenerateCertificateSignature(hash);
-
- DigitallySigned signed_params = new DigitallySigned(signatureAndHashAlgorithm, signature);
- signed_params.Encode(buf);
-
- return buf.ToArray();
- }
-
- public override void ProcessServerKeyExchange(Stream input)
- {
- SecurityParameters securityParameters = mContext.SecurityParameters;
-
- SignerInputBuffer buf = new SignerInputBuffer();
- Stream teeIn = new TeeInputStream(input, buf);
-
- ECDomainParameters curve_params = TlsEccUtilities.ReadECParameters(mNamedCurves, mClientECPointFormats, teeIn);
-
- byte[] point = TlsUtilities.ReadOpaque8(teeIn);
-
- DigitallySigned signed_params = ParseSignature(input);
-
- ISigner signer = InitVerifyer(mTlsSigner, signed_params.Algorithm, securityParameters);
- buf.UpdateSigner(signer);
- if (!signer.VerifySignature(signed_params.Signature))
- throw new TlsFatalAlert(AlertDescription.decrypt_error);
-
- this.mECAgreePublicKey = TlsEccUtilities.ValidateECPublicKey(TlsEccUtilities.DeserializeECPublicKey(
- mClientECPointFormats, curve_params, point));
- }
-
- public override void ValidateCertificateRequest(CertificateRequest certificateRequest)
- {
- /*
- * RFC 4492 3. [...] The ECDSA_fixed_ECDH and RSA_fixed_ECDH mechanisms are usable with
- * ECDH_ECDSA and ECDH_RSA. Their use with ECDHE_ECDSA and ECDHE_RSA is prohibited because
- * the use of a long-term ECDH client key would jeopardize the forward secrecy property of
- * these algorithms.
- */
- byte[] types = certificateRequest.CertificateTypes;
- for (int i = 0; i < types.Length; ++i)
- {
- switch (types[i])
- {
- case ClientCertificateType.rsa_sign:
- case ClientCertificateType.dss_sign:
- case ClientCertificateType.ecdsa_sign:
- break;
- default:
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
- }
-
- public override void ProcessClientCredentials(TlsCredentials clientCredentials)
- {
- if (clientCredentials is TlsSignerCredentials)
- {
- // OK
- }
- else
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- protected virtual ISigner InitVerifyer(TlsSigner tlsSigner, SignatureAndHashAlgorithm algorithm,
- SecurityParameters securityParameters)
- {
- ISigner signer = tlsSigner.CreateVerifyer(algorithm, this.mServerPublicKey);
- signer.BlockUpdate(securityParameters.clientRandom, 0, securityParameters.clientRandom.Length);
- signer.BlockUpdate(securityParameters.serverRandom, 0, securityParameters.serverRandom.Length);
- return signer;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsECDsaSigner.cs b/BCCrypto/src/crypto/tls/TlsECDsaSigner.cs
deleted file mode 100644
index fa9d0b7..0000000
--- a/BCCrypto/src/crypto/tls/TlsECDsaSigner.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Signers;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsECDsaSigner
- : TlsDsaSigner
- {
- public override bool IsValidPublicKey(AsymmetricKeyParameter publicKey)
- {
- return publicKey is ECPublicKeyParameters;
- }
-
- protected override IDsa CreateDsaImpl(byte hashAlgorithm)
- {
- return new ECDsaSigner(new HMacDsaKCalculator(TlsUtilities.CreateHash(hashAlgorithm)));
- }
-
- protected override byte SignatureAlgorithm
- {
- get { return Tls.SignatureAlgorithm.ecdsa; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsEccUtilities.cs b/BCCrypto/src/crypto/tls/TlsEccUtilities.cs
deleted file mode 100644
index fb31e1b..0000000
--- a/BCCrypto/src/crypto/tls/TlsEccUtilities.cs
+++ /dev/null
@@ -1,705 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Agreement;
-using Org.BouncyCastle.Crypto.EC;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Math.Field;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class TlsEccUtilities
- {
- private static readonly string[] CurveNames = new string[] { "sect163k1", "sect163r1", "sect163r2", "sect193r1",
- "sect193r2", "sect233k1", "sect233r1", "sect239k1", "sect283k1", "sect283r1", "sect409k1", "sect409r1",
- "sect571k1", "sect571r1", "secp160k1", "secp160r1", "secp160r2", "secp192k1", "secp192r1", "secp224k1",
- "secp224r1", "secp256k1", "secp256r1", "secp384r1", "secp521r1",
- "brainpoolP256r1", "brainpoolP384r1", "brainpoolP512r1"};
-
- public static void AddSupportedEllipticCurvesExtension(IDictionary extensions, int[] namedCurves)
- {
- extensions[ExtensionType.elliptic_curves] = CreateSupportedEllipticCurvesExtension(namedCurves);
- }
-
- public static void AddSupportedPointFormatsExtension(IDictionary extensions, byte[] ecPointFormats)
- {
- extensions[ExtensionType.ec_point_formats] = CreateSupportedPointFormatsExtension(ecPointFormats);
- }
-
- public static int[] GetSupportedEllipticCurvesExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.elliptic_curves);
- return extensionData == null ? null : ReadSupportedEllipticCurvesExtension(extensionData);
- }
-
- public static byte[] GetSupportedPointFormatsExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.ec_point_formats);
- return extensionData == null ? null : ReadSupportedPointFormatsExtension(extensionData);
- }
-
- public static byte[] CreateSupportedEllipticCurvesExtension(int[] namedCurves)
- {
- if (namedCurves == null || namedCurves.Length < 1)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- return TlsUtilities.EncodeUint16ArrayWithUint16Length(namedCurves);
- }
-
- public static byte[] CreateSupportedPointFormatsExtension(byte[] ecPointFormats)
- {
- if (ecPointFormats == null || !Arrays.Contains(ecPointFormats, ECPointFormat.uncompressed))
- {
- /*
- * RFC 4492 5.1. If the Supported Point Formats Extension is indeed sent, it MUST
- * contain the value 0 (uncompressed) as one of the items in the list of point formats.
- */
-
- // NOTE: We add it at the end (lowest preference)
- ecPointFormats = Arrays.Append(ecPointFormats, ECPointFormat.uncompressed);
- }
-
- return TlsUtilities.EncodeUint8ArrayWithUint8Length(ecPointFormats);
- }
-
- public static int[] ReadSupportedEllipticCurvesExtension(byte[] extensionData)
- {
- if (extensionData == null)
- throw new ArgumentNullException("extensionData");
-
- MemoryStream buf = new MemoryStream(extensionData, false);
-
- int length = TlsUtilities.ReadUint16(buf);
- if (length < 2 || (length & 1) != 0)
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- int[] namedCurves = TlsUtilities.ReadUint16Array(length / 2, buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- return namedCurves;
- }
-
- public static byte[] ReadSupportedPointFormatsExtension(byte[] extensionData)
- {
- byte[] ecPointFormats = TlsUtilities.DecodeUint8ArrayWithUint8Length(extensionData);
- if (!Arrays.Contains(ecPointFormats, ECPointFormat.uncompressed))
- {
- /*
- * RFC 4492 5.1. If the Supported Point Formats Extension is indeed sent, it MUST
- * contain the value 0 (uncompressed) as one of the items in the list of point formats.
- */
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- return ecPointFormats;
- }
-
- public static string GetNameOfNamedCurve(int namedCurve)
- {
- return IsSupportedNamedCurve(namedCurve) ? CurveNames[namedCurve - 1] : null;
- }
-
- public static ECDomainParameters GetParametersForNamedCurve(int namedCurve)
- {
- string curveName = GetNameOfNamedCurve(namedCurve);
- if (curveName == null)
- return null;
-
- // Parameters are lazily created the first time a particular curve is accessed
-
- X9ECParameters ecP = CustomNamedCurves.GetByName(curveName);
- if (ecP == null)
- {
- ecP = ECNamedCurveTable.GetByName(curveName);
- if (ecP == null)
- return null;
- }
-
- // It's a bit inefficient to do this conversion every time
- return new ECDomainParameters(ecP.Curve, ecP.G, ecP.N, ecP.H, ecP.GetSeed());
- }
-
- public static bool HasAnySupportedNamedCurves()
- {
- return CurveNames.Length > 0;
- }
-
- public static bool ContainsEccCipherSuites(int[] cipherSuites)
- {
- for (int i = 0; i < cipherSuites.Length; ++i)
- {
- if (IsEccCipherSuite(cipherSuites[i]))
- return true;
- }
- return false;
- }
-
- public static bool IsEccCipherSuite(int cipherSuite)
- {
- switch (cipherSuite)
- {
- /*
- * RFC 4492
- */
- case CipherSuite.TLS_ECDH_ECDSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_AES_256_CBC_SHA:
-
- /*
- * RFC 5289
- */
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
-
- /*
- * RFC 5489
- */
- case CipherSuite.TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_ECDHE_PSK_WITH_RC4_128_SHA:
-
- /*
- * RFC 6367
- */
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384:
-
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
-
- case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
-
- /*
- * RFC 7251
- */
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
-
- /*
- * draft-ietf-tls-chacha20-poly1305-04
- */
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
-
- /*
- * draft-zauner-tls-aes-ocb-04
- */
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_256_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_256_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_256_OCB:
-
- return true;
-
- default:
- return false;
- }
- }
-
- public static bool AreOnSameCurve(ECDomainParameters a, ECDomainParameters b)
- {
- return a != null && a.Equals(b);
- }
-
- public static bool IsSupportedNamedCurve(int namedCurve)
- {
- return (namedCurve > 0 && namedCurve <= CurveNames.Length);
- }
-
- public static bool IsCompressionPreferred(byte[] ecPointFormats, byte compressionFormat)
- {
- if (ecPointFormats == null)
- return false;
-
- for (int i = 0; i < ecPointFormats.Length; ++i)
- {
- byte ecPointFormat = ecPointFormats[i];
- if (ecPointFormat == ECPointFormat.uncompressed)
- return false;
- if (ecPointFormat == compressionFormat)
- return true;
- }
- return false;
- }
-
- public static byte[] SerializeECFieldElement(int fieldSize, BigInteger x)
- {
- return BigIntegers.AsUnsignedByteArray((fieldSize + 7) / 8, x);
- }
-
- public static byte[] SerializeECPoint(byte[] ecPointFormats, ECPoint point)
- {
- ECCurve curve = point.Curve;
-
- /*
- * RFC 4492 5.7. ...an elliptic curve point in uncompressed or compressed format. Here, the
- * format MUST conform to what the server has requested through a Supported Point Formats
- * Extension if this extension was used, and MUST be uncompressed if this extension was not
- * used.
- */
- bool compressed = false;
- if (ECAlgorithms.IsFpCurve(curve))
- {
- compressed = IsCompressionPreferred(ecPointFormats, ECPointFormat.ansiX962_compressed_prime);
- }
- else if (ECAlgorithms.IsF2mCurve(curve))
- {
- compressed = IsCompressionPreferred(ecPointFormats, ECPointFormat.ansiX962_compressed_char2);
- }
- return point.GetEncoded(compressed);
- }
-
- public static byte[] SerializeECPublicKey(byte[] ecPointFormats, ECPublicKeyParameters keyParameters)
- {
- return SerializeECPoint(ecPointFormats, keyParameters.Q);
- }
-
- public static BigInteger DeserializeECFieldElement(int fieldSize, byte[] encoding)
- {
- int requiredLength = (fieldSize + 7) / 8;
- if (encoding.Length != requiredLength)
- throw new TlsFatalAlert(AlertDescription.decode_error);
- return new BigInteger(1, encoding);
- }
-
- public static ECPoint DeserializeECPoint(byte[] ecPointFormats, ECCurve curve, byte[] encoding)
- {
- if (encoding == null || encoding.Length < 1)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- byte actualFormat;
- switch (encoding[0])
- {
- case 0x02: // compressed
- case 0x03: // compressed
- {
- if (ECAlgorithms.IsF2mCurve(curve))
- {
- actualFormat = ECPointFormat.ansiX962_compressed_char2;
- }
- else if (ECAlgorithms.IsFpCurve(curve))
- {
- actualFormat = ECPointFormat.ansiX962_compressed_prime;
- }
- else
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- break;
- }
- case 0x04: // uncompressed
- {
- actualFormat = ECPointFormat.uncompressed;
- break;
- }
- case 0x00: // infinity
- case 0x06: // hybrid
- case 0x07: // hybrid
- default:
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- if (actualFormat != ECPointFormat.uncompressed
- && (ecPointFormats == null || !Arrays.Contains(ecPointFormats, actualFormat)))
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- return curve.DecodePoint(encoding);
- }
-
- public static ECPublicKeyParameters DeserializeECPublicKey(byte[] ecPointFormats, ECDomainParameters curve_params,
- byte[] encoding)
- {
- try
- {
- ECPoint Y = DeserializeECPoint(ecPointFormats, curve_params.Curve, encoding);
- return new ECPublicKeyParameters(Y, curve_params);
- }
- catch (Exception e)
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter, e);
- }
- }
-
- public static byte[] CalculateECDHBasicAgreement(ECPublicKeyParameters publicKey, ECPrivateKeyParameters privateKey)
- {
- ECDHBasicAgreement basicAgreement = new ECDHBasicAgreement();
- basicAgreement.Init(privateKey);
- BigInteger agreementValue = basicAgreement.CalculateAgreement(publicKey);
-
- /*
- * RFC 4492 5.10. Note that this octet string (Z in IEEE 1363 terminology) as output by
- * FE2OSP, the Field Element to Octet String Conversion Primitive, has constant length for
- * any given field; leading zeros found in this octet string MUST NOT be truncated.
- */
- return BigIntegers.AsUnsignedByteArray(basicAgreement.GetFieldSize(), agreementValue);
- }
-
- public static AsymmetricCipherKeyPair GenerateECKeyPair(SecureRandom random, ECDomainParameters ecParams)
- {
- ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
- keyPairGenerator.Init(new ECKeyGenerationParameters(ecParams, random));
- return keyPairGenerator.GenerateKeyPair();
- }
-
- public static ECPrivateKeyParameters GenerateEphemeralClientKeyExchange(SecureRandom random, byte[] ecPointFormats,
- ECDomainParameters ecParams, Stream output)
- {
- AsymmetricCipherKeyPair kp = GenerateECKeyPair(random, ecParams);
-
- ECPublicKeyParameters ecPublicKey = (ECPublicKeyParameters)kp.Public;
- WriteECPoint(ecPointFormats, ecPublicKey.Q, output);
-
- return (ECPrivateKeyParameters)kp.Private;
- }
-
- // TODO Refactor around ServerECDHParams before making this public
- internal static ECPrivateKeyParameters GenerateEphemeralServerKeyExchange(SecureRandom random, int[] namedCurves,
- byte[] ecPointFormats, Stream output)
- {
- /* First we try to find a supported named curve from the client's list. */
- int namedCurve = -1;
- if (namedCurves == null)
- {
- // TODO Let the peer choose the default named curve
- namedCurve = NamedCurve.secp256r1;
- }
- else
- {
- for (int i = 0; i < namedCurves.Length; ++i)
- {
- int entry = namedCurves[i];
- if (NamedCurve.IsValid(entry) && IsSupportedNamedCurve(entry))
- {
- namedCurve = entry;
- break;
- }
- }
- }
-
- ECDomainParameters ecParams = null;
- if (namedCurve >= 0)
- {
- ecParams = GetParametersForNamedCurve(namedCurve);
- }
- else
- {
- /* If no named curves are suitable, check if the client supports explicit curves. */
- if (Arrays.Contains(namedCurves, NamedCurve.arbitrary_explicit_prime_curves))
- {
- ecParams = GetParametersForNamedCurve(NamedCurve.secp256r1);
- }
- else if (Arrays.Contains(namedCurves, NamedCurve.arbitrary_explicit_char2_curves))
- {
- ecParams = GetParametersForNamedCurve(NamedCurve.sect283r1);
- }
- }
-
- if (ecParams == null)
- {
- /*
- * NOTE: We shouldn't have negotiated ECDHE key exchange since we apparently can't find
- * a suitable curve.
- */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- if (namedCurve < 0)
- {
- WriteExplicitECParameters(ecPointFormats, ecParams, output);
- }
- else
- {
- WriteNamedECParameters(namedCurve, output);
- }
-
- return GenerateEphemeralClientKeyExchange(random, ecPointFormats, ecParams, output);
- }
-
- public static ECPublicKeyParameters ValidateECPublicKey(ECPublicKeyParameters key)
- {
- // TODO Check RFC 4492 for validation
- return key;
- }
-
- public static int ReadECExponent(int fieldSize, Stream input)
- {
- BigInteger K = ReadECParameter(input);
- if (K.BitLength < 32)
- {
- int k = K.IntValue;
- if (k > 0 && k < fieldSize)
- {
- return k;
- }
- }
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- public static BigInteger ReadECFieldElement(int fieldSize, Stream input)
- {
- return DeserializeECFieldElement(fieldSize, TlsUtilities.ReadOpaque8(input));
- }
-
- public static BigInteger ReadECParameter(Stream input)
- {
- // TODO Are leading zeroes okay here?
- return new BigInteger(1, TlsUtilities.ReadOpaque8(input));
- }
-
- public static ECDomainParameters ReadECParameters(int[] namedCurves, byte[] ecPointFormats, Stream input)
- {
- try
- {
- byte curveType = TlsUtilities.ReadUint8(input);
-
- switch (curveType)
- {
- case ECCurveType.explicit_prime:
- {
- CheckNamedCurve(namedCurves, NamedCurve.arbitrary_explicit_prime_curves);
-
- BigInteger prime_p = ReadECParameter(input);
- BigInteger a = ReadECFieldElement(prime_p.BitLength, input);
- BigInteger b = ReadECFieldElement(prime_p.BitLength, input);
- byte[] baseEncoding = TlsUtilities.ReadOpaque8(input);
- BigInteger order = ReadECParameter(input);
- BigInteger cofactor = ReadECParameter(input);
- ECCurve curve = new FpCurve(prime_p, a, b, order, cofactor);
- ECPoint basePoint = DeserializeECPoint(ecPointFormats, curve, baseEncoding);
- return new ECDomainParameters(curve, basePoint, order, cofactor);
- }
- case ECCurveType.explicit_char2:
- {
- CheckNamedCurve(namedCurves, NamedCurve.arbitrary_explicit_char2_curves);
-
- int m = TlsUtilities.ReadUint16(input);
- byte basis = TlsUtilities.ReadUint8(input);
- if (!ECBasisType.IsValid(basis))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- int k1 = ReadECExponent(m, input), k2 = -1, k3 = -1;
- if (basis == ECBasisType.ec_basis_pentanomial)
- {
- k2 = ReadECExponent(m, input);
- k3 = ReadECExponent(m, input);
- }
-
- BigInteger a = ReadECFieldElement(m, input);
- BigInteger b = ReadECFieldElement(m, input);
- byte[] baseEncoding = TlsUtilities.ReadOpaque8(input);
- BigInteger order = ReadECParameter(input);
- BigInteger cofactor = ReadECParameter(input);
-
- ECCurve curve = (basis == ECBasisType.ec_basis_pentanomial)
- ? new F2mCurve(m, k1, k2, k3, a, b, order, cofactor)
- : new F2mCurve(m, k1, a, b, order, cofactor);
-
- ECPoint basePoint = DeserializeECPoint(ecPointFormats, curve, baseEncoding);
-
- return new ECDomainParameters(curve, basePoint, order, cofactor);
- }
- case ECCurveType.named_curve:
- {
- int namedCurve = TlsUtilities.ReadUint16(input);
- if (!NamedCurve.RefersToASpecificNamedCurve(namedCurve))
- {
- /*
- * RFC 4492 5.4. All those values of NamedCurve are allowed that refer to a
- * specific curve. Values of NamedCurve that indicate support for a class of
- * explicitly defined curves are not allowed here [...].
- */
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- CheckNamedCurve(namedCurves, namedCurve);
-
- return GetParametersForNamedCurve(namedCurve);
- }
- default:
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
- catch (Exception e)
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter, e);
- }
- }
-
- private static void CheckNamedCurve(int[] namedCurves, int namedCurve)
- {
- if (namedCurves != null && !Arrays.Contains(namedCurves, namedCurve))
- {
- /*
- * RFC 4492 4. [...] servers MUST NOT negotiate the use of an ECC cipher suite
- * unless they can complete the handshake while respecting the choice of curves
- * and compression techniques specified by the client.
- */
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
-
- public static void WriteECExponent(int k, Stream output)
- {
- BigInteger K = BigInteger.ValueOf(k);
- WriteECParameter(K, output);
- }
-
- public static void WriteECFieldElement(ECFieldElement x, Stream output)
- {
- TlsUtilities.WriteOpaque8(x.GetEncoded(), output);
- }
-
- public static void WriteECFieldElement(int fieldSize, BigInteger x, Stream output)
- {
- TlsUtilities.WriteOpaque8(SerializeECFieldElement(fieldSize, x), output);
- }
-
- public static void WriteECParameter(BigInteger x, Stream output)
- {
- TlsUtilities.WriteOpaque8(BigIntegers.AsUnsignedByteArray(x), output);
- }
-
- public static void WriteExplicitECParameters(byte[] ecPointFormats, ECDomainParameters ecParameters,
- Stream output)
- {
- ECCurve curve = ecParameters.Curve;
-
- if (ECAlgorithms.IsFpCurve(curve))
- {
- TlsUtilities.WriteUint8(ECCurveType.explicit_prime, output);
-
- WriteECParameter(curve.Field.Characteristic, output);
- }
- else if (ECAlgorithms.IsF2mCurve(curve))
- {
- IPolynomialExtensionField field = (IPolynomialExtensionField)curve.Field;
- int[] exponents = field.MinimalPolynomial.GetExponentsPresent();
-
- TlsUtilities.WriteUint8(ECCurveType.explicit_char2, output);
-
- int m = exponents[exponents.Length - 1];
- TlsUtilities.CheckUint16(m);
- TlsUtilities.WriteUint16(m, output);
-
- if (exponents.Length == 3)
- {
- TlsUtilities.WriteUint8(ECBasisType.ec_basis_trinomial, output);
- WriteECExponent(exponents[1], output);
- }
- else if (exponents.Length == 5)
- {
- TlsUtilities.WriteUint8(ECBasisType.ec_basis_pentanomial, output);
- WriteECExponent(exponents[1], output);
- WriteECExponent(exponents[2], output);
- WriteECExponent(exponents[3], output);
- }
- else
- {
- throw new ArgumentException("Only trinomial and pentomial curves are supported");
- }
- }
- else
- {
- throw new ArgumentException("'ecParameters' not a known curve type");
- }
-
- WriteECFieldElement(curve.A, output);
- WriteECFieldElement(curve.B, output);
- TlsUtilities.WriteOpaque8(SerializeECPoint(ecPointFormats, ecParameters.G), output);
- WriteECParameter(ecParameters.N, output);
- WriteECParameter(ecParameters.H, output);
- }
-
- public static void WriteECPoint(byte[] ecPointFormats, ECPoint point, Stream output)
- {
- TlsUtilities.WriteOpaque8(SerializeECPoint(ecPointFormats, point), output);
- }
-
- public static void WriteNamedECParameters(int namedCurve, Stream output)
- {
- if (!NamedCurve.RefersToASpecificNamedCurve(namedCurve))
- {
- /*
- * RFC 4492 5.4. All those values of NamedCurve are allowed that refer to a specific
- * curve. Values of NamedCurve that indicate support for a class of explicitly defined
- * curves are not allowed here [...].
- */
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- TlsUtilities.WriteUint8(ECCurveType.named_curve, output);
- TlsUtilities.CheckUint16(namedCurve);
- TlsUtilities.WriteUint16(namedCurve, output);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsEncryptionCredentials.cs b/BCCrypto/src/crypto/tls/TlsEncryptionCredentials.cs
deleted file mode 100644
index 52f0070..0000000
--- a/BCCrypto/src/crypto/tls/TlsEncryptionCredentials.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsEncryptionCredentials
- : TlsCredentials
- {
- ///
- byte[] DecryptPreMasterSecret(byte[] encryptedPreMasterSecret);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsException.cs b/BCCrypto/src/crypto/tls/TlsException.cs
deleted file mode 100644
index cea9e3e..0000000
--- a/BCCrypto/src/crypto/tls/TlsException.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsException
- : IOException
- {
- public TlsException(string message, Exception cause)
- : base(message, cause)
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsExtensionsUtilities.cs b/BCCrypto/src/crypto/tls/TlsExtensionsUtilities.cs
deleted file mode 100644
index 4b3d9e0..0000000
--- a/BCCrypto/src/crypto/tls/TlsExtensionsUtilities.cs
+++ /dev/null
@@ -1,368 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class TlsExtensionsUtilities
- {
- public static IDictionary EnsureExtensionsInitialised(IDictionary extensions)
- {
- return extensions == null ? Platform.CreateHashtable() : extensions;
- }
-
- ///
- public static void AddClientCertificateTypeExtensionClient(IDictionary extensions, byte[] certificateTypes)
- {
- extensions[ExtensionType.client_certificate_type] = CreateCertificateTypeExtensionClient(certificateTypes);
- }
-
- ///
- public static void AddClientCertificateTypeExtensionServer(IDictionary extensions, byte certificateType)
- {
- extensions[ExtensionType.client_certificate_type] = CreateCertificateTypeExtensionServer(certificateType);
- }
-
- public static void AddEncryptThenMacExtension(IDictionary extensions)
- {
- extensions[ExtensionType.encrypt_then_mac] = CreateEncryptThenMacExtension();
- }
-
- public static void AddExtendedMasterSecretExtension(IDictionary extensions)
- {
- extensions[ExtensionType.extended_master_secret] = CreateExtendedMasterSecretExtension();
- }
-
- ///
- public static void AddHeartbeatExtension(IDictionary extensions, HeartbeatExtension heartbeatExtension)
- {
- extensions[ExtensionType.heartbeat] = CreateHeartbeatExtension(heartbeatExtension);
- }
-
- ///
- public static void AddMaxFragmentLengthExtension(IDictionary extensions, byte maxFragmentLength)
- {
- extensions[ExtensionType.max_fragment_length] = CreateMaxFragmentLengthExtension(maxFragmentLength);
- }
-
- ///
- public static void AddPaddingExtension(IDictionary extensions, int dataLength)
- {
- extensions[ExtensionType.padding] = CreatePaddingExtension(dataLength);
- }
-
- ///
- public static void AddServerCertificateTypeExtensionClient(IDictionary extensions, byte[] certificateTypes)
- {
- extensions[ExtensionType.server_certificate_type] = CreateCertificateTypeExtensionClient(certificateTypes);
- }
-
- ///
- public static void AddServerCertificateTypeExtensionServer(IDictionary extensions, byte certificateType)
- {
- extensions[ExtensionType.server_certificate_type] = CreateCertificateTypeExtensionServer(certificateType);
- }
-
- ///
- public static void AddServerNameExtension(IDictionary extensions, ServerNameList serverNameList)
- {
- extensions[ExtensionType.server_name] = CreateServerNameExtension(serverNameList);
- }
-
- ///
- public static void AddStatusRequestExtension(IDictionary extensions, CertificateStatusRequest statusRequest)
- {
- extensions[ExtensionType.status_request] = CreateStatusRequestExtension(statusRequest);
- }
-
- public static void AddTruncatedHMacExtension(IDictionary extensions)
- {
- extensions[ExtensionType.truncated_hmac] = CreateTruncatedHMacExtension();
- }
-
- ///
- public static byte[] GetClientCertificateTypeExtensionClient(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.client_certificate_type);
- return extensionData == null ? null : ReadCertificateTypeExtensionClient(extensionData);
- }
-
- ///
- public static short GetClientCertificateTypeExtensionServer(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.client_certificate_type);
- return extensionData == null ? (short)-1 : (short)ReadCertificateTypeExtensionServer(extensionData);
- }
-
- ///
- public static HeartbeatExtension GetHeartbeatExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.heartbeat);
- return extensionData == null ? null : ReadHeartbeatExtension(extensionData);
- }
-
- ///
- public static short GetMaxFragmentLengthExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.max_fragment_length);
- return extensionData == null ? (short)-1 : (short)ReadMaxFragmentLengthExtension(extensionData);
- }
-
- ///
- public static int GetPaddingExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.padding);
- return extensionData == null ? -1 : ReadPaddingExtension(extensionData);
- }
-
- ///
- public static byte[] GetServerCertificateTypeExtensionClient(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.server_certificate_type);
- return extensionData == null ? null : ReadCertificateTypeExtensionClient(extensionData);
- }
-
- ///
- public static short GetServerCertificateTypeExtensionServer(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.server_certificate_type);
- return extensionData == null ? (short)-1 : (short)ReadCertificateTypeExtensionServer(extensionData);
- }
-
- ///
- public static ServerNameList GetServerNameExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.server_name);
- return extensionData == null ? null : ReadServerNameExtension(extensionData);
- }
-
- ///
- public static CertificateStatusRequest GetStatusRequestExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.status_request);
- return extensionData == null ? null : ReadStatusRequestExtension(extensionData);
- }
-
- ///
- public static bool HasEncryptThenMacExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.encrypt_then_mac);
- return extensionData == null ? false : ReadEncryptThenMacExtension(extensionData);
- }
-
- ///
- public static bool HasExtendedMasterSecretExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.extended_master_secret);
- return extensionData == null ? false : ReadExtendedMasterSecretExtension(extensionData);
- }
-
- ///
- public static bool HasTruncatedHMacExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.truncated_hmac);
- return extensionData == null ? false : ReadTruncatedHMacExtension(extensionData);
- }
-
- ///
- public static byte[] CreateCertificateTypeExtensionClient(byte[] certificateTypes)
- {
- if (certificateTypes == null || certificateTypes.Length < 1 || certificateTypes.Length > 255)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- return TlsUtilities.EncodeUint8ArrayWithUint8Length(certificateTypes);
- }
-
- ///
- public static byte[] CreateCertificateTypeExtensionServer(byte certificateType)
- {
- return TlsUtilities.EncodeUint8(certificateType);
- }
-
- public static byte[] CreateEmptyExtensionData()
- {
- return TlsUtilities.EmptyBytes;
- }
-
- public static byte[] CreateEncryptThenMacExtension()
- {
- return CreateEmptyExtensionData();
- }
-
- public static byte[] CreateExtendedMasterSecretExtension()
- {
- return CreateEmptyExtensionData();
- }
-
- ///
- public static byte[] CreateHeartbeatExtension(HeartbeatExtension heartbeatExtension)
- {
- if (heartbeatExtension == null)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- MemoryStream buf = new MemoryStream();
-
- heartbeatExtension.Encode(buf);
-
- return buf.ToArray();
- }
-
- ///
- public static byte[] CreateMaxFragmentLengthExtension(byte maxFragmentLength)
- {
- return TlsUtilities.EncodeUint8(maxFragmentLength);
- }
-
- ///
- public static byte[] CreatePaddingExtension(int dataLength)
- {
- TlsUtilities.CheckUint16(dataLength);
- return new byte[dataLength];
- }
-
- ///
- public static byte[] CreateServerNameExtension(ServerNameList serverNameList)
- {
- if (serverNameList == null)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- MemoryStream buf = new MemoryStream();
-
- serverNameList.Encode(buf);
-
- return buf.ToArray();
- }
-
- ///
- public static byte[] CreateStatusRequestExtension(CertificateStatusRequest statusRequest)
- {
- if (statusRequest == null)
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- MemoryStream buf = new MemoryStream();
-
- statusRequest.Encode(buf);
-
- return buf.ToArray();
- }
-
- public static byte[] CreateTruncatedHMacExtension()
- {
- return CreateEmptyExtensionData();
- }
-
- ///
- private static bool ReadEmptyExtensionData(byte[] extensionData)
- {
- if (extensionData == null)
- throw new ArgumentNullException("extensionData");
-
- if (extensionData.Length != 0)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- return true;
- }
-
- ///
- public static byte[] ReadCertificateTypeExtensionClient(byte[] extensionData)
- {
- byte[] certificateTypes = TlsUtilities.DecodeUint8ArrayWithUint8Length(extensionData);
- if (certificateTypes.Length < 1)
- throw new TlsFatalAlert(AlertDescription.decode_error);
- return certificateTypes;
- }
-
- ///
- public static byte ReadCertificateTypeExtensionServer(byte[] extensionData)
- {
- return TlsUtilities.DecodeUint8(extensionData);
- }
-
- ///
- public static bool ReadEncryptThenMacExtension(byte[] extensionData)
- {
- return ReadEmptyExtensionData(extensionData);
- }
-
- ///
- public static bool ReadExtendedMasterSecretExtension(byte[] extensionData)
- {
- return ReadEmptyExtensionData(extensionData);
- }
-
- ///
- public static HeartbeatExtension ReadHeartbeatExtension(byte[] extensionData)
- {
- if (extensionData == null)
- throw new ArgumentNullException("extensionData");
-
- MemoryStream buf = new MemoryStream(extensionData, false);
-
- HeartbeatExtension heartbeatExtension = HeartbeatExtension.Parse(buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- return heartbeatExtension;
- }
-
- ///
- public static byte ReadMaxFragmentLengthExtension(byte[] extensionData)
- {
- return TlsUtilities.DecodeUint8(extensionData);
- }
-
- ///
- public static int ReadPaddingExtension(byte[] extensionData)
- {
- if (extensionData == null)
- throw new ArgumentNullException("extensionData");
-
- for (int i = 0; i < extensionData.Length; ++i)
- {
- if (extensionData[i] != 0)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- return extensionData.Length;
- }
-
- ///
- public static ServerNameList ReadServerNameExtension(byte[] extensionData)
- {
- if (extensionData == null)
- throw new ArgumentNullException("extensionData");
-
- MemoryStream buf = new MemoryStream(extensionData, false);
-
- ServerNameList serverNameList = ServerNameList.Parse(buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- return serverNameList;
- }
-
- ///
- public static CertificateStatusRequest ReadStatusRequestExtension(byte[] extensionData)
- {
- if (extensionData == null)
- throw new ArgumentNullException("extensionData");
-
- MemoryStream buf = new MemoryStream(extensionData, false);
-
- CertificateStatusRequest statusRequest = CertificateStatusRequest.Parse(buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- return statusRequest;
- }
-
- ///
- public static bool ReadTruncatedHMacExtension(byte[] extensionData)
- {
- return ReadEmptyExtensionData(extensionData);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsFatalAlert.cs b/BCCrypto/src/crypto/tls/TlsFatalAlert.cs
deleted file mode 100644
index 6f18981..0000000
--- a/BCCrypto/src/crypto/tls/TlsFatalAlert.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsFatalAlert
- : TlsException
- {
- private readonly byte alertDescription;
-
- public TlsFatalAlert(byte alertDescription)
- : this(alertDescription, null)
- {
- }
-
- public TlsFatalAlert(byte alertDescription, Exception alertCause)
- : base(Tls.AlertDescription.GetText(alertDescription), alertCause)
- {
- this.alertDescription = alertDescription;
- }
-
- public virtual byte AlertDescription
- {
- get { return alertDescription; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsFatalAlertReceived.cs b/BCCrypto/src/crypto/tls/TlsFatalAlertReceived.cs
deleted file mode 100644
index 044fc80..0000000
--- a/BCCrypto/src/crypto/tls/TlsFatalAlertReceived.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsFatalAlertReceived
- : TlsException
- {
- private readonly byte alertDescription;
-
- public TlsFatalAlertReceived(byte alertDescription)
- : base(Tls.AlertDescription.GetText(alertDescription), null)
- {
- this.alertDescription = alertDescription;
- }
-
- public virtual byte AlertDescription
- {
- get { return alertDescription; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsHandshakeHash.cs b/BCCrypto/src/crypto/tls/TlsHandshakeHash.cs
deleted file mode 100644
index 7118d97..0000000
--- a/BCCrypto/src/crypto/tls/TlsHandshakeHash.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsHandshakeHash
- : IDigest
- {
- void Init(TlsContext context);
-
- TlsHandshakeHash NotifyPrfDetermined();
-
- void TrackHashAlgorithm(byte hashAlgorithm);
-
- void SealHashAlgorithms();
-
- TlsHandshakeHash StopTracking();
-
- IDigest ForkPrfHash();
-
- byte[] GetFinalHash(byte hashAlgorithm);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsKeyExchange.cs b/BCCrypto/src/crypto/tls/TlsKeyExchange.cs
deleted file mode 100644
index 6731f6f..0000000
--- a/BCCrypto/src/crypto/tls/TlsKeyExchange.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// A generic interface for key exchange implementations in (D)TLS.
- ///
- public interface TlsKeyExchange
- {
- void Init(TlsContext context);
-
- ///
- void SkipServerCredentials();
-
- ///
- void ProcessServerCredentials(TlsCredentials serverCredentials);
-
- ///
- void ProcessServerCertificate(Certificate serverCertificate);
-
- bool RequiresServerKeyExchange { get; }
-
- ///
- byte[] GenerateServerKeyExchange();
-
- ///
- void SkipServerKeyExchange();
-
- ///
- void ProcessServerKeyExchange(Stream input);
-
- ///
- void ValidateCertificateRequest(CertificateRequest certificateRequest);
-
- ///
- void SkipClientCredentials();
-
- ///
- void ProcessClientCredentials(TlsCredentials clientCredentials);
-
- ///
- void ProcessClientCertificate(Certificate clientCertificate);
-
- ///
- void GenerateClientKeyExchange(Stream output);
-
- ///
- void ProcessClientKeyExchange(Stream input);
-
- ///
- byte[] GeneratePremasterSecret();
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsMac.cs b/BCCrypto/src/crypto/tls/TlsMac.cs
deleted file mode 100644
index a80319a..0000000
--- a/BCCrypto/src/crypto/tls/TlsMac.cs
+++ /dev/null
@@ -1,173 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// A generic TLS MAC implementation, acting as an HMAC based on some underlying Digest.
- ///
- public class TlsMac
- {
- protected readonly TlsContext context;
- protected readonly byte[] secret;
- protected readonly IMac mac;
- protected readonly int digestBlockSize;
- protected readonly int digestOverhead;
- protected readonly int macLength;
-
- /**
- * Generate a new instance of an TlsMac.
- *
- * @param context the TLS client context
- * @param digest The digest to use.
- * @param key A byte-array where the key for this MAC is located.
- * @param keyOff The number of bytes to skip, before the key starts in the buffer.
- * @param keyLen The length of the key.
- */
- public TlsMac(TlsContext context, IDigest digest, byte[] key, int keyOff, int keyLen)
- {
- this.context = context;
-
- KeyParameter keyParameter = new KeyParameter(key, keyOff, keyLen);
-
- this.secret = Arrays.Clone(keyParameter.GetKey());
-
- // TODO This should check the actual algorithm, not rely on the engine type
- if (digest is LongDigest)
- {
- this.digestBlockSize = 128;
- this.digestOverhead = 16;
- }
- else
- {
- this.digestBlockSize = 64;
- this.digestOverhead = 8;
- }
-
- if (TlsUtilities.IsSsl(context))
- {
- this.mac = new Ssl3Mac(digest);
-
- // TODO This should check the actual algorithm, not assume based on the digest size
- if (digest.GetDigestSize() == 20)
- {
- /*
- * NOTE: When SHA-1 is used with the SSL 3.0 MAC, the secret + input pad is not
- * digest block-aligned.
- */
- this.digestOverhead = 4;
- }
- }
- else
- {
- this.mac = new HMac(digest);
-
- // NOTE: The input pad for HMAC is always a full digest block
- }
-
- this.mac.Init(keyParameter);
-
- this.macLength = mac.GetMacSize();
- if (context.SecurityParameters.truncatedHMac)
- {
- this.macLength = System.Math.Min(this.macLength, 10);
- }
- }
-
- /**
- * @return the MAC write secret
- */
- public virtual byte[] MacSecret
- {
- get { return this.secret; }
- }
-
- /**
- * @return The output length of this MAC.
- */
- public virtual int Size
- {
- get { return macLength; }
- }
-
- /**
- * Calculate the MAC for some given data.
- *
- * @param type The message type of the message.
- * @param message A byte-buffer containing the message.
- * @param offset The number of bytes to skip, before the message starts.
- * @param length The length of the message.
- * @return A new byte-buffer containing the MAC value.
- */
- public virtual byte[] CalculateMac(long seqNo, byte type, byte[] message, int offset, int length)
- {
- ProtocolVersion serverVersion = context.ServerVersion;
- bool isSsl = serverVersion.IsSsl;
-
- byte[] macHeader = new byte[isSsl ? 11 : 13];
- TlsUtilities.WriteUint64(seqNo, macHeader, 0);
- TlsUtilities.WriteUint8(type, macHeader, 8);
- if (!isSsl)
- {
- TlsUtilities.WriteVersion(serverVersion, macHeader, 9);
- }
- TlsUtilities.WriteUint16(length, macHeader, macHeader.Length - 2);
-
- mac.BlockUpdate(macHeader, 0, macHeader.Length);
- mac.BlockUpdate(message, offset, length);
-
- return Truncate(MacUtilities.DoFinal(mac));
- }
-
- public virtual byte[] CalculateMacConstantTime(long seqNo, byte type, byte[] message, int offset, int length,
- int fullLength, byte[] dummyData)
- {
- /*
- * Actual MAC only calculated on 'length' bytes...
- */
- byte[] result = CalculateMac(seqNo, type, message, offset, length);
-
- /*
- * ...but ensure a constant number of complete digest blocks are processed (as many as would
- * be needed for 'fullLength' bytes of input).
- */
- int headerLength = TlsUtilities.IsSsl(context) ? 11 : 13;
-
- // How many extra full blocks do we need to calculate?
- int extra = GetDigestBlockCount(headerLength + fullLength) - GetDigestBlockCount(headerLength + length);
-
- while (--extra >= 0)
- {
- mac.BlockUpdate(dummyData, 0, digestBlockSize);
- }
-
- // One more byte in case the implementation is "lazy" about processing blocks
- mac.Update(dummyData[0]);
- mac.Reset();
-
- return result;
- }
-
- protected virtual int GetDigestBlockCount(int inputLength)
- {
- // NOTE: This calculation assumes a minimum of 1 pad byte
- return (inputLength + digestOverhead) / digestBlockSize;
- }
-
- protected virtual byte[] Truncate(byte[] bs)
- {
- if (bs.Length <= macLength)
- {
- return bs;
- }
-
- return Arrays.CopyOf(bs, macLength);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsNoCloseNotifyException.cs b/BCCrypto/src/crypto/tls/TlsNoCloseNotifyException.cs
deleted file mode 100644
index 0bafd82..0000000
--- a/BCCrypto/src/crypto/tls/TlsNoCloseNotifyException.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// This exception will be thrown(only) when the connection is closed by the peer without sending a
- /// close_notify warning alert.
- ///
- ///
- /// If this happens, the TLS protocol cannot rule out truncation of the connection data (potentially
- /// malicious). It may be possible to check for truncation via some property of a higher level protocol
- /// built upon TLS, e.g.the Content-Length header for HTTPS.
- ///
- public class TlsNoCloseNotifyException
- : EndOfStreamException
- {
- public TlsNoCloseNotifyException()
- : base("No close_notify alert received before connection closed")
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsNullCipher.cs b/BCCrypto/src/crypto/tls/TlsNullCipher.cs
deleted file mode 100644
index f30ace2..0000000
--- a/BCCrypto/src/crypto/tls/TlsNullCipher.cs
+++ /dev/null
@@ -1,118 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- ///
- /// A NULL CipherSuite, with optional MAC.
- ///
- public class TlsNullCipher
- : TlsCipher
- {
- protected readonly TlsContext context;
-
- protected readonly TlsMac writeMac;
- protected readonly TlsMac readMac;
-
- public TlsNullCipher(TlsContext context)
- {
- this.context = context;
- this.writeMac = null;
- this.readMac = null;
- }
-
- ///
- public TlsNullCipher(TlsContext context, IDigest clientWriteDigest, IDigest serverWriteDigest)
- {
- if ((clientWriteDigest == null) != (serverWriteDigest == null))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- this.context = context;
-
- TlsMac clientWriteMac = null, serverWriteMac = null;
-
- if (clientWriteDigest != null)
- {
- int key_block_size = clientWriteDigest.GetDigestSize()
- + serverWriteDigest.GetDigestSize();
- byte[] key_block = TlsUtilities.CalculateKeyBlock(context, key_block_size);
-
- int offset = 0;
-
- clientWriteMac = new TlsMac(context, clientWriteDigest, key_block, offset,
- clientWriteDigest.GetDigestSize());
- offset += clientWriteDigest.GetDigestSize();
-
- serverWriteMac = new TlsMac(context, serverWriteDigest, key_block, offset,
- serverWriteDigest.GetDigestSize());
- offset += serverWriteDigest.GetDigestSize();
-
- if (offset != key_block_size)
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- if (context.IsServer)
- {
- writeMac = serverWriteMac;
- readMac = clientWriteMac;
- }
- else
- {
- writeMac = clientWriteMac;
- readMac = serverWriteMac;
- }
- }
-
- public virtual int GetPlaintextLimit(int ciphertextLimit)
- {
- int result = ciphertextLimit;
- if (writeMac != null)
- {
- result -= writeMac.Size;
- }
- return result;
- }
-
- ///
- public virtual byte[] EncodePlaintext(long seqNo, byte type, byte[] plaintext, int offset, int len)
- {
- if (writeMac == null)
- {
- return Arrays.CopyOfRange(plaintext, offset, offset + len);
- }
-
- byte[] mac = writeMac.CalculateMac(seqNo, type, plaintext, offset, len);
- byte[] ciphertext = new byte[len + mac.Length];
- Array.Copy(plaintext, offset, ciphertext, 0, len);
- Array.Copy(mac, 0, ciphertext, len, mac.Length);
- return ciphertext;
- }
-
- ///
- public virtual byte[] DecodeCiphertext(long seqNo, byte type, byte[] ciphertext, int offset, int len)
- {
- if (readMac == null)
- {
- return Arrays.CopyOfRange(ciphertext, offset, offset + len);
- }
-
- int macSize = readMac.Size;
- if (len < macSize)
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- int macInputLen = len - macSize;
-
- byte[] receivedMac = Arrays.CopyOfRange(ciphertext, offset + macInputLen, offset + len);
- byte[] computedMac = readMac.CalculateMac(seqNo, type, ciphertext, offset, macInputLen);
-
- if (!Arrays.ConstantTimeAreEqual(receivedMac, computedMac))
- throw new TlsFatalAlert(AlertDescription.bad_record_mac);
-
- return Arrays.CopyOfRange(ciphertext, offset, offset + macInputLen);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsNullCompression.cs b/BCCrypto/src/crypto/tls/TlsNullCompression.cs
deleted file mode 100644
index 45f8fc7..0000000
--- a/BCCrypto/src/crypto/tls/TlsNullCompression.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsNullCompression
- : TlsCompression
- {
- public virtual Stream Compress(Stream output)
- {
- return output;
- }
-
- public virtual Stream Decompress(Stream output)
- {
- return output;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsPeer.cs b/BCCrypto/src/crypto/tls/TlsPeer.cs
deleted file mode 100644
index 1ae41a4..0000000
--- a/BCCrypto/src/crypto/tls/TlsPeer.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsPeer
- {
- ///
- /// draft-mathewson-no-gmtunixtime-00 2. "If existing users of a TLS implementation may rely on
- /// gmt_unix_time containing the current time, we recommend that implementors MAY provide the
- /// ability to set gmt_unix_time as an option only, off by default."
- ///
- ///
- /// true if the current time should be used in the gmt_unix_time field of
- /// Random, or false if gmt_unix_time should contain a cryptographically
- /// random value.
- ///
- bool ShouldUseGmtUnixTime();
-
- ///
- /// Report whether the server supports secure renegotiation
- ///
- ///
- /// The protocol handler automatically processes the relevant extensions
- ///
- ///
- /// A , true if the server supports secure renegotiation
- ///
- ///
- void NotifySecureRenegotiation(bool secureRenegotiation);
-
- ///
- /// Return an implementation of to handle record compression.
- ///
- /// A
- ///
- TlsCompression GetCompression();
-
- ///
- /// Return an implementation of to use for encryption/decryption.
- ///
- /// A
- ///
- TlsCipher GetCipher();
-
- /// This method will be called when an alert is raised by the protocol.
- ///
- ///
- /// A human-readable message explaining what caused this alert. May be null.
- /// The Exception that caused this alert to be raised. May be null.
- void NotifyAlertRaised(byte alertLevel, byte alertDescription, string message, Exception cause);
-
- /// This method will be called when an alert is received from the remote peer.
- ///
- ///
- void NotifyAlertReceived(byte alertLevel, byte alertDescription);
-
- /// Notifies the peer that the handshake has been successfully completed.
- ///
- void NotifyHandshakeComplete();
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsProtocol.cs b/BCCrypto/src/crypto/tls/TlsProtocol.cs
deleted file mode 100644
index 72151d4..0000000
--- a/BCCrypto/src/crypto/tls/TlsProtocol.cs
+++ /dev/null
@@ -1,1450 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Prng;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class TlsProtocol
- {
- /*
- * Our Connection states
- */
- protected const short CS_START = 0;
- protected const short CS_CLIENT_HELLO = 1;
- protected const short CS_SERVER_HELLO = 2;
- protected const short CS_SERVER_SUPPLEMENTAL_DATA = 3;
- protected const short CS_SERVER_CERTIFICATE = 4;
- protected const short CS_CERTIFICATE_STATUS = 5;
- protected const short CS_SERVER_KEY_EXCHANGE = 6;
- protected const short CS_CERTIFICATE_REQUEST = 7;
- protected const short CS_SERVER_HELLO_DONE = 8;
- protected const short CS_CLIENT_SUPPLEMENTAL_DATA = 9;
- protected const short CS_CLIENT_CERTIFICATE = 10;
- protected const short CS_CLIENT_KEY_EXCHANGE = 11;
- protected const short CS_CERTIFICATE_VERIFY = 12;
- protected const short CS_CLIENT_FINISHED = 13;
- protected const short CS_SERVER_SESSION_TICKET = 14;
- protected const short CS_SERVER_FINISHED = 15;
- protected const short CS_END = 16;
-
- /*
- * Different modes to handle the known IV weakness
- */
- protected const short ADS_MODE_1_Nsub1 = 0; // 1/n-1 record splitting
- protected const short ADS_MODE_0_N = 1; // 0/n record splitting
- protected const short ADS_MODE_0_N_FIRSTONLY = 2; // 0/n record splitting on first data fragment only
-
- /*
- * Queues for data from some protocols.
- */
- private ByteQueue mApplicationDataQueue = new ByteQueue(0);
- private ByteQueue mAlertQueue = new ByteQueue(2);
- private ByteQueue mHandshakeQueue = new ByteQueue(0);
- // private ByteQueue mHeartbeatQueue = new ByteQueue();
-
- /*
- * The Record Stream we use
- */
- internal RecordStream mRecordStream;
- protected SecureRandom mSecureRandom;
-
- private TlsStream mTlsStream = null;
-
- private volatile bool mClosed = false;
- private volatile bool mFailedWithError = false;
- private volatile bool mAppDataReady = false;
- private volatile bool mAppDataSplitEnabled = true;
- private volatile int mAppDataSplitMode = ADS_MODE_1_Nsub1;
- private byte[] mExpectedVerifyData = null;
-
- protected TlsSession mTlsSession = null;
- protected SessionParameters mSessionParameters = null;
- protected SecurityParameters mSecurityParameters = null;
- protected Certificate mPeerCertificate = null;
-
- protected int[] mOfferedCipherSuites = null;
- protected byte[] mOfferedCompressionMethods = null;
- protected IDictionary mClientExtensions = null;
- protected IDictionary mServerExtensions = null;
-
- protected short mConnectionState = CS_START;
- protected bool mResumedSession = false;
- protected bool mReceivedChangeCipherSpec = false;
- protected bool mSecureRenegotiation = false;
- protected bool mAllowCertificateStatus = false;
- protected bool mExpectSessionTicket = false;
-
- protected bool mBlocking = true;
- protected ByteQueueStream mInputBuffers = null;
- protected ByteQueueStream mOutputBuffer = null;
-
- public TlsProtocol(Stream stream, SecureRandom secureRandom)
- : this(stream, stream, secureRandom)
- {
- }
-
- public TlsProtocol(Stream input, Stream output, SecureRandom secureRandom)
- {
- this.mRecordStream = new RecordStream(this, input, output);
- this.mSecureRandom = secureRandom;
- }
-
- public TlsProtocol(SecureRandom secureRandom)
- {
- this.mBlocking = false;
- this.mInputBuffers = new ByteQueueStream();
- this.mOutputBuffer = new ByteQueueStream();
- this.mRecordStream = new RecordStream(this, mInputBuffers, mOutputBuffer);
- this.mSecureRandom = secureRandom;
- }
-
- protected abstract TlsContext Context { get; }
-
- internal abstract AbstractTlsContext ContextAdmin { get; }
-
- protected abstract TlsPeer Peer { get; }
-
- protected virtual void HandleAlertMessage(byte alertLevel, byte alertDescription)
- {
- Peer.NotifyAlertReceived(alertLevel, alertDescription);
-
- if (alertLevel == AlertLevel.warning)
- {
- HandleAlertWarningMessage(alertDescription);
- }
- else
- {
- HandleFailure();
-
- throw new TlsFatalAlertReceived(alertDescription);
- }
- }
-
- protected virtual void HandleAlertWarningMessage(byte alertDescription)
- {
- /*
- * RFC 5246 7.2.1. The other party MUST respond with a close_notify alert of its own
- * and close down the connection immediately, discarding any pending writes.
- */
- if (alertDescription == AlertDescription.close_notify)
- {
- if (!mAppDataReady)
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
-
- HandleClose(false);
- }
- }
-
- protected virtual void HandleChangeCipherSpecMessage()
- {
- }
-
- protected virtual void HandleClose(bool user_canceled)
- {
- if (!mClosed)
- {
- this.mClosed = true;
-
- if (user_canceled && !mAppDataReady)
- {
- RaiseAlertWarning(AlertDescription.user_canceled, "User canceled handshake");
- }
-
- RaiseAlertWarning(AlertDescription.close_notify, "Connection closed");
-
- mRecordStream.SafeClose();
-
- if (!mAppDataReady)
- {
- CleanupHandshake();
- }
- }
- }
-
- protected virtual void HandleException(byte alertDescription, string message, Exception cause)
- {
- if (!mClosed)
- {
- RaiseAlertFatal(alertDescription, message, cause);
-
- HandleFailure();
- }
- }
-
- protected virtual void HandleFailure()
- {
- this.mClosed = true;
- this.mFailedWithError = true;
-
- /*
- * RFC 2246 7.2.1. The session becomes unresumable if any connection is terminated
- * without proper close_notify messages with level equal to warning.
- */
- // TODO This isn't quite in the right place. Also, as of TLS 1.1 the above is obsolete.
- InvalidateSession();
-
- mRecordStream.SafeClose();
-
- if (!mAppDataReady)
- {
- CleanupHandshake();
- }
- }
-
- protected abstract void HandleHandshakeMessage(byte type, MemoryStream buf);
-
- protected virtual void ApplyMaxFragmentLengthExtension()
- {
- if (mSecurityParameters.maxFragmentLength >= 0)
- {
- if (!MaxFragmentLength.IsValid((byte)mSecurityParameters.maxFragmentLength))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- int plainTextLimit = 1 << (8 + mSecurityParameters.maxFragmentLength);
- mRecordStream.SetPlaintextLimit(plainTextLimit);
- }
- }
-
- protected virtual void CheckReceivedChangeCipherSpec(bool expected)
- {
- if (expected != mReceivedChangeCipherSpec)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- protected virtual void CleanupHandshake()
- {
- if (this.mExpectedVerifyData != null)
- {
- Arrays.Fill(this.mExpectedVerifyData, (byte)0);
- this.mExpectedVerifyData = null;
- }
-
- this.mSecurityParameters.Clear();
- this.mPeerCertificate = null;
-
- this.mOfferedCipherSuites = null;
- this.mOfferedCompressionMethods = null;
- this.mClientExtensions = null;
- this.mServerExtensions = null;
-
- this.mResumedSession = false;
- this.mReceivedChangeCipherSpec = false;
- this.mSecureRenegotiation = false;
- this.mAllowCertificateStatus = false;
- this.mExpectSessionTicket = false;
- }
-
- protected virtual void BlockForHandshake()
- {
- if (mBlocking)
- {
- while (this.mConnectionState != CS_END)
- {
- if (this.mClosed)
- {
- // NOTE: Any close during the handshake should have raised an exception.
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- SafeReadRecord();
- }
- }
- }
-
- protected virtual void CompleteHandshake()
- {
- try
- {
- this.mConnectionState = CS_END;
-
- this.mAlertQueue.Shrink();
- this.mHandshakeQueue.Shrink();
-
- this.mRecordStream.FinaliseHandshake();
-
- this.mAppDataSplitEnabled = !TlsUtilities.IsTlsV11(Context);
-
- /*
- * If this was an initial handshake, we are now ready to send and receive application data.
- */
- if (!mAppDataReady)
- {
- this.mAppDataReady = true;
-
- if (mBlocking)
- {
- this.mTlsStream = new TlsStream(this);
- }
- }
-
- if (this.mTlsSession != null)
- {
- if (this.mSessionParameters == null)
- {
- this.mSessionParameters = new SessionParameters.Builder()
- .SetCipherSuite(this.mSecurityParameters.CipherSuite)
- .SetCompressionAlgorithm(this.mSecurityParameters.CompressionAlgorithm)
- .SetMasterSecret(this.mSecurityParameters.MasterSecret)
- .SetPeerCertificate(this.mPeerCertificate)
- .SetPskIdentity(this.mSecurityParameters.PskIdentity)
- .SetSrpIdentity(this.mSecurityParameters.SrpIdentity)
- // TODO Consider filtering extensions that aren't relevant to resumed sessions
- .SetServerExtensions(this.mServerExtensions)
- .Build();
-
- this.mTlsSession = new TlsSessionImpl(this.mTlsSession.SessionID, this.mSessionParameters);
- }
-
- ContextAdmin.SetResumableSession(this.mTlsSession);
- }
-
- Peer.NotifyHandshakeComplete();
- }
- finally
- {
- CleanupHandshake();
- }
- }
-
- protected internal void ProcessRecord(byte protocol, byte[] buf, int off, int len)
- {
- /*
- * Have a look at the protocol type, and add it to the correct queue.
- */
- switch (protocol)
- {
- case ContentType.alert:
- {
- mAlertQueue.AddData(buf, off, len);
- ProcessAlertQueue();
- break;
- }
- case ContentType.application_data:
- {
- if (!mAppDataReady)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- mApplicationDataQueue.AddData(buf, off, len);
- ProcessApplicationDataQueue();
- break;
- }
- case ContentType.change_cipher_spec:
- {
- ProcessChangeCipherSpec(buf, off, len);
- break;
- }
- case ContentType.handshake:
- {
- if (mHandshakeQueue.Available > 0)
- {
- mHandshakeQueue.AddData(buf, off, len);
- ProcessHandshakeQueue(mHandshakeQueue);
- }
- else
- {
- ByteQueue tmpQueue = new ByteQueue(buf, off, len);
- ProcessHandshakeQueue(tmpQueue);
- int remaining = tmpQueue.Available;
- if (remaining > 0)
- {
- mHandshakeQueue.AddData(buf, off + len - remaining, remaining);
- }
- }
- break;
- }
- //case ContentType.heartbeat:
- //{
- // if (!mAppDataReady)
- // throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- // // TODO[RFC 6520]
- // //mHeartbeatQueue.AddData(buf, offset, len);
- // //ProcessHeartbeat();
- // break;
- //}
- default:
- // Record type should already have been checked
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- private void ProcessHandshakeQueue(ByteQueue queue)
- {
- while (queue.Available >= 4)
- {
- /*
- * We need the first 4 bytes, they contain type and length of the message.
- */
- byte[] beginning = new byte[4];
- queue.Read(beginning, 0, 4, 0);
- byte type = TlsUtilities.ReadUint8(beginning, 0);
- int length = TlsUtilities.ReadUint24(beginning, 1);
- int totalLength = 4 + length;
-
- /*
- * Check if we have enough bytes in the buffer to read the full message.
- */
- if (queue.Available < totalLength)
- break;
-
- CheckReceivedChangeCipherSpec(mConnectionState == CS_END || type == HandshakeType.finished);
-
- /*
- * RFC 2246 7.4.9. The value handshake_messages includes all handshake messages
- * starting at client hello up to, but not including, this finished message.
- * [..] Note: [Also,] Hello Request messages are omitted from handshake hashes.
- */
- switch (type)
- {
- case HandshakeType.hello_request:
- break;
- case HandshakeType.finished:
- default:
- {
- TlsContext ctx = Context;
- if (type == HandshakeType.finished
- && this.mExpectedVerifyData == null
- && ctx.SecurityParameters.MasterSecret != null)
- {
- this.mExpectedVerifyData = CreateVerifyData(!ctx.IsServer);
- }
-
- queue.CopyTo(mRecordStream.HandshakeHashUpdater, totalLength);
- break;
- }
- }
-
- queue.RemoveData(4);
-
- MemoryStream buf = queue.ReadFrom(length);
-
- /*
- * Now, parse the message.
- */
- HandleHandshakeMessage(type, buf);
- }
- }
-
- private void ProcessApplicationDataQueue()
- {
- /*
- * There is nothing we need to do here.
- *
- * This function could be used for callbacks when application data arrives in the future.
- */
- }
-
- private void ProcessAlertQueue()
- {
- while (mAlertQueue.Available >= 2)
- {
- /*
- * An alert is always 2 bytes. Read the alert.
- */
- byte[] alert = mAlertQueue.RemoveData(2, 0);
- byte alertLevel = alert[0];
- byte alertDescription = alert[1];
-
- HandleAlertMessage(alertLevel, alertDescription);
- }
- }
-
- /**
- * This method is called, when a change cipher spec message is received.
- *
- * @throws IOException If the message has an invalid content or the handshake is not in the correct
- * state.
- */
- private void ProcessChangeCipherSpec(byte[] buf, int off, int len)
- {
- for (int i = 0; i < len; ++i)
- {
- byte message = TlsUtilities.ReadUint8(buf, off + i);
-
- if (message != ChangeCipherSpec.change_cipher_spec)
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- if (this.mReceivedChangeCipherSpec
- || mAlertQueue.Available > 0
- || mHandshakeQueue.Available > 0)
- {
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- mRecordStream.ReceivedReadCipherSpec();
-
- this.mReceivedChangeCipherSpec = true;
-
- HandleChangeCipherSpecMessage();
- }
- }
-
- protected internal virtual int ApplicationDataAvailable()
- {
- return mApplicationDataQueue.Available;
- }
-
- /**
- * Read data from the network. The method will return immediately, if there is still some data
- * left in the buffer, or block until some application data has been read from the network.
- *
- * @param buf The buffer where the data will be copied to.
- * @param offset The position where the data will be placed in the buffer.
- * @param len The maximum number of bytes to read.
- * @return The number of bytes read.
- * @throws IOException If something goes wrong during reading data.
- */
- protected internal virtual int ReadApplicationData(byte[] buf, int offset, int len)
- {
- if (len < 1)
- return 0;
-
- while (mApplicationDataQueue.Available == 0)
- {
- if (this.mClosed)
- {
- if (this.mFailedWithError)
- throw new IOException("Cannot read application data on failed TLS connection");
-
- if (!mAppDataReady)
- throw new InvalidOperationException("Cannot read application data until initial handshake completed.");
-
- return 0;
- }
-
- SafeReadRecord();
- }
-
- len = System.Math.Min(len, mApplicationDataQueue.Available);
- mApplicationDataQueue.RemoveData(buf, offset, len, 0);
- return len;
- }
-
- protected virtual void SafeCheckRecordHeader(byte[] recordHeader)
- {
- try
- {
- mRecordStream.CheckRecordHeader(recordHeader);
- }
- catch (TlsFatalAlert e)
- {
- HandleException(e.AlertDescription, "Failed to read record", e);
- throw e;
- }
- catch (IOException e)
- {
- HandleException(AlertDescription.internal_error, "Failed to read record", e);
- throw e;
- }
- catch (Exception e)
- {
- HandleException(AlertDescription.internal_error, "Failed to read record", e);
- throw new TlsFatalAlert(AlertDescription.internal_error, e);
- }
- }
-
- protected virtual void SafeReadRecord()
- {
- try
- {
- if (mRecordStream.ReadRecord())
- return;
-
- if (!mAppDataReady)
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
- }
- catch (TlsFatalAlertReceived e)
- {
- // Connection failure already handled at source
- throw e;
- }
- catch (TlsFatalAlert e)
- {
- HandleException(e.AlertDescription, "Failed to read record", e);
- throw e;
- }
- catch (IOException e)
- {
- HandleException(AlertDescription.internal_error, "Failed to read record", e);
- throw e;
- }
- catch (Exception e)
- {
- HandleException(AlertDescription.internal_error, "Failed to read record", e);
- throw new TlsFatalAlert(AlertDescription.internal_error, e);
- }
-
- HandleFailure();
-
- throw new TlsNoCloseNotifyException();
- }
-
- protected virtual void SafeWriteRecord(byte type, byte[] buf, int offset, int len)
- {
- try
- {
- mRecordStream.WriteRecord(type, buf, offset, len);
- }
- catch (TlsFatalAlert e)
- {
- HandleException(e.AlertDescription, "Failed to write record", e);
- throw e;
- }
- catch (IOException e)
- {
- HandleException(AlertDescription.internal_error, "Failed to write record", e);
- throw e;
- }
- catch (Exception e)
- {
- HandleException(AlertDescription.internal_error, "Failed to write record", e);
- throw new TlsFatalAlert(AlertDescription.internal_error, e);
- }
- }
-
- /**
- * Send some application data to the remote system.
- *
- * The method will handle fragmentation internally.
- *
- * @param buf The buffer with the data.
- * @param offset The position in the buffer where the data is placed.
- * @param len The length of the data.
- * @throws IOException If something goes wrong during sending.
- */
- protected internal virtual void WriteData(byte[] buf, int offset, int len)
- {
- if (this.mClosed)
- throw new IOException("Cannot write application data on closed/failed TLS connection");
-
- while (len > 0)
- {
- /*
- * RFC 5246 6.2.1. Zero-length fragments of Application data MAY be sent as they are
- * potentially useful as a traffic analysis countermeasure.
- *
- * NOTE: Actually, implementations appear to have settled on 1/n-1 record splitting.
- */
-
- if (this.mAppDataSplitEnabled)
- {
- /*
- * Protect against known IV attack!
- *
- * DO NOT REMOVE THIS CODE, EXCEPT YOU KNOW EXACTLY WHAT YOU ARE DOING HERE.
- */
- switch (mAppDataSplitMode)
- {
- case ADS_MODE_0_N:
- SafeWriteRecord(ContentType.application_data, TlsUtilities.EmptyBytes, 0, 0);
- break;
- case ADS_MODE_0_N_FIRSTONLY:
- this.mAppDataSplitEnabled = false;
- SafeWriteRecord(ContentType.application_data, TlsUtilities.EmptyBytes, 0, 0);
- break;
- case ADS_MODE_1_Nsub1:
- default:
- SafeWriteRecord(ContentType.application_data, buf, offset, 1);
- ++offset;
- --len;
- break;
- }
- }
-
- if (len > 0)
- {
- // Fragment data according to the current fragment limit.
- int toWrite = System.Math.Min(len, mRecordStream.GetPlaintextLimit());
- SafeWriteRecord(ContentType.application_data, buf, offset, toWrite);
- offset += toWrite;
- len -= toWrite;
- }
- }
- }
-
- protected virtual void SetAppDataSplitMode(int appDataSplitMode)
- {
- if (appDataSplitMode < ADS_MODE_1_Nsub1 || appDataSplitMode > ADS_MODE_0_N_FIRSTONLY)
- throw new ArgumentException("Illegal appDataSplitMode mode: " + appDataSplitMode, "appDataSplitMode");
-
- this.mAppDataSplitMode = appDataSplitMode;
- }
-
- protected virtual void WriteHandshakeMessage(byte[] buf, int off, int len)
- {
- if (len < 4)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- byte type = TlsUtilities.ReadUint8(buf, off);
- if (type != HandshakeType.hello_request)
- {
- mRecordStream.HandshakeHashUpdater.Write(buf, off, len);
- }
-
- int total = 0;
- do
- {
- // Fragment data according to the current fragment limit.
- int toWrite = System.Math.Min(len - total, mRecordStream.GetPlaintextLimit());
- SafeWriteRecord(ContentType.handshake, buf, off + total, toWrite);
- total += toWrite;
- }
- while (total < len);
- }
-
- /// The secure bidirectional stream for this connection
- /// Only allowed in blocking mode.
- public virtual Stream Stream
- {
- get
- {
- if (!mBlocking)
- throw new InvalidOperationException("Cannot use Stream in non-blocking mode! Use OfferInput()/OfferOutput() instead.");
- return this.mTlsStream;
- }
- }
-
- /**
- * Should be called in non-blocking mode when the input data reaches EOF.
- */
- public virtual void CloseInput()
- {
- if (mBlocking)
- throw new InvalidOperationException("Cannot use CloseInput() in blocking mode!");
-
- if (mClosed)
- return;
-
- if (mInputBuffers.Available > 0)
- throw new EndOfStreamException();
-
- if (!mAppDataReady)
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
-
- throw new TlsNoCloseNotifyException();
- }
-
- /**
- * Offer input from an arbitrary source. Only allowed in non-blocking mode.
- *
- * After this method returns, the input buffer is "owned" by this object. Other code
- * must not attempt to do anything with it.
- *
- * This method will decrypt and process all records that are fully available.
- * If only part of a record is available, the buffer will be retained until the
- * remainder of the record is offered.
- *
- * If any records containing application data were processed, the decrypted data
- * can be obtained using {@link #readInput(byte[], int, int)}. If any records
- * containing protocol data were processed, a response may have been generated.
- * You should always check to see if there is any available output after calling
- * this method by calling {@link #getAvailableOutputBytes()}.
- * @param input The input buffer to offer
- * @throws IOException If an error occurs while decrypting or processing a record
- */
- public virtual void OfferInput(byte[] input)
- {
- if (mBlocking)
- throw new InvalidOperationException("Cannot use OfferInput() in blocking mode! Use Stream instead.");
- if (mClosed)
- throw new IOException("Connection is closed, cannot accept any more input");
-
- mInputBuffers.Write(input);
-
- // loop while there are enough bytes to read the length of the next record
- while (mInputBuffers.Available >= RecordStream.TLS_HEADER_SIZE)
- {
- byte[] recordHeader = new byte[RecordStream.TLS_HEADER_SIZE];
- mInputBuffers.Peek(recordHeader);
-
- int totalLength = TlsUtilities.ReadUint16(recordHeader, RecordStream.TLS_HEADER_LENGTH_OFFSET) + RecordStream.TLS_HEADER_SIZE;
- if (mInputBuffers.Available < totalLength)
- {
- // not enough bytes to read a whole record
- SafeCheckRecordHeader(recordHeader);
- break;
- }
-
- SafeReadRecord();
-
- if (mClosed)
- {
- if (mConnectionState != CS_END)
- {
- // NOTE: Any close during the handshake should have raised an exception.
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- break;
- }
- }
- }
-
- /**
- * Gets the amount of received application data. A call to {@link #readInput(byte[], int, int)}
- * is guaranteed to be able to return at least this much data.
- *
- * Only allowed in non-blocking mode.
- * @return The number of bytes of available application data
- */
- public virtual int GetAvailableInputBytes()
- {
- if (mBlocking)
- throw new InvalidOperationException("Cannot use GetAvailableInputBytes() in blocking mode! Use ApplicationDataAvailable() instead.");
-
- return ApplicationDataAvailable();
- }
-
- /**
- * Retrieves received application data. Use {@link #getAvailableInputBytes()} to check
- * how much application data is currently available. This method functions similarly to
- * {@link InputStream#read(byte[], int, int)}, except that it never blocks. If no data
- * is available, nothing will be copied and zero will be returned.
- *
- * Only allowed in non-blocking mode.
- * @param buffer The buffer to hold the application data
- * @param offset The start offset in the buffer at which the data is written
- * @param length The maximum number of bytes to read
- * @return The total number of bytes copied to the buffer. May be less than the
- * length specified if the length was greater than the amount of available data.
- */
- public virtual int ReadInput(byte[] buffer, int offset, int length)
- {
- if (mBlocking)
- throw new InvalidOperationException("Cannot use ReadInput() in blocking mode! Use Stream instead.");
-
- return ReadApplicationData(buffer, offset, System.Math.Min(length, ApplicationDataAvailable()));
- }
-
- /**
- * Offer output from an arbitrary source. Only allowed in non-blocking mode.
- *
- * After this method returns, the specified section of the buffer will have been
- * processed. Use {@link #readOutput(byte[], int, int)} to get the bytes to
- * transmit to the other peer.
- *
- * This method must not be called until after the handshake is complete! Attempting
- * to call it before the handshake is complete will result in an exception.
- * @param buffer The buffer containing application data to encrypt
- * @param offset The offset at which to begin reading data
- * @param length The number of bytes of data to read
- * @throws IOException If an error occurs encrypting the data, or the handshake is not complete
- */
- public virtual void OfferOutput(byte[] buffer, int offset, int length)
- {
- if (mBlocking)
- throw new InvalidOperationException("Cannot use OfferOutput() in blocking mode! Use Stream instead.");
- if (!mAppDataReady)
- throw new IOException("Application data cannot be sent until the handshake is complete!");
-
- WriteData(buffer, offset, length);
- }
-
- /**
- * Gets the amount of encrypted data available to be sent. A call to
- * {@link #readOutput(byte[], int, int)} is guaranteed to be able to return at
- * least this much data.
- *
- * Only allowed in non-blocking mode.
- * @return The number of bytes of available encrypted data
- */
- public virtual int GetAvailableOutputBytes()
- {
- if (mBlocking)
- throw new InvalidOperationException("Cannot use GetAvailableOutputBytes() in blocking mode! Use Stream instead.");
-
- return mOutputBuffer.Available;
- }
-
- /**
- * Retrieves encrypted data to be sent. Use {@link #getAvailableOutputBytes()} to check
- * how much encrypted data is currently available. This method functions similarly to
- * {@link InputStream#read(byte[], int, int)}, except that it never blocks. If no data
- * is available, nothing will be copied and zero will be returned.
- *
- * Only allowed in non-blocking mode.
- * @param buffer The buffer to hold the encrypted data
- * @param offset The start offset in the buffer at which the data is written
- * @param length The maximum number of bytes to read
- * @return The total number of bytes copied to the buffer. May be less than the
- * length specified if the length was greater than the amount of available data.
- */
- public virtual int ReadOutput(byte[] buffer, int offset, int length)
- {
- if (mBlocking)
- throw new InvalidOperationException("Cannot use ReadOutput() in blocking mode! Use Stream instead.");
-
- return mOutputBuffer.Read(buffer, offset, length);
- }
-
- protected virtual void InvalidateSession()
- {
- if (this.mSessionParameters != null)
- {
- this.mSessionParameters.Clear();
- this.mSessionParameters = null;
- }
-
- if (this.mTlsSession != null)
- {
- this.mTlsSession.Invalidate();
- this.mTlsSession = null;
- }
- }
-
- protected virtual void ProcessFinishedMessage(MemoryStream buf)
- {
- if (mExpectedVerifyData == null)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- byte[] verify_data = TlsUtilities.ReadFully(mExpectedVerifyData.Length, buf);
-
- AssertEmpty(buf);
-
- /*
- * Compare both checksums.
- */
- if (!Arrays.ConstantTimeAreEqual(mExpectedVerifyData, verify_data))
- {
- /*
- * Wrong checksum in the finished message.
- */
- throw new TlsFatalAlert(AlertDescription.decrypt_error);
- }
- }
-
- protected virtual void RaiseAlertFatal(byte alertDescription, string message, Exception cause)
- {
- Peer.NotifyAlertRaised(AlertLevel.fatal, alertDescription, message, cause);
-
- byte[] alert = new byte[]{ AlertLevel.fatal, alertDescription };
-
- try
- {
- mRecordStream.WriteRecord(ContentType.alert, alert, 0, 2);
- }
- catch (Exception)
- {
- // We are already processing an exception, so just ignore this
- }
- }
-
- protected virtual void RaiseAlertWarning(byte alertDescription, string message)
- {
- Peer.NotifyAlertRaised(AlertLevel.warning, alertDescription, message, null);
-
- byte[] alert = new byte[]{ AlertLevel.warning, alertDescription };
-
- SafeWriteRecord(ContentType.alert, alert, 0, 2);
- }
-
- protected virtual void SendCertificateMessage(Certificate certificate)
- {
- if (certificate == null)
- {
- certificate = Certificate.EmptyChain;
- }
-
- if (certificate.IsEmpty)
- {
- TlsContext context = Context;
- if (!context.IsServer)
- {
- ProtocolVersion serverVersion = Context.ServerVersion;
- if (serverVersion.IsSsl)
- {
- string errorMessage = serverVersion.ToString() + " client didn't provide credentials";
- RaiseAlertWarning(AlertDescription.no_certificate, errorMessage);
- return;
- }
- }
- }
-
- HandshakeMessage message = new HandshakeMessage(HandshakeType.certificate);
-
- certificate.Encode(message);
-
- message.WriteToRecordStream(this);
- }
-
- protected virtual void SendChangeCipherSpecMessage()
- {
- byte[] message = new byte[]{ 1 };
- SafeWriteRecord(ContentType.change_cipher_spec, message, 0, message.Length);
- mRecordStream.SentWriteCipherSpec();
- }
-
- protected virtual void SendFinishedMessage()
- {
- byte[] verify_data = CreateVerifyData(Context.IsServer);
-
- HandshakeMessage message = new HandshakeMessage(HandshakeType.finished, verify_data.Length);
-
- message.Write(verify_data, 0, verify_data.Length);
-
- message.WriteToRecordStream(this);
- }
-
- protected virtual void SendSupplementalDataMessage(IList supplementalData)
- {
- HandshakeMessage message = new HandshakeMessage(HandshakeType.supplemental_data);
-
- WriteSupplementalData(message, supplementalData);
-
- message.WriteToRecordStream(this);
- }
-
- protected virtual byte[] CreateVerifyData(bool isServer)
- {
- TlsContext context = Context;
- string asciiLabel = isServer ? ExporterLabel.server_finished : ExporterLabel.client_finished;
- byte[] sslSender = isServer ? TlsUtilities.SSL_SERVER : TlsUtilities.SSL_CLIENT;
- byte[] hash = GetCurrentPrfHash(context, mRecordStream.HandshakeHash, sslSender);
- return TlsUtilities.CalculateVerifyData(context, asciiLabel, hash);
- }
-
- /**
- * Closes this connection.
- *
- * @throws IOException If something goes wrong during closing.
- */
- public virtual void Close()
- {
- HandleClose(true);
- }
-
- protected internal virtual void Flush()
- {
- mRecordStream.Flush();
- }
-
- public virtual bool IsClosed
- {
- get { return mClosed; }
- }
-
- protected virtual short ProcessMaxFragmentLengthExtension(IDictionary clientExtensions, IDictionary serverExtensions,
- byte alertDescription)
- {
- short maxFragmentLength = TlsExtensionsUtilities.GetMaxFragmentLengthExtension(serverExtensions);
- if (maxFragmentLength >= 0)
- {
- if (!MaxFragmentLength.IsValid((byte)maxFragmentLength)
- || (!this.mResumedSession && maxFragmentLength != TlsExtensionsUtilities
- .GetMaxFragmentLengthExtension(clientExtensions)))
- {
- throw new TlsFatalAlert(alertDescription);
- }
- }
- return maxFragmentLength;
- }
-
- protected virtual void RefuseRenegotiation()
- {
- /*
- * RFC 5746 4.5 SSLv3 clients that refuse renegotiation SHOULD use a fatal
- * handshake_failure alert.
- */
- if (TlsUtilities.IsSsl(Context))
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
-
- RaiseAlertWarning(AlertDescription.no_renegotiation, "Renegotiation not supported");
- }
-
- /**
- * Make sure the InputStream 'buf' now empty. Fail otherwise.
- *
- * @param buf The InputStream to check.
- * @throws IOException If 'buf' is not empty.
- */
- protected internal static void AssertEmpty(MemoryStream buf)
- {
- if (buf.Position < buf.Length)
- throw new TlsFatalAlert(AlertDescription.decode_error);
- }
-
- protected internal static byte[] CreateRandomBlock(bool useGmtUnixTime, IRandomGenerator randomGenerator)
- {
- byte[] result = new byte[32];
- randomGenerator.NextBytes(result);
-
- if (useGmtUnixTime)
- {
- TlsUtilities.WriteGmtUnixTime(result, 0);
- }
-
- return result;
- }
-
- protected internal static byte[] CreateRenegotiationInfo(byte[] renegotiated_connection)
- {
- return TlsUtilities.EncodeOpaque8(renegotiated_connection);
- }
-
- protected internal static void EstablishMasterSecret(TlsContext context, TlsKeyExchange keyExchange)
- {
- byte[] pre_master_secret = keyExchange.GeneratePremasterSecret();
-
- try
- {
- context.SecurityParameters.masterSecret = TlsUtilities.CalculateMasterSecret(context, pre_master_secret);
- }
- finally
- {
- // TODO Is there a way to ensure the data is really overwritten?
- /*
- * RFC 2246 8.1. The pre_master_secret should be deleted from memory once the
- * master_secret has been computed.
- */
- if (pre_master_secret != null)
- {
- Arrays.Fill(pre_master_secret, (byte)0);
- }
- }
- }
-
- /**
- * 'sender' only relevant to SSLv3
- */
- protected internal static byte[] GetCurrentPrfHash(TlsContext context, TlsHandshakeHash handshakeHash, byte[] sslSender)
- {
- IDigest d = handshakeHash.ForkPrfHash();
-
- if (sslSender != null && TlsUtilities.IsSsl(context))
- {
- d.BlockUpdate(sslSender, 0, sslSender.Length);
- }
-
- return DigestUtilities.DoFinal(d);
- }
-
- protected internal static IDictionary ReadExtensions(MemoryStream input)
- {
- if (input.Position >= input.Length)
- return null;
-
- byte[] extBytes = TlsUtilities.ReadOpaque16(input);
-
- AssertEmpty(input);
-
- MemoryStream buf = new MemoryStream(extBytes, false);
-
- // Integer -> byte[]
- IDictionary extensions = Platform.CreateHashtable();
-
- while (buf.Position < buf.Length)
- {
- int extension_type = TlsUtilities.ReadUint16(buf);
- byte[] extension_data = TlsUtilities.ReadOpaque16(buf);
-
- /*
- * RFC 3546 2.3 There MUST NOT be more than one extension of the same type.
- */
- if (extensions.Contains(extension_type))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- extensions.Add(extension_type, extension_data);
- }
-
- return extensions;
- }
-
- protected internal static IList ReadSupplementalDataMessage(MemoryStream input)
- {
- byte[] supp_data = TlsUtilities.ReadOpaque24(input);
-
- AssertEmpty(input);
-
- MemoryStream buf = new MemoryStream(supp_data, false);
-
- IList supplementalData = Platform.CreateArrayList();
-
- while (buf.Position < buf.Length)
- {
- int supp_data_type = TlsUtilities.ReadUint16(buf);
- byte[] data = TlsUtilities.ReadOpaque16(buf);
-
- supplementalData.Add(new SupplementalDataEntry(supp_data_type, data));
- }
-
- return supplementalData;
- }
-
- protected internal static void WriteExtensions(Stream output, IDictionary extensions)
- {
- MemoryStream buf = new MemoryStream();
-
- /*
- * NOTE: There are reports of servers that don't accept a zero-length extension as the last
- * one, so we write out any zero-length ones first as a best-effort workaround.
- */
- WriteSelectedExtensions(buf, extensions, true);
- WriteSelectedExtensions(buf, extensions, false);
-
- byte[] extBytes = buf.ToArray();
-
- TlsUtilities.WriteOpaque16(extBytes, output);
- }
-
- protected internal static void WriteSelectedExtensions(Stream output, IDictionary extensions, bool selectEmpty)
- {
- foreach (int extension_type in extensions.Keys)
- {
- byte[] extension_data = (byte[])extensions[extension_type];
- if (selectEmpty == (extension_data.Length == 0))
- {
- TlsUtilities.CheckUint16(extension_type);
- TlsUtilities.WriteUint16(extension_type, output);
- TlsUtilities.WriteOpaque16(extension_data, output);
- }
- }
- }
-
- protected internal static void WriteSupplementalData(Stream output, IList supplementalData)
- {
- MemoryStream buf = new MemoryStream();
-
- foreach (SupplementalDataEntry entry in supplementalData)
- {
- int supp_data_type = entry.DataType;
- TlsUtilities.CheckUint16(supp_data_type);
- TlsUtilities.WriteUint16(supp_data_type, buf);
- TlsUtilities.WriteOpaque16(entry.Data, buf);
- }
-
- byte[] supp_data = buf.ToArray();
-
- TlsUtilities.WriteOpaque24(supp_data, output);
- }
-
- protected internal static int GetPrfAlgorithm(TlsContext context, int ciphersuite)
- {
- bool isTLSv12 = TlsUtilities.IsTlsV12(context);
-
- switch (ciphersuite)
- {
- case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CCM:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_128_OCB:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CCM:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_256_OCB:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_128_OCB:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM_8:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_256_OCB:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_128_OCB:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_256_OCB:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_256_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_256_OCB:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_PSK_DHE_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_PSK_DHE_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_PSK_WITH_AES_128_CCM:
- case CipherSuite.TLS_PSK_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_PSK_WITH_AES_128_OCB:
- case CipherSuite.TLS_PSK_WITH_AES_256_CCM:
- case CipherSuite.TLS_PSK_WITH_AES_256_CCM_8:
- case CipherSuite.DRAFT_TLS_PSK_WITH_AES_256_OCB:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_RSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_RSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_NULL_SHA256:
- {
- if (isTLSv12)
- {
- return PrfAlgorithm.tls_prf_sha256;
- }
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- case CipherSuite.TLS_DH_anon_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- {
- if (isTLSv12)
- {
- return PrfAlgorithm.tls_prf_sha384;
- }
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA384:
- {
- if (isTLSv12)
- {
- return PrfAlgorithm.tls_prf_sha384;
- }
- return PrfAlgorithm.tls_prf_legacy;
- }
-
- default:
- {
- if (isTLSv12)
- {
- return PrfAlgorithm.tls_prf_sha256;
- }
- return PrfAlgorithm.tls_prf_legacy;
- }
- }
- }
-
- internal class HandshakeMessage
- : MemoryStream
- {
- internal HandshakeMessage(byte handshakeType)
- : this(handshakeType, 60)
- {
- }
-
- internal HandshakeMessage(byte handshakeType, int length)
- : base(length + 4)
- {
- TlsUtilities.WriteUint8(handshakeType, this);
- // Reserve space for length
- TlsUtilities.WriteUint24(0, this);
- }
-
- internal void Write(byte[] data)
- {
- Write(data, 0, data.Length);
- }
-
- internal void WriteToRecordStream(TlsProtocol protocol)
- {
- // Patch actual length back in
- long length = Length - 4;
- TlsUtilities.CheckUint24(length);
- this.Position = 1;
- TlsUtilities.WriteUint24((int)length, this);
-
-#if PORTABLE
- byte[] buf = ToArray();
- int bufLen = buf.Length;
-#else
- byte[] buf = GetBuffer();
- int bufLen = (int)Length;
-#endif
-
- protocol.WriteHandshakeMessage(buf, 0, bufLen);
- Platform.Dispose(this);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsProtocolHandler.cs b/BCCrypto/src/crypto/tls/TlsProtocolHandler.cs
deleted file mode 100644
index 6f22346..0000000
--- a/BCCrypto/src/crypto/tls/TlsProtocolHandler.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Agreement;
-using Org.BouncyCastle.Crypto.Agreement.Srp;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Encodings;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Prng;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- [Obsolete("Use 'TlsClientProtocol' instead")]
- public class TlsProtocolHandler
- : TlsClientProtocol
- {
- public TlsProtocolHandler(Stream stream, SecureRandom secureRandom)
- : base(stream, stream, secureRandom)
- {
- }
-
- /// Both streams can be the same object
- public TlsProtocolHandler(Stream input, Stream output, SecureRandom secureRandom)
- : base(input, output, secureRandom)
- {
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsPskIdentity.cs b/BCCrypto/src/crypto/tls/TlsPskIdentity.cs
deleted file mode 100644
index 119064e..0000000
--- a/BCCrypto/src/crypto/tls/TlsPskIdentity.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsPskIdentity
- {
- void SkipIdentityHint();
-
- void NotifyIdentityHint(byte[] psk_identity_hint);
-
- byte[] GetPskIdentity();
-
- byte[] GetPsk();
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsPskIdentityManager.cs b/BCCrypto/src/crypto/tls/TlsPskIdentityManager.cs
deleted file mode 100644
index a72c229..0000000
--- a/BCCrypto/src/crypto/tls/TlsPskIdentityManager.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsPskIdentityManager
- {
- byte[] GetHint();
-
- byte[] GetPsk(byte[] identity);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsPskKeyExchange.cs b/BCCrypto/src/crypto/tls/TlsPskKeyExchange.cs
deleted file mode 100644
index 0af7f7a..0000000
--- a/BCCrypto/src/crypto/tls/TlsPskKeyExchange.cs
+++ /dev/null
@@ -1,328 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// (D)TLS PSK key exchange (RFC 4279).
- public class TlsPskKeyExchange
- : AbstractTlsKeyExchange
- {
- protected TlsPskIdentity mPskIdentity;
- protected TlsPskIdentityManager mPskIdentityManager;
-
- protected DHParameters mDHParameters;
- protected int[] mNamedCurves;
- protected byte[] mClientECPointFormats, mServerECPointFormats;
-
- protected byte[] mPskIdentityHint = null;
- protected byte[] mPsk = null;
-
- protected DHPrivateKeyParameters mDHAgreePrivateKey = null;
- protected DHPublicKeyParameters mDHAgreePublicKey = null;
-
- protected ECPrivateKeyParameters mECAgreePrivateKey = null;
- protected ECPublicKeyParameters mECAgreePublicKey = null;
-
- protected AsymmetricKeyParameter mServerPublicKey = null;
- protected RsaKeyParameters mRsaServerPublicKey = null;
- protected TlsEncryptionCredentials mServerCredentials = null;
- protected byte[] mPremasterSecret;
-
- public TlsPskKeyExchange(int keyExchange, IList supportedSignatureAlgorithms, TlsPskIdentity pskIdentity,
- TlsPskIdentityManager pskIdentityManager, DHParameters dhParameters, int[] namedCurves,
- byte[] clientECPointFormats, byte[] serverECPointFormats)
- : base(keyExchange, supportedSignatureAlgorithms)
- {
- switch (keyExchange)
- {
- case KeyExchangeAlgorithm.DHE_PSK:
- case KeyExchangeAlgorithm.ECDHE_PSK:
- case KeyExchangeAlgorithm.PSK:
- case KeyExchangeAlgorithm.RSA_PSK:
- break;
- default:
- throw new InvalidOperationException("unsupported key exchange algorithm");
- }
-
- this.mPskIdentity = pskIdentity;
- this.mPskIdentityManager = pskIdentityManager;
- this.mDHParameters = dhParameters;
- this.mNamedCurves = namedCurves;
- this.mClientECPointFormats = clientECPointFormats;
- this.mServerECPointFormats = serverECPointFormats;
- }
-
- public override void SkipServerCredentials()
- {
- if (mKeyExchange == KeyExchangeAlgorithm.RSA_PSK)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- public override void ProcessServerCredentials(TlsCredentials serverCredentials)
- {
- if (!(serverCredentials is TlsEncryptionCredentials))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- ProcessServerCertificate(serverCredentials.Certificate);
-
- this.mServerCredentials = (TlsEncryptionCredentials)serverCredentials;
- }
-
- public override byte[] GenerateServerKeyExchange()
- {
- this.mPskIdentityHint = mPskIdentityManager.GetHint();
-
- if (this.mPskIdentityHint == null && !RequiresServerKeyExchange)
- return null;
-
- MemoryStream buf = new MemoryStream();
-
- if (this.mPskIdentityHint == null)
- {
- TlsUtilities.WriteOpaque16(TlsUtilities.EmptyBytes, buf);
- }
- else
- {
- TlsUtilities.WriteOpaque16(this.mPskIdentityHint, buf);
- }
-
- if (this.mKeyExchange == KeyExchangeAlgorithm.DHE_PSK)
- {
- if (this.mDHParameters == null)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- this.mDHAgreePrivateKey = TlsDHUtilities.GenerateEphemeralServerKeyExchange(mContext.SecureRandom,
- this.mDHParameters, buf);
- }
- else if (this.mKeyExchange == KeyExchangeAlgorithm.ECDHE_PSK)
- {
- this.mECAgreePrivateKey = TlsEccUtilities.GenerateEphemeralServerKeyExchange(mContext.SecureRandom,
- mNamedCurves, mClientECPointFormats, buf);
- }
-
- return buf.ToArray();
- }
-
- public override void ProcessServerCertificate(Certificate serverCertificate)
- {
- if (mKeyExchange != KeyExchangeAlgorithm.RSA_PSK)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- if (serverCertificate.IsEmpty)
- throw new TlsFatalAlert(AlertDescription.bad_certificate);
-
- X509CertificateStructure x509Cert = serverCertificate.GetCertificateAt(0);
-
- SubjectPublicKeyInfo keyInfo = x509Cert.SubjectPublicKeyInfo;
- try
- {
- this.mServerPublicKey = PublicKeyFactory.CreateKey(keyInfo);
- }
- catch (Exception e)
- {
- throw new TlsFatalAlert(AlertDescription.unsupported_certificate, e);
- }
-
- // Sanity check the PublicKeyFactory
- if (this.mServerPublicKey.IsPrivate)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- this.mRsaServerPublicKey = ValidateRsaPublicKey((RsaKeyParameters)this.mServerPublicKey);
-
- TlsUtilities.ValidateKeyUsage(x509Cert, KeyUsage.KeyEncipherment);
-
- base.ProcessServerCertificate(serverCertificate);
- }
-
- public override bool RequiresServerKeyExchange
- {
- get
- {
- switch (mKeyExchange)
- {
- case KeyExchangeAlgorithm.DHE_PSK:
- case KeyExchangeAlgorithm.ECDHE_PSK:
- return true;
- default:
- return false;
- }
- }
- }
-
- public override void ProcessServerKeyExchange(Stream input)
- {
- this.mPskIdentityHint = TlsUtilities.ReadOpaque16(input);
-
- if (this.mKeyExchange == KeyExchangeAlgorithm.DHE_PSK)
- {
- ServerDHParams serverDHParams = ServerDHParams.Parse(input);
-
- this.mDHAgreePublicKey = TlsDHUtilities.ValidateDHPublicKey(serverDHParams.PublicKey);
- this.mDHParameters = mDHAgreePublicKey.Parameters;
- }
- else if (this.mKeyExchange == KeyExchangeAlgorithm.ECDHE_PSK)
- {
- ECDomainParameters ecParams = TlsEccUtilities.ReadECParameters(mNamedCurves, mClientECPointFormats, input);
-
- byte[] point = TlsUtilities.ReadOpaque8(input);
-
- this.mECAgreePublicKey = TlsEccUtilities.ValidateECPublicKey(TlsEccUtilities.DeserializeECPublicKey(
- mClientECPointFormats, ecParams, point));
- }
- }
-
- public override void ValidateCertificateRequest(CertificateRequest certificateRequest)
- {
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- public override void ProcessClientCredentials(TlsCredentials clientCredentials)
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public override void GenerateClientKeyExchange(Stream output)
- {
- if (mPskIdentityHint == null)
- {
- mPskIdentity.SkipIdentityHint();
- }
- else
- {
- mPskIdentity.NotifyIdentityHint(mPskIdentityHint);
- }
-
- byte[] psk_identity = mPskIdentity.GetPskIdentity();
- if (psk_identity == null)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- this.mPsk = mPskIdentity.GetPsk();
- if (mPsk == null)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- TlsUtilities.WriteOpaque16(psk_identity, output);
-
- mContext.SecurityParameters.pskIdentity = psk_identity;
-
- if (this.mKeyExchange == KeyExchangeAlgorithm.DHE_PSK)
- {
- this.mDHAgreePrivateKey = TlsDHUtilities.GenerateEphemeralClientKeyExchange(mContext.SecureRandom,
- mDHParameters, output);
- }
- else if (this.mKeyExchange == KeyExchangeAlgorithm.ECDHE_PSK)
- {
- this.mECAgreePrivateKey = TlsEccUtilities.GenerateEphemeralClientKeyExchange(mContext.SecureRandom,
- mServerECPointFormats, mECAgreePublicKey.Parameters, output);
- }
- else if (this.mKeyExchange == KeyExchangeAlgorithm.RSA_PSK)
- {
- this.mPremasterSecret = TlsRsaUtilities.GenerateEncryptedPreMasterSecret(mContext,
- this.mRsaServerPublicKey, output);
- }
- }
-
- public override void ProcessClientKeyExchange(Stream input)
- {
- byte[] psk_identity = TlsUtilities.ReadOpaque16(input);
-
- this.mPsk = mPskIdentityManager.GetPsk(psk_identity);
- if (mPsk == null)
- throw new TlsFatalAlert(AlertDescription.unknown_psk_identity);
-
- mContext.SecurityParameters.pskIdentity = psk_identity;
-
- if (this.mKeyExchange == KeyExchangeAlgorithm.DHE_PSK)
- {
- BigInteger Yc = TlsDHUtilities.ReadDHParameter(input);
-
- this.mDHAgreePublicKey = TlsDHUtilities.ValidateDHPublicKey(new DHPublicKeyParameters(Yc, mDHParameters));
- }
- else if (this.mKeyExchange == KeyExchangeAlgorithm.ECDHE_PSK)
- {
- byte[] point = TlsUtilities.ReadOpaque8(input);
-
- ECDomainParameters curve_params = this.mECAgreePrivateKey.Parameters;
-
- this.mECAgreePublicKey = TlsEccUtilities.ValidateECPublicKey(TlsEccUtilities.DeserializeECPublicKey(
- mServerECPointFormats, curve_params, point));
- }
- else if (this.mKeyExchange == KeyExchangeAlgorithm.RSA_PSK)
- {
- byte[] encryptedPreMasterSecret;
- if (TlsUtilities.IsSsl(mContext))
- {
- // TODO Do any SSLv3 clients actually include the length?
- encryptedPreMasterSecret = Streams.ReadAll(input);
- }
- else
- {
- encryptedPreMasterSecret = TlsUtilities.ReadOpaque16(input);
- }
-
- this.mPremasterSecret = mServerCredentials.DecryptPreMasterSecret(encryptedPreMasterSecret);
- }
- }
-
- public override byte[] GeneratePremasterSecret()
- {
- byte[] other_secret = GenerateOtherSecret(mPsk.Length);
-
- MemoryStream buf = new MemoryStream(4 + other_secret.Length + mPsk.Length);
- TlsUtilities.WriteOpaque16(other_secret, buf);
- TlsUtilities.WriteOpaque16(mPsk, buf);
-
- Arrays.Fill(mPsk, (byte)0);
- this.mPsk = null;
-
- return buf.ToArray();
- }
-
- protected virtual byte[] GenerateOtherSecret(int pskLength)
- {
- if (this.mKeyExchange == KeyExchangeAlgorithm.DHE_PSK)
- {
- if (mDHAgreePrivateKey != null)
- {
- return TlsDHUtilities.CalculateDHBasicAgreement(mDHAgreePublicKey, mDHAgreePrivateKey);
- }
-
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- if (this.mKeyExchange == KeyExchangeAlgorithm.ECDHE_PSK)
- {
- if (mECAgreePrivateKey != null)
- {
- return TlsEccUtilities.CalculateECDHBasicAgreement(mECAgreePublicKey, mECAgreePrivateKey);
- }
-
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- if (this.mKeyExchange == KeyExchangeAlgorithm.RSA_PSK)
- {
- return this.mPremasterSecret;
- }
-
- return new byte[pskLength];
- }
-
- protected virtual RsaKeyParameters ValidateRsaPublicKey(RsaKeyParameters key)
- {
- // TODO What is the minimum bit length required?
- // key.Modulus.BitLength;
-
- if (!key.Exponent.IsProbablePrime(2))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- return key;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsRsaKeyExchange.cs b/BCCrypto/src/crypto/tls/TlsRsaKeyExchange.cs
deleted file mode 100644
index b02d564..0000000
--- a/BCCrypto/src/crypto/tls/TlsRsaKeyExchange.cs
+++ /dev/null
@@ -1,140 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Encodings;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// (D)TLS and SSLv3 RSA key exchange.
- public class TlsRsaKeyExchange
- : AbstractTlsKeyExchange
- {
- protected AsymmetricKeyParameter mServerPublicKey = null;
-
- protected RsaKeyParameters mRsaServerPublicKey = null;
-
- protected TlsEncryptionCredentials mServerCredentials = null;
-
- protected byte[] mPremasterSecret;
-
- public TlsRsaKeyExchange(IList supportedSignatureAlgorithms)
- : base(KeyExchangeAlgorithm.RSA, supportedSignatureAlgorithms)
- {
- }
-
- public override void SkipServerCredentials()
- {
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- public override void ProcessServerCredentials(TlsCredentials serverCredentials)
- {
- if (!(serverCredentials is TlsEncryptionCredentials))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- ProcessServerCertificate(serverCredentials.Certificate);
-
- this.mServerCredentials = (TlsEncryptionCredentials)serverCredentials;
- }
-
- public override void ProcessServerCertificate(Certificate serverCertificate)
- {
- if (serverCertificate.IsEmpty)
- throw new TlsFatalAlert(AlertDescription.bad_certificate);
-
- X509CertificateStructure x509Cert = serverCertificate.GetCertificateAt(0);
-
- SubjectPublicKeyInfo keyInfo = x509Cert.SubjectPublicKeyInfo;
- try
- {
- this.mServerPublicKey = PublicKeyFactory.CreateKey(keyInfo);
- }
- catch (Exception e)
- {
- throw new TlsFatalAlert(AlertDescription.unsupported_certificate, e);
- }
-
- // Sanity check the PublicKeyFactory
- if (this.mServerPublicKey.IsPrivate)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- this.mRsaServerPublicKey = ValidateRsaPublicKey((RsaKeyParameters)this.mServerPublicKey);
-
- TlsUtilities.ValidateKeyUsage(x509Cert, KeyUsage.KeyEncipherment);
-
- base.ProcessServerCertificate(serverCertificate);
- }
-
- public override void ValidateCertificateRequest(CertificateRequest certificateRequest)
- {
- byte[] types = certificateRequest.CertificateTypes;
- for (int i = 0; i < types.Length; ++i)
- {
- switch (types[i])
- {
- case ClientCertificateType.rsa_sign:
- case ClientCertificateType.dss_sign:
- case ClientCertificateType.ecdsa_sign:
- break;
- default:
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- }
- }
-
- public override void ProcessClientCredentials(TlsCredentials clientCredentials)
- {
- if (!(clientCredentials is TlsSignerCredentials))
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public override void GenerateClientKeyExchange(Stream output)
- {
- this.mPremasterSecret = TlsRsaUtilities.GenerateEncryptedPreMasterSecret(mContext, mRsaServerPublicKey, output);
- }
-
- public override void ProcessClientKeyExchange(Stream input)
- {
- byte[] encryptedPreMasterSecret;
- if (TlsUtilities.IsSsl(mContext))
- {
- // TODO Do any SSLv3 clients actually include the length?
- encryptedPreMasterSecret = Streams.ReadAll(input);
- }
- else
- {
- encryptedPreMasterSecret = TlsUtilities.ReadOpaque16(input);
- }
-
- this.mPremasterSecret = mServerCredentials.DecryptPreMasterSecret(encryptedPreMasterSecret);
- }
-
- public override byte[] GeneratePremasterSecret()
- {
- if (this.mPremasterSecret == null)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- byte[] tmp = this.mPremasterSecret;
- this.mPremasterSecret = null;
- return tmp;
- }
-
- protected virtual RsaKeyParameters ValidateRsaPublicKey(RsaKeyParameters key)
- {
- // TODO What is the minimum bit length required?
- // key.Modulus.BitLength;
-
- if (!key.Exponent.IsProbablePrime(2))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- return key;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsRsaSigner.cs b/BCCrypto/src/crypto/tls/TlsRsaSigner.cs
deleted file mode 100644
index 1614f50..0000000
--- a/BCCrypto/src/crypto/tls/TlsRsaSigner.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Encodings;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Signers;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsRsaSigner
- : AbstractTlsSigner
- {
- public override byte[] GenerateRawSignature(SignatureAndHashAlgorithm algorithm,
- AsymmetricKeyParameter privateKey, byte[] hash)
- {
- ISigner signer = MakeSigner(algorithm, true, true,
- new ParametersWithRandom(privateKey, this.mContext.SecureRandom));
- signer.BlockUpdate(hash, 0, hash.Length);
- return signer.GenerateSignature();
- }
-
- public override bool VerifyRawSignature(SignatureAndHashAlgorithm algorithm, byte[] sigBytes,
- AsymmetricKeyParameter publicKey, byte[] hash)
- {
- ISigner signer = MakeSigner(algorithm, true, false, publicKey);
- signer.BlockUpdate(hash, 0, hash.Length);
- return signer.VerifySignature(sigBytes);
- }
-
- public override ISigner CreateSigner(SignatureAndHashAlgorithm algorithm, AsymmetricKeyParameter privateKey)
- {
- return MakeSigner(algorithm, false, true, new ParametersWithRandom(privateKey, this.mContext.SecureRandom));
- }
-
- public override ISigner CreateVerifyer(SignatureAndHashAlgorithm algorithm, AsymmetricKeyParameter publicKey)
- {
- return MakeSigner(algorithm, false, false, publicKey);
- }
-
- public override bool IsValidPublicKey(AsymmetricKeyParameter publicKey)
- {
- return publicKey is RsaKeyParameters && !publicKey.IsPrivate;
- }
-
- protected virtual ISigner MakeSigner(SignatureAndHashAlgorithm algorithm, bool raw, bool forSigning,
- ICipherParameters cp)
- {
- if ((algorithm != null) != TlsUtilities.IsTlsV12(mContext))
- throw new InvalidOperationException();
- if (algorithm != null && algorithm.Signature != SignatureAlgorithm.rsa)
- throw new InvalidOperationException();
-
- IDigest d;
- if (raw)
- {
- d = new NullDigest();
- }
- else if (algorithm == null)
- {
- d = new CombinedHash();
- }
- else
- {
- d = TlsUtilities.CreateHash(algorithm.Hash);
- }
-
- ISigner s;
- if (algorithm != null)
- {
- /*
- * RFC 5246 4.7. In RSA signing, the opaque vector contains the signature generated
- * using the RSASSA-PKCS1-v1_5 signature scheme defined in [PKCS1].
- */
- s = new RsaDigestSigner(d, TlsUtilities.GetOidForHashAlgorithm(algorithm.Hash));
- }
- else
- {
- /*
- * RFC 5246 4.7. Note that earlier versions of TLS used a different RSA signature scheme
- * that did not include a DigestInfo encoding.
- */
- s = new GenericSigner(CreateRsaImpl(), d);
- }
- s.Init(forSigning, cp);
- return s;
- }
-
- protected virtual IAsymmetricBlockCipher CreateRsaImpl()
- {
- /*
- * RFC 5246 7.4.7.1. Implementation note: It is now known that remote timing-based attacks
- * on TLS are possible, at least when the client and server are on the same LAN.
- * Accordingly, implementations that use static RSA keys MUST use RSA blinding or some other
- * anti-timing technique, as described in [TIMING].
- */
- return new Pkcs1Encoding(new RsaBlindedEngine());
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsRsaUtilities.cs b/BCCrypto/src/crypto/tls/TlsRsaUtilities.cs
deleted file mode 100644
index 0e42c17..0000000
--- a/BCCrypto/src/crypto/tls/TlsRsaUtilities.cs
+++ /dev/null
@@ -1,132 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Encodings;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class TlsRsaUtilities
- {
- ///
- public static byte[] GenerateEncryptedPreMasterSecret(TlsContext context, RsaKeyParameters rsaServerPublicKey,
- Stream output)
- {
- /*
- * Choose a PremasterSecret and send it encrypted to the server
- */
- byte[] premasterSecret = new byte[48];
- context.SecureRandom.NextBytes(premasterSecret);
- TlsUtilities.WriteVersion(context.ClientVersion, premasterSecret, 0);
-
- Pkcs1Encoding encoding = new Pkcs1Encoding(new RsaBlindedEngine());
- encoding.Init(true, new ParametersWithRandom(rsaServerPublicKey, context.SecureRandom));
-
- try
- {
- byte[] encryptedPreMasterSecret = encoding.ProcessBlock(premasterSecret, 0, premasterSecret.Length);
-
- if (TlsUtilities.IsSsl(context))
- {
- // TODO Do any SSLv3 servers actually expect the length?
- output.Write(encryptedPreMasterSecret, 0, encryptedPreMasterSecret.Length);
- }
- else
- {
- TlsUtilities.WriteOpaque16(encryptedPreMasterSecret, output);
- }
- }
- catch (InvalidCipherTextException e)
- {
- /*
- * This should never happen, only during decryption.
- */
- throw new TlsFatalAlert(AlertDescription.internal_error, e);
- }
-
- return premasterSecret;
- }
-
- public static byte[] SafeDecryptPreMasterSecret(TlsContext context, RsaKeyParameters rsaServerPrivateKey,
- byte[] encryptedPreMasterSecret)
- {
- /*
- * RFC 5246 7.4.7.1.
- */
- ProtocolVersion clientVersion = context.ClientVersion;
-
- // TODO Provide as configuration option?
- bool versionNumberCheckDisabled = false;
-
- /*
- * Generate 48 random bytes we can use as a Pre-Master-Secret, if the
- * PKCS1 padding check should fail.
- */
- byte[] fallback = new byte[48];
- context.SecureRandom.NextBytes(fallback);
-
- byte[] M = Arrays.Clone(fallback);
- try
- {
- Pkcs1Encoding encoding = new Pkcs1Encoding(new RsaBlindedEngine(), fallback);
- encoding.Init(false,
- new ParametersWithRandom(rsaServerPrivateKey, context.SecureRandom));
-
- M = encoding.ProcessBlock(encryptedPreMasterSecret, 0, encryptedPreMasterSecret.Length);
- }
- catch (Exception)
- {
- /*
- * This should never happen since the decryption should never throw an exception
- * and return a random value instead.
- *
- * In any case, a TLS server MUST NOT generate an alert if processing an
- * RSA-encrypted premaster secret message fails, or the version number is not as
- * expected. Instead, it MUST continue the handshake with a randomly generated
- * premaster secret.
- */
- }
-
- /*
- * If ClientHello.client_version is TLS 1.1 or higher, server implementations MUST
- * check the version number [..].
- */
- if (versionNumberCheckDisabled && clientVersion.IsEqualOrEarlierVersionOf(ProtocolVersion.TLSv10))
- {
- /*
- * If the version number is TLS 1.0 or earlier, server
- * implementations SHOULD check the version number, but MAY have a
- * configuration option to disable the check.
- *
- * So there is nothing to do here.
- */
- }
- else
- {
- /*
- * OK, we need to compare the version number in the decrypted Pre-Master-Secret with the
- * clientVersion received during the handshake. If they don't match, we replace the
- * decrypted Pre-Master-Secret with a random one.
- */
- int correct = (clientVersion.MajorVersion ^ (M[0] & 0xff))
- | (clientVersion.MinorVersion ^ (M[1] & 0xff));
- correct |= correct >> 1;
- correct |= correct >> 2;
- correct |= correct >> 4;
- int mask = ~((correct & 1) - 1);
-
- /*
- * mask will be all bits set to 0xff if the version number differed.
- */
- for (int i = 0; i < 48; i++)
- {
- M[i] = (byte)((M[i] & (~mask)) | (fallback[i] & mask));
- }
- }
- return M;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsServer.cs b/BCCrypto/src/crypto/tls/TlsServer.cs
deleted file mode 100644
index e791f93..0000000
--- a/BCCrypto/src/crypto/tls/TlsServer.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsServer
- : TlsPeer
- {
- void Init(TlsServerContext context);
-
- ///
- void NotifyClientVersion(ProtocolVersion clientVersion);
-
- ///
- void NotifyFallback(bool isFallback);
-
- ///
- void NotifyOfferedCipherSuites(int[] offeredCipherSuites);
-
- ///
- void NotifyOfferedCompressionMethods(byte[] offeredCompressionMethods);
-
- /// A (Int32 -> byte[]). Will never be null.
- ///
- void ProcessClientExtensions(IDictionary clientExtensions);
-
- ///
- ProtocolVersion GetServerVersion();
-
- ///
- int GetSelectedCipherSuite();
-
- ///
- byte GetSelectedCompressionMethod();
-
- ///
- /// Get the (optional) table of server extensions to be included in (extended) server hello.
- ///
- ///
- /// A (Int32 -> byte[]). May be null.
- ///
- ///
- IDictionary GetServerExtensions();
-
- ///
- /// A ( ). May be null.
- ///
- ///
- IList GetServerSupplementalData();
-
- ///
- TlsCredentials GetCredentials();
-
- ///
- /// This method will be called (only) if the server included an extension of type
- /// "status_request" with empty "extension_data" in the extended server hello. See RFC 3546
- /// 3.6. Certificate Status Request . If a non-null is returned, it
- /// is sent to the client as a handshake message of type "certificate_status".
- ///
- /// A to be sent to the client (or null for none).
- ///
- CertificateStatus GetCertificateStatus();
-
- ///
- TlsKeyExchange GetKeyExchange();
-
- ///
- CertificateRequest GetCertificateRequest();
-
- /// ( )
- ///
- void ProcessClientSupplementalData(IList clientSupplementalData);
-
- ///
- /// Called by the protocol handler to report the client certificate, only if GetCertificateRequest
- /// returned non-null.
- ///
- /// Note: this method is responsible for certificate verification and validation.
- /// the effective client certificate (may be an empty chain).
- ///
- void NotifyClientCertificate(Certificate clientCertificate);
-
- /// RFC 5077 3.3. NewSessionTicket Handshake Message.
- ///
- /// This method will be called (only) if a NewSessionTicket extension was sent by the server. See
- /// RFC 5077 4. Recommended Ticket Construction for recommended format and protection.
- ///
- /// The ticket )
- ///
- NewSessionTicket GetNewSessionTicket();
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsServerContext.cs b/BCCrypto/src/crypto/tls/TlsServerContext.cs
deleted file mode 100644
index 4021571..0000000
--- a/BCCrypto/src/crypto/tls/TlsServerContext.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsServerContext
- : TlsContext
- {
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsServerContextImpl.cs b/BCCrypto/src/crypto/tls/TlsServerContextImpl.cs
deleted file mode 100644
index d56566f..0000000
--- a/BCCrypto/src/crypto/tls/TlsServerContextImpl.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- internal class TlsServerContextImpl
- : AbstractTlsContext, TlsServerContext
- {
- internal TlsServerContextImpl(SecureRandom secureRandom, SecurityParameters securityParameters)
- : base(secureRandom, securityParameters)
- {
- }
-
- public override bool IsServer
- {
- get { return true; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsServerProtocol.cs b/BCCrypto/src/crypto/tls/TlsServerProtocol.cs
deleted file mode 100644
index c2bfbcb..0000000
--- a/BCCrypto/src/crypto/tls/TlsServerProtocol.cs
+++ /dev/null
@@ -1,833 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsServerProtocol
- : TlsProtocol
- {
- protected TlsServer mTlsServer = null;
- internal TlsServerContextImpl mTlsServerContext = null;
-
- protected TlsKeyExchange mKeyExchange = null;
- protected TlsCredentials mServerCredentials = null;
- protected CertificateRequest mCertificateRequest = null;
-
- protected short mClientCertificateType = -1;
- protected TlsHandshakeHash mPrepareFinishHash = null;
-
- /**
- * Constructor for blocking mode.
- * @param stream The bi-directional stream of data to/from the client
- * @param output The stream of data to the client
- * @param secureRandom Random number generator for various cryptographic functions
- */
- public TlsServerProtocol(Stream stream, SecureRandom secureRandom)
- : base(stream, secureRandom)
- {
- }
-
- /**
- * Constructor for blocking mode.
- * @param input The stream of data from the client
- * @param output The stream of data to the client
- * @param secureRandom Random number generator for various cryptographic functions
- */
- public TlsServerProtocol(Stream input, Stream output, SecureRandom secureRandom)
- : base(input, output, secureRandom)
- {
- }
-
- /**
- * Constructor for non-blocking mode.
- *
- * When data is received, use {@link #offerInput(java.nio.ByteBuffer)} to
- * provide the received ciphertext, then use
- * {@link #readInput(byte[], int, int)} to read the corresponding cleartext.
- *
- * Similarly, when data needs to be sent, use
- * {@link #offerOutput(byte[], int, int)} to provide the cleartext, then use
- * {@link #readOutput(byte[], int, int)} to get the corresponding
- * ciphertext.
- *
- * @param secureRandom
- * Random number generator for various cryptographic functions
- */
- public TlsServerProtocol(SecureRandom secureRandom)
- : base(secureRandom)
- {
- }
-
- /**
- * Receives a TLS handshake in the role of server.
- *
- * In blocking mode, this will not return until the handshake is complete.
- * In non-blocking mode, use {@link TlsPeer#notifyHandshakeComplete()} to
- * receive a callback when the handshake is complete.
- *
- * @param tlsServer
- * @throws IOException If in blocking mode and handshake was not successful.
- */
- public virtual void Accept(TlsServer tlsServer)
- {
- if (tlsServer == null)
- throw new ArgumentNullException("tlsServer");
- if (this.mTlsServer != null)
- throw new InvalidOperationException("'Accept' can only be called once");
-
- this.mTlsServer = tlsServer;
-
- this.mSecurityParameters = new SecurityParameters();
- this.mSecurityParameters.entity = ConnectionEnd.server;
-
- this.mTlsServerContext = new TlsServerContextImpl(mSecureRandom, mSecurityParameters);
-
- this.mSecurityParameters.serverRandom = CreateRandomBlock(tlsServer.ShouldUseGmtUnixTime(),
- mTlsServerContext.NonceRandomGenerator);
-
- this.mTlsServer.Init(mTlsServerContext);
- this.mRecordStream.Init(mTlsServerContext);
-
- this.mRecordStream.SetRestrictReadVersion(false);
-
- BlockForHandshake();
- }
-
- protected override void CleanupHandshake()
- {
- base.CleanupHandshake();
-
- this.mKeyExchange = null;
- this.mServerCredentials = null;
- this.mCertificateRequest = null;
- this.mPrepareFinishHash = null;
- }
-
- protected override TlsContext Context
- {
- get { return mTlsServerContext; }
- }
-
- internal override AbstractTlsContext ContextAdmin
- {
- get { return mTlsServerContext; }
- }
-
- protected override TlsPeer Peer
- {
- get { return mTlsServer; }
- }
-
- protected override void HandleHandshakeMessage(byte type, MemoryStream buf)
- {
- switch (type)
- {
- case HandshakeType.client_hello:
- {
- switch (this.mConnectionState)
- {
- case CS_START:
- {
- ReceiveClientHelloMessage(buf);
- this.mConnectionState = CS_CLIENT_HELLO;
-
- SendServerHelloMessage();
- this.mConnectionState = CS_SERVER_HELLO;
-
- mRecordStream.NotifyHelloComplete();
-
- IList serverSupplementalData = mTlsServer.GetServerSupplementalData();
- if (serverSupplementalData != null)
- {
- SendSupplementalDataMessage(serverSupplementalData);
- }
- this.mConnectionState = CS_SERVER_SUPPLEMENTAL_DATA;
-
- this.mKeyExchange = mTlsServer.GetKeyExchange();
- this.mKeyExchange.Init(Context);
-
- this.mServerCredentials = mTlsServer.GetCredentials();
-
- Certificate serverCertificate = null;
-
- if (this.mServerCredentials == null)
- {
- this.mKeyExchange.SkipServerCredentials();
- }
- else
- {
- this.mKeyExchange.ProcessServerCredentials(this.mServerCredentials);
-
- serverCertificate = this.mServerCredentials.Certificate;
- SendCertificateMessage(serverCertificate);
- }
- this.mConnectionState = CS_SERVER_CERTIFICATE;
-
- // TODO[RFC 3546] Check whether empty certificates is possible, allowed, or excludes CertificateStatus
- if (serverCertificate == null || serverCertificate.IsEmpty)
- {
- this.mAllowCertificateStatus = false;
- }
-
- if (this.mAllowCertificateStatus)
- {
- CertificateStatus certificateStatus = mTlsServer.GetCertificateStatus();
- if (certificateStatus != null)
- {
- SendCertificateStatusMessage(certificateStatus);
- }
- }
-
- this.mConnectionState = CS_CERTIFICATE_STATUS;
-
- byte[] serverKeyExchange = this.mKeyExchange.GenerateServerKeyExchange();
- if (serverKeyExchange != null)
- {
- SendServerKeyExchangeMessage(serverKeyExchange);
- }
- this.mConnectionState = CS_SERVER_KEY_EXCHANGE;
-
- if (this.mServerCredentials != null)
- {
- this.mCertificateRequest = mTlsServer.GetCertificateRequest();
- if (this.mCertificateRequest != null)
- {
- if (TlsUtilities.IsTlsV12(Context) != (mCertificateRequest.SupportedSignatureAlgorithms != null))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- this.mKeyExchange.ValidateCertificateRequest(mCertificateRequest);
-
- SendCertificateRequestMessage(mCertificateRequest);
-
- TlsUtilities.TrackHashAlgorithms(this.mRecordStream.HandshakeHash,
- this.mCertificateRequest.SupportedSignatureAlgorithms);
- }
- }
- this.mConnectionState = CS_CERTIFICATE_REQUEST;
-
- SendServerHelloDoneMessage();
- this.mConnectionState = CS_SERVER_HELLO_DONE;
-
- this.mRecordStream.HandshakeHash.SealHashAlgorithms();
-
- break;
- }
- case CS_END:
- {
- RefuseRenegotiation();
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- break;
- }
- case HandshakeType.supplemental_data:
- {
- switch (this.mConnectionState)
- {
- case CS_SERVER_HELLO_DONE:
- {
- mTlsServer.ProcessClientSupplementalData(ReadSupplementalDataMessage(buf));
- this.mConnectionState = CS_CLIENT_SUPPLEMENTAL_DATA;
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- break;
- }
- case HandshakeType.certificate:
- {
- switch (this.mConnectionState)
- {
- case CS_SERVER_HELLO_DONE:
- case CS_CLIENT_SUPPLEMENTAL_DATA:
- {
- if (mConnectionState < CS_CLIENT_SUPPLEMENTAL_DATA)
- {
- mTlsServer.ProcessClientSupplementalData(null);
- }
-
- if (this.mCertificateRequest == null)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- ReceiveCertificateMessage(buf);
- this.mConnectionState = CS_CLIENT_CERTIFICATE;
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- break;
- }
- case HandshakeType.client_key_exchange:
- {
- switch (this.mConnectionState)
- {
- case CS_SERVER_HELLO_DONE:
- case CS_CLIENT_SUPPLEMENTAL_DATA:
- case CS_CLIENT_CERTIFICATE:
- {
- if (mConnectionState < CS_CLIENT_SUPPLEMENTAL_DATA)
- {
- mTlsServer.ProcessClientSupplementalData(null);
- }
-
- if (mConnectionState < CS_CLIENT_CERTIFICATE)
- {
- if (this.mCertificateRequest == null)
- {
- this.mKeyExchange.SkipClientCredentials();
- }
- else
- {
- if (TlsUtilities.IsTlsV12(Context))
- {
- /*
- * RFC 5246 If no suitable certificate is available, the client MUST Send a
- * certificate message containing no certificates.
- *
- * NOTE: In previous RFCs, this was SHOULD instead of MUST.
- */
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- else if (TlsUtilities.IsSsl(Context))
- {
- if (this.mPeerCertificate == null)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- else
- {
- NotifyClientCertificate(Certificate.EmptyChain);
- }
- }
- }
-
- ReceiveClientKeyExchangeMessage(buf);
- this.mConnectionState = CS_CLIENT_KEY_EXCHANGE;
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- break;
- }
- case HandshakeType.certificate_verify:
- {
- switch (this.mConnectionState)
- {
- case CS_CLIENT_KEY_EXCHANGE:
- {
- /*
- * RFC 5246 7.4.8 This message is only sent following a client certificate that has
- * signing capability (i.e., all certificates except those containing fixed
- * Diffie-Hellman parameters).
- */
- if (!ExpectCertificateVerifyMessage())
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- ReceiveCertificateVerifyMessage(buf);
- this.mConnectionState = CS_CERTIFICATE_VERIFY;
-
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- break;
- }
- case HandshakeType.finished:
- {
- switch (this.mConnectionState)
- {
- case CS_CLIENT_KEY_EXCHANGE:
- case CS_CERTIFICATE_VERIFY:
- {
- if (mConnectionState < CS_CERTIFICATE_VERIFY && ExpectCertificateVerifyMessage())
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- ProcessFinishedMessage(buf);
- this.mConnectionState = CS_CLIENT_FINISHED;
-
- if (this.mExpectSessionTicket)
- {
- SendNewSessionTicketMessage(mTlsServer.GetNewSessionTicket());
- SendChangeCipherSpecMessage();
- }
- this.mConnectionState = CS_SERVER_SESSION_TICKET;
-
- SendFinishedMessage();
- this.mConnectionState = CS_SERVER_FINISHED;
-
- CompleteHandshake();
- break;
- }
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- break;
- }
- case HandshakeType.hello_request:
- case HandshakeType.hello_verify_request:
- case HandshakeType.server_hello:
- case HandshakeType.server_key_exchange:
- case HandshakeType.certificate_request:
- case HandshakeType.server_hello_done:
- case HandshakeType.session_ticket:
- default:
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- }
-
- protected override void HandleAlertWarningMessage(byte alertDescription)
- {
- base.HandleAlertWarningMessage(alertDescription);
-
- switch (alertDescription)
- {
- case AlertDescription.no_certificate:
- {
- /*
- * SSL 3.0 If the server has sent a certificate request Message, the client must send
- * either the certificate message or a no_certificate alert.
- */
- if (TlsUtilities.IsSsl(Context) && this.mCertificateRequest != null)
- {
- switch (this.mConnectionState)
- {
- case CS_SERVER_HELLO_DONE:
- case CS_CLIENT_SUPPLEMENTAL_DATA:
- {
- if (mConnectionState < CS_CLIENT_SUPPLEMENTAL_DATA)
- {
- mTlsServer.ProcessClientSupplementalData(null);
- }
-
- NotifyClientCertificate(Certificate.EmptyChain);
- this.mConnectionState = CS_CLIENT_CERTIFICATE;
- return;
- }
- }
- }
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
- }
- }
-
- protected virtual void NotifyClientCertificate(Certificate clientCertificate)
- {
- if (mCertificateRequest == null)
- throw new InvalidOperationException();
- if (mPeerCertificate != null)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
-
- this.mPeerCertificate = clientCertificate;
-
- if (clientCertificate.IsEmpty)
- {
- this.mKeyExchange.SkipClientCredentials();
- }
- else
- {
-
- /*
- * TODO RFC 5246 7.4.6. If the certificate_authorities list in the certificate request
- * message was non-empty, one of the certificates in the certificate chain SHOULD be
- * issued by one of the listed CAs.
- */
-
- this.mClientCertificateType = TlsUtilities.GetClientCertificateType(clientCertificate,
- this.mServerCredentials.Certificate);
-
- this.mKeyExchange.ProcessClientCertificate(clientCertificate);
- }
-
- /*
- * RFC 5246 7.4.6. If the client does not Send any certificates, the server MAY at its
- * discretion either continue the handshake without client authentication, or respond with a
- * fatal handshake_failure alert. Also, if some aspect of the certificate chain was
- * unacceptable (e.g., it was not signed by a known, trusted CA), the server MAY at its
- * discretion either continue the handshake (considering the client unauthenticated) or Send
- * a fatal alert.
- */
- this.mTlsServer.NotifyClientCertificate(clientCertificate);
- }
-
- protected virtual void ReceiveCertificateMessage(MemoryStream buf)
- {
- Certificate clientCertificate = Certificate.Parse(buf);
-
- AssertEmpty(buf);
-
- NotifyClientCertificate(clientCertificate);
- }
-
- protected virtual void ReceiveCertificateVerifyMessage(MemoryStream buf)
- {
- if (mCertificateRequest == null)
- throw new InvalidOperationException();
-
- DigitallySigned clientCertificateVerify = DigitallySigned.Parse(Context, buf);
-
- AssertEmpty(buf);
-
- // Verify the CertificateVerify message contains a correct signature.
- try
- {
- SignatureAndHashAlgorithm signatureAlgorithm = clientCertificateVerify.Algorithm;
-
- byte[] hash;
- if (TlsUtilities.IsTlsV12(Context))
- {
- TlsUtilities.VerifySupportedSignatureAlgorithm(mCertificateRequest.SupportedSignatureAlgorithms, signatureAlgorithm);
- hash = mPrepareFinishHash.GetFinalHash(signatureAlgorithm.Hash);
- }
- else
- {
- hash = mSecurityParameters.SessionHash;
- }
-
- X509CertificateStructure x509Cert = mPeerCertificate.GetCertificateAt(0);
- SubjectPublicKeyInfo keyInfo = x509Cert.SubjectPublicKeyInfo;
- AsymmetricKeyParameter publicKey = PublicKeyFactory.CreateKey(keyInfo);
-
- TlsSigner tlsSigner = TlsUtilities.CreateTlsSigner((byte)mClientCertificateType);
- tlsSigner.Init(Context);
- if (!tlsSigner.VerifyRawSignature(signatureAlgorithm, clientCertificateVerify.Signature, publicKey, hash))
- throw new TlsFatalAlert(AlertDescription.decrypt_error);
- }
- catch (TlsFatalAlert e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new TlsFatalAlert(AlertDescription.decrypt_error, e);
- }
- }
-
- protected virtual void ReceiveClientHelloMessage(MemoryStream buf)
- {
- ProtocolVersion client_version = TlsUtilities.ReadVersion(buf);
- mRecordStream.SetWriteVersion(client_version);
-
- if (client_version.IsDtls)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- byte[] client_random = TlsUtilities.ReadFully(32, buf);
-
- /*
- * TODO RFC 5077 3.4. If a ticket is presented by the client, the server MUST NOT attempt to
- * use the Session ID in the ClientHello for stateful session resumption.
- */
- byte[] sessionID = TlsUtilities.ReadOpaque8(buf);
- if (sessionID.Length > 32)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- /*
- * TODO RFC 5246 7.4.1.2. If the session_id field is not empty (implying a session
- * resumption request), this vector MUST include at least the cipher_suite from that
- * session.
- */
- int cipher_suites_length = TlsUtilities.ReadUint16(buf);
- if (cipher_suites_length < 2 || (cipher_suites_length & 1) != 0)
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- this.mOfferedCipherSuites = TlsUtilities.ReadUint16Array(cipher_suites_length / 2, buf);
-
- /*
- * TODO RFC 5246 7.4.1.2. If the session_id field is not empty (implying a session
- * resumption request), it MUST include the compression_method from that session.
- */
- int compression_methods_length = TlsUtilities.ReadUint8(buf);
- if (compression_methods_length < 1)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
-
- this.mOfferedCompressionMethods = TlsUtilities.ReadUint8Array(compression_methods_length, buf);
-
- /*
- * TODO RFC 3546 2.3 If [...] the older session is resumed, then the server MUST ignore
- * extensions appearing in the client hello, and Send a server hello containing no
- * extensions.
- */
- this.mClientExtensions = ReadExtensions(buf);
-
- /*
- * TODO[session-hash]
- *
- * draft-ietf-tls-session-hash-04 4. Clients and servers SHOULD NOT accept handshakes
- * that do not use the extended master secret [..]. (and see 5.2, 5.3)
- */
- this.mSecurityParameters.extendedMasterSecret = TlsExtensionsUtilities.HasExtendedMasterSecretExtension(mClientExtensions);
-
- ContextAdmin.SetClientVersion(client_version);
-
- mTlsServer.NotifyClientVersion(client_version);
- mTlsServer.NotifyFallback(Arrays.Contains(mOfferedCipherSuites, CipherSuite.TLS_FALLBACK_SCSV));
-
- mSecurityParameters.clientRandom = client_random;
-
- mTlsServer.NotifyOfferedCipherSuites(mOfferedCipherSuites);
- mTlsServer.NotifyOfferedCompressionMethods(mOfferedCompressionMethods);
-
- /*
- * RFC 5746 3.6. Server Behavior: Initial Handshake
- */
- {
- /*
- * RFC 5746 3.4. The client MUST include either an empty "renegotiation_info" extension,
- * or the TLS_EMPTY_RENEGOTIATION_INFO_SCSV signaling cipher suite value in the
- * ClientHello. Including both is NOT RECOMMENDED.
- */
-
- /*
- * When a ClientHello is received, the server MUST check if it includes the
- * TLS_EMPTY_RENEGOTIATION_INFO_SCSV SCSV. If it does, set the secure_renegotiation flag
- * to TRUE.
- */
- if (Arrays.Contains(mOfferedCipherSuites, CipherSuite.TLS_EMPTY_RENEGOTIATION_INFO_SCSV))
- {
- this.mSecureRenegotiation = true;
- }
-
- /*
- * The server MUST check if the "renegotiation_info" extension is included in the
- * ClientHello.
- */
- byte[] renegExtData = TlsUtilities.GetExtensionData(mClientExtensions, ExtensionType.renegotiation_info);
- if (renegExtData != null)
- {
- /*
- * If the extension is present, set secure_renegotiation flag to TRUE. The
- * server MUST then verify that the length of the "renegotiated_connection"
- * field is zero, and if it is not, MUST abort the handshake.
- */
- this.mSecureRenegotiation = true;
-
- if (!Arrays.ConstantTimeAreEqual(renegExtData, CreateRenegotiationInfo(TlsUtilities.EmptyBytes)))
- throw new TlsFatalAlert(AlertDescription.handshake_failure);
- }
- }
-
- mTlsServer.NotifySecureRenegotiation(this.mSecureRenegotiation);
-
- if (mClientExtensions != null)
- {
- // NOTE: Validates the padding extension data, if present
- TlsExtensionsUtilities.GetPaddingExtension(mClientExtensions);
-
- mTlsServer.ProcessClientExtensions(mClientExtensions);
- }
- }
-
- protected virtual void ReceiveClientKeyExchangeMessage(MemoryStream buf)
- {
- mKeyExchange.ProcessClientKeyExchange(buf);
-
- AssertEmpty(buf);
-
- if (TlsUtilities.IsSsl(Context))
- {
- EstablishMasterSecret(Context, mKeyExchange);
- }
-
- this.mPrepareFinishHash = mRecordStream.PrepareToFinish();
- this.mSecurityParameters.sessionHash = GetCurrentPrfHash(Context, mPrepareFinishHash, null);
-
- if (!TlsUtilities.IsSsl(Context))
- {
- EstablishMasterSecret(Context, mKeyExchange);
- }
-
- mRecordStream.SetPendingConnectionState(Peer.GetCompression(), Peer.GetCipher());
-
- if (!mExpectSessionTicket)
- {
- SendChangeCipherSpecMessage();
- }
- }
-
- protected virtual void SendCertificateRequestMessage(CertificateRequest certificateRequest)
- {
- HandshakeMessage message = new HandshakeMessage(HandshakeType.certificate_request);
-
- certificateRequest.Encode(message);
-
- message.WriteToRecordStream(this);
- }
-
- protected virtual void SendCertificateStatusMessage(CertificateStatus certificateStatus)
- {
- HandshakeMessage message = new HandshakeMessage(HandshakeType.certificate_status);
-
- certificateStatus.Encode(message);
-
- message.WriteToRecordStream(this);
- }
-
- protected virtual void SendNewSessionTicketMessage(NewSessionTicket newSessionTicket)
- {
- if (newSessionTicket == null)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- HandshakeMessage message = new HandshakeMessage(HandshakeType.session_ticket);
-
- newSessionTicket.Encode(message);
-
- message.WriteToRecordStream(this);
- }
-
- protected virtual void SendServerHelloMessage()
- {
- HandshakeMessage message = new HandshakeMessage(HandshakeType.server_hello);
-
- {
- ProtocolVersion server_version = mTlsServer.GetServerVersion();
- if (!server_version.IsEqualOrEarlierVersionOf(Context.ClientVersion))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- mRecordStream.ReadVersion = server_version;
- mRecordStream.SetWriteVersion(server_version);
- mRecordStream.SetRestrictReadVersion(true);
- ContextAdmin.SetServerVersion(server_version);
-
- TlsUtilities.WriteVersion(server_version, message);
- }
-
- message.Write(this.mSecurityParameters.serverRandom);
-
- /*
- * The server may return an empty session_id to indicate that the session will not be cached
- * and therefore cannot be resumed.
- */
- TlsUtilities.WriteOpaque8(TlsUtilities.EmptyBytes, message);
-
- int selectedCipherSuite = mTlsServer.GetSelectedCipherSuite();
- if (!Arrays.Contains(mOfferedCipherSuites, selectedCipherSuite)
- || selectedCipherSuite == CipherSuite.TLS_NULL_WITH_NULL_NULL
- || CipherSuite.IsScsv(selectedCipherSuite)
- || !TlsUtilities.IsValidCipherSuiteForVersion(selectedCipherSuite, Context.ServerVersion))
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- mSecurityParameters.cipherSuite = selectedCipherSuite;
-
- byte selectedCompressionMethod = mTlsServer.GetSelectedCompressionMethod();
- if (!Arrays.Contains(mOfferedCompressionMethods, selectedCompressionMethod))
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- mSecurityParameters.compressionAlgorithm = selectedCompressionMethod;
-
- TlsUtilities.WriteUint16(selectedCipherSuite, message);
- TlsUtilities.WriteUint8(selectedCompressionMethod, message);
-
- this.mServerExtensions = mTlsServer.GetServerExtensions();
-
- /*
- * RFC 5746 3.6. Server Behavior: Initial Handshake
- */
- if (this.mSecureRenegotiation)
- {
- byte[] renegExtData = TlsUtilities.GetExtensionData(this.mServerExtensions, ExtensionType.renegotiation_info);
- bool noRenegExt = (null == renegExtData);
-
- if (noRenegExt)
- {
- /*
- * Note that Sending a "renegotiation_info" extension in response to a ClientHello
- * containing only the SCSV is an explicit exception to the prohibition in RFC 5246,
- * Section 7.4.1.4, on the server Sending unsolicited extensions and is only allowed
- * because the client is signaling its willingness to receive the extension via the
- * TLS_EMPTY_RENEGOTIATION_INFO_SCSV SCSV.
- */
-
- /*
- * If the secure_renegotiation flag is set to TRUE, the server MUST include an empty
- * "renegotiation_info" extension in the ServerHello message.
- */
- this.mServerExtensions = TlsExtensionsUtilities.EnsureExtensionsInitialised(mServerExtensions);
- this.mServerExtensions[ExtensionType.renegotiation_info] = CreateRenegotiationInfo(TlsUtilities.EmptyBytes);
- }
- }
-
- if (mSecurityParameters.extendedMasterSecret)
- {
- this.mServerExtensions = TlsExtensionsUtilities.EnsureExtensionsInitialised(mServerExtensions);
- TlsExtensionsUtilities.AddExtendedMasterSecretExtension(mServerExtensions);
- }
-
- /*
- * TODO RFC 3546 2.3 If [...] the older session is resumed, then the server MUST ignore
- * extensions appearing in the client hello, and Send a server hello containing no
- * extensions.
- */
-
- if (this.mServerExtensions != null)
- {
- this.mSecurityParameters.encryptThenMac = TlsExtensionsUtilities.HasEncryptThenMacExtension(mServerExtensions);
-
- this.mSecurityParameters.maxFragmentLength = ProcessMaxFragmentLengthExtension(mClientExtensions,
- mServerExtensions, AlertDescription.internal_error);
-
- this.mSecurityParameters.truncatedHMac = TlsExtensionsUtilities.HasTruncatedHMacExtension(mServerExtensions);
-
- /*
- * TODO It's surprising that there's no provision to allow a 'fresh' CertificateStatus to be sent in
- * a session resumption handshake.
- */
- this.mAllowCertificateStatus = !mResumedSession
- && TlsUtilities.HasExpectedEmptyExtensionData(mServerExtensions, ExtensionType.status_request,
- AlertDescription.internal_error);
-
- this.mExpectSessionTicket = !mResumedSession
- && TlsUtilities.HasExpectedEmptyExtensionData(mServerExtensions, ExtensionType.session_ticket,
- AlertDescription.internal_error);
-
- WriteExtensions(message, this.mServerExtensions);
- }
-
- mSecurityParameters.prfAlgorithm = GetPrfAlgorithm(Context, mSecurityParameters.CipherSuite);
-
- /*
- * RFC 5246 7.4.9. Any cipher suite which does not explicitly specify verify_data_length has
- * a verify_data_length equal to 12. This includes all existing cipher suites.
- */
- mSecurityParameters.verifyDataLength = 12;
-
- ApplyMaxFragmentLengthExtension();
-
- message.WriteToRecordStream(this);
- }
-
- protected virtual void SendServerHelloDoneMessage()
- {
- byte[] message = new byte[4];
- TlsUtilities.WriteUint8(HandshakeType.server_hello_done, message, 0);
- TlsUtilities.WriteUint24(0, message, 1);
-
- WriteHandshakeMessage(message, 0, message.Length);
- }
-
- protected virtual void SendServerKeyExchangeMessage(byte[] serverKeyExchange)
- {
- HandshakeMessage message = new HandshakeMessage(HandshakeType.server_key_exchange, serverKeyExchange.Length);
-
- message.Write(serverKeyExchange);
-
- message.WriteToRecordStream(this);
- }
-
- protected virtual bool ExpectCertificateVerifyMessage()
- {
- return mClientCertificateType >= 0 && TlsUtilities.HasSigningCapability((byte)mClientCertificateType);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsSession.cs b/BCCrypto/src/crypto/tls/TlsSession.cs
deleted file mode 100644
index 6c22991..0000000
--- a/BCCrypto/src/crypto/tls/TlsSession.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsSession
- {
- SessionParameters ExportSessionParameters();
-
- byte[] SessionID { get; }
-
- void Invalidate();
-
- bool IsResumable { get; }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsSessionImpl.cs b/BCCrypto/src/crypto/tls/TlsSessionImpl.cs
deleted file mode 100644
index 8663926..0000000
--- a/BCCrypto/src/crypto/tls/TlsSessionImpl.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- internal class TlsSessionImpl
- : TlsSession
- {
- internal readonly byte[] mSessionID;
- internal SessionParameters mSessionParameters;
-
- internal TlsSessionImpl(byte[] sessionID, SessionParameters sessionParameters)
- {
- if (sessionID == null)
- throw new ArgumentNullException("sessionID");
- if (sessionID.Length < 1 || sessionID.Length > 32)
- throw new ArgumentException("must have length between 1 and 32 bytes, inclusive", "sessionID");
-
- this.mSessionID = Arrays.Clone(sessionID);
- this.mSessionParameters = sessionParameters;
- }
-
- public virtual SessionParameters ExportSessionParameters()
- {
- lock (this)
- {
- return this.mSessionParameters == null ? null : this.mSessionParameters.Copy();
- }
- }
-
- public virtual byte[] SessionID
- {
- get { lock (this) return mSessionID; }
- }
-
- public virtual void Invalidate()
- {
- lock (this)
- {
- if (this.mSessionParameters != null)
- {
- this.mSessionParameters.Clear();
- this.mSessionParameters = null;
- }
- }
- }
-
- public virtual bool IsResumable
- {
- get { lock (this) return this.mSessionParameters != null; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsSigner.cs b/BCCrypto/src/crypto/tls/TlsSigner.cs
deleted file mode 100644
index ffdd4c9..0000000
--- a/BCCrypto/src/crypto/tls/TlsSigner.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsSigner
- {
- void Init(TlsContext context);
-
- byte[] GenerateRawSignature(AsymmetricKeyParameter privateKey, byte[] md5AndSha1);
-
- byte[] GenerateRawSignature(SignatureAndHashAlgorithm algorithm,
- AsymmetricKeyParameter privateKey, byte[] hash);
-
- bool VerifyRawSignature(byte[] sigBytes, AsymmetricKeyParameter publicKey, byte[] md5AndSha1);
-
- bool VerifyRawSignature(SignatureAndHashAlgorithm algorithm, byte[] sigBytes,
- AsymmetricKeyParameter publicKey, byte[] hash);
-
- ISigner CreateSigner(AsymmetricKeyParameter privateKey);
-
- ISigner CreateSigner(SignatureAndHashAlgorithm algorithm, AsymmetricKeyParameter privateKey);
-
- ISigner CreateVerifyer(AsymmetricKeyParameter publicKey);
-
- ISigner CreateVerifyer(SignatureAndHashAlgorithm algorithm, AsymmetricKeyParameter publicKey);
-
- bool IsValidPublicKey(AsymmetricKeyParameter publicKey);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsSignerCredentials.cs b/BCCrypto/src/crypto/tls/TlsSignerCredentials.cs
deleted file mode 100644
index 92ed7cc..0000000
--- a/BCCrypto/src/crypto/tls/TlsSignerCredentials.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsSignerCredentials
- : TlsCredentials
- {
- ///
- byte[] GenerateCertificateSignature(byte[] hash);
-
- SignatureAndHashAlgorithm SignatureAndHashAlgorithm { get; }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsSrpGroupVerifier.cs b/BCCrypto/src/crypto/tls/TlsSrpGroupVerifier.cs
deleted file mode 100644
index 185f2f5..0000000
--- a/BCCrypto/src/crypto/tls/TlsSrpGroupVerifier.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsSrpGroupVerifier
- {
- /**
- * Check whether the given SRP group parameters are acceptable for use.
- *
- * @param group the {@link SRP6GroupParameters} to check
- * @return true if (and only if) the specified group parameters are acceptable
- */
- bool Accept(Srp6GroupParameters group);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsSrpIdentityManager.cs b/BCCrypto/src/crypto/tls/TlsSrpIdentityManager.cs
deleted file mode 100644
index 080a0dc..0000000
--- a/BCCrypto/src/crypto/tls/TlsSrpIdentityManager.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public interface TlsSrpIdentityManager
- {
- /**
- * Lookup the {@link TlsSRPLoginParameters} corresponding to the specified identity.
- *
- * NOTE: To avoid "identity probing", unknown identities SHOULD be handled as recommended in RFC
- * 5054 2.5.1.3. {@link SimulatedTlsSRPIdentityManager} is provided for this purpose.
- *
- * @param identity
- * the SRP identity sent by the connecting client
- * @return the {@link TlsSRPLoginParameters} for the specified identity, or else 'simulated'
- * parameters if the identity is not recognized. A null value is also allowed, but not
- * recommended.
- */
- TlsSrpLoginParameters GetLoginParameters(byte[] identity);
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsSrpKeyExchange.cs b/BCCrypto/src/crypto/tls/TlsSrpKeyExchange.cs
deleted file mode 100644
index 09fa723..0000000
--- a/BCCrypto/src/crypto/tls/TlsSrpKeyExchange.cs
+++ /dev/null
@@ -1,285 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Agreement.Srp;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// (D)TLS SRP key exchange (RFC 5054).
- public class TlsSrpKeyExchange
- : AbstractTlsKeyExchange
- {
- protected static TlsSigner CreateSigner(int keyExchange)
- {
- switch (keyExchange)
- {
- case KeyExchangeAlgorithm.SRP:
- return null;
- case KeyExchangeAlgorithm.SRP_RSA:
- return new TlsRsaSigner();
- case KeyExchangeAlgorithm.SRP_DSS:
- return new TlsDssSigner();
- default:
- throw new ArgumentException("unsupported key exchange algorithm");
- }
- }
-
- protected TlsSigner mTlsSigner;
- protected TlsSrpGroupVerifier mGroupVerifier;
- protected byte[] mIdentity;
- protected byte[] mPassword;
-
- protected AsymmetricKeyParameter mServerPublicKey = null;
-
- protected Srp6GroupParameters mSrpGroup = null;
- protected Srp6Client mSrpClient = null;
- protected Srp6Server mSrpServer = null;
- protected BigInteger mSrpPeerCredentials = null;
- protected BigInteger mSrpVerifier = null;
- protected byte[] mSrpSalt = null;
-
- protected TlsSignerCredentials mServerCredentials = null;
-
- [Obsolete("Use constructor taking an explicit 'groupVerifier' argument")]
- public TlsSrpKeyExchange(int keyExchange, IList supportedSignatureAlgorithms, byte[] identity, byte[] password)
- : this(keyExchange, supportedSignatureAlgorithms, new DefaultTlsSrpGroupVerifier(), identity, password)
- {
- }
-
- public TlsSrpKeyExchange(int keyExchange, IList supportedSignatureAlgorithms, TlsSrpGroupVerifier groupVerifier,
- byte[] identity, byte[] password)
- : base(keyExchange, supportedSignatureAlgorithms)
- {
- this.mTlsSigner = CreateSigner(keyExchange);
- this.mGroupVerifier = groupVerifier;
- this.mIdentity = identity;
- this.mPassword = password;
- this.mSrpClient = new Srp6Client();
- }
-
- public TlsSrpKeyExchange(int keyExchange, IList supportedSignatureAlgorithms, byte[] identity,
- TlsSrpLoginParameters loginParameters)
- : base(keyExchange, supportedSignatureAlgorithms)
- {
- this.mTlsSigner = CreateSigner(keyExchange);
- this.mIdentity = identity;
- this.mSrpServer = new Srp6Server();
- this.mSrpGroup = loginParameters.Group;
- this.mSrpVerifier = loginParameters.Verifier;
- this.mSrpSalt = loginParameters.Salt;
- }
-
- public override void Init(TlsContext context)
- {
- base.Init(context);
-
- if (this.mTlsSigner != null)
- {
- this.mTlsSigner.Init(context);
- }
- }
-
- public override void SkipServerCredentials()
- {
- if (mTlsSigner != null)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- public override void ProcessServerCertificate(Certificate serverCertificate)
- {
- if (mTlsSigner == null)
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- if (serverCertificate.IsEmpty)
- throw new TlsFatalAlert(AlertDescription.bad_certificate);
-
- X509CertificateStructure x509Cert = serverCertificate.GetCertificateAt(0);
-
- SubjectPublicKeyInfo keyInfo = x509Cert.SubjectPublicKeyInfo;
- try
- {
- this.mServerPublicKey = PublicKeyFactory.CreateKey(keyInfo);
- }
- catch (Exception e)
- {
- throw new TlsFatalAlert(AlertDescription.unsupported_certificate, e);
- }
-
- if (!mTlsSigner.IsValidPublicKey(this.mServerPublicKey))
- throw new TlsFatalAlert(AlertDescription.certificate_unknown);
-
- TlsUtilities.ValidateKeyUsage(x509Cert, KeyUsage.DigitalSignature);
-
- base.ProcessServerCertificate(serverCertificate);
- }
-
- public override void ProcessServerCredentials(TlsCredentials serverCredentials)
- {
- if ((mKeyExchange == KeyExchangeAlgorithm.SRP) || !(serverCredentials is TlsSignerCredentials))
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- ProcessServerCertificate(serverCredentials.Certificate);
-
- this.mServerCredentials = (TlsSignerCredentials)serverCredentials;
- }
-
- public override bool RequiresServerKeyExchange
- {
- get { return true; }
- }
-
- public override byte[] GenerateServerKeyExchange()
- {
- mSrpServer.Init(mSrpGroup, mSrpVerifier, TlsUtilities.CreateHash(HashAlgorithm.sha1), mContext.SecureRandom);
- BigInteger B = mSrpServer.GenerateServerCredentials();
-
- ServerSrpParams srpParams = new ServerSrpParams(mSrpGroup.N, mSrpGroup.G, mSrpSalt, B);
-
- DigestInputBuffer buf = new DigestInputBuffer();
-
- srpParams.Encode(buf);
-
- if (mServerCredentials != null)
- {
- /*
- * RFC 5246 4.7. digitally-signed element needs SignatureAndHashAlgorithm from TLS 1.2
- */
- SignatureAndHashAlgorithm signatureAndHashAlgorithm = TlsUtilities.GetSignatureAndHashAlgorithm(
- mContext, mServerCredentials);
-
- IDigest d = TlsUtilities.CreateHash(signatureAndHashAlgorithm);
-
- SecurityParameters securityParameters = mContext.SecurityParameters;
- d.BlockUpdate(securityParameters.clientRandom, 0, securityParameters.clientRandom.Length);
- d.BlockUpdate(securityParameters.serverRandom, 0, securityParameters.serverRandom.Length);
- buf.UpdateDigest(d);
-
- byte[] hash = new byte[d.GetDigestSize()];
- d.DoFinal(hash, 0);
-
- byte[] signature = mServerCredentials.GenerateCertificateSignature(hash);
-
- DigitallySigned signed_params = new DigitallySigned(signatureAndHashAlgorithm, signature);
- signed_params.Encode(buf);
- }
-
- return buf.ToArray();
- }
-
- public override void ProcessServerKeyExchange(Stream input)
- {
- SecurityParameters securityParameters = mContext.SecurityParameters;
-
- SignerInputBuffer buf = null;
- Stream teeIn = input;
-
- if (mTlsSigner != null)
- {
- buf = new SignerInputBuffer();
- teeIn = new TeeInputStream(input, buf);
- }
-
- ServerSrpParams srpParams = ServerSrpParams.Parse(teeIn);
-
- if (buf != null)
- {
- DigitallySigned signed_params = ParseSignature(input);
-
- ISigner signer = InitVerifyer(mTlsSigner, signed_params.Algorithm, securityParameters);
- buf.UpdateSigner(signer);
- if (!signer.VerifySignature(signed_params.Signature))
- throw new TlsFatalAlert(AlertDescription.decrypt_error);
- }
-
- this.mSrpGroup = new Srp6GroupParameters(srpParams.N, srpParams.G);
-
- if (!mGroupVerifier.Accept(mSrpGroup))
- throw new TlsFatalAlert(AlertDescription.insufficient_security);
-
- this.mSrpSalt = srpParams.S;
-
- /*
- * RFC 5054 2.5.3: The client MUST abort the handshake with an "illegal_parameter" alert if
- * B % N = 0.
- */
- try
- {
- this.mSrpPeerCredentials = Srp6Utilities.ValidatePublicValue(mSrpGroup.N, srpParams.B);
- }
- catch (CryptoException e)
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter, e);
- }
-
- this.mSrpClient.Init(mSrpGroup, TlsUtilities.CreateHash(HashAlgorithm.sha1), mContext.SecureRandom);
- }
-
- public override void ValidateCertificateRequest(CertificateRequest certificateRequest)
- {
- throw new TlsFatalAlert(AlertDescription.unexpected_message);
- }
-
- public override void ProcessClientCredentials(TlsCredentials clientCredentials)
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public override void GenerateClientKeyExchange(Stream output)
- {
- BigInteger A = mSrpClient.GenerateClientCredentials(mSrpSalt, mIdentity, mPassword);
- TlsSrpUtilities.WriteSrpParameter(A, output);
-
- mContext.SecurityParameters.srpIdentity = Arrays.Clone(mIdentity);
- }
-
- public override void ProcessClientKeyExchange(Stream input)
- {
- /*
- * RFC 5054 2.5.4: The server MUST abort the handshake with an "illegal_parameter" alert if
- * A % N = 0.
- */
- try
- {
- this.mSrpPeerCredentials = Srp6Utilities.ValidatePublicValue(mSrpGroup.N, TlsSrpUtilities.ReadSrpParameter(input));
- }
- catch (CryptoException e)
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter, e);
- }
-
- mContext.SecurityParameters.srpIdentity = Arrays.Clone(mIdentity);
- }
-
- public override byte[] GeneratePremasterSecret()
- {
- try
- {
- BigInteger S = mSrpServer != null
- ? mSrpServer.CalculateSecret(mSrpPeerCredentials)
- : mSrpClient.CalculateSecret(mSrpPeerCredentials);
-
- // TODO Check if this needs to be a fixed size
- return BigIntegers.AsUnsignedByteArray(S);
- }
- catch (CryptoException e)
- {
- throw new TlsFatalAlert(AlertDescription.illegal_parameter, e);
- }
- }
-
- protected virtual ISigner InitVerifyer(TlsSigner tlsSigner, SignatureAndHashAlgorithm algorithm,
- SecurityParameters securityParameters)
- {
- ISigner signer = tlsSigner.CreateVerifyer(algorithm, this.mServerPublicKey);
- signer.BlockUpdate(securityParameters.clientRandom, 0, securityParameters.clientRandom.Length);
- signer.BlockUpdate(securityParameters.serverRandom, 0, securityParameters.serverRandom.Length);
- return signer;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsSrpLoginParameters.cs b/BCCrypto/src/crypto/tls/TlsSrpLoginParameters.cs
deleted file mode 100644
index 5ae4641..0000000
--- a/BCCrypto/src/crypto/tls/TlsSrpLoginParameters.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsSrpLoginParameters
- {
- protected readonly Srp6GroupParameters mGroup;
- protected readonly BigInteger mVerifier;
- protected readonly byte[] mSalt;
-
- public TlsSrpLoginParameters(Srp6GroupParameters group, BigInteger verifier, byte[] salt)
- {
- this.mGroup = group;
- this.mVerifier = verifier;
- this.mSalt = salt;
- }
-
- public virtual Srp6GroupParameters Group
- {
- get { return mGroup; }
- }
-
- public virtual byte[] Salt
- {
- get { return mSalt; }
- }
-
- public virtual BigInteger Verifier
- {
- get { return mVerifier; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsSrpUtilities.cs b/BCCrypto/src/crypto/tls/TlsSrpUtilities.cs
deleted file mode 100644
index 873189d..0000000
--- a/BCCrypto/src/crypto/tls/TlsSrpUtilities.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public abstract class TlsSrpUtilities
- {
- public static void AddSrpExtension(IDictionary extensions, byte[] identity)
- {
- extensions[ExtensionType.srp] = CreateSrpExtension(identity);
- }
-
- public static byte[] GetSrpExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.srp);
- return extensionData == null ? null : ReadSrpExtension(extensionData);
- }
-
- public static byte[] CreateSrpExtension(byte[] identity)
- {
- if (identity == null)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- return TlsUtilities.EncodeOpaque8(identity);
- }
-
- public static byte[] ReadSrpExtension(byte[] extensionData)
- {
- if (extensionData == null)
- throw new ArgumentNullException("extensionData");
-
- MemoryStream buf = new MemoryStream(extensionData, false);
- byte[] identity = TlsUtilities.ReadOpaque8(buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- return identity;
- }
-
- public static BigInteger ReadSrpParameter(Stream input)
- {
- return new BigInteger(1, TlsUtilities.ReadOpaque16(input));
- }
-
- public static void WriteSrpParameter(BigInteger x, Stream output)
- {
- TlsUtilities.WriteOpaque16(BigIntegers.AsUnsignedByteArray(x), output);
- }
-
- public static bool IsSrpCipherSuite(int cipherSuite)
- {
- switch (cipherSuite)
- {
- case CipherSuite.TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_WITH_AES_256_CBC_SHA:
- return true;
-
- default:
- return false;
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsSrtpUtilities.cs b/BCCrypto/src/crypto/tls/TlsSrtpUtilities.cs
deleted file mode 100644
index 626c0e3..0000000
--- a/BCCrypto/src/crypto/tls/TlsSrtpUtilities.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * RFC 5764 DTLS Extension to Establish Keys for SRTP.
- */
- public abstract class TlsSRTPUtils
- {
- public static void AddUseSrtpExtension(IDictionary extensions, UseSrtpData useSRTPData)
- {
- extensions[ExtensionType.use_srtp] = CreateUseSrtpExtension(useSRTPData);
- }
-
- public static UseSrtpData GetUseSrtpExtension(IDictionary extensions)
- {
- byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.use_srtp);
- return extensionData == null ? null : ReadUseSrtpExtension(extensionData);
- }
-
- public static byte[] CreateUseSrtpExtension(UseSrtpData useSrtpData)
- {
- if (useSrtpData == null)
- throw new ArgumentNullException("useSrtpData");
-
- MemoryStream buf = new MemoryStream();
-
- // SRTPProtectionProfiles
- TlsUtilities.WriteUint16ArrayWithUint16Length(useSrtpData.ProtectionProfiles, buf);
-
- // srtp_mki
- TlsUtilities.WriteOpaque8(useSrtpData.Mki, buf);
-
- return buf.ToArray();
- }
-
- public static UseSrtpData ReadUseSrtpExtension(byte[] extensionData)
- {
- if (extensionData == null)
- throw new ArgumentNullException("extensionData");
-
- MemoryStream buf = new MemoryStream(extensionData, true);
-
- // SRTPProtectionProfiles
- int length = TlsUtilities.ReadUint16(buf);
- if (length < 2 || (length & 1) != 0)
- {
- throw new TlsFatalAlert(AlertDescription.decode_error);
- }
- int[] protectionProfiles = TlsUtilities.ReadUint16Array(length / 2, buf);
-
- // srtp_mki
- byte[] mki = TlsUtilities.ReadOpaque8(buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- return new UseSrtpData(protectionProfiles, mki);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsStream.cs b/BCCrypto/src/crypto/tls/TlsStream.cs
deleted file mode 100644
index bfd80ed..0000000
--- a/BCCrypto/src/crypto/tls/TlsStream.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- internal class TlsStream
- : Stream
- {
- private readonly TlsProtocol handler;
-
- internal TlsStream(TlsProtocol handler)
- {
- this.handler = handler;
- }
-
- public override bool CanRead
- {
- get { return !handler.IsClosed; }
- }
-
- public override bool CanSeek
- {
- get { return false; }
- }
-
- public override bool CanWrite
- {
- get { return !handler.IsClosed; }
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- handler.Close();
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- handler.Close();
- base.Close();
- }
-#endif
-
- public override void Flush()
- {
- handler.Flush();
- }
-
- public override long Length
- {
- get { throw new NotSupportedException(); }
- }
-
- public override long Position
- {
- get { throw new NotSupportedException(); }
- set { throw new NotSupportedException(); }
- }
-
- public override int Read(byte[] buf, int off, int len)
- {
- return this.handler.ReadApplicationData(buf, off, len);
- }
-
- public override int ReadByte()
- {
- byte[] buf = new byte[1];
- if (this.Read(buf, 0, 1) <= 0)
- return -1;
- return buf[0];
- }
-
- public override long Seek(long offset, SeekOrigin origin)
- {
- throw new NotSupportedException();
- }
-
- public override void SetLength(long value)
- {
- throw new NotSupportedException();
- }
-
- public override void Write(byte[] buf, int off, int len)
- {
- this.handler.WriteData(buf, off, len);
- }
-
- public override void WriteByte(byte b)
- {
- this.handler.WriteData(new byte[] { b }, 0, 1);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsStreamCipher.cs b/BCCrypto/src/crypto/tls/TlsStreamCipher.cs
deleted file mode 100644
index 555442e..0000000
--- a/BCCrypto/src/crypto/tls/TlsStreamCipher.cs
+++ /dev/null
@@ -1,152 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Tls;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- public class TlsStreamCipher
- : TlsCipher
- {
- protected readonly TlsContext context;
-
- protected readonly IStreamCipher encryptCipher;
- protected readonly IStreamCipher decryptCipher;
-
- protected readonly TlsMac writeMac;
- protected readonly TlsMac readMac;
-
- protected readonly bool usesNonce;
-
- ///
- public TlsStreamCipher(TlsContext context, IStreamCipher clientWriteCipher,
- IStreamCipher serverWriteCipher, IDigest clientWriteDigest, IDigest serverWriteDigest,
- int cipherKeySize, bool usesNonce)
- {
- bool isServer = context.IsServer;
-
- this.context = context;
- this.usesNonce = usesNonce;
-
- this.encryptCipher = clientWriteCipher;
- this.decryptCipher = serverWriteCipher;
-
- int key_block_size = (2 * cipherKeySize) + clientWriteDigest.GetDigestSize()
- + serverWriteDigest.GetDigestSize();
-
- byte[] key_block = TlsUtilities.CalculateKeyBlock(context, key_block_size);
-
- int offset = 0;
-
- // Init MACs
- TlsMac clientWriteMac = new TlsMac(context, clientWriteDigest, key_block, offset,
- clientWriteDigest.GetDigestSize());
- offset += clientWriteDigest.GetDigestSize();
- TlsMac serverWriteMac = new TlsMac(context, serverWriteDigest, key_block, offset,
- serverWriteDigest.GetDigestSize());
- offset += serverWriteDigest.GetDigestSize();
-
- // Build keys
- KeyParameter clientWriteKey = new KeyParameter(key_block, offset, cipherKeySize);
- offset += cipherKeySize;
- KeyParameter serverWriteKey = new KeyParameter(key_block, offset, cipherKeySize);
- offset += cipherKeySize;
-
- if (offset != key_block_size)
- {
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- ICipherParameters encryptParams, decryptParams;
- if (isServer)
- {
- this.writeMac = serverWriteMac;
- this.readMac = clientWriteMac;
- this.encryptCipher = serverWriteCipher;
- this.decryptCipher = clientWriteCipher;
- encryptParams = serverWriteKey;
- decryptParams = clientWriteKey;
- }
- else
- {
- this.writeMac = clientWriteMac;
- this.readMac = serverWriteMac;
- this.encryptCipher = clientWriteCipher;
- this.decryptCipher = serverWriteCipher;
- encryptParams = clientWriteKey;
- decryptParams = serverWriteKey;
- }
-
- if (usesNonce)
- {
- byte[] dummyNonce = new byte[8];
- encryptParams = new ParametersWithIV(encryptParams, dummyNonce);
- decryptParams = new ParametersWithIV(decryptParams, dummyNonce);
- }
-
- this.encryptCipher.Init(true, encryptParams);
- this.decryptCipher.Init(false, decryptParams);
- }
-
- public virtual int GetPlaintextLimit(int ciphertextLimit)
- {
- return ciphertextLimit - writeMac.Size;
- }
-
- public virtual byte[] EncodePlaintext(long seqNo, byte type, byte[] plaintext, int offset, int len)
- {
- if (usesNonce)
- {
- UpdateIV(encryptCipher, true, seqNo);
- }
-
- byte[] outBuf = new byte[len + writeMac.Size];
-
- encryptCipher.ProcessBytes(plaintext, offset, len, outBuf, 0);
-
- byte[] mac = writeMac.CalculateMac(seqNo, type, plaintext, offset, len);
- encryptCipher.ProcessBytes(mac, 0, mac.Length, outBuf, len);
-
- return outBuf;
- }
-
- ///
- public virtual byte[] DecodeCiphertext(long seqNo, byte type, byte[] ciphertext, int offset, int len)
- {
- if (usesNonce)
- {
- UpdateIV(decryptCipher, false, seqNo);
- }
-
- int macSize = readMac.Size;
- if (len < macSize)
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- int plaintextLength = len - macSize;
-
- byte[] deciphered = new byte[len];
- decryptCipher.ProcessBytes(ciphertext, offset, len, deciphered, 0);
- CheckMac(seqNo, type, deciphered, plaintextLength, len, deciphered, 0, plaintextLength);
- return Arrays.CopyOfRange(deciphered, 0, plaintextLength);
- }
-
- ///
- protected virtual void CheckMac(long seqNo, byte type, byte[] recBuf, int recStart, int recEnd, byte[] calcBuf, int calcOff, int calcLen)
- {
- byte[] receivedMac = Arrays.CopyOfRange(recBuf, recStart, recEnd);
- byte[] computedMac = readMac.CalculateMac(seqNo, type, calcBuf, calcOff, calcLen);
-
- if (!Arrays.ConstantTimeAreEqual(receivedMac, computedMac))
- throw new TlsFatalAlert(AlertDescription.bad_record_mac);
- }
-
- protected virtual void UpdateIV(IStreamCipher cipher, bool forEncryption, long seqNo)
- {
- byte[] nonce = new byte[8];
- TlsUtilities.WriteUint64(seqNo, nonce, 0);
- cipher.Init(forEncryption, new ParametersWithIV(null, nonce));
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/TlsUtilities.cs b/BCCrypto/src/crypto/tls/TlsUtilities.cs
deleted file mode 100644
index 48eb9d3..0000000
--- a/BCCrypto/src/crypto/tls/TlsUtilities.cs
+++ /dev/null
@@ -1,2398 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Date;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// Some helper functions for MicroTLS.
- public abstract class TlsUtilities
- {
- public static readonly byte[] EmptyBytes = new byte[0];
- public static readonly short[] EmptyShorts = new short[0];
- public static readonly int[] EmptyInts = new int[0];
- public static readonly long[] EmptyLongs = new long[0];
-
- public static void CheckUint8(int i)
- {
- if (!IsValidUint8(i))
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public static void CheckUint8(long i)
- {
- if (!IsValidUint8(i))
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public static void CheckUint16(int i)
- {
- if (!IsValidUint16(i))
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public static void CheckUint16(long i)
- {
- if (!IsValidUint16(i))
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public static void CheckUint24(int i)
- {
- if (!IsValidUint24(i))
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public static void CheckUint24(long i)
- {
- if (!IsValidUint24(i))
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public static void CheckUint32(long i)
- {
- if (!IsValidUint32(i))
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public static void CheckUint48(long i)
- {
- if (!IsValidUint48(i))
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public static void CheckUint64(long i)
- {
- if (!IsValidUint64(i))
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
-
- public static bool IsValidUint8(int i)
- {
- return (i & 0xFF) == i;
- }
-
- public static bool IsValidUint8(long i)
- {
- return (i & 0xFFL) == i;
- }
-
- public static bool IsValidUint16(int i)
- {
- return (i & 0xFFFF) == i;
- }
-
- public static bool IsValidUint16(long i)
- {
- return (i & 0xFFFFL) == i;
- }
-
- public static bool IsValidUint24(int i)
- {
- return (i & 0xFFFFFF) == i;
- }
-
- public static bool IsValidUint24(long i)
- {
- return (i & 0xFFFFFFL) == i;
- }
-
- public static bool IsValidUint32(long i)
- {
- return (i & 0xFFFFFFFFL) == i;
- }
-
- public static bool IsValidUint48(long i)
- {
- return (i & 0xFFFFFFFFFFFFL) == i;
- }
-
- public static bool IsValidUint64(long i)
- {
- return true;
- }
-
- public static bool IsSsl(TlsContext context)
- {
- return context.ServerVersion.IsSsl;
- }
-
- public static bool IsTlsV11(ProtocolVersion version)
- {
- return ProtocolVersion.TLSv11.IsEqualOrEarlierVersionOf(version.GetEquivalentTLSVersion());
- }
-
- public static bool IsTlsV11(TlsContext context)
- {
- return IsTlsV11(context.ServerVersion);
- }
-
- public static bool IsTlsV12(ProtocolVersion version)
- {
- return ProtocolVersion.TLSv12.IsEqualOrEarlierVersionOf(version.GetEquivalentTLSVersion());
- }
-
- public static bool IsTlsV12(TlsContext context)
- {
- return IsTlsV12(context.ServerVersion);
- }
-
- public static void WriteUint8(byte i, Stream output)
- {
- output.WriteByte(i);
- }
-
- public static void WriteUint8(byte i, byte[] buf, int offset)
- {
- buf[offset] = i;
- }
-
- public static void WriteUint16(int i, Stream output)
- {
- output.WriteByte((byte)(i >> 8));
- output.WriteByte((byte)i);
- }
-
- public static void WriteUint16(int i, byte[] buf, int offset)
- {
- buf[offset] = (byte)(i >> 8);
- buf[offset + 1] = (byte)i;
- }
-
- public static void WriteUint24(int i, Stream output)
- {
- output.WriteByte((byte)(i >> 16));
- output.WriteByte((byte)(i >> 8));
- output.WriteByte((byte)i);
- }
-
- public static void WriteUint24(int i, byte[] buf, int offset)
- {
- buf[offset] = (byte)(i >> 16);
- buf[offset + 1] = (byte)(i >> 8);
- buf[offset + 2] = (byte)i;
- }
-
- public static void WriteUint32(long i, Stream output)
- {
- output.WriteByte((byte)(i >> 24));
- output.WriteByte((byte)(i >> 16));
- output.WriteByte((byte)(i >> 8));
- output.WriteByte((byte)i);
- }
-
- public static void WriteUint32(long i, byte[] buf, int offset)
- {
- buf[offset] = (byte)(i >> 24);
- buf[offset + 1] = (byte)(i >> 16);
- buf[offset + 2] = (byte)(i >> 8);
- buf[offset + 3] = (byte)i;
- }
-
- public static void WriteUint48(long i, Stream output)
- {
- output.WriteByte((byte)(i >> 40));
- output.WriteByte((byte)(i >> 32));
- output.WriteByte((byte)(i >> 24));
- output.WriteByte((byte)(i >> 16));
- output.WriteByte((byte)(i >> 8));
- output.WriteByte((byte)i);
- }
-
- public static void WriteUint48(long i, byte[] buf, int offset)
- {
- buf[offset] = (byte)(i >> 40);
- buf[offset + 1] = (byte)(i >> 32);
- buf[offset + 2] = (byte)(i >> 24);
- buf[offset + 3] = (byte)(i >> 16);
- buf[offset + 4] = (byte)(i >> 8);
- buf[offset + 5] = (byte)i;
- }
-
- public static void WriteUint64(long i, Stream output)
- {
- output.WriteByte((byte)(i >> 56));
- output.WriteByte((byte)(i >> 48));
- output.WriteByte((byte)(i >> 40));
- output.WriteByte((byte)(i >> 32));
- output.WriteByte((byte)(i >> 24));
- output.WriteByte((byte)(i >> 16));
- output.WriteByte((byte)(i >> 8));
- output.WriteByte((byte)i);
- }
-
- public static void WriteUint64(long i, byte[] buf, int offset)
- {
- buf[offset] = (byte)(i >> 56);
- buf[offset + 1] = (byte)(i >> 48);
- buf[offset + 2] = (byte)(i >> 40);
- buf[offset + 3] = (byte)(i >> 32);
- buf[offset + 4] = (byte)(i >> 24);
- buf[offset + 5] = (byte)(i >> 16);
- buf[offset + 6] = (byte)(i >> 8);
- buf[offset + 7] = (byte)i;
- }
-
- public static void WriteOpaque8(byte[] buf, Stream output)
- {
- WriteUint8((byte)buf.Length, output);
- output.Write(buf, 0, buf.Length);
- }
-
- public static void WriteOpaque16(byte[] buf, Stream output)
- {
- WriteUint16(buf.Length, output);
- output.Write(buf, 0, buf.Length);
- }
-
- public static void WriteOpaque24(byte[] buf, Stream output)
- {
- WriteUint24(buf.Length, output);
- output.Write(buf, 0, buf.Length);
- }
-
- public static void WriteUint8Array(byte[] uints, Stream output)
- {
- output.Write(uints, 0, uints.Length);
- }
-
- public static void WriteUint8Array(byte[] uints, byte[] buf, int offset)
- {
- for (int i = 0; i < uints.Length; ++i)
- {
- WriteUint8(uints[i], buf, offset);
- ++offset;
- }
- }
-
- public static void WriteUint8ArrayWithUint8Length(byte[] uints, Stream output)
- {
- CheckUint8(uints.Length);
- WriteUint8((byte)uints.Length, output);
- WriteUint8Array(uints, output);
- }
-
- public static void WriteUint8ArrayWithUint8Length(byte[] uints, byte[] buf, int offset)
- {
- CheckUint8(uints.Length);
- WriteUint8((byte)uints.Length, buf, offset);
- WriteUint8Array(uints, buf, offset + 1);
- }
-
- public static void WriteUint16Array(int[] uints, Stream output)
- {
- for (int i = 0; i < uints.Length; ++i)
- {
- WriteUint16(uints[i], output);
- }
- }
-
- public static void WriteUint16Array(int[] uints, byte[] buf, int offset)
- {
- for (int i = 0; i < uints.Length; ++i)
- {
- WriteUint16(uints[i], buf, offset);
- offset += 2;
- }
- }
-
- public static void WriteUint16ArrayWithUint16Length(int[] uints, Stream output)
- {
- int length = 2 * uints.Length;
- CheckUint16(length);
- WriteUint16(length, output);
- WriteUint16Array(uints, output);
- }
-
- public static void WriteUint16ArrayWithUint16Length(int[] uints, byte[] buf, int offset)
- {
- int length = 2 * uints.Length;
- CheckUint16(length);
- WriteUint16(length, buf, offset);
- WriteUint16Array(uints, buf, offset + 2);
- }
-
- public static byte DecodeUint8(byte[] buf)
- {
- if (buf == null)
- throw new ArgumentNullException("buf");
- if (buf.Length != 1)
- throw new TlsFatalAlert(AlertDescription.decode_error);
- return ReadUint8(buf, 0);
- }
-
- public static byte[] DecodeUint8ArrayWithUint8Length(byte[] buf)
- {
- if (buf == null)
- throw new ArgumentNullException("buf");
-
- int count = ReadUint8(buf, 0);
- if (buf.Length != (count + 1))
- throw new TlsFatalAlert(AlertDescription.decode_error);
-
- byte[] uints = new byte[count];
- for (int i = 0; i < count; ++i)
- {
- uints[i] = ReadUint8(buf, i + 1);
- }
- return uints;
- }
-
- public static byte[] EncodeOpaque8(byte[] buf)
- {
- CheckUint8(buf.Length);
- return Arrays.Prepend(buf, (byte)buf.Length);
- }
-
- public static byte[] EncodeUint8(byte val)
- {
- CheckUint8(val);
-
- byte[] extensionData = new byte[1];
- WriteUint8(val, extensionData, 0);
- return extensionData;
- }
-
- public static byte[] EncodeUint8ArrayWithUint8Length(byte[] uints)
- {
- byte[] result = new byte[1 + uints.Length];
- WriteUint8ArrayWithUint8Length(uints, result, 0);
- return result;
- }
-
- public static byte[] EncodeUint16ArrayWithUint16Length(int[] uints)
- {
- int length = 2 * uints.Length;
- byte[] result = new byte[2 + length];
- WriteUint16ArrayWithUint16Length(uints, result, 0);
- return result;
- }
-
- public static byte ReadUint8(Stream input)
- {
- int i = input.ReadByte();
- if (i < 0)
- throw new EndOfStreamException();
- return (byte)i;
- }
-
- public static byte ReadUint8(byte[] buf, int offset)
- {
- return buf[offset];
- }
-
- public static int ReadUint16(Stream input)
- {
- int i1 = input.ReadByte();
- int i2 = input.ReadByte();
- if (i2 < 0)
- throw new EndOfStreamException();
- return (i1 << 8) | i2;
- }
-
- public static int ReadUint16(byte[] buf, int offset)
- {
- uint n = (uint)buf[offset] << 8;
- n |= (uint)buf[++offset];
- return (int)n;
- }
-
- public static int ReadUint24(Stream input)
- {
- int i1 = input.ReadByte();
- int i2 = input.ReadByte();
- int i3 = input.ReadByte();
- if (i3 < 0)
- throw new EndOfStreamException();
- return (i1 << 16) | (i2 << 8) | i3;
- }
-
- public static int ReadUint24(byte[] buf, int offset)
- {
- uint n = (uint)buf[offset] << 16;
- n |= (uint)buf[++offset] << 8;
- n |= (uint)buf[++offset];
- return (int)n;
- }
-
- public static long ReadUint32(Stream input)
- {
- int i1 = input.ReadByte();
- int i2 = input.ReadByte();
- int i3 = input.ReadByte();
- int i4 = input.ReadByte();
- if (i4 < 0)
- throw new EndOfStreamException();
- return (long)(uint)((i1 << 24) | (i2 << 16) | (i3 << 8) | i4);
- }
-
- public static long ReadUint32(byte[] buf, int offset)
- {
- uint n = (uint)buf[offset] << 24;
- n |= (uint)buf[++offset] << 16;
- n |= (uint)buf[++offset] << 8;
- n |= (uint)buf[++offset];
- return (long)n;
- }
-
- public static long ReadUint48(Stream input)
- {
- int hi = ReadUint24(input);
- int lo = ReadUint24(input);
- return ((long)(hi & 0xffffffffL) << 24) | (long)(lo & 0xffffffffL);
- }
-
- public static long ReadUint48(byte[] buf, int offset)
- {
- int hi = ReadUint24(buf, offset);
- int lo = ReadUint24(buf, offset + 3);
- return ((long)(hi & 0xffffffffL) << 24) | (long)(lo & 0xffffffffL);
- }
-
- public static byte[] ReadAllOrNothing(int length, Stream input)
- {
- if (length < 1)
- return EmptyBytes;
- byte[] buf = new byte[length];
- int read = Streams.ReadFully(input, buf);
- if (read == 0)
- return null;
- if (read != length)
- throw new EndOfStreamException();
- return buf;
- }
-
- public static byte[] ReadFully(int length, Stream input)
- {
- if (length < 1)
- return EmptyBytes;
- byte[] buf = new byte[length];
- if (length != Streams.ReadFully(input, buf))
- throw new EndOfStreamException();
- return buf;
- }
-
- public static void ReadFully(byte[] buf, Stream input)
- {
- if (Streams.ReadFully(input, buf, 0, buf.Length) < buf.Length)
- throw new EndOfStreamException();
- }
-
- public static byte[] ReadOpaque8(Stream input)
- {
- byte length = ReadUint8(input);
- byte[] bytes = new byte[length];
- ReadFully(bytes, input);
- return bytes;
- }
-
- public static byte[] ReadOpaque16(Stream input)
- {
- int length = ReadUint16(input);
- byte[] bytes = new byte[length];
- ReadFully(bytes, input);
- return bytes;
- }
-
- public static byte[] ReadOpaque24(Stream input)
- {
- int length = ReadUint24(input);
- return ReadFully(length, input);
- }
-
- public static byte[] ReadUint8Array(int count, Stream input)
- {
- byte[] uints = new byte[count];
- for (int i = 0; i < count; ++i)
- {
- uints[i] = ReadUint8(input);
- }
- return uints;
- }
-
- public static int[] ReadUint16Array(int count, Stream input)
- {
- int[] uints = new int[count];
- for (int i = 0; i < count; ++i)
- {
- uints[i] = ReadUint16(input);
- }
- return uints;
- }
-
- public static ProtocolVersion ReadVersion(byte[] buf, int offset)
- {
- return ProtocolVersion.Get(buf[offset], buf[offset + 1]);
- }
-
- public static ProtocolVersion ReadVersion(Stream input)
- {
- int i1 = input.ReadByte();
- int i2 = input.ReadByte();
- if (i2 < 0)
- throw new EndOfStreamException();
- return ProtocolVersion.Get(i1, i2);
- }
-
- public static int ReadVersionRaw(byte[] buf, int offset)
- {
- return (buf[offset] << 8) | buf[offset + 1];
- }
-
- public static int ReadVersionRaw(Stream input)
- {
- int i1 = input.ReadByte();
- int i2 = input.ReadByte();
- if (i2 < 0)
- throw new EndOfStreamException();
- return (i1 << 8) | i2;
- }
-
- public static Asn1Object ReadAsn1Object(byte[] encoding)
- {
- MemoryStream input = new MemoryStream(encoding, false);
- Asn1InputStream asn1 = new Asn1InputStream(input, encoding.Length);
- Asn1Object result = asn1.ReadObject();
- if (null == result)
- throw new TlsFatalAlert(AlertDescription.decode_error);
- if (input.Position != input.Length)
- throw new TlsFatalAlert(AlertDescription.decode_error);
- return result;
- }
-
- public static Asn1Object ReadDerObject(byte[] encoding)
- {
- /*
- * NOTE: The current ASN.1 parsing code can't enforce DER-only parsing, but since DER is
- * canonical, we can check it by re-encoding the result and comparing to the original.
- */
- Asn1Object result = ReadAsn1Object(encoding);
- byte[] check = result.GetEncoded(Asn1Encodable.Der);
- if (!Arrays.AreEqual(check, encoding))
- throw new TlsFatalAlert(AlertDescription.decode_error);
- return result;
- }
-
- public static void WriteGmtUnixTime(byte[] buf, int offset)
- {
- int t = (int)(DateTimeUtilities.CurrentUnixMs() / 1000L);
- buf[offset] = (byte)(t >> 24);
- buf[offset + 1] = (byte)(t >> 16);
- buf[offset + 2] = (byte)(t >> 8);
- buf[offset + 3] = (byte)t;
- }
-
- public static void WriteVersion(ProtocolVersion version, Stream output)
- {
- output.WriteByte((byte)version.MajorVersion);
- output.WriteByte((byte)version.MinorVersion);
- }
-
- public static void WriteVersion(ProtocolVersion version, byte[] buf, int offset)
- {
- buf[offset] = (byte)version.MajorVersion;
- buf[offset + 1] = (byte)version.MinorVersion;
- }
-
- public static IList GetAllSignatureAlgorithms()
- {
- IList v = Platform.CreateArrayList(4);
- v.Add(SignatureAlgorithm.anonymous);
- v.Add(SignatureAlgorithm.rsa);
- v.Add(SignatureAlgorithm.dsa);
- v.Add(SignatureAlgorithm.ecdsa);
- return v;
- }
-
- public static IList GetDefaultDssSignatureAlgorithms()
- {
- return VectorOfOne(new SignatureAndHashAlgorithm(HashAlgorithm.sha1, SignatureAlgorithm.dsa));
- }
-
- public static IList GetDefaultECDsaSignatureAlgorithms()
- {
- return VectorOfOne(new SignatureAndHashAlgorithm(HashAlgorithm.sha1, SignatureAlgorithm.ecdsa));
- }
-
- public static IList GetDefaultRsaSignatureAlgorithms()
- {
- return VectorOfOne(new SignatureAndHashAlgorithm(HashAlgorithm.sha1, SignatureAlgorithm.rsa));
- }
-
- public static byte[] GetExtensionData(IDictionary extensions, int extensionType)
- {
- return extensions == null ? null : (byte[])extensions[extensionType];
- }
-
- public static IList GetDefaultSupportedSignatureAlgorithms()
- {
- byte[] hashAlgorithms = new byte[]{ HashAlgorithm.sha1, HashAlgorithm.sha224, HashAlgorithm.sha256,
- HashAlgorithm.sha384, HashAlgorithm.sha512 };
- byte[] signatureAlgorithms = new byte[]{ SignatureAlgorithm.rsa, SignatureAlgorithm.dsa,
- SignatureAlgorithm.ecdsa };
-
- IList result = Platform.CreateArrayList();
- for (int i = 0; i < signatureAlgorithms.Length; ++i)
- {
- for (int j = 0; j < hashAlgorithms.Length; ++j)
- {
- result.Add(new SignatureAndHashAlgorithm(hashAlgorithms[j], signatureAlgorithms[i]));
- }
- }
- return result;
- }
-
- public static SignatureAndHashAlgorithm GetSignatureAndHashAlgorithm(TlsContext context,
- TlsSignerCredentials signerCredentials)
- {
- SignatureAndHashAlgorithm signatureAndHashAlgorithm = null;
- if (IsTlsV12(context))
- {
- signatureAndHashAlgorithm = signerCredentials.SignatureAndHashAlgorithm;
- if (signatureAndHashAlgorithm == null)
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- return signatureAndHashAlgorithm;
- }
-
- public static bool HasExpectedEmptyExtensionData(IDictionary extensions, int extensionType,
- byte alertDescription)
- {
- byte[] extension_data = GetExtensionData(extensions, extensionType);
- if (extension_data == null)
- return false;
- if (extension_data.Length != 0)
- throw new TlsFatalAlert(alertDescription);
- return true;
- }
-
- public static TlsSession ImportSession(byte[] sessionID, SessionParameters sessionParameters)
- {
- return new TlsSessionImpl(sessionID, sessionParameters);
- }
-
- public static bool IsSignatureAlgorithmsExtensionAllowed(ProtocolVersion clientVersion)
- {
- return ProtocolVersion.TLSv12.IsEqualOrEarlierVersionOf(clientVersion.GetEquivalentTLSVersion());
- }
-
- /**
- * Add a 'signature_algorithms' extension to existing extensions.
- *
- * @param extensions A {@link Hashtable} to add the extension to.
- * @param supportedSignatureAlgorithms {@link Vector} containing at least 1 {@link SignatureAndHashAlgorithm}.
- * @throws IOException
- */
- public static void AddSignatureAlgorithmsExtension(IDictionary extensions, IList supportedSignatureAlgorithms)
- {
- extensions[ExtensionType.signature_algorithms] = CreateSignatureAlgorithmsExtension(supportedSignatureAlgorithms);
- }
-
- /**
- * Get a 'signature_algorithms' extension from extensions.
- *
- * @param extensions A {@link Hashtable} to get the extension from, if it is present.
- * @return A {@link Vector} containing at least 1 {@link SignatureAndHashAlgorithm}, or null.
- * @throws IOException
- */
- public static IList GetSignatureAlgorithmsExtension(IDictionary extensions)
- {
- byte[] extensionData = GetExtensionData(extensions, ExtensionType.signature_algorithms);
- return extensionData == null ? null : ReadSignatureAlgorithmsExtension(extensionData);
- }
-
- /**
- * Create a 'signature_algorithms' extension value.
- *
- * @param supportedSignatureAlgorithms A {@link Vector} containing at least 1 {@link SignatureAndHashAlgorithm}.
- * @return A byte array suitable for use as an extension value.
- * @throws IOException
- */
- public static byte[] CreateSignatureAlgorithmsExtension(IList supportedSignatureAlgorithms)
- {
- MemoryStream buf = new MemoryStream();
-
- // supported_signature_algorithms
- EncodeSupportedSignatureAlgorithms(supportedSignatureAlgorithms, false, buf);
-
- return buf.ToArray();
- }
-
- /**
- * Read 'signature_algorithms' extension data.
- *
- * @param extensionData The extension data.
- * @return A {@link Vector} containing at least 1 {@link SignatureAndHashAlgorithm}.
- * @throws IOException
- */
- public static IList ReadSignatureAlgorithmsExtension(byte[] extensionData)
- {
- if (extensionData == null)
- throw new ArgumentNullException("extensionData");
-
- MemoryStream buf = new MemoryStream(extensionData, false);
-
- // supported_signature_algorithms
- IList supported_signature_algorithms = ParseSupportedSignatureAlgorithms(false, buf);
-
- TlsProtocol.AssertEmpty(buf);
-
- return supported_signature_algorithms;
- }
-
- public static void EncodeSupportedSignatureAlgorithms(IList supportedSignatureAlgorithms, bool allowAnonymous,
- Stream output)
- {
- if (supportedSignatureAlgorithms == null)
- throw new ArgumentNullException("supportedSignatureAlgorithms");
- if (supportedSignatureAlgorithms.Count < 1 || supportedSignatureAlgorithms.Count >= (1 << 15))
- throw new ArgumentException("must have length from 1 to (2^15 - 1)", "supportedSignatureAlgorithms");
-
- // supported_signature_algorithms
- int length = 2 * supportedSignatureAlgorithms.Count;
- CheckUint16(length);
- WriteUint16(length, output);
-
- foreach (SignatureAndHashAlgorithm entry in supportedSignatureAlgorithms)
- {
- if (!allowAnonymous && entry.Signature == SignatureAlgorithm.anonymous)
- {
- /*
- * RFC 5246 7.4.1.4.1 The "anonymous" value is meaningless in this context but used
- * in Section 7.4.3. It MUST NOT appear in this extension.
- */
- throw new ArgumentException(
- "SignatureAlgorithm.anonymous MUST NOT appear in the signature_algorithms extension");
- }
- entry.Encode(output);
- }
- }
-
- public static IList ParseSupportedSignatureAlgorithms(bool allowAnonymous, Stream input)
- {
- // supported_signature_algorithms
- int length = ReadUint16(input);
- if (length < 2 || (length & 1) != 0)
- throw new TlsFatalAlert(AlertDescription.decode_error);
- int count = length / 2;
- IList supportedSignatureAlgorithms = Platform.CreateArrayList(count);
- for (int i = 0; i < count; ++i)
- {
- SignatureAndHashAlgorithm entry = SignatureAndHashAlgorithm.Parse(input);
- if (!allowAnonymous && entry.Signature == SignatureAlgorithm.anonymous)
- {
- /*
- * RFC 5246 7.4.1.4.1 The "anonymous" value is meaningless in this context but used
- * in Section 7.4.3. It MUST NOT appear in this extension.
- */
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
- supportedSignatureAlgorithms.Add(entry);
- }
- return supportedSignatureAlgorithms;
- }
-
- public static void VerifySupportedSignatureAlgorithm(IList supportedSignatureAlgorithms, SignatureAndHashAlgorithm signatureAlgorithm)
- {
- if (supportedSignatureAlgorithms == null)
- throw new ArgumentNullException("supportedSignatureAlgorithms");
- if (supportedSignatureAlgorithms.Count < 1 || supportedSignatureAlgorithms.Count >= (1 << 15))
- throw new ArgumentException("must have length from 1 to (2^15 - 1)", "supportedSignatureAlgorithms");
- if (signatureAlgorithm == null)
- throw new ArgumentNullException("signatureAlgorithm");
-
- if (signatureAlgorithm.Signature != SignatureAlgorithm.anonymous)
- {
- foreach (SignatureAndHashAlgorithm entry in supportedSignatureAlgorithms)
- {
- if (entry.Hash == signatureAlgorithm.Hash && entry.Signature == signatureAlgorithm.Signature)
- return;
- }
- }
-
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- public static byte[] PRF(TlsContext context, byte[] secret, string asciiLabel, byte[] seed, int size)
- {
- ProtocolVersion version = context.ServerVersion;
-
- if (version.IsSsl)
- throw new InvalidOperationException("No PRF available for SSLv3 session");
-
- byte[] label = Strings.ToByteArray(asciiLabel);
- byte[] labelSeed = Concat(label, seed);
-
- int prfAlgorithm = context.SecurityParameters.PrfAlgorithm;
-
- if (prfAlgorithm == PrfAlgorithm.tls_prf_legacy)
- return PRF_legacy(secret, label, labelSeed, size);
-
- IDigest prfDigest = CreatePrfHash(prfAlgorithm);
- byte[] buf = new byte[size];
- HMacHash(prfDigest, secret, labelSeed, buf);
- return buf;
- }
-
- public static byte[] PRF_legacy(byte[] secret, string asciiLabel, byte[] seed, int size)
- {
- byte[] label = Strings.ToByteArray(asciiLabel);
- byte[] labelSeed = Concat(label, seed);
-
- return PRF_legacy(secret, label, labelSeed, size);
- }
-
- internal static byte[] PRF_legacy(byte[] secret, byte[] label, byte[] labelSeed, int size)
- {
- int s_half = (secret.Length + 1) / 2;
- byte[] s1 = new byte[s_half];
- byte[] s2 = new byte[s_half];
- Array.Copy(secret, 0, s1, 0, s_half);
- Array.Copy(secret, secret.Length - s_half, s2, 0, s_half);
-
- byte[] b1 = new byte[size];
- byte[] b2 = new byte[size];
- HMacHash(CreateHash(HashAlgorithm.md5), s1, labelSeed, b1);
- HMacHash(CreateHash(HashAlgorithm.sha1), s2, labelSeed, b2);
- for (int i = 0; i < size; i++)
- {
- b1[i] ^= b2[i];
- }
- return b1;
- }
-
- internal static byte[] Concat(byte[] a, byte[] b)
- {
- byte[] c = new byte[a.Length + b.Length];
- Array.Copy(a, 0, c, 0, a.Length);
- Array.Copy(b, 0, c, a.Length, b.Length);
- return c;
- }
-
- internal static void HMacHash(IDigest digest, byte[] secret, byte[] seed, byte[] output)
- {
- HMac mac = new HMac(digest);
- mac.Init(new KeyParameter(secret));
- byte[] a = seed;
- int size = digest.GetDigestSize();
- int iterations = (output.Length + size - 1) / size;
- byte[] buf = new byte[mac.GetMacSize()];
- byte[] buf2 = new byte[mac.GetMacSize()];
- for (int i = 0; i < iterations; i++)
- {
- mac.BlockUpdate(a, 0, a.Length);
- mac.DoFinal(buf, 0);
- a = buf;
- mac.BlockUpdate(a, 0, a.Length);
- mac.BlockUpdate(seed, 0, seed.Length);
- mac.DoFinal(buf2, 0);
- Array.Copy(buf2, 0, output, (size * i), System.Math.Min(size, output.Length - (size * i)));
- }
- }
-
- internal static void ValidateKeyUsage(X509CertificateStructure c, int keyUsageBits)
- {
- X509Extensions exts = c.TbsCertificate.Extensions;
- if (exts != null)
- {
- X509Extension ext = exts.GetExtension(X509Extensions.KeyUsage);
- if (ext != null)
- {
- DerBitString ku = KeyUsage.GetInstance(ext);
- int bits = ku.GetBytes()[0];
- if ((bits & keyUsageBits) != keyUsageBits)
- throw new TlsFatalAlert(AlertDescription.certificate_unknown);
- }
- }
- }
-
- internal static byte[] CalculateKeyBlock(TlsContext context, int size)
- {
- SecurityParameters securityParameters = context.SecurityParameters;
- byte[] master_secret = securityParameters.MasterSecret;
- byte[] seed = Concat(securityParameters.ServerRandom, securityParameters.ClientRandom);
-
- if (IsSsl(context))
- return CalculateKeyBlock_Ssl(master_secret, seed, size);
-
- return PRF(context, master_secret, ExporterLabel.key_expansion, seed, size);
- }
-
- internal static byte[] CalculateKeyBlock_Ssl(byte[] master_secret, byte[] random, int size)
- {
- IDigest md5 = CreateHash(HashAlgorithm.md5);
- IDigest sha1 = CreateHash(HashAlgorithm.sha1);
- int md5Size = md5.GetDigestSize();
- byte[] shatmp = new byte[sha1.GetDigestSize()];
- byte[] tmp = new byte[size + md5Size];
-
- int i = 0, pos = 0;
- while (pos < size)
- {
- byte[] ssl3Const = SSL3_CONST[i];
-
- sha1.BlockUpdate(ssl3Const, 0, ssl3Const.Length);
- sha1.BlockUpdate(master_secret, 0, master_secret.Length);
- sha1.BlockUpdate(random, 0, random.Length);
- sha1.DoFinal(shatmp, 0);
-
- md5.BlockUpdate(master_secret, 0, master_secret.Length);
- md5.BlockUpdate(shatmp, 0, shatmp.Length);
- md5.DoFinal(tmp, pos);
-
- pos += md5Size;
- ++i;
- }
-
- return Arrays.CopyOfRange(tmp, 0, size);
- }
-
- internal static byte[] CalculateMasterSecret(TlsContext context, byte[] pre_master_secret)
- {
- SecurityParameters securityParameters = context.SecurityParameters;
-
- byte[] seed = securityParameters.extendedMasterSecret
- ? securityParameters.SessionHash
- : Concat(securityParameters.ClientRandom, securityParameters.ServerRandom);
-
- if (IsSsl(context))
- return CalculateMasterSecret_Ssl(pre_master_secret, seed);
-
- string asciiLabel = securityParameters.extendedMasterSecret
- ? ExporterLabel.extended_master_secret
- : ExporterLabel.master_secret;
-
- return PRF(context, pre_master_secret, asciiLabel, seed, 48);
- }
-
- internal static byte[] CalculateMasterSecret_Ssl(byte[] pre_master_secret, byte[] random)
- {
- IDigest md5 = CreateHash(HashAlgorithm.md5);
- IDigest sha1 = CreateHash(HashAlgorithm.sha1);
- int md5Size = md5.GetDigestSize();
- byte[] shatmp = new byte[sha1.GetDigestSize()];
-
- byte[] rval = new byte[md5Size * 3];
- int pos = 0;
-
- for (int i = 0; i < 3; ++i)
- {
- byte[] ssl3Const = SSL3_CONST[i];
-
- sha1.BlockUpdate(ssl3Const, 0, ssl3Const.Length);
- sha1.BlockUpdate(pre_master_secret, 0, pre_master_secret.Length);
- sha1.BlockUpdate(random, 0, random.Length);
- sha1.DoFinal(shatmp, 0);
-
- md5.BlockUpdate(pre_master_secret, 0, pre_master_secret.Length);
- md5.BlockUpdate(shatmp, 0, shatmp.Length);
- md5.DoFinal(rval, pos);
-
- pos += md5Size;
- }
-
- return rval;
- }
-
- internal static byte[] CalculateVerifyData(TlsContext context, string asciiLabel, byte[] handshakeHash)
- {
- if (IsSsl(context))
- return handshakeHash;
-
- SecurityParameters securityParameters = context.SecurityParameters;
- byte[] master_secret = securityParameters.MasterSecret;
- int verify_data_length = securityParameters.VerifyDataLength;
-
- return PRF(context, master_secret, asciiLabel, handshakeHash, verify_data_length);
- }
-
- public static IDigest CreateHash(byte hashAlgorithm)
- {
- switch (hashAlgorithm)
- {
- case HashAlgorithm.md5:
- return new MD5Digest();
- case HashAlgorithm.sha1:
- return new Sha1Digest();
- case HashAlgorithm.sha224:
- return new Sha224Digest();
- case HashAlgorithm.sha256:
- return new Sha256Digest();
- case HashAlgorithm.sha384:
- return new Sha384Digest();
- case HashAlgorithm.sha512:
- return new Sha512Digest();
- default:
- throw new ArgumentException("unknown HashAlgorithm", "hashAlgorithm");
- }
- }
-
- public static IDigest CreateHash(SignatureAndHashAlgorithm signatureAndHashAlgorithm)
- {
- return signatureAndHashAlgorithm == null
- ? new CombinedHash()
- : CreateHash(signatureAndHashAlgorithm.Hash);
- }
-
- public static IDigest CloneHash(byte hashAlgorithm, IDigest hash)
- {
- switch (hashAlgorithm)
- {
- case HashAlgorithm.md5:
- return new MD5Digest((MD5Digest)hash);
- case HashAlgorithm.sha1:
- return new Sha1Digest((Sha1Digest)hash);
- case HashAlgorithm.sha224:
- return new Sha224Digest((Sha224Digest)hash);
- case HashAlgorithm.sha256:
- return new Sha256Digest((Sha256Digest)hash);
- case HashAlgorithm.sha384:
- return new Sha384Digest((Sha384Digest)hash);
- case HashAlgorithm.sha512:
- return new Sha512Digest((Sha512Digest)hash);
- default:
- throw new ArgumentException("unknown HashAlgorithm", "hashAlgorithm");
- }
- }
-
- public static IDigest CreatePrfHash(int prfAlgorithm)
- {
- switch (prfAlgorithm)
- {
- case PrfAlgorithm.tls_prf_legacy:
- return new CombinedHash();
- default:
- return CreateHash(GetHashAlgorithmForPrfAlgorithm(prfAlgorithm));
- }
- }
-
- public static IDigest ClonePrfHash(int prfAlgorithm, IDigest hash)
- {
- switch (prfAlgorithm)
- {
- case PrfAlgorithm.tls_prf_legacy:
- return new CombinedHash((CombinedHash)hash);
- default:
- return CloneHash(GetHashAlgorithmForPrfAlgorithm(prfAlgorithm), hash);
- }
- }
-
- public static byte GetHashAlgorithmForPrfAlgorithm(int prfAlgorithm)
- {
- switch (prfAlgorithm)
- {
- case PrfAlgorithm.tls_prf_legacy:
- throw new ArgumentException("legacy PRF not a valid algorithm", "prfAlgorithm");
- case PrfAlgorithm.tls_prf_sha256:
- return HashAlgorithm.sha256;
- case PrfAlgorithm.tls_prf_sha384:
- return HashAlgorithm.sha384;
- default:
- throw new ArgumentException("unknown PrfAlgorithm", "prfAlgorithm");
- }
- }
-
- public static DerObjectIdentifier GetOidForHashAlgorithm(byte hashAlgorithm)
- {
- switch (hashAlgorithm)
- {
- case HashAlgorithm.md5:
- return PkcsObjectIdentifiers.MD5;
- case HashAlgorithm.sha1:
- return X509ObjectIdentifiers.IdSha1;
- case HashAlgorithm.sha224:
- return NistObjectIdentifiers.IdSha224;
- case HashAlgorithm.sha256:
- return NistObjectIdentifiers.IdSha256;
- case HashAlgorithm.sha384:
- return NistObjectIdentifiers.IdSha384;
- case HashAlgorithm.sha512:
- return NistObjectIdentifiers.IdSha512;
- default:
- throw new ArgumentException("unknown HashAlgorithm", "hashAlgorithm");
- }
- }
-
- internal static short GetClientCertificateType(Certificate clientCertificate, Certificate serverCertificate)
- {
- if (clientCertificate.IsEmpty)
- return -1;
-
- X509CertificateStructure x509Cert = clientCertificate.GetCertificateAt(0);
- SubjectPublicKeyInfo keyInfo = x509Cert.SubjectPublicKeyInfo;
- try
- {
- AsymmetricKeyParameter publicKey = PublicKeyFactory.CreateKey(keyInfo);
- if (publicKey.IsPrivate)
- throw new TlsFatalAlert(AlertDescription.internal_error);
-
- /*
- * TODO RFC 5246 7.4.6. The certificates MUST be signed using an acceptable hash/
- * signature algorithm pair, as described in Section 7.4.4. Note that this relaxes the
- * constraints on certificate-signing algorithms found in prior versions of TLS.
- */
-
- /*
- * RFC 5246 7.4.6. Client Certificate
- */
-
- /*
- * RSA public key; the certificate MUST allow the key to be used for signing with the
- * signature scheme and hash algorithm that will be employed in the certificate verify
- * message.
- */
- if (publicKey is RsaKeyParameters)
- {
- ValidateKeyUsage(x509Cert, KeyUsage.DigitalSignature);
- return ClientCertificateType.rsa_sign;
- }
-
- /*
- * DSA public key; the certificate MUST allow the key to be used for signing with the
- * hash algorithm that will be employed in the certificate verify message.
- */
- if (publicKey is DsaPublicKeyParameters)
- {
- ValidateKeyUsage(x509Cert, KeyUsage.DigitalSignature);
- return ClientCertificateType.dss_sign;
- }
-
- /*
- * ECDSA-capable public key; the certificate MUST allow the key to be used for signing
- * with the hash algorithm that will be employed in the certificate verify message; the
- * public key MUST use a curve and point format supported by the server.
- */
- if (publicKey is ECPublicKeyParameters)
- {
- ValidateKeyUsage(x509Cert, KeyUsage.DigitalSignature);
- // TODO Check the curve and point format
- return ClientCertificateType.ecdsa_sign;
- }
-
- // TODO Add support for ClientCertificateType.*_fixed_*
-
- throw new TlsFatalAlert(AlertDescription.unsupported_certificate);
- }
- catch (Exception e)
- {
- throw new TlsFatalAlert(AlertDescription.unsupported_certificate, e);
- }
- }
-
- internal static void TrackHashAlgorithms(TlsHandshakeHash handshakeHash, IList supportedSignatureAlgorithms)
- {
- if (supportedSignatureAlgorithms != null)
- {
- foreach (SignatureAndHashAlgorithm signatureAndHashAlgorithm in supportedSignatureAlgorithms)
- {
- byte hashAlgorithm = signatureAndHashAlgorithm.Hash;
-
- // TODO Support values in the "Reserved for Private Use" range
- if (!HashAlgorithm.IsPrivate(hashAlgorithm))
- {
- handshakeHash.TrackHashAlgorithm(hashAlgorithm);
- }
- }
- }
- }
-
- public static bool HasSigningCapability(byte clientCertificateType)
- {
- switch (clientCertificateType)
- {
- case ClientCertificateType.dss_sign:
- case ClientCertificateType.ecdsa_sign:
- case ClientCertificateType.rsa_sign:
- return true;
- default:
- return false;
- }
- }
-
- public static TlsSigner CreateTlsSigner(byte clientCertificateType)
- {
- switch (clientCertificateType)
- {
- case ClientCertificateType.dss_sign:
- return new TlsDssSigner();
- case ClientCertificateType.ecdsa_sign:
- return new TlsECDsaSigner();
- case ClientCertificateType.rsa_sign:
- return new TlsRsaSigner();
- default:
- throw new ArgumentException("not a type with signing capability", "clientCertificateType");
- }
- }
-
- internal static readonly byte[] SSL_CLIENT = {0x43, 0x4C, 0x4E, 0x54};
- internal static readonly byte[] SSL_SERVER = {0x53, 0x52, 0x56, 0x52};
-
- // SSL3 magic mix constants ("A", "BB", "CCC", ...)
- internal static readonly byte[][] SSL3_CONST = GenSsl3Const();
-
- private static byte[][] GenSsl3Const()
- {
- int n = 10;
- byte[][] arr = new byte[n][];
- for (int i = 0; i < n; i++)
- {
- byte[] b = new byte[i + 1];
- Arrays.Fill(b, (byte)('A' + i));
- arr[i] = b;
- }
- return arr;
- }
-
- private static IList VectorOfOne(object obj)
- {
- IList v = Platform.CreateArrayList(1);
- v.Add(obj);
- return v;
- }
-
- public static int GetCipherType(int ciphersuite)
- {
- switch (GetEncryptionAlgorithm(ciphersuite))
- {
- case EncryptionAlgorithm.AES_128_CCM:
- case EncryptionAlgorithm.AES_128_CCM_8:
- case EncryptionAlgorithm.AES_128_GCM:
- case EncryptionAlgorithm.AES_128_OCB_TAGLEN96:
- case EncryptionAlgorithm.AES_256_CCM:
- case EncryptionAlgorithm.AES_256_CCM_8:
- case EncryptionAlgorithm.AES_256_GCM:
- case EncryptionAlgorithm.AES_256_OCB_TAGLEN96:
- case EncryptionAlgorithm.CAMELLIA_128_GCM:
- case EncryptionAlgorithm.CAMELLIA_256_GCM:
- case EncryptionAlgorithm.CHACHA20_POLY1305:
- return CipherType.aead;
-
- case EncryptionAlgorithm.RC2_CBC_40:
- case EncryptionAlgorithm.IDEA_CBC:
- case EncryptionAlgorithm.DES40_CBC:
- case EncryptionAlgorithm.DES_CBC:
- case EncryptionAlgorithm.cls_3DES_EDE_CBC:
- case EncryptionAlgorithm.AES_128_CBC:
- case EncryptionAlgorithm.AES_256_CBC:
- case EncryptionAlgorithm.CAMELLIA_128_CBC:
- case EncryptionAlgorithm.CAMELLIA_256_CBC:
- case EncryptionAlgorithm.SEED_CBC:
- return CipherType.block;
-
- case EncryptionAlgorithm.NULL:
- case EncryptionAlgorithm.RC4_40:
- case EncryptionAlgorithm.RC4_128:
- return CipherType.stream;
-
- default:
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public static int GetEncryptionAlgorithm(int ciphersuite)
- {
- switch (ciphersuite)
- {
- case CipherSuite.TLS_DH_anon_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA:
- return EncryptionAlgorithm.cls_3DES_EDE_CBC;
-
- case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_anon_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_WITH_AES_128_CBC_SHA:
- return EncryptionAlgorithm.AES_128_CBC;
-
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CCM:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_PSK_WITH_AES_128_CCM:
- case CipherSuite.TLS_RSA_WITH_AES_128_CCM:
- return EncryptionAlgorithm.AES_128_CCM;
-
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_PSK_DHE_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_PSK_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_RSA_WITH_AES_128_CCM_8:
- return EncryptionAlgorithm.AES_128_CCM_8;
-
- case CipherSuite.TLS_DH_anon_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256:
- return EncryptionAlgorithm.AES_128_GCM;
-
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_PSK_WITH_AES_128_OCB:
- return EncryptionAlgorithm.AES_128_OCB_TAGLEN96;
-
- case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_ECDH_anon_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_WITH_AES_256_CBC_SHA:
- return EncryptionAlgorithm.AES_256_CBC;
-
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CCM:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_PSK_WITH_AES_256_CCM:
- case CipherSuite.TLS_RSA_WITH_AES_256_CCM:
- return EncryptionAlgorithm.AES_256_CCM;
-
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_PSK_DHE_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_PSK_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_RSA_WITH_AES_256_CCM_8:
- return EncryptionAlgorithm.AES_256_CCM_8;
-
- case CipherSuite.TLS_DH_anon_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_WITH_AES_256_GCM_SHA384:
- return EncryptionAlgorithm.AES_256_GCM;
-
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_256_OCB:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_256_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_256_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_256_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_256_OCB:
- case CipherSuite.DRAFT_TLS_PSK_WITH_AES_256_OCB:
- return EncryptionAlgorithm.AES_256_OCB_TAGLEN96;
-
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- return EncryptionAlgorithm.CAMELLIA_128_CBC;
-
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- return EncryptionAlgorithm.CAMELLIA_128_GCM;
-
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- return EncryptionAlgorithm.CAMELLIA_256_CBC;
-
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- return EncryptionAlgorithm.CAMELLIA_256_GCM;
-
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.DRAFT_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.DRAFT_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256:
- return EncryptionAlgorithm.CHACHA20_POLY1305;
-
- case CipherSuite.TLS_RSA_WITH_NULL_MD5:
- return EncryptionAlgorithm.NULL;
-
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_NULL_SHA:
- case CipherSuite.TLS_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_RSA_WITH_NULL_SHA:
- return EncryptionAlgorithm.NULL;
-
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_RSA_WITH_NULL_SHA256:
- return EncryptionAlgorithm.NULL;
-
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA384:
- return EncryptionAlgorithm.NULL;
-
- case CipherSuite.TLS_DH_anon_WITH_RC4_128_MD5:
- case CipherSuite.TLS_RSA_WITH_RC4_128_MD5:
- return EncryptionAlgorithm.RC4_128;
-
- case CipherSuite.TLS_DHE_PSK_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_PSK_WITH_RC4_128_SHA:
- case CipherSuite.TLS_RSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_RC4_128_SHA:
- return EncryptionAlgorithm.RC4_128;
-
- case CipherSuite.TLS_DH_anon_WITH_SEED_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_SEED_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_SEED_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_SEED_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_SEED_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_SEED_CBC_SHA:
- return EncryptionAlgorithm.SEED_CBC;
-
- default:
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public static int GetKeyExchangeAlgorithm(int ciphersuite)
- {
- switch (ciphersuite)
- {
- case CipherSuite.TLS_DH_anon_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DH_anon_WITH_RC4_128_MD5:
- case CipherSuite.TLS_DH_anon_WITH_SEED_CBC_SHA:
- return KeyExchangeAlgorithm.DH_anon;
-
- case CipherSuite.TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DH_DSS_WITH_SEED_CBC_SHA:
- return KeyExchangeAlgorithm.DH_DSS;
-
- case CipherSuite.TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DH_RSA_WITH_SEED_CBC_SHA:
- return KeyExchangeAlgorithm.DH_RSA;
-
- case CipherSuite.TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_DSS_WITH_SEED_CBC_SHA:
- return KeyExchangeAlgorithm.DHE_DSS;
-
- case CipherSuite.TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CCM:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_128_OCB:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CCM:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_256_OCB:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_RC4_128_SHA:
- case CipherSuite.TLS_PSK_DHE_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_PSK_DHE_WITH_AES_256_CCM_8:
- return KeyExchangeAlgorithm.DHE_PSK;
-
- case CipherSuite.TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_128_OCB:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_256_OCB:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_SEED_CBC_SHA:
- return KeyExchangeAlgorithm.DHE_RSA;
-
- case CipherSuite.TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_RC4_128_SHA:
- return KeyExchangeAlgorithm.ECDH_anon;
-
- case CipherSuite.TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_128_OCB:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_256_OCB:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
- return KeyExchangeAlgorithm.ECDH_ECDSA;
-
- case CipherSuite.TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_RC4_128_SHA:
- return KeyExchangeAlgorithm.ECDH_RSA;
-
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
- return KeyExchangeAlgorithm.ECDHE_ECDSA;
-
- case CipherSuite.TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_128_OCB:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_256_OCB:
- case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_ECDHE_PSK_WITH_RC4_128_SHA:
- return KeyExchangeAlgorithm.ECDHE_PSK;
-
- case CipherSuite.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_128_OCB:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_256_OCB:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_RC4_128_SHA:
- return KeyExchangeAlgorithm.ECDHE_RSA;
-
- case CipherSuite.TLS_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_PSK_WITH_AES_128_CCM:
- case CipherSuite.TLS_PSK_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_PSK_WITH_AES_128_OCB:
- case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_PSK_WITH_AES_256_CCM:
- case CipherSuite.TLS_PSK_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_PSK_WITH_AES_256_OCB:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_PSK_WITH_RC4_128_SHA:
- return KeyExchangeAlgorithm.PSK;
-
- case CipherSuite.TLS_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_RSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_RSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_RSA_WITH_NULL_MD5:
- case CipherSuite.TLS_RSA_WITH_NULL_SHA:
- case CipherSuite.TLS_RSA_WITH_NULL_SHA256:
- case CipherSuite.TLS_RSA_WITH_RC4_128_MD5:
- case CipherSuite.TLS_RSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_RSA_WITH_SEED_CBC_SHA:
- return KeyExchangeAlgorithm.RSA;
-
- case CipherSuite.TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_RC4_128_SHA:
- return KeyExchangeAlgorithm.RSA_PSK;
-
- case CipherSuite.TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_WITH_AES_256_CBC_SHA:
- return KeyExchangeAlgorithm.SRP;
-
- case CipherSuite.TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA:
- return KeyExchangeAlgorithm.SRP_DSS;
-
- case CipherSuite.TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:
- return KeyExchangeAlgorithm.SRP_RSA;
-
- default:
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public static int GetMacAlgorithm(int ciphersuite)
- {
- switch (ciphersuite)
- {
- case CipherSuite.TLS_DH_anon_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CCM:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_128_OCB:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CCM:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_256_OCB:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_128_OCB:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_256_OCB:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_128_OCB:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_256_OCB:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_256_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_128_OCB:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_256_OCB:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_PSK_DHE_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_PSK_DHE_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_PSK_WITH_AES_128_CCM:
- case CipherSuite.TLS_PSK_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_PSK_WITH_AES_128_OCB:
- case CipherSuite.TLS_PSK_WITH_AES_256_CCM:
- case CipherSuite.TLS_PSK_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_PSK_WITH_AES_256_OCB:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_RSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_RSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- return MacAlgorithm.cls_null;
-
- case CipherSuite.TLS_DH_anon_WITH_RC4_128_MD5:
- case CipherSuite.TLS_RSA_WITH_NULL_MD5:
- case CipherSuite.TLS_RSA_WITH_RC4_128_MD5:
- return MacAlgorithm.hmac_md5;
-
- case CipherSuite.TLS_DH_anon_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DH_anon_WITH_SEED_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DH_DSS_WITH_SEED_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DH_RSA_WITH_SEED_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DHE_DSS_WITH_SEED_CBC_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_DHE_PSK_WITH_RC4_128_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_DHE_RSA_WITH_SEED_CBC_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDH_anon_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDH_RSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDHE_PSK_WITH_RC4_128_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_NULL_SHA:
- case CipherSuite.TLS_ECDHE_RSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_PSK_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_PSK_WITH_RC4_128_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA:
- case CipherSuite.TLS_RSA_PSK_WITH_RC4_128_SHA:
- case CipherSuite.TLS_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA:
- case CipherSuite.TLS_RSA_WITH_NULL_SHA:
- case CipherSuite.TLS_RSA_WITH_RC4_128_SHA:
- case CipherSuite.TLS_RSA_WITH_SEED_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_WITH_AES_128_CBC_SHA:
- case CipherSuite.TLS_SRP_SHA_WITH_AES_256_CBC_SHA:
- return MacAlgorithm.hmac_sha1;
-
- case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_NULL_SHA256:
- return MacAlgorithm.hmac_sha256;
-
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_PSK_WITH_NULL_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA384:
- return MacAlgorithm.hmac_sha384;
-
- default:
- throw new TlsFatalAlert(AlertDescription.internal_error);
- }
- }
-
- public static ProtocolVersion GetMinimumVersion(int ciphersuite)
- {
- switch (ciphersuite)
- {
- case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CCM:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_128_OCB:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CCM:
- case CipherSuite.TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_256_OCB:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_128_OCB:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_256_OCB:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_128_OCB:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_256_OCB:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_128_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_256_OCB:
- case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_128_OCB:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_256_OCB:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:
- case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_PSK_DHE_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_PSK_DHE_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_PSK_WITH_AES_128_CCM:
- case CipherSuite.TLS_PSK_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.DRAFT_TLS_PSK_WITH_AES_128_OCB:
- case CipherSuite.TLS_PSK_WITH_AES_256_CCM:
- case CipherSuite.TLS_PSK_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_PSK_WITH_AES_256_OCB:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.DRAFT_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_128_CCM:
- case CipherSuite.TLS_RSA_WITH_AES_128_CCM_8:
- case CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_AES_256_CCM:
- case CipherSuite.TLS_RSA_WITH_AES_256_CCM_8:
- case CipherSuite.TLS_RSA_WITH_AES_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
- case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384:
- case CipherSuite.TLS_RSA_WITH_NULL_SHA256:
- return ProtocolVersion.TLSv12;
-
- default:
- return ProtocolVersion.SSLv3;
- }
- }
-
- public static bool IsAeadCipherSuite(int ciphersuite)
- {
- return CipherType.aead == GetCipherType(ciphersuite);
- }
-
- public static bool IsBlockCipherSuite(int ciphersuite)
- {
- return CipherType.block == GetCipherType(ciphersuite);
- }
-
- public static bool IsStreamCipherSuite(int ciphersuite)
- {
- return CipherType.stream == GetCipherType(ciphersuite);
- }
-
- public static bool IsValidCipherSuiteForSignatureAlgorithms(int cipherSuite, IList sigAlgs)
- {
- int keyExchangeAlgorithm;
- try
- {
- keyExchangeAlgorithm = GetKeyExchangeAlgorithm(cipherSuite);
- }
- catch (IOException e)
- {
- return true;
- }
-
- switch (keyExchangeAlgorithm)
- {
- case KeyExchangeAlgorithm.DH_anon:
- case KeyExchangeAlgorithm.DH_anon_EXPORT:
- case KeyExchangeAlgorithm.ECDH_anon:
- return sigAlgs.Contains(SignatureAlgorithm.anonymous);
-
- case KeyExchangeAlgorithm.DHE_RSA:
- case KeyExchangeAlgorithm.DHE_RSA_EXPORT:
- case KeyExchangeAlgorithm.ECDHE_RSA:
- case KeyExchangeAlgorithm.SRP_RSA:
- return sigAlgs.Contains(SignatureAlgorithm.rsa);
-
- case KeyExchangeAlgorithm.DHE_DSS:
- case KeyExchangeAlgorithm.DHE_DSS_EXPORT:
- case KeyExchangeAlgorithm.SRP_DSS:
- return sigAlgs.Contains(SignatureAlgorithm.dsa);
-
- case KeyExchangeAlgorithm.ECDHE_ECDSA:
- return sigAlgs.Contains(SignatureAlgorithm.ecdsa);
-
- default:
- return true;
- }
- }
-
- public static bool IsValidCipherSuiteForVersion(int cipherSuite, ProtocolVersion serverVersion)
- {
- return GetMinimumVersion(cipherSuite).IsEqualOrEarlierVersionOf(serverVersion.GetEquivalentTLSVersion());
- }
-
- public static IList GetUsableSignatureAlgorithms(IList sigHashAlgs)
- {
- if (sigHashAlgs == null)
- return GetAllSignatureAlgorithms();
-
- IList v = Platform.CreateArrayList(4);
- v.Add(SignatureAlgorithm.anonymous);
- foreach (SignatureAndHashAlgorithm sigHashAlg in sigHashAlgs)
- {
- //if (sigHashAlg.Hash >= MINIMUM_HASH_STRICT)
- {
- byte sigAlg = sigHashAlg.Signature;
- if (!v.Contains(sigAlg))
- {
- v.Add(sigAlg);
- }
- }
- }
- return v;
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/UrlAndHash.cs b/BCCrypto/src/crypto/tls/UrlAndHash.cs
deleted file mode 100644
index 9ffd2cb..0000000
--- a/BCCrypto/src/crypto/tls/UrlAndHash.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * RFC 6066 5.
- */
- public class UrlAndHash
- {
- protected readonly string mUrl;
- protected readonly byte[] mSha1Hash;
-
- public UrlAndHash(string url, byte[] sha1Hash)
- {
- if (url == null || url.Length < 1 || url.Length >= (1 << 16))
- throw new ArgumentException("must have length from 1 to (2^16 - 1)", "url");
- if (sha1Hash != null && sha1Hash.Length != 20)
- throw new ArgumentException("must have length == 20, if present", "sha1Hash");
-
- this.mUrl = url;
- this.mSha1Hash = sha1Hash;
- }
-
- public virtual string Url
- {
- get { return mUrl; }
- }
-
- public virtual byte[] Sha1Hash
- {
- get { return mSha1Hash; }
- }
-
- /**
- * Encode this {@link UrlAndHash} to a {@link Stream}.
- *
- * @param output the {@link Stream} to encode to.
- * @throws IOException
- */
- public virtual void Encode(Stream output)
- {
- byte[] urlEncoding = Strings.ToByteArray(this.mUrl);
- TlsUtilities.WriteOpaque16(urlEncoding, output);
-
- if (this.mSha1Hash == null)
- {
- TlsUtilities.WriteUint8(0, output);
- }
- else
- {
- TlsUtilities.WriteUint8(1, output);
- output.Write(this.mSha1Hash, 0, this.mSha1Hash.Length);
- }
- }
-
- /**
- * Parse a {@link UrlAndHash} from a {@link Stream}.
- *
- * @param context
- * the {@link TlsContext} of the current connection.
- * @param input
- * the {@link Stream} to parse from.
- * @return a {@link UrlAndHash} object.
- * @throws IOException
- */
- public static UrlAndHash Parse(TlsContext context, Stream input)
- {
- byte[] urlEncoding = TlsUtilities.ReadOpaque16(input);
- if (urlEncoding.Length < 1)
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- string url = Strings.FromByteArray(urlEncoding);
-
- byte[] sha1Hash = null;
- byte padding = TlsUtilities.ReadUint8(input);
- switch (padding)
- {
- case 0:
- if (TlsUtilities.IsTlsV12(context))
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- break;
- case 1:
- sha1Hash = TlsUtilities.ReadFully(20, input);
- break;
- default:
- throw new TlsFatalAlert(AlertDescription.illegal_parameter);
- }
-
- return new UrlAndHash(url, sha1Hash);
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/UseSrtpData.cs b/BCCrypto/src/crypto/tls/UseSrtpData.cs
deleted file mode 100644
index fe8f8ac..0000000
--- a/BCCrypto/src/crypto/tls/UseSrtpData.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /**
- * RFC 5764 4.1.1
- */
- public class UseSrtpData
- {
- protected readonly int[] mProtectionProfiles;
- protected readonly byte[] mMki;
-
- /**
- * @param protectionProfiles see {@link SrtpProtectionProfile} for valid constants.
- * @param mki valid lengths from 0 to 255.
- */
- public UseSrtpData(int[] protectionProfiles, byte[] mki)
- {
- if (protectionProfiles == null || protectionProfiles.Length < 1
- || protectionProfiles.Length >= (1 << 15))
- {
- throw new ArgumentException("must have length from 1 to (2^15 - 1)", "protectionProfiles");
- }
-
- if (mki == null)
- {
- mki = TlsUtilities.EmptyBytes;
- }
- else if (mki.Length > 255)
- {
- throw new ArgumentException("cannot be longer than 255 bytes", "mki");
- }
-
- this.mProtectionProfiles = protectionProfiles;
- this.mMki = mki;
- }
-
- /**
- * @return see {@link SrtpProtectionProfile} for valid constants.
- */
- public virtual int[] ProtectionProfiles
- {
- get { return mProtectionProfiles; }
- }
-
- /**
- * @return valid lengths from 0 to 255.
- */
- public virtual byte[] Mki
- {
- get { return mMki; }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/tls/UserMappingType.cs b/BCCrypto/src/crypto/tls/UserMappingType.cs
deleted file mode 100644
index 6cff517..0000000
--- a/BCCrypto/src/crypto/tls/UserMappingType.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Tls
-{
- /// RFC 4681
- public abstract class UserMappingType
- {
- /*
- * RFC 4681
- */
- public const byte upn_domain_hint = 64;
- }
-}
diff --git a/BCCrypto/src/crypto/util/BufferPool.cs b/BCCrypto/src/crypto/util/BufferPool.cs
deleted file mode 100644
index 570a890..0000000
--- a/BCCrypto/src/crypto/util/BufferPool.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace Org.BouncyCastle.Utilities
-{
- ///
- /// Helper methods for allocating temporary buffers
- ///
- public static class BufferPool
- {
- private static Dictionary> bufferPool = new Dictionary>();
-
- ///
- /// Retrieve a buffer of the given size
- ///
- public static byte[] GetBuffer(int size)
- {
- lock(bufferPool)
- {
- if (bufferPool.ContainsKey(size))
- {
- if (bufferPool[size].Count > 0)
- return bufferPool[size].Dequeue();
- }
- }
-
- return new byte[size];
- }
-
- ///
- /// Return a buffer to the pool
- ///
- public static void ReturnBuffer(byte[] buffer)
- {
- lock(bufferPool)
- {
- if (!bufferPool.ContainsKey(buffer.Length))
- bufferPool.Add(buffer.Length, new Queue());
-
- System.Array.Clear(buffer, 0, buffer.Length);
- bufferPool[buffer.Length].Enqueue(buffer);
- }
- }
- }
-}
diff --git a/BCCrypto/src/crypto/util/Pack.cs b/BCCrypto/src/crypto/util/Pack.cs
deleted file mode 100644
index 1b94fee..0000000
--- a/BCCrypto/src/crypto/util/Pack.cs
+++ /dev/null
@@ -1,345 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Crypto.Utilities
-{
- internal sealed class Pack
- {
- private Pack()
- {
- }
-
- internal static void UInt16_To_BE(ushort n, byte[] bs)
- {
- bs[0] = (byte)(n >> 8);
- bs[1] = (byte)(n);
- }
-
- internal static void UInt16_To_BE(ushort n, byte[] bs, int off)
- {
- bs[off] = (byte)(n >> 8);
- bs[off + 1] = (byte)(n);
- }
-
- internal static ushort BE_To_UInt16(byte[] bs)
- {
- uint n = (uint)bs[0] << 8
- | (uint)bs[1];
- return (ushort)n;
- }
-
- internal static ushort BE_To_UInt16(byte[] bs, int off)
- {
- uint n = (uint)bs[off] << 8
- | (uint)bs[off + 1];
- return (ushort)n;
- }
-
- internal static byte[] UInt32_To_BE(uint n)
- {
- byte[] bs = new byte[4];
- UInt32_To_BE(n, bs, 0);
- return bs;
- }
-
- internal static void UInt32_To_BE(uint n, byte[] bs)
- {
- bs[0] = (byte)(n >> 24);
- bs[1] = (byte)(n >> 16);
- bs[2] = (byte)(n >> 8);
- bs[3] = (byte)(n);
- }
-
- internal static void UInt32_To_BE(uint n, byte[] bs, int off)
- {
- bs[off] = (byte)(n >> 24);
- bs[off + 1] = (byte)(n >> 16);
- bs[off + 2] = (byte)(n >> 8);
- bs[off + 3] = (byte)(n);
- }
-
- internal static byte[] UInt32_To_BE(uint[] ns)
- {
- byte[] bs = new byte[4 * ns.Length];
- UInt32_To_BE(ns, bs, 0);
- return bs;
- }
-
- internal static void UInt32_To_BE(uint[] ns, byte[] bs, int off)
- {
- for (int i = 0; i < ns.Length; ++i)
- {
- UInt32_To_BE(ns[i], bs, off);
- off += 4;
- }
- }
-
- internal static uint BE_To_UInt32(byte[] bs)
- {
- return (uint)bs[0] << 24
- | (uint)bs[1] << 16
- | (uint)bs[2] << 8
- | (uint)bs[3];
- }
-
- internal static uint BE_To_UInt32(byte[] bs, int off)
- {
- return (uint)bs[off] << 24
- | (uint)bs[off + 1] << 16
- | (uint)bs[off + 2] << 8
- | (uint)bs[off + 3];
- }
-
- internal static void BE_To_UInt32(byte[] bs, int off, uint[] ns)
- {
- for (int i = 0; i < ns.Length; ++i)
- {
- ns[i] = BE_To_UInt32(bs, off);
- off += 4;
- }
- }
-
- internal static byte[] UInt64_To_BE(ulong n)
- {
- byte[] bs = new byte[8];
- UInt64_To_BE(n, bs, 0);
- return bs;
- }
-
- internal static void UInt64_To_BE(ulong n, byte[] bs)
- {
- UInt32_To_BE((uint)(n >> 32), bs);
- UInt32_To_BE((uint)(n), bs, 4);
- }
-
- internal static void UInt64_To_BE(ulong n, byte[] bs, int off)
- {
- UInt32_To_BE((uint)(n >> 32), bs, off);
- UInt32_To_BE((uint)(n), bs, off + 4);
- }
-
- internal static byte[] UInt64_To_BE(ulong[] ns)
- {
- byte[] bs = new byte[8 * ns.Length];
- UInt64_To_BE(ns, bs, 0);
- return bs;
- }
-
- internal static void UInt64_To_BE(ulong[] ns, byte[] bs, int off)
- {
- for (int i = 0; i < ns.Length; ++i)
- {
- UInt64_To_BE(ns[i], bs, off);
- off += 8;
- }
- }
-
- internal static ulong BE_To_UInt64(byte[] bs)
- {
- uint hi = BE_To_UInt32(bs);
- uint lo = BE_To_UInt32(bs, 4);
- return ((ulong)hi << 32) | (ulong)lo;
- }
-
- internal static ulong BE_To_UInt64(byte[] bs, int off)
- {
- uint hi = BE_To_UInt32(bs, off);
- uint lo = BE_To_UInt32(bs, off + 4);
- return ((ulong)hi << 32) | (ulong)lo;
- }
-
- internal static void BE_To_UInt64(byte[] bs, int off, ulong[] ns)
- {
- for (int i = 0; i < ns.Length; ++i)
- {
- ns[i] = BE_To_UInt64(bs, off);
- off += 8;
- }
- }
-
- internal static void UInt16_To_LE(ushort n, byte[] bs)
- {
- bs[0] = (byte)(n);
- bs[1] = (byte)(n >> 8);
- }
-
- internal static void UInt16_To_LE(ushort n, byte[] bs, int off)
- {
- bs[off] = (byte)(n);
- bs[off + 1] = (byte)(n >> 8);
- }
-
- internal static ushort LE_To_UInt16(byte[] bs)
- {
- uint n = (uint)bs[0]
- | (uint)bs[1] << 8;
- return (ushort)n;
- }
-
- internal static ushort LE_To_UInt16(byte[] bs, int off)
- {
- uint n = (uint)bs[off]
- | (uint)bs[off + 1] << 8;
- return (ushort)n;
- }
-
- internal static byte[] UInt32_To_LE(uint n)
- {
- byte[] bs = new byte[4];
- UInt32_To_LE(n, bs, 0);
- return bs;
- }
-
- internal static void UInt32_To_LE(uint n, byte[] bs)
- {
- bs[0] = (byte)(n);
- bs[1] = (byte)(n >> 8);
- bs[2] = (byte)(n >> 16);
- bs[3] = (byte)(n >> 24);
- }
-
- internal static void UInt32_To_LE(uint n, byte[] bs, int off)
- {
- bs[off] = (byte)(n);
- bs[off + 1] = (byte)(n >> 8);
- bs[off + 2] = (byte)(n >> 16);
- bs[off + 3] = (byte)(n >> 24);
- }
-
- internal static byte[] UInt32_To_LE(uint[] ns)
- {
- byte[] bs = new byte[4 * ns.Length];
- UInt32_To_LE(ns, bs, 0);
- return bs;
- }
-
- internal static void UInt32_To_LE(uint[] ns, byte[] bs, int off)
- {
- for (int i = 0; i < ns.Length; ++i)
- {
- UInt32_To_LE(ns[i], bs, off);
- off += 4;
- }
- }
-
- internal static uint LE_To_UInt32(byte[] bs)
- {
- return (uint)bs[0]
- | (uint)bs[1] << 8
- | (uint)bs[2] << 16
- | (uint)bs[3] << 24;
- }
-
- internal static uint LE_To_UInt32(byte[] bs, int off)
- {
- return (uint)bs[off]
- | (uint)bs[off + 1] << 8
- | (uint)bs[off + 2] << 16
- | (uint)bs[off + 3] << 24;
- }
-
- internal static void LE_To_UInt32(byte[] bs, int off, uint[] ns)
- {
- for (int i = 0; i < ns.Length; ++i)
- {
- ns[i] = LE_To_UInt32(bs, off);
- off += 4;
- }
- }
-
- internal static void LE_To_UInt32(byte[] bs, int bOff, uint[] ns, int nOff, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- ns[nOff + i] = LE_To_UInt32(bs, bOff);
- bOff += 4;
- }
- }
-
- internal static uint[] LE_To_UInt32(byte[] bs, int off, int count)
- {
- uint[] ns = new uint[count];
- for (int i = 0; i < ns.Length; ++i)
- {
- ns[i] = LE_To_UInt32(bs, off);
- off += 4;
- }
- return ns;
- }
-
- internal static byte[] UInt64_To_LE(ulong n)
- {
- byte[] bs = new byte[8];
- UInt64_To_LE(n, bs, 0);
- return bs;
- }
-
- internal static void UInt64_To_LE(ulong n, byte[] bs)
- {
- UInt32_To_LE((uint)(n), bs);
- UInt32_To_LE((uint)(n >> 32), bs, 4);
- }
-
- internal static void UInt64_To_LE(ulong n, byte[] bs, int off)
- {
- UInt32_To_LE((uint)(n), bs, off);
- UInt32_To_LE((uint)(n >> 32), bs, off + 4);
- }
-
- internal static byte[] UInt64_To_LE(ulong[] ns)
- {
- byte[] bs = new byte[8 * ns.Length];
- UInt64_To_LE(ns, bs, 0);
- return bs;
- }
-
- internal static void UInt64_To_LE(ulong[] ns, byte[] bs, int off)
- {
- for (int i = 0; i < ns.Length; ++i)
- {
- UInt64_To_LE(ns[i], bs, off);
- off += 8;
- }
- }
-
- internal static void UInt64_To_LE(ulong[] ns, int nsOff, int nsLen, byte[] bs, int bsOff)
- {
- for (int i = 0; i < nsLen; ++i)
- {
- UInt64_To_LE(ns[nsOff + i], bs, bsOff);
- bsOff += 8;
- }
- }
-
- internal static ulong LE_To_UInt64(byte[] bs)
- {
- uint lo = LE_To_UInt32(bs);
- uint hi = LE_To_UInt32(bs, 4);
- return ((ulong)hi << 32) | (ulong)lo;
- }
-
- internal static ulong LE_To_UInt64(byte[] bs, int off)
- {
- uint lo = LE_To_UInt32(bs, off);
- uint hi = LE_To_UInt32(bs, off + 4);
- return ((ulong)hi << 32) | (ulong)lo;
- }
-
- internal static void LE_To_UInt64(byte[] bs, int off, ulong[] ns)
- {
- for (int i = 0; i < ns.Length; ++i)
- {
- ns[i] = LE_To_UInt64(bs, off);
- off += 8;
- }
- }
-
- internal static void LE_To_UInt64(byte[] bs, int bsOff, ulong[] ns, int nsOff, int nsLen)
- {
- for (int i = 0; i < nsLen; ++i)
- {
- ns[nsOff + i] = LE_To_UInt64(bs, bsOff);
- bsOff += 8;
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/BigInteger.cs b/BCCrypto/src/math/BigInteger.cs
deleted file mode 100644
index b35701f..0000000
--- a/BCCrypto/src/math/BigInteger.cs
+++ /dev/null
@@ -1,3592 +0,0 @@
-using System;
-using System.Collections;
-using System.Diagnostics;
-using System.Globalization;
-using System.Text;
-
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class BigInteger
- {
- // The first few odd primes
- /*
- 3 5 7 11 13 17 19 23 29
- 31 37 41 43 47 53 59 61 67 71
- 73 79 83 89 97 101 103 107 109 113
- 127 131 137 139 149 151 157 163 167 173
- 179 181 191 193 197 199 211 223 227 229
- 233 239 241 251 257 263 269 271 277 281
- 283 293 307 311 313 317 331 337 347 349
- 353 359 367 373 379 383 389 397 401 409
- 419 421 431 433 439 443 449 457 461 463
- 467 479 487 491 499 503 509 521 523 541
- 547 557 563 569 571 577 587 593 599 601
- 607 613 617 619 631 641 643 647 653 659
- 661 673 677 683 691 701 709 719 727 733
- 739 743 751 757 761 769 773 787 797 809
- 811 821 823 827 829 839 853 857 859 863
- 877 881 883 887 907 911 919 929 937 941
- 947 953 967 971 977 983 991 997 1009
- 1013 1019 1021 1031 1033 1039 1049 1051
- 1061 1063 1069 1087 1091 1093 1097 1103
- 1109 1117 1123 1129 1151 1153 1163 1171
- 1181 1187 1193 1201 1213 1217 1223 1229
- 1231 1237 1249 1259 1277 1279 1283 1289
- */
-
- // Each list has a product < 2^31
- internal static readonly int[][] primeLists = new int[][]
- {
- new int[]{ 3, 5, 7, 11, 13, 17, 19, 23 },
- new int[]{ 29, 31, 37, 41, 43 },
- new int[]{ 47, 53, 59, 61, 67 },
- new int[]{ 71, 73, 79, 83 },
- new int[]{ 89, 97, 101, 103 },
-
- new int[]{ 107, 109, 113, 127 },
- new int[]{ 131, 137, 139, 149 },
- new int[]{ 151, 157, 163, 167 },
- new int[]{ 173, 179, 181, 191 },
- new int[]{ 193, 197, 199, 211 },
-
- new int[]{ 223, 227, 229 },
- new int[]{ 233, 239, 241 },
- new int[]{ 251, 257, 263 },
- new int[]{ 269, 271, 277 },
- new int[]{ 281, 283, 293 },
-
- new int[]{ 307, 311, 313 },
- new int[]{ 317, 331, 337 },
- new int[]{ 347, 349, 353 },
- new int[]{ 359, 367, 373 },
- new int[]{ 379, 383, 389 },
-
- new int[]{ 397, 401, 409 },
- new int[]{ 419, 421, 431 },
- new int[]{ 433, 439, 443 },
- new int[]{ 449, 457, 461 },
- new int[]{ 463, 467, 479 },
-
- new int[]{ 487, 491, 499 },
- new int[]{ 503, 509, 521 },
- new int[]{ 523, 541, 547 },
- new int[]{ 557, 563, 569 },
- new int[]{ 571, 577, 587 },
-
- new int[]{ 593, 599, 601 },
- new int[]{ 607, 613, 617 },
- new int[]{ 619, 631, 641 },
- new int[]{ 643, 647, 653 },
- new int[]{ 659, 661, 673 },
-
- new int[]{ 677, 683, 691 },
- new int[]{ 701, 709, 719 },
- new int[]{ 727, 733, 739 },
- new int[]{ 743, 751, 757 },
- new int[]{ 761, 769, 773 },
-
- new int[]{ 787, 797, 809 },
- new int[]{ 811, 821, 823 },
- new int[]{ 827, 829, 839 },
- new int[]{ 853, 857, 859 },
- new int[]{ 863, 877, 881 },
-
- new int[]{ 883, 887, 907 },
- new int[]{ 911, 919, 929 },
- new int[]{ 937, 941, 947 },
- new int[]{ 953, 967, 971 },
- new int[]{ 977, 983, 991 },
-
- new int[]{ 997, 1009, 1013 },
- new int[]{ 1019, 1021, 1031 },
- new int[]{ 1033, 1039, 1049 },
- new int[]{ 1051, 1061, 1063 },
- new int[]{ 1069, 1087, 1091 },
-
- new int[]{ 1093, 1097, 1103 },
- new int[]{ 1109, 1117, 1123 },
- new int[]{ 1129, 1151, 1153 },
- new int[]{ 1163, 1171, 1181 },
- new int[]{ 1187, 1193, 1201 },
-
- new int[]{ 1213, 1217, 1223 },
- new int[]{ 1229, 1231, 1237 },
- new int[]{ 1249, 1259, 1277 },
- new int[]{ 1279, 1283, 1289 },
- };
-
- internal static readonly int[] primeProducts;
-
- private const long IMASK = 0xFFFFFFFFL;
- private const ulong UIMASK = 0xFFFFFFFFUL;
-
- private static readonly int[] ZeroMagnitude = new int[0];
- private static readonly byte[] ZeroEncoding = new byte[0];
-
- private static readonly BigInteger[] SMALL_CONSTANTS = new BigInteger[17];
- public static readonly BigInteger Zero;
- public static readonly BigInteger One;
- public static readonly BigInteger Two;
- public static readonly BigInteger Three;
- public static readonly BigInteger Ten;
-
- //private readonly static byte[] BitCountTable =
- //{
- // 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
- // 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- // 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- // 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- // 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- // 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- // 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- // 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- // 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- // 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- // 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- // 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- // 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- // 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- // 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- // 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
- //};
-
- private readonly static byte[] BitLengthTable =
- {
- 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
- };
-
- // TODO Parse radix-2 64 bits at a time and radix-8 63 bits at a time
- private const int chunk2 = 1, chunk8 = 1, chunk10 = 19, chunk16 = 16;
- private static readonly BigInteger radix2, radix2E, radix8, radix8E, radix10, radix10E, radix16, radix16E;
-
- private static readonly SecureRandom RandomSource = new SecureRandom();
-
- /*
- * These are the threshold bit-lengths (of an exponent) where we increase the window size.
- * They are calculated according to the expected savings in multiplications.
- * Some squares will also be saved on average, but we offset these against the extra storage costs.
- */
- private static readonly int[] ExpWindowThresholds = { 7, 25, 81, 241, 673, 1793, 4609, Int32.MaxValue };
-
- private const int BitsPerByte = 8;
- private const int BitsPerInt = 32;
- private const int BytesPerInt = 4;
-
- static BigInteger()
- {
- Zero = new BigInteger(0, ZeroMagnitude, false);
- Zero.nBits = 0; Zero.nBitLength = 0;
-
- SMALL_CONSTANTS[0] = Zero;
- for (uint i = 1; i < SMALL_CONSTANTS.Length; ++i)
- {
- SMALL_CONSTANTS[i] = CreateUValueOf(i);
- }
-
- One = SMALL_CONSTANTS[1];
- Two = SMALL_CONSTANTS[2];
- Three = SMALL_CONSTANTS[3];
- Ten = SMALL_CONSTANTS[10];
-
- radix2 = ValueOf(2);
- radix2E = radix2.Pow(chunk2);
-
- radix8 = ValueOf(8);
- radix8E = radix8.Pow(chunk8);
-
- radix10 = ValueOf(10);
- radix10E = radix10.Pow(chunk10);
-
- radix16 = ValueOf(16);
- radix16E = radix16.Pow(chunk16);
-
- primeProducts = new int[primeLists.Length];
-
- for (int i = 0; i < primeLists.Length; ++i)
- {
- int[] primeList = primeLists[i];
- int product = primeList[0];
- for (int j = 1; j < primeList.Length; ++j)
- {
- product *= primeList[j];
- }
- primeProducts[i] = product;
- }
- }
-
- private int[] magnitude; // array of ints with [0] being the most significant
- private int sign; // -1 means -ve; +1 means +ve; 0 means 0;
- private int nBits = -1; // cache BitCount() value
- private int nBitLength = -1; // cache BitLength() value
- private int mQuote = 0; // -m^(-1) mod b, b = 2^32 (see Montgomery mult.), 0 when uninitialised
-
- private static int GetByteLength(
- int nBits)
- {
- return (nBits + BitsPerByte - 1) / BitsPerByte;
- }
-
- internal static BigInteger Arbitrary(int sizeInBits)
- {
- return new BigInteger(sizeInBits, RandomSource);
- }
-
- private BigInteger(
- int signum,
- int[] mag,
- bool checkMag)
- {
- if (checkMag)
- {
- int i = 0;
- while (i < mag.Length && mag[i] == 0)
- {
- ++i;
- }
-
- if (i == mag.Length)
- {
- this.sign = 0;
- this.magnitude = ZeroMagnitude;
- }
- else
- {
- this.sign = signum;
-
- if (i == 0)
- {
- this.magnitude = mag;
- }
- else
- {
- // strip leading 0 words
- this.magnitude = new int[mag.Length - i];
- Array.Copy(mag, i, this.magnitude, 0, this.magnitude.Length);
- }
- }
- }
- else
- {
- this.sign = signum;
- this.magnitude = mag;
- }
- }
-
- public BigInteger(
- string value)
- : this(value, 10)
- {
- }
-
- public BigInteger(
- string str,
- int radix)
- {
- if (str.Length == 0)
- throw new FormatException("Zero length BigInteger");
-
- NumberStyles style;
- int chunk;
- BigInteger r;
- BigInteger rE;
-
- switch (radix)
- {
- case 2:
- // Is there anyway to restrict to binary digits?
- style = NumberStyles.Integer;
- chunk = chunk2;
- r = radix2;
- rE = radix2E;
- break;
- case 8:
- // Is there anyway to restrict to octal digits?
- style = NumberStyles.Integer;
- chunk = chunk8;
- r = radix8;
- rE = radix8E;
- break;
- case 10:
- // This style seems to handle spaces and minus sign already (our processing redundant?)
- style = NumberStyles.Integer;
- chunk = chunk10;
- r = radix10;
- rE = radix10E;
- break;
- case 16:
- // TODO Should this be HexNumber?
- style = NumberStyles.AllowHexSpecifier;
- chunk = chunk16;
- r = radix16;
- rE = radix16E;
- break;
- default:
- throw new FormatException("Only bases 2, 8, 10, or 16 allowed");
- }
-
-
- int index = 0;
- sign = 1;
-
- if (str[0] == '-')
- {
- if (str.Length == 1)
- throw new FormatException("Zero length BigInteger");
-
- sign = -1;
- index = 1;
- }
-
- // strip leading zeros from the string str
- while (index < str.Length && Int32.Parse(str[index].ToString(), style) == 0)
- {
- index++;
- }
-
- if (index >= str.Length)
- {
- // zero value - we're done
- sign = 0;
- magnitude = ZeroMagnitude;
- return;
- }
-
- //////
- // could we work out the max number of ints required to store
- // str.Length digits in the given base, then allocate that
- // storage in one hit?, then Generate the magnitude in one hit too?
- //////
-
- BigInteger b = Zero;
-
-
- int next = index + chunk;
-
- if (next <= str.Length)
- {
- do
- {
- string s = str.Substring(index, chunk);
- ulong i = ulong.Parse(s, style);
- BigInteger bi = CreateUValueOf(i);
-
- switch (radix)
- {
- case 2:
- // TODO Need this because we are parsing in radix 10 above
- if (i >= 2)
- throw new FormatException("Bad character in radix 2 string: " + s);
-
- // TODO Parse 64 bits at a time
- b = b.ShiftLeft(1);
- break;
- case 8:
- // TODO Need this because we are parsing in radix 10 above
- if (i >= 8)
- throw new FormatException("Bad character in radix 8 string: " + s);
-
- // TODO Parse 63 bits at a time
- b = b.ShiftLeft(3);
- break;
- case 16:
- b = b.ShiftLeft(64);
- break;
- default:
- b = b.Multiply(rE);
- break;
- }
-
- b = b.Add(bi);
-
- index = next;
- next += chunk;
- }
- while (next <= str.Length);
- }
-
- if (index < str.Length)
- {
- string s = str.Substring(index);
- ulong i = ulong.Parse(s, style);
- BigInteger bi = CreateUValueOf(i);
-
- if (b.sign > 0)
- {
- if (radix == 2)
- {
- // NB: Can't reach here since we are parsing one char at a time
- Debug.Assert(false);
-
- // TODO Parse all bits at once
-// b = b.ShiftLeft(s.Length);
- }
- else if (radix == 8)
- {
- // NB: Can't reach here since we are parsing one char at a time
- Debug.Assert(false);
-
- // TODO Parse all bits at once
-// b = b.ShiftLeft(s.Length * 3);
- }
- else if (radix == 16)
- {
- b = b.ShiftLeft(s.Length << 2);
- }
- else
- {
- b = b.Multiply(r.Pow(s.Length));
- }
-
- b = b.Add(bi);
- }
- else
- {
- b = bi;
- }
- }
-
- // Note: This is the previous (slower) algorithm
-// while (index < value.Length)
-// {
-// char c = value[index];
-// string s = c.ToString();
-// int i = Int32.Parse(s, style);
-//
-// b = b.Multiply(r).Add(ValueOf(i));
-// index++;
-// }
-
- magnitude = b.magnitude;
- }
-
- public BigInteger(
- byte[] bytes)
- : this(bytes, 0, bytes.Length)
- {
- }
-
- public BigInteger(
- byte[] bytes,
- int offset,
- int length)
- {
- if (length == 0)
- throw new FormatException("Zero length BigInteger");
-
- // TODO Move this processing into MakeMagnitude (provide sign argument)
- if ((sbyte)bytes[offset] < 0)
- {
- this.sign = -1;
-
- int end = offset + length;
-
- int iBval;
- // strip leading sign bytes
- for (iBval = offset; iBval < end && ((sbyte)bytes[iBval] == -1); iBval++)
- {
- }
-
- if (iBval >= end)
- {
- this.magnitude = One.magnitude;
- }
- else
- {
- int numBytes = end - iBval;
- byte[] inverse = new byte[numBytes];
-
- int index = 0;
- while (index < numBytes)
- {
- inverse[index++] = (byte)~bytes[iBval++];
- }
-
- Debug.Assert(iBval == end);
-
- while (inverse[--index] == byte.MaxValue)
- {
- inverse[index] = byte.MinValue;
- }
-
- inverse[index]++;
-
- this.magnitude = MakeMagnitude(inverse, 0, inverse.Length);
- }
- }
- else
- {
- // strip leading zero bytes and return magnitude bytes
- this.magnitude = MakeMagnitude(bytes, offset, length);
- this.sign = this.magnitude.Length > 0 ? 1 : 0;
- }
- }
-
- private static int[] MakeMagnitude(
- byte[] bytes,
- int offset,
- int length)
- {
- int end = offset + length;
-
- // strip leading zeros
- int firstSignificant;
- for (firstSignificant = offset; firstSignificant < end
- && bytes[firstSignificant] == 0; firstSignificant++)
- {
- }
-
- if (firstSignificant >= end)
- {
- return ZeroMagnitude;
- }
-
- int nInts = (end - firstSignificant + 3) / BytesPerInt;
- int bCount = (end - firstSignificant) % BytesPerInt;
- if (bCount == 0)
- {
- bCount = BytesPerInt;
- }
-
- if (nInts < 1)
- {
- return ZeroMagnitude;
- }
-
- int[] mag = new int[nInts];
-
- int v = 0;
- int magnitudeIndex = 0;
- for (int i = firstSignificant; i < end; ++i)
- {
- v <<= 8;
- v |= bytes[i] & 0xff;
- bCount--;
- if (bCount <= 0)
- {
- mag[magnitudeIndex] = v;
- magnitudeIndex++;
- bCount = BytesPerInt;
- v = 0;
- }
- }
-
- if (magnitudeIndex < mag.Length)
- {
- mag[magnitudeIndex] = v;
- }
-
- return mag;
- }
-
- public BigInteger(
- int sign,
- byte[] bytes)
- : this(sign, bytes, 0, bytes.Length)
- {
- }
-
- public BigInteger(
- int sign,
- byte[] bytes,
- int offset,
- int length)
- {
- if (sign < -1 || sign > 1)
- throw new FormatException("Invalid sign value");
-
- if (sign == 0)
- {
- this.sign = 0;
- this.magnitude = ZeroMagnitude;
- }
- else
- {
- // copy bytes
- this.magnitude = MakeMagnitude(bytes, offset, length);
- this.sign = this.magnitude.Length < 1 ? 0 : sign;
- }
- }
-
- public BigInteger(
- int sizeInBits,
- Random random)
- {
- if (sizeInBits < 0)
- throw new ArgumentException("sizeInBits must be non-negative");
-
- this.nBits = -1;
- this.nBitLength = -1;
-
- if (sizeInBits == 0)
- {
- this.sign = 0;
- this.magnitude = ZeroMagnitude;
- return;
- }
-
- int nBytes = GetByteLength(sizeInBits);
- byte[] b = new byte[nBytes];
- random.NextBytes(b);
-
- // strip off any excess bits in the MSB
- int xBits = BitsPerByte * nBytes - sizeInBits;
- b[0] &= (byte)(255U >> xBits);
-
- this.magnitude = MakeMagnitude(b, 0, b.Length);
- this.sign = this.magnitude.Length < 1 ? 0 : 1;
- }
-
- public BigInteger(
- int bitLength,
- int certainty,
- Random random)
- {
- if (bitLength < 2)
- throw new ArithmeticException("bitLength < 2");
-
- this.sign = 1;
- this.nBitLength = bitLength;
-
- if (bitLength == 2)
- {
- this.magnitude = random.Next(2) == 0
- ? Two.magnitude
- : Three.magnitude;
- return;
- }
-
- int nBytes = GetByteLength(bitLength);
- byte[] b = new byte[nBytes];
-
- int xBits = BitsPerByte * nBytes - bitLength;
- byte mask = (byte)(255U >> xBits);
- byte lead = (byte)(1 << (7 - xBits));
-
- for (;;)
- {
- random.NextBytes(b);
-
- // strip off any excess bits in the MSB
- b[0] &= mask;
-
- // ensure the leading bit is 1 (to meet the strength requirement)
- b[0] |= lead;
-
- // ensure the trailing bit is 1 (i.e. must be odd)
- b[nBytes - 1] |= 1;
-
- this.magnitude = MakeMagnitude(b, 0, b.Length);
- this.nBits = -1;
- this.mQuote = 0;
-
- if (certainty < 1)
- break;
-
- if (CheckProbablePrime(certainty, random, true))
- break;
-
- for (int j = 1; j < (magnitude.Length - 1); ++j)
- {
- this.magnitude[j] ^= random.Next();
-
- if (CheckProbablePrime(certainty, random, true))
- return;
- }
- }
- }
-
- public BigInteger Abs()
- {
- return sign >= 0 ? this : Negate();
- }
-
- /**
- * return a = a + b - b preserved.
- */
- private static int[] AddMagnitudes(
- int[] a,
- int[] b)
- {
- int tI = a.Length - 1;
- int vI = b.Length - 1;
- long m = 0;
-
- while (vI >= 0)
- {
- m += ((long)(uint)a[tI] + (long)(uint)b[vI--]);
- a[tI--] = (int)m;
- m = (long)((ulong)m >> 32);
- }
-
- if (m != 0)
- {
- while (tI >= 0 && ++a[tI--] == 0)
- {
- }
- }
-
- return a;
- }
-
- public BigInteger Add(
- BigInteger value)
- {
- if (this.sign == 0)
- return value;
-
- if (this.sign != value.sign)
- {
- if (value.sign == 0)
- return this;
-
- if (value.sign < 0)
- return Subtract(value.Negate());
-
- return value.Subtract(Negate());
- }
-
- return AddToMagnitude(value.magnitude);
- }
-
- private BigInteger AddToMagnitude(
- int[] magToAdd)
- {
- int[] big, small;
- if (this.magnitude.Length < magToAdd.Length)
- {
- big = magToAdd;
- small = this.magnitude;
- }
- else
- {
- big = this.magnitude;
- small = magToAdd;
- }
-
- // Conservatively avoid over-allocation when no overflow possible
- uint limit = uint.MaxValue;
- if (big.Length == small.Length)
- limit -= (uint) small[0];
-
- bool possibleOverflow = (uint) big[0] >= limit;
-
- int[] bigCopy;
- if (possibleOverflow)
- {
- bigCopy = new int[big.Length + 1];
- big.CopyTo(bigCopy, 1);
- }
- else
- {
- bigCopy = (int[]) big.Clone();
- }
-
- bigCopy = AddMagnitudes(bigCopy, small);
-
- return new BigInteger(this.sign, bigCopy, possibleOverflow);
- }
-
- public BigInteger And(
- BigInteger value)
- {
- if (this.sign == 0 || value.sign == 0)
- {
- return Zero;
- }
-
- int[] aMag = this.sign > 0
- ? this.magnitude
- : Add(One).magnitude;
-
- int[] bMag = value.sign > 0
- ? value.magnitude
- : value.Add(One).magnitude;
-
- bool resultNeg = sign < 0 && value.sign < 0;
- int resultLength = System.Math.Max(aMag.Length, bMag.Length);
- int[] resultMag = new int[resultLength];
-
- int aStart = resultMag.Length - aMag.Length;
- int bStart = resultMag.Length - bMag.Length;
-
- for (int i = 0; i < resultMag.Length; ++i)
- {
- int aWord = i >= aStart ? aMag[i - aStart] : 0;
- int bWord = i >= bStart ? bMag[i - bStart] : 0;
-
- if (this.sign < 0)
- {
- aWord = ~aWord;
- }
-
- if (value.sign < 0)
- {
- bWord = ~bWord;
- }
-
- resultMag[i] = aWord & bWord;
-
- if (resultNeg)
- {
- resultMag[i] = ~resultMag[i];
- }
- }
-
- BigInteger result = new BigInteger(1, resultMag, true);
-
- // TODO Optimise this case
- if (resultNeg)
- {
- result = result.Not();
- }
-
- return result;
- }
-
- public BigInteger AndNot(
- BigInteger val)
- {
- return And(val.Not());
- }
-
- public int BitCount
- {
- get
- {
- if (nBits == -1)
- {
- if (sign < 0)
- {
- // TODO Optimise this case
- nBits = Not().BitCount;
- }
- else
- {
- int sum = 0;
- for (int i = 0; i < magnitude.Length; ++i)
- {
- sum += BitCnt(magnitude[i]);
- }
- nBits = sum;
- }
- }
-
- return nBits;
- }
- }
-
- public static int BitCnt(int i)
- {
- uint u = (uint)i;
- u = u - ((u >> 1) & 0x55555555);
- u = (u & 0x33333333) + ((u >> 2) & 0x33333333);
- u = (u + (u >> 4)) & 0x0f0f0f0f;
- u += (u >> 8);
- u += (u >> 16);
- u &= 0x3f;
- return (int)u;
- }
-
- private static int CalcBitLength(int sign, int indx, int[] mag)
- {
- for (;;)
- {
- if (indx >= mag.Length)
- return 0;
-
- if (mag[indx] != 0)
- break;
-
- ++indx;
- }
-
- // bit length for everything after the first int
- int bitLength = 32 * ((mag.Length - indx) - 1);
-
- // and determine bitlength of first int
- int firstMag = mag[indx];
- bitLength += BitLen(firstMag);
-
- // Check for negative powers of two
- if (sign < 0 && ((firstMag & -firstMag) == firstMag))
- {
- do
- {
- if (++indx >= mag.Length)
- {
- --bitLength;
- break;
- }
- }
- while (mag[indx] == 0);
- }
-
- return bitLength;
- }
-
- public int BitLength
- {
- get
- {
- if (nBitLength == -1)
- {
- nBitLength = sign == 0
- ? 0
- : CalcBitLength(sign, 0, magnitude);
- }
-
- return nBitLength;
- }
- }
-
- //
- // BitLen(value) is the number of bits in value.
- //
- internal static int BitLen(int w)
- {
- uint v = (uint)w;
- uint t = v >> 24;
- if (t != 0)
- return 24 + BitLengthTable[t];
- t = v >> 16;
- if (t != 0)
- return 16 + BitLengthTable[t];
- t = v >> 8;
- if (t != 0)
- return 8 + BitLengthTable[t];
- return BitLengthTable[v];
- }
-
- private bool QuickPow2Check()
- {
- return sign > 0 && nBits == 1;
- }
-
- public int CompareTo(
- object obj)
- {
- return CompareTo((BigInteger)obj);
- }
-
- /**
- * unsigned comparison on two arrays - note the arrays may
- * start with leading zeros.
- */
- private static int CompareTo(
- int xIndx,
- int[] x,
- int yIndx,
- int[] y)
- {
- while (xIndx != x.Length && x[xIndx] == 0)
- {
- xIndx++;
- }
-
- while (yIndx != y.Length && y[yIndx] == 0)
- {
- yIndx++;
- }
-
- return CompareNoLeadingZeroes(xIndx, x, yIndx, y);
- }
-
- private static int CompareNoLeadingZeroes(
- int xIndx,
- int[] x,
- int yIndx,
- int[] y)
- {
- int diff = (x.Length - y.Length) - (xIndx - yIndx);
-
- if (diff != 0)
- {
- return diff < 0 ? -1 : 1;
- }
-
- // lengths of magnitudes the same, test the magnitude values
-
- while (xIndx < x.Length)
- {
- uint v1 = (uint)x[xIndx++];
- uint v2 = (uint)y[yIndx++];
-
- if (v1 != v2)
- return v1 < v2 ? -1 : 1;
- }
-
- return 0;
- }
-
- public int CompareTo(
- BigInteger value)
- {
- return sign < value.sign ? -1
- : sign > value.sign ? 1
- : sign == 0 ? 0
- : sign * CompareNoLeadingZeroes(0, magnitude, 0, value.magnitude);
- }
-
- /**
- * return z = x / y - done in place (z value preserved, x contains the
- * remainder)
- */
- private int[] Divide(
- int[] x,
- int[] y)
- {
- int xStart = 0;
- while (xStart < x.Length && x[xStart] == 0)
- {
- ++xStart;
- }
-
- int yStart = 0;
- while (yStart < y.Length && y[yStart] == 0)
- {
- ++yStart;
- }
-
- Debug.Assert(yStart < y.Length);
-
- int xyCmp = CompareNoLeadingZeroes(xStart, x, yStart, y);
- int[] count;
-
- if (xyCmp > 0)
- {
- int yBitLength = CalcBitLength(1, yStart, y);
- int xBitLength = CalcBitLength(1, xStart, x);
- int shift = xBitLength - yBitLength;
-
- int[] iCount;
- int iCountStart = 0;
-
- int[] c;
- int cStart = 0;
- int cBitLength = yBitLength;
- if (shift > 0)
- {
-// iCount = ShiftLeft(One.magnitude, shift);
- iCount = new int[(shift >> 5) + 1];
- iCount[0] = 1 << (shift % 32);
-
- c = ShiftLeft(y, shift);
- cBitLength += shift;
- }
- else
- {
- iCount = new int[] { 1 };
-
- int len = y.Length - yStart;
- c = new int[len];
- Array.Copy(y, yStart, c, 0, len);
- }
-
- count = new int[iCount.Length];
-
- for (;;)
- {
- if (cBitLength < xBitLength
- || CompareNoLeadingZeroes(xStart, x, cStart, c) >= 0)
- {
- Subtract(xStart, x, cStart, c);
- AddMagnitudes(count, iCount);
-
- while (x[xStart] == 0)
- {
- if (++xStart == x.Length)
- return count;
- }
-
- //xBitLength = CalcBitLength(xStart, x);
- xBitLength = 32 * (x.Length - xStart - 1) + BitLen(x[xStart]);
-
- if (xBitLength <= yBitLength)
- {
- if (xBitLength < yBitLength)
- return count;
-
- xyCmp = CompareNoLeadingZeroes(xStart, x, yStart, y);
-
- if (xyCmp <= 0)
- break;
- }
- }
-
- shift = cBitLength - xBitLength;
-
- // NB: The case where c[cStart] is 1-bit is harmless
- if (shift == 1)
- {
- uint firstC = (uint) c[cStart] >> 1;
- uint firstX = (uint) x[xStart];
- if (firstC > firstX)
- ++shift;
- }
-
- if (shift < 2)
- {
- ShiftRightOneInPlace(cStart, c);
- --cBitLength;
- ShiftRightOneInPlace(iCountStart, iCount);
- }
- else
- {
- ShiftRightInPlace(cStart, c, shift);
- cBitLength -= shift;
- ShiftRightInPlace(iCountStart, iCount, shift);
- }
-
- //cStart = c.Length - ((cBitLength + 31) / 32);
- while (c[cStart] == 0)
- {
- ++cStart;
- }
-
- while (iCount[iCountStart] == 0)
- {
- ++iCountStart;
- }
- }
- }
- else
- {
- count = new int[1];
- }
-
- if (xyCmp == 0)
- {
- AddMagnitudes(count, One.magnitude);
- Array.Clear(x, xStart, x.Length - xStart);
- }
-
- return count;
- }
-
- public BigInteger Divide(
- BigInteger val)
- {
- if (val.sign == 0)
- throw new ArithmeticException("Division by zero error");
-
- if (sign == 0)
- return Zero;
-
- if (val.QuickPow2Check()) // val is power of two
- {
- BigInteger result = this.Abs().ShiftRight(val.Abs().BitLength - 1);
- return val.sign == this.sign ? result : result.Negate();
- }
-
- int[] mag = (int[]) this.magnitude.Clone();
-
- return new BigInteger(this.sign * val.sign, Divide(mag, val.magnitude), true);
- }
-
- public BigInteger[] DivideAndRemainder(
- BigInteger val)
- {
- if (val.sign == 0)
- throw new ArithmeticException("Division by zero error");
-
- BigInteger[] biggies = new BigInteger[2];
-
- if (sign == 0)
- {
- biggies[0] = Zero;
- biggies[1] = Zero;
- }
- else if (val.QuickPow2Check()) // val is power of two
- {
- int e = val.Abs().BitLength - 1;
- BigInteger quotient = this.Abs().ShiftRight(e);
- int[] remainder = this.LastNBits(e);
-
- biggies[0] = val.sign == this.sign ? quotient : quotient.Negate();
- biggies[1] = new BigInteger(this.sign, remainder, true);
- }
- else
- {
- int[] remainder = (int[]) this.magnitude.Clone();
- int[] quotient = Divide(remainder, val.magnitude);
-
- biggies[0] = new BigInteger(this.sign * val.sign, quotient, true);
- biggies[1] = new BigInteger(this.sign, remainder, true);
- }
-
- return biggies;
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- BigInteger biggie = obj as BigInteger;
- if (biggie == null)
- return false;
-
- return sign == biggie.sign && IsEqualMagnitude(biggie);
- }
-
- private bool IsEqualMagnitude(BigInteger x)
- {
- int[] xMag = x.magnitude;
- if (magnitude.Length != x.magnitude.Length)
- return false;
- for (int i = 0; i < magnitude.Length; i++)
- {
- if (magnitude[i] != x.magnitude[i])
- return false;
- }
- return true;
- }
-
- public BigInteger Gcd(
- BigInteger value)
- {
- if (value.sign == 0)
- return Abs();
-
- if (sign == 0)
- return value.Abs();
-
- BigInteger r;
- BigInteger u = this;
- BigInteger v = value;
-
- while (v.sign != 0)
- {
- r = u.Mod(v);
- u = v;
- v = r;
- }
-
- return u;
- }
-
- public override int GetHashCode()
- {
- int hc = magnitude.Length;
- if (magnitude.Length > 0)
- {
- hc ^= magnitude[0];
-
- if (magnitude.Length > 1)
- {
- hc ^= magnitude[magnitude.Length - 1];
- }
- }
-
- return sign < 0 ? ~hc : hc;
- }
-
- // TODO Make public?
- private BigInteger Inc()
- {
- if (this.sign == 0)
- return One;
-
- if (this.sign < 0)
- return new BigInteger(-1, doSubBigLil(this.magnitude, One.magnitude), true);
-
- return AddToMagnitude(One.magnitude);
- }
-
- public int IntValue
- {
- get
- {
- if (sign == 0)
- return 0;
-
- int n = magnitude.Length;
-
- int v = magnitude[n - 1];
-
- return sign < 0 ? -v : v;
- }
- }
-
- /**
- * return whether or not a BigInteger is probably prime with a
- * probability of 1 - (1/2)**certainty.
- * From Knuth Vol 2, pg 395.
- */
- public bool IsProbablePrime(int certainty)
- {
- return IsProbablePrime(certainty, false);
- }
-
- internal bool IsProbablePrime(int certainty, bool randomlySelected)
- {
- if (certainty <= 0)
- return true;
-
- BigInteger n = Abs();
-
- if (!n.TestBit(0))
- return n.Equals(Two);
-
- if (n.Equals(One))
- return false;
-
- return n.CheckProbablePrime(certainty, RandomSource, randomlySelected);
- }
-
- private bool CheckProbablePrime(int certainty, Random random, bool randomlySelected)
- {
- Debug.Assert(certainty > 0);
- Debug.Assert(CompareTo(Two) > 0);
- Debug.Assert(TestBit(0));
-
-
- // Try to reduce the penalty for really small numbers
- int numLists = System.Math.Min(BitLength - 1, primeLists.Length);
-
- for (int i = 0; i < numLists; ++i)
- {
- int test = Remainder(primeProducts[i]);
-
- int[] primeList = primeLists[i];
- for (int j = 0; j < primeList.Length; ++j)
- {
- int prime = primeList[j];
- int qRem = test % prime;
- if (qRem == 0)
- {
- // We may find small numbers in the list
- return BitLength < 16 && IntValue == prime;
- }
- }
- }
-
-
- // TODO Special case for < 10^16 (RabinMiller fixed list)
-// if (BitLength < 30)
-// {
-// RabinMiller against 2, 3, 5, 7, 11, 13, 23 is sufficient
-// }
-
-
- // TODO Is it worth trying to create a hybrid of these two?
- return RabinMillerTest(certainty, random, randomlySelected);
-// return SolovayStrassenTest(certainty, random);
-
-// bool rbTest = RabinMillerTest(certainty, random);
-// bool ssTest = SolovayStrassenTest(certainty, random);
-//
-// Debug.Assert(rbTest == ssTest);
-//
-// return rbTest;
- }
-
- public bool RabinMillerTest(int certainty, Random random)
- {
- return RabinMillerTest(certainty, random, false);
- }
-
- internal bool RabinMillerTest(int certainty, Random random, bool randomlySelected)
- {
- int bits = BitLength;
-
- Debug.Assert(certainty > 0);
- Debug.Assert(bits > 2);
- Debug.Assert(TestBit(0));
-
- int iterations = ((certainty - 1) / 2) + 1;
- if (randomlySelected)
- {
- int itersFor100Cert = bits >= 1024 ? 4
- : bits >= 512 ? 8
- : bits >= 256 ? 16
- : 50;
-
- if (certainty < 100)
- {
- iterations = System.Math.Min(itersFor100Cert, iterations);
- }
- else
- {
- iterations -= 50;
- iterations += itersFor100Cert;
- }
- }
-
- // let n = 1 + d . 2^s
- BigInteger n = this;
- int s = n.GetLowestSetBitMaskFirst(-1 << 1);
- Debug.Assert(s >= 1);
- BigInteger r = n.ShiftRight(s);
-
- // NOTE: Avoid conversion to/from Montgomery form and check for R/-R as result instead
-
- BigInteger montRadix = One.ShiftLeft(32 * n.magnitude.Length).Remainder(n);
- BigInteger minusMontRadix = n.Subtract(montRadix);
-
- do
- {
- BigInteger a;
- do
- {
- a = new BigInteger(n.BitLength, random);
- }
- while (a.sign == 0 || a.CompareTo(n) >= 0
- || a.IsEqualMagnitude(montRadix) || a.IsEqualMagnitude(minusMontRadix));
-
- BigInteger y = ModPowMonty(a, r, n, false);
-
- if (!y.Equals(montRadix))
- {
- int j = 0;
- while (!y.Equals(minusMontRadix))
- {
- if (++j == s)
- return false;
-
- y = ModPowMonty(y, Two, n, false);
-
- if (y.Equals(montRadix))
- return false;
- }
- }
- }
- while (--iterations > 0);
-
- return true;
- }
-
-// private bool SolovayStrassenTest(
-// int certainty,
-// Random random)
-// {
-// Debug.Assert(certainty > 0);
-// Debug.Assert(CompareTo(Two) > 0);
-// Debug.Assert(TestBit(0));
-//
-// BigInteger n = this;
-// BigInteger nMinusOne = n.Subtract(One);
-// BigInteger e = nMinusOne.ShiftRight(1);
-//
-// do
-// {
-// BigInteger a;
-// do
-// {
-// a = new BigInteger(nBitLength, random);
-// }
-// // NB: Spec says 0 < x < n, but 1 is trivial
-// while (a.CompareTo(One) <= 0 || a.CompareTo(n) >= 0);
-//
-//
-// // TODO Check this is redundant given the way Jacobi() works?
-//// if (!a.Gcd(n).Equals(One))
-//// return false;
-//
-// int x = Jacobi(a, n);
-//
-// if (x == 0)
-// return false;
-//
-// BigInteger check = a.ModPow(e, n);
-//
-// if (x == 1 && !check.Equals(One))
-// return false;
-//
-// if (x == -1 && !check.Equals(nMinusOne))
-// return false;
-//
-// --certainty;
-// }
-// while (certainty > 0);
-//
-// return true;
-// }
-//
-// private static int Jacobi(
-// BigInteger a,
-// BigInteger b)
-// {
-// Debug.Assert(a.sign >= 0);
-// Debug.Assert(b.sign > 0);
-// Debug.Assert(b.TestBit(0));
-// Debug.Assert(a.CompareTo(b) < 0);
-//
-// int totalS = 1;
-// for (;;)
-// {
-// if (a.sign == 0)
-// return 0;
-//
-// if (a.Equals(One))
-// break;
-//
-// int e = a.GetLowestSetBit();
-//
-// int bLsw = b.magnitude[b.magnitude.Length - 1];
-// if ((e & 1) != 0 && ((bLsw & 7) == 3 || (bLsw & 7) == 5))
-// totalS = -totalS;
-//
-// // TODO Confirm this is faster than later a1.Equals(One) test
-// if (a.BitLength == e + 1)
-// break;
-// BigInteger a1 = a.ShiftRight(e);
-//// if (a1.Equals(One))
-//// break;
-//
-// int a1Lsw = a1.magnitude[a1.magnitude.Length - 1];
-// if ((bLsw & 3) == 3 && (a1Lsw & 3) == 3)
-// totalS = -totalS;
-//
-//// a = b.Mod(a1);
-// a = b.Remainder(a1);
-// b = a1;
-// }
-// return totalS;
-// }
-
- public long LongValue
- {
- get
- {
- if (sign == 0)
- return 0;
-
- int n = magnitude.Length;
-
- long v = magnitude[n - 1] & IMASK;
- if (n > 1)
- {
- v |= (magnitude[n - 2] & IMASK) << 32;
- }
-
- return sign < 0 ? -v : v;
- }
- }
-
- public BigInteger Max(
- BigInteger value)
- {
- return CompareTo(value) > 0 ? this : value;
- }
-
- public BigInteger Min(
- BigInteger value)
- {
- return CompareTo(value) < 0 ? this : value;
- }
-
- public BigInteger Mod(
- BigInteger m)
- {
- if (m.sign < 1)
- throw new ArithmeticException("Modulus must be positive");
-
- BigInteger biggie = Remainder(m);
-
- return (biggie.sign >= 0 ? biggie : biggie.Add(m));
- }
-
- public BigInteger ModInverse(
- BigInteger m)
- {
- if (m.sign < 1)
- throw new ArithmeticException("Modulus must be positive");
-
- // TODO Too slow at the moment
-// // "Fast Key Exchange with Elliptic Curve Systems" R.Schoeppel
-// if (m.TestBit(0))
-// {
-// //The Almost Inverse Algorithm
-// int k = 0;
-// BigInteger B = One, C = Zero, F = this, G = m, tmp;
-//
-// for (;;)
-// {
-// // While F is even, do F=F/u, C=C*u, k=k+1.
-// int zeroes = F.GetLowestSetBit();
-// if (zeroes > 0)
-// {
-// F = F.ShiftRight(zeroes);
-// C = C.ShiftLeft(zeroes);
-// k += zeroes;
-// }
-//
-// // If F = 1, then return B,k.
-// if (F.Equals(One))
-// {
-// BigInteger half = m.Add(One).ShiftRight(1);
-// BigInteger halfK = half.ModPow(BigInteger.ValueOf(k), m);
-// return B.Multiply(halfK).Mod(m);
-// }
-//
-// if (F.CompareTo(G) < 0)
-// {
-// tmp = G; G = F; F = tmp;
-// tmp = B; B = C; C = tmp;
-// }
-//
-// F = F.Add(G);
-// B = B.Add(C);
-// }
-// }
-
- if (m.QuickPow2Check())
- {
- return ModInversePow2(m);
- }
-
- BigInteger d = this.Remainder(m);
- BigInteger x;
- BigInteger gcd = ExtEuclid(d, m, out x);
-
- if (!gcd.Equals(One))
- throw new ArithmeticException("Numbers not relatively prime.");
-
- if (x.sign < 0)
- {
- x = x.Add(m);
- }
-
- return x;
- }
-
- private BigInteger ModInversePow2(BigInteger m)
- {
- Debug.Assert(m.SignValue > 0);
- Debug.Assert(m.BitCount == 1);
-
- if (!TestBit(0))
- {
- throw new ArithmeticException("Numbers not relatively prime.");
- }
-
- int pow = m.BitLength - 1;
-
- long inv64 = ModInverse64(LongValue);
- if (pow < 64)
- {
- inv64 &= ((1L << pow) - 1);
- }
-
- BigInteger x = BigInteger.ValueOf(inv64);
-
- if (pow > 64)
- {
- BigInteger d = this.Remainder(m);
- int bitsCorrect = 64;
-
- do
- {
- BigInteger t = x.Multiply(d).Remainder(m);
- x = x.Multiply(Two.Subtract(t)).Remainder(m);
- bitsCorrect <<= 1;
- }
- while (bitsCorrect < pow);
- }
-
- if (x.sign < 0)
- {
- x = x.Add(m);
- }
-
- return x;
- }
-
- private static int ModInverse32(int d)
- {
- // Newton's method with initial estimate "correct to 4 bits"
- Debug.Assert((d & 1) != 0);
- int x = d + (((d + 1) & 4) << 1); // d.x == 1 mod 2**4
- Debug.Assert(((d * x) & 15) == 1);
- x *= 2 - d * x; // d.x == 1 mod 2**8
- x *= 2 - d * x; // d.x == 1 mod 2**16
- x *= 2 - d * x; // d.x == 1 mod 2**32
- Debug.Assert(d * x == 1);
- return x;
- }
-
- private static long ModInverse64(long d)
- {
- // Newton's method with initial estimate "correct to 4 bits"
- Debug.Assert((d & 1L) != 0);
- long x = d + (((d + 1L) & 4L) << 1); // d.x == 1 mod 2**4
- Debug.Assert(((d * x) & 15L) == 1L);
- x *= 2 - d * x; // d.x == 1 mod 2**8
- x *= 2 - d * x; // d.x == 1 mod 2**16
- x *= 2 - d * x; // d.x == 1 mod 2**32
- x *= 2 - d * x; // d.x == 1 mod 2**64
- Debug.Assert(d * x == 1L);
- return x;
- }
-
- /**
- * Calculate the numbers u1, u2, and u3 such that:
- *
- * u1 * a + u2 * b = u3
- *
- * where u3 is the greatest common divider of a and b.
- * a and b using the extended Euclid algorithm (refer p. 323
- * of The Art of Computer Programming vol 2, 2nd ed).
- * This also seems to have the side effect of calculating
- * some form of multiplicative inverse.
- *
- * @param a First number to calculate gcd for
- * @param b Second number to calculate gcd for
- * @param u1Out the return object for the u1 value
- * @return The greatest common divisor of a and b
- */
- private static BigInteger ExtEuclid(BigInteger a, BigInteger b, out BigInteger u1Out)
- {
- BigInteger u1 = One, v1 = Zero;
- BigInteger u3 = a, v3 = b;
-
- if (v3.sign > 0)
- {
- for (;;)
- {
- BigInteger[] q = u3.DivideAndRemainder(v3);
- u3 = v3;
- v3 = q[1];
-
- BigInteger oldU1 = u1;
- u1 = v1;
-
- if (v3.sign <= 0)
- break;
-
- v1 = oldU1.Subtract(v1.Multiply(q[0]));
- }
- }
-
- u1Out = u1;
-
- return u3;
- }
-
- private static void ZeroOut(
- int[] x)
- {
- Array.Clear(x, 0, x.Length);
- }
-
- public BigInteger ModPow(BigInteger e, BigInteger m)
- {
- if (m.sign < 1)
- throw new ArithmeticException("Modulus must be positive");
-
- if (m.Equals(One))
- return Zero;
-
- if (e.sign == 0)
- return One;
-
- if (sign == 0)
- return Zero;
-
- bool negExp = e.sign < 0;
- if (negExp)
- e = e.Negate();
-
- BigInteger result = this.Mod(m);
- if (!e.Equals(One))
- {
- if ((m.magnitude[m.magnitude.Length - 1] & 1) == 0)
- {
- result = ModPowBarrett(result, e, m);
- }
- else
- {
- result = ModPowMonty(result, e, m, true);
- }
- }
-
- if (negExp)
- result = result.ModInverse(m);
-
- return result;
- }
-
- private static BigInteger ModPowBarrett(BigInteger b, BigInteger e, BigInteger m)
- {
- int k = m.magnitude.Length;
- BigInteger mr = One.ShiftLeft((k + 1) << 5);
- BigInteger yu = One.ShiftLeft(k << 6).Divide(m);
-
- // Sliding window from MSW to LSW
- int extraBits = 0, expLength = e.BitLength;
- while (expLength > ExpWindowThresholds[extraBits])
- {
- ++extraBits;
- }
-
- int numPowers = 1 << extraBits;
- BigInteger[] oddPowers = new BigInteger[numPowers];
- oddPowers[0] = b;
-
- BigInteger b2 = ReduceBarrett(b.Square(), m, mr, yu);
-
- for (int i = 1; i < numPowers; ++i)
- {
- oddPowers[i] = ReduceBarrett(oddPowers[i - 1].Multiply(b2), m, mr, yu);
- }
-
- int[] windowList = GetWindowList(e.magnitude, extraBits);
- Debug.Assert(windowList.Length > 0);
-
- int window = windowList[0];
- int mult = window & 0xFF, lastZeroes = window >> 8;
-
- BigInteger y;
- if (mult == 1)
- {
- y = b2;
- --lastZeroes;
- }
- else
- {
- y = oddPowers[mult >> 1];
- }
-
- int windowPos = 1;
- while ((window = windowList[windowPos++]) != -1)
- {
- mult = window & 0xFF;
-
- int bits = lastZeroes + BitLengthTable[mult];
- for (int j = 0; j < bits; ++j)
- {
- y = ReduceBarrett(y.Square(), m, mr, yu);
- }
-
- y = ReduceBarrett(y.Multiply(oddPowers[mult >> 1]), m, mr, yu);
-
- lastZeroes = window >> 8;
- }
-
- for (int i = 0; i < lastZeroes; ++i)
- {
- y = ReduceBarrett(y.Square(), m, mr, yu);
- }
-
- return y;
- }
-
- private static BigInteger ReduceBarrett(BigInteger x, BigInteger m, BigInteger mr, BigInteger yu)
- {
- int xLen = x.BitLength, mLen = m.BitLength;
- if (xLen < mLen)
- return x;
-
- if (xLen - mLen > 1)
- {
- int k = m.magnitude.Length;
-
- BigInteger q1 = x.DivideWords(k - 1);
- BigInteger q2 = q1.Multiply(yu); // TODO Only need partial multiplication here
- BigInteger q3 = q2.DivideWords(k + 1);
-
- BigInteger r1 = x.RemainderWords(k + 1);
- BigInteger r2 = q3.Multiply(m); // TODO Only need partial multiplication here
- BigInteger r3 = r2.RemainderWords(k + 1);
-
- x = r1.Subtract(r3);
- if (x.sign < 0)
- {
- x = x.Add(mr);
- }
- }
-
- while (x.CompareTo(m) >= 0)
- {
- x = x.Subtract(m);
- }
-
- return x;
- }
-
- private static BigInteger ModPowMonty(BigInteger b, BigInteger e, BigInteger m, bool convert)
- {
- int n = m.magnitude.Length;
- int powR = 32 * n;
- bool smallMontyModulus = m.BitLength + 2 <= powR;
- uint mDash = (uint)m.GetMQuote();
-
- // tmp = this * R mod m
- if (convert)
- {
- b = b.ShiftLeft(powR).Remainder(m);
- }
-
- int[] yAccum = new int[n + 1];
-
- int[] zVal = b.magnitude;
- Debug.Assert(zVal.Length <= n);
- if (zVal.Length < n)
- {
- int[] tmp = new int[n];
- zVal.CopyTo(tmp, n - zVal.Length);
- zVal = tmp;
- }
-
- // Sliding window from MSW to LSW
-
- int extraBits = 0;
-
- // Filter the common case of small RSA exponents with few bits set
- if (e.magnitude.Length > 1 || e.BitCount > 2)
- {
- int expLength = e.BitLength;
- while (expLength > ExpWindowThresholds[extraBits])
- {
- ++extraBits;
- }
- }
-
- int numPowers = 1 << extraBits;
- int[][] oddPowers = new int[numPowers][];
- oddPowers[0] = zVal;
-
- int[] zSquared = Arrays.Clone(zVal);
- SquareMonty(yAccum, zSquared, m.magnitude, mDash, smallMontyModulus);
-
- for (int i = 1; i < numPowers; ++i)
- {
- oddPowers[i] = Arrays.Clone(oddPowers[i - 1]);
- MultiplyMonty(yAccum, oddPowers[i], zSquared, m.magnitude, mDash, smallMontyModulus);
- }
-
- int[] windowList = GetWindowList(e.magnitude, extraBits);
- Debug.Assert(windowList.Length > 1);
-
- int window = windowList[0];
- int mult = window & 0xFF, lastZeroes = window >> 8;
-
- int[] yVal;
- if (mult == 1)
- {
- yVal = zSquared;
- --lastZeroes;
- }
- else
- {
- yVal = Arrays.Clone(oddPowers[mult >> 1]);
- }
-
- int windowPos = 1;
- while ((window = windowList[windowPos++]) != -1)
- {
- mult = window & 0xFF;
-
- int bits = lastZeroes + BitLengthTable[mult];
- for (int j = 0; j < bits; ++j)
- {
- SquareMonty(yAccum, yVal, m.magnitude, mDash, smallMontyModulus);
- }
-
- MultiplyMonty(yAccum, yVal, oddPowers[mult >> 1], m.magnitude, mDash, smallMontyModulus);
-
- lastZeroes = window >> 8;
- }
-
- for (int i = 0; i < lastZeroes; ++i)
- {
- SquareMonty(yAccum, yVal, m.magnitude, mDash, smallMontyModulus);
- }
-
- if (convert)
- {
- // Return y * R^(-1) mod m
- MontgomeryReduce(yVal, m.magnitude, mDash);
- }
- else if (smallMontyModulus && CompareTo(0, yVal, 0, m.magnitude) >= 0)
- {
- Subtract(0, yVal, 0, m.magnitude);
- }
-
- return new BigInteger(1, yVal, true);
- }
-
- private static int[] GetWindowList(int[] mag, int extraBits)
- {
- int v = mag[0];
- Debug.Assert(v != 0);
-
- int leadingBits = BitLen(v);
-
- int resultSize = (((mag.Length - 1) << 5) + leadingBits) / (1 + extraBits) + 2;
- int[] result = new int[resultSize];
- int resultPos = 0;
-
- int bitPos = 33 - leadingBits;
- v <<= bitPos;
-
- int mult = 1, multLimit = 1 << extraBits;
- int zeroes = 0;
-
- int i = 0;
- for (; ; )
- {
- for (; bitPos < 32; ++bitPos)
- {
- if (mult < multLimit)
- {
- mult = (mult << 1) | (int)((uint)v >> 31);
- }
- else if (v < 0)
- {
- result[resultPos++] = CreateWindowEntry(mult, zeroes);
- mult = 1;
- zeroes = 0;
- }
- else
- {
- ++zeroes;
- }
-
- v <<= 1;
- }
-
- if (++i == mag.Length)
- {
- result[resultPos++] = CreateWindowEntry(mult, zeroes);
- break;
- }
-
- v = mag[i];
- bitPos = 0;
- }
-
- result[resultPos] = -1;
- return result;
- }
-
- private static int CreateWindowEntry(int mult, int zeroes)
- {
- while ((mult & 1) == 0)
- {
- mult >>= 1;
- ++zeroes;
- }
-
- return mult | (zeroes << 8);
- }
-
- /**
- * return w with w = x * x - w is assumed to have enough space.
- */
- private static int[] Square(
- int[] w,
- int[] x)
- {
- // Note: this method allows w to be only (2 * x.Length - 1) words if result will fit
-// if (w.Length != 2 * x.Length)
-// throw new ArgumentException("no I don't think so...");
-
- ulong c;
-
- int wBase = w.Length - 1;
-
- for (int i = x.Length - 1; i > 0; --i)
- {
- ulong v = (uint)x[i];
-
- c = v * v + (uint)w[wBase];
- w[wBase] = (int)c;
- c >>= 32;
-
- for (int j = i - 1; j >= 0; --j)
- {
- ulong prod = v * (uint)x[j];
-
- c += ((uint)w[--wBase] & UIMASK) + ((uint)prod << 1);
- w[wBase] = (int)c;
- c = (c >> 32) + (prod >> 31);
- }
-
- c += (uint)w[--wBase];
- w[wBase] = (int)c;
-
- if (--wBase >= 0)
- {
- w[wBase] = (int)(c >> 32);
- }
- else
- {
- Debug.Assert((c >> 32) == 0);
- }
-
- wBase += i;
- }
-
- c = (uint)x[0];
-
- c = c * c + (uint)w[wBase];
- w[wBase] = (int)c;
-
- if (--wBase >= 0)
- {
- w[wBase] += (int)(c >> 32);
- }
- else
- {
- Debug.Assert((c >> 32) == 0);
- }
-
- return w;
- }
-
- /**
- * return x with x = y * z - x is assumed to have enough space.
- */
- private static int[] Multiply(int[] x, int[] y, int[] z)
- {
- int i = z.Length;
-
- if (i < 1)
- return x;
-
- int xBase = x.Length - y.Length;
-
- do
- {
- long a = z[--i] & IMASK;
- long val = 0;
-
- if (a != 0)
- {
- for (int j = y.Length - 1; j >= 0; j--)
- {
- val += a * (y[j] & IMASK) + (x[xBase + j] & IMASK);
-
- x[xBase + j] = (int)val;
-
- val = (long)((ulong)val >> 32);
- }
- }
-
- --xBase;
-
- if (xBase >= 0)
- {
- x[xBase] = (int)val;
- }
- else
- {
- Debug.Assert(val == 0);
- }
- }
- while (i > 0);
-
- return x;
- }
-
- /**
- * Calculate mQuote = -m^(-1) mod b with b = 2^32 (32 = word size)
- */
- private int GetMQuote()
- {
- if (mQuote != 0)
- {
- return mQuote; // already calculated
- }
-
- Debug.Assert(this.sign > 0);
-
- int d = -magnitude[magnitude.Length - 1];
-
- Debug.Assert((d & 1) != 0);
-
- return mQuote = ModInverse32(d);
- }
-
- private static void MontgomeryReduce(int[] x, int[] m, uint mDash) // mDash = -m^(-1) mod b
- {
- // NOTE: Not a general purpose reduction (which would allow x up to twice the bitlength of m)
- Debug.Assert(x.Length == m.Length);
-
- int n = m.Length;
-
- for (int i = n - 1; i >= 0; --i)
- {
- uint x0 = (uint)x[n - 1];
- ulong t = x0 * mDash;
-
- ulong carry = t * (uint)m[n - 1] + x0;
- Debug.Assert((uint)carry == 0);
- carry >>= 32;
-
- for (int j = n - 2; j >= 0; --j)
- {
- carry += t * (uint)m[j] + (uint)x[j];
- x[j + 1] = (int)carry;
- carry >>= 32;
- }
-
- x[0] = (int)carry;
- Debug.Assert(carry >> 32 == 0);
- }
-
- if (CompareTo(0, x, 0, m) >= 0)
- {
- Subtract(0, x, 0, m);
- }
- }
-
- /**
- * Montgomery multiplication: a = x * y * R^(-1) mod m
- *
- * Based algorithm 14.36 of Handbook of Applied Cryptography.
- *
- * m, x, y should have length n
- * a should have length (n + 1)
- * b = 2^32, R = b^n
- *
- * The result is put in x
- *
- * NOTE: the indices of x, y, m, a different in HAC and in Java
- */
- private static void MultiplyMonty(int[] a, int[] x, int[] y, int[] m, uint mDash, bool smallMontyModulus)
- // mDash = -m^(-1) mod b
- {
- int n = m.Length;
-
- if (n == 1)
- {
- x[0] = (int)MultiplyMontyNIsOne((uint)x[0], (uint)y[0], (uint)m[0], mDash);
- return;
- }
-
- uint y0 = (uint)y[n - 1];
- int aMax;
-
- {
- ulong xi = (uint)x[n - 1];
-
- ulong carry = xi * y0;
- ulong t = (uint)carry * mDash;
-
- ulong prod2 = t * (uint)m[n - 1];
- carry += (uint)prod2;
- Debug.Assert((uint)carry == 0);
- carry = (carry >> 32) + (prod2 >> 32);
-
- for (int j = n - 2; j >= 0; --j)
- {
- ulong prod1 = xi * (uint)y[j];
- prod2 = t * (uint)m[j];
-
- carry += (prod1 & UIMASK) + (uint)prod2;
- a[j + 2] = (int)carry;
- carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32);
- }
-
- a[1] = (int)carry;
- aMax = (int)(carry >> 32);
- }
-
- for (int i = n - 2; i >= 0; --i)
- {
- uint a0 = (uint)a[n];
- ulong xi = (uint)x[i];
-
- ulong prod1 = xi * y0;
- ulong carry = (prod1 & UIMASK) + a0;
- ulong t = (uint)carry * mDash;
-
- ulong prod2 = t * (uint)m[n - 1];
- carry += (uint)prod2;
- Debug.Assert((uint)carry == 0);
- carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32);
-
- for (int j = n - 2; j >= 0; --j)
- {
- prod1 = xi * (uint)y[j];
- prod2 = t * (uint)m[j];
-
- carry += (prod1 & UIMASK) + (uint)prod2 + (uint)a[j + 1];
- a[j + 2] = (int)carry;
- carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32);
- }
-
- carry += (uint)aMax;
- a[1] = (int)carry;
- aMax = (int)(carry >> 32);
- }
-
- a[0] = aMax;
-
- if (!smallMontyModulus && CompareTo(0, a, 0, m) >= 0)
- {
- Subtract(0, a, 0, m);
- }
-
- Array.Copy(a, 1, x, 0, n);
- }
-
- private static void SquareMonty(int[] a, int[] x, int[] m, uint mDash, bool smallMontyModulus)
- // mDash = -m^(-1) mod b
- {
- int n = m.Length;
-
- if (n == 1)
- {
- uint xVal = (uint)x[0];
- x[0] = (int)MultiplyMontyNIsOne(xVal, xVal, (uint)m[0], mDash);
- return;
- }
-
- ulong x0 = (uint)x[n - 1];
- int aMax;
-
- {
- ulong carry = x0 * x0;
- ulong t = (uint)carry * mDash;
-
- ulong prod2 = t * (uint)m[n - 1];
- carry += (uint)prod2;
- Debug.Assert((uint)carry == 0);
- carry = (carry >> 32) + (prod2 >> 32);
-
- for (int j = n - 2; j >= 0; --j)
- {
- ulong prod1 = x0 * (uint)x[j];
- prod2 = t * (uint)m[j];
-
- carry += (prod2 & UIMASK) + ((uint)prod1 << 1);
- a[j + 2] = (int)carry;
- carry = (carry >> 32) + (prod1 >> 31) + (prod2 >> 32);
- }
-
- a[1] = (int)carry;
- aMax = (int)(carry >> 32);
- }
-
- for (int i = n - 2; i >= 0; --i)
- {
- uint a0 = (uint)a[n];
- ulong t = a0 * mDash;
-
- ulong carry = t * (uint)m[n - 1] + a0;
- Debug.Assert((uint)carry == 0);
- carry >>= 32;
-
- for (int j = n - 2; j > i; --j)
- {
- carry += t * (uint)m[j] + (uint)a[j + 1];
- a[j + 2] = (int)carry;
- carry >>= 32;
- }
-
- ulong xi = (uint)x[i];
-
- {
- ulong prod1 = xi * xi;
- ulong prod2 = t * (uint)m[i];
-
- carry += (prod1 & UIMASK) + (uint)prod2 + (uint)a[i + 1];
- a[i + 2] = (int)carry;
- carry = (carry >> 32) + (prod1 >> 32) + (prod2 >> 32);
- }
-
- for (int j = i - 1; j >= 0; --j)
- {
- ulong prod1 = xi * (uint)x[j];
- ulong prod2 = t * (uint)m[j];
-
- carry += (prod2 & UIMASK) + ((uint)prod1 << 1) + (uint)a[j + 1];
- a[j + 2] = (int)carry;
- carry = (carry >> 32) + (prod1 >> 31) + (prod2 >> 32);
- }
-
- carry += (uint)aMax;
- a[1] = (int)carry;
- aMax = (int)(carry >> 32);
- }
-
- a[0] = aMax;
-
- if (!smallMontyModulus && CompareTo(0, a, 0, m) >= 0)
- {
- Subtract(0, a, 0, m);
- }
-
- Array.Copy(a, 1, x, 0, n);
- }
-
- private static uint MultiplyMontyNIsOne(uint x, uint y, uint m, uint mDash)
- {
- ulong carry = (ulong)x * y;
- uint t = (uint)carry * mDash;
- ulong um = m;
- ulong prod2 = um * t;
- carry += (uint)prod2;
- Debug.Assert((uint)carry == 0);
- carry = (carry >> 32) + (prod2 >> 32);
- if (carry > um)
- {
- carry -= um;
- }
- Debug.Assert(carry < um);
- return (uint)carry;
- }
-
- public BigInteger Multiply(
- BigInteger val)
- {
- if (val == this)
- return Square();
-
- if ((sign & val.sign) == 0)
- return Zero;
-
- if (val.QuickPow2Check()) // val is power of two
- {
- BigInteger result = this.ShiftLeft(val.Abs().BitLength - 1);
- return val.sign > 0 ? result : result.Negate();
- }
-
- if (this.QuickPow2Check()) // this is power of two
- {
- BigInteger result = val.ShiftLeft(this.Abs().BitLength - 1);
- return this.sign > 0 ? result : result.Negate();
- }
-
- int resLength = magnitude.Length + val.magnitude.Length;
- int[] res = new int[resLength];
-
- Multiply(res, this.magnitude, val.magnitude);
-
- int resSign = sign ^ val.sign ^ 1;
- return new BigInteger(resSign, res, true);
- }
-
- public BigInteger Square()
- {
- if (sign == 0)
- return Zero;
- if (this.QuickPow2Check())
- return ShiftLeft(Abs().BitLength - 1);
- int resLength = magnitude.Length << 1;
- if ((uint)magnitude[0] >> 16 == 0)
- --resLength;
- int[] res = new int[resLength];
- Square(res, magnitude);
- return new BigInteger(1, res, false);
- }
-
- public BigInteger Negate()
- {
- if (sign == 0)
- return this;
-
- return new BigInteger(-sign, magnitude, false);
- }
-
- public BigInteger NextProbablePrime()
- {
- if (sign < 0)
- throw new ArithmeticException("Cannot be called on value < 0");
-
- if (CompareTo(Two) < 0)
- return Two;
-
- BigInteger n = Inc().SetBit(0);
-
- while (!n.CheckProbablePrime(100, RandomSource, false))
- {
- n = n.Add(Two);
- }
-
- return n;
- }
-
- public BigInteger Not()
- {
- return Inc().Negate();
- }
-
- public BigInteger Pow(int exp)
- {
- if (exp <= 0)
- {
- if (exp < 0)
- throw new ArithmeticException("Negative exponent");
-
- return One;
- }
-
- if (sign == 0)
- {
- return this;
- }
-
- if (QuickPow2Check())
- {
- long powOf2 = (long)exp * (BitLength - 1);
- if (powOf2 > Int32.MaxValue)
- {
- throw new ArithmeticException("Result too large");
- }
- return One.ShiftLeft((int)powOf2);
- }
-
- BigInteger y = One;
- BigInteger z = this;
-
- for (;;)
- {
- if ((exp & 0x1) == 1)
- {
- y = y.Multiply(z);
- }
- exp >>= 1;
- if (exp == 0) break;
- z = z.Multiply(z);
- }
-
- return y;
- }
-
- public static BigInteger ProbablePrime(
- int bitLength,
- Random random)
- {
- return new BigInteger(bitLength, 100, random);
- }
-
- private int Remainder(
- int m)
- {
- Debug.Assert(m > 0);
-
- long acc = 0;
- for (int pos = 0; pos < magnitude.Length; ++pos)
- {
- long posVal = (uint) magnitude[pos];
- acc = (acc << 32 | posVal) % m;
- }
-
- return (int) acc;
- }
-
- /**
- * return x = x % y - done in place (y value preserved)
- */
- private static int[] Remainder(
- int[] x,
- int[] y)
- {
- int xStart = 0;
- while (xStart < x.Length && x[xStart] == 0)
- {
- ++xStart;
- }
-
- int yStart = 0;
- while (yStart < y.Length && y[yStart] == 0)
- {
- ++yStart;
- }
-
- Debug.Assert(yStart < y.Length);
-
- int xyCmp = CompareNoLeadingZeroes(xStart, x, yStart, y);
-
- if (xyCmp > 0)
- {
- int yBitLength = CalcBitLength(1, yStart, y);
- int xBitLength = CalcBitLength(1, xStart, x);
- int shift = xBitLength - yBitLength;
-
- int[] c;
- int cStart = 0;
- int cBitLength = yBitLength;
- if (shift > 0)
- {
- c = ShiftLeft(y, shift);
- cBitLength += shift;
- Debug.Assert(c[0] != 0);
- }
- else
- {
- int len = y.Length - yStart;
- c = new int[len];
- Array.Copy(y, yStart, c, 0, len);
- }
-
- for (;;)
- {
- if (cBitLength < xBitLength
- || CompareNoLeadingZeroes(xStart, x, cStart, c) >= 0)
- {
- Subtract(xStart, x, cStart, c);
-
- while (x[xStart] == 0)
- {
- if (++xStart == x.Length)
- return x;
- }
-
- //xBitLength = CalcBitLength(xStart, x);
- xBitLength = 32 * (x.Length - xStart - 1) + BitLen(x[xStart]);
-
- if (xBitLength <= yBitLength)
- {
- if (xBitLength < yBitLength)
- return x;
-
- xyCmp = CompareNoLeadingZeroes(xStart, x, yStart, y);
-
- if (xyCmp <= 0)
- break;
- }
- }
-
- shift = cBitLength - xBitLength;
-
- // NB: The case where c[cStart] is 1-bit is harmless
- if (shift == 1)
- {
- uint firstC = (uint) c[cStart] >> 1;
- uint firstX = (uint) x[xStart];
- if (firstC > firstX)
- ++shift;
- }
-
- if (shift < 2)
- {
- ShiftRightOneInPlace(cStart, c);
- --cBitLength;
- }
- else
- {
- ShiftRightInPlace(cStart, c, shift);
- cBitLength -= shift;
- }
-
- //cStart = c.Length - ((cBitLength + 31) / 32);
- while (c[cStart] == 0)
- {
- ++cStart;
- }
- }
- }
-
- if (xyCmp == 0)
- {
- Array.Clear(x, xStart, x.Length - xStart);
- }
-
- return x;
- }
-
- public BigInteger Remainder(
- BigInteger n)
- {
- if (n.sign == 0)
- throw new ArithmeticException("Division by zero error");
-
- if (this.sign == 0)
- return Zero;
-
- // For small values, use fast remainder method
- if (n.magnitude.Length == 1)
- {
- int val = n.magnitude[0];
-
- if (val > 0)
- {
- if (val == 1)
- return Zero;
-
- // TODO Make this func work on uint, and handle val == 1?
- int rem = Remainder(val);
-
- return rem == 0
- ? Zero
- : new BigInteger(sign, new int[]{ rem }, false);
- }
- }
-
- if (CompareNoLeadingZeroes(0, magnitude, 0, n.magnitude) < 0)
- return this;
-
- int[] result;
- if (n.QuickPow2Check()) // n is power of two
- {
- // TODO Move before small values branch above?
- result = LastNBits(n.Abs().BitLength - 1);
- }
- else
- {
- result = (int[]) this.magnitude.Clone();
- result = Remainder(result, n.magnitude);
- }
-
- return new BigInteger(sign, result, true);
- }
-
- private int[] LastNBits(
- int n)
- {
- if (n < 1)
- return ZeroMagnitude;
-
- int numWords = (n + BitsPerInt - 1) / BitsPerInt;
- numWords = System.Math.Min(numWords, this.magnitude.Length);
- int[] result = new int[numWords];
-
- Array.Copy(this.magnitude, this.magnitude.Length - numWords, result, 0, numWords);
-
- int excessBits = (numWords << 5) - n;
- if (excessBits > 0)
- {
- result[0] &= (int)(UInt32.MaxValue >> excessBits);
- }
-
- return result;
- }
-
- private BigInteger DivideWords(int w)
- {
- Debug.Assert(w >= 0);
- int n = magnitude.Length;
- if (w >= n)
- return Zero;
- int[] mag = new int[n - w];
- Array.Copy(magnitude, 0, mag, 0, n - w);
- return new BigInteger(sign, mag, false);
- }
-
- private BigInteger RemainderWords(int w)
- {
- Debug.Assert(w >= 0);
- int n = magnitude.Length;
- if (w >= n)
- return this;
- int[] mag = new int[w];
- Array.Copy(magnitude, n - w, mag, 0, w);
- return new BigInteger(sign, mag, false);
- }
-
- /**
- * do a left shift - this returns a new array.
- */
- private static int[] ShiftLeft(
- int[] mag,
- int n)
- {
- int nInts = (int)((uint)n >> 5);
- int nBits = n & 0x1f;
- int magLen = mag.Length;
- int[] newMag;
-
- if (nBits == 0)
- {
- newMag = new int[magLen + nInts];
- mag.CopyTo(newMag, 0);
- }
- else
- {
- int i = 0;
- int nBits2 = 32 - nBits;
- int highBits = (int)((uint)mag[0] >> nBits2);
-
- if (highBits != 0)
- {
- newMag = new int[magLen + nInts + 1];
- newMag[i++] = highBits;
- }
- else
- {
- newMag = new int[magLen + nInts];
- }
-
- int m = mag[0];
- for (int j = 0; j < magLen - 1; j++)
- {
- int next = mag[j + 1];
-
- newMag[i++] = (m << nBits) | (int)((uint)next >> nBits2);
- m = next;
- }
-
- newMag[i] = mag[magLen - 1] << nBits;
- }
-
- return newMag;
- }
-
- private static int ShiftLeftOneInPlace(int[] x, int carry)
- {
- Debug.Assert(carry == 0 || carry == 1);
- int pos = x.Length;
- while (--pos >= 0)
- {
- uint val = (uint)x[pos];
- x[pos] = (int)(val << 1) | carry;
- carry = (int)(val >> 31);
- }
- return carry;
- }
-
- public BigInteger ShiftLeft(
- int n)
- {
- if (sign == 0 || magnitude.Length == 0)
- return Zero;
-
- if (n == 0)
- return this;
-
- if (n < 0)
- return ShiftRight(-n);
-
- BigInteger result = new BigInteger(sign, ShiftLeft(magnitude, n), true);
-
- if (this.nBits != -1)
- {
- result.nBits = sign > 0
- ? this.nBits
- : this.nBits + n;
- }
-
- if (this.nBitLength != -1)
- {
- result.nBitLength = this.nBitLength + n;
- }
-
- return result;
- }
-
- /**
- * do a right shift - this does it in place.
- */
- private static void ShiftRightInPlace(
- int start,
- int[] mag,
- int n)
- {
- int nInts = (int)((uint)n >> 5) + start;
- int nBits = n & 0x1f;
- int magEnd = mag.Length - 1;
-
- if (nInts != start)
- {
- int delta = (nInts - start);
-
- for (int i = magEnd; i >= nInts; i--)
- {
- mag[i] = mag[i - delta];
- }
- for (int i = nInts - 1; i >= start; i--)
- {
- mag[i] = 0;
- }
- }
-
- if (nBits != 0)
- {
- int nBits2 = 32 - nBits;
- int m = mag[magEnd];
-
- for (int i = magEnd; i > nInts; --i)
- {
- int next = mag[i - 1];
-
- mag[i] = (int)((uint)m >> nBits) | (next << nBits2);
- m = next;
- }
-
- mag[nInts] = (int)((uint)mag[nInts] >> nBits);
- }
- }
-
- /**
- * do a right shift by one - this does it in place.
- */
- private static void ShiftRightOneInPlace(
- int start,
- int[] mag)
- {
- int i = mag.Length;
- int m = mag[i - 1];
-
- while (--i > start)
- {
- int next = mag[i - 1];
- mag[i] = ((int)((uint)m >> 1)) | (next << 31);
- m = next;
- }
-
- mag[start] = (int)((uint)mag[start] >> 1);
- }
-
- public BigInteger ShiftRight(
- int n)
- {
- if (n == 0)
- return this;
-
- if (n < 0)
- return ShiftLeft(-n);
-
- if (n >= BitLength)
- return (this.sign < 0 ? One.Negate() : Zero);
-
-// int[] res = (int[]) this.magnitude.Clone();
-//
-// ShiftRightInPlace(0, res, n);
-//
-// return new BigInteger(this.sign, res, true);
-
- int resultLength = (BitLength - n + 31) >> 5;
- int[] res = new int[resultLength];
-
- int numInts = n >> 5;
- int numBits = n & 31;
-
- if (numBits == 0)
- {
- Array.Copy(this.magnitude, 0, res, 0, res.Length);
- }
- else
- {
- int numBits2 = 32 - numBits;
-
- int magPos = this.magnitude.Length - 1 - numInts;
- for (int i = resultLength - 1; i >= 0; --i)
- {
- res[i] = (int)((uint) this.magnitude[magPos--] >> numBits);
-
- if (magPos >= 0)
- {
- res[i] |= this.magnitude[magPos] << numBits2;
- }
- }
- }
-
- Debug.Assert(res[0] != 0);
-
- return new BigInteger(this.sign, res, false);
- }
-
- public int SignValue
- {
- get { return sign; }
- }
-
- /**
- * returns x = x - y - we assume x is >= y
- */
- private static int[] Subtract(
- int xStart,
- int[] x,
- int yStart,
- int[] y)
- {
- Debug.Assert(yStart < y.Length);
- Debug.Assert(x.Length - xStart >= y.Length - yStart);
-
- int iT = x.Length;
- int iV = y.Length;
- long m;
- int borrow = 0;
-
- do
- {
- m = (x[--iT] & IMASK) - (y[--iV] & IMASK) + borrow;
- x[iT] = (int) m;
-
-// borrow = (m < 0) ? -1 : 0;
- borrow = (int)(m >> 63);
- }
- while (iV > yStart);
-
- if (borrow != 0)
- {
- while (--x[--iT] == -1)
- {
- }
- }
-
- return x;
- }
-
- public BigInteger Subtract(
- BigInteger n)
- {
- if (n.sign == 0)
- return this;
-
- if (this.sign == 0)
- return n.Negate();
-
- if (this.sign != n.sign)
- return Add(n.Negate());
-
- int compare = CompareNoLeadingZeroes(0, magnitude, 0, n.magnitude);
- if (compare == 0)
- return Zero;
-
- BigInteger bigun, lilun;
- if (compare < 0)
- {
- bigun = n;
- lilun = this;
- }
- else
- {
- bigun = this;
- lilun = n;
- }
-
- return new BigInteger(this.sign * compare, doSubBigLil(bigun.magnitude, lilun.magnitude), true);
- }
-
- private static int[] doSubBigLil(
- int[] bigMag,
- int[] lilMag)
- {
- int[] res = (int[]) bigMag.Clone();
-
- return Subtract(0, res, 0, lilMag);
- }
-
- public byte[] ToByteArray()
- {
- return ToByteArray(false);
- }
-
- public byte[] ToByteArrayUnsigned()
- {
- return ToByteArray(true);
- }
-
- private byte[] ToByteArray(
- bool unsigned)
- {
- if (sign == 0)
- return unsigned ? ZeroEncoding : new byte[1];
-
- int nBits = (unsigned && sign > 0)
- ? BitLength
- : BitLength + 1;
-
- int nBytes = GetByteLength(nBits);
- byte[] bytes = new byte[nBytes];
-
- int magIndex = magnitude.Length;
- int bytesIndex = bytes.Length;
-
- if (sign > 0)
- {
- while (magIndex > 1)
- {
- uint mag = (uint) magnitude[--magIndex];
- bytes[--bytesIndex] = (byte) mag;
- bytes[--bytesIndex] = (byte)(mag >> 8);
- bytes[--bytesIndex] = (byte)(mag >> 16);
- bytes[--bytesIndex] = (byte)(mag >> 24);
- }
-
- uint lastMag = (uint) magnitude[0];
- while (lastMag > byte.MaxValue)
- {
- bytes[--bytesIndex] = (byte) lastMag;
- lastMag >>= 8;
- }
-
- bytes[--bytesIndex] = (byte) lastMag;
- }
- else // sign < 0
- {
- bool carry = true;
-
- while (magIndex > 1)
- {
- uint mag = ~((uint) magnitude[--magIndex]);
-
- if (carry)
- {
- carry = (++mag == uint.MinValue);
- }
-
- bytes[--bytesIndex] = (byte) mag;
- bytes[--bytesIndex] = (byte)(mag >> 8);
- bytes[--bytesIndex] = (byte)(mag >> 16);
- bytes[--bytesIndex] = (byte)(mag >> 24);
- }
-
- uint lastMag = (uint) magnitude[0];
-
- if (carry)
- {
- // Never wraps because magnitude[0] != 0
- --lastMag;
- }
-
- while (lastMag > byte.MaxValue)
- {
- bytes[--bytesIndex] = (byte) ~lastMag;
- lastMag >>= 8;
- }
-
- bytes[--bytesIndex] = (byte) ~lastMag;
-
- if (bytesIndex > 0)
- {
- bytes[--bytesIndex] = byte.MaxValue;
- }
- }
-
- return bytes;
- }
-
- public override string ToString()
- {
- return ToString(10);
- }
-
- public string ToString(int radix)
- {
- // TODO Make this method work for other radices (ideally 2 <= radix <= 36 as in Java)
-
- switch (radix)
- {
- case 2:
- case 8:
- case 10:
- case 16:
- break;
- default:
- throw new FormatException("Only bases 2, 8, 10, 16 are allowed");
- }
-
- // NB: Can only happen to internally managed instances
- if (magnitude == null)
- return "null";
-
- if (sign == 0)
- return "0";
-
-
- // NOTE: This *should* be unnecessary, since the magnitude *should* never have leading zero digits
- int firstNonZero = 0;
- while (firstNonZero < magnitude.Length)
- {
- if (magnitude[firstNonZero] != 0)
- {
- break;
- }
- ++firstNonZero;
- }
-
- if (firstNonZero == magnitude.Length)
- {
- return "0";
- }
-
-
- StringBuilder sb = new StringBuilder();
- if (sign == -1)
- {
- sb.Append('-');
- }
-
- switch (radix)
- {
- case 2:
- {
- int pos = firstNonZero;
- sb.Append(Convert.ToString(magnitude[pos], 2));
- while (++pos < magnitude.Length)
- {
- AppendZeroExtendedString(sb, Convert.ToString(magnitude[pos], 2), 32);
- }
- break;
- }
- case 8:
- {
- int mask = (1 << 30) - 1;
- BigInteger u = this.Abs();
- int bits = u.BitLength;
- IList S = Platform.CreateArrayList();
- while (bits > 30)
- {
- S.Add(Convert.ToString(u.IntValue & mask, 8));
- u = u.ShiftRight(30);
- bits -= 30;
- }
- sb.Append(Convert.ToString(u.IntValue, 8));
- for (int i = S.Count - 1; i >= 0; --i)
- {
- AppendZeroExtendedString(sb, (string)S[i], 10);
- }
- break;
- }
- case 16:
- {
- int pos = firstNonZero;
- sb.Append(Convert.ToString(magnitude[pos], 16));
- while (++pos < magnitude.Length)
- {
- AppendZeroExtendedString(sb, Convert.ToString(magnitude[pos], 16), 8);
- }
- break;
- }
- // TODO This could work for other radices if there is an alternative to Convert.ToString method
- //default:
- case 10:
- {
- BigInteger q = this.Abs();
- if (q.BitLength < 64)
- {
- sb.Append(Convert.ToString(q.LongValue, radix));
- break;
- }
-
- // Based on algorithm 1a from chapter 4.4 in Seminumerical Algorithms (Knuth)
-
- // Work out the largest power of 'rdx' that is a positive 64-bit integer
- // TODO possibly cache power/exponent against radix?
- long limit = Int64.MaxValue / radix;
- long power = radix;
- int exponent = 1;
- while (power <= limit)
- {
- power *= radix;
- ++exponent;
- }
-
- BigInteger bigPower = BigInteger.ValueOf(power);
-
- IList S = Platform.CreateArrayList();
- while (q.CompareTo(bigPower) >= 0)
- {
- BigInteger[] qr = q.DivideAndRemainder(bigPower);
- S.Add(Convert.ToString(qr[1].LongValue, radix));
- q = qr[0];
- }
-
- sb.Append(Convert.ToString(q.LongValue, radix));
- for (int i = S.Count - 1; i >= 0; --i)
- {
- AppendZeroExtendedString(sb, (string)S[i], exponent);
- }
- break;
- }
- }
-
- return sb.ToString();
- }
-
- private static void AppendZeroExtendedString(StringBuilder sb, string s, int minLength)
- {
- for (int len = s.Length; len < minLength; ++len)
- {
- sb.Append('0');
- }
- sb.Append(s);
- }
-
- private static BigInteger CreateUValueOf(
- ulong value)
- {
- int msw = (int)(value >> 32);
- int lsw = (int)value;
-
- if (msw != 0)
- return new BigInteger(1, new int[] { msw, lsw }, false);
-
- if (lsw != 0)
- {
- BigInteger n = new BigInteger(1, new int[] { lsw }, false);
- // Check for a power of two
- if ((lsw & -lsw) == lsw)
- {
- n.nBits = 1;
- }
- return n;
- }
-
- return Zero;
- }
-
- private static BigInteger CreateValueOf(
- long value)
- {
- if (value < 0)
- {
- if (value == long.MinValue)
- return CreateValueOf(~value).Not();
-
- return CreateValueOf(-value).Negate();
- }
-
- return CreateUValueOf((ulong)value);
- }
-
- public static BigInteger ValueOf(
- long value)
- {
- if (value >= 0 && value < SMALL_CONSTANTS.Length)
- {
- return SMALL_CONSTANTS[value];
- }
-
- return CreateValueOf(value);
- }
-
- public int GetLowestSetBit()
- {
- if (this.sign == 0)
- return -1;
-
- return GetLowestSetBitMaskFirst(-1);
- }
-
- private int GetLowestSetBitMaskFirst(int firstWordMask)
- {
- int w = magnitude.Length, offset = 0;
-
- uint word = (uint)(magnitude[--w] & firstWordMask);
- Debug.Assert(magnitude[0] != 0);
-
- while (word == 0)
- {
- word = (uint)magnitude[--w];
- offset += 32;
- }
-
- while ((word & 0xFF) == 0)
- {
- word >>= 8;
- offset += 8;
- }
-
- while ((word & 1) == 0)
- {
- word >>= 1;
- ++offset;
- }
-
- return offset;
- }
-
- public bool TestBit(
- int n)
- {
- if (n < 0)
- throw new ArithmeticException("Bit position must not be negative");
-
- if (sign < 0)
- return !Not().TestBit(n);
-
- int wordNum = n / 32;
- if (wordNum >= magnitude.Length)
- return false;
-
- int word = magnitude[magnitude.Length - 1 - wordNum];
- return ((word >> (n % 32)) & 1) > 0;
- }
-
- public BigInteger Or(
- BigInteger value)
- {
- if (this.sign == 0)
- return value;
-
- if (value.sign == 0)
- return this;
-
- int[] aMag = this.sign > 0
- ? this.magnitude
- : Add(One).magnitude;
-
- int[] bMag = value.sign > 0
- ? value.magnitude
- : value.Add(One).magnitude;
-
- bool resultNeg = sign < 0 || value.sign < 0;
- int resultLength = System.Math.Max(aMag.Length, bMag.Length);
- int[] resultMag = new int[resultLength];
-
- int aStart = resultMag.Length - aMag.Length;
- int bStart = resultMag.Length - bMag.Length;
-
- for (int i = 0; i < resultMag.Length; ++i)
- {
- int aWord = i >= aStart ? aMag[i - aStart] : 0;
- int bWord = i >= bStart ? bMag[i - bStart] : 0;
-
- if (this.sign < 0)
- {
- aWord = ~aWord;
- }
-
- if (value.sign < 0)
- {
- bWord = ~bWord;
- }
-
- resultMag[i] = aWord | bWord;
-
- if (resultNeg)
- {
- resultMag[i] = ~resultMag[i];
- }
- }
-
- BigInteger result = new BigInteger(1, resultMag, true);
-
- // TODO Optimise this case
- if (resultNeg)
- {
- result = result.Not();
- }
-
- return result;
- }
-
- public BigInteger Xor(
- BigInteger value)
- {
- if (this.sign == 0)
- return value;
-
- if (value.sign == 0)
- return this;
-
- int[] aMag = this.sign > 0
- ? this.magnitude
- : Add(One).magnitude;
-
- int[] bMag = value.sign > 0
- ? value.magnitude
- : value.Add(One).magnitude;
-
- // TODO Can just replace with sign != value.sign?
- bool resultNeg = (sign < 0 && value.sign >= 0) || (sign >= 0 && value.sign < 0);
- int resultLength = System.Math.Max(aMag.Length, bMag.Length);
- int[] resultMag = new int[resultLength];
-
- int aStart = resultMag.Length - aMag.Length;
- int bStart = resultMag.Length - bMag.Length;
-
- for (int i = 0; i < resultMag.Length; ++i)
- {
- int aWord = i >= aStart ? aMag[i - aStart] : 0;
- int bWord = i >= bStart ? bMag[i - bStart] : 0;
-
- if (this.sign < 0)
- {
- aWord = ~aWord;
- }
-
- if (value.sign < 0)
- {
- bWord = ~bWord;
- }
-
- resultMag[i] = aWord ^ bWord;
-
- if (resultNeg)
- {
- resultMag[i] = ~resultMag[i];
- }
- }
-
- BigInteger result = new BigInteger(1, resultMag, true);
-
- // TODO Optimise this case
- if (resultNeg)
- {
- result = result.Not();
- }
-
- return result;
- }
-
- public BigInteger SetBit(
- int n)
- {
- if (n < 0)
- throw new ArithmeticException("Bit address less than zero");
-
- if (TestBit(n))
- return this;
-
- // TODO Handle negative values and zero
- if (sign > 0 && n < (BitLength - 1))
- return FlipExistingBit(n);
-
- return Or(One.ShiftLeft(n));
- }
-
- public BigInteger ClearBit(
- int n)
- {
- if (n < 0)
- throw new ArithmeticException("Bit address less than zero");
-
- if (!TestBit(n))
- return this;
-
- // TODO Handle negative values
- if (sign > 0 && n < (BitLength - 1))
- return FlipExistingBit(n);
-
- return AndNot(One.ShiftLeft(n));
- }
-
- public BigInteger FlipBit(
- int n)
- {
- if (n < 0)
- throw new ArithmeticException("Bit address less than zero");
-
- // TODO Handle negative values and zero
- if (sign > 0 && n < (BitLength - 1))
- return FlipExistingBit(n);
-
- return Xor(One.ShiftLeft(n));
- }
-
- private BigInteger FlipExistingBit(
- int n)
- {
- Debug.Assert(sign > 0);
- Debug.Assert(n >= 0);
- Debug.Assert(n < BitLength - 1);
-
- int[] mag = (int[]) this.magnitude.Clone();
- mag[mag.Length - 1 - (n >> 5)] ^= (1 << (n & 31)); // Flip bit
- //mag[mag.Length - 1 - (n / 32)] ^= (1 << (n % 32));
- return new BigInteger(this.sign, mag, false);
- }
- }
-}
diff --git a/BCCrypto/src/math/Primes.cs b/BCCrypto/src/math/Primes.cs
deleted file mode 100644
index fb279f1..0000000
--- a/BCCrypto/src/math/Primes.cs
+++ /dev/null
@@ -1,629 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math
-{
- /**
- * Utility methods for generating primes and testing for primality.
- */
- public abstract class Primes
- {
- public static readonly int SmallFactorLimit = 211;
-
- private static readonly BigInteger One = BigInteger.One;
- private static readonly BigInteger Two = BigInteger.Two;
- private static readonly BigInteger Three = BigInteger.Three;
-
- /**
- * Used to return the output from the
- * {@linkplain Primes#enhancedMRProbablePrimeTest(BigInteger, SecureRandom, int) Enhanced
- * Miller-Rabin Probabilistic Primality Test}
- */
- public class MROutput
- {
- internal static MROutput ProbablyPrime()
- {
- return new MROutput(false, null);
- }
-
- internal static MROutput ProvablyCompositeWithFactor(BigInteger factor)
- {
- return new MROutput(true, factor);
- }
-
- internal static MROutput ProvablyCompositeNotPrimePower()
- {
- return new MROutput(true, null);
- }
-
- private readonly bool mProvablyComposite;
- private readonly BigInteger mFactor;
-
- private MROutput(bool provablyComposite, BigInteger factor)
- {
- this.mProvablyComposite = provablyComposite;
- this.mFactor = factor;
- }
-
- public BigInteger Factor
- {
- get { return mFactor; }
- }
-
- public bool IsProvablyComposite
- {
- get { return mProvablyComposite; }
- }
-
- public bool IsNotPrimePower
- {
- get { return mProvablyComposite && mFactor == null; }
- }
- }
-
- /**
- * Used to return the output from the {@linkplain Primes#generateSTRandomPrime(Digest, int, byte[]) Shawe-Taylor Random_Prime Routine}
- */
- public class STOutput
- {
- private readonly BigInteger mPrime;
- private readonly byte[] mPrimeSeed;
- private readonly int mPrimeGenCounter;
-
- internal STOutput(BigInteger prime, byte[] primeSeed, int primeGenCounter)
- {
- this.mPrime = prime;
- this.mPrimeSeed = primeSeed;
- this.mPrimeGenCounter = primeGenCounter;
- }
-
- public BigInteger Prime
- {
- get { return mPrime; }
- }
-
- public byte[] PrimeSeed
- {
- get { return mPrimeSeed; }
- }
-
- public int PrimeGenCounter
- {
- get { return mPrimeGenCounter; }
- }
- }
-
- /**
- * FIPS 186-4 C.6 Shawe-Taylor Random_Prime Routine
- *
- * Construct a provable prime number using a hash function.
- *
- * @param hash
- * the {@link Digest} instance to use (as "Hash()"). Cannot be null.
- * @param length
- * the length (in bits) of the prime to be generated. Must be at least 2.
- * @param inputSeed
- * the seed to be used for the generation of the requested prime. Cannot be null or
- * empty.
- * @return an {@link STOutput} instance containing the requested prime.
- */
- public static STOutput GenerateSTRandomPrime(IDigest hash, int length, byte[] inputSeed)
- {
- if (hash == null)
- throw new ArgumentNullException("hash");
- if (length < 2)
- throw new ArgumentException("must be >= 2", "length");
- if (inputSeed == null)
- throw new ArgumentNullException("inputSeed");
- if (inputSeed.Length == 0)
- throw new ArgumentException("cannot be empty", "inputSeed");
-
- return ImplSTRandomPrime(hash, length, Arrays.Clone(inputSeed));
- }
-
- /**
- * FIPS 186-4 C.3.2 Enhanced Miller-Rabin Probabilistic Primality Test
- *
- * Run several iterations of the Miller-Rabin algorithm with randomly-chosen bases. This is an
- * alternative to {@link #isMRProbablePrime(BigInteger, SecureRandom, int)} that provides more
- * information about a composite candidate, which may be useful when generating or validating
- * RSA moduli.
- *
- * @param candidate
- * the {@link BigInteger} instance to test for primality.
- * @param random
- * the source of randomness to use to choose bases.
- * @param iterations
- * the number of randomly-chosen bases to perform the test for.
- * @return an {@link MROutput} instance that can be further queried for details.
- */
- public static MROutput EnhancedMRProbablePrimeTest(BigInteger candidate, SecureRandom random, int iterations)
- {
- CheckCandidate(candidate, "candidate");
-
- if (random == null)
- throw new ArgumentNullException("random");
- if (iterations < 1)
- throw new ArgumentException("must be > 0", "iterations");
-
- if (candidate.BitLength == 2)
- return MROutput.ProbablyPrime();
-
- if (!candidate.TestBit(0))
- return MROutput.ProvablyCompositeWithFactor(Two);
-
- BigInteger w = candidate;
- BigInteger wSubOne = candidate.Subtract(One);
- BigInteger wSubTwo = candidate.Subtract(Two);
-
- int a = wSubOne.GetLowestSetBit();
- BigInteger m = wSubOne.ShiftRight(a);
-
- for (int i = 0; i < iterations; ++i)
- {
- BigInteger b = BigIntegers.CreateRandomInRange(Two, wSubTwo, random);
- BigInteger g = b.Gcd(w);
-
- if (g.CompareTo(One) > 0)
- return MROutput.ProvablyCompositeWithFactor(g);
-
- BigInteger z = b.ModPow(m, w);
-
- if (z.Equals(One) || z.Equals(wSubOne))
- continue;
-
- bool primeToBase = false;
-
- BigInteger x = z;
- for (int j = 1; j < a; ++j)
- {
- z = z.ModPow(Two, w);
-
- if (z.Equals(wSubOne))
- {
- primeToBase = true;
- break;
- }
-
- if (z.Equals(One))
- break;
-
- x = z;
- }
-
- if (!primeToBase)
- {
- if (!z.Equals(One))
- {
- x = z;
- z = z.ModPow(Two, w);
-
- if (!z.Equals(One))
- {
- x = z;
- }
- }
-
- g = x.Subtract(One).Gcd(w);
-
- if (g.CompareTo(One) > 0)
- return MROutput.ProvablyCompositeWithFactor(g);
-
- return MROutput.ProvablyCompositeNotPrimePower();
- }
- }
-
- return MROutput.ProbablyPrime();
- }
-
- /**
- * A fast check for small divisors, up to some implementation-specific limit.
- *
- * @param candidate
- * the {@link BigInteger} instance to test for division by small factors.
- *
- * @return true if the candidate is found to have any small factors,
- * false otherwise.
- */
- public static bool HasAnySmallFactors(BigInteger candidate)
- {
- CheckCandidate(candidate, "candidate");
-
- return ImplHasAnySmallFactors(candidate);
- }
-
- /**
- * FIPS 186-4 C.3.1 Miller-Rabin Probabilistic Primality Test
- *
- * Run several iterations of the Miller-Rabin algorithm with randomly-chosen bases.
- *
- * @param candidate
- * the {@link BigInteger} instance to test for primality.
- * @param random
- * the source of randomness to use to choose bases.
- * @param iterations
- * the number of randomly-chosen bases to perform the test for.
- * @return false if any witness to compositeness is found amongst the chosen bases
- * (so candidate is definitely NOT prime), or else true
- * (indicating primality with some probability dependent on the number of iterations
- * that were performed).
- */
- public static bool IsMRProbablePrime(BigInteger candidate, SecureRandom random, int iterations)
- {
- CheckCandidate(candidate, "candidate");
-
- if (random == null)
- throw new ArgumentException("cannot be null", "random");
- if (iterations < 1)
- throw new ArgumentException("must be > 0", "iterations");
-
- if (candidate.BitLength == 2)
- return true;
- if (!candidate.TestBit(0))
- return false;
-
- BigInteger w = candidate;
- BigInteger wSubOne = candidate.Subtract(One);
- BigInteger wSubTwo = candidate.Subtract(Two);
-
- int a = wSubOne.GetLowestSetBit();
- BigInteger m = wSubOne.ShiftRight(a);
-
- for (int i = 0; i < iterations; ++i)
- {
- BigInteger b = BigIntegers.CreateRandomInRange(Two, wSubTwo, random);
-
- if (!ImplMRProbablePrimeToBase(w, wSubOne, m, a, b))
- return false;
- }
-
- return true;
- }
-
- /**
- * FIPS 186-4 C.3.1 Miller-Rabin Probabilistic Primality Test (to a fixed base).
- *
- * Run a single iteration of the Miller-Rabin algorithm against the specified base.
- *
- * @param candidate
- * the {@link BigInteger} instance to test for primality.
- * @param baseValue
- * the base value to use for this iteration.
- * @return false if the specified base is a witness to compositeness (so
- * candidate is definitely NOT prime), or else true.
- */
- public static bool IsMRProbablePrimeToBase(BigInteger candidate, BigInteger baseValue)
- {
- CheckCandidate(candidate, "candidate");
- CheckCandidate(baseValue, "baseValue");
-
- if (baseValue.CompareTo(candidate.Subtract(One)) >= 0)
- throw new ArgumentException("must be < ('candidate' - 1)", "baseValue");
-
- if (candidate.BitLength == 2)
- return true;
-
- BigInteger w = candidate;
- BigInteger wSubOne = candidate.Subtract(One);
-
- int a = wSubOne.GetLowestSetBit();
- BigInteger m = wSubOne.ShiftRight(a);
-
- return ImplMRProbablePrimeToBase(w, wSubOne, m, a, baseValue);
- }
-
- private static void CheckCandidate(BigInteger n, string name)
- {
- if (n == null || n.SignValue < 1 || n.BitLength < 2)
- throw new ArgumentException("must be non-null and >= 2", name);
- }
-
- private static bool ImplHasAnySmallFactors(BigInteger x)
- {
- /*
- * Bundle trial divisors into ~32-bit moduli then use fast tests on the ~32-bit remainders.
- */
- int m = 2 * 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23;
- int r = x.Mod(BigInteger.ValueOf(m)).IntValue;
- if ((r % 2) == 0 || (r % 3) == 0 || (r % 5) == 0 || (r % 7) == 0 || (r % 11) == 0 || (r % 13) == 0
- || (r % 17) == 0 || (r % 19) == 0 || (r % 23) == 0)
- {
- return true;
- }
-
- m = 29 * 31 * 37 * 41 * 43;
- r = x.Mod(BigInteger.ValueOf(m)).IntValue;
- if ((r % 29) == 0 || (r % 31) == 0 || (r % 37) == 0 || (r % 41) == 0 || (r % 43) == 0)
- {
- return true;
- }
-
- m = 47 * 53 * 59 * 61 * 67;
- r = x.Mod(BigInteger.ValueOf(m)).IntValue;
- if ((r % 47) == 0 || (r % 53) == 0 || (r % 59) == 0 || (r % 61) == 0 || (r % 67) == 0)
- {
- return true;
- }
-
- m = 71 * 73 * 79 * 83;
- r = x.Mod(BigInteger.ValueOf(m)).IntValue;
- if ((r % 71) == 0 || (r % 73) == 0 || (r % 79) == 0 || (r % 83) == 0)
- {
- return true;
- }
-
- m = 89 * 97 * 101 * 103;
- r = x.Mod(BigInteger.ValueOf(m)).IntValue;
- if ((r % 89) == 0 || (r % 97) == 0 || (r % 101) == 0 || (r % 103) == 0)
- {
- return true;
- }
-
- m = 107 * 109 * 113 * 127;
- r = x.Mod(BigInteger.ValueOf(m)).IntValue;
- if ((r % 107) == 0 || (r % 109) == 0 || (r % 113) == 0 || (r % 127) == 0)
- {
- return true;
- }
-
- m = 131 * 137 * 139 * 149;
- r = x.Mod(BigInteger.ValueOf(m)).IntValue;
- if ((r % 131) == 0 || (r % 137) == 0 || (r % 139) == 0 || (r % 149) == 0)
- {
- return true;
- }
-
- m = 151 * 157 * 163 * 167;
- r = x.Mod(BigInteger.ValueOf(m)).IntValue;
- if ((r % 151) == 0 || (r % 157) == 0 || (r % 163) == 0 || (r % 167) == 0)
- {
- return true;
- }
-
- m = 173 * 179 * 181 * 191;
- r = x.Mod(BigInteger.ValueOf(m)).IntValue;
- if ((r % 173) == 0 || (r % 179) == 0 || (r % 181) == 0 || (r % 191) == 0)
- {
- return true;
- }
-
- m = 193 * 197 * 199 * 211;
- r = x.Mod(BigInteger.ValueOf(m)).IntValue;
- if ((r % 193) == 0 || (r % 197) == 0 || (r % 199) == 0 || (r % 211) == 0)
- {
- return true;
- }
-
- /*
- * NOTE: Unit tests depend on SMALL_FACTOR_LIMIT matching the
- * highest small factor tested here.
- */
- return false;
- }
-
- private static bool ImplMRProbablePrimeToBase(BigInteger w, BigInteger wSubOne, BigInteger m, int a, BigInteger b)
- {
- BigInteger z = b.ModPow(m, w);
-
- if (z.Equals(One) || z.Equals(wSubOne))
- return true;
-
- bool result = false;
-
- for (int j = 1; j < a; ++j)
- {
- z = z.ModPow(Two, w);
-
- if (z.Equals(wSubOne))
- {
- result = true;
- break;
- }
-
- if (z.Equals(One))
- return false;
- }
-
- return result;
- }
-
- private static STOutput ImplSTRandomPrime(IDigest d, int length, byte[] primeSeed)
- {
- int dLen = d.GetDigestSize();
-
- if (length < 33)
- {
- int primeGenCounter = 0;
-
- byte[] c0 = new byte[dLen];
- byte[] c1 = new byte[dLen];
-
- for (;;)
- {
- Hash(d, primeSeed, c0, 0);
- Inc(primeSeed, 1);
-
- Hash(d, primeSeed, c1, 0);
- Inc(primeSeed, 1);
-
- uint c = Extract32(c0) ^ Extract32(c1);
- c &= (uint.MaxValue >> (32 - length));
- c |= (1U << (length - 1)) | 1U;
-
- ++primeGenCounter;
-
- if (IsPrime32(c))
- {
- return new STOutput(BigInteger.ValueOf((long)c), primeSeed, primeGenCounter);
- }
-
- if (primeGenCounter > (4 * length))
- {
- throw new InvalidOperationException("Too many iterations in Shawe-Taylor Random_Prime Routine");
- }
- }
- }
-
- STOutput rec = ImplSTRandomPrime(d, (length + 3)/2, primeSeed);
-
- {
- BigInteger c0 = rec.Prime;
- primeSeed = rec.PrimeSeed;
- int primeGenCounter = rec.PrimeGenCounter;
-
- int outlen = 8 * dLen;
- int iterations = (length - 1)/outlen;
-
- int oldCounter = primeGenCounter;
-
- BigInteger x = HashGen(d, primeSeed, iterations + 1);
- x = x.Mod(One.ShiftLeft(length - 1)).SetBit(length - 1);
-
- BigInteger c0x2 = c0.ShiftLeft(1);
- BigInteger tx2 = x.Subtract(One).Divide(c0x2).Add(One).ShiftLeft(1);
- int dt = 0;
-
- BigInteger c = tx2.Multiply(c0).Add(One);
-
- /*
- * TODO Since the candidate primes are generated by constant steps ('c0x2'),
- * sieving could be used here in place of the 'HasAnySmallFactors' approach.
- */
- for (;;)
- {
- if (c.BitLength > length)
- {
- tx2 = One.ShiftLeft(length - 1).Subtract(One).Divide(c0x2).Add(One).ShiftLeft(1);
- c = tx2.Multiply(c0).Add(One);
- }
-
- ++primeGenCounter;
-
- /*
- * This is an optimization of the original algorithm, using trial division to screen out
- * many non-primes quickly.
- *
- * NOTE: 'primeSeed' is still incremented as if we performed the full check!
- */
- if (!ImplHasAnySmallFactors(c))
- {
- BigInteger a = HashGen(d, primeSeed, iterations + 1);
- a = a.Mod(c.Subtract(Three)).Add(Two);
-
- tx2 = tx2.Add(BigInteger.ValueOf(dt));
- dt = 0;
-
- BigInteger z = a.ModPow(tx2, c);
-
- if (c.Gcd(z.Subtract(One)).Equals(One) && z.ModPow(c0, c).Equals(One))
- {
- return new STOutput(c, primeSeed, primeGenCounter);
- }
- }
- else
- {
- Inc(primeSeed, iterations + 1);
- }
-
- if (primeGenCounter >= ((4 * length) + oldCounter))
- {
- throw new InvalidOperationException("Too many iterations in Shawe-Taylor Random_Prime Routine");
- }
-
- dt += 2;
- c = c.Add(c0x2);
- }
- }
- }
-
- private static uint Extract32(byte[] bs)
- {
- uint result = 0;
-
- int count = System.Math.Min(4, bs.Length);
- for (int i = 0; i < count; ++i)
- {
- uint b = bs[bs.Length - (i + 1)];
- result |= (b << (8 * i));
- }
-
- return result;
- }
-
- private static void Hash(IDigest d, byte[] input, byte[] output, int outPos)
- {
- d.BlockUpdate(input, 0, input.Length);
- d.DoFinal(output, outPos);
- }
-
- private static BigInteger HashGen(IDigest d, byte[] seed, int count)
- {
- int dLen = d.GetDigestSize();
- int pos = count * dLen;
- byte[] buf = new byte[pos];
- for (int i = 0; i < count; ++i)
- {
- pos -= dLen;
- Hash(d, seed, buf, pos);
- Inc(seed, 1);
- }
- return new BigInteger(1, buf);
- }
-
- private static void Inc(byte[] seed, int c)
- {
- int pos = seed.Length;
- while (c > 0 && --pos >= 0)
- {
- c += seed[pos];
- seed[pos] = (byte)c;
- c >>= 8;
- }
- }
-
- private static bool IsPrime32(uint x)
- {
- /*
- * Use wheel factorization with 2, 3, 5 to select trial divisors.
- */
-
- if (x <= 5)
- {
- return x == 2 || x == 3 || x == 5;
- }
-
- if ((x & 1) == 0 || (x % 3) == 0 || (x % 5) == 0)
- {
- return false;
- }
-
- uint[] ds = new uint[]{ 1, 7, 11, 13, 17, 19, 23, 29 };
- uint b = 0;
- for (int pos = 1; ; pos = 0)
- {
- /*
- * Trial division by wheel-selected divisors
- */
- while (pos < ds.Length)
- {
- uint d = b + ds[pos];
- if (x % d == 0)
- {
- return x < 30;
- }
- ++pos;
- }
-
- b += 30;
-
- if ((b >> 16 != 0) || (b * b >= x))
- {
- return true;
- }
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/ECAlgorithms.cs b/BCCrypto/src/math/ec/ECAlgorithms.cs
deleted file mode 100644
index 5d60de4..0000000
--- a/BCCrypto/src/math/ec/ECAlgorithms.cs
+++ /dev/null
@@ -1,479 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.EC.Endo;
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Math.Field;
-
-namespace Org.BouncyCastle.Math.EC
-{
- public class ECAlgorithms
- {
- public static bool IsF2mCurve(ECCurve c)
- {
- return IsF2mField(c.Field);
- }
-
- public static bool IsF2mField(IFiniteField field)
- {
- return field.Dimension > 1 && field.Characteristic.Equals(BigInteger.Two)
- && field is IPolynomialExtensionField;
- }
-
- public static bool IsFpCurve(ECCurve c)
- {
- return IsFpField(c.Field);
- }
-
- public static bool IsFpField(IFiniteField field)
- {
- return field.Dimension == 1;
- }
-
- public static ECPoint SumOfMultiplies(ECPoint[] ps, BigInteger[] ks)
- {
- if (ps == null || ks == null || ps.Length != ks.Length || ps.Length < 1)
- throw new ArgumentException("point and scalar arrays should be non-null, and of equal, non-zero, length");
-
- int count = ps.Length;
- switch (count)
- {
- case 1:
- return ps[0].Multiply(ks[0]);
- case 2:
- return SumOfTwoMultiplies(ps[0], ks[0], ps[1], ks[1]);
- default:
- break;
- }
-
- ECPoint p = ps[0];
- ECCurve c = p.Curve;
-
- ECPoint[] imported = new ECPoint[count];
- imported[0] = p;
- for (int i = 1; i < count; ++i)
- {
- imported[i] = ImportPoint(c, ps[i]);
- }
-
- GlvEndomorphism glvEndomorphism = c.GetEndomorphism() as GlvEndomorphism;
- if (glvEndomorphism != null)
- {
- return ValidatePoint(ImplSumOfMultipliesGlv(imported, ks, glvEndomorphism));
- }
-
- return ValidatePoint(ImplSumOfMultiplies(imported, ks));
- }
-
- public static ECPoint SumOfTwoMultiplies(ECPoint P, BigInteger a, ECPoint Q, BigInteger b)
- {
- ECCurve cp = P.Curve;
- Q = ImportPoint(cp, Q);
-
- // Point multiplication for Koblitz curves (using WTNAF) beats Shamir's trick
- {
- AbstractF2mCurve f2mCurve = cp as AbstractF2mCurve;
- if (f2mCurve != null && f2mCurve.IsKoblitz)
- {
- return ValidatePoint(P.Multiply(a).Add(Q.Multiply(b)));
- }
- }
-
- GlvEndomorphism glvEndomorphism = cp.GetEndomorphism() as GlvEndomorphism;
- if (glvEndomorphism != null)
- {
- return ValidatePoint(
- ImplSumOfMultipliesGlv(new ECPoint[] { P, Q }, new BigInteger[] { a, b }, glvEndomorphism));
- }
-
- return ValidatePoint(ImplShamirsTrickWNaf(P, a, Q, b));
- }
-
- /*
- * "Shamir's Trick", originally due to E. G. Straus
- * (Addition chains of vectors. American Mathematical Monthly,
- * 71(7):806-808, Aug./Sept. 1964)
- *
- * Input: The points P, Q, scalar k = (km?, ... , k1, k0)
- * and scalar l = (lm?, ... , l1, l0).
- * Output: R = k * P + l * Q.
- * 1: Z <- P + Q
- * 2: R <- O
- * 3: for i from m-1 down to 0 do
- * 4: R <- R + R {point doubling}
- * 5: if (ki = 1) and (li = 0) then R <- R + P end if
- * 6: if (ki = 0) and (li = 1) then R <- R + Q end if
- * 7: if (ki = 1) and (li = 1) then R <- R + Z end if
- * 8: end for
- * 9: return R
- */
- public static ECPoint ShamirsTrick(ECPoint P, BigInteger k, ECPoint Q, BigInteger l)
- {
- ECCurve cp = P.Curve;
- Q = ImportPoint(cp, Q);
-
- return ValidatePoint(ImplShamirsTrickJsf(P, k, Q, l));
- }
-
- public static ECPoint ImportPoint(ECCurve c, ECPoint p)
- {
- ECCurve cp = p.Curve;
- if (!c.Equals(cp))
- throw new ArgumentException("Point must be on the same curve");
-
- return c.ImportPoint(p);
- }
-
- public static void MontgomeryTrick(ECFieldElement[] zs, int off, int len)
- {
- MontgomeryTrick(zs, off, len, null);
- }
-
- public static void MontgomeryTrick(ECFieldElement[] zs, int off, int len, ECFieldElement scale)
- {
- /*
- * Uses the "Montgomery Trick" to invert many field elements, with only a single actual
- * field inversion. See e.g. the paper:
- * "Fast Multi-scalar Multiplication Methods on Elliptic Curves with Precomputation Strategy Using Montgomery Trick"
- * by Katsuyuki Okeya, Kouichi Sakurai.
- */
-
- ECFieldElement[] c = new ECFieldElement[len];
- c[0] = zs[off];
-
- int i = 0;
- while (++i < len)
- {
- c[i] = c[i - 1].Multiply(zs[off + i]);
- }
-
- --i;
-
- if (scale != null)
- {
- c[i] = c[i].Multiply(scale);
- }
-
- ECFieldElement u = c[i].Invert();
-
- while (i > 0)
- {
- int j = off + i--;
- ECFieldElement tmp = zs[j];
- zs[j] = c[i].Multiply(u);
- u = u.Multiply(tmp);
- }
-
- zs[off] = u;
- }
-
- /**
- * Simple shift-and-add multiplication. Serves as reference implementation
- * to verify (possibly faster) implementations, and for very small scalars.
- *
- * @param p
- * The point to multiply.
- * @param k
- * The multiplier.
- * @return The result of the point multiplication kP.
- */
- public static ECPoint ReferenceMultiply(ECPoint p, BigInteger k)
- {
- BigInteger x = k.Abs();
- ECPoint q = p.Curve.Infinity;
- int t = x.BitLength;
- if (t > 0)
- {
- if (x.TestBit(0))
- {
- q = p;
- }
- for (int i = 1; i < t; i++)
- {
- p = p.Twice();
- if (x.TestBit(i))
- {
- q = q.Add(p);
- }
- }
- }
- return k.SignValue < 0 ? q.Negate() : q;
- }
-
- public static ECPoint ValidatePoint(ECPoint p)
- {
- if (!p.IsValid())
- throw new ArgumentException("Invalid point", "p");
-
- return p;
- }
-
- internal static ECPoint ImplShamirsTrickJsf(ECPoint P, BigInteger k, ECPoint Q, BigInteger l)
- {
- ECCurve curve = P.Curve;
- ECPoint infinity = curve.Infinity;
-
- // TODO conjugate co-Z addition (ZADDC) can return both of these
- ECPoint PaddQ = P.Add(Q);
- ECPoint PsubQ = P.Subtract(Q);
-
- ECPoint[] points = new ECPoint[] { Q, PsubQ, P, PaddQ };
- curve.NormalizeAll(points);
-
- ECPoint[] table = new ECPoint[] {
- points[3].Negate(), points[2].Negate(), points[1].Negate(),
- points[0].Negate(), infinity, points[0],
- points[1], points[2], points[3] };
-
- byte[] jsf = WNafUtilities.GenerateJsf(k, l);
-
- ECPoint R = infinity;
-
- int i = jsf.Length;
- while (--i >= 0)
- {
- int jsfi = jsf[i];
-
- // NOTE: The shifting ensures the sign is extended correctly
- int kDigit = ((jsfi << 24) >> 28), lDigit = ((jsfi << 28) >> 28);
-
- int index = 4 + (kDigit * 3) + lDigit;
- R = R.TwicePlus(table[index]);
- }
-
- return R;
- }
-
- internal static ECPoint ImplShamirsTrickWNaf(ECPoint P, BigInteger k,
- ECPoint Q, BigInteger l)
- {
- bool negK = k.SignValue < 0, negL = l.SignValue < 0;
-
- k = k.Abs();
- l = l.Abs();
-
- int widthP = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(k.BitLength)));
- int widthQ = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(l.BitLength)));
-
- WNafPreCompInfo infoP = WNafUtilities.Precompute(P, widthP, true);
- WNafPreCompInfo infoQ = WNafUtilities.Precompute(Q, widthQ, true);
-
- ECPoint[] preCompP = negK ? infoP.PreCompNeg : infoP.PreComp;
- ECPoint[] preCompQ = negL ? infoQ.PreCompNeg : infoQ.PreComp;
- ECPoint[] preCompNegP = negK ? infoP.PreComp : infoP.PreCompNeg;
- ECPoint[] preCompNegQ = negL ? infoQ.PreComp : infoQ.PreCompNeg;
-
- byte[] wnafP = WNafUtilities.GenerateWindowNaf(widthP, k);
- byte[] wnafQ = WNafUtilities.GenerateWindowNaf(widthQ, l);
-
- return ImplShamirsTrickWNaf(preCompP, preCompNegP, wnafP, preCompQ, preCompNegQ, wnafQ);
- }
-
- internal static ECPoint ImplShamirsTrickWNaf(ECPoint P, BigInteger k, ECPointMap pointMapQ, BigInteger l)
- {
- bool negK = k.SignValue < 0, negL = l.SignValue < 0;
-
- k = k.Abs();
- l = l.Abs();
-
- int width = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(System.Math.Max(k.BitLength, l.BitLength))));
-
- ECPoint Q = WNafUtilities.MapPointWithPrecomp(P, width, true, pointMapQ);
- WNafPreCompInfo infoP = WNafUtilities.GetWNafPreCompInfo(P);
- WNafPreCompInfo infoQ = WNafUtilities.GetWNafPreCompInfo(Q);
-
- ECPoint[] preCompP = negK ? infoP.PreCompNeg : infoP.PreComp;
- ECPoint[] preCompQ = negL ? infoQ.PreCompNeg : infoQ.PreComp;
- ECPoint[] preCompNegP = negK ? infoP.PreComp : infoP.PreCompNeg;
- ECPoint[] preCompNegQ = negL ? infoQ.PreComp : infoQ.PreCompNeg;
-
- byte[] wnafP = WNafUtilities.GenerateWindowNaf(width, k);
- byte[] wnafQ = WNafUtilities.GenerateWindowNaf(width, l);
-
- return ImplShamirsTrickWNaf(preCompP, preCompNegP, wnafP, preCompQ, preCompNegQ, wnafQ);
- }
-
- private static ECPoint ImplShamirsTrickWNaf(ECPoint[] preCompP, ECPoint[] preCompNegP, byte[] wnafP,
- ECPoint[] preCompQ, ECPoint[] preCompNegQ, byte[] wnafQ)
- {
- int len = System.Math.Max(wnafP.Length, wnafQ.Length);
-
- ECCurve curve = preCompP[0].Curve;
- ECPoint infinity = curve.Infinity;
-
- ECPoint R = infinity;
- int zeroes = 0;
-
- for (int i = len - 1; i >= 0; --i)
- {
- int wiP = i < wnafP.Length ? (int)(sbyte)wnafP[i] : 0;
- int wiQ = i < wnafQ.Length ? (int)(sbyte)wnafQ[i] : 0;
-
- if ((wiP | wiQ) == 0)
- {
- ++zeroes;
- continue;
- }
-
- ECPoint r = infinity;
- if (wiP != 0)
- {
- int nP = System.Math.Abs(wiP);
- ECPoint[] tableP = wiP < 0 ? preCompNegP : preCompP;
- r = r.Add(tableP[nP >> 1]);
- }
- if (wiQ != 0)
- {
- int nQ = System.Math.Abs(wiQ);
- ECPoint[] tableQ = wiQ < 0 ? preCompNegQ : preCompQ;
- r = r.Add(tableQ[nQ >> 1]);
- }
-
- if (zeroes > 0)
- {
- R = R.TimesPow2(zeroes);
- zeroes = 0;
- }
-
- R = R.TwicePlus(r);
- }
-
- if (zeroes > 0)
- {
- R = R.TimesPow2(zeroes);
- }
-
- return R;
- }
-
- internal static ECPoint ImplSumOfMultiplies(ECPoint[] ps, BigInteger[] ks)
- {
- int count = ps.Length;
- bool[] negs = new bool[count];
- WNafPreCompInfo[] infos = new WNafPreCompInfo[count];
- byte[][] wnafs = new byte[count][];
-
- for (int i = 0; i < count; ++i)
- {
- BigInteger ki = ks[i]; negs[i] = ki.SignValue < 0; ki = ki.Abs();
-
- int width = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(ki.BitLength)));
- infos[i] = WNafUtilities.Precompute(ps[i], width, true);
- wnafs[i] = WNafUtilities.GenerateWindowNaf(width, ki);
- }
-
- return ImplSumOfMultiplies(negs, infos, wnafs);
- }
-
- internal static ECPoint ImplSumOfMultipliesGlv(ECPoint[] ps, BigInteger[] ks, GlvEndomorphism glvEndomorphism)
- {
- BigInteger n = ps[0].Curve.Order;
-
- int len = ps.Length;
-
- BigInteger[] abs = new BigInteger[len << 1];
- for (int i = 0, j = 0; i < len; ++i)
- {
- BigInteger[] ab = glvEndomorphism.DecomposeScalar(ks[i].Mod(n));
- abs[j++] = ab[0];
- abs[j++] = ab[1];
- }
-
- ECPointMap pointMap = glvEndomorphism.PointMap;
- if (glvEndomorphism.HasEfficientPointMap)
- {
- return ECAlgorithms.ImplSumOfMultiplies(ps, pointMap, abs);
- }
-
- ECPoint[] pqs = new ECPoint[len << 1];
- for (int i = 0, j = 0; i < len; ++i)
- {
- ECPoint p = ps[i], q = pointMap.Map(p);
- pqs[j++] = p;
- pqs[j++] = q;
- }
-
- return ECAlgorithms.ImplSumOfMultiplies(pqs, abs);
- }
-
- internal static ECPoint ImplSumOfMultiplies(ECPoint[] ps, ECPointMap pointMap, BigInteger[] ks)
- {
- int halfCount = ps.Length, fullCount = halfCount << 1;
-
- bool[] negs = new bool[fullCount];
- WNafPreCompInfo[] infos = new WNafPreCompInfo[fullCount];
- byte[][] wnafs = new byte[fullCount][];
-
- for (int i = 0; i < halfCount; ++i)
- {
- int j0 = i << 1, j1 = j0 + 1;
-
- BigInteger kj0 = ks[j0]; negs[j0] = kj0.SignValue < 0; kj0 = kj0.Abs();
- BigInteger kj1 = ks[j1]; negs[j1] = kj1.SignValue < 0; kj1 = kj1.Abs();
-
- int width = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(System.Math.Max(kj0.BitLength, kj1.BitLength))));
-
- ECPoint P = ps[i], Q = WNafUtilities.MapPointWithPrecomp(P, width, true, pointMap);
- infos[j0] = WNafUtilities.GetWNafPreCompInfo(P);
- infos[j1] = WNafUtilities.GetWNafPreCompInfo(Q);
- wnafs[j0] = WNafUtilities.GenerateWindowNaf(width, kj0);
- wnafs[j1] = WNafUtilities.GenerateWindowNaf(width, kj1);
- }
-
- return ImplSumOfMultiplies(negs, infos, wnafs);
- }
-
- private static ECPoint ImplSumOfMultiplies(bool[] negs, WNafPreCompInfo[] infos, byte[][] wnafs)
- {
- int len = 0, count = wnafs.Length;
- for (int i = 0; i < count; ++i)
- {
- len = System.Math.Max(len, wnafs[i].Length);
- }
-
- ECCurve curve = infos[0].PreComp[0].Curve;
- ECPoint infinity = curve.Infinity;
-
- ECPoint R = infinity;
- int zeroes = 0;
-
- for (int i = len - 1; i >= 0; --i)
- {
- ECPoint r = infinity;
-
- for (int j = 0; j < count; ++j)
- {
- byte[] wnaf = wnafs[j];
- int wi = i < wnaf.Length ? (int)(sbyte)wnaf[i] : 0;
- if (wi != 0)
- {
- int n = System.Math.Abs(wi);
- WNafPreCompInfo info = infos[j];
- ECPoint[] table = (wi < 0 == negs[j]) ? info.PreComp : info.PreCompNeg;
- r = r.Add(table[n >> 1]);
- }
- }
-
- if (r == infinity)
- {
- ++zeroes;
- continue;
- }
-
- if (zeroes > 0)
- {
- R = R.TimesPow2(zeroes);
- zeroes = 0;
- }
-
- R = R.TwicePlus(r);
- }
-
- if (zeroes > 0)
- {
- R = R.TimesPow2(zeroes);
- }
-
- return R;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/ECCurve.cs b/BCCrypto/src/math/ec/ECCurve.cs
deleted file mode 100644
index 6ccd97e..0000000
--- a/BCCrypto/src/math/ec/ECCurve.cs
+++ /dev/null
@@ -1,1131 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Math.EC.Abc;
-using Org.BouncyCastle.Math.EC.Endo;
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Math.Field;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC
-{
- /// Base class for an elliptic curve.
- public abstract class ECCurve
- {
- public const int COORD_AFFINE = 0;
- public const int COORD_HOMOGENEOUS = 1;
- public const int COORD_JACOBIAN = 2;
- public const int COORD_JACOBIAN_CHUDNOVSKY = 3;
- public const int COORD_JACOBIAN_MODIFIED = 4;
- public const int COORD_LAMBDA_AFFINE = 5;
- public const int COORD_LAMBDA_PROJECTIVE = 6;
- public const int COORD_SKEWED = 7;
-
- public static int[] GetAllCoordinateSystems()
- {
- return new int[]{ COORD_AFFINE, COORD_HOMOGENEOUS, COORD_JACOBIAN, COORD_JACOBIAN_CHUDNOVSKY,
- COORD_JACOBIAN_MODIFIED, COORD_LAMBDA_AFFINE, COORD_LAMBDA_PROJECTIVE, COORD_SKEWED };
- }
-
- public class Config
- {
- protected ECCurve outer;
- protected int coord;
- protected ECEndomorphism endomorphism;
- protected ECMultiplier multiplier;
-
- internal Config(ECCurve outer, int coord, ECEndomorphism endomorphism, ECMultiplier multiplier)
- {
- this.outer = outer;
- this.coord = coord;
- this.endomorphism = endomorphism;
- this.multiplier = multiplier;
- }
-
- public Config SetCoordinateSystem(int coord)
- {
- this.coord = coord;
- return this;
- }
-
- public Config SetEndomorphism(ECEndomorphism endomorphism)
- {
- this.endomorphism = endomorphism;
- return this;
- }
-
- public Config SetMultiplier(ECMultiplier multiplier)
- {
- this.multiplier = multiplier;
- return this;
- }
-
- public ECCurve Create()
- {
- if (!outer.SupportsCoordinateSystem(coord))
- {
- throw new InvalidOperationException("unsupported coordinate system");
- }
-
- ECCurve c = outer.CloneCurve();
- if (c == outer)
- {
- throw new InvalidOperationException("implementation returned current curve");
- }
-
- c.m_coord = coord;
- c.m_endomorphism = endomorphism;
- c.m_multiplier = multiplier;
-
- return c;
- }
- }
-
- protected readonly IFiniteField m_field;
- protected ECFieldElement m_a, m_b;
- protected BigInteger m_order, m_cofactor;
-
- protected int m_coord = COORD_AFFINE;
- protected ECEndomorphism m_endomorphism = null;
- protected ECMultiplier m_multiplier = null;
-
- protected ECCurve(IFiniteField field)
- {
- this.m_field = field;
- }
-
- public abstract int FieldSize { get; }
- public abstract ECFieldElement FromBigInteger(BigInteger x);
- public abstract bool IsValidFieldElement(BigInteger x);
-
- public virtual Config Configure()
- {
- return new Config(this, this.m_coord, this.m_endomorphism, this.m_multiplier);
- }
-
- public virtual ECPoint ValidatePoint(BigInteger x, BigInteger y)
- {
- ECPoint p = CreatePoint(x, y);
- if (!p.IsValid())
- {
- throw new ArgumentException("Invalid point coordinates");
- }
- return p;
- }
-
- [Obsolete("Per-point compression property will be removed")]
- public virtual ECPoint ValidatePoint(BigInteger x, BigInteger y, bool withCompression)
- {
- ECPoint p = CreatePoint(x, y, withCompression);
- if (!p.IsValid())
- {
- throw new ArgumentException("Invalid point coordinates");
- }
- return p;
- }
-
- public virtual ECPoint CreatePoint(BigInteger x, BigInteger y)
- {
- return CreatePoint(x, y, false);
- }
-
- [Obsolete("Per-point compression property will be removed")]
- public virtual ECPoint CreatePoint(BigInteger x, BigInteger y, bool withCompression)
- {
- return CreateRawPoint(FromBigInteger(x), FromBigInteger(y), withCompression);
- }
-
- protected abstract ECCurve CloneCurve();
-
- protected internal abstract ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression);
-
- protected internal abstract ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression);
-
- protected virtual ECMultiplier CreateDefaultMultiplier()
- {
- GlvEndomorphism glvEndomorphism = m_endomorphism as GlvEndomorphism;
- if (glvEndomorphism != null)
- {
- return new GlvMultiplier(this, glvEndomorphism);
- }
-
- return new WNafL2RMultiplier();
- }
-
- public virtual bool SupportsCoordinateSystem(int coord)
- {
- return coord == COORD_AFFINE;
- }
-
- public virtual PreCompInfo GetPreCompInfo(ECPoint point, string name)
- {
- CheckPoint(point);
- lock (point)
- {
- IDictionary table = point.m_preCompTable;
- return table == null ? null : (PreCompInfo)table[name];
- }
- }
-
- /**
- * Adds PreCompInfo for a point on this curve, under a given name. Used by
- * ECMultipliers to save the precomputation for this ECPoint for use
- * by subsequent multiplication.
- *
- * @param point
- * The ECPoint to store precomputations for.
- * @param name
- * A String used to index precomputations of different types.
- * @param preCompInfo
- * The values precomputed by the ECMultiplier.
- */
- public virtual void SetPreCompInfo(ECPoint point, string name, PreCompInfo preCompInfo)
- {
- CheckPoint(point);
- lock (point)
- {
- IDictionary table = point.m_preCompTable;
- if (null == table)
- {
- point.m_preCompTable = table = Platform.CreateHashtable(4);
- }
- table[name] = preCompInfo;
- }
- }
-
- public virtual ECPoint ImportPoint(ECPoint p)
- {
- if (this == p.Curve)
- {
- return p;
- }
- if (p.IsInfinity)
- {
- return Infinity;
- }
-
- // TODO Default behaviour could be improved if the two curves have the same coordinate system by copying any Z coordinates.
- p = p.Normalize();
-
- return ValidatePoint(p.XCoord.ToBigInteger(), p.YCoord.ToBigInteger(), p.IsCompressed);
- }
-
- /**
- * Normalization ensures that any projective coordinate is 1, and therefore that the x, y
- * coordinates reflect those of the equivalent point in an affine coordinate system. Where more
- * than one point is to be normalized, this method will generally be more efficient than
- * normalizing each point separately.
- *
- * @param points
- * An array of points that will be updated in place with their normalized versions,
- * where necessary
- */
- public virtual void NormalizeAll(ECPoint[] points)
- {
- NormalizeAll(points, 0, points.Length, null);
- }
-
- /**
- * Normalization ensures that any projective coordinate is 1, and therefore that the x, y
- * coordinates reflect those of the equivalent point in an affine coordinate system. Where more
- * than one point is to be normalized, this method will generally be more efficient than
- * normalizing each point separately. An (optional) z-scaling factor can be applied; effectively
- * each z coordinate is scaled by this value prior to normalization (but only one
- * actual multiplication is needed).
- *
- * @param points
- * An array of points that will be updated in place with their normalized versions,
- * where necessary
- * @param off
- * The start of the range of points to normalize
- * @param len
- * The length of the range of points to normalize
- * @param iso
- * The (optional) z-scaling factor - can be null
- */
- public virtual void NormalizeAll(ECPoint[] points, int off, int len, ECFieldElement iso)
- {
- CheckPoints(points, off, len);
-
- switch (this.CoordinateSystem)
- {
- case ECCurve.COORD_AFFINE:
- case ECCurve.COORD_LAMBDA_AFFINE:
- {
- if (iso != null)
- throw new ArgumentException("not valid for affine coordinates", "iso");
-
- return;
- }
- }
-
- /*
- * Figure out which of the points actually need to be normalized
- */
- ECFieldElement[] zs = new ECFieldElement[len];
- int[] indices = new int[len];
- int count = 0;
- for (int i = 0; i < len; ++i)
- {
- ECPoint p = points[off + i];
- if (null != p && (iso != null || !p.IsNormalized()))
- {
- zs[count] = p.GetZCoord(0);
- indices[count++] = off + i;
- }
- }
-
- if (count == 0)
- {
- return;
- }
-
- ECAlgorithms.MontgomeryTrick(zs, 0, count, iso);
-
- for (int j = 0; j < count; ++j)
- {
- int index = indices[j];
- points[index] = points[index].Normalize(zs[j]);
- }
- }
-
- public abstract ECPoint Infinity { get; }
-
- public virtual IFiniteField Field
- {
- get { return m_field; }
- }
-
- public virtual ECFieldElement A
- {
- get { return m_a; }
- }
-
- public virtual ECFieldElement B
- {
- get { return m_b; }
- }
-
- public virtual BigInteger Order
- {
- get { return m_order; }
- }
-
- public virtual BigInteger Cofactor
- {
- get { return m_cofactor; }
- }
-
- public virtual int CoordinateSystem
- {
- get { return m_coord; }
- }
-
- protected virtual void CheckPoint(ECPoint point)
- {
- if (null == point || (this != point.Curve))
- throw new ArgumentException("must be non-null and on this curve", "point");
- }
-
- protected virtual void CheckPoints(ECPoint[] points)
- {
- CheckPoints(points, 0, points.Length);
- }
-
- protected virtual void CheckPoints(ECPoint[] points, int off, int len)
- {
- if (points == null)
- throw new ArgumentNullException("points");
- if (off < 0 || len < 0 || (off > (points.Length - len)))
- throw new ArgumentException("invalid range specified", "points");
-
- for (int i = 0; i < len; ++i)
- {
- ECPoint point = points[off + i];
- if (null != point && this != point.Curve)
- throw new ArgumentException("entries must be null or on this curve", "points");
- }
- }
-
- public virtual bool Equals(ECCurve other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Field.Equals(other.Field)
- && A.ToBigInteger().Equals(other.A.ToBigInteger())
- && B.ToBigInteger().Equals(other.B.ToBigInteger());
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as ECCurve);
- }
-
- public override int GetHashCode()
- {
- return Field.GetHashCode()
- ^ Integers.RotateLeft(A.ToBigInteger().GetHashCode(), 8)
- ^ Integers.RotateLeft(B.ToBigInteger().GetHashCode(), 16);
- }
-
- protected abstract ECPoint DecompressPoint(int yTilde, BigInteger X1);
-
- public virtual ECEndomorphism GetEndomorphism()
- {
- return m_endomorphism;
- }
-
- /**
- * Sets the default ECMultiplier, unless already set.
- */
- public virtual ECMultiplier GetMultiplier()
- {
- lock (this)
- {
- if (this.m_multiplier == null)
- {
- this.m_multiplier = CreateDefaultMultiplier();
- }
- return this.m_multiplier;
- }
- }
-
- /**
- * Decode a point on this curve from its ASN.1 encoding. The different
- * encodings are taken account of, including point compression for
- * Fp (X9.62 s 4.2.1 pg 17).
- * @return The decoded point.
- */
- public virtual ECPoint DecodePoint(byte[] encoded)
- {
- ECPoint p = null;
- int expectedLength = (FieldSize + 7) / 8;
-
- byte type = encoded[0];
- switch (type)
- {
- case 0x00: // infinity
- {
- if (encoded.Length != 1)
- throw new ArgumentException("Incorrect length for infinity encoding", "encoded");
-
- p = Infinity;
- break;
- }
-
- case 0x02: // compressed
- case 0x03: // compressed
- {
- if (encoded.Length != (expectedLength + 1))
- throw new ArgumentException("Incorrect length for compressed encoding", "encoded");
-
- int yTilde = type & 1;
- BigInteger X = new BigInteger(1, encoded, 1, expectedLength);
-
- p = DecompressPoint(yTilde, X);
- if (!p.SatisfiesCofactor())
- throw new ArgumentException("Invalid point");
-
- break;
- }
-
- case 0x04: // uncompressed
- {
- if (encoded.Length != (2 * expectedLength + 1))
- throw new ArgumentException("Incorrect length for uncompressed encoding", "encoded");
-
- BigInteger X = new BigInteger(1, encoded, 1, expectedLength);
- BigInteger Y = new BigInteger(1, encoded, 1 + expectedLength, expectedLength);
-
- p = ValidatePoint(X, Y);
- break;
- }
-
- case 0x06: // hybrid
- case 0x07: // hybrid
- {
- if (encoded.Length != (2 * expectedLength + 1))
- throw new ArgumentException("Incorrect length for hybrid encoding", "encoded");
-
- BigInteger X = new BigInteger(1, encoded, 1, expectedLength);
- BigInteger Y = new BigInteger(1, encoded, 1 + expectedLength, expectedLength);
-
- if (Y.TestBit(0) != (type == 0x07))
- throw new ArgumentException("Inconsistent Y coordinate in hybrid encoding", "encoded");
-
- p = ValidatePoint(X, Y);
- break;
- }
-
- default:
- throw new FormatException("Invalid point encoding " + type);
- }
-
- if (type != 0x00 && p.IsInfinity)
- throw new ArgumentException("Invalid infinity encoding", "encoded");
-
- return p;
- }
- }
-
- public abstract class AbstractFpCurve
- : ECCurve
- {
- protected AbstractFpCurve(BigInteger q)
- : base(FiniteFields.GetPrimeField(q))
- {
- }
-
- public override bool IsValidFieldElement(BigInteger x)
- {
- return x != null && x.SignValue >= 0 && x.CompareTo(Field.Characteristic) < 0;
- }
-
- protected override ECPoint DecompressPoint(int yTilde, BigInteger X1)
- {
- ECFieldElement x = FromBigInteger(X1);
- ECFieldElement rhs = x.Square().Add(A).Multiply(x).Add(B);
- ECFieldElement y = rhs.Sqrt();
-
- /*
- * If y is not a square, then we haven't got a point on the curve
- */
- if (y == null)
- throw new ArgumentException("Invalid point compression");
-
- if (y.TestBitZero() != (yTilde == 1))
- {
- // Use the other root
- y = y.Negate();
- }
-
- return CreateRawPoint(x, y, true);
- }
- }
-
- /**
- * Elliptic curve over Fp
- */
- public class FpCurve
- : AbstractFpCurve
- {
- private const int FP_DEFAULT_COORDS = COORD_JACOBIAN_MODIFIED;
-
- protected readonly BigInteger m_q, m_r;
- protected readonly FpPoint m_infinity;
-
- public FpCurve(BigInteger q, BigInteger a, BigInteger b)
- : this(q, a, b, null, null)
- {
- }
-
- public FpCurve(BigInteger q, BigInteger a, BigInteger b, BigInteger order, BigInteger cofactor)
- : base(q)
- {
- this.m_q = q;
- this.m_r = FpFieldElement.CalculateResidue(q);
- this.m_infinity = new FpPoint(this, null, null);
-
- this.m_a = FromBigInteger(a);
- this.m_b = FromBigInteger(b);
- this.m_order = order;
- this.m_cofactor = cofactor;
- this.m_coord = FP_DEFAULT_COORDS;
- }
-
- protected FpCurve(BigInteger q, BigInteger r, ECFieldElement a, ECFieldElement b)
- : this(q, r, a, b, null, null)
- {
- }
-
- protected FpCurve(BigInteger q, BigInteger r, ECFieldElement a, ECFieldElement b, BigInteger order, BigInteger cofactor)
- : base(q)
- {
- this.m_q = q;
- this.m_r = r;
- this.m_infinity = new FpPoint(this, null, null);
-
- this.m_a = a;
- this.m_b = b;
- this.m_order = order;
- this.m_cofactor = cofactor;
- this.m_coord = FP_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new FpCurve(m_q, m_r, m_a, m_b, m_order, m_cofactor);
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_AFFINE:
- case COORD_HOMOGENEOUS:
- case COORD_JACOBIAN:
- case COORD_JACOBIAN_MODIFIED:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return m_q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return m_q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new FpFieldElement(this.m_q, this.m_r, x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new FpPoint(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new FpPoint(this, x, y, zs, withCompression);
- }
-
- public override ECPoint ImportPoint(ECPoint p)
- {
- if (this != p.Curve && this.CoordinateSystem == COORD_JACOBIAN && !p.IsInfinity)
- {
- switch (p.Curve.CoordinateSystem)
- {
- case COORD_JACOBIAN:
- case COORD_JACOBIAN_CHUDNOVSKY:
- case COORD_JACOBIAN_MODIFIED:
- return new FpPoint(this,
- FromBigInteger(p.RawXCoord.ToBigInteger()),
- FromBigInteger(p.RawYCoord.ToBigInteger()),
- new ECFieldElement[] { FromBigInteger(p.GetZCoord(0).ToBigInteger()) },
- p.IsCompressed);
- default:
- break;
- }
- }
-
- return base.ImportPoint(p);
- }
- }
-
- public abstract class AbstractF2mCurve
- : ECCurve
- {
- public static BigInteger Inverse(int m, int[] ks, BigInteger x)
- {
- return new LongArray(x).ModInverse(m, ks).ToBigInteger();
- }
-
- /**
- * The auxiliary values s0 and
- * s1 used for partial modular reduction for
- * Koblitz curves.
- */
- private BigInteger[] si = null;
-
- private static IFiniteField BuildField(int m, int k1, int k2, int k3)
- {
- if (k1 == 0)
- {
- throw new ArgumentException("k1 must be > 0");
- }
-
- if (k2 == 0)
- {
- if (k3 != 0)
- {
- throw new ArgumentException("k3 must be 0 if k2 == 0");
- }
-
- return FiniteFields.GetBinaryExtensionField(new int[]{ 0, k1, m });
- }
-
- if (k2 <= k1)
- {
- throw new ArgumentException("k2 must be > k1");
- }
-
- if (k3 <= k2)
- {
- throw new ArgumentException("k3 must be > k2");
- }
-
- return FiniteFields.GetBinaryExtensionField(new int[]{ 0, k1, k2, k3, m });
- }
-
- protected AbstractF2mCurve(int m, int k1, int k2, int k3)
- : base(BuildField(m, k1, k2, k3))
- {
- }
-
- public override bool IsValidFieldElement(BigInteger x)
- {
- return x != null && x.SignValue >= 0 && x.BitLength <= FieldSize;
- }
-
- [Obsolete("Per-point compression property will be removed")]
- public override ECPoint CreatePoint(BigInteger x, BigInteger y, bool withCompression)
- {
- ECFieldElement X = FromBigInteger(x), Y = FromBigInteger(y);
-
- switch (this.CoordinateSystem)
- {
- case COORD_LAMBDA_AFFINE:
- case COORD_LAMBDA_PROJECTIVE:
- {
- if (X.IsZero)
- {
- if (!Y.Square().Equals(B))
- throw new ArgumentException();
- }
- else
- {
- // Y becomes Lambda (X + Y/X) here
- Y = Y.Divide(X).Add(X);
- }
- break;
- }
- default:
- {
- break;
- }
- }
-
- return CreateRawPoint(X, Y, withCompression);
- }
-
- protected override ECPoint DecompressPoint(int yTilde, BigInteger X1)
- {
- ECFieldElement xp = FromBigInteger(X1), yp = null;
- if (xp.IsZero)
- {
- yp = B.Sqrt();
- }
- else
- {
- ECFieldElement beta = xp.Square().Invert().Multiply(B).Add(A).Add(xp);
- ECFieldElement z = SolveQuadradicEquation(beta);
-
- if (z != null)
- {
- if (z.TestBitZero() != (yTilde == 1))
- {
- z = z.AddOne();
- }
-
- switch (this.CoordinateSystem)
- {
- case COORD_LAMBDA_AFFINE:
- case COORD_LAMBDA_PROJECTIVE:
- {
- yp = z.Add(xp);
- break;
- }
- default:
- {
- yp = z.Multiply(xp);
- break;
- }
- }
- }
- }
-
- if (yp == null)
- throw new ArgumentException("Invalid point compression");
-
- return CreateRawPoint(xp, yp, true);
- }
-
- /**
- * Solves a quadratic equation z2 + z = beta(X9.62
- * D.1.6) The other solution is z + 1.
- *
- * @param beta
- * The value to solve the qradratic equation for.
- * @return the solution for z2 + z = beta or
- * null if no solution exists.
- */
- private ECFieldElement SolveQuadradicEquation(ECFieldElement beta)
- {
- if (beta.IsZero)
- return beta;
-
- ECFieldElement gamma, z, zeroElement = FromBigInteger(BigInteger.Zero);
-
- int m = FieldSize;
- do
- {
- ECFieldElement t = FromBigInteger(BigInteger.Arbitrary(m));
- z = zeroElement;
- ECFieldElement w = beta;
- for (int i = 1; i < m; i++)
- {
- ECFieldElement w2 = w.Square();
- z = z.Square().Add(w2.Multiply(t));
- w = w2.Add(beta);
- }
- if (!w.IsZero)
- {
- return null;
- }
- gamma = z.Square().Add(z);
- }
- while (gamma.IsZero);
-
- return z;
- }
-
- /**
- * @return the auxiliary values s0 and
- * s1 used for partial modular reduction for
- * Koblitz curves.
- */
- internal virtual BigInteger[] GetSi()
- {
- if (si == null)
- {
- lock (this)
- {
- if (si == null)
- {
- si = Tnaf.GetSi(this);
- }
- }
- }
- return si;
- }
-
- /**
- * Returns true if this is a Koblitz curve (ABC curve).
- * @return true if this is a Koblitz curve (ABC curve), false otherwise
- */
- public virtual bool IsKoblitz
- {
- get
- {
- return m_order != null && m_cofactor != null && m_b.IsOne && (m_a.IsZero || m_a.IsOne);
- }
- }
- }
-
- /**
- * Elliptic curves over F2m. The Weierstrass equation is given by
- * y2 + xy = x3 + ax2 + b.
- */
- public class F2mCurve
- : AbstractF2mCurve
- {
- private const int F2M_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- /**
- * The exponent m of F2m .
- */
- private readonly int m;
-
- /**
- * TPB: The integer k where xm +
- * xk + 1 represents the reduction polynomial
- * f(z).
- * PPB: The integer k1 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- */
- private readonly int k1;
-
- /**
- * TPB: Always set to 0
- * PPB: The integer k2 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- */
- private readonly int k2;
-
- /**
- * TPB: Always set to 0
- * PPB: The integer k3 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- */
- private readonly int k3;
-
- /**
- * The point at infinity on this curve.
- */
- protected readonly F2mPoint m_infinity;
-
- /**
- * Constructor for Trinomial Polynomial Basis (TPB).
- * @param m The exponent m of
- * F2m .
- * @param k The integer k where xm +
- * xk + 1 represents the reduction
- * polynomial f(z).
- * @param a The coefficient a in the Weierstrass equation
- * for non-supersingular elliptic curves over
- * F2m .
- * @param b The coefficient b in the Weierstrass equation
- * for non-supersingular elliptic curves over
- * F2m .
- */
- public F2mCurve(
- int m,
- int k,
- BigInteger a,
- BigInteger b)
- : this(m, k, 0, 0, a, b, null, null)
- {
- }
-
- /**
- * Constructor for Trinomial Polynomial Basis (TPB).
- * @param m The exponent m of
- * F2m .
- * @param k The integer k where xm +
- * xk + 1 represents the reduction
- * polynomial f(z).
- * @param a The coefficient a in the Weierstrass equation
- * for non-supersingular elliptic curves over
- * F2m .
- * @param b The coefficient b in the Weierstrass equation
- * for non-supersingular elliptic curves over
- * F2m .
- * @param order The order of the main subgroup of the elliptic curve.
- * @param cofactor The cofactor of the elliptic curve, i.e.
- * #Ea (F2m ) = h * n.
- */
- public F2mCurve(
- int m,
- int k,
- BigInteger a,
- BigInteger b,
- BigInteger order,
- BigInteger cofactor)
- : this(m, k, 0, 0, a, b, order, cofactor)
- {
- }
-
- /**
- * Constructor for Pentanomial Polynomial Basis (PPB).
- * @param m The exponent m of
- * F2m .
- * @param k1 The integer k1 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- * @param k2 The integer k2 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- * @param k3 The integer k3 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- * @param a The coefficient a in the Weierstrass equation
- * for non-supersingular elliptic curves over
- * F2m .
- * @param b The coefficient b in the Weierstrass equation
- * for non-supersingular elliptic curves over
- * F2m .
- */
- public F2mCurve(
- int m,
- int k1,
- int k2,
- int k3,
- BigInteger a,
- BigInteger b)
- : this(m, k1, k2, k3, a, b, null, null)
- {
- }
-
- /**
- * Constructor for Pentanomial Polynomial Basis (PPB).
- * @param m The exponent m of
- * F2m .
- * @param k1 The integer k1 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- * @param k2 The integer k2 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- * @param k3 The integer k3 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- * @param a The coefficient a in the Weierstrass equation
- * for non-supersingular elliptic curves over
- * F2m .
- * @param b The coefficient b in the Weierstrass equation
- * for non-supersingular elliptic curves over
- * F2m .
- * @param order The order of the main subgroup of the elliptic curve.
- * @param cofactor The cofactor of the elliptic curve, i.e.
- * #Ea (F2m ) = h * n.
- */
- public F2mCurve(
- int m,
- int k1,
- int k2,
- int k3,
- BigInteger a,
- BigInteger b,
- BigInteger order,
- BigInteger cofactor)
- : base(m, k1, k2, k3)
- {
- this.m = m;
- this.k1 = k1;
- this.k2 = k2;
- this.k3 = k3;
- this.m_order = order;
- this.m_cofactor = cofactor;
- this.m_infinity = new F2mPoint(this, null, null);
-
- if (k1 == 0)
- throw new ArgumentException("k1 must be > 0");
-
- if (k2 == 0)
- {
- if (k3 != 0)
- throw new ArgumentException("k3 must be 0 if k2 == 0");
- }
- else
- {
- if (k2 <= k1)
- throw new ArgumentException("k2 must be > k1");
-
- if (k3 <= k2)
- throw new ArgumentException("k3 must be > k2");
- }
-
- this.m_a = FromBigInteger(a);
- this.m_b = FromBigInteger(b);
- this.m_coord = F2M_DEFAULT_COORDS;
- }
-
- protected F2mCurve(int m, int k1, int k2, int k3, ECFieldElement a, ECFieldElement b, BigInteger order, BigInteger cofactor)
- : base(m, k1, k2, k3)
- {
- this.m = m;
- this.k1 = k1;
- this.k2 = k2;
- this.k3 = k3;
- this.m_order = order;
- this.m_cofactor = cofactor;
-
- this.m_infinity = new F2mPoint(this, null, null);
- this.m_a = a;
- this.m_b = b;
- this.m_coord = F2M_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new F2mCurve(m, k1, k2, k3, m_a, m_b, m_order, m_cofactor);
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_AFFINE:
- case COORD_HOMOGENEOUS:
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- protected override ECMultiplier CreateDefaultMultiplier()
- {
- if (IsKoblitz)
- {
- return new WTauNafMultiplier();
- }
-
- return base.CreateDefaultMultiplier();
- }
-
- public override int FieldSize
- {
- get { return m; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new F2mFieldElement(this.m, this.k1, this.k2, this.k3, x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new F2mPoint(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new F2mPoint(this, x, y, zs, withCompression);
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public int M
- {
- get { return m; }
- }
-
- /**
- * Return true if curve uses a Trinomial basis.
- *
- * @return true if curve Trinomial, false otherwise.
- */
- public bool IsTrinomial()
- {
- return k2 == 0 && k3 == 0;
- }
-
- public int K1
- {
- get { return k1; }
- }
-
- public int K2
- {
- get { return k2; }
- }
-
- public int K3
- {
- get { return k3; }
- }
-
- [Obsolete("Use 'Order' property instead")]
- public BigInteger N
- {
- get { return m_order; }
- }
-
- [Obsolete("Use 'Cofactor' property instead")]
- public BigInteger H
- {
- get { return m_cofactor; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/ECFieldElement.cs b/BCCrypto/src/math/ec/ECFieldElement.cs
deleted file mode 100644
index d0e008a..0000000
--- a/BCCrypto/src/math/ec/ECFieldElement.cs
+++ /dev/null
@@ -1,928 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC
-{
- public abstract class ECFieldElement
- {
- public abstract BigInteger ToBigInteger();
- public abstract string FieldName { get; }
- public abstract int FieldSize { get; }
- public abstract ECFieldElement Add(ECFieldElement b);
- public abstract ECFieldElement AddOne();
- public abstract ECFieldElement Subtract(ECFieldElement b);
- public abstract ECFieldElement Multiply(ECFieldElement b);
- public abstract ECFieldElement Divide(ECFieldElement b);
- public abstract ECFieldElement Negate();
- public abstract ECFieldElement Square();
- public abstract ECFieldElement Invert();
- public abstract ECFieldElement Sqrt();
-
- public virtual int BitLength
- {
- get { return ToBigInteger().BitLength; }
- }
-
- public virtual bool IsOne
- {
- get { return BitLength == 1; }
- }
-
- public virtual bool IsZero
- {
- get { return 0 == ToBigInteger().SignValue; }
- }
-
- public virtual ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- return Multiply(b).Subtract(x.Multiply(y));
- }
-
- public virtual ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- return Multiply(b).Add(x.Multiply(y));
- }
-
- public virtual ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y)
- {
- return Square().Subtract(x.Multiply(y));
- }
-
- public virtual ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
- {
- return Square().Add(x.Multiply(y));
- }
-
- public virtual ECFieldElement SquarePow(int pow)
- {
- ECFieldElement r = this;
- for (int i = 0; i < pow; ++i)
- {
- r = r.Square();
- }
- return r;
- }
-
- public virtual bool TestBitZero()
- {
- return ToBigInteger().TestBit(0);
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as ECFieldElement);
- }
-
- public virtual bool Equals(ECFieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return ToBigInteger().Equals(other.ToBigInteger());
- }
-
- public override int GetHashCode()
- {
- return ToBigInteger().GetHashCode();
- }
-
- public override string ToString()
- {
- return this.ToBigInteger().ToString(16);
- }
-
- public virtual byte[] GetEncoded()
- {
- return BigIntegers.AsUnsignedByteArray((FieldSize + 7) / 8, ToBigInteger());
- }
- }
-
- public class FpFieldElement
- : ECFieldElement
- {
- private readonly BigInteger q, r, x;
-
- internal static BigInteger CalculateResidue(BigInteger p)
- {
- int bitLength = p.BitLength;
- if (bitLength >= 96)
- {
- BigInteger firstWord = p.ShiftRight(bitLength - 64);
- if (firstWord.LongValue == -1L)
- {
- return BigInteger.One.ShiftLeft(bitLength).Subtract(p);
- }
- if ((bitLength & 7) == 0)
- {
- return BigInteger.One.ShiftLeft(bitLength << 1).Divide(p).Negate();
- }
- }
- return null;
- }
-
- [Obsolete("Use ECCurve.FromBigInteger to construct field elements")]
- public FpFieldElement(BigInteger q, BigInteger x)
- : this(q, CalculateResidue(q), x)
- {
- }
-
- internal FpFieldElement(BigInteger q, BigInteger r, BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(q) >= 0)
- throw new ArgumentException("value invalid in Fp field element", "x");
-
- this.q = q;
- this.r = r;
- this.x = x;
- }
-
- public override BigInteger ToBigInteger()
- {
- return x;
- }
-
- /**
- * return the field name for this field.
- *
- * @return the string "Fp".
- */
- public override string FieldName
- {
- get { return "Fp"; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public BigInteger Q
- {
- get { return q; }
- }
-
- public override ECFieldElement Add(
- ECFieldElement b)
- {
- return new FpFieldElement(q, r, ModAdd(x, b.ToBigInteger()));
- }
-
- public override ECFieldElement AddOne()
- {
- BigInteger x2 = x.Add(BigInteger.One);
- if (x2.CompareTo(q) == 0)
- {
- x2 = BigInteger.Zero;
- }
- return new FpFieldElement(q, r, x2);
- }
-
- public override ECFieldElement Subtract(
- ECFieldElement b)
- {
- return new FpFieldElement(q, r, ModSubtract(x, b.ToBigInteger()));
- }
-
- public override ECFieldElement Multiply(
- ECFieldElement b)
- {
- return new FpFieldElement(q, r, ModMult(x, b.ToBigInteger()));
- }
-
- public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- BigInteger ax = this.x, bx = b.ToBigInteger(), xx = x.ToBigInteger(), yx = y.ToBigInteger();
- BigInteger ab = ax.Multiply(bx);
- BigInteger xy = xx.Multiply(yx);
- return new FpFieldElement(q, r, ModReduce(ab.Subtract(xy)));
- }
-
- public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- BigInteger ax = this.x, bx = b.ToBigInteger(), xx = x.ToBigInteger(), yx = y.ToBigInteger();
- BigInteger ab = ax.Multiply(bx);
- BigInteger xy = xx.Multiply(yx);
- BigInteger sum = ab.Add(xy);
- if (r != null && r.SignValue < 0 && sum.BitLength > (q.BitLength << 1))
- {
- sum = sum.Subtract(q.ShiftLeft(q.BitLength));
- }
- return new FpFieldElement(q, r, ModReduce(sum));
- }
-
- public override ECFieldElement Divide(
- ECFieldElement b)
- {
- return new FpFieldElement(q, r, ModMult(x, ModInverse(b.ToBigInteger())));
- }
-
- public override ECFieldElement Negate()
- {
- return x.SignValue == 0 ? this : new FpFieldElement(q, r, q.Subtract(x));
- }
-
- public override ECFieldElement Square()
- {
- return new FpFieldElement(q, r, ModMult(x, x));
- }
-
- public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y)
- {
- BigInteger ax = this.x, xx = x.ToBigInteger(), yx = y.ToBigInteger();
- BigInteger aa = ax.Multiply(ax);
- BigInteger xy = xx.Multiply(yx);
- return new FpFieldElement(q, r, ModReduce(aa.Subtract(xy)));
- }
-
- public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
- {
- BigInteger ax = this.x, xx = x.ToBigInteger(), yx = y.ToBigInteger();
- BigInteger aa = ax.Multiply(ax);
- BigInteger xy = xx.Multiply(yx);
- BigInteger sum = aa.Add(xy);
- if (r != null && r.SignValue < 0 && sum.BitLength > (q.BitLength << 1))
- {
- sum = sum.Subtract(q.ShiftLeft(q.BitLength));
- }
- return new FpFieldElement(q, r, ModReduce(sum));
- }
-
- public override ECFieldElement Invert()
- {
- // TODO Modular inversion can be faster for a (Generalized) Mersenne Prime.
- return new FpFieldElement(q, r, ModInverse(x));
- }
-
- /**
- * return a sqrt root - the routine verifies that the calculation
- * returns the right value - if none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- if (IsZero || IsOne)
- return this;
-
- if (!q.TestBit(0))
- throw Platform.CreateNotImplementedException("even value of q");
-
- if (q.TestBit(1)) // q == 4m + 3
- {
- BigInteger e = q.ShiftRight(2).Add(BigInteger.One);
- return CheckSqrt(new FpFieldElement(q, r, x.ModPow(e, q)));
- }
-
- if (q.TestBit(2)) // q == 8m + 5
- {
- BigInteger t1 = x.ModPow(q.ShiftRight(3), q);
- BigInteger t2 = ModMult(t1, x);
- BigInteger t3 = ModMult(t2, t1);
-
- if (t3.Equals(BigInteger.One))
- {
- return CheckSqrt(new FpFieldElement(q, r, t2));
- }
-
- // TODO This is constant and could be precomputed
- BigInteger t4 = BigInteger.Two.ModPow(q.ShiftRight(2), q);
-
- BigInteger y = ModMult(t2, t4);
-
- return CheckSqrt(new FpFieldElement(q, r, y));
- }
-
- // q == 8m + 1
-
- BigInteger legendreExponent = q.ShiftRight(1);
- if (!(x.ModPow(legendreExponent, q).Equals(BigInteger.One)))
- return null;
-
- BigInteger X = this.x;
- BigInteger fourX = ModDouble(ModDouble(X)); ;
-
- BigInteger k = legendreExponent.Add(BigInteger.One), qMinusOne = q.Subtract(BigInteger.One);
-
- BigInteger U, V;
- do
- {
- BigInteger P;
- do
- {
- P = BigInteger.Arbitrary(q.BitLength);
- }
- while (P.CompareTo(q) >= 0
- || !ModReduce(P.Multiply(P).Subtract(fourX)).ModPow(legendreExponent, q).Equals(qMinusOne));
-
- BigInteger[] result = LucasSequence(P, X, k);
- U = result[0];
- V = result[1];
-
- if (ModMult(V, V).Equals(fourX))
- {
- return new FpFieldElement(q, r, ModHalfAbs(V));
- }
- }
- while (U.Equals(BigInteger.One) || U.Equals(qMinusOne));
-
- return null;
- }
-
- private ECFieldElement CheckSqrt(ECFieldElement z)
- {
- return z.Square().Equals(this) ? z : null;
- }
-
- private BigInteger[] LucasSequence(
- BigInteger P,
- BigInteger Q,
- BigInteger k)
- {
- // TODO Research and apply "common-multiplicand multiplication here"
-
- int n = k.BitLength;
- int s = k.GetLowestSetBit();
-
- Debug.Assert(k.TestBit(s));
-
- BigInteger Uh = BigInteger.One;
- BigInteger Vl = BigInteger.Two;
- BigInteger Vh = P;
- BigInteger Ql = BigInteger.One;
- BigInteger Qh = BigInteger.One;
-
- for (int j = n - 1; j >= s + 1; --j)
- {
- Ql = ModMult(Ql, Qh);
-
- if (k.TestBit(j))
- {
- Qh = ModMult(Ql, Q);
- Uh = ModMult(Uh, Vh);
- Vl = ModReduce(Vh.Multiply(Vl).Subtract(P.Multiply(Ql)));
- Vh = ModReduce(Vh.Multiply(Vh).Subtract(Qh.ShiftLeft(1)));
- }
- else
- {
- Qh = Ql;
- Uh = ModReduce(Uh.Multiply(Vl).Subtract(Ql));
- Vh = ModReduce(Vh.Multiply(Vl).Subtract(P.Multiply(Ql)));
- Vl = ModReduce(Vl.Multiply(Vl).Subtract(Ql.ShiftLeft(1)));
- }
- }
-
- Ql = ModMult(Ql, Qh);
- Qh = ModMult(Ql, Q);
- Uh = ModReduce(Uh.Multiply(Vl).Subtract(Ql));
- Vl = ModReduce(Vh.Multiply(Vl).Subtract(P.Multiply(Ql)));
- Ql = ModMult(Ql, Qh);
-
- for (int j = 1; j <= s; ++j)
- {
- Uh = ModMult(Uh, Vl);
- Vl = ModReduce(Vl.Multiply(Vl).Subtract(Ql.ShiftLeft(1)));
- Ql = ModMult(Ql, Ql);
- }
-
- return new BigInteger[] { Uh, Vl };
- }
-
- protected virtual BigInteger ModAdd(BigInteger x1, BigInteger x2)
- {
- BigInteger x3 = x1.Add(x2);
- if (x3.CompareTo(q) >= 0)
- {
- x3 = x3.Subtract(q);
- }
- return x3;
- }
-
- protected virtual BigInteger ModDouble(BigInteger x)
- {
- BigInteger _2x = x.ShiftLeft(1);
- if (_2x.CompareTo(q) >= 0)
- {
- _2x = _2x.Subtract(q);
- }
- return _2x;
- }
-
- protected virtual BigInteger ModHalf(BigInteger x)
- {
- if (x.TestBit(0))
- {
- x = q.Add(x);
- }
- return x.ShiftRight(1);
- }
-
- protected virtual BigInteger ModHalfAbs(BigInteger x)
- {
- if (x.TestBit(0))
- {
- x = q.Subtract(x);
- }
- return x.ShiftRight(1);
- }
-
- protected virtual BigInteger ModInverse(BigInteger x)
- {
- int bits = FieldSize;
- int len = (bits + 31) >> 5;
- uint[] p = Nat.FromBigInteger(bits, q);
- uint[] n = Nat.FromBigInteger(bits, x);
- uint[] z = Nat.Create(len);
- Mod.Invert(p, n, z);
- return Nat.ToBigInteger(len, z);
- }
-
- protected virtual BigInteger ModMult(BigInteger x1, BigInteger x2)
- {
- return ModReduce(x1.Multiply(x2));
- }
-
- protected virtual BigInteger ModReduce(BigInteger x)
- {
- if (r == null)
- {
- x = x.Mod(q);
- }
- else
- {
- bool negative = x.SignValue < 0;
- if (negative)
- {
- x = x.Abs();
- }
- int qLen = q.BitLength;
- if (r.SignValue > 0)
- {
- BigInteger qMod = BigInteger.One.ShiftLeft(qLen);
- bool rIsOne = r.Equals(BigInteger.One);
- while (x.BitLength > (qLen + 1))
- {
- BigInteger u = x.ShiftRight(qLen);
- BigInteger v = x.Remainder(qMod);
- if (!rIsOne)
- {
- u = u.Multiply(r);
- }
- x = u.Add(v);
- }
- }
- else
- {
- int d = ((qLen - 1) & 31) + 1;
- BigInteger mu = r.Negate();
- BigInteger u = mu.Multiply(x.ShiftRight(qLen - d));
- BigInteger quot = u.ShiftRight(qLen + d);
- BigInteger v = quot.Multiply(q);
- BigInteger bk1 = BigInteger.One.ShiftLeft(qLen + d);
- v = v.Remainder(bk1);
- x = x.Remainder(bk1);
- x = x.Subtract(v);
- if (x.SignValue < 0)
- {
- x = x.Add(bk1);
- }
- }
- while (x.CompareTo(q) >= 0)
- {
- x = x.Subtract(q);
- }
- if (negative && x.SignValue != 0)
- {
- x = q.Subtract(x);
- }
- }
- return x;
- }
-
- protected virtual BigInteger ModSubtract(BigInteger x1, BigInteger x2)
- {
- BigInteger x3 = x1.Subtract(x2);
- if (x3.SignValue < 0)
- {
- x3 = x3.Add(q);
- }
- return x3;
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- FpFieldElement other = obj as FpFieldElement;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- public virtual bool Equals(
- FpFieldElement other)
- {
- return q.Equals(other.q) && base.Equals(other);
- }
-
- public override int GetHashCode()
- {
- return q.GetHashCode() ^ base.GetHashCode();
- }
- }
-
- /**
- * Class representing the Elements of the finite field
- * F2m in polynomial basis (PB)
- * representation. Both trinomial (Tpb) and pentanomial (Ppb) polynomial
- * basis representations are supported. Gaussian normal basis (GNB)
- * representation is not supported.
- */
- public class F2mFieldElement
- : ECFieldElement
- {
- /**
- * Indicates gaussian normal basis representation (GNB). Number chosen
- * according to X9.62. GNB is not implemented at present.
- */
- public const int Gnb = 1;
-
- /**
- * Indicates trinomial basis representation (Tpb). Number chosen
- * according to X9.62.
- */
- public const int Tpb = 2;
-
- /**
- * Indicates pentanomial basis representation (Ppb). Number chosen
- * according to X9.62.
- */
- public const int Ppb = 3;
-
- /**
- * Tpb or Ppb.
- */
- private int representation;
-
- /**
- * The exponent m of F2m .
- */
- private int m;
-
- private int[] ks;
-
- /**
- * The LongArray holding the bits.
- */
- private LongArray x;
-
- /**
- * Constructor for Ppb.
- * @param m The exponent m of
- * F2m .
- * @param k1 The integer k1 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- * @param k2 The integer k2 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- * @param k3 The integer k3 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- * @param x The BigInteger representing the value of the field element.
- */
- public F2mFieldElement(
- int m,
- int k1,
- int k2,
- int k3,
- BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.BitLength > m)
- throw new ArgumentException("value invalid in F2m field element", "x");
-
- if ((k2 == 0) && (k3 == 0))
- {
- this.representation = Tpb;
- this.ks = new int[] { k1 };
- }
- else
- {
- if (k2 >= k3)
- throw new ArgumentException("k2 must be smaller than k3");
- if (k2 <= 0)
- throw new ArgumentException("k2 must be larger than 0");
-
- this.representation = Ppb;
- this.ks = new int[] { k1, k2, k3 };
- }
-
- this.m = m;
- this.x = new LongArray(x);
- }
-
- /**
- * Constructor for Tpb.
- * @param m The exponent m of
- * F2m .
- * @param k The integer k where xm +
- * xk + 1 represents the reduction
- * polynomial f(z).
- * @param x The BigInteger representing the value of the field element.
- */
- public F2mFieldElement(
- int m,
- int k,
- BigInteger x)
- : this(m, k, 0, 0, x)
- {
- // Set k1 to k, and set k2 and k3 to 0
- }
-
- private F2mFieldElement(int m, int[] ks, LongArray x)
- {
- this.m = m;
- this.representation = (ks.Length == 1) ? Tpb : Ppb;
- this.ks = ks;
- this.x = x;
- }
-
- public override int BitLength
- {
- get { return x.Degree(); }
- }
-
- public override bool IsOne
- {
- get { return x.IsOne(); }
- }
-
- public override bool IsZero
- {
- get { return x.IsZero(); }
- }
-
- public override bool TestBitZero()
- {
- return x.TestBitZero();
- }
-
- public override BigInteger ToBigInteger()
- {
- return x.ToBigInteger();
- }
-
- public override string FieldName
- {
- get { return "F2m"; }
- }
-
- public override int FieldSize
- {
- get { return m; }
- }
-
- /**
- * Checks, if the ECFieldElements a and b
- * are elements of the same field F2m
- * (having the same representation).
- * @param a field element.
- * @param b field element to be compared.
- * @throws ArgumentException if a and b
- * are not elements of the same field
- * F2m (having the same
- * representation).
- */
- public static void CheckFieldElements(
- ECFieldElement a,
- ECFieldElement b)
- {
- if (!(a is F2mFieldElement) || !(b is F2mFieldElement))
- {
- throw new ArgumentException("Field elements are not "
- + "both instances of F2mFieldElement");
- }
-
- F2mFieldElement aF2m = (F2mFieldElement)a;
- F2mFieldElement bF2m = (F2mFieldElement)b;
-
- if (aF2m.representation != bF2m.representation)
- {
- // Should never occur
- throw new ArgumentException("One of the F2m field elements has incorrect representation");
- }
-
- if ((aF2m.m != bF2m.m) || !Arrays.AreEqual(aF2m.ks, bF2m.ks))
- {
- throw new ArgumentException("Field elements are not elements of the same field F2m");
- }
- }
-
- public override ECFieldElement Add(
- ECFieldElement b)
- {
- // No check performed here for performance reasons. Instead the
- // elements involved are checked in ECPoint.F2m
- // checkFieldElements(this, b);
- LongArray iarrClone = this.x.Copy();
- F2mFieldElement bF2m = (F2mFieldElement)b;
- iarrClone.AddShiftedByWords(bF2m.x, 0);
- return new F2mFieldElement(m, ks, iarrClone);
- }
-
- public override ECFieldElement AddOne()
- {
- return new F2mFieldElement(m, ks, x.AddOne());
- }
-
- public override ECFieldElement Subtract(
- ECFieldElement b)
- {
- // Addition and subtraction are the same in F2m
- return Add(b);
- }
-
- public override ECFieldElement Multiply(
- ECFieldElement b)
- {
- // Right-to-left comb multiplication in the LongArray
- // Input: Binary polynomials a(z) and b(z) of degree at most m-1
- // Output: c(z) = a(z) * b(z) mod f(z)
-
- // No check performed here for performance reasons. Instead the
- // elements involved are checked in ECPoint.F2m
- // checkFieldElements(this, b);
- return new F2mFieldElement(m, ks, x.ModMultiply(((F2mFieldElement)b).x, m, ks));
- }
-
- public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- return MultiplyPlusProduct(b, x, y);
- }
-
- public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- LongArray ax = this.x, bx = ((F2mFieldElement)b).x, xx = ((F2mFieldElement)x).x, yx = ((F2mFieldElement)y).x;
-
- LongArray ab = ax.Multiply(bx, m, ks);
- LongArray xy = xx.Multiply(yx, m, ks);
-
- if (ab == ax || ab == bx)
- {
- ab = (LongArray)ab.Copy();
- }
-
- ab.AddShiftedByWords(xy, 0);
- ab.Reduce(m, ks);
-
- return new F2mFieldElement(m, ks, ab);
- }
-
- public override ECFieldElement Divide(
- ECFieldElement b)
- {
- // There may be more efficient implementations
- ECFieldElement bInv = b.Invert();
- return Multiply(bInv);
- }
-
- public override ECFieldElement Negate()
- {
- // -x == x holds for all x in F2m
- return this;
- }
-
- public override ECFieldElement Square()
- {
- return new F2mFieldElement(m, ks, x.ModSquare(m, ks));
- }
-
- public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y)
- {
- return SquarePlusProduct(x, y);
- }
-
- public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
- {
- LongArray ax = this.x, xx = ((F2mFieldElement)x).x, yx = ((F2mFieldElement)y).x;
-
- LongArray aa = ax.Square(m, ks);
- LongArray xy = xx.Multiply(yx, m, ks);
-
- if (aa == ax)
- {
- aa = (LongArray)aa.Copy();
- }
-
- aa.AddShiftedByWords(xy, 0);
- aa.Reduce(m, ks);
-
- return new F2mFieldElement(m, ks, aa);
- }
-
- public override ECFieldElement SquarePow(int pow)
- {
- return pow < 1 ? this : new F2mFieldElement(m, ks, x.ModSquareN(pow, m, ks));
- }
-
- public override ECFieldElement Invert()
- {
- return new F2mFieldElement(this.m, this.ks, this.x.ModInverse(m, ks));
- }
-
- public override ECFieldElement Sqrt()
- {
- return (x.IsZero() || x.IsOne()) ? this : SquarePow(m - 1);
- }
-
- /**
- * @return the representation of the field
- * F2m , either of
- * {@link F2mFieldElement.Tpb} (trinomial
- * basis representation) or
- * {@link F2mFieldElement.Ppb} (pentanomial
- * basis representation).
- */
- public int Representation
- {
- get { return this.representation; }
- }
-
- /**
- * @return the degree m of the reduction polynomial
- * f(z).
- */
- public int M
- {
- get { return this.m; }
- }
-
- /**
- * @return Tpb: The integer k where xm +
- * xk + 1 represents the reduction polynomial
- * f(z).
- * Ppb: The integer k1 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- */
- public int K1
- {
- get { return this.ks[0]; }
- }
-
- /**
- * @return Tpb: Always returns 0
- * Ppb: The integer k2 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- */
- public int K2
- {
- get { return this.ks.Length >= 2 ? this.ks[1] : 0; }
- }
-
- /**
- * @return Tpb: Always set to 0
- * Ppb: The integer k3 where xm +
- * xk3 + xk2 + xk1 + 1
- * represents the reduction polynomial f(z).
- */
- public int K3
- {
- get { return this.ks.Length >= 3 ? this.ks[2] : 0; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- F2mFieldElement other = obj as F2mFieldElement;
-
- if (other == null)
- return false;
-
- return Equals(other);
- }
-
- public virtual bool Equals(
- F2mFieldElement other)
- {
- return ((this.m == other.m)
- && (this.representation == other.representation)
- && Arrays.AreEqual(this.ks, other.ks)
- && (this.x.Equals(other.x)));
- }
-
- public override int GetHashCode()
- {
- return x.GetHashCode() ^ m ^ Arrays.GetHashCode(ks);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/ECPoint.cs b/BCCrypto/src/math/ec/ECPoint.cs
deleted file mode 100644
index a5ba515..0000000
--- a/BCCrypto/src/math/ec/ECPoint.cs
+++ /dev/null
@@ -1,2064 +0,0 @@
-using System;
-using System.Collections;
-using System.Diagnostics;
-using System.Text;
-
-using Org.BouncyCastle.Math.EC.Multiplier;
-
-namespace Org.BouncyCastle.Math.EC
-{
- /**
- * base class for points on elliptic curves.
- */
- public abstract class ECPoint
- {
- protected static ECFieldElement[] EMPTY_ZS = new ECFieldElement[0];
-
- protected static ECFieldElement[] GetInitialZCoords(ECCurve curve)
- {
- // Cope with null curve, most commonly used by implicitlyCa
- int coord = null == curve ? ECCurve.COORD_AFFINE : curve.CoordinateSystem;
-
- switch (coord)
- {
- case ECCurve.COORD_AFFINE:
- case ECCurve.COORD_LAMBDA_AFFINE:
- return EMPTY_ZS;
- default:
- break;
- }
-
- ECFieldElement one = curve.FromBigInteger(BigInteger.One);
-
- switch (coord)
- {
- case ECCurve.COORD_HOMOGENEOUS:
- case ECCurve.COORD_JACOBIAN:
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- return new ECFieldElement[] { one };
- case ECCurve.COORD_JACOBIAN_CHUDNOVSKY:
- return new ECFieldElement[] { one, one, one };
- case ECCurve.COORD_JACOBIAN_MODIFIED:
- return new ECFieldElement[] { one, curve.A };
- default:
- throw new ArgumentException("unknown coordinate system");
- }
- }
-
- protected internal readonly ECCurve m_curve;
- protected internal readonly ECFieldElement m_x, m_y;
- protected internal readonly ECFieldElement[] m_zs;
- protected internal readonly bool m_withCompression;
-
- // Dictionary is (string -> PreCompInfo)
- protected internal IDictionary m_preCompTable = null;
-
- protected ECPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : this(curve, x, y, GetInitialZCoords(curve), withCompression)
- {
- }
-
- internal ECPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- this.m_curve = curve;
- this.m_x = x;
- this.m_y = y;
- this.m_zs = zs;
- this.m_withCompression = withCompression;
- }
-
- protected internal bool SatisfiesCofactor()
- {
- BigInteger h = Curve.Cofactor;
- return h == null || h.Equals(BigInteger.One) || !ECAlgorithms.ReferenceMultiply(this, h).IsInfinity;
- }
-
- protected abstract bool SatisfiesCurveEquation();
-
- public ECPoint GetDetachedPoint()
- {
- return Normalize().Detach();
- }
-
- public virtual ECCurve Curve
- {
- get { return m_curve; }
- }
-
- protected abstract ECPoint Detach();
-
- protected virtual int CurveCoordinateSystem
- {
- get
- {
- // Cope with null curve, most commonly used by implicitlyCa
- return null == m_curve ? ECCurve.COORD_AFFINE : m_curve.CoordinateSystem;
- }
- }
-
- /**
- * Normalizes this point, and then returns the affine x-coordinate.
- *
- * Note: normalization can be expensive, this method is deprecated in favour
- * of caller-controlled normalization.
- */
- [Obsolete("Use AffineXCoord, or Normalize() and XCoord, instead")]
- public virtual ECFieldElement X
- {
- get { return Normalize().XCoord; }
- }
-
- /**
- * Normalizes this point, and then returns the affine y-coordinate.
- *
- * Note: normalization can be expensive, this method is deprecated in favour
- * of caller-controlled normalization.
- */
- [Obsolete("Use AffineYCoord, or Normalize() and YCoord, instead")]
- public virtual ECFieldElement Y
- {
- get { return Normalize().YCoord; }
- }
-
- /**
- * Returns the affine x-coordinate after checking that this point is normalized.
- *
- * @return The affine x-coordinate of this point
- * @throws IllegalStateException if the point is not normalized
- */
- public virtual ECFieldElement AffineXCoord
- {
- get
- {
- CheckNormalized();
- return XCoord;
- }
- }
-
- /**
- * Returns the affine y-coordinate after checking that this point is normalized
- *
- * @return The affine y-coordinate of this point
- * @throws IllegalStateException if the point is not normalized
- */
- public virtual ECFieldElement AffineYCoord
- {
- get
- {
- CheckNormalized();
- return YCoord;
- }
- }
-
- /**
- * Returns the x-coordinate.
- *
- * Caution: depending on the curve's coordinate system, this may not be the same value as in an
- * affine coordinate system; use Normalize() to get a point where the coordinates have their
- * affine values, or use AffineXCoord if you expect the point to already have been normalized.
- *
- * @return the x-coordinate of this point
- */
- public virtual ECFieldElement XCoord
- {
- get { return m_x; }
- }
-
- /**
- * Returns the y-coordinate.
- *
- * Caution: depending on the curve's coordinate system, this may not be the same value as in an
- * affine coordinate system; use Normalize() to get a point where the coordinates have their
- * affine values, or use AffineYCoord if you expect the point to already have been normalized.
- *
- * @return the y-coordinate of this point
- */
- public virtual ECFieldElement YCoord
- {
- get { return m_y; }
- }
-
- public virtual ECFieldElement GetZCoord(int index)
- {
- return (index < 0 || index >= m_zs.Length) ? null : m_zs[index];
- }
-
- public virtual ECFieldElement[] GetZCoords()
- {
- int zsLen = m_zs.Length;
- if (zsLen == 0)
- {
- return m_zs;
- }
- ECFieldElement[] copy = new ECFieldElement[zsLen];
- Array.Copy(m_zs, 0, copy, 0, zsLen);
- return copy;
- }
-
- protected internal ECFieldElement RawXCoord
- {
- get { return m_x; }
- }
-
- protected internal ECFieldElement RawYCoord
- {
- get { return m_y; }
- }
-
- protected internal ECFieldElement[] RawZCoords
- {
- get { return m_zs; }
- }
-
- protected virtual void CheckNormalized()
- {
- if (!IsNormalized())
- throw new InvalidOperationException("point not in normal form");
- }
-
- public virtual bool IsNormalized()
- {
- int coord = this.CurveCoordinateSystem;
-
- return coord == ECCurve.COORD_AFFINE
- || coord == ECCurve.COORD_LAMBDA_AFFINE
- || IsInfinity
- || RawZCoords[0].IsOne;
- }
-
- /**
- * Normalization ensures that any projective coordinate is 1, and therefore that the x, y
- * coordinates reflect those of the equivalent point in an affine coordinate system.
- *
- * @return a new ECPoint instance representing the same point, but with normalized coordinates
- */
- public virtual ECPoint Normalize()
- {
- if (this.IsInfinity)
- {
- return this;
- }
-
- switch (this.CurveCoordinateSystem)
- {
- case ECCurve.COORD_AFFINE:
- case ECCurve.COORD_LAMBDA_AFFINE:
- {
- return this;
- }
- default:
- {
- ECFieldElement Z1 = RawZCoords[0];
- if (Z1.IsOne)
- {
- return this;
- }
-
- return Normalize(Z1.Invert());
- }
- }
- }
-
- internal virtual ECPoint Normalize(ECFieldElement zInv)
- {
- switch (this.CurveCoordinateSystem)
- {
- case ECCurve.COORD_HOMOGENEOUS:
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- {
- return CreateScaledPoint(zInv, zInv);
- }
- case ECCurve.COORD_JACOBIAN:
- case ECCurve.COORD_JACOBIAN_CHUDNOVSKY:
- case ECCurve.COORD_JACOBIAN_MODIFIED:
- {
- ECFieldElement zInv2 = zInv.Square(), zInv3 = zInv2.Multiply(zInv);
- return CreateScaledPoint(zInv2, zInv3);
- }
- default:
- {
- throw new InvalidOperationException("not a projective coordinate system");
- }
- }
- }
-
- protected virtual ECPoint CreateScaledPoint(ECFieldElement sx, ECFieldElement sy)
- {
- return Curve.CreateRawPoint(RawXCoord.Multiply(sx), RawYCoord.Multiply(sy), IsCompressed);
- }
-
- public bool IsInfinity
- {
- get { return m_x == null && m_y == null; }
- }
-
- public bool IsCompressed
- {
- get { return m_withCompression; }
- }
-
- public bool IsValid()
- {
- if (IsInfinity)
- return true;
-
- // TODO Sanity-check the field elements
-
- ECCurve curve = Curve;
- if (curve != null)
- {
- if (!SatisfiesCurveEquation())
- return false;
-
- if (!SatisfiesCofactor())
- return false;
- }
-
- return true;
- }
-
- public virtual ECPoint ScaleX(ECFieldElement scale)
- {
- return IsInfinity
- ? this
- : Curve.CreateRawPoint(RawXCoord.Multiply(scale), RawYCoord, RawZCoords, IsCompressed);
- }
-
- public virtual ECPoint ScaleY(ECFieldElement scale)
- {
- return IsInfinity
- ? this
- : Curve.CreateRawPoint(RawXCoord, RawYCoord.Multiply(scale), RawZCoords, IsCompressed);
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as ECPoint);
- }
-
- public virtual bool Equals(ECPoint other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
-
- ECCurve c1 = this.Curve, c2 = other.Curve;
- bool n1 = (null == c1), n2 = (null == c2);
- bool i1 = IsInfinity, i2 = other.IsInfinity;
-
- if (i1 || i2)
- {
- return (i1 && i2) && (n1 || n2 || c1.Equals(c2));
- }
-
- ECPoint p1 = this, p2 = other;
- if (n1 && n2)
- {
- // Points with null curve are in affine form, so already normalized
- }
- else if (n1)
- {
- p2 = p2.Normalize();
- }
- else if (n2)
- {
- p1 = p1.Normalize();
- }
- else if (!c1.Equals(c2))
- {
- return false;
- }
- else
- {
- // TODO Consider just requiring already normalized, to avoid silent performance degradation
-
- ECPoint[] points = new ECPoint[] { this, c1.ImportPoint(p2) };
-
- // TODO This is a little strong, really only requires coZNormalizeAll to get Zs equal
- c1.NormalizeAll(points);
-
- p1 = points[0];
- p2 = points[1];
- }
-
- return p1.XCoord.Equals(p2.XCoord) && p1.YCoord.Equals(p2.YCoord);
- }
-
- public override int GetHashCode()
- {
- ECCurve c = this.Curve;
- int hc = (null == c) ? 0 : ~c.GetHashCode();
-
- if (!this.IsInfinity)
- {
- // TODO Consider just requiring already normalized, to avoid silent performance degradation
-
- ECPoint p = Normalize();
-
- hc ^= p.XCoord.GetHashCode() * 17;
- hc ^= p.YCoord.GetHashCode() * 257;
- }
-
- return hc;
- }
-
- public override string ToString()
- {
- if (this.IsInfinity)
- {
- return "INF";
- }
-
- StringBuilder sb = new StringBuilder();
- sb.Append('(');
- sb.Append(RawXCoord);
- sb.Append(',');
- sb.Append(RawYCoord);
- for (int i = 0; i < m_zs.Length; ++i)
- {
- sb.Append(',');
- sb.Append(m_zs[i]);
- }
- sb.Append(')');
- return sb.ToString();
- }
-
- public virtual byte[] GetEncoded()
- {
- return GetEncoded(m_withCompression);
- }
-
- public abstract byte[] GetEncoded(bool compressed);
-
- protected internal abstract bool CompressionYTilde { get; }
-
- public abstract ECPoint Add(ECPoint b);
- public abstract ECPoint Subtract(ECPoint b);
- public abstract ECPoint Negate();
-
- public virtual ECPoint TimesPow2(int e)
- {
- if (e < 0)
- throw new ArgumentException("cannot be negative", "e");
-
- ECPoint p = this;
- while (--e >= 0)
- {
- p = p.Twice();
- }
- return p;
- }
-
- public abstract ECPoint Twice();
- public abstract ECPoint Multiply(BigInteger b);
-
- public virtual ECPoint TwicePlus(ECPoint b)
- {
- return Twice().Add(b);
- }
-
- public virtual ECPoint ThreeTimes()
- {
- return TwicePlus(this);
- }
- }
-
- public abstract class ECPointBase
- : ECPoint
- {
- protected internal ECPointBase(
- ECCurve curve,
- ECFieldElement x,
- ECFieldElement y,
- bool withCompression)
- : base(curve, x, y, withCompression)
- {
- }
-
- protected internal ECPointBase(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- /**
- * return the field element encoded with point compression. (S 4.3.6)
- */
- public override byte[] GetEncoded(bool compressed)
- {
- if (this.IsInfinity)
- {
- return new byte[1];
- }
-
- ECPoint normed = Normalize();
-
- byte[] X = normed.XCoord.GetEncoded();
-
- if (compressed)
- {
- byte[] PO = new byte[X.Length + 1];
- PO[0] = (byte)(normed.CompressionYTilde ? 0x03 : 0x02);
- Array.Copy(X, 0, PO, 1, X.Length);
- return PO;
- }
-
- byte[] Y = normed.YCoord.GetEncoded();
-
- {
- byte[] PO = new byte[X.Length + Y.Length + 1];
- PO[0] = 0x04;
- Array.Copy(X, 0, PO, 1, X.Length);
- Array.Copy(Y, 0, PO, X.Length + 1, Y.Length);
- return PO;
- }
- }
-
- /**
- * Multiplies this ECPoint by the given number.
- * @param k The multiplicator.
- * @return k * this.
- */
- public override ECPoint Multiply(BigInteger k)
- {
- return this.Curve.GetMultiplier().Multiply(this, k);
- }
- }
-
- public abstract class AbstractFpPoint
- : ECPointBase
- {
- protected AbstractFpPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- }
-
- protected AbstractFpPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected internal override bool CompressionYTilde
- {
- get { return this.AffineYCoord.TestBitZero(); }
- }
-
- protected override bool SatisfiesCurveEquation()
- {
- ECFieldElement X = this.RawXCoord, Y = this.RawYCoord, A = Curve.A, B = Curve.B;
- ECFieldElement lhs = Y.Square();
-
- switch (CurveCoordinateSystem)
- {
- case ECCurve.COORD_AFFINE:
- break;
- case ECCurve.COORD_HOMOGENEOUS:
- {
- ECFieldElement Z = this.RawZCoords[0];
- if (!Z.IsOne)
- {
- ECFieldElement Z2 = Z.Square(), Z3 = Z.Multiply(Z2);
- lhs = lhs.Multiply(Z);
- A = A.Multiply(Z2);
- B = B.Multiply(Z3);
- }
- break;
- }
- case ECCurve.COORD_JACOBIAN:
- case ECCurve.COORD_JACOBIAN_CHUDNOVSKY:
- case ECCurve.COORD_JACOBIAN_MODIFIED:
- {
- ECFieldElement Z = this.RawZCoords[0];
- if (!Z.IsOne)
- {
- ECFieldElement Z2 = Z.Square(), Z4 = Z2.Square(), Z6 = Z2.Multiply(Z4);
- A = A.Multiply(Z4);
- B = B.Multiply(Z6);
- }
- break;
- }
- default:
- throw new InvalidOperationException("unsupported coordinate system");
- }
-
- ECFieldElement rhs = X.Square().Add(A).Multiply(X).Add(B);
- return lhs.Equals(rhs);
- }
-
- public override ECPoint Subtract(ECPoint b)
- {
- if (b.IsInfinity)
- return this;
-
- // Add -b
- return Add(b.Negate());
- }
- }
-
- /**
- * Elliptic curve points over Fp
- */
- public class FpPoint
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes without point compression.
- *
- * @param curve the curve to use
- * @param x affine x co-ordinate
- * @param y affine y co-ordinate
- */
- public FpPoint(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compression.
- *
- * @param curve the curve to use
- * @param x affine x co-ordinate
- * @param y affine y co-ordinate
- * @param withCompression if true encode with point compression
- */
- public FpPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal FpPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new FpPoint(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement GetZCoord(int index)
- {
- if (index == 1 && ECCurve.COORD_JACOBIAN_MODIFIED == this.CurveCoordinateSystem)
- {
- return GetJacobianModifiedW();
- }
-
- return base.GetZCoord(index);
- }
-
- // B.3 pg 62
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
- int coord = curve.CoordinateSystem;
-
- ECFieldElement X1 = this.RawXCoord, Y1 = this.RawYCoord;
- ECFieldElement X2 = b.RawXCoord, Y2 = b.RawYCoord;
-
- switch (coord)
- {
- case ECCurve.COORD_AFFINE:
- {
- ECFieldElement dx = X2.Subtract(X1), dy = Y2.Subtract(Y1);
-
- if (dx.IsZero)
- {
- if (dy.IsZero)
- {
- // this == b, i.e. this must be doubled
- return Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return Curve.Infinity;
- }
-
- ECFieldElement gamma = dy.Divide(dx);
- ECFieldElement X3 = gamma.Square().Subtract(X1).Subtract(X2);
- ECFieldElement Y3 = gamma.Multiply(X1.Subtract(X3)).Subtract(Y1);
-
- return new FpPoint(Curve, X3, Y3, IsCompressed);
- }
-
- case ECCurve.COORD_HOMOGENEOUS:
- {
- ECFieldElement Z1 = this.RawZCoords[0];
- ECFieldElement Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- bool Z2IsOne = Z2.IsOne;
-
- ECFieldElement u1 = Z1IsOne ? Y2 : Y2.Multiply(Z1);
- ECFieldElement u2 = Z2IsOne ? Y1 : Y1.Multiply(Z2);
- ECFieldElement u = u1.Subtract(u2);
- ECFieldElement v1 = Z1IsOne ? X2 : X2.Multiply(Z1);
- ECFieldElement v2 = Z2IsOne ? X1 : X1.Multiply(Z2);
- ECFieldElement v = v1.Subtract(v2);
-
- // Check if b == this or b == -this
- if (v.IsZero)
- {
- if (u.IsZero)
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- // TODO Optimize for when w == 1
- ECFieldElement w = Z1IsOne ? Z2 : Z2IsOne ? Z1 : Z1.Multiply(Z2);
- ECFieldElement vSquared = v.Square();
- ECFieldElement vCubed = vSquared.Multiply(v);
- ECFieldElement vSquaredV2 = vSquared.Multiply(v2);
- ECFieldElement A = u.Square().Multiply(w).Subtract(vCubed).Subtract(Two(vSquaredV2));
-
- ECFieldElement X3 = v.Multiply(A);
- ECFieldElement Y3 = vSquaredV2.Subtract(A).MultiplyMinusProduct(u, u2, vCubed);
- ECFieldElement Z3 = vCubed.Multiply(w);
-
- return new FpPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- case ECCurve.COORD_JACOBIAN:
- case ECCurve.COORD_JACOBIAN_MODIFIED:
- {
- ECFieldElement Z1 = this.RawZCoords[0];
- ECFieldElement Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
-
- ECFieldElement X3, Y3, Z3, Z3Squared = null;
-
- if (!Z1IsOne && Z1.Equals(Z2))
- {
- // TODO Make this available as public method coZAdd?
-
- ECFieldElement dx = X1.Subtract(X2), dy = Y1.Subtract(Y2);
- if (dx.IsZero)
- {
- if (dy.IsZero)
- {
- return Twice();
- }
- return curve.Infinity;
- }
-
- ECFieldElement C = dx.Square();
- ECFieldElement W1 = X1.Multiply(C), W2 = X2.Multiply(C);
- ECFieldElement A1 = W1.Subtract(W2).Multiply(Y1);
-
- X3 = dy.Square().Subtract(W1).Subtract(W2);
- Y3 = W1.Subtract(X3).Multiply(dy).Subtract(A1);
- Z3 = dx;
-
- if (Z1IsOne)
- {
- Z3Squared = C;
- }
- else
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
- else
- {
- ECFieldElement Z1Squared, U2, S2;
- if (Z1IsOne)
- {
- Z1Squared = Z1; U2 = X2; S2 = Y2;
- }
- else
- {
- Z1Squared = Z1.Square();
- U2 = Z1Squared.Multiply(X2);
- ECFieldElement Z1Cubed = Z1Squared.Multiply(Z1);
- S2 = Z1Cubed.Multiply(Y2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement Z2Squared, U1, S1;
- if (Z2IsOne)
- {
- Z2Squared = Z2; U1 = X1; S1 = Y1;
- }
- else
- {
- Z2Squared = Z2.Square();
- U1 = Z2Squared.Multiply(X1);
- ECFieldElement Z2Cubed = Z2Squared.Multiply(Z2);
- S1 = Z2Cubed.Multiply(Y1);
- }
-
- ECFieldElement H = U1.Subtract(U2);
- ECFieldElement R = S1.Subtract(S2);
-
- // Check if b == this or b == -this
- if (H.IsZero)
- {
- if (R.IsZero)
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- ECFieldElement HSquared = H.Square();
- ECFieldElement G = HSquared.Multiply(H);
- ECFieldElement V = HSquared.Multiply(U1);
-
- X3 = R.Square().Add(G).Subtract(Two(V));
- Y3 = V.Subtract(X3).MultiplyMinusProduct(R, G, S1);
-
- Z3 = H;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- if (!Z2IsOne)
- {
- Z3 = Z3.Multiply(Z2);
- }
-
- // Alternative calculation of Z3 using fast square
- //X3 = four(X3);
- //Y3 = eight(Y3);
- //Z3 = doubleProductFromSquares(Z1, Z2, Z1Squared, Z2Squared).Multiply(H);
-
- if (Z3 == H)
- {
- Z3Squared = HSquared;
- }
- }
-
- ECFieldElement[] zs;
- if (coord == ECCurve.COORD_JACOBIAN_MODIFIED)
- {
- // TODO If the result will only be used in a subsequent addition, we don't need W3
- ECFieldElement W3 = CalculateJacobianModifiedW(Z3, Z3Squared);
-
- zs = new ECFieldElement[] { Z3, W3 };
- }
- else
- {
- zs = new ECFieldElement[] { Z3 };
- }
-
- return new FpPoint(curve, X3, Y3, zs, IsCompressed);
- }
-
- default:
- {
- throw new InvalidOperationException("unsupported coordinate system");
- }
- }
- }
-
- // B.3 pg 62
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- int coord = curve.CoordinateSystem;
-
- ECFieldElement X1 = this.RawXCoord;
-
- switch (coord)
- {
- case ECCurve.COORD_AFFINE:
- {
- ECFieldElement X1Squared = X1.Square();
- ECFieldElement gamma = Three(X1Squared).Add(this.Curve.A).Divide(Two(Y1));
- ECFieldElement X3 = gamma.Square().Subtract(Two(X1));
- ECFieldElement Y3 = gamma.Multiply(X1.Subtract(X3)).Subtract(Y1);
-
- return new FpPoint(Curve, X3, Y3, IsCompressed);
- }
-
- case ECCurve.COORD_HOMOGENEOUS:
- {
- ECFieldElement Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
-
- // TODO Optimize for small negative a4 and -3
- ECFieldElement w = curve.A;
- if (!w.IsZero && !Z1IsOne)
- {
- w = w.Multiply(Z1.Square());
- }
- w = w.Add(Three(X1.Square()));
-
- ECFieldElement s = Z1IsOne ? Y1 : Y1.Multiply(Z1);
- ECFieldElement t = Z1IsOne ? Y1.Square() : s.Multiply(Y1);
- ECFieldElement B = X1.Multiply(t);
- ECFieldElement _4B = Four(B);
- ECFieldElement h = w.Square().Subtract(Two(_4B));
-
- ECFieldElement _2s = Two(s);
- ECFieldElement X3 = h.Multiply(_2s);
- ECFieldElement _2t = Two(t);
- ECFieldElement Y3 = _4B.Subtract(h).Multiply(w).Subtract(Two(_2t.Square()));
- ECFieldElement _4sSquared = Z1IsOne ? Two(_2t) : _2s.Square();
- ECFieldElement Z3 = Two(_4sSquared).Multiply(s);
-
- return new FpPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- case ECCurve.COORD_JACOBIAN:
- {
- ECFieldElement Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
-
- ECFieldElement Y1Squared = Y1.Square();
- ECFieldElement T = Y1Squared.Square();
-
- ECFieldElement a4 = curve.A;
- ECFieldElement a4Neg = a4.Negate();
-
- ECFieldElement M, S;
- if (a4Neg.ToBigInteger().Equals(BigInteger.ValueOf(3)))
- {
- ECFieldElement Z1Squared = Z1IsOne ? Z1 : Z1.Square();
- M = Three(X1.Add(Z1Squared).Multiply(X1.Subtract(Z1Squared)));
- S = Four(Y1Squared.Multiply(X1));
- }
- else
- {
- ECFieldElement X1Squared = X1.Square();
- M = Three(X1Squared);
- if (Z1IsOne)
- {
- M = M.Add(a4);
- }
- else if (!a4.IsZero)
- {
- ECFieldElement Z1Squared = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement Z1Pow4 = Z1Squared.Square();
- if (a4Neg.BitLength < a4.BitLength)
- {
- M = M.Subtract(Z1Pow4.Multiply(a4Neg));
- }
- else
- {
- M = M.Add(Z1Pow4.Multiply(a4));
- }
- }
- //S = two(doubleProductFromSquares(X1, Y1Squared, X1Squared, T));
- S = Four(X1.Multiply(Y1Squared));
- }
-
- ECFieldElement X3 = M.Square().Subtract(Two(S));
- ECFieldElement Y3 = S.Subtract(X3).Multiply(M).Subtract(Eight(T));
-
- ECFieldElement Z3 = Two(Y1);
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
-
- // Alternative calculation of Z3 using fast square
- //ECFieldElement Z3 = doubleProductFromSquares(Y1, Z1, Y1Squared, Z1Squared);
-
- return new FpPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- case ECCurve.COORD_JACOBIAN_MODIFIED:
- {
- return TwiceJacobianModified(true);
- }
-
- default:
- {
- throw new InvalidOperationException("unsupported coordinate system");
- }
- }
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- ECCurve curve = this.Curve;
- int coord = curve.CoordinateSystem;
-
- switch (coord)
- {
- case ECCurve.COORD_AFFINE:
- {
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord, Y2 = b.RawYCoord;
-
- ECFieldElement dx = X2.Subtract(X1), dy = Y2.Subtract(Y1);
-
- if (dx.IsZero)
- {
- if (dy.IsZero)
- {
- // this == b i.e. the result is 3P
- return ThreeTimes();
- }
-
- // this == -b, i.e. the result is P
- return this;
- }
-
- /*
- * Optimized calculation of 2P + Q, as described in "Trading Inversions for
- * Multiplications in Elliptic Curve Cryptography", by Ciet, Joye, Lauter, Montgomery.
- */
-
- ECFieldElement X = dx.Square(), Y = dy.Square();
- ECFieldElement d = X.Multiply(Two(X1).Add(X2)).Subtract(Y);
- if (d.IsZero)
- {
- return Curve.Infinity;
- }
-
- ECFieldElement D = d.Multiply(dx);
- ECFieldElement I = D.Invert();
- ECFieldElement L1 = d.Multiply(I).Multiply(dy);
- ECFieldElement L2 = Two(Y1).Multiply(X).Multiply(dx).Multiply(I).Subtract(L1);
- ECFieldElement X4 = (L2.Subtract(L1)).Multiply(L1.Add(L2)).Add(X2);
- ECFieldElement Y4 = (X1.Subtract(X4)).Multiply(L2).Subtract(Y1);
-
- return new FpPoint(Curve, X4, Y4, IsCompressed);
- }
- case ECCurve.COORD_JACOBIAN_MODIFIED:
- {
- return TwiceJacobianModified(false).Add(b);
- }
- default:
- {
- return Twice().Add(b);
- }
- }
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return this;
-
- ECCurve curve = this.Curve;
- int coord = curve.CoordinateSystem;
-
- switch (coord)
- {
- case ECCurve.COORD_AFFINE:
- {
- ECFieldElement X1 = this.RawXCoord;
-
- ECFieldElement _2Y1 = Two(Y1);
- ECFieldElement X = _2Y1.Square();
- ECFieldElement Z = Three(X1.Square()).Add(Curve.A);
- ECFieldElement Y = Z.Square();
-
- ECFieldElement d = Three(X1).Multiply(X).Subtract(Y);
- if (d.IsZero)
- {
- return Curve.Infinity;
- }
-
- ECFieldElement D = d.Multiply(_2Y1);
- ECFieldElement I = D.Invert();
- ECFieldElement L1 = d.Multiply(I).Multiply(Z);
- ECFieldElement L2 = X.Square().Multiply(I).Subtract(L1);
-
- ECFieldElement X4 = (L2.Subtract(L1)).Multiply(L1.Add(L2)).Add(X1);
- ECFieldElement Y4 = (X1.Subtract(X4)).Multiply(L2).Subtract(Y1);
- return new FpPoint(Curve, X4, Y4, IsCompressed);
- }
- case ECCurve.COORD_JACOBIAN_MODIFIED:
- {
- return TwiceJacobianModified(false).Add(this);
- }
- default:
- {
- // NOTE: Be careful about recursions between TwicePlus and ThreeTimes
- return Twice().Add(this);
- }
- }
- }
-
- public override ECPoint TimesPow2(int e)
- {
- if (e < 0)
- throw new ArgumentException("cannot be negative", "e");
- if (e == 0 || this.IsInfinity)
- return this;
- if (e == 1)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- int coord = curve.CoordinateSystem;
-
- ECFieldElement W1 = curve.A;
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement Z1 = this.RawZCoords.Length < 1 ? curve.FromBigInteger(BigInteger.One) : this.RawZCoords[0];
-
- if (!Z1.IsOne)
- {
- switch (coord)
- {
- case ECCurve.COORD_HOMOGENEOUS:
- ECFieldElement Z1Sq = Z1.Square();
- X1 = X1.Multiply(Z1);
- Y1 = Y1.Multiply(Z1Sq);
- W1 = CalculateJacobianModifiedW(Z1, Z1Sq);
- break;
- case ECCurve.COORD_JACOBIAN:
- W1 = CalculateJacobianModifiedW(Z1, null);
- break;
- case ECCurve.COORD_JACOBIAN_MODIFIED:
- W1 = GetJacobianModifiedW();
- break;
- }
- }
-
- for (int i = 0; i < e; ++i)
- {
- if (Y1.IsZero)
- return curve.Infinity;
-
- ECFieldElement X1Squared = X1.Square();
- ECFieldElement M = Three(X1Squared);
- ECFieldElement _2Y1 = Two(Y1);
- ECFieldElement _2Y1Squared = _2Y1.Multiply(Y1);
- ECFieldElement S = Two(X1.Multiply(_2Y1Squared));
- ECFieldElement _4T = _2Y1Squared.Square();
- ECFieldElement _8T = Two(_4T);
-
- if (!W1.IsZero)
- {
- M = M.Add(W1);
- W1 = Two(_8T.Multiply(W1));
- }
-
- X1 = M.Square().Subtract(Two(S));
- Y1 = M.Multiply(S.Subtract(X1)).Subtract(_8T);
- Z1 = Z1.IsOne ? _2Y1 : _2Y1.Multiply(Z1);
- }
-
- switch (coord)
- {
- case ECCurve.COORD_AFFINE:
- ECFieldElement zInv = Z1.Invert(), zInv2 = zInv.Square(), zInv3 = zInv2.Multiply(zInv);
- return new FpPoint(curve, X1.Multiply(zInv2), Y1.Multiply(zInv3), IsCompressed);
- case ECCurve.COORD_HOMOGENEOUS:
- X1 = X1.Multiply(Z1);
- Z1 = Z1.Multiply(Z1.Square());
- return new FpPoint(curve, X1, Y1, new ECFieldElement[] { Z1 }, IsCompressed);
- case ECCurve.COORD_JACOBIAN:
- return new FpPoint(curve, X1, Y1, new ECFieldElement[] { Z1 }, IsCompressed);
- case ECCurve.COORD_JACOBIAN_MODIFIED:
- return new FpPoint(curve, X1, Y1, new ECFieldElement[] { Z1, W1 }, IsCompressed);
- default:
- throw new InvalidOperationException("unsupported coordinate system");
- }
- }
-
- protected virtual ECFieldElement Two(ECFieldElement x)
- {
- return x.Add(x);
- }
-
- protected virtual ECFieldElement Three(ECFieldElement x)
- {
- return Two(x).Add(x);
- }
-
- protected virtual ECFieldElement Four(ECFieldElement x)
- {
- return Two(Two(x));
- }
-
- protected virtual ECFieldElement Eight(ECFieldElement x)
- {
- return Four(Two(x));
- }
-
- protected virtual ECFieldElement DoubleProductFromSquares(ECFieldElement a, ECFieldElement b,
- ECFieldElement aSquared, ECFieldElement bSquared)
- {
- /*
- * NOTE: If squaring in the field is faster than multiplication, then this is a quicker
- * way to calculate 2.A.B, if A^2 and B^2 are already known.
- */
- return a.Add(b).Square().Subtract(aSquared).Subtract(bSquared);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- ECCurve curve = Curve;
- int coord = curve.CoordinateSystem;
-
- if (ECCurve.COORD_AFFINE != coord)
- {
- return new FpPoint(curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
-
- return new FpPoint(curve, RawXCoord, RawYCoord.Negate(), IsCompressed);
- }
-
- protected virtual ECFieldElement CalculateJacobianModifiedW(ECFieldElement Z, ECFieldElement ZSquared)
- {
- ECFieldElement a4 = this.Curve.A;
- if (a4.IsZero || Z.IsOne)
- return a4;
-
- if (ZSquared == null)
- {
- ZSquared = Z.Square();
- }
-
- ECFieldElement W = ZSquared.Square();
- ECFieldElement a4Neg = a4.Negate();
- if (a4Neg.BitLength < a4.BitLength)
- {
- W = W.Multiply(a4Neg).Negate();
- }
- else
- {
- W = W.Multiply(a4);
- }
- return W;
- }
-
- protected virtual ECFieldElement GetJacobianModifiedW()
- {
- ECFieldElement[] ZZ = this.RawZCoords;
- ECFieldElement W = ZZ[1];
- if (W == null)
- {
- // NOTE: Rarely, TwicePlus will result in the need for a lazy W1 calculation here
- ZZ[1] = W = CalculateJacobianModifiedW(ZZ[0], null);
- }
- return W;
- }
-
- protected virtual FpPoint TwiceJacobianModified(bool calculateW)
- {
- ECFieldElement X1 = this.RawXCoord, Y1 = this.RawYCoord, Z1 = this.RawZCoords[0], W1 = GetJacobianModifiedW();
-
- ECFieldElement X1Squared = X1.Square();
- ECFieldElement M = Three(X1Squared).Add(W1);
- ECFieldElement _2Y1 = Two(Y1);
- ECFieldElement _2Y1Squared = _2Y1.Multiply(Y1);
- ECFieldElement S = Two(X1.Multiply(_2Y1Squared));
- ECFieldElement X3 = M.Square().Subtract(Two(S));
- ECFieldElement _4T = _2Y1Squared.Square();
- ECFieldElement _8T = Two(_4T);
- ECFieldElement Y3 = M.Multiply(S.Subtract(X3)).Subtract(_8T);
- ECFieldElement W3 = calculateW ? Two(_8T.Multiply(W1)) : null;
- ECFieldElement Z3 = Z1.IsOne ? _2Y1 : _2Y1.Multiply(Z1);
-
- return new FpPoint(this.Curve, X3, Y3, new ECFieldElement[] { Z3, W3 }, IsCompressed);
- }
- }
-
- public abstract class AbstractF2mPoint
- : ECPointBase
- {
- protected AbstractF2mPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- }
-
- protected AbstractF2mPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override bool SatisfiesCurveEquation()
- {
- ECCurve curve = Curve;
- ECFieldElement X = this.RawXCoord, Y = this.RawYCoord, A = curve.A, B = curve.B;
- ECFieldElement lhs, rhs;
-
- int coord = curve.CoordinateSystem;
- if (coord == ECCurve.COORD_LAMBDA_PROJECTIVE)
- {
- ECFieldElement Z = this.RawZCoords[0];
- bool ZIsOne = Z.IsOne;
-
- if (X.IsZero)
- {
- // NOTE: For x == 0, we expect the affine-y instead of the lambda-y
- lhs = Y.Square();
- rhs = B;
- if (!ZIsOne)
- {
- ECFieldElement Z2 = Z.Square();
- rhs = rhs.Multiply(Z2);
- }
- }
- else
- {
- ECFieldElement L = Y, X2 = X.Square();
- if (ZIsOne)
- {
- lhs = L.Square().Add(L).Add(A);
- rhs = X2.Square().Add(B);
- }
- else
- {
- ECFieldElement Z2 = Z.Square(), Z4 = Z2.Square();
- lhs = L.Add(Z).MultiplyPlusProduct(L, A, Z2);
- // TODO If sqrt(b) is precomputed this can be simplified to a single square
- rhs = X2.SquarePlusProduct(B, Z4);
- }
- lhs = lhs.Multiply(X2);
- }
- }
- else
- {
- lhs = Y.Add(X).Multiply(Y);
-
- switch (coord)
- {
- case ECCurve.COORD_AFFINE:
- break;
- case ECCurve.COORD_HOMOGENEOUS:
- {
- ECFieldElement Z = this.RawZCoords[0];
- if (!Z.IsOne)
- {
- ECFieldElement Z2 = Z.Square(), Z3 = Z.Multiply(Z2);
- lhs = lhs.Multiply(Z);
- A = A.Multiply(Z);
- B = B.Multiply(Z3);
- }
- break;
- }
- default:
- throw new InvalidOperationException("unsupported coordinate system");
- }
-
- rhs = X.Add(A).Multiply(X.Square()).Add(B);
- }
-
- return lhs.Equals(rhs);
- }
-
- public override ECPoint ScaleX(ECFieldElement scale)
- {
- if (this.IsInfinity)
- return this;
-
- switch (CurveCoordinateSystem)
- {
- case ECCurve.COORD_LAMBDA_AFFINE:
- {
- // Y is actually Lambda (X + Y/X) here
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- ECFieldElement X2 = X.Multiply(scale);
- ECFieldElement L2 = L.Add(X).Divide(scale).Add(X2);
-
- return Curve.CreateRawPoint(X, L2, RawZCoords, IsCompressed);
- }
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- {
- // Y is actually Lambda (X + Y/X) here
- ECFieldElement X = RawXCoord, L = RawYCoord, Z = RawZCoords[0];
-
- // We scale the Z coordinate also, to avoid an inversion
- ECFieldElement X2 = X.Multiply(scale.Square());
- ECFieldElement L2 = L.Add(X).Add(X2);
- ECFieldElement Z2 = Z.Multiply(scale);
-
- return Curve.CreateRawPoint(X, L2, new ECFieldElement[] { Z2 }, IsCompressed);
- }
- default:
- {
- return base.ScaleX(scale);
- }
- }
- }
-
- public override ECPoint ScaleY(ECFieldElement scale)
- {
- if (this.IsInfinity)
- return this;
-
- switch (CurveCoordinateSystem)
- {
- case ECCurve.COORD_LAMBDA_AFFINE:
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- ECFieldElement L2 = L.Add(X).Multiply(scale).Add(X);
-
- return Curve.CreateRawPoint(X, L2, RawZCoords, IsCompressed);
- }
- default:
- {
- return base.ScaleY(scale);
- }
- }
- }
-
- public override ECPoint Subtract(ECPoint b)
- {
- if (b.IsInfinity)
- return this;
-
- // Add -b
- return Add(b.Negate());
- }
-
- public virtual AbstractF2mPoint Tau()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
- int coord = curve.CoordinateSystem;
-
- ECFieldElement X1 = this.RawXCoord;
-
- switch (coord)
- {
- case ECCurve.COORD_AFFINE:
- case ECCurve.COORD_LAMBDA_AFFINE:
- {
- ECFieldElement Y1 = this.RawYCoord;
- return (AbstractF2mPoint)curve.CreateRawPoint(X1.Square(), Y1.Square(), IsCompressed);
- }
- case ECCurve.COORD_HOMOGENEOUS:
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- {
- ECFieldElement Y1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- return (AbstractF2mPoint)curve.CreateRawPoint(X1.Square(), Y1.Square(),
- new ECFieldElement[] { Z1.Square() }, IsCompressed);
- }
- default:
- {
- throw new InvalidOperationException("unsupported coordinate system");
- }
- }
- }
-
- public virtual AbstractF2mPoint TauPow(int pow)
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
- int coord = curve.CoordinateSystem;
-
- ECFieldElement X1 = this.RawXCoord;
-
- switch (coord)
- {
- case ECCurve.COORD_AFFINE:
- case ECCurve.COORD_LAMBDA_AFFINE:
- {
- ECFieldElement Y1 = this.RawYCoord;
- return (AbstractF2mPoint)curve.CreateRawPoint(X1.SquarePow(pow), Y1.SquarePow(pow), IsCompressed);
- }
- case ECCurve.COORD_HOMOGENEOUS:
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- {
- ECFieldElement Y1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- return (AbstractF2mPoint)curve.CreateRawPoint(X1.SquarePow(pow), Y1.SquarePow(pow),
- new ECFieldElement[] { Z1.SquarePow(pow) }, IsCompressed);
- }
- default:
- {
- throw new InvalidOperationException("unsupported coordinate system");
- }
- }
- }
- }
-
- /**
- * Elliptic curve points over F2m
- */
- public class F2mPoint
- : AbstractF2mPoint
- {
- /**
- * @param curve base curve
- * @param x x point
- * @param y y point
- */
- public F2mPoint(
- ECCurve curve,
- ECFieldElement x,
- ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @param curve base curve
- * @param x x point
- * @param y y point
- * @param withCompression true if encode with point compression.
- */
- public F2mPoint(
- ECCurve curve,
- ECFieldElement x,
- ECFieldElement y,
- bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- {
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- if (x != null)
- {
- // Check if x and y are elements of the same field
- F2mFieldElement.CheckFieldElements(x, y);
-
- // Check if x and a are elements of the same field
- if (curve != null)
- {
- F2mFieldElement.CheckFieldElements(x, curve.A);
- }
- }
- }
-
- internal F2mPoint(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- /**
- * Constructor for point at infinity
- */
- [Obsolete("Use ECCurve.Infinity property")]
- public F2mPoint(
- ECCurve curve)
- : this(curve, null, null)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new F2mPoint(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- int coord = this.CurveCoordinateSystem;
-
- switch (coord)
- {
- case ECCurve.COORD_LAMBDA_AFFINE:
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
- if (ECCurve.COORD_LAMBDA_PROJECTIVE == coord)
- {
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
- }
- return Y;
- }
- default:
- {
- return RawYCoord;
- }
- }
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- {
- return false;
- }
-
- ECFieldElement Y = this.RawYCoord;
-
- switch (this.CurveCoordinateSystem)
- {
- case ECCurve.COORD_LAMBDA_AFFINE:
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- {
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- default:
- {
- return Y.Divide(X).TestBitZero();
- }
- }
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
- int coord = curve.CoordinateSystem;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- switch (coord)
- {
- case ECCurve.COORD_AFFINE:
- {
- ECFieldElement Y1 = this.RawYCoord;
- ECFieldElement Y2 = b.RawYCoord;
-
- ECFieldElement dx = X1.Add(X2), dy = Y1.Add(Y2);
- if (dx.IsZero)
- {
- if (dy.IsZero)
- {
- return Twice();
- }
-
- return curve.Infinity;
- }
-
- ECFieldElement L = dy.Divide(dx);
-
- ECFieldElement X3 = L.Square().Add(L).Add(dx).Add(curve.A);
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
-
- return new F2mPoint(curve, X3, Y3, IsCompressed);
- }
- case ECCurve.COORD_HOMOGENEOUS:
- {
- ECFieldElement Y1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement Y2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U1 = Y2, V1 = X2;
- if (!Z1IsOne)
- {
- U1 = U1.Multiply(Z1);
- V1 = V1.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U2 = Y1, V2 = X1;
- if (!Z2IsOne)
- {
- U2 = U2.Multiply(Z2);
- V2 = V2.Multiply(Z2);
- }
-
- ECFieldElement U = U1.Add(U2);
- ECFieldElement V = V1.Add(V2);
-
- if (V.IsZero)
- {
- if (U.IsZero)
- {
- return Twice();
- }
-
- return curve.Infinity;
- }
-
- ECFieldElement VSq = V.Square();
- ECFieldElement VCu = VSq.Multiply(V);
- ECFieldElement W = Z1IsOne ? Z2 : Z2IsOne ? Z1 : Z1.Multiply(Z2);
- ECFieldElement uv = U.Add(V);
- ECFieldElement A = uv.MultiplyPlusProduct(U, VSq, curve.A).Multiply(W).Add(VCu);
-
- ECFieldElement X3 = V.Multiply(A);
- ECFieldElement VSqZ2 = Z2IsOne ? VSq : VSq.Multiply(Z2);
- ECFieldElement Y3 = U.MultiplyPlusProduct(X1, V, Y1).MultiplyPlusProduct(VSqZ2, uv, A);
- ECFieldElement Z3 = VCu.Multiply(W);
-
- return new F2mPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- {
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- {
- return Twice();
- }
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.RawXCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).Add(curve.A);
- if (X3.IsZero)
- {
- return new F2mPoint(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new F2mPoint(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new F2mPoint(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
- default:
- {
- throw new InvalidOperationException("unsupported coordinate system");
- }
- }
- }
-
- /* (non-Javadoc)
- * @see Org.BouncyCastle.Math.EC.ECPoint#twice()
- */
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own additive inverse
- return curve.Infinity;
- }
-
- int coord = curve.CoordinateSystem;
-
- switch (coord)
- {
- case ECCurve.COORD_AFFINE:
- {
- ECFieldElement Y1 = this.RawYCoord;
-
- ECFieldElement L1 = Y1.Divide(X1).Add(X1);
-
- ECFieldElement X3 = L1.Square().Add(L1).Add(curve.A);
- ECFieldElement Y3 = X1.SquarePlusProduct(X3, L1.AddOne());
-
- return new F2mPoint(curve, X3, Y3, IsCompressed);
- }
- case ECCurve.COORD_HOMOGENEOUS:
- {
- ECFieldElement Y1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement Y1Z1 = Z1IsOne ? Y1 : Y1.Multiply(Z1);
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement S = X1Sq.Add(Y1Z1);
- ECFieldElement V = X1Z1;
- ECFieldElement vSquared = V.Square();
- ECFieldElement sv = S.Add(V);
- ECFieldElement h = sv.MultiplyPlusProduct(S, vSquared, curve.A);
-
- ECFieldElement X3 = V.Multiply(h);
- ECFieldElement Y3 = X1Sq.Square().MultiplyPlusProduct(V, h, sv);
- ECFieldElement Z3 = V.Multiply(vSquared);
-
- return new F2mPoint(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- {
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement a = curve.A;
- ECFieldElement aZ1Sq = Z1IsOne ? a : a.Multiply(Z1Sq);
- ECFieldElement T = L1.Square().Add(L1Z1).Add(aZ1Sq);
- if (T.IsZero)
- {
- return new F2mPoint(curve, T, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement b = curve.B;
- ECFieldElement L3;
- if (b.BitLength < (curve.FieldSize >> 1))
- {
- ECFieldElement t1 = L1.Add(X1).Square();
- ECFieldElement t2;
- if (b.IsOne)
- {
- t2 = aZ1Sq.Add(Z1Sq).Square();
- }
- else
- {
- // TODO Can be calculated with one square if we pre-compute sqrt(b)
- t2 = aZ1Sq.SquarePlusProduct(b, Z1Sq.Square());
- }
- L3 = t1.Add(T).Add(Z1Sq).Multiply(t1).Add(t2).Add(X3);
- if (a.IsZero)
- {
- L3 = L3.Add(Z3);
- }
- else if (!a.IsOne)
- {
- L3 = L3.Add(a.AddOne().Multiply(Z3));
- }
- }
- else
- {
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
- }
-
- return new F2mPoint(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
- default:
- {
- throw new InvalidOperationException("unsupported coordinate system");
- }
- }
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own additive inverse
- return b;
- }
-
- int coord = curve.CoordinateSystem;
-
- switch (coord)
- {
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- {
- // NOTE: twicePlus() only optimized for lambda-affine argument
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = curve.A.Multiply(Z1Sq).Add(L1Sq).Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = curve.A.Add(L2plus1).Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- {
- return b.Twice();
- }
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new F2mPoint(curve, A, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new F2mPoint(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
- default:
- {
- return Twice().Add(b);
- }
- }
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- ECCurve curve = this.Curve;
- int coord = curve.CoordinateSystem;
-
- switch (coord)
- {
- case ECCurve.COORD_AFFINE:
- {
- ECFieldElement Y = this.RawYCoord;
- return new F2mPoint(curve, X, Y.Add(X), IsCompressed);
- }
- case ECCurve.COORD_HOMOGENEOUS:
- {
- ECFieldElement Y = this.RawYCoord, Z = this.RawZCoords[0];
- return new F2mPoint(curve, X, Y.Add(X), new ECFieldElement[] { Z }, IsCompressed);
- }
- case ECCurve.COORD_LAMBDA_AFFINE:
- {
- ECFieldElement L = this.RawYCoord;
- return new F2mPoint(curve, X, L.AddOne(), IsCompressed);
- }
- case ECCurve.COORD_LAMBDA_PROJECTIVE:
- {
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new F2mPoint(curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- default:
- {
- throw new InvalidOperationException("unsupported coordinate system");
- }
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/ECPointMap.cs b/BCCrypto/src/math/ec/ECPointMap.cs
deleted file mode 100644
index e78c800..0000000
--- a/BCCrypto/src/math/ec/ECPointMap.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC
-{
- public interface ECPointMap
- {
- ECPoint Map(ECPoint p);
- }
-}
diff --git a/BCCrypto/src/math/ec/LongArray.cs b/BCCrypto/src/math/ec/LongArray.cs
deleted file mode 100644
index 84462e0..0000000
--- a/BCCrypto/src/math/ec/LongArray.cs
+++ /dev/null
@@ -1,2201 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC
-{
- internal class LongArray
- {
- //private static long DEInterleave_MASK = 0x5555555555555555L;
-
- /*
- * This expands 8 bit indices into 16 bit contents (high bit 14), by inserting 0s between bits.
- * In a binary field, this operation is the same as squaring an 8 bit number.
- */
- private static readonly ushort[] INTERLEAVE2_TABLE = new ushort[]
- {
- 0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015,
- 0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055,
- 0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115,
- 0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155,
- 0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415,
- 0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455,
- 0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515,
- 0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555,
- 0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015,
- 0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055,
- 0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115,
- 0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155,
- 0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415,
- 0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455,
- 0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515,
- 0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555,
- 0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015,
- 0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055,
- 0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115,
- 0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155,
- 0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415,
- 0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455,
- 0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515,
- 0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555,
- 0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015,
- 0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055,
- 0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115,
- 0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155,
- 0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415,
- 0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455,
- 0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515,
- 0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555
- };
-
- /*
- * This expands 7 bit indices into 21 bit contents (high bit 18), by inserting 0s between bits.
- */
- private static readonly int[] INTERLEAVE3_TABLE = new int[]
- {
- 0x00000, 0x00001, 0x00008, 0x00009, 0x00040, 0x00041, 0x00048, 0x00049,
- 0x00200, 0x00201, 0x00208, 0x00209, 0x00240, 0x00241, 0x00248, 0x00249,
- 0x01000, 0x01001, 0x01008, 0x01009, 0x01040, 0x01041, 0x01048, 0x01049,
- 0x01200, 0x01201, 0x01208, 0x01209, 0x01240, 0x01241, 0x01248, 0x01249,
- 0x08000, 0x08001, 0x08008, 0x08009, 0x08040, 0x08041, 0x08048, 0x08049,
- 0x08200, 0x08201, 0x08208, 0x08209, 0x08240, 0x08241, 0x08248, 0x08249,
- 0x09000, 0x09001, 0x09008, 0x09009, 0x09040, 0x09041, 0x09048, 0x09049,
- 0x09200, 0x09201, 0x09208, 0x09209, 0x09240, 0x09241, 0x09248, 0x09249,
- 0x40000, 0x40001, 0x40008, 0x40009, 0x40040, 0x40041, 0x40048, 0x40049,
- 0x40200, 0x40201, 0x40208, 0x40209, 0x40240, 0x40241, 0x40248, 0x40249,
- 0x41000, 0x41001, 0x41008, 0x41009, 0x41040, 0x41041, 0x41048, 0x41049,
- 0x41200, 0x41201, 0x41208, 0x41209, 0x41240, 0x41241, 0x41248, 0x41249,
- 0x48000, 0x48001, 0x48008, 0x48009, 0x48040, 0x48041, 0x48048, 0x48049,
- 0x48200, 0x48201, 0x48208, 0x48209, 0x48240, 0x48241, 0x48248, 0x48249,
- 0x49000, 0x49001, 0x49008, 0x49009, 0x49040, 0x49041, 0x49048, 0x49049,
- 0x49200, 0x49201, 0x49208, 0x49209, 0x49240, 0x49241, 0x49248, 0x49249
- };
-
- /*
- * This expands 8 bit indices into 32 bit contents (high bit 28), by inserting 0s between bits.
- */
- private static readonly int[] INTERLEAVE4_TABLE = new int[]
- {
- 0x00000000, 0x00000001, 0x00000010, 0x00000011, 0x00000100, 0x00000101, 0x00000110, 0x00000111,
- 0x00001000, 0x00001001, 0x00001010, 0x00001011, 0x00001100, 0x00001101, 0x00001110, 0x00001111,
- 0x00010000, 0x00010001, 0x00010010, 0x00010011, 0x00010100, 0x00010101, 0x00010110, 0x00010111,
- 0x00011000, 0x00011001, 0x00011010, 0x00011011, 0x00011100, 0x00011101, 0x00011110, 0x00011111,
- 0x00100000, 0x00100001, 0x00100010, 0x00100011, 0x00100100, 0x00100101, 0x00100110, 0x00100111,
- 0x00101000, 0x00101001, 0x00101010, 0x00101011, 0x00101100, 0x00101101, 0x00101110, 0x00101111,
- 0x00110000, 0x00110001, 0x00110010, 0x00110011, 0x00110100, 0x00110101, 0x00110110, 0x00110111,
- 0x00111000, 0x00111001, 0x00111010, 0x00111011, 0x00111100, 0x00111101, 0x00111110, 0x00111111,
- 0x01000000, 0x01000001, 0x01000010, 0x01000011, 0x01000100, 0x01000101, 0x01000110, 0x01000111,
- 0x01001000, 0x01001001, 0x01001010, 0x01001011, 0x01001100, 0x01001101, 0x01001110, 0x01001111,
- 0x01010000, 0x01010001, 0x01010010, 0x01010011, 0x01010100, 0x01010101, 0x01010110, 0x01010111,
- 0x01011000, 0x01011001, 0x01011010, 0x01011011, 0x01011100, 0x01011101, 0x01011110, 0x01011111,
- 0x01100000, 0x01100001, 0x01100010, 0x01100011, 0x01100100, 0x01100101, 0x01100110, 0x01100111,
- 0x01101000, 0x01101001, 0x01101010, 0x01101011, 0x01101100, 0x01101101, 0x01101110, 0x01101111,
- 0x01110000, 0x01110001, 0x01110010, 0x01110011, 0x01110100, 0x01110101, 0x01110110, 0x01110111,
- 0x01111000, 0x01111001, 0x01111010, 0x01111011, 0x01111100, 0x01111101, 0x01111110, 0x01111111,
- 0x10000000, 0x10000001, 0x10000010, 0x10000011, 0x10000100, 0x10000101, 0x10000110, 0x10000111,
- 0x10001000, 0x10001001, 0x10001010, 0x10001011, 0x10001100, 0x10001101, 0x10001110, 0x10001111,
- 0x10010000, 0x10010001, 0x10010010, 0x10010011, 0x10010100, 0x10010101, 0x10010110, 0x10010111,
- 0x10011000, 0x10011001, 0x10011010, 0x10011011, 0x10011100, 0x10011101, 0x10011110, 0x10011111,
- 0x10100000, 0x10100001, 0x10100010, 0x10100011, 0x10100100, 0x10100101, 0x10100110, 0x10100111,
- 0x10101000, 0x10101001, 0x10101010, 0x10101011, 0x10101100, 0x10101101, 0x10101110, 0x10101111,
- 0x10110000, 0x10110001, 0x10110010, 0x10110011, 0x10110100, 0x10110101, 0x10110110, 0x10110111,
- 0x10111000, 0x10111001, 0x10111010, 0x10111011, 0x10111100, 0x10111101, 0x10111110, 0x10111111,
- 0x11000000, 0x11000001, 0x11000010, 0x11000011, 0x11000100, 0x11000101, 0x11000110, 0x11000111,
- 0x11001000, 0x11001001, 0x11001010, 0x11001011, 0x11001100, 0x11001101, 0x11001110, 0x11001111,
- 0x11010000, 0x11010001, 0x11010010, 0x11010011, 0x11010100, 0x11010101, 0x11010110, 0x11010111,
- 0x11011000, 0x11011001, 0x11011010, 0x11011011, 0x11011100, 0x11011101, 0x11011110, 0x11011111,
- 0x11100000, 0x11100001, 0x11100010, 0x11100011, 0x11100100, 0x11100101, 0x11100110, 0x11100111,
- 0x11101000, 0x11101001, 0x11101010, 0x11101011, 0x11101100, 0x11101101, 0x11101110, 0x11101111,
- 0x11110000, 0x11110001, 0x11110010, 0x11110011, 0x11110100, 0x11110101, 0x11110110, 0x11110111,
- 0x11111000, 0x11111001, 0x11111010, 0x11111011, 0x11111100, 0x11111101, 0x11111110, 0x11111111
- };
-
- /*
- * This expands 7 bit indices into 35 bit contents (high bit 30), by inserting 0s between bits.
- */
- private static readonly int[] INTERLEAVE5_TABLE = new int[] {
- 0x00000000, 0x00000001, 0x00000020, 0x00000021, 0x00000400, 0x00000401, 0x00000420, 0x00000421,
- 0x00008000, 0x00008001, 0x00008020, 0x00008021, 0x00008400, 0x00008401, 0x00008420, 0x00008421,
- 0x00100000, 0x00100001, 0x00100020, 0x00100021, 0x00100400, 0x00100401, 0x00100420, 0x00100421,
- 0x00108000, 0x00108001, 0x00108020, 0x00108021, 0x00108400, 0x00108401, 0x00108420, 0x00108421,
- 0x02000000, 0x02000001, 0x02000020, 0x02000021, 0x02000400, 0x02000401, 0x02000420, 0x02000421,
- 0x02008000, 0x02008001, 0x02008020, 0x02008021, 0x02008400, 0x02008401, 0x02008420, 0x02008421,
- 0x02100000, 0x02100001, 0x02100020, 0x02100021, 0x02100400, 0x02100401, 0x02100420, 0x02100421,
- 0x02108000, 0x02108001, 0x02108020, 0x02108021, 0x02108400, 0x02108401, 0x02108420, 0x02108421,
- 0x40000000, 0x40000001, 0x40000020, 0x40000021, 0x40000400, 0x40000401, 0x40000420, 0x40000421,
- 0x40008000, 0x40008001, 0x40008020, 0x40008021, 0x40008400, 0x40008401, 0x40008420, 0x40008421,
- 0x40100000, 0x40100001, 0x40100020, 0x40100021, 0x40100400, 0x40100401, 0x40100420, 0x40100421,
- 0x40108000, 0x40108001, 0x40108020, 0x40108021, 0x40108400, 0x40108401, 0x40108420, 0x40108421,
- 0x42000000, 0x42000001, 0x42000020, 0x42000021, 0x42000400, 0x42000401, 0x42000420, 0x42000421,
- 0x42008000, 0x42008001, 0x42008020, 0x42008021, 0x42008400, 0x42008401, 0x42008420, 0x42008421,
- 0x42100000, 0x42100001, 0x42100020, 0x42100021, 0x42100400, 0x42100401, 0x42100420, 0x42100421,
- 0x42108000, 0x42108001, 0x42108020, 0x42108021, 0x42108400, 0x42108401, 0x42108420, 0x42108421
- };
-
- /*
- * This expands 9 bit indices into 63 bit (long) contents (high bit 56), by inserting 0s between bits.
- */
- private static readonly long[] INTERLEAVE7_TABLE = new long[]
- {
- 0x0000000000000000L, 0x0000000000000001L, 0x0000000000000080L, 0x0000000000000081L,
- 0x0000000000004000L, 0x0000000000004001L, 0x0000000000004080L, 0x0000000000004081L,
- 0x0000000000200000L, 0x0000000000200001L, 0x0000000000200080L, 0x0000000000200081L,
- 0x0000000000204000L, 0x0000000000204001L, 0x0000000000204080L, 0x0000000000204081L,
- 0x0000000010000000L, 0x0000000010000001L, 0x0000000010000080L, 0x0000000010000081L,
- 0x0000000010004000L, 0x0000000010004001L, 0x0000000010004080L, 0x0000000010004081L,
- 0x0000000010200000L, 0x0000000010200001L, 0x0000000010200080L, 0x0000000010200081L,
- 0x0000000010204000L, 0x0000000010204001L, 0x0000000010204080L, 0x0000000010204081L,
- 0x0000000800000000L, 0x0000000800000001L, 0x0000000800000080L, 0x0000000800000081L,
- 0x0000000800004000L, 0x0000000800004001L, 0x0000000800004080L, 0x0000000800004081L,
- 0x0000000800200000L, 0x0000000800200001L, 0x0000000800200080L, 0x0000000800200081L,
- 0x0000000800204000L, 0x0000000800204001L, 0x0000000800204080L, 0x0000000800204081L,
- 0x0000000810000000L, 0x0000000810000001L, 0x0000000810000080L, 0x0000000810000081L,
- 0x0000000810004000L, 0x0000000810004001L, 0x0000000810004080L, 0x0000000810004081L,
- 0x0000000810200000L, 0x0000000810200001L, 0x0000000810200080L, 0x0000000810200081L,
- 0x0000000810204000L, 0x0000000810204001L, 0x0000000810204080L, 0x0000000810204081L,
- 0x0000040000000000L, 0x0000040000000001L, 0x0000040000000080L, 0x0000040000000081L,
- 0x0000040000004000L, 0x0000040000004001L, 0x0000040000004080L, 0x0000040000004081L,
- 0x0000040000200000L, 0x0000040000200001L, 0x0000040000200080L, 0x0000040000200081L,
- 0x0000040000204000L, 0x0000040000204001L, 0x0000040000204080L, 0x0000040000204081L,
- 0x0000040010000000L, 0x0000040010000001L, 0x0000040010000080L, 0x0000040010000081L,
- 0x0000040010004000L, 0x0000040010004001L, 0x0000040010004080L, 0x0000040010004081L,
- 0x0000040010200000L, 0x0000040010200001L, 0x0000040010200080L, 0x0000040010200081L,
- 0x0000040010204000L, 0x0000040010204001L, 0x0000040010204080L, 0x0000040010204081L,
- 0x0000040800000000L, 0x0000040800000001L, 0x0000040800000080L, 0x0000040800000081L,
- 0x0000040800004000L, 0x0000040800004001L, 0x0000040800004080L, 0x0000040800004081L,
- 0x0000040800200000L, 0x0000040800200001L, 0x0000040800200080L, 0x0000040800200081L,
- 0x0000040800204000L, 0x0000040800204001L, 0x0000040800204080L, 0x0000040800204081L,
- 0x0000040810000000L, 0x0000040810000001L, 0x0000040810000080L, 0x0000040810000081L,
- 0x0000040810004000L, 0x0000040810004001L, 0x0000040810004080L, 0x0000040810004081L,
- 0x0000040810200000L, 0x0000040810200001L, 0x0000040810200080L, 0x0000040810200081L,
- 0x0000040810204000L, 0x0000040810204001L, 0x0000040810204080L, 0x0000040810204081L,
- 0x0002000000000000L, 0x0002000000000001L, 0x0002000000000080L, 0x0002000000000081L,
- 0x0002000000004000L, 0x0002000000004001L, 0x0002000000004080L, 0x0002000000004081L,
- 0x0002000000200000L, 0x0002000000200001L, 0x0002000000200080L, 0x0002000000200081L,
- 0x0002000000204000L, 0x0002000000204001L, 0x0002000000204080L, 0x0002000000204081L,
- 0x0002000010000000L, 0x0002000010000001L, 0x0002000010000080L, 0x0002000010000081L,
- 0x0002000010004000L, 0x0002000010004001L, 0x0002000010004080L, 0x0002000010004081L,
- 0x0002000010200000L, 0x0002000010200001L, 0x0002000010200080L, 0x0002000010200081L,
- 0x0002000010204000L, 0x0002000010204001L, 0x0002000010204080L, 0x0002000010204081L,
- 0x0002000800000000L, 0x0002000800000001L, 0x0002000800000080L, 0x0002000800000081L,
- 0x0002000800004000L, 0x0002000800004001L, 0x0002000800004080L, 0x0002000800004081L,
- 0x0002000800200000L, 0x0002000800200001L, 0x0002000800200080L, 0x0002000800200081L,
- 0x0002000800204000L, 0x0002000800204001L, 0x0002000800204080L, 0x0002000800204081L,
- 0x0002000810000000L, 0x0002000810000001L, 0x0002000810000080L, 0x0002000810000081L,
- 0x0002000810004000L, 0x0002000810004001L, 0x0002000810004080L, 0x0002000810004081L,
- 0x0002000810200000L, 0x0002000810200001L, 0x0002000810200080L, 0x0002000810200081L,
- 0x0002000810204000L, 0x0002000810204001L, 0x0002000810204080L, 0x0002000810204081L,
- 0x0002040000000000L, 0x0002040000000001L, 0x0002040000000080L, 0x0002040000000081L,
- 0x0002040000004000L, 0x0002040000004001L, 0x0002040000004080L, 0x0002040000004081L,
- 0x0002040000200000L, 0x0002040000200001L, 0x0002040000200080L, 0x0002040000200081L,
- 0x0002040000204000L, 0x0002040000204001L, 0x0002040000204080L, 0x0002040000204081L,
- 0x0002040010000000L, 0x0002040010000001L, 0x0002040010000080L, 0x0002040010000081L,
- 0x0002040010004000L, 0x0002040010004001L, 0x0002040010004080L, 0x0002040010004081L,
- 0x0002040010200000L, 0x0002040010200001L, 0x0002040010200080L, 0x0002040010200081L,
- 0x0002040010204000L, 0x0002040010204001L, 0x0002040010204080L, 0x0002040010204081L,
- 0x0002040800000000L, 0x0002040800000001L, 0x0002040800000080L, 0x0002040800000081L,
- 0x0002040800004000L, 0x0002040800004001L, 0x0002040800004080L, 0x0002040800004081L,
- 0x0002040800200000L, 0x0002040800200001L, 0x0002040800200080L, 0x0002040800200081L,
- 0x0002040800204000L, 0x0002040800204001L, 0x0002040800204080L, 0x0002040800204081L,
- 0x0002040810000000L, 0x0002040810000001L, 0x0002040810000080L, 0x0002040810000081L,
- 0x0002040810004000L, 0x0002040810004001L, 0x0002040810004080L, 0x0002040810004081L,
- 0x0002040810200000L, 0x0002040810200001L, 0x0002040810200080L, 0x0002040810200081L,
- 0x0002040810204000L, 0x0002040810204001L, 0x0002040810204080L, 0x0002040810204081L,
- 0x0100000000000000L, 0x0100000000000001L, 0x0100000000000080L, 0x0100000000000081L,
- 0x0100000000004000L, 0x0100000000004001L, 0x0100000000004080L, 0x0100000000004081L,
- 0x0100000000200000L, 0x0100000000200001L, 0x0100000000200080L, 0x0100000000200081L,
- 0x0100000000204000L, 0x0100000000204001L, 0x0100000000204080L, 0x0100000000204081L,
- 0x0100000010000000L, 0x0100000010000001L, 0x0100000010000080L, 0x0100000010000081L,
- 0x0100000010004000L, 0x0100000010004001L, 0x0100000010004080L, 0x0100000010004081L,
- 0x0100000010200000L, 0x0100000010200001L, 0x0100000010200080L, 0x0100000010200081L,
- 0x0100000010204000L, 0x0100000010204001L, 0x0100000010204080L, 0x0100000010204081L,
- 0x0100000800000000L, 0x0100000800000001L, 0x0100000800000080L, 0x0100000800000081L,
- 0x0100000800004000L, 0x0100000800004001L, 0x0100000800004080L, 0x0100000800004081L,
- 0x0100000800200000L, 0x0100000800200001L, 0x0100000800200080L, 0x0100000800200081L,
- 0x0100000800204000L, 0x0100000800204001L, 0x0100000800204080L, 0x0100000800204081L,
- 0x0100000810000000L, 0x0100000810000001L, 0x0100000810000080L, 0x0100000810000081L,
- 0x0100000810004000L, 0x0100000810004001L, 0x0100000810004080L, 0x0100000810004081L,
- 0x0100000810200000L, 0x0100000810200001L, 0x0100000810200080L, 0x0100000810200081L,
- 0x0100000810204000L, 0x0100000810204001L, 0x0100000810204080L, 0x0100000810204081L,
- 0x0100040000000000L, 0x0100040000000001L, 0x0100040000000080L, 0x0100040000000081L,
- 0x0100040000004000L, 0x0100040000004001L, 0x0100040000004080L, 0x0100040000004081L,
- 0x0100040000200000L, 0x0100040000200001L, 0x0100040000200080L, 0x0100040000200081L,
- 0x0100040000204000L, 0x0100040000204001L, 0x0100040000204080L, 0x0100040000204081L,
- 0x0100040010000000L, 0x0100040010000001L, 0x0100040010000080L, 0x0100040010000081L,
- 0x0100040010004000L, 0x0100040010004001L, 0x0100040010004080L, 0x0100040010004081L,
- 0x0100040010200000L, 0x0100040010200001L, 0x0100040010200080L, 0x0100040010200081L,
- 0x0100040010204000L, 0x0100040010204001L, 0x0100040010204080L, 0x0100040010204081L,
- 0x0100040800000000L, 0x0100040800000001L, 0x0100040800000080L, 0x0100040800000081L,
- 0x0100040800004000L, 0x0100040800004001L, 0x0100040800004080L, 0x0100040800004081L,
- 0x0100040800200000L, 0x0100040800200001L, 0x0100040800200080L, 0x0100040800200081L,
- 0x0100040800204000L, 0x0100040800204001L, 0x0100040800204080L, 0x0100040800204081L,
- 0x0100040810000000L, 0x0100040810000001L, 0x0100040810000080L, 0x0100040810000081L,
- 0x0100040810004000L, 0x0100040810004001L, 0x0100040810004080L, 0x0100040810004081L,
- 0x0100040810200000L, 0x0100040810200001L, 0x0100040810200080L, 0x0100040810200081L,
- 0x0100040810204000L, 0x0100040810204001L, 0x0100040810204080L, 0x0100040810204081L,
- 0x0102000000000000L, 0x0102000000000001L, 0x0102000000000080L, 0x0102000000000081L,
- 0x0102000000004000L, 0x0102000000004001L, 0x0102000000004080L, 0x0102000000004081L,
- 0x0102000000200000L, 0x0102000000200001L, 0x0102000000200080L, 0x0102000000200081L,
- 0x0102000000204000L, 0x0102000000204001L, 0x0102000000204080L, 0x0102000000204081L,
- 0x0102000010000000L, 0x0102000010000001L, 0x0102000010000080L, 0x0102000010000081L,
- 0x0102000010004000L, 0x0102000010004001L, 0x0102000010004080L, 0x0102000010004081L,
- 0x0102000010200000L, 0x0102000010200001L, 0x0102000010200080L, 0x0102000010200081L,
- 0x0102000010204000L, 0x0102000010204001L, 0x0102000010204080L, 0x0102000010204081L,
- 0x0102000800000000L, 0x0102000800000001L, 0x0102000800000080L, 0x0102000800000081L,
- 0x0102000800004000L, 0x0102000800004001L, 0x0102000800004080L, 0x0102000800004081L,
- 0x0102000800200000L, 0x0102000800200001L, 0x0102000800200080L, 0x0102000800200081L,
- 0x0102000800204000L, 0x0102000800204001L, 0x0102000800204080L, 0x0102000800204081L,
- 0x0102000810000000L, 0x0102000810000001L, 0x0102000810000080L, 0x0102000810000081L,
- 0x0102000810004000L, 0x0102000810004001L, 0x0102000810004080L, 0x0102000810004081L,
- 0x0102000810200000L, 0x0102000810200001L, 0x0102000810200080L, 0x0102000810200081L,
- 0x0102000810204000L, 0x0102000810204001L, 0x0102000810204080L, 0x0102000810204081L,
- 0x0102040000000000L, 0x0102040000000001L, 0x0102040000000080L, 0x0102040000000081L,
- 0x0102040000004000L, 0x0102040000004001L, 0x0102040000004080L, 0x0102040000004081L,
- 0x0102040000200000L, 0x0102040000200001L, 0x0102040000200080L, 0x0102040000200081L,
- 0x0102040000204000L, 0x0102040000204001L, 0x0102040000204080L, 0x0102040000204081L,
- 0x0102040010000000L, 0x0102040010000001L, 0x0102040010000080L, 0x0102040010000081L,
- 0x0102040010004000L, 0x0102040010004001L, 0x0102040010004080L, 0x0102040010004081L,
- 0x0102040010200000L, 0x0102040010200001L, 0x0102040010200080L, 0x0102040010200081L,
- 0x0102040010204000L, 0x0102040010204001L, 0x0102040010204080L, 0x0102040010204081L,
- 0x0102040800000000L, 0x0102040800000001L, 0x0102040800000080L, 0x0102040800000081L,
- 0x0102040800004000L, 0x0102040800004001L, 0x0102040800004080L, 0x0102040800004081L,
- 0x0102040800200000L, 0x0102040800200001L, 0x0102040800200080L, 0x0102040800200081L,
- 0x0102040800204000L, 0x0102040800204001L, 0x0102040800204080L, 0x0102040800204081L,
- 0x0102040810000000L, 0x0102040810000001L, 0x0102040810000080L, 0x0102040810000081L,
- 0x0102040810004000L, 0x0102040810004001L, 0x0102040810004080L, 0x0102040810004081L,
- 0x0102040810200000L, 0x0102040810200001L, 0x0102040810200080L, 0x0102040810200081L,
- 0x0102040810204000L, 0x0102040810204001L, 0x0102040810204080L, 0x0102040810204081L
- };
-
- // For toString(); must have length 64
- private const string ZEROES = "0000000000000000000000000000000000000000000000000000000000000000";
-
- internal static readonly byte[] BitLengths =
- {
- 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
- };
-
- // TODO make m fixed for the LongArray, and hence compute T once and for all
-
- private long[] m_ints;
-
- public LongArray(int intLen)
- {
- m_ints = new long[intLen];
- }
-
- public LongArray(long[] ints)
- {
- m_ints = ints;
- }
-
- public LongArray(long[] ints, int off, int len)
- {
- if (off == 0 && len == ints.Length)
- {
- m_ints = ints;
- }
- else
- {
- m_ints = new long[len];
- Array.Copy(ints, off, m_ints, 0, len);
- }
- }
-
- public LongArray(BigInteger bigInt)
- {
- if (bigInt == null || bigInt.SignValue < 0)
- {
- throw new ArgumentException("invalid F2m field value", "bigInt");
- }
-
- if (bigInt.SignValue == 0)
- {
- m_ints = new long[] { 0L };
- return;
- }
-
- byte[] barr = bigInt.ToByteArray();
- int barrLen = barr.Length;
- int barrStart = 0;
- if (barr[0] == 0)
- {
- // First byte is 0 to enforce highest (=sign) bit is zero.
- // In this case ignore barr[0].
- barrLen--;
- barrStart = 1;
- }
- int intLen = (barrLen + 7) / 8;
- m_ints = new long[intLen];
-
- int iarrJ = intLen - 1;
- int rem = barrLen % 8 + barrStart;
- long temp = 0;
- int barrI = barrStart;
- if (barrStart < rem)
- {
- for (; barrI < rem; barrI++)
- {
- temp <<= 8;
- uint barrBarrI = barr[barrI];
- temp |= barrBarrI;
- }
- m_ints[iarrJ--] = temp;
- }
-
- for (; iarrJ >= 0; iarrJ--)
- {
- temp = 0;
- for (int i = 0; i < 8; i++)
- {
- temp <<= 8;
- uint barrBarrI = barr[barrI++];
- temp |= barrBarrI;
- }
- m_ints[iarrJ] = temp;
- }
- }
-
- public bool IsOne()
- {
- long[] a = m_ints;
- if (a[0] != 1L)
- {
- return false;
- }
- for (int i = 1; i < a.Length; ++i)
- {
- if (a[i] != 0L)
- {
- return false;
- }
- }
- return true;
- }
-
- public bool IsZero()
- {
- long[] a = m_ints;
- for (int i = 0; i < a.Length; ++i)
- {
- if (a[i] != 0L)
- {
- return false;
- }
- }
- return true;
- }
-
- public int GetUsedLength()
- {
- return GetUsedLengthFrom(m_ints.Length);
- }
-
- public int GetUsedLengthFrom(int from)
- {
- long[] a = m_ints;
- from = System.Math.Min(from, a.Length);
-
- if (from < 1)
- {
- return 0;
- }
-
- // Check if first element will act as sentinel
- if (a[0] != 0)
- {
- while (a[--from] == 0)
- {
- }
- return from + 1;
- }
-
- do
- {
- if (a[--from] != 0)
- {
- return from + 1;
- }
- }
- while (from > 0);
-
- return 0;
- }
-
- public int Degree()
- {
- int i = m_ints.Length;
- long w;
- do
- {
- if (i == 0)
- {
- return 0;
- }
- w = m_ints[--i];
- }
- while (w == 0);
-
- return (i << 6) + BitLength(w);
- }
-
- private int DegreeFrom(int limit)
- {
- int i = (int)(((uint)limit + 62) >> 6);
- long w;
- do
- {
- if (i == 0)
- {
- return 0;
- }
- w = m_ints[--i];
- }
- while (w == 0);
-
- return (i << 6) + BitLength(w);
- }
-
- // private int lowestCoefficient()
- // {
- // for (int i = 0; i < m_ints.Length; ++i)
- // {
- // long mi = m_ints[i];
- // if (mi != 0)
- // {
- // int j = 0;
- // while ((mi & 0xFFL) == 0)
- // {
- // j += 8;
- // mi >>>= 8;
- // }
- // while ((mi & 1L) == 0)
- // {
- // ++j;
- // mi >>>= 1;
- // }
- // return (i << 6) + j;
- // }
- // }
- // return -1;
- // }
-
- private static int BitLength(long w)
- {
- int u = (int)((ulong)w >> 32), b;
- if (u == 0)
- {
- u = (int)w;
- b = 0;
- }
- else
- {
- b = 32;
- }
-
- int t = (int)((uint)u >> 16), k;
- if (t == 0)
- {
- t = (int)((uint)u >> 8);
- k = (t == 0) ? BitLengths[u] : 8 + BitLengths[t];
- }
- else
- {
- int v = (int)((uint)t >> 8);
- k = (v == 0) ? 16 + BitLengths[t] : 24 + BitLengths[v];
- }
-
- return b + k;
- }
-
- private long[] ResizedInts(int newLen)
- {
- long[] newInts = new long[newLen];
- Array.Copy(m_ints, 0, newInts, 0, System.Math.Min(m_ints.Length, newLen));
- return newInts;
- }
-
- public BigInteger ToBigInteger()
- {
- int usedLen = GetUsedLength();
- if (usedLen == 0)
- {
- return BigInteger.Zero;
- }
-
- long highestInt = m_ints[usedLen - 1];
- byte[] temp = new byte[8];
- int barrI = 0;
- bool trailingZeroBytesDone = false;
- for (int j = 7; j >= 0; j--)
- {
- byte thisByte = (byte)((ulong)highestInt >> (8 * j));
- if (trailingZeroBytesDone || (thisByte != 0))
- {
- trailingZeroBytesDone = true;
- temp[barrI++] = thisByte;
- }
- }
-
- int barrLen = 8 * (usedLen - 1) + barrI;
- byte[] barr = new byte[barrLen];
- for (int j = 0; j < barrI; j++)
- {
- barr[j] = temp[j];
- }
- // Highest value int is done now
-
- for (int iarrJ = usedLen - 2; iarrJ >= 0; iarrJ--)
- {
- long mi = m_ints[iarrJ];
- for (int j = 7; j >= 0; j--)
- {
- barr[barrI++] = (byte)((ulong)mi >> (8 * j));
- }
- }
- return new BigInteger(1, barr);
- }
-
- // private static long shiftUp(long[] x, int xOff, int count)
- // {
- // long prev = 0;
- // for (int i = 0; i < count; ++i)
- // {
- // long next = x[xOff + i];
- // x[xOff + i] = (next << 1) | prev;
- // prev = next >>> 63;
- // }
- // return prev;
- // }
-
- private static long ShiftUp(long[] x, int xOff, int count, int shift)
- {
- int shiftInv = 64 - shift;
- long prev = 0;
- for (int i = 0; i < count; ++i)
- {
- long next = x[xOff + i];
- x[xOff + i] = (next << shift) | prev;
- prev = (long)((ulong)next >> shiftInv);
- }
- return prev;
- }
-
- private static long ShiftUp(long[] x, int xOff, long[] z, int zOff, int count, int shift)
- {
- int shiftInv = 64 - shift;
- long prev = 0;
- for (int i = 0; i < count; ++i)
- {
- long next = x[xOff + i];
- z[zOff + i] = (next << shift) | prev;
- prev = (long)((ulong)next >> shiftInv);
- }
- return prev;
- }
-
- public LongArray AddOne()
- {
- if (m_ints.Length == 0)
- {
- return new LongArray(new long[]{ 1L });
- }
-
- int resultLen = System.Math.Max(1, GetUsedLength());
- long[] ints = ResizedInts(resultLen);
- ints[0] ^= 1L;
- return new LongArray(ints);
- }
-
- // private void addShiftedByBits(LongArray other, int bits)
- // {
- // int words = bits >>> 6;
- // int shift = bits & 0x3F;
- //
- // if (shift == 0)
- // {
- // addShiftedByWords(other, words);
- // return;
- // }
- //
- // int otherUsedLen = other.GetUsedLength();
- // if (otherUsedLen == 0)
- // {
- // return;
- // }
- //
- // int minLen = otherUsedLen + words + 1;
- // if (minLen > m_ints.Length)
- // {
- // m_ints = resizedInts(minLen);
- // }
- //
- // long carry = addShiftedByBits(m_ints, words, other.m_ints, 0, otherUsedLen, shift);
- // m_ints[otherUsedLen + words] ^= carry;
- // }
-
- private void AddShiftedByBitsSafe(LongArray other, int otherDegree, int bits)
- {
- int otherLen = (int)((uint)(otherDegree + 63) >> 6);
-
- int words = (int)((uint)bits >> 6);
- int shift = bits & 0x3F;
-
- if (shift == 0)
- {
- Add(m_ints, words, other.m_ints, 0, otherLen);
- return;
- }
-
- long carry = AddShiftedUp(m_ints, words, other.m_ints, 0, otherLen, shift);
- if (carry != 0L)
- {
- m_ints[otherLen + words] ^= carry;
- }
- }
-
- private static long AddShiftedUp(long[] x, int xOff, long[] y, int yOff, int count, int shift)
- {
- int shiftInv = 64 - shift;
- long prev = 0;
- for (int i = 0; i < count; ++i)
- {
- long next = y[yOff + i];
- x[xOff + i] ^= (next << shift) | prev;
- prev = (long)((ulong)next >> shiftInv);
- }
- return prev;
- }
-
- private static long AddShiftedDown(long[] x, int xOff, long[] y, int yOff, int count, int shift)
- {
- int shiftInv = 64 - shift;
- long prev = 0;
- int i = count;
- while (--i >= 0)
- {
- long next = y[yOff + i];
- x[xOff + i] ^= (long)((ulong)next >> shift) | prev;
- prev = next << shiftInv;
- }
- return prev;
- }
-
- public void AddShiftedByWords(LongArray other, int words)
- {
- int otherUsedLen = other.GetUsedLength();
- if (otherUsedLen == 0)
- {
- return;
- }
-
- int minLen = otherUsedLen + words;
- if (minLen > m_ints.Length)
- {
- m_ints = ResizedInts(minLen);
- }
-
- Add(m_ints, words, other.m_ints, 0, otherUsedLen);
- }
-
- private static void Add(long[] x, int xOff, long[] y, int yOff, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- x[xOff + i] ^= y[yOff + i];
- }
- }
-
- private static void Add(long[] x, int xOff, long[] y, int yOff, long[] z, int zOff, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- z[zOff + i] = x[xOff + i] ^ y[yOff + i];
- }
- }
-
- private static void AddBoth(long[] x, int xOff, long[] y1, int y1Off, long[] y2, int y2Off, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- x[xOff + i] ^= y1[y1Off + i] ^ y2[y2Off + i];
- }
- }
-
- private static void Distribute(long[] x, int src, int dst1, int dst2, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- long v = x[src + i];
- x[dst1 + i] ^= v;
- x[dst2 + i] ^= v;
- }
- }
-
- public int Length
- {
- get { return m_ints.Length; }
- }
-
- private static void FlipWord(long[] buf, int off, int bit, long word)
- {
- int n = off + (int)((uint)bit >> 6);
- int shift = bit & 0x3F;
- if (shift == 0)
- {
- buf[n] ^= word;
- }
- else
- {
- buf[n] ^= word << shift;
- word = (long)((ulong)word >> (64 - shift));
- if (word != 0)
- {
- buf[++n] ^= word;
- }
- }
- }
-
- // private static long getWord(long[] buf, int off, int len, int bit)
- // {
- // int n = off + (bit >>> 6);
- // int shift = bit & 0x3F;
- // if (shift == 0)
- // {
- // return buf[n];
- // }
- // long result = buf[n] >>> shift;
- // if (++n < len)
- // {
- // result |= buf[n] << (64 - shift);
- // }
- // return result;
- // }
-
- public bool TestBitZero()
- {
- return m_ints.Length > 0 && (m_ints[0] & 1L) != 0;
- }
-
- private static bool TestBit(long[] buf, int off, int n)
- {
- // theInt = n / 64
- int theInt = (int)((uint)n >> 6);
- // theBit = n % 64
- int theBit = n & 0x3F;
- long tester = 1L << theBit;
- return (buf[off + theInt] & tester) != 0;
- }
-
- private static void FlipBit(long[] buf, int off, int n)
- {
- // theInt = n / 64
- int theInt = (int)((uint)n >> 6);
- // theBit = n % 64
- int theBit = n & 0x3F;
- long flipper = 1L << theBit;
- buf[off + theInt] ^= flipper;
- }
-
- // private static void SetBit(long[] buf, int off, int n)
- // {
- // // theInt = n / 64
- // int theInt = n >>> 6;
- // // theBit = n % 64
- // int theBit = n & 0x3F;
- // long setter = 1L << theBit;
- // buf[off + theInt] |= setter;
- // }
- //
- // private static void ClearBit(long[] buf, int off, int n)
- // {
- // // theInt = n / 64
- // int theInt = n >>> 6;
- // // theBit = n % 64
- // int theBit = n & 0x3F;
- // long setter = 1L << theBit;
- // buf[off + theInt] &= ~setter;
- // }
-
- private static void MultiplyWord(long a, long[] b, int bLen, long[] c, int cOff)
- {
- if ((a & 1L) != 0L)
- {
- Add(c, cOff, b, 0, bLen);
- }
- int k = 1;
- while ((a = (long)((ulong)a >> 1)) != 0L)
- {
- if ((a & 1L) != 0L)
- {
- long carry = AddShiftedUp(c, cOff, b, 0, bLen, k);
- if (carry != 0L)
- {
- c[cOff + bLen] ^= carry;
- }
- }
- ++k;
- }
- }
-
- public LongArray ModMultiplyLD(LongArray other, int m, int[] ks)
- {
- /*
- * Find out the degree of each argument and handle the zero cases
- */
- int aDeg = Degree();
- if (aDeg == 0)
- {
- return this;
- }
- int bDeg = other.Degree();
- if (bDeg == 0)
- {
- return other;
- }
-
- /*
- * Swap if necessary so that A is the smaller argument
- */
- LongArray A = this, B = other;
- if (aDeg > bDeg)
- {
- A = other; B = this;
- int tmp = aDeg; aDeg = bDeg; bDeg = tmp;
- }
-
- /*
- * Establish the word lengths of the arguments and result
- */
- int aLen = (int)((uint)(aDeg + 63) >> 6);
- int bLen = (int)((uint)(bDeg + 63) >> 6);
- int cLen = (int)((uint)(aDeg + bDeg + 62) >> 6);
-
- if (aLen == 1)
- {
- long a0 = A.m_ints[0];
- if (a0 == 1L)
- {
- return B;
- }
-
- /*
- * Fast path for small A, with performance dependent only on the number of set bits
- */
- long[] c0 = new long[cLen];
- MultiplyWord(a0, B.m_ints, bLen, c0, 0);
-
- /*
- * Reduce the raw answer against the reduction coefficients
- */
- return ReduceResult(c0, 0, cLen, m, ks);
- }
-
- /*
- * Determine if B will get bigger during shifting
- */
- int bMax = (int)((uint)(bDeg + 7 + 63) >> 6);
-
- /*
- * Lookup table for the offset of each B in the tables
- */
- int[] ti = new int[16];
-
- /*
- * Precompute table of all 4-bit products of B
- */
- long[] T0 = new long[bMax << 4];
- int tOff = bMax;
- ti[1] = tOff;
- Array.Copy(B.m_ints, 0, T0, tOff, bLen);
- for (int i = 2; i < 16; ++i)
- {
- ti[i] = (tOff += bMax);
- if ((i & 1) == 0)
- {
- ShiftUp(T0, (int)((uint)tOff >> 1), T0, tOff, bMax, 1);
- }
- else
- {
- Add(T0, bMax, T0, tOff - bMax, T0, tOff, bMax);
- }
- }
-
- /*
- * Second table with all 4-bit products of B shifted 4 bits
- */
- long[] T1 = new long[T0.Length];
- ShiftUp(T0, 0, T1, 0, T0.Length, 4);
- // shiftUp(T0, bMax, T1, bMax, tOff, 4);
-
- long[] a = A.m_ints;
- long[] c = new long[cLen];
-
- int MASK = 0xF;
-
- /*
- * Lopez-Dahab algorithm
- */
-
- for (int k = 56; k >= 0; k -= 8)
- {
- for (int j = 1; j < aLen; j += 2)
- {
- int aVal = (int)((ulong)a[j] >> k);
- int u = aVal & MASK;
- int v = (int)((uint)aVal >> 4) & MASK;
- AddBoth(c, j - 1, T0, ti[u], T1, ti[v], bMax);
- }
- ShiftUp(c, 0, cLen, 8);
- }
-
- for (int k = 56; k >= 0; k -= 8)
- {
- for (int j = 0; j < aLen; j += 2)
- {
- int aVal = (int)((ulong)a[j] >> k);
- int u = aVal & MASK;
- int v = (int)((uint)aVal >> 4) & MASK;
- AddBoth(c, j, T0, ti[u], T1, ti[v], bMax);
- }
- if (k > 0)
- {
- ShiftUp(c, 0, cLen, 8);
- }
- }
-
- /*
- * Finally the raw answer is collected, reduce it against the reduction coefficients
- */
- return ReduceResult(c, 0, cLen, m, ks);
- }
-
- public LongArray ModMultiply(LongArray other, int m, int[] ks)
- {
- /*
- * Find out the degree of each argument and handle the zero cases
- */
- int aDeg = Degree();
- if (aDeg == 0)
- {
- return this;
- }
- int bDeg = other.Degree();
- if (bDeg == 0)
- {
- return other;
- }
-
- /*
- * Swap if necessary so that A is the smaller argument
- */
- LongArray A = this, B = other;
- if (aDeg > bDeg)
- {
- A = other; B = this;
- int tmp = aDeg; aDeg = bDeg; bDeg = tmp;
- }
-
- /*
- * Establish the word lengths of the arguments and result
- */
- int aLen = (int)((uint)(aDeg + 63) >> 6);
- int bLen = (int)((uint)(bDeg + 63) >> 6);
- int cLen = (int)((uint)(aDeg + bDeg + 62) >> 6);
-
- if (aLen == 1)
- {
- long a0 = A.m_ints[0];
- if (a0 == 1L)
- {
- return B;
- }
-
- /*
- * Fast path for small A, with performance dependent only on the number of set bits
- */
- long[] c0 = new long[cLen];
- MultiplyWord(a0, B.m_ints, bLen, c0, 0);
-
- /*
- * Reduce the raw answer against the reduction coefficients
- */
- return ReduceResult(c0, 0, cLen, m, ks);
- }
-
- /*
- * Determine if B will get bigger during shifting
- */
- int bMax = (int)((uint)(bDeg + 7 + 63) >> 6);
-
- /*
- * Lookup table for the offset of each B in the tables
- */
- int[] ti = new int[16];
-
- /*
- * Precompute table of all 4-bit products of B
- */
- long[] T0 = new long[bMax << 4];
- int tOff = bMax;
- ti[1] = tOff;
- Array.Copy(B.m_ints, 0, T0, tOff, bLen);
- for (int i = 2; i < 16; ++i)
- {
- ti[i] = (tOff += bMax);
- if ((i & 1) == 0)
- {
- ShiftUp(T0, (int)((uint)tOff >> 1), T0, tOff, bMax, 1);
- }
- else
- {
- Add(T0, bMax, T0, tOff - bMax, T0, tOff, bMax);
- }
- }
-
- /*
- * Second table with all 4-bit products of B shifted 4 bits
- */
- long[] T1 = new long[T0.Length];
- ShiftUp(T0, 0, T1, 0, T0.Length, 4);
- // ShiftUp(T0, bMax, T1, bMax, tOff, 4);
-
- long[] a = A.m_ints;
- long[] c = new long[cLen << 3];
-
- int MASK = 0xF;
-
- /*
- * Lopez-Dahab (Modified) algorithm
- */
-
- for (int aPos = 0; aPos < aLen; ++aPos)
- {
- long aVal = a[aPos];
- int cOff = aPos;
- for (;;)
- {
- int u = (int)aVal & MASK;
- aVal = (long)((ulong)aVal >> 4);
- int v = (int)aVal & MASK;
- AddBoth(c, cOff, T0, ti[u], T1, ti[v], bMax);
- aVal = (long)((ulong)aVal >> 4);
- if (aVal == 0L)
- {
- break;
- }
- cOff += cLen;
- }
- }
-
- {
- int cOff = c.Length;
- while ((cOff -= cLen) != 0)
- {
- AddShiftedUp(c, cOff - cLen, c, cOff, cLen, 8);
- }
- }
-
- /*
- * Finally the raw answer is collected, reduce it against the reduction coefficients
- */
- return ReduceResult(c, 0, cLen, m, ks);
- }
-
- public LongArray ModMultiplyAlt(LongArray other, int m, int[] ks)
- {
- /*
- * Find out the degree of each argument and handle the zero cases
- */
- int aDeg = Degree();
- if (aDeg == 0)
- {
- return this;
- }
- int bDeg = other.Degree();
- if (bDeg == 0)
- {
- return other;
- }
-
- /*
- * Swap if necessary so that A is the smaller argument
- */
- LongArray A = this, B = other;
- if (aDeg > bDeg)
- {
- A = other; B = this;
- int tmp = aDeg; aDeg = bDeg; bDeg = tmp;
- }
-
- /*
- * Establish the word lengths of the arguments and result
- */
- int aLen = (int)((uint)(aDeg + 63) >> 6);
- int bLen = (int)((uint)(bDeg + 63) >> 6);
- int cLen = (int)((uint)(aDeg + bDeg + 62) >> 6);
-
- if (aLen == 1)
- {
- long a0 = A.m_ints[0];
- if (a0 == 1L)
- {
- return B;
- }
-
- /*
- * Fast path for small A, with performance dependent only on the number of set bits
- */
- long[] c0 = new long[cLen];
- MultiplyWord(a0, B.m_ints, bLen, c0, 0);
-
- /*
- * Reduce the raw answer against the reduction coefficients
- */
- return ReduceResult(c0, 0, cLen, m, ks);
- }
-
- // NOTE: This works, but is slower than width 4 processing
- // if (aLen == 2)
- // {
- // /*
- // * Use common-multiplicand optimization to save ~1/4 of the adds
- // */
- // long a1 = A.m_ints[0], a2 = A.m_ints[1];
- // long aa = a1 & a2; a1 ^= aa; a2 ^= aa;
- //
- // long[] b = B.m_ints;
- // long[] c = new long[cLen];
- // multiplyWord(aa, b, bLen, c, 1);
- // add(c, 0, c, 1, cLen - 1);
- // multiplyWord(a1, b, bLen, c, 0);
- // multiplyWord(a2, b, bLen, c, 1);
- //
- // /*
- // * Reduce the raw answer against the reduction coefficients
- // */
- // return ReduceResult(c, 0, cLen, m, ks);
- // }
-
- /*
- * Determine the parameters of the Interleaved window algorithm: the 'width' in bits to
- * process together, the number of evaluation 'positions' implied by that width, and the
- * 'top' position at which the regular window algorithm stops.
- */
- int width, positions, top, banks;
-
- // NOTE: width 4 is the fastest over the entire range of sizes used in current crypto
- // width = 1; positions = 64; top = 64; banks = 4;
- // width = 2; positions = 32; top = 64; banks = 4;
- // width = 3; positions = 21; top = 63; banks = 3;
- width = 4; positions = 16; top = 64; banks = 8;
- // width = 5; positions = 13; top = 65; banks = 7;
- // width = 7; positions = 9; top = 63; banks = 9;
- // width = 8; positions = 8; top = 64; banks = 8;
-
- /*
- * Determine if B will get bigger during shifting
- */
- int shifts = top < 64 ? positions : positions - 1;
- int bMax = (int)((uint)(bDeg + shifts + 63) >> 6);
-
- int bTotal = bMax * banks, stride = width * banks;
-
- /*
- * Create a single temporary buffer, with an offset table to find the positions of things in it
- */
- int[] ci = new int[1 << width];
- int cTotal = aLen;
- {
- ci[0] = cTotal;
- cTotal += bTotal;
- ci[1] = cTotal;
- for (int i = 2; i < ci.Length; ++i)
- {
- cTotal += cLen;
- ci[i] = cTotal;
- }
- cTotal += cLen;
- }
- // NOTE: Provide a safe dump for "high zeroes" since we are adding 'bMax' and not 'bLen'
- ++cTotal;
-
- long[] c = new long[cTotal];
-
- // Prepare A in Interleaved form, according to the chosen width
- Interleave(A.m_ints, 0, c, 0, aLen, width);
-
- // Make a working copy of B, since we will be shifting it
- {
- int bOff = aLen;
- Array.Copy(B.m_ints, 0, c, bOff, bLen);
- for (int bank = 1; bank < banks; ++bank)
- {
- ShiftUp(c, aLen, c, bOff += bMax, bMax, bank);
- }
- }
-
- /*
- * The main loop analyzes the Interleaved windows in A, and for each non-zero window
- * a single word-array XOR is performed to a carefully selected slice of 'c'. The loop is
- * breadth-first, checking the lowest window in each word, then looping again for the
- * next higher window position.
- */
- int MASK = (1 << width) - 1;
-
- int k = 0;
- for (;;)
- {
- int aPos = 0;
- do
- {
- long aVal = (long)((ulong)c[aPos] >> k);
- int bank = 0, bOff = aLen;
- for (;;)
- {
- int index = (int)(aVal) & MASK;
- if (index != 0)
- {
- /*
- * Add to a 'c' buffer based on the bit-pattern of 'index'. Since A is in
- * Interleaved form, the bits represent the current B shifted by 0, 'positions',
- * 'positions' * 2, ..., 'positions' * ('width' - 1)
- */
- Add(c, aPos + ci[index], c, bOff, bMax);
- }
- if (++bank == banks)
- {
- break;
- }
- bOff += bMax;
- aVal = (long)((ulong)aVal >> width);
- }
- }
- while (++aPos < aLen);
-
- if ((k += stride) >= top)
- {
- if (k >= 64)
- {
- break;
- }
-
- /*
- * Adjustment for window setups with top == 63, the final bit (if any) is processed
- * as the top-bit of a window
- */
- k = 64 - width;
- MASK &= MASK << (top - k);
- }
-
- /*
- * After each position has been checked for all words of A, B is shifted up 1 place
- */
- ShiftUp(c, aLen, bTotal, banks);
- }
-
- int ciPos = ci.Length;
- while (--ciPos > 1)
- {
- if ((ciPos & 1L) == 0L)
- {
- /*
- * For even numbers, shift contents and add to the half-position
- */
- AddShiftedUp(c, ci[(uint)ciPos >> 1], c, ci[ciPos], cLen, positions);
- }
- else
- {
- /*
- * For odd numbers, 'distribute' contents to the result and the next-lowest position
- */
- Distribute(c, ci[ciPos], ci[ciPos - 1], ci[1], cLen);
- }
- }
-
- /*
- * Finally the raw answer is collected, reduce it against the reduction coefficients
- */
- return ReduceResult(c, ci[1], cLen, m, ks);
- }
-
- public LongArray ModReduce(int m, int[] ks)
- {
- long[] buf = Arrays.Clone(m_ints);
- int rLen = ReduceInPlace(buf, 0, buf.Length, m, ks);
- return new LongArray(buf, 0, rLen);
- }
-
- public LongArray Multiply(LongArray other, int m, int[] ks)
- {
- /*
- * Find out the degree of each argument and handle the zero cases
- */
- int aDeg = Degree();
- if (aDeg == 0)
- {
- return this;
- }
- int bDeg = other.Degree();
- if (bDeg == 0)
- {
- return other;
- }
-
- /*
- * Swap if necessary so that A is the smaller argument
- */
- LongArray A = this, B = other;
- if (aDeg > bDeg)
- {
- A = other; B = this;
- int tmp = aDeg; aDeg = bDeg; bDeg = tmp;
- }
-
- /*
- * Establish the word lengths of the arguments and result
- */
- int aLen = (int)((uint)(aDeg + 63) >> 6);
- int bLen = (int)((uint)(bDeg + 63) >> 6);
- int cLen = (int)((uint)(aDeg + bDeg + 62) >> 6);
-
- if (aLen == 1)
- {
- long a0 = A.m_ints[0];
- if (a0 == 1L)
- {
- return B;
- }
-
- /*
- * Fast path for small A, with performance dependent only on the number of set bits
- */
- long[] c0 = new long[cLen];
- MultiplyWord(a0, B.m_ints, bLen, c0, 0);
-
- /*
- * Reduce the raw answer against the reduction coefficients
- */
- //return ReduceResult(c0, 0, cLen, m, ks);
- return new LongArray(c0, 0, cLen);
- }
-
- /*
- * Determine if B will get bigger during shifting
- */
- int bMax = (int)((uint)(bDeg + 7 + 63) >> 6);
-
- /*
- * Lookup table for the offset of each B in the tables
- */
- int[] ti = new int[16];
-
- /*
- * Precompute table of all 4-bit products of B
- */
- long[] T0 = new long[bMax << 4];
- int tOff = bMax;
- ti[1] = tOff;
- Array.Copy(B.m_ints, 0, T0, tOff, bLen);
- for (int i = 2; i < 16; ++i)
- {
- ti[i] = (tOff += bMax);
- if ((i & 1) == 0)
- {
- ShiftUp(T0, (int)((uint)tOff >> 1), T0, tOff, bMax, 1);
- }
- else
- {
- Add(T0, bMax, T0, tOff - bMax, T0, tOff, bMax);
- }
- }
-
- /*
- * Second table with all 4-bit products of B shifted 4 bits
- */
- long[] T1 = new long[T0.Length];
- ShiftUp(T0, 0, T1, 0, T0.Length, 4);
- // ShiftUp(T0, bMax, T1, bMax, tOff, 4);
-
- long[] a = A.m_ints;
- long[] c = new long[cLen << 3];
-
- int MASK = 0xF;
-
- /*
- * Lopez-Dahab (Modified) algorithm
- */
-
- for (int aPos = 0; aPos < aLen; ++aPos)
- {
- long aVal = a[aPos];
- int cOff = aPos;
- for (; ; )
- {
- int u = (int)aVal & MASK;
- aVal = (long)((ulong)aVal >> 4);
- int v = (int)aVal & MASK;
- AddBoth(c, cOff, T0, ti[u], T1, ti[v], bMax);
- aVal = (long)((ulong)aVal >> 4);
- if (aVal == 0L)
- {
- break;
- }
- cOff += cLen;
- }
- }
-
- {
- int cOff = c.Length;
- while ((cOff -= cLen) != 0)
- {
- AddShiftedUp(c, cOff - cLen, c, cOff, cLen, 8);
- }
- }
-
- /*
- * Finally the raw answer is collected, reduce it against the reduction coefficients
- */
- //return ReduceResult(c, 0, cLen, m, ks);
- return new LongArray(c, 0, cLen);
- }
-
- public void Reduce(int m, int[] ks)
- {
- long[] buf = m_ints;
- int rLen = ReduceInPlace(buf, 0, buf.Length, m, ks);
- if (rLen < buf.Length)
- {
- m_ints = new long[rLen];
- Array.Copy(buf, 0, m_ints, 0, rLen);
- }
- }
-
- private static LongArray ReduceResult(long[] buf, int off, int len, int m, int[] ks)
- {
- int rLen = ReduceInPlace(buf, off, len, m, ks);
- return new LongArray(buf, off, rLen);
- }
-
- // private static void deInterleave(long[] x, int xOff, long[] z, int zOff, int count, int rounds)
- // {
- // for (int i = 0; i < count; ++i)
- // {
- // z[zOff + i] = deInterleave(x[zOff + i], rounds);
- // }
- // }
- //
- // private static long deInterleave(long x, int rounds)
- // {
- // while (--rounds >= 0)
- // {
- // x = deInterleave32(x & DEInterleave_MASK) | (deInterleave32((x >>> 1) & DEInterleave_MASK) << 32);
- // }
- // return x;
- // }
- //
- // private static long deInterleave32(long x)
- // {
- // x = (x | (x >>> 1)) & 0x3333333333333333L;
- // x = (x | (x >>> 2)) & 0x0F0F0F0F0F0F0F0FL;
- // x = (x | (x >>> 4)) & 0x00FF00FF00FF00FFL;
- // x = (x | (x >>> 8)) & 0x0000FFFF0000FFFFL;
- // x = (x | (x >>> 16)) & 0x00000000FFFFFFFFL;
- // return x;
- // }
-
- private static int ReduceInPlace(long[] buf, int off, int len, int m, int[] ks)
- {
- int mLen = (m + 63) >> 6;
- if (len < mLen)
- {
- return len;
- }
-
- int numBits = System.Math.Min(len << 6, (m << 1) - 1); // TODO use actual degree?
- int excessBits = (len << 6) - numBits;
- while (excessBits >= 64)
- {
- --len;
- excessBits -= 64;
- }
-
- int kLen = ks.Length, kMax = ks[kLen - 1], kNext = kLen > 1 ? ks[kLen - 2] : 0;
- int wordWiseLimit = System.Math.Max(m, kMax + 64);
- int vectorableWords = (excessBits + System.Math.Min(numBits - wordWiseLimit, m - kNext)) >> 6;
- if (vectorableWords > 1)
- {
- int vectorWiseWords = len - vectorableWords;
- ReduceVectorWise(buf, off, len, vectorWiseWords, m, ks);
- while (len > vectorWiseWords)
- {
- buf[off + --len] = 0L;
- }
- numBits = vectorWiseWords << 6;
- }
-
- if (numBits > wordWiseLimit)
- {
- ReduceWordWise(buf, off, len, wordWiseLimit, m, ks);
- numBits = wordWiseLimit;
- }
-
- if (numBits > m)
- {
- ReduceBitWise(buf, off, numBits, m, ks);
- }
-
- return mLen;
- }
-
- private static void ReduceBitWise(long[] buf, int off, int BitLength, int m, int[] ks)
- {
- while (--BitLength >= m)
- {
- if (TestBit(buf, off, BitLength))
- {
- ReduceBit(buf, off, BitLength, m, ks);
- }
- }
- }
-
- private static void ReduceBit(long[] buf, int off, int bit, int m, int[] ks)
- {
- FlipBit(buf, off, bit);
- int n = bit - m;
- int j = ks.Length;
- while (--j >= 0)
- {
- FlipBit(buf, off, ks[j] + n);
- }
- FlipBit(buf, off, n);
- }
-
- private static void ReduceWordWise(long[] buf, int off, int len, int toBit, int m, int[] ks)
- {
- int toPos = (int)((uint)toBit >> 6);
-
- while (--len > toPos)
- {
- long word = buf[off + len];
- if (word != 0)
- {
- buf[off + len] = 0;
- ReduceWord(buf, off, (len << 6), word, m, ks);
- }
- }
-
- {
- int partial = toBit & 0x3F;
- long word = (long)((ulong)buf[off + toPos] >> partial);
- if (word != 0)
- {
- buf[off + toPos] ^= word << partial;
- ReduceWord(buf, off, toBit, word, m, ks);
- }
- }
- }
-
- private static void ReduceWord(long[] buf, int off, int bit, long word, int m, int[] ks)
- {
- int offset = bit - m;
- int j = ks.Length;
- while (--j >= 0)
- {
- FlipWord(buf, off, offset + ks[j], word);
- }
- FlipWord(buf, off, offset, word);
- }
-
- private static void ReduceVectorWise(long[] buf, int off, int len, int words, int m, int[] ks)
- {
- /*
- * NOTE: It's important we go from highest coefficient to lowest, because for the highest
- * one (only) we allow the ranges to partially overlap, and therefore any changes must take
- * effect for the subsequent lower coefficients.
- */
- int baseBit = (words << 6) - m;
- int j = ks.Length;
- while (--j >= 0)
- {
- FlipVector(buf, off, buf, off + words, len - words, baseBit + ks[j]);
- }
- FlipVector(buf, off, buf, off + words, len - words, baseBit);
- }
-
- private static void FlipVector(long[] x, int xOff, long[] y, int yOff, int yLen, int bits)
- {
- xOff += (int)((uint)bits >> 6);
- bits &= 0x3F;
-
- if (bits == 0)
- {
- Add(x, xOff, y, yOff, yLen);
- }
- else
- {
- long carry = AddShiftedDown(x, xOff + 1, y, yOff, yLen, 64 - bits);
- x[xOff] ^= carry;
- }
- }
-
- public LongArray ModSquare(int m, int[] ks)
- {
- int len = GetUsedLength();
- if (len == 0)
- {
- return this;
- }
-
- int _2len = len << 1;
- long[] r = new long[_2len];
-
- int pos = 0;
- while (pos < _2len)
- {
- long mi = m_ints[(uint)pos >> 1];
- r[pos++] = Interleave2_32to64((int)mi);
- r[pos++] = Interleave2_32to64((int)((ulong)mi >> 32));
- }
-
- return new LongArray(r, 0, ReduceInPlace(r, 0, r.Length, m, ks));
- }
-
- public LongArray ModSquareN(int n, int m, int[] ks)
- {
- int len = GetUsedLength();
- if (len == 0)
- {
- return this;
- }
-
- int mLen = (m + 63) >> 6;
- long[] r = new long[mLen << 1];
- Array.Copy(m_ints, 0, r, 0, len);
-
- while (--n >= 0)
- {
- SquareInPlace(r, len, m, ks);
- len = ReduceInPlace(r, 0, r.Length, m, ks);
- }
-
- return new LongArray(r, 0, len);
- }
-
- public LongArray Square(int m, int[] ks)
- {
- int len = GetUsedLength();
- if (len == 0)
- {
- return this;
- }
-
- int _2len = len << 1;
- long[] r = new long[_2len];
-
- int pos = 0;
- while (pos < _2len)
- {
- long mi = m_ints[(uint)pos >> 1];
- r[pos++] = Interleave2_32to64((int)mi);
- r[pos++] = Interleave2_32to64((int)((ulong)mi >> 32));
- }
-
- return new LongArray(r, 0, r.Length);
- }
-
- private static void SquareInPlace(long[] x, int xLen, int m, int[] ks)
- {
- int pos = xLen << 1;
- while (--xLen >= 0)
- {
- long xVal = x[xLen];
- x[--pos] = Interleave2_32to64((int)((ulong)xVal >> 32));
- x[--pos] = Interleave2_32to64((int)xVal);
- }
- }
-
- private static void Interleave(long[] x, int xOff, long[] z, int zOff, int count, int width)
- {
- switch (width)
- {
- case 3:
- Interleave3(x, xOff, z, zOff, count);
- break;
- case 5:
- Interleave5(x, xOff, z, zOff, count);
- break;
- case 7:
- Interleave7(x, xOff, z, zOff, count);
- break;
- default:
- Interleave2_n(x, xOff, z, zOff, count, BitLengths[width] - 1);
- break;
- }
- }
-
- private static void Interleave3(long[] x, int xOff, long[] z, int zOff, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- z[zOff + i] = Interleave3(x[xOff + i]);
- }
- }
-
- private static long Interleave3(long x)
- {
- long z = x & (1L << 63);
- return z
- | Interleave3_21to63((int)x & 0x1FFFFF)
- | Interleave3_21to63((int)((ulong)x >> 21) & 0x1FFFFF) << 1
- | Interleave3_21to63((int)((ulong)x >> 42) & 0x1FFFFF) << 2;
-
- // int zPos = 0, wPos = 0, xPos = 0;
- // for (;;)
- // {
- // z |= ((x >>> xPos) & 1L) << zPos;
- // if (++zPos == 63)
- // {
- // String sz2 = Long.toBinaryString(z);
- // return z;
- // }
- // if ((xPos += 21) >= 63)
- // {
- // xPos = ++wPos;
- // }
- // }
- }
-
- private static long Interleave3_21to63(int x)
- {
- int r00 = INTERLEAVE3_TABLE[x & 0x7F];
- int r21 = INTERLEAVE3_TABLE[((uint)x >> 7) & 0x7F];
- int r42 = INTERLEAVE3_TABLE[(uint)x >> 14];
- return (r42 & 0xFFFFFFFFL) << 42 | (r21 & 0xFFFFFFFFL) << 21 | (r00 & 0xFFFFFFFFL);
- }
-
- private static void Interleave5(long[] x, int xOff, long[] z, int zOff, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- z[zOff + i] = Interleave5(x[xOff + i]);
- }
- }
-
- private static long Interleave5(long x)
- {
- return Interleave3_13to65((int)x & 0x1FFF)
- | Interleave3_13to65((int)((ulong)x >> 13) & 0x1FFF) << 1
- | Interleave3_13to65((int)((ulong)x >> 26) & 0x1FFF) << 2
- | Interleave3_13to65((int)((ulong)x >> 39) & 0x1FFF) << 3
- | Interleave3_13to65((int)((ulong)x >> 52) & 0x1FFF) << 4;
-
- // long z = 0;
- // int zPos = 0, wPos = 0, xPos = 0;
- // for (;;)
- // {
- // z |= ((x >>> xPos) & 1L) << zPos;
- // if (++zPos == 64)
- // {
- // return z;
- // }
- // if ((xPos += 13) >= 64)
- // {
- // xPos = ++wPos;
- // }
- // }
- }
-
- private static long Interleave3_13to65(int x)
- {
- int r00 = INTERLEAVE5_TABLE[x & 0x7F];
- int r35 = INTERLEAVE5_TABLE[(uint)x >> 7];
- return (r35 & 0xFFFFFFFFL) << 35 | (r00 & 0xFFFFFFFFL);
- }
-
- private static void Interleave7(long[] x, int xOff, long[] z, int zOff, int count)
- {
- for (int i = 0; i < count; ++i)
- {
- z[zOff + i] = Interleave7(x[xOff + i]);
- }
- }
-
- private static long Interleave7(long x)
- {
- long z = x & (1L << 63);
- return z
- | INTERLEAVE7_TABLE[(int)x & 0x1FF]
- | INTERLEAVE7_TABLE[(int)((ulong)x >> 9) & 0x1FF] << 1
- | INTERLEAVE7_TABLE[(int)((ulong)x >> 18) & 0x1FF] << 2
- | INTERLEAVE7_TABLE[(int)((ulong)x >> 27) & 0x1FF] << 3
- | INTERLEAVE7_TABLE[(int)((ulong)x >> 36) & 0x1FF] << 4
- | INTERLEAVE7_TABLE[(int)((ulong)x >> 45) & 0x1FF] << 5
- | INTERLEAVE7_TABLE[(int)((ulong)x >> 54) & 0x1FF] << 6;
-
- // int zPos = 0, wPos = 0, xPos = 0;
- // for (;;)
- // {
- // z |= ((x >>> xPos) & 1L) << zPos;
- // if (++zPos == 63)
- // {
- // return z;
- // }
- // if ((xPos += 9) >= 63)
- // {
- // xPos = ++wPos;
- // }
- // }
- }
-
- private static void Interleave2_n(long[] x, int xOff, long[] z, int zOff, int count, int rounds)
- {
- for (int i = 0; i < count; ++i)
- {
- z[zOff + i] = Interleave2_n(x[xOff + i], rounds);
- }
- }
-
- private static long Interleave2_n(long x, int rounds)
- {
- while (rounds > 1)
- {
- rounds -= 2;
- x = Interleave4_16to64((int)x & 0xFFFF)
- | Interleave4_16to64((int)((ulong)x >> 16) & 0xFFFF) << 1
- | Interleave4_16to64((int)((ulong)x >> 32) & 0xFFFF) << 2
- | Interleave4_16to64((int)((ulong)x >> 48) & 0xFFFF) << 3;
- }
- if (rounds > 0)
- {
- x = Interleave2_32to64((int)x) | Interleave2_32to64((int)((ulong)x >> 32)) << 1;
- }
- return x;
- }
-
- private static long Interleave4_16to64(int x)
- {
- int r00 = INTERLEAVE4_TABLE[x & 0xFF];
- int r32 = INTERLEAVE4_TABLE[(uint)x >> 8];
- return (r32 & 0xFFFFFFFFL) << 32 | (r00 & 0xFFFFFFFFL);
- }
-
- private static long Interleave2_32to64(int x)
- {
- int r00 = INTERLEAVE2_TABLE[x & 0xFF] | INTERLEAVE2_TABLE[((uint)x >> 8) & 0xFF] << 16;
- int r32 = INTERLEAVE2_TABLE[((uint)x >> 16) & 0xFF] | INTERLEAVE2_TABLE[(uint)x >> 24] << 16;
- return (r32 & 0xFFFFFFFFL) << 32 | (r00 & 0xFFFFFFFFL);
- }
-
- // private static LongArray ExpItohTsujii2(LongArray B, int n, int m, int[] ks)
- // {
- // LongArray t1 = B, t3 = new LongArray(new long[]{ 1L });
- // int scale = 1;
- //
- // int numTerms = n;
- // while (numTerms > 1)
- // {
- // if ((numTerms & 1) != 0)
- // {
- // t3 = t3.ModMultiply(t1, m, ks);
- // t1 = t1.modSquareN(scale, m, ks);
- // }
- //
- // LongArray t2 = t1.modSquareN(scale, m, ks);
- // t1 = t1.ModMultiply(t2, m, ks);
- // numTerms >>>= 1; scale <<= 1;
- // }
- //
- // return t3.ModMultiply(t1, m, ks);
- // }
- //
- // private static LongArray ExpItohTsujii23(LongArray B, int n, int m, int[] ks)
- // {
- // LongArray t1 = B, t3 = new LongArray(new long[]{ 1L });
- // int scale = 1;
- //
- // int numTerms = n;
- // while (numTerms > 1)
- // {
- // bool m03 = numTerms % 3 == 0;
- // bool m14 = !m03 && (numTerms & 1) != 0;
- //
- // if (m14)
- // {
- // t3 = t3.ModMultiply(t1, m, ks);
- // t1 = t1.modSquareN(scale, m, ks);
- // }
- //
- // LongArray t2 = t1.modSquareN(scale, m, ks);
- // t1 = t1.ModMultiply(t2, m, ks);
- //
- // if (m03)
- // {
- // t2 = t2.modSquareN(scale, m, ks);
- // t1 = t1.ModMultiply(t2, m, ks);
- // numTerms /= 3; scale *= 3;
- // }
- // else
- // {
- // numTerms >>>= 1; scale <<= 1;
- // }
- // }
- //
- // return t3.ModMultiply(t1, m, ks);
- // }
- //
- // private static LongArray ExpItohTsujii235(LongArray B, int n, int m, int[] ks)
- // {
- // LongArray t1 = B, t4 = new LongArray(new long[]{ 1L });
- // int scale = 1;
- //
- // int numTerms = n;
- // while (numTerms > 1)
- // {
- // if (numTerms % 5 == 0)
- // {
- //// t1 = ExpItohTsujii23(t1, 5, m, ks);
- //
- // LongArray t3 = t1;
- // t1 = t1.modSquareN(scale, m, ks);
- //
- // LongArray t2 = t1.modSquareN(scale, m, ks);
- // t1 = t1.ModMultiply(t2, m, ks);
- // t2 = t1.modSquareN(scale << 1, m, ks);
- // t1 = t1.ModMultiply(t2, m, ks);
- //
- // t1 = t1.ModMultiply(t3, m, ks);
- //
- // numTerms /= 5; scale *= 5;
- // continue;
- // }
- //
- // bool m03 = numTerms % 3 == 0;
- // bool m14 = !m03 && (numTerms & 1) != 0;
- //
- // if (m14)
- // {
- // t4 = t4.ModMultiply(t1, m, ks);
- // t1 = t1.modSquareN(scale, m, ks);
- // }
- //
- // LongArray t2 = t1.modSquareN(scale, m, ks);
- // t1 = t1.ModMultiply(t2, m, ks);
- //
- // if (m03)
- // {
- // t2 = t2.modSquareN(scale, m, ks);
- // t1 = t1.ModMultiply(t2, m, ks);
- // numTerms /= 3; scale *= 3;
- // }
- // else
- // {
- // numTerms >>>= 1; scale <<= 1;
- // }
- // }
- //
- // return t4.ModMultiply(t1, m, ks);
- // }
-
- public LongArray ModInverse(int m, int[] ks)
- {
- /*
- * Fermat's Little Theorem
- */
- // LongArray A = this;
- // LongArray B = A.modSquare(m, ks);
- // LongArray R0 = B, R1 = B;
- // for (int i = 2; i < m; ++i)
- // {
- // R1 = R1.modSquare(m, ks);
- // R0 = R0.ModMultiply(R1, m, ks);
- // }
- //
- // return R0;
-
- /*
- * Itoh-Tsujii
- */
- // LongArray B = modSquare(m, ks);
- // switch (m)
- // {
- // case 409:
- // return ExpItohTsujii23(B, m - 1, m, ks);
- // case 571:
- // return ExpItohTsujii235(B, m - 1, m, ks);
- // case 163:
- // case 233:
- // case 283:
- // default:
- // return ExpItohTsujii2(B, m - 1, m, ks);
- // }
-
- /*
- * Inversion in F2m using the extended Euclidean algorithm
- *
- * Input: A nonzero polynomial a(z) of degree at most m-1
- * Output: a(z)^(-1) mod f(z)
- */
- int uzDegree = Degree();
- if (uzDegree == 0)
- {
- throw new InvalidOperationException();
- }
- if (uzDegree == 1)
- {
- return this;
- }
-
- // u(z) := a(z)
- LongArray uz = (LongArray)Copy();
-
- int t = (m + 63) >> 6;
-
- // v(z) := f(z)
- LongArray vz = new LongArray(t);
- ReduceBit(vz.m_ints, 0, m, m, ks);
-
- // g1(z) := 1, g2(z) := 0
- LongArray g1z = new LongArray(t);
- g1z.m_ints[0] = 1L;
- LongArray g2z = new LongArray(t);
-
- int[] uvDeg = new int[]{ uzDegree, m + 1 };
- LongArray[] uv = new LongArray[]{ uz, vz };
-
- int[] ggDeg = new int[]{ 1, 0 };
- LongArray[] gg = new LongArray[]{ g1z, g2z };
-
- int b = 1;
- int duv1 = uvDeg[b];
- int dgg1 = ggDeg[b];
- int j = duv1 - uvDeg[1 - b];
-
- for (;;)
- {
- if (j < 0)
- {
- j = -j;
- uvDeg[b] = duv1;
- ggDeg[b] = dgg1;
- b = 1 - b;
- duv1 = uvDeg[b];
- dgg1 = ggDeg[b];
- }
-
- uv[b].AddShiftedByBitsSafe(uv[1 - b], uvDeg[1 - b], j);
-
- int duv2 = uv[b].DegreeFrom(duv1);
- if (duv2 == 0)
- {
- return gg[1 - b];
- }
-
- {
- int dgg2 = ggDeg[1 - b];
- gg[b].AddShiftedByBitsSafe(gg[1 - b], dgg2, j);
- dgg2 += j;
-
- if (dgg2 > dgg1)
- {
- dgg1 = dgg2;
- }
- else if (dgg2 == dgg1)
- {
- dgg1 = gg[b].DegreeFrom(dgg1);
- }
- }
-
- j += (duv2 - duv1);
- duv1 = duv2;
- }
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as LongArray);
- }
-
- public virtual bool Equals(LongArray other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- int usedLen = GetUsedLength();
- if (other.GetUsedLength() != usedLen)
- {
- return false;
- }
- for (int i = 0; i < usedLen; i++)
- {
- if (m_ints[i] != other.m_ints[i])
- {
- return false;
- }
- }
- return true;
- }
-
- public override int GetHashCode()
- {
- int usedLen = GetUsedLength();
- int hash = 1;
- for (int i = 0; i < usedLen; i++)
- {
- long mi = m_ints[i];
- hash *= 31;
- hash ^= (int)mi;
- hash *= 31;
- hash ^= (int)((ulong)mi >> 32);
- }
- return hash;
- }
-
- public LongArray Copy()
- {
- return new LongArray(Arrays.Clone(m_ints));
- }
-
- public override string ToString()
- {
- int i = GetUsedLength();
- if (i == 0)
- {
- return "0";
- }
-
- StringBuilder sb = new StringBuilder(Convert.ToString(m_ints[--i], 2));
- while (--i >= 0)
- {
- string s = Convert.ToString(m_ints[i], 2);
-
- // Add leading zeroes, except for highest significant word
- int len = s.Length;
- if (len < 64)
- {
- sb.Append(ZEROES.Substring(len));
- }
-
- sb.Append(s);
- }
- return sb.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/ScaleXPointMap.cs b/BCCrypto/src/math/ec/ScaleXPointMap.cs
deleted file mode 100644
index f8a363b..0000000
--- a/BCCrypto/src/math/ec/ScaleXPointMap.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC
-{
- public class ScaleXPointMap
- : ECPointMap
- {
- protected readonly ECFieldElement scale;
-
- public ScaleXPointMap(ECFieldElement scale)
- {
- this.scale = scale;
- }
-
- public virtual ECPoint Map(ECPoint p)
- {
- return p.ScaleX(scale);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/ScaleYPointMap.cs b/BCCrypto/src/math/ec/ScaleYPointMap.cs
deleted file mode 100644
index 1c4795b..0000000
--- a/BCCrypto/src/math/ec/ScaleYPointMap.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC
-{
- public class ScaleYPointMap
- : ECPointMap
- {
- protected readonly ECFieldElement scale;
-
- public ScaleYPointMap(ECFieldElement scale)
- {
- this.scale = scale;
- }
-
- public virtual ECPoint Map(ECPoint p)
- {
- return p.ScaleY(scale);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/abc/SimpleBigDecimal.cs b/BCCrypto/src/math/ec/abc/SimpleBigDecimal.cs
deleted file mode 100644
index d5664db..0000000
--- a/BCCrypto/src/math/ec/abc/SimpleBigDecimal.cs
+++ /dev/null
@@ -1,241 +0,0 @@
-using System;
-using System.Text;
-
-namespace Org.BouncyCastle.Math.EC.Abc
-{
- /**
- * Class representing a simple version of a big decimal. A
- * SimpleBigDecimal is basically a
- * {@link java.math.BigInteger BigInteger} with a few digits on the right of
- * the decimal point. The number of (binary) digits on the right of the decimal
- * point is called the scale of the SimpleBigDecimal.
- * Unlike in {@link java.math.BigDecimal BigDecimal}, the scale is not adjusted
- * automatically, but must be set manually. All SimpleBigDecimals
- * taking part in the same arithmetic operation must have equal scale. The
- * result of a multiplication of two SimpleBigDecimals returns a
- * SimpleBigDecimal with double scale.
- */
- internal class SimpleBigDecimal
- // : Number
- {
- // private static final long serialVersionUID = 1L;
-
- private readonly BigInteger bigInt;
- private readonly int scale;
-
- /**
- * Returns a SimpleBigDecimal representing the same numerical
- * value as value.
- * @param value The value of the SimpleBigDecimal to be
- * created.
- * @param scale The scale of the SimpleBigDecimal to be
- * created.
- * @return The such created SimpleBigDecimal.
- */
- public static SimpleBigDecimal GetInstance(BigInteger val, int scale)
- {
- return new SimpleBigDecimal(val.ShiftLeft(scale), scale);
- }
-
- /**
- * Constructor for SimpleBigDecimal. The value of the
- * constructed SimpleBigDecimal Equals bigInt /
- * 2scale .
- * @param bigInt The bigInt value parameter.
- * @param scale The scale of the constructed SimpleBigDecimal.
- */
- public SimpleBigDecimal(BigInteger bigInt, int scale)
- {
- if (scale < 0)
- throw new ArgumentException("scale may not be negative");
-
- this.bigInt = bigInt;
- this.scale = scale;
- }
-
- private SimpleBigDecimal(SimpleBigDecimal limBigDec)
- {
- bigInt = limBigDec.bigInt;
- scale = limBigDec.scale;
- }
-
- private void CheckScale(SimpleBigDecimal b)
- {
- if (scale != b.scale)
- throw new ArgumentException("Only SimpleBigDecimal of same scale allowed in arithmetic operations");
- }
-
- public SimpleBigDecimal AdjustScale(int newScale)
- {
- if (newScale < 0)
- throw new ArgumentException("scale may not be negative");
-
- if (newScale == scale)
- return this;
-
- return new SimpleBigDecimal(bigInt.ShiftLeft(newScale - scale), newScale);
- }
-
- public SimpleBigDecimal Add(SimpleBigDecimal b)
- {
- CheckScale(b);
- return new SimpleBigDecimal(bigInt.Add(b.bigInt), scale);
- }
-
- public SimpleBigDecimal Add(BigInteger b)
- {
- return new SimpleBigDecimal(bigInt.Add(b.ShiftLeft(scale)), scale);
- }
-
- public SimpleBigDecimal Negate()
- {
- return new SimpleBigDecimal(bigInt.Negate(), scale);
- }
-
- public SimpleBigDecimal Subtract(SimpleBigDecimal b)
- {
- return Add(b.Negate());
- }
-
- public SimpleBigDecimal Subtract(BigInteger b)
- {
- return new SimpleBigDecimal(bigInt.Subtract(b.ShiftLeft(scale)), scale);
- }
-
- public SimpleBigDecimal Multiply(SimpleBigDecimal b)
- {
- CheckScale(b);
- return new SimpleBigDecimal(bigInt.Multiply(b.bigInt), scale + scale);
- }
-
- public SimpleBigDecimal Multiply(BigInteger b)
- {
- return new SimpleBigDecimal(bigInt.Multiply(b), scale);
- }
-
- public SimpleBigDecimal Divide(SimpleBigDecimal b)
- {
- CheckScale(b);
- BigInteger dividend = bigInt.ShiftLeft(scale);
- return new SimpleBigDecimal(dividend.Divide(b.bigInt), scale);
- }
-
- public SimpleBigDecimal Divide(BigInteger b)
- {
- return new SimpleBigDecimal(bigInt.Divide(b), scale);
- }
-
- public SimpleBigDecimal ShiftLeft(int n)
- {
- return new SimpleBigDecimal(bigInt.ShiftLeft(n), scale);
- }
-
- public int CompareTo(SimpleBigDecimal val)
- {
- CheckScale(val);
- return bigInt.CompareTo(val.bigInt);
- }
-
- public int CompareTo(BigInteger val)
- {
- return bigInt.CompareTo(val.ShiftLeft(scale));
- }
-
- public BigInteger Floor()
- {
- return bigInt.ShiftRight(scale);
- }
-
- public BigInteger Round()
- {
- SimpleBigDecimal oneHalf = new SimpleBigDecimal(BigInteger.One, 1);
- return Add(oneHalf.AdjustScale(scale)).Floor();
- }
-
- public int IntValue
- {
- get { return Floor().IntValue; }
- }
-
- public long LongValue
- {
- get { return Floor().LongValue; }
- }
-
-// public double doubleValue()
-// {
-// return new Double(ToString()).doubleValue();
-// }
-//
-// public float floatValue()
-// {
-// return new Float(ToString()).floatValue();
-// }
-
- public int Scale
- {
- get { return scale; }
- }
-
- public override string ToString()
- {
- if (scale == 0)
- return bigInt.ToString();
-
- BigInteger floorBigInt = Floor();
-
- BigInteger fract = bigInt.Subtract(floorBigInt.ShiftLeft(scale));
- if (bigInt.SignValue < 0)
- {
- fract = BigInteger.One.ShiftLeft(scale).Subtract(fract);
- }
-
- if ((floorBigInt.SignValue == -1) && (!(fract.Equals(BigInteger.Zero))))
- {
- floorBigInt = floorBigInt.Add(BigInteger.One);
- }
- string leftOfPoint = floorBigInt.ToString();
-
- char[] fractCharArr = new char[scale];
- string fractStr = fract.ToString(2);
- int fractLen = fractStr.Length;
- int zeroes = scale - fractLen;
- for (int i = 0; i < zeroes; i++)
- {
- fractCharArr[i] = '0';
- }
- for (int j = 0; j < fractLen; j++)
- {
- fractCharArr[zeroes + j] = fractStr[j];
- }
- string rightOfPoint = new string(fractCharArr);
-
- StringBuilder sb = new StringBuilder(leftOfPoint);
- sb.Append(".");
- sb.Append(rightOfPoint);
-
- return sb.ToString();
- }
-
- public override bool Equals(
- object obj)
- {
- if (this == obj)
- return true;
-
- SimpleBigDecimal other = obj as SimpleBigDecimal;
-
- if (other == null)
- return false;
-
- return bigInt.Equals(other.bigInt)
- && scale == other.scale;
- }
-
- public override int GetHashCode()
- {
- return bigInt.GetHashCode() ^ scale;
- }
-
- }
-}
diff --git a/BCCrypto/src/math/ec/abc/Tnaf.cs b/BCCrypto/src/math/ec/abc/Tnaf.cs
deleted file mode 100644
index b6e792a..0000000
--- a/BCCrypto/src/math/ec/abc/Tnaf.cs
+++ /dev/null
@@ -1,845 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Abc
-{
- /**
- * Class holding methods for point multiplication based on the window
- * τ-adic nonadjacent form (WTNAF). The algorithms are based on the
- * paper "Improved Algorithms for Arithmetic on Anomalous Binary Curves"
- * by Jerome A. Solinas. The paper first appeared in the Proceedings of
- * Crypto 1997.
- */
- internal class Tnaf
- {
- private static readonly BigInteger MinusOne = BigInteger.One.Negate();
- private static readonly BigInteger MinusTwo = BigInteger.Two.Negate();
- private static readonly BigInteger MinusThree = BigInteger.Three.Negate();
- private static readonly BigInteger Four = BigInteger.ValueOf(4);
-
- /**
- * The window width of WTNAF. The standard value of 4 is slightly less
- * than optimal for running time, but keeps space requirements for
- * precomputation low. For typical curves, a value of 5 or 6 results in
- * a better running time. When changing this value, the
- * αu 's must be computed differently, see
- * e.g. "Guide to Elliptic Curve Cryptography", Darrel Hankerson,
- * Alfred Menezes, Scott Vanstone, Springer-Verlag New York Inc., 2004,
- * p. 121-122
- */
- public const sbyte Width = 4;
-
- /**
- * 24
- */
- public const sbyte Pow2Width = 16;
-
- /**
- * The αu 's for a=0 as an array
- * of ZTauElements.
- */
- public static readonly ZTauElement[] Alpha0 =
- {
- null,
- new ZTauElement(BigInteger.One, BigInteger.Zero), null,
- new ZTauElement(MinusThree, MinusOne), null,
- new ZTauElement(MinusOne, MinusOne), null,
- new ZTauElement(BigInteger.One, MinusOne), null
- };
-
- /**
- * The αu 's for a=0 as an array
- * of TNAFs.
- */
- public static readonly sbyte[][] Alpha0Tnaf =
- {
- null, new sbyte[]{1}, null, new sbyte[]{-1, 0, 1}, null, new sbyte[]{1, 0, 1}, null, new sbyte[]{-1, 0, 0, 1}
- };
-
- /**
- * The αu 's for a=1 as an array
- * of ZTauElements.
- */
- public static readonly ZTauElement[] Alpha1 =
- {
- null,
- new ZTauElement(BigInteger.One, BigInteger.Zero), null,
- new ZTauElement(MinusThree, BigInteger.One), null,
- new ZTauElement(MinusOne, BigInteger.One), null,
- new ZTauElement(BigInteger.One, BigInteger.One), null
- };
-
- /**
- * The αu 's for a=1 as an array
- * of TNAFs.
- */
- public static readonly sbyte[][] Alpha1Tnaf =
- {
- null, new sbyte[]{1}, null, new sbyte[]{-1, 0, 1}, null, new sbyte[]{1, 0, 1}, null, new sbyte[]{-1, 0, 0, -1}
- };
-
- /**
- * Computes the norm of an element λ of
- * Z [τ].
- * @param mu The parameter μ of the elliptic curve.
- * @param lambda The element λ of
- * Z [τ].
- * @return The norm of λ.
- */
- public static BigInteger Norm(sbyte mu, ZTauElement lambda)
- {
- BigInteger norm;
-
- // s1 = u^2
- BigInteger s1 = lambda.u.Multiply(lambda.u);
-
- // s2 = u * v
- BigInteger s2 = lambda.u.Multiply(lambda.v);
-
- // s3 = 2 * v^2
- BigInteger s3 = lambda.v.Multiply(lambda.v).ShiftLeft(1);
-
- if (mu == 1)
- {
- norm = s1.Add(s2).Add(s3);
- }
- else if (mu == -1)
- {
- norm = s1.Subtract(s2).Add(s3);
- }
- else
- {
- throw new ArgumentException("mu must be 1 or -1");
- }
-
- return norm;
- }
-
- /**
- * Computes the norm of an element λ of
- * R [τ], where λ = u + vτ
- * and u and u are real numbers (elements of
- * R ).
- * @param mu The parameter μ of the elliptic curve.
- * @param u The real part of the element λ of
- * R [τ].
- * @param v The τ-adic part of the element
- * λ of R [τ].
- * @return The norm of λ.
- */
- public static SimpleBigDecimal Norm(sbyte mu, SimpleBigDecimal u, SimpleBigDecimal v)
- {
- SimpleBigDecimal norm;
-
- // s1 = u^2
- SimpleBigDecimal s1 = u.Multiply(u);
-
- // s2 = u * v
- SimpleBigDecimal s2 = u.Multiply(v);
-
- // s3 = 2 * v^2
- SimpleBigDecimal s3 = v.Multiply(v).ShiftLeft(1);
-
- if (mu == 1)
- {
- norm = s1.Add(s2).Add(s3);
- }
- else if (mu == -1)
- {
- norm = s1.Subtract(s2).Add(s3);
- }
- else
- {
- throw new ArgumentException("mu must be 1 or -1");
- }
-
- return norm;
- }
-
- /**
- * Rounds an element λ of R [τ]
- * to an element of Z [τ], such that their difference
- * has minimal norm. λ is given as
- * λ = λ0 + λ1 τ.
- * @param lambda0 The component λ0 .
- * @param lambda1 The component λ1 .
- * @param mu The parameter μ of the elliptic curve. Must
- * equal 1 or -1.
- * @return The rounded element of Z [τ].
- * @throws ArgumentException if lambda0 and
- * lambda1 do not have same scale.
- */
- public static ZTauElement Round(SimpleBigDecimal lambda0,
- SimpleBigDecimal lambda1, sbyte mu)
- {
- int scale = lambda0.Scale;
- if (lambda1.Scale != scale)
- throw new ArgumentException("lambda0 and lambda1 do not have same scale");
-
- if (!((mu == 1) || (mu == -1)))
- throw new ArgumentException("mu must be 1 or -1");
-
- BigInteger f0 = lambda0.Round();
- BigInteger f1 = lambda1.Round();
-
- SimpleBigDecimal eta0 = lambda0.Subtract(f0);
- SimpleBigDecimal eta1 = lambda1.Subtract(f1);
-
- // eta = 2*eta0 + mu*eta1
- SimpleBigDecimal eta = eta0.Add(eta0);
- if (mu == 1)
- {
- eta = eta.Add(eta1);
- }
- else
- {
- // mu == -1
- eta = eta.Subtract(eta1);
- }
-
- // check1 = eta0 - 3*mu*eta1
- // check2 = eta0 + 4*mu*eta1
- SimpleBigDecimal threeEta1 = eta1.Add(eta1).Add(eta1);
- SimpleBigDecimal fourEta1 = threeEta1.Add(eta1);
- SimpleBigDecimal check1;
- SimpleBigDecimal check2;
- if (mu == 1)
- {
- check1 = eta0.Subtract(threeEta1);
- check2 = eta0.Add(fourEta1);
- }
- else
- {
- // mu == -1
- check1 = eta0.Add(threeEta1);
- check2 = eta0.Subtract(fourEta1);
- }
-
- sbyte h0 = 0;
- sbyte h1 = 0;
-
- // if eta >= 1
- if (eta.CompareTo(BigInteger.One) >= 0)
- {
- if (check1.CompareTo(MinusOne) < 0)
- {
- h1 = mu;
- }
- else
- {
- h0 = 1;
- }
- }
- else
- {
- // eta < 1
- if (check2.CompareTo(BigInteger.Two) >= 0)
- {
- h1 = mu;
- }
- }
-
- // if eta < -1
- if (eta.CompareTo(MinusOne) < 0)
- {
- if (check1.CompareTo(BigInteger.One) >= 0)
- {
- h1 = (sbyte)-mu;
- }
- else
- {
- h0 = -1;
- }
- }
- else
- {
- // eta >= -1
- if (check2.CompareTo(MinusTwo) < 0)
- {
- h1 = (sbyte)-mu;
- }
- }
-
- BigInteger q0 = f0.Add(BigInteger.ValueOf(h0));
- BigInteger q1 = f1.Add(BigInteger.ValueOf(h1));
- return new ZTauElement(q0, q1);
- }
-
- /**
- * Approximate division by n. For an integer
- * k, the value λ = s k / n is
- * computed to c bits of accuracy.
- * @param k The parameter k.
- * @param s The curve parameter s0 or
- * s1 .
- * @param vm The Lucas Sequence element Vm .
- * @param a The parameter a of the elliptic curve.
- * @param m The bit length of the finite field
- * F m .
- * @param c The number of bits of accuracy, i.e. the scale of the returned
- * SimpleBigDecimal.
- * @return The value λ = s k / n computed to
- * c bits of accuracy.
- */
- public static SimpleBigDecimal ApproximateDivisionByN(BigInteger k,
- BigInteger s, BigInteger vm, sbyte a, int m, int c)
- {
- int _k = (m + 5)/2 + c;
- BigInteger ns = k.ShiftRight(m - _k - 2 + a);
-
- BigInteger gs = s.Multiply(ns);
-
- BigInteger hs = gs.ShiftRight(m);
-
- BigInteger js = vm.Multiply(hs);
-
- BigInteger gsPlusJs = gs.Add(js);
- BigInteger ls = gsPlusJs.ShiftRight(_k-c);
- if (gsPlusJs.TestBit(_k-c-1))
- {
- // round up
- ls = ls.Add(BigInteger.One);
- }
-
- return new SimpleBigDecimal(ls, c);
- }
-
- /**
- * Computes the τ-adic NAF (non-adjacent form) of an
- * element λ of Z [τ].
- * @param mu The parameter μ of the elliptic curve.
- * @param lambda The element λ of
- * Z [τ].
- * @return The τ-adic NAF of λ.
- */
- public static sbyte[] TauAdicNaf(sbyte mu, ZTauElement lambda)
- {
- if (!((mu == 1) || (mu == -1)))
- throw new ArgumentException("mu must be 1 or -1");
-
- BigInteger norm = Norm(mu, lambda);
-
- // Ceiling of log2 of the norm
- int log2Norm = norm.BitLength;
-
- // If length(TNAF) > 30, then length(TNAF) < log2Norm + 3.52
- int maxLength = log2Norm > 30 ? log2Norm + 4 : 34;
-
- // The array holding the TNAF
- sbyte[] u = new sbyte[maxLength];
- int i = 0;
-
- // The actual length of the TNAF
- int length = 0;
-
- BigInteger r0 = lambda.u;
- BigInteger r1 = lambda.v;
-
- while(!((r0.Equals(BigInteger.Zero)) && (r1.Equals(BigInteger.Zero))))
- {
- // If r0 is odd
- if (r0.TestBit(0))
- {
- u[i] = (sbyte) BigInteger.Two.Subtract((r0.Subtract(r1.ShiftLeft(1))).Mod(Four)).IntValue;
-
- // r0 = r0 - u[i]
- if (u[i] == 1)
- {
- r0 = r0.ClearBit(0);
- }
- else
- {
- // u[i] == -1
- r0 = r0.Add(BigInteger.One);
- }
- length = i;
- }
- else
- {
- u[i] = 0;
- }
-
- BigInteger t = r0;
- BigInteger s = r0.ShiftRight(1);
- if (mu == 1)
- {
- r0 = r1.Add(s);
- }
- else
- {
- // mu == -1
- r0 = r1.Subtract(s);
- }
-
- r1 = t.ShiftRight(1).Negate();
- i++;
- }
-
- length++;
-
- // Reduce the TNAF array to its actual length
- sbyte[] tnaf = new sbyte[length];
- Array.Copy(u, 0, tnaf, 0, length);
- return tnaf;
- }
-
- /**
- * Applies the operation τ() to an
- * AbstractF2mPoint.
- * @param p The AbstractF2mPoint to which τ() is applied.
- * @return τ(p)
- */
- public static AbstractF2mPoint Tau(AbstractF2mPoint p)
- {
- return p.Tau();
- }
-
- /**
- * Returns the parameter μ of the elliptic curve.
- * @param curve The elliptic curve from which to obtain μ.
- * The curve must be a Koblitz curve, i.e. a Equals
- * 0 or 1 and b Equals
- * 1.
- * @return μ of the elliptic curve.
- * @throws ArgumentException if the given ECCurve is not a Koblitz
- * curve.
- */
- public static sbyte GetMu(AbstractF2mCurve curve)
- {
- BigInteger a = curve.A.ToBigInteger();
-
- sbyte mu;
- if (a.SignValue == 0)
- {
- mu = -1;
- }
- else if (a.Equals(BigInteger.One))
- {
- mu = 1;
- }
- else
- {
- throw new ArgumentException("No Koblitz curve (ABC), TNAF multiplication not possible");
- }
- return mu;
- }
-
- public static sbyte GetMu(ECFieldElement curveA)
- {
- return (sbyte)(curveA.IsZero ? -1 : 1);
- }
-
- public static sbyte GetMu(int curveA)
- {
- return (sbyte)(curveA == 0 ? -1 : 1);
- }
-
- /**
- * Calculates the Lucas Sequence elements Uk-1 and
- * Uk or Vk-1 and
- * Vk .
- * @param mu The parameter μ of the elliptic curve.
- * @param k The index of the second element of the Lucas Sequence to be
- * returned.
- * @param doV If set to true, computes Vk-1 and
- * Vk , otherwise Uk-1 and
- * Uk .
- * @return An array with 2 elements, containing Uk-1
- * and Uk or Vk-1
- * and Vk .
- */
- public static BigInteger[] GetLucas(sbyte mu, int k, bool doV)
- {
- if (!(mu == 1 || mu == -1))
- throw new ArgumentException("mu must be 1 or -1");
-
- BigInteger u0;
- BigInteger u1;
- BigInteger u2;
-
- if (doV)
- {
- u0 = BigInteger.Two;
- u1 = BigInteger.ValueOf(mu);
- }
- else
- {
- u0 = BigInteger.Zero;
- u1 = BigInteger.One;
- }
-
- for (int i = 1; i < k; i++)
- {
- // u2 = mu*u1 - 2*u0;
- BigInteger s = null;
- if (mu == 1)
- {
- s = u1;
- }
- else
- {
- // mu == -1
- s = u1.Negate();
- }
-
- u2 = s.Subtract(u0.ShiftLeft(1));
- u0 = u1;
- u1 = u2;
- // System.out.println(i + ": " + u2);
- // System.out.println();
- }
-
- BigInteger[] retVal = {u0, u1};
- return retVal;
- }
-
- /**
- * Computes the auxiliary value tw . If the width is
- * 4, then for mu = 1, tw = 6 and for
- * mu = -1, tw = 10
- * @param mu The parameter μ of the elliptic curve.
- * @param w The window width of the WTNAF.
- * @return the auxiliary value tw
- */
- public static BigInteger GetTw(sbyte mu, int w)
- {
- if (w == 4)
- {
- if (mu == 1)
- {
- return BigInteger.ValueOf(6);
- }
- else
- {
- // mu == -1
- return BigInteger.ValueOf(10);
- }
- }
- else
- {
- // For w <> 4, the values must be computed
- BigInteger[] us = GetLucas(mu, w, false);
- BigInteger twoToW = BigInteger.Zero.SetBit(w);
- BigInteger u1invert = us[1].ModInverse(twoToW);
- BigInteger tw;
- tw = BigInteger.Two.Multiply(us[0]).Multiply(u1invert).Mod(twoToW);
- //System.out.println("mu = " + mu);
- //System.out.println("tw = " + tw);
- return tw;
- }
- }
-
- /**
- * Computes the auxiliary values s0 and
- * s1 used for partial modular reduction.
- * @param curve The elliptic curve for which to compute
- * s0 and s1 .
- * @throws ArgumentException if curve is not a
- * Koblitz curve (Anomalous Binary Curve, ABC).
- */
- public static BigInteger[] GetSi(AbstractF2mCurve curve)
- {
- if (!curve.IsKoblitz)
- throw new ArgumentException("si is defined for Koblitz curves only");
-
- int m = curve.FieldSize;
- int a = curve.A.ToBigInteger().IntValue;
- sbyte mu = GetMu(a);
- int shifts = GetShiftsForCofactor(curve.Cofactor);
- int index = m + 3 - a;
- BigInteger[] ui = GetLucas(mu, index, false);
-
- if (mu == 1)
- {
- ui[0] = ui[0].Negate();
- ui[1] = ui[1].Negate();
- }
-
- BigInteger dividend0 = BigInteger.One.Add(ui[1]).ShiftRight(shifts);
- BigInteger dividend1 = BigInteger.One.Add(ui[0]).ShiftRight(shifts).Negate();
-
- return new BigInteger[] { dividend0, dividend1 };
- }
-
- public static BigInteger[] GetSi(int fieldSize, int curveA, BigInteger cofactor)
- {
- sbyte mu = GetMu(curveA);
- int shifts = GetShiftsForCofactor(cofactor);
- int index = fieldSize + 3 - curveA;
- BigInteger[] ui = GetLucas(mu, index, false);
- if (mu == 1)
- {
- ui[0] = ui[0].Negate();
- ui[1] = ui[1].Negate();
- }
-
- BigInteger dividend0 = BigInteger.One.Add(ui[1]).ShiftRight(shifts);
- BigInteger dividend1 = BigInteger.One.Add(ui[0]).ShiftRight(shifts).Negate();
-
- return new BigInteger[] { dividend0, dividend1 };
- }
-
- protected static int GetShiftsForCofactor(BigInteger h)
- {
- if (h != null && h.BitLength < 4)
- {
- int hi = h.IntValue;
- if (hi == 2)
- return 1;
- if (hi == 4)
- return 2;
- }
-
- throw new ArgumentException("h (Cofactor) must be 2 or 4");
- }
-
- /**
- * Partial modular reduction modulo
- * (τm - 1)/(τ - 1).
- * @param k The integer to be reduced.
- * @param m The bitlength of the underlying finite field.
- * @param a The parameter a of the elliptic curve.
- * @param s The auxiliary values s0 and
- * s1 .
- * @param mu The parameter μ of the elliptic curve.
- * @param c The precision (number of bits of accuracy) of the partial
- * modular reduction.
- * @return ρ := k partmod (τm - 1)/(τ - 1)
- */
- public static ZTauElement PartModReduction(BigInteger k, int m, sbyte a,
- BigInteger[] s, sbyte mu, sbyte c)
- {
- // d0 = s[0] + mu*s[1]; mu is either 1 or -1
- BigInteger d0;
- if (mu == 1)
- {
- d0 = s[0].Add(s[1]);
- }
- else
- {
- d0 = s[0].Subtract(s[1]);
- }
-
- BigInteger[] v = GetLucas(mu, m, true);
- BigInteger vm = v[1];
-
- SimpleBigDecimal lambda0 = ApproximateDivisionByN(
- k, s[0], vm, a, m, c);
-
- SimpleBigDecimal lambda1 = ApproximateDivisionByN(
- k, s[1], vm, a, m, c);
-
- ZTauElement q = Round(lambda0, lambda1, mu);
-
- // r0 = n - d0*q0 - 2*s1*q1
- BigInteger r0 = k.Subtract(d0.Multiply(q.u)).Subtract(
- BigInteger.ValueOf(2).Multiply(s[1]).Multiply(q.v));
-
- // r1 = s1*q0 - s0*q1
- BigInteger r1 = s[1].Multiply(q.u).Subtract(s[0].Multiply(q.v));
-
- return new ZTauElement(r0, r1);
- }
-
- /**
- * Multiplies a {@link org.bouncycastle.math.ec.AbstractF2mPoint AbstractF2mPoint}
- * by a BigInteger using the reduced τ-adic
- * NAF (RTNAF) method.
- * @param p The AbstractF2mPoint to Multiply.
- * @param k The BigInteger by which to Multiply p.
- * @return k * p
- */
- public static AbstractF2mPoint MultiplyRTnaf(AbstractF2mPoint p, BigInteger k)
- {
- AbstractF2mCurve curve = (AbstractF2mCurve)p.Curve;
- int m = curve.FieldSize;
- int a = curve.A.ToBigInteger().IntValue;
- sbyte mu = GetMu(a);
- BigInteger[] s = curve.GetSi();
- ZTauElement rho = PartModReduction(k, m, (sbyte)a, s, mu, (sbyte)10);
-
- return MultiplyTnaf(p, rho);
- }
-
- /**
- * Multiplies a {@link org.bouncycastle.math.ec.AbstractF2mPoint AbstractF2mPoint}
- * by an element λ of Z [τ]
- * using the τ-adic NAF (TNAF) method.
- * @param p The AbstractF2mPoint to Multiply.
- * @param lambda The element λ of
- * Z [τ].
- * @return λ * p
- */
- public static AbstractF2mPoint MultiplyTnaf(AbstractF2mPoint p, ZTauElement lambda)
- {
- AbstractF2mCurve curve = (AbstractF2mCurve)p.Curve;
- sbyte mu = GetMu(curve.A);
- sbyte[] u = TauAdicNaf(mu, lambda);
-
- AbstractF2mPoint q = MultiplyFromTnaf(p, u);
-
- return q;
- }
-
- /**
- * Multiplies a {@link org.bouncycastle.math.ec.AbstractF2mPoint AbstractF2mPoint}
- * by an element λ of Z [τ]
- * using the τ-adic NAF (TNAF) method, given the TNAF
- * of λ.
- * @param p The AbstractF2mPoint to Multiply.
- * @param u The the TNAF of λ..
- * @return λ * p
- */
- public static AbstractF2mPoint MultiplyFromTnaf(AbstractF2mPoint p, sbyte[] u)
- {
- ECCurve curve = p.Curve;
- AbstractF2mPoint q = (AbstractF2mPoint)curve.Infinity;
- AbstractF2mPoint pNeg = (AbstractF2mPoint)p.Negate();
- int tauCount = 0;
- for (int i = u.Length - 1; i >= 0; i--)
- {
- ++tauCount;
- sbyte ui = u[i];
- if (ui != 0)
- {
- q = q.TauPow(tauCount);
- tauCount = 0;
-
- ECPoint x = ui > 0 ? p : pNeg;
- q = (AbstractF2mPoint)q.Add(x);
- }
- }
- if (tauCount > 0)
- {
- q = q.TauPow(tauCount);
- }
- return q;
- }
-
- /**
- * Computes the [τ]-adic window NAF of an element
- * λ of Z [τ].
- * @param mu The parameter μ of the elliptic curve.
- * @param lambda The element λ of
- * Z [τ] of which to compute the
- * [τ]-adic NAF.
- * @param width The window width of the resulting WNAF.
- * @param pow2w 2width .
- * @param tw The auxiliary value tw .
- * @param alpha The αu 's for the window width.
- * @return The [τ]-adic window NAF of
- * λ.
- */
- public static sbyte[] TauAdicWNaf(sbyte mu, ZTauElement lambda,
- sbyte width, BigInteger pow2w, BigInteger tw, ZTauElement[] alpha)
- {
- if (!((mu == 1) || (mu == -1)))
- throw new ArgumentException("mu must be 1 or -1");
-
- BigInteger norm = Norm(mu, lambda);
-
- // Ceiling of log2 of the norm
- int log2Norm = norm.BitLength;
-
- // If length(TNAF) > 30, then length(TNAF) < log2Norm + 3.52
- int maxLength = log2Norm > 30 ? log2Norm + 4 + width : 34 + width;
-
- // The array holding the TNAF
- sbyte[] u = new sbyte[maxLength];
-
- // 2^(width - 1)
- BigInteger pow2wMin1 = pow2w.ShiftRight(1);
-
- // Split lambda into two BigIntegers to simplify calculations
- BigInteger r0 = lambda.u;
- BigInteger r1 = lambda.v;
- int i = 0;
-
- // while lambda <> (0, 0)
- while (!((r0.Equals(BigInteger.Zero))&&(r1.Equals(BigInteger.Zero))))
- {
- // if r0 is odd
- if (r0.TestBit(0))
- {
- // uUnMod = r0 + r1*tw Mod 2^width
- BigInteger uUnMod
- = r0.Add(r1.Multiply(tw)).Mod(pow2w);
-
- sbyte uLocal;
- // if uUnMod >= 2^(width - 1)
- if (uUnMod.CompareTo(pow2wMin1) >= 0)
- {
- uLocal = (sbyte) uUnMod.Subtract(pow2w).IntValue;
- }
- else
- {
- uLocal = (sbyte) uUnMod.IntValue;
- }
- // uLocal is now in [-2^(width-1), 2^(width-1)-1]
-
- u[i] = uLocal;
- bool s = true;
- if (uLocal < 0)
- {
- s = false;
- uLocal = (sbyte)-uLocal;
- }
- // uLocal is now >= 0
-
- if (s)
- {
- r0 = r0.Subtract(alpha[uLocal].u);
- r1 = r1.Subtract(alpha[uLocal].v);
- }
- else
- {
- r0 = r0.Add(alpha[uLocal].u);
- r1 = r1.Add(alpha[uLocal].v);
- }
- }
- else
- {
- u[i] = 0;
- }
-
- BigInteger t = r0;
-
- if (mu == 1)
- {
- r0 = r1.Add(r0.ShiftRight(1));
- }
- else
- {
- // mu == -1
- r0 = r1.Subtract(r0.ShiftRight(1));
- }
- r1 = t.ShiftRight(1).Negate();
- i++;
- }
- return u;
- }
-
- /**
- * Does the precomputation for WTNAF multiplication.
- * @param p The ECPoint for which to do the precomputation.
- * @param a The parameter a of the elliptic curve.
- * @return The precomputation array for p.
- */
- public static AbstractF2mPoint[] GetPreComp(AbstractF2mPoint p, sbyte a)
- {
- sbyte[][] alphaTnaf = (a == 0) ? Tnaf.Alpha0Tnaf : Tnaf.Alpha1Tnaf;
-
- AbstractF2mPoint[] pu = new AbstractF2mPoint[(uint)(alphaTnaf.Length + 1) >> 1];
- pu[0] = p;
-
- uint precompLen = (uint)alphaTnaf.Length;
- for (uint i = 3; i < precompLen; i += 2)
- {
- pu[i >> 1] = Tnaf.MultiplyFromTnaf(p, alphaTnaf[i]);
- }
-
- p.Curve.NormalizeAll(pu);
-
- return pu;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/abc/ZTauElement.cs b/BCCrypto/src/math/ec/abc/ZTauElement.cs
deleted file mode 100644
index 4fcbf1b..0000000
--- a/BCCrypto/src/math/ec/abc/ZTauElement.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Abc
-{
- /**
- * Class representing an element of Z [τ]. Let
- * λ be an element of Z [τ]. Then
- * λ is given as λ = u + vτ. The
- * components u and v may be used directly, there
- * are no accessor methods.
- * Immutable class.
- */
- internal class ZTauElement
- {
- /**
- * The "real" part of λ.
- */
- public readonly BigInteger u;
-
- /**
- * The "τ-adic" part of λ.
- */
- public readonly BigInteger v;
-
- /**
- * Constructor for an element λ of
- * Z [τ].
- * @param u The "real" part of λ.
- * @param v The "τ-adic" part of
- * λ.
- */
- public ZTauElement(BigInteger u, BigInteger v)
- {
- this.u = u;
- this.v = v;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/djb/Curve25519.cs b/BCCrypto/src/math/ec/custom/djb/Curve25519.cs
deleted file mode 100644
index 6ed7c06..0000000
--- a/BCCrypto/src/math/ec/custom/djb/Curve25519.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Djb
-{
- internal class Curve25519
- : AbstractFpCurve
- {
- public static readonly BigInteger q = Nat256.ToBigInteger(Curve25519Field.P);
-
- private const int Curve25519_DEFAULT_COORDS = COORD_JACOBIAN_MODIFIED;
-
- protected readonly Curve25519Point m_infinity;
-
- public Curve25519()
- : base(q)
- {
- this.m_infinity = new Curve25519Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1,
- Hex.Decode("2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA984914A144")));
- this.m_b = FromBigInteger(new BigInteger(1,
- Hex.Decode("7B425ED097B425ED097B425ED097B425ED097B425ED097B4260B5E9C7710C864")));
- this.m_order = new BigInteger(1, Hex.Decode("1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED"));
- this.m_cofactor = BigInteger.ValueOf(8);
- this.m_coord = Curve25519_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new Curve25519();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN_MODIFIED:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new Curve25519FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new Curve25519Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new Curve25519Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/djb/Curve25519Field.cs b/BCCrypto/src/math/ec/custom/djb/Curve25519Field.cs
deleted file mode 100644
index 837821e..0000000
--- a/BCCrypto/src/math/ec/custom/djb/Curve25519Field.cs
+++ /dev/null
@@ -1,253 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Djb
-{
- internal class Curve25519Field
- {
- // 2^255 - 2^4 - 2^1 - 1
- internal static readonly uint[] P = new uint[]{ 0xFFFFFFED, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
- 0xFFFFFFFF, 0x7FFFFFFF };
- private const uint P7 = 0x7FFFFFFF;
- private static readonly uint[] PExt = new uint[]{ 0x00000169, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFED, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
- 0xFFFFFFFF, 0x3FFFFFFF };
- private const uint PInv = 0x13;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- Nat256.Add(x, y, z);
- if (Nat256.Gte(z, P))
- {
- SubPFrom(z);
- }
- }
-
- public static void AddExt(uint[] xx, uint[] yy, uint[] zz)
- {
- Nat.Add(16, xx, yy, zz);
- if (Nat.Gte(16, zz, PExt))
- {
- SubPExtFrom(zz);
- }
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- Nat.Inc(8, x, z);
- if (Nat256.Gte(z, P))
- {
- SubPFrom(z);
- }
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat256.FromBigInteger(x);
- while (Nat256.Gte(z, P))
- {
- Nat256.SubFrom(P, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- if ((x[0] & 1) == 0)
- {
- Nat.ShiftDownBit(8, x, 0, z);
- }
- else
- {
- Nat256.Add(x, P, z);
- Nat.ShiftDownBit(8, z, 0);
- }
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat256.CreateExt();
- Nat256.Mul(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
- {
- Nat256.MulAddTo(x, y, zz);
- if (Nat.Gte(16, zz, PExt))
- {
- SubPExtFrom(zz);
- }
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat256.IsZero(x))
- {
- Nat256.Zero(z);
- }
- else
- {
- Nat256.Sub(P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- Debug.Assert(xx[15] >> 30 == 0);
-
- uint xx07 = xx[7];
- Nat.ShiftUpBit(8, xx, 8, xx07, z, 0);
- uint c = Nat256.MulByWordAddTo(PInv, xx, z) << 1;
- uint z7 = z[7];
- c += (z7 >> 31) - (xx07 >> 31);
- z7 &= P7;
- z7 += Nat.AddWordTo(7, c * PInv, z);
- z[7] = z7;
- if (z7 >= P7 && Nat256.Gte(z, P))
- {
- SubPFrom(z);
- }
- }
-
- public static void Reduce27(uint x, uint[] z)
- {
- Debug.Assert(x >> 26 == 0);
-
- uint z7 = z[7];
- uint c = (x << 1 | z7 >> 31);
- z7 &= P7;
- z7 += Nat.AddWordTo(7, c * PInv, z);
- z[7] = z7;
- if (z7 >= P7 && Nat256.Gte(z, P))
- {
- SubPFrom(z);
- }
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat256.CreateExt();
- Nat256.Square(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
-
- uint[] tt = Nat256.CreateExt();
- Nat256.Square(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- Nat256.Square(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat256.Sub(x, y, z);
- if (c != 0)
- {
- AddPTo(z);
- }
- }
-
- public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz)
- {
- int c = Nat.Sub(16, xx, yy, zz);
- if (c != 0)
- {
- AddPExtTo(zz);
- }
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- Nat.ShiftUpBit(8, x, 0, z);
- if (Nat256.Gte(z, P))
- {
- SubPFrom(z);
- }
- }
-
- private static uint AddPTo(uint[] z)
- {
- long c = (long)z[0] - PInv;
- z[0] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c = Nat.DecAt(7, z, 1);
- }
- c += (long)z[7] + (P7 + 1);
- z[7] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- private static uint AddPExtTo(uint[] zz)
- {
- long c = (long)zz[0] + PExt[0];
- zz[0] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c = Nat.IncAt(8, zz, 1);
- }
- c += (long)zz[8] - PInv;
- zz[8] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c = Nat.DecAt(15, zz, 9);
- }
- c += (long)zz[15] + (PExt[15] + 1);
- zz[15] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- private static int SubPFrom(uint[] z)
- {
- long c = (long)z[0] + PInv;
- z[0] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c = Nat.IncAt(7, z, 1);
- }
- c += (long)z[7] - (P7 + 1);
- z[7] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- private static int SubPExtFrom(uint[] zz)
- {
- long c = (long)zz[0] - PExt[0];
- zz[0] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c = Nat.DecAt(8, zz, 1);
- }
- c += (long)zz[8] + PInv;
- zz[8] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c = Nat.IncAt(15, zz, 9);
- }
- c += (long)zz[15] - (PExt[15] + 1);
- zz[15] = (uint)c;
- c >>= 32;
- return (int)c;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/djb/Curve25519FieldElement.cs b/BCCrypto/src/math/ec/custom/djb/Curve25519FieldElement.cs
deleted file mode 100644
index 732e9e4..0000000
--- a/BCCrypto/src/math/ec/custom/djb/Curve25519FieldElement.cs
+++ /dev/null
@@ -1,233 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Djb
-{
- internal class Curve25519FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = Curve25519.q;
-
- // Calculated as ECConstants.TWO.modPow(Q.shiftRight(2), Q)
- private static readonly uint[] PRECOMP_POW2 = new uint[]{ 0x4a0ea0b0, 0xc4ee1b27, 0xad2fe478, 0x2f431806,
- 0x3dfbd7a7, 0x2b4d0099, 0x4fc1df0b, 0x2b832480 };
-
- protected internal readonly uint[] x;
-
- public Curve25519FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for Curve25519FieldElement", "x");
-
- this.x = Curve25519Field.FromBigInteger(x);
- }
-
- public Curve25519FieldElement()
- {
- this.x = Nat256.Create();
- }
-
- protected internal Curve25519FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat256.IsZero(x); }
- }
-
- public override bool IsOne
- {
- get { return Nat256.IsOne(x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat256.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat256.ToBigInteger(x);
- }
-
- public override string FieldName
- {
- get { return "Curve25519Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat256.Create();
- Curve25519Field.Add(x, ((Curve25519FieldElement)b).x, z);
- return new Curve25519FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat256.Create();
- Curve25519Field.AddOne(x, z);
- return new Curve25519FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat256.Create();
- Curve25519Field.Subtract(x, ((Curve25519FieldElement)b).x, z);
- return new Curve25519FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat256.Create();
- Curve25519Field.Multiply(x, ((Curve25519FieldElement)b).x, z);
- return new Curve25519FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- //return Multiply(b.Invert());
- uint[] z = Nat256.Create();
- Mod.Invert(Curve25519Field.P, ((Curve25519FieldElement)b).x, z);
- Curve25519Field.Multiply(z, x, z);
- return new Curve25519FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat256.Create();
- Curve25519Field.Negate(x, z);
- return new Curve25519FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat256.Create();
- Curve25519Field.Square(x, z);
- return new Curve25519FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- //return new Curve25519FieldElement(ToBigInteger().ModInverse(Q));
- uint[] z = Nat256.Create();
- Mod.Invert(Curve25519Field.P, x, z);
- return new Curve25519FieldElement(z);
- }
-
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- /*
- * Q == 8m + 5, so we use Pocklington's method for this case.
- *
- * First, raise this element to the exponent 2^252 - 2^1 (i.e. m + 1)
- *
- * Breaking up the exponent's binary representation into "repunits", we get:
- * { 251 1s } { 1 0s }
- *
- * Therefore we need an addition chain containing 251 (the lengths of the repunits)
- * We use: 1, 2, 3, 4, 7, 11, 15, 30, 60, 120, 131, [251]
- */
-
- uint[] x1 = this.x;
- if (Nat256.IsZero(x1) || Nat256.IsOne(x1))
- return this;
-
- uint[] x2 = Nat256.Create();
- Curve25519Field.Square(x1, x2);
- Curve25519Field.Multiply(x2, x1, x2);
- uint[] x3 = x2;
- Curve25519Field.Square(x2, x3);
- Curve25519Field.Multiply(x3, x1, x3);
- uint[] x4 = Nat256.Create();
- Curve25519Field.Square(x3, x4);
- Curve25519Field.Multiply(x4, x1, x4);
- uint[] x7 = Nat256.Create();
- Curve25519Field.SquareN(x4, 3, x7);
- Curve25519Field.Multiply(x7, x3, x7);
- uint[] x11 = x3;
- Curve25519Field.SquareN(x7, 4, x11);
- Curve25519Field.Multiply(x11, x4, x11);
- uint[] x15 = x7;
- Curve25519Field.SquareN(x11, 4, x15);
- Curve25519Field.Multiply(x15, x4, x15);
- uint[] x30 = x4;
- Curve25519Field.SquareN(x15, 15, x30);
- Curve25519Field.Multiply(x30, x15, x30);
- uint[] x60 = x15;
- Curve25519Field.SquareN(x30, 30, x60);
- Curve25519Field.Multiply(x60, x30, x60);
- uint[] x120 = x30;
- Curve25519Field.SquareN(x60, 60, x120);
- Curve25519Field.Multiply(x120, x60, x120);
- uint[] x131 = x60;
- Curve25519Field.SquareN(x120, 11, x131);
- Curve25519Field.Multiply(x131, x11, x131);
- uint[] x251 = x11;
- Curve25519Field.SquareN(x131, 120, x251);
- Curve25519Field.Multiply(x251, x120, x251);
-
- uint[] t1 = x251;
- Curve25519Field.Square(t1, t1);
-
- uint[] t2 = x120;
- Curve25519Field.Square(t1, t2);
-
- if (Nat256.Eq(x1, t2))
- {
- return new Curve25519FieldElement(t1);
- }
-
- /*
- * If the first guess is incorrect, we multiply by a precomputed power of 2 to get the second guess,
- * which is ((4x)^(m + 1))/2 mod Q
- */
- Curve25519Field.Multiply(t1, PRECOMP_POW2, t1);
-
- Curve25519Field.Square(t1, t2);
-
- if (Nat256.Eq(x1, t2))
- {
- return new Curve25519FieldElement(t1);
- }
-
- return null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as Curve25519FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as Curve25519FieldElement);
- }
-
- public virtual bool Equals(Curve25519FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat256.Eq(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 8);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/djb/Curve25519Point.cs b/BCCrypto/src/math/ec/custom/djb/Curve25519Point.cs
deleted file mode 100644
index eb8fc12..0000000
--- a/BCCrypto/src/math/ec/custom/djb/Curve25519Point.cs
+++ /dev/null
@@ -1,313 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Djb
-{
- internal class Curve25519Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve the curve to use
- * @param x affine x co-ordinate
- * @param y affine y co-ordinate
- *
- * @deprecated Use ECCurve.CreatePoint to construct points
- */
- public Curve25519Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve the curve to use
- * @param x affine x co-ordinate
- * @param y affine y co-ordinate
- * @param withCompression if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public Curve25519Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal Curve25519Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new Curve25519Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement GetZCoord(int index)
- {
- if (index == 1)
- {
- return GetJacobianModifiedW();
- }
-
- return base.GetZCoord(index);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- Curve25519FieldElement X1 = (Curve25519FieldElement)this.RawXCoord, Y1 = (Curve25519FieldElement)this.RawYCoord,
- Z1 = (Curve25519FieldElement)this.RawZCoords[0];
- Curve25519FieldElement X2 = (Curve25519FieldElement)b.RawXCoord, Y2 = (Curve25519FieldElement)b.RawYCoord,
- Z2 = (Curve25519FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat256.CreateExt();
- uint[] t2 = Nat256.Create();
- uint[] t3 = Nat256.Create();
- uint[] t4 = Nat256.Create();
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- Curve25519Field.Square(Z1.x, S2);
-
- U2 = t2;
- Curve25519Field.Multiply(S2, X2.x, U2);
-
- Curve25519Field.Multiply(S2, Z1.x, S2);
- Curve25519Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- Curve25519Field.Square(Z2.x, S1);
-
- U1 = tt1;
- Curve25519Field.Multiply(S1, X1.x, U1);
-
- Curve25519Field.Multiply(S1, Z2.x, S1);
- Curve25519Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat256.Create();
- Curve25519Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- Curve25519Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat256.IsZero(H))
- {
- if (Nat256.IsZero(R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = Nat256.Create();
- Curve25519Field.Square(H, HSquared);
-
- uint[] G = Nat256.Create();
- Curve25519Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- Curve25519Field.Multiply(HSquared, U1, V);
-
- Curve25519Field.Negate(G, G);
- Nat256.Mul(S1, G, tt1);
-
- c = Nat256.AddBothTo(V, V, G);
- Curve25519Field.Reduce27(c, G);
-
- Curve25519FieldElement X3 = new Curve25519FieldElement(t4);
- Curve25519Field.Square(R, X3.x);
- Curve25519Field.Subtract(X3.x, G, X3.x);
-
- Curve25519FieldElement Y3 = new Curve25519FieldElement(G);
- Curve25519Field.Subtract(V, X3.x, Y3.x);
- Curve25519Field.MultiplyAddToExt(Y3.x, R, tt1);
- Curve25519Field.Reduce(tt1, Y3.x);
-
- Curve25519FieldElement Z3 = new Curve25519FieldElement(H);
- if (!Z1IsOne)
- {
- Curve25519Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- Curve25519Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- uint[] Z3Squared = (Z1IsOne && Z2IsOne) ? HSquared : null;
-
- // TODO If the result will only be used in a subsequent addition, we don't need W3
- Curve25519FieldElement W3 = CalculateJacobianModifiedW((Curve25519FieldElement)Z3, Z3Squared);
-
- ECFieldElement[] zs = new ECFieldElement[] { Z3, W3 };
-
- return new Curve25519Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- return TwiceJacobianModified(true);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return TwiceJacobianModified(false).Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- return TwiceJacobianModified(false).Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new Curve25519Point(Curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
-
- protected virtual Curve25519FieldElement CalculateJacobianModifiedW(Curve25519FieldElement Z, uint[] ZSquared)
- {
- Curve25519FieldElement a4 = (Curve25519FieldElement)this.Curve.A;
- if (Z.IsOne)
- return a4;
-
- Curve25519FieldElement W = new Curve25519FieldElement();
- if (ZSquared == null)
- {
- ZSquared = W.x;
- Curve25519Field.Square(Z.x, ZSquared);
- }
- Curve25519Field.Square(ZSquared, W.x);
- Curve25519Field.Multiply(W.x, a4.x, W.x);
- return W;
- }
-
- protected virtual Curve25519FieldElement GetJacobianModifiedW()
- {
- ECFieldElement[] ZZ = this.RawZCoords;
- Curve25519FieldElement W = (Curve25519FieldElement)ZZ[1];
- if (W == null)
- {
- // NOTE: Rarely, TwicePlus will result in the need for a lazy W1 calculation here
- ZZ[1] = W = CalculateJacobianModifiedW((Curve25519FieldElement)ZZ[0], null);
- }
- return W;
- }
-
- protected virtual Curve25519Point TwiceJacobianModified(bool calculateW)
- {
- Curve25519FieldElement X1 = (Curve25519FieldElement)this.RawXCoord, Y1 = (Curve25519FieldElement)this.RawYCoord,
- Z1 = (Curve25519FieldElement)this.RawZCoords[0], W1 = GetJacobianModifiedW();
-
- uint c;
-
- uint[] M = Nat256.Create();
- Curve25519Field.Square(X1.x, M);
- c = Nat256.AddBothTo(M, M, M);
- c += Nat256.AddTo(W1.x, M);
- Curve25519Field.Reduce27(c, M);
-
- uint[] _2Y1 = Nat256.Create();
- Curve25519Field.Twice(Y1.x, _2Y1);
-
- uint[] _2Y1Squared = Nat256.Create();
- Curve25519Field.Multiply(_2Y1, Y1.x, _2Y1Squared);
-
- uint[] S = Nat256.Create();
- Curve25519Field.Multiply(_2Y1Squared, X1.x, S);
- Curve25519Field.Twice(S, S);
-
- uint[] _8T = Nat256.Create();
- Curve25519Field.Square(_2Y1Squared, _8T);
- Curve25519Field.Twice(_8T, _8T);
-
- Curve25519FieldElement X3 = new Curve25519FieldElement(_2Y1Squared);
- Curve25519Field.Square(M, X3.x);
- Curve25519Field.Subtract(X3.x, S, X3.x);
- Curve25519Field.Subtract(X3.x, S, X3.x);
-
- Curve25519FieldElement Y3 = new Curve25519FieldElement(S);
- Curve25519Field.Subtract(S, X3.x, Y3.x);
- Curve25519Field.Multiply(Y3.x, M, Y3.x);
- Curve25519Field.Subtract(Y3.x, _8T, Y3.x);
-
- Curve25519FieldElement Z3 = new Curve25519FieldElement(_2Y1);
- if (!Nat256.IsOne(Z1.x))
- {
- Curve25519Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- Curve25519FieldElement W3 = null;
- if (calculateW)
- {
- W3 = new Curve25519FieldElement(_8T);
- Curve25519Field.Multiply(W3.x, W1.x, W3.x);
- Curve25519Field.Twice(W3.x, W3.x);
- }
-
- return new Curve25519Point(this.Curve, X3, Y3, new ECFieldElement[] { Z3, W3 }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/gm/SM2P256V1Curve.cs b/BCCrypto/src/math/ec/custom/gm/SM2P256V1Curve.cs
deleted file mode 100644
index 70b1190..0000000
--- a/BCCrypto/src/math/ec/custom/gm/SM2P256V1Curve.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.GM
-{
- internal class SM2P256V1Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = new BigInteger(1,
- Hex.Decode("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF"));
-
- private const int SM2P256V1_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SM2P256V1Point m_infinity;
-
- public SM2P256V1Curve()
- : base(q)
- {
- this.m_infinity = new SM2P256V1Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1,
- Hex.Decode("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC")));
- this.m_b = FromBigInteger(new BigInteger(1,
- Hex.Decode("28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93")));
- this.m_order = new BigInteger(1, Hex.Decode("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123"));
- this.m_cofactor = BigInteger.One;
- this.m_coord = SM2P256V1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SM2P256V1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SM2P256V1FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SM2P256V1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SM2P256V1Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/gm/SM2P256V1Field.cs b/BCCrypto/src/math/ec/custom/gm/SM2P256V1Field.cs
deleted file mode 100644
index b1d2323..0000000
--- a/BCCrypto/src/math/ec/custom/gm/SM2P256V1Field.cs
+++ /dev/null
@@ -1,307 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.GM
-{
- internal class SM2P256V1Field
- {
- // 2^256 - 2^224 - 2^96 + 2^64 - 1
- internal static readonly uint[] P = new uint[]{ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
- 0xFFFFFFFF, 0xFFFFFFFE };
- internal static readonly uint[] PExt = new uint[]{ 00000001, 0x00000000, 0xFFFFFFFE, 0x00000001, 0x00000001,
- 0xFFFFFFFE, 0x00000000, 0x00000002, 0xFFFFFFFE, 0xFFFFFFFD, 0x00000003, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF,
- 0x00000000, 0xFFFFFFFE };
- internal const uint P7 = 0xFFFFFFFE;
- internal const uint PExt15 = 0xFFFFFFFE;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- uint c = Nat256.Add(x, y, z);
- if (c != 0 || (z[7] >= P7 && Nat256.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void AddExt(uint[] xx, uint[] yy, uint[] zz)
- {
- uint c = Nat.Add(16, xx, yy, zz);
- if (c != 0 || (zz[15] >= PExt15 && Nat.Gte(16, zz, PExt)))
- {
- Nat.SubFrom(16, PExt, zz);
- }
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- uint c = Nat.Inc(8, x, z);
- if (c != 0 || (z[7] >= P7 && Nat256.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat256.FromBigInteger(x);
- if (z[7] >= P7 && Nat256.Gte(z, P))
- {
- Nat256.SubFrom(P, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- if ((x[0] & 1) == 0)
- {
- Nat.ShiftDownBit(8, x, 0, z);
- }
- else
- {
- uint c = Nat256.Add(x, P, z);
- Nat.ShiftDownBit(8, z, c);
- }
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat256.CreateExt();
- Nat256.Mul(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
- {
- uint c = Nat256.MulAddTo(x, y, zz);
- if (c != 0 || (zz[15] >= PExt15 && Nat.Gte(16, zz, PExt)))
- {
- Nat.SubFrom(16, PExt, zz);
- }
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat256.IsZero(x))
- {
- Nat256.Zero(z);
- }
- else
- {
- Nat256.Sub(P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- long xx08 = xx[8], xx09 = xx[9], xx10 = xx[10], xx11 = xx[11];
- long xx12 = xx[12], xx13 = xx[13], xx14 = xx[14], xx15 = xx[15];
-
- long t0 = xx08 + xx09;
- long t1 = xx10 + xx11;
- long t2 = xx12 + xx15;
- long t3 = xx13 + xx14;
- long t4 = t3 + (xx15 << 1);
-
- long ts = t0 + t3;
- long tt = t1 + t2 + ts;
-
- long cc = 0;
- cc += (long)xx[0] + tt + xx13 + xx14 + xx15;
- z[0] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[1] + tt - xx08 + xx14 + xx15;
- z[1] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[2] - ts;
- z[2] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[3] + tt - xx09 - xx10 + xx13;
- z[3] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[4] + tt - t1 - xx08 + xx14;
- z[4] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[5] + t4 + xx10;
- z[5] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[6] + xx11 + xx14 + xx15;
- z[6] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[7] + tt + t4 + xx12;
- z[7] = (uint)cc;
- cc >>= 32;
-
- Debug.Assert(cc >= 0);
-
- Reduce32((uint)cc, z);
- }
-
- public static void Reduce32(uint x, uint[] z)
- {
- long cc = 0;
-
- if (x != 0)
- {
- long xx08 = x;
-
- cc += (long)z[0] + xx08;
- z[0] = (uint)cc;
- cc >>= 32;
- if (cc != 0)
- {
- cc += (long)z[1];
- z[1] = (uint)cc;
- cc >>= 32;
- }
- cc += (long)z[2] - xx08;
- z[2] = (uint)cc;
- cc >>= 32;
- cc += (long)z[3] + xx08;
- z[3] = (uint)cc;
- cc >>= 32;
- if (cc != 0)
- {
- cc += (long)z[4];
- z[4] = (uint)cc;
- cc >>= 32;
- cc += (long)z[5];
- z[5] = (uint)cc;
- cc >>= 32;
- cc += (long)z[6];
- z[6] = (uint)cc;
- cc >>= 32;
- }
- cc += (long)z[7] + xx08;
- z[7] = (uint)cc;
- cc >>= 32;
-
- Debug.Assert(cc == 0 || cc == 1);
- }
-
- if (cc != 0 || (z[7] >= P7 && Nat256.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat256.CreateExt();
- Nat256.Square(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
-
- uint[] tt = Nat256.CreateExt();
- Nat256.Square(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- Nat256.Square(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat256.Sub(x, y, z);
- if (c != 0)
- {
- SubPInvFrom(z);
- }
- }
-
- public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz)
- {
- int c = Nat.Sub(16, xx, yy, zz);
- if (c != 0)
- {
- Nat.AddTo(16, PExt, zz);
- }
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- uint c = Nat.ShiftUpBit(8, x, 0, z);
- if (c != 0 || (z[7] >= P7 && Nat256.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- private static void AddPInvTo(uint[] z)
- {
- long c = (long)z[0] + 1;
- z[0] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[1];
- z[1] = (uint)c;
- c >>= 32;
- }
- c += (long)z[2] - 1;
- z[2] = (uint)c;
- c >>= 32;
- c += (long)z[3] + 1;
- z[3] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)z[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (long)z[6];
- z[6] = (uint)c;
- c >>= 32;
- }
- c += (long)z[7] + 1;
- z[7] = (uint)c;
- //c >>= 32;
- }
-
- private static void SubPInvFrom(uint[] z)
- {
- long c = (long)z[0] - 1;
- z[0] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[1];
- z[1] = (uint)c;
- c >>= 32;
- }
- c += (long)z[2] + 1;
- z[2] = (uint)c;
- c >>= 32;
- c += (long)z[3] - 1;
- z[3] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)z[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (long)z[6];
- z[6] = (uint)c;
- c >>= 32;
- }
- c += (long)z[7] - 1;
- z[7] = (uint)c;
- //c >>= 32;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/gm/SM2P256V1FieldElement.cs b/BCCrypto/src/math/ec/custom/gm/SM2P256V1FieldElement.cs
deleted file mode 100644
index 4f6428f..0000000
--- a/BCCrypto/src/math/ec/custom/gm/SM2P256V1FieldElement.cs
+++ /dev/null
@@ -1,211 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.GM
-{
- internal class SM2P256V1FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = SM2P256V1Curve.q;
-
- protected internal readonly uint[] x;
-
- public SM2P256V1FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for SM2P256V1FieldElement", "x");
-
- this.x = SM2P256V1Field.FromBigInteger(x);
- }
-
- public SM2P256V1FieldElement()
- {
- this.x = Nat256.Create();
- }
-
- protected internal SM2P256V1FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat256.IsZero(x); }
- }
-
- public override bool IsOne
- {
- get { return Nat256.IsOne(x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat256.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat256.ToBigInteger(x);
- }
-
- public override string FieldName
- {
- get { return "SM2P256V1Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat256.Create();
- SM2P256V1Field.Add(x, ((SM2P256V1FieldElement)b).x, z);
- return new SM2P256V1FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat256.Create();
- SM2P256V1Field.AddOne(x, z);
- return new SM2P256V1FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat256.Create();
- SM2P256V1Field.Subtract(x, ((SM2P256V1FieldElement)b).x, z);
- return new SM2P256V1FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat256.Create();
- SM2P256V1Field.Multiply(x, ((SM2P256V1FieldElement)b).x, z);
- return new SM2P256V1FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- //return Multiply(b.Invert());
- uint[] z = Nat256.Create();
- Mod.Invert(SM2P256V1Field.P, ((SM2P256V1FieldElement)b).x, z);
- SM2P256V1Field.Multiply(z, x, z);
- return new SM2P256V1FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat256.Create();
- SM2P256V1Field.Negate(x, z);
- return new SM2P256V1FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat256.Create();
- SM2P256V1Field.Square(x, z);
- return new SM2P256V1FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- //return new SM2P256V1FieldElement(ToBigInteger().ModInverse(Q));
- uint[] z = Nat256.Create();
- Mod.Invert(SM2P256V1Field.P, x, z);
- return new SM2P256V1FieldElement(z);
- }
-
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- /*
- * Raise this element to the exponent 2^254 - 2^222 - 2^94 + 2^62
- *
- * Breaking up the exponent's binary representation into "repunits", we get:
- * { 31 1s } { 1 0s } { 128 1s } { 31 0s } { 1 1s } { 62 0s}
- *
- * We use an addition chain for the beginning: [1], 2, 3, 6, 12, [24], 30, [31]
- */
-
- uint[] x1 = this.x;
- if (Nat256.IsZero(x1) || Nat256.IsOne(x1))
- {
- return this;
- }
-
- uint[] x2 = Nat256.Create();
- SM2P256V1Field.Square(x1, x2);
- SM2P256V1Field.Multiply(x2, x1, x2);
- uint[] x4 = Nat256.Create();
- SM2P256V1Field.SquareN(x2, 2, x4);
- SM2P256V1Field.Multiply(x4, x2, x4);
- uint[] x6 = Nat256.Create();
- SM2P256V1Field.SquareN(x4, 2, x6);
- SM2P256V1Field.Multiply(x6, x2, x6);
- uint[] x12 = x2;
- SM2P256V1Field.SquareN(x6, 6, x12);
- SM2P256V1Field.Multiply(x12, x6, x12);
- uint[] x24 = Nat256.Create();
- SM2P256V1Field.SquareN(x12, 12, x24);
- SM2P256V1Field.Multiply(x24, x12, x24);
- uint[] x30 = x12;
- SM2P256V1Field.SquareN(x24, 6, x30);
- SM2P256V1Field.Multiply(x30, x6, x30);
- uint[] x31 = x6;
- SM2P256V1Field.Square(x30, x31);
- SM2P256V1Field.Multiply(x31, x1, x31);
-
- uint[] t1 = x24;
- SM2P256V1Field.SquareN(x31, 31, t1);
-
- uint[] x62 = x30;
- SM2P256V1Field.Multiply(t1, x31, x62);
-
- SM2P256V1Field.SquareN(t1, 32, t1);
- SM2P256V1Field.Multiply(t1, x62, t1);
- SM2P256V1Field.SquareN(t1, 62, t1);
- SM2P256V1Field.Multiply(t1, x62, t1);
- SM2P256V1Field.SquareN(t1, 4, t1);
- SM2P256V1Field.Multiply(t1, x4, t1);
- SM2P256V1Field.SquareN(t1, 32, t1);
- SM2P256V1Field.Multiply(t1, x1, t1);
- SM2P256V1Field.SquareN(t1, 62, t1);
-
- uint[] t2 = x4;
- SM2P256V1Field.Square(t1, t2);
-
- return Nat256.Eq(x1, t2) ? new SM2P256V1FieldElement(t1) : null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SM2P256V1FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SM2P256V1FieldElement);
- }
-
- public virtual bool Equals(SM2P256V1FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat256.Eq(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 8);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/gm/SM2P256V1Point.cs b/BCCrypto/src/math/ec/custom/gm/SM2P256V1Point.cs
deleted file mode 100644
index 916c906..0000000
--- a/BCCrypto/src/math/ec/custom/gm/SM2P256V1Point.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.GM
-{
- internal class SM2P256V1Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SM2P256V1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(bool)}
- */
- public SM2P256V1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SM2P256V1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SM2P256V1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SM2P256V1FieldElement X1 = (SM2P256V1FieldElement)this.RawXCoord, Y1 = (SM2P256V1FieldElement)this.RawYCoord;
- SM2P256V1FieldElement X2 = (SM2P256V1FieldElement)b.RawXCoord, Y2 = (SM2P256V1FieldElement)b.RawYCoord;
-
- SM2P256V1FieldElement Z1 = (SM2P256V1FieldElement)this.RawZCoords[0];
- SM2P256V1FieldElement Z2 = (SM2P256V1FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat256.CreateExt();
- uint[] t2 = Nat256.Create();
- uint[] t3 = Nat256.Create();
- uint[] t4 = Nat256.Create();
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SM2P256V1Field.Square(Z1.x, S2);
-
- U2 = t2;
- SM2P256V1Field.Multiply(S2, X2.x, U2);
-
- SM2P256V1Field.Multiply(S2, Z1.x, S2);
- SM2P256V1Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SM2P256V1Field.Square(Z2.x, S1);
-
- U1 = tt1;
- SM2P256V1Field.Multiply(S1, X1.x, U1);
-
- SM2P256V1Field.Multiply(S1, Z2.x, S1);
- SM2P256V1Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat256.Create();
- SM2P256V1Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- SM2P256V1Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat256.IsZero(H))
- {
- if (Nat256.IsZero(R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SM2P256V1Field.Square(H, HSquared);
-
- uint[] G = Nat256.Create();
- SM2P256V1Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SM2P256V1Field.Multiply(HSquared, U1, V);
-
- SM2P256V1Field.Negate(G, G);
- Nat256.Mul(S1, G, tt1);
-
- c = Nat256.AddBothTo(V, V, G);
- SM2P256V1Field.Reduce32(c, G);
-
- SM2P256V1FieldElement X3 = new SM2P256V1FieldElement(t4);
- SM2P256V1Field.Square(R, X3.x);
- SM2P256V1Field.Subtract(X3.x, G, X3.x);
-
- SM2P256V1FieldElement Y3 = new SM2P256V1FieldElement(G);
- SM2P256V1Field.Subtract(V, X3.x, Y3.x);
- SM2P256V1Field.MultiplyAddToExt(Y3.x, R, tt1);
- SM2P256V1Field.Reduce(tt1, Y3.x);
-
- SM2P256V1FieldElement Z3 = new SM2P256V1FieldElement(H);
- if (!Z1IsOne)
- {
- SM2P256V1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SM2P256V1Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[]{ Z3 };
-
- return new SM2P256V1Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SM2P256V1FieldElement Y1 = (SM2P256V1FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SM2P256V1FieldElement X1 = (SM2P256V1FieldElement)this.RawXCoord, Z1 = (SM2P256V1FieldElement)this.RawZCoords[0];
-
- uint c;
- uint[] t1 = Nat256.Create();
- uint[] t2 = Nat256.Create();
-
- uint[] Y1Squared = Nat256.Create();
- SM2P256V1Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat256.Create();
- SM2P256V1Field.Square(Y1Squared, T);
-
- bool Z1IsOne = Z1.IsOne;
-
- uint[] Z1Squared = Z1.x;
- if (!Z1IsOne)
- {
- Z1Squared = t2;
- SM2P256V1Field.Square(Z1.x, Z1Squared);
- }
-
- SM2P256V1Field.Subtract(X1.x, Z1Squared, t1);
-
- uint[] M = t2;
- SM2P256V1Field.Add(X1.x, Z1Squared, M);
- SM2P256V1Field.Multiply(M, t1, M);
- c = Nat256.AddBothTo(M, M, M);
- SM2P256V1Field.Reduce32(c, M);
-
- uint[] S = Y1Squared;
- SM2P256V1Field.Multiply(Y1Squared, X1.x, S);
- c = Nat.ShiftUpBits(8, S, 2, 0);
- SM2P256V1Field.Reduce32(c, S);
-
- c = Nat.ShiftUpBits(8, T, 3, 0, t1);
- SM2P256V1Field.Reduce32(c, t1);
-
- SM2P256V1FieldElement X3 = new SM2P256V1FieldElement(T);
- SM2P256V1Field.Square(M, X3.x);
- SM2P256V1Field.Subtract(X3.x, S, X3.x);
- SM2P256V1Field.Subtract(X3.x, S, X3.x);
-
- SM2P256V1FieldElement Y3 = new SM2P256V1FieldElement(S);
- SM2P256V1Field.Subtract(S, X3.x, Y3.x);
- SM2P256V1Field.Multiply(Y3.x, M, Y3.x);
- SM2P256V1Field.Subtract(Y3.x, t1, Y3.x);
-
- SM2P256V1FieldElement Z3 = new SM2P256V1FieldElement(M);
- SM2P256V1Field.Twice(Y1.x, Z3.x);
- if (!Z1IsOne)
- {
- SM2P256V1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SM2P256V1Point(curve, X3, Y3, new ECFieldElement[]{ Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between TwicePlus and ThreeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SM2P256V1Point(Curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP128R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecP128R1Curve.cs
deleted file mode 100644
index 9da27b4..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP128R1Curve.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP128R1Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = new BigInteger(1,
- Hex.Decode("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF"));
-
- private const int SecP128R1_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SecP128R1Point m_infinity;
-
- public SecP128R1Curve()
- : base(q)
- {
- this.m_infinity = new SecP128R1Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1,
- Hex.Decode("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC")));
- this.m_b = FromBigInteger(new BigInteger(1,
- Hex.Decode("E87579C11079F43DD824993C2CEE5ED3")));
- this.m_order = new BigInteger(1, Hex.Decode("FFFFFFFE0000000075A30D1B9038A115"));
- this.m_cofactor = BigInteger.One;
-
- this.m_coord = SecP128R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecP128R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecP128R1FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecP128R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecP128R1Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP128R1Field.cs b/BCCrypto/src/math/ec/custom/sec/SecP128R1Field.cs
deleted file mode 100644
index d1ac009..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP128R1Field.cs
+++ /dev/null
@@ -1,218 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP128R1Field
- {
- // 2^128 - 2^97 - 1
- internal static readonly uint[] P = new uint[] { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFD };
- internal static readonly uint[] PExt = new uint[] { 0x00000001, 0x00000000, 0x00000000, 0x00000004, 0xFFFFFFFE,
- 0xFFFFFFFF, 0x00000003, 0xFFFFFFFC };
- private static readonly uint[] PExtInv = new uint[]{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFB,
- 0x00000001, 0x00000000, 0xFFFFFFFC, 0x00000003 };
- private const uint P3 = 0xFFFFFFFD;
- private const uint PExt7 = 0xFFFFFFFC;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- uint c = Nat128.Add(x, y, z);
- if (c != 0 || (z[3] >= P3 && Nat128.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void AddExt(uint[] xx, uint[] yy, uint[] zz)
- {
- uint c = Nat256.Add(xx, yy, zz);
- if (c != 0 || (zz[7] >= PExt7 && Nat256.Gte(zz, PExt)))
- {
- Nat.AddTo(PExtInv.Length, PExtInv, zz);
- }
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- uint c = Nat.Inc(4, x, z);
- if (c != 0 || (z[3] >= P3 && Nat128.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat128.FromBigInteger(x);
- if (z[3] >= P3 && Nat128.Gte(z, P))
- {
- Nat128.SubFrom(P, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- if ((x[0] & 1) == 0)
- {
- Nat.ShiftDownBit(4, x, 0, z);
- }
- else
- {
- uint c = Nat128.Add(x, P, z);
- Nat.ShiftDownBit(4, z, c);
- }
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat128.CreateExt();
- Nat128.Mul(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
- {
- uint c = Nat128.MulAddTo(x, y, zz);
- if (c != 0 || (zz[7] >= PExt7 && Nat256.Gte(zz, PExt)))
- {
- Nat.AddTo(PExtInv.Length, PExtInv, zz);
- }
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat128.IsZero(x))
- {
- Nat128.Zero(z);
- }
- else
- {
- Nat128.Sub(P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- ulong x0 = xx[0], x1 = xx[1], x2 = xx[2], x3 = xx[3];
- ulong x4 = xx[4], x5 = xx[5], x6 = xx[6], x7 = xx[7];
-
- x3 += x7; x6 += (x7 << 1);
- x2 += x6; x5 += (x6 << 1);
- x1 += x5; x4 += (x5 << 1);
- x0 += x4; x3 += (x4 << 1);
-
- z[0] = (uint)x0; x1 += (x0 >> 32);
- z[1] = (uint)x1; x2 += (x1 >> 32);
- z[2] = (uint)x2; x3 += (x2 >> 32);
- z[3] = (uint)x3;
-
- Reduce32((uint)(x3 >> 32), z);
- }
-
- public static void Reduce32(uint x, uint[] z)
- {
- while (x != 0)
- {
- ulong c, x4 = x;
-
- c = (ulong)z[0] + x4;
- z[0] = (uint)c; c >>= 32;
- if (c != 0)
- {
- c += (ulong)z[1];
- z[1] = (uint)c; c >>= 32;
- c += (ulong)z[2];
- z[2] = (uint)c; c >>= 32;
- }
- c += (ulong)z[3] + (x4 << 1);
- z[3] = (uint)c; c >>= 32;
-
- Debug.Assert(c >= 0 && c <= 2);
-
- x = (uint)c;
- }
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat128.CreateExt();
- Nat128.Square(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
-
- uint[] tt = Nat128.CreateExt();
- Nat128.Square(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- Nat128.Square(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat128.Sub(x, y, z);
- if (c != 0)
- {
- SubPInvFrom(z);
- }
- }
-
- public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz)
- {
- int c = Nat.Sub(10, xx, yy, zz);
- if (c != 0)
- {
- Nat.SubFrom(PExtInv.Length, PExtInv, zz);
- }
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- uint c = Nat.ShiftUpBit(4, x, 0, z);
- if (c != 0 || (z[3] >= P3 && Nat128.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- private static void AddPInvTo(uint[] z)
- {
- long c = (long)z[0] + 1;
- z[0] = (uint)c; c >>= 32;
- if (c != 0)
- {
- c += (long)z[1];
- z[1] = (uint)c; c >>= 32;
- c += (long)z[2];
- z[2] = (uint)c; c >>= 32;
- }
- c += (long)z[3] + 2;
- z[3] = (uint)c;
- }
-
- private static void SubPInvFrom(uint[] z)
- {
- long c = (long)z[0] - 1;
- z[0] = (uint)c; c >>= 32;
- if (c != 0)
- {
- c += (long)z[1];
- z[1] = (uint)c; c >>= 32;
- c += (long)z[2];
- z[2] = (uint)c; c >>= 32;
- }
- c += (long)z[3] - 2;
- z[3] = (uint)c;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP128R1FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecP128R1FieldElement.cs
deleted file mode 100644
index fa7951d..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP128R1FieldElement.cs
+++ /dev/null
@@ -1,198 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP128R1FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = SecP128R1Curve.q;
-
- protected internal readonly uint[] x;
-
- public SecP128R1FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for SecP128R1FieldElement", "x");
-
- this.x = SecP128R1Field.FromBigInteger(x);
- }
-
- public SecP128R1FieldElement()
- {
- this.x = Nat128.Create();
- }
-
- protected internal SecP128R1FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat128.IsZero(x); }
- }
-
- public override bool IsOne
- {
- get { return Nat128.IsOne(x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat128.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat128.ToBigInteger(x);
- }
-
- public override string FieldName
- {
- get { return "SecP128R1Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat128.Create();
- SecP128R1Field.Add(x, ((SecP128R1FieldElement)b).x, z);
- return new SecP128R1FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat128.Create();
- SecP128R1Field.AddOne(x, z);
- return new SecP128R1FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat128.Create();
- SecP128R1Field.Subtract(x, ((SecP128R1FieldElement)b).x, z);
- return new SecP128R1FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat128.Create();
- SecP128R1Field.Multiply(x, ((SecP128R1FieldElement)b).x, z);
- return new SecP128R1FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- // return multiply(b.invert());
- uint[] z = Nat128.Create();
- Mod.Invert(SecP128R1Field.P, ((SecP128R1FieldElement)b).x, z);
- SecP128R1Field.Multiply(z, x, z);
- return new SecP128R1FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat128.Create();
- SecP128R1Field.Negate(x, z);
- return new SecP128R1FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat128.Create();
- SecP128R1Field.Square(x, z);
- return new SecP128R1FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- // return new SecP128R1FieldElement(toBigInteger().modInverse(Q));
- uint[] z = Nat128.Create();
- Mod.Invert(SecP128R1Field.P, x, z);
- return new SecP128R1FieldElement(z);
- }
-
- // D.1.4 91
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- /*
- * Raise this element to the exponent 2^126 - 2^95
- *
- * Breaking up the exponent's binary representation into "repunits", we get:
- * { 31 1s } { 95 0s }
- *
- * Therefore we need an addition chain containing 31 (the length of the repunit) We use:
- * 1, 2, 4, 8, 10, 20, 30, [31]
- */
-
- uint[] x1 = this.x;
- if (Nat128.IsZero(x1) || Nat128.IsOne(x1))
- return this;
-
- uint[] x2 = Nat128.Create();
- SecP128R1Field.Square(x1, x2);
- SecP128R1Field.Multiply(x2, x1, x2);
- uint[] x4 = Nat128.Create();
- SecP128R1Field.SquareN(x2, 2, x4);
- SecP128R1Field.Multiply(x4, x2, x4);
- uint[] x8 = Nat128.Create();
- SecP128R1Field.SquareN(x4, 4, x8);
- SecP128R1Field.Multiply(x8, x4, x8);
- uint[] x10 = x4;
- SecP128R1Field.SquareN(x8, 2, x10);
- SecP128R1Field.Multiply(x10, x2, x10);
- uint[] x20 = x2;
- SecP128R1Field.SquareN(x10, 10, x20);
- SecP128R1Field.Multiply(x20, x10, x20);
- uint[] x30 = x8;
- SecP128R1Field.SquareN(x20, 10, x30);
- SecP128R1Field.Multiply(x30, x10, x30);
- uint[] x31 = x10;
- SecP128R1Field.Square(x30, x31);
- SecP128R1Field.Multiply(x31, x1, x31);
-
- uint[] t1 = x31;
- SecP128R1Field.SquareN(t1, 95, t1);
-
- uint[] t2 = x30;
- SecP128R1Field.Square(t1, t2);
-
- return Nat128.Eq(x1, t2) ? new SecP128R1FieldElement(t1) : null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecP128R1FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecP128R1FieldElement);
- }
-
- public virtual bool Equals(SecP128R1FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat128.Eq(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 4);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP128R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecP128R1Point.cs
deleted file mode 100644
index ae76d3c..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP128R1Point.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP128R1Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecP128R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(boolean)}
- */
- public SecP128R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecP128R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecP128R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SecP128R1FieldElement X1 = (SecP128R1FieldElement)this.RawXCoord, Y1 = (SecP128R1FieldElement)this.RawYCoord;
- SecP128R1FieldElement X2 = (SecP128R1FieldElement)b.RawXCoord, Y2 = (SecP128R1FieldElement)b.RawYCoord;
-
- SecP128R1FieldElement Z1 = (SecP128R1FieldElement)this.RawZCoords[0];
- SecP128R1FieldElement Z2 = (SecP128R1FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat128.CreateExt();
- uint[] t2 = Nat128.Create();
- uint[] t3 = Nat128.Create();
- uint[] t4 = Nat128.Create();
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SecP128R1Field.Square(Z1.x, S2);
-
- U2 = t2;
- SecP128R1Field.Multiply(S2, X2.x, U2);
-
- SecP128R1Field.Multiply(S2, Z1.x, S2);
- SecP128R1Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SecP128R1Field.Square(Z2.x, S1);
-
- U1 = tt1;
- SecP128R1Field.Multiply(S1, X1.x, U1);
-
- SecP128R1Field.Multiply(S1, Z2.x, S1);
- SecP128R1Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat128.Create();
- SecP128R1Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- SecP128R1Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat128.IsZero(H))
- {
- if (Nat128.IsZero(R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SecP128R1Field.Square(H, HSquared);
-
- uint[] G = Nat128.Create();
- SecP128R1Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SecP128R1Field.Multiply(HSquared, U1, V);
-
- SecP128R1Field.Negate(G, G);
- Nat128.Mul(S1, G, tt1);
-
- c = Nat128.AddBothTo(V, V, G);
- SecP128R1Field.Reduce32(c, G);
-
- SecP128R1FieldElement X3 = new SecP128R1FieldElement(t4);
- SecP128R1Field.Square(R, X3.x);
- SecP128R1Field.Subtract(X3.x, G, X3.x);
-
- SecP128R1FieldElement Y3 = new SecP128R1FieldElement(G);
- SecP128R1Field.Subtract(V, X3.x, Y3.x);
- SecP128R1Field.MultiplyAddToExt(Y3.x, R, tt1);
- SecP128R1Field.Reduce(tt1, Y3.x);
-
- SecP128R1FieldElement Z3 = new SecP128R1FieldElement(H);
- if (!Z1IsOne)
- {
- SecP128R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SecP128R1Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[]{ Z3 };
-
- return new SecP128R1Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SecP128R1FieldElement Y1 = (SecP128R1FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SecP128R1FieldElement X1 = (SecP128R1FieldElement)this.RawXCoord, Z1 = (SecP128R1FieldElement)this.RawZCoords[0];
-
- uint c;
- uint[] t1 = Nat128.Create();
- uint[] t2 = Nat128.Create();
-
- uint[] Y1Squared = Nat128.Create();
- SecP128R1Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat128.Create();
- SecP128R1Field.Square(Y1Squared, T);
-
- bool Z1IsOne = Z1.IsOne;
-
- uint[] Z1Squared = Z1.x;
- if (!Z1IsOne)
- {
- Z1Squared = t2;
- SecP128R1Field.Square(Z1.x, Z1Squared);
- }
-
- SecP128R1Field.Subtract(X1.x, Z1Squared, t1);
-
- uint[] M = t2;
- SecP128R1Field.Add(X1.x, Z1Squared, M);
- SecP128R1Field.Multiply(M, t1, M);
- c = Nat128.AddBothTo(M, M, M);
- SecP128R1Field.Reduce32(c, M);
-
- uint[] S = Y1Squared;
- SecP128R1Field.Multiply(Y1Squared, X1.x, S);
- c = Nat.ShiftUpBits(4, S, 2, 0);
- SecP128R1Field.Reduce32(c, S);
-
- c = Nat.ShiftUpBits(4, T, 3, 0, t1);
- SecP128R1Field.Reduce32(c, t1);
-
- SecP128R1FieldElement X3 = new SecP128R1FieldElement(T);
- SecP128R1Field.Square(M, X3.x);
- SecP128R1Field.Subtract(X3.x, S, X3.x);
- SecP128R1Field.Subtract(X3.x, S, X3.x);
-
- SecP128R1FieldElement Y3 = new SecP128R1FieldElement(S);
- SecP128R1Field.Subtract(S, X3.x, Y3.x);
- SecP128R1Field.Multiply(Y3.x, M, Y3.x);
- SecP128R1Field.Subtract(Y3.x, t1, Y3.x);
-
- SecP128R1FieldElement Z3 = new SecP128R1FieldElement(M);
- SecP128R1Field.Twice(Y1.x, Z3.x);
- if (!Z1IsOne)
- {
- SecP128R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SecP128R1Point(curve, X3, Y3, new ECFieldElement[]{ Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between twicePlus and threeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SecP128R1Point(Curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP160K1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecP160K1Curve.cs
deleted file mode 100644
index 7d45c62..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP160K1Curve.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP160K1Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = SecP160R2Curve.q;
-
- private const int SECP160K1_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SecP160K1Point m_infinity;
-
- public SecP160K1Curve()
- : base(q)
- {
- this.m_infinity = new SecP160K1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.Zero);
- this.m_b = FromBigInteger(BigInteger.ValueOf(7));
- this.m_order = new BigInteger(1, Hex.Decode("0100000000000000000001B8FA16DFAB9ACA16B6B3"));
- this.m_cofactor = BigInteger.One;
- this.m_coord = SECP160K1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecP160K1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecP160R2FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecP160K1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecP160K1Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP160K1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecP160K1Point.cs
deleted file mode 100644
index 1bcbadb..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP160K1Point.cs
+++ /dev/null
@@ -1,269 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP160K1Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.CreatePoint to construct points
- */
- public SecP160K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(bool)}
- */
- public SecP160K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecP160K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs,
- bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecP160K1Point(null, AffineXCoord, AffineYCoord);
- }
-
- // B.3 pg 62
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SecP160R2FieldElement X1 = (SecP160R2FieldElement)this.RawXCoord, Y1 = (SecP160R2FieldElement)this.RawYCoord;
- SecP160R2FieldElement X2 = (SecP160R2FieldElement)b.RawXCoord, Y2 = (SecP160R2FieldElement)b.RawYCoord;
-
- SecP160R2FieldElement Z1 = (SecP160R2FieldElement)this.RawZCoords[0];
- SecP160R2FieldElement Z2 = (SecP160R2FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat160.CreateExt();
- uint[] t2 = Nat160.Create();
- uint[] t3 = Nat160.Create();
- uint[] t4 = Nat160.Create();
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SecP160R2Field.Square(Z1.x, S2);
-
- U2 = t2;
- SecP160R2Field.Multiply(S2, X2.x, U2);
-
- SecP160R2Field.Multiply(S2, Z1.x, S2);
- SecP160R2Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SecP160R2Field.Square(Z2.x, S1);
-
- U1 = tt1;
- SecP160R2Field.Multiply(S1, X1.x, U1);
-
- SecP160R2Field.Multiply(S1, Z2.x, S1);
- SecP160R2Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat160.Create();
- SecP160R2Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- SecP160R2Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat160.IsZero(H))
- {
- if (Nat160.IsZero(R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SecP160R2Field.Square(H, HSquared);
-
- uint[] G = Nat160.Create();
- SecP160R2Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SecP160R2Field.Multiply(HSquared, U1, V);
-
- SecP160R2Field.Negate(G, G);
- Nat160.Mul(S1, G, tt1);
-
- c = Nat160.AddBothTo(V, V, G);
- SecP160R2Field.Reduce32(c, G);
-
- SecP160R2FieldElement X3 = new SecP160R2FieldElement(t4);
- SecP160R2Field.Square(R, X3.x);
- SecP160R2Field.Subtract(X3.x, G, X3.x);
-
- SecP160R2FieldElement Y3 = new SecP160R2FieldElement(G);
- SecP160R2Field.Subtract(V, X3.x, Y3.x);
- SecP160R2Field.MultiplyAddToExt(Y3.x, R, tt1);
- SecP160R2Field.Reduce(tt1, Y3.x);
-
- SecP160R2FieldElement Z3 = new SecP160R2FieldElement(H);
- if (!Z1IsOne)
- {
- SecP160R2Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SecP160R2Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[] { Z3 };
-
- return new SecP160K1Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- // B.3 pg 62
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SecP160R2FieldElement Y1 = (SecP160R2FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SecP160R2FieldElement X1 = (SecP160R2FieldElement)this.RawXCoord, Z1 = (SecP160R2FieldElement)this.RawZCoords[0];
-
- uint c;
-
- uint[] Y1Squared = Nat160.Create();
- SecP160R2Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat160.Create();
- SecP160R2Field.Square(Y1Squared, T);
-
- uint[] M = Nat160.Create();
- SecP160R2Field.Square(X1.x, M);
- c = Nat160.AddBothTo(M, M, M);
- SecP160R2Field.Reduce32(c, M);
-
- uint[] S = Y1Squared;
- SecP160R2Field.Multiply(Y1Squared, X1.x, S);
- c = Nat.ShiftUpBits(5, S, 2, 0);
- SecP160R2Field.Reduce32(c, S);
-
- uint[] t1 = Nat160.Create();
- c = Nat.ShiftUpBits(5, T, 3, 0, t1);
- SecP160R2Field.Reduce32(c, t1);
-
- SecP160R2FieldElement X3 = new SecP160R2FieldElement(T);
- SecP160R2Field.Square(M, X3.x);
- SecP160R2Field.Subtract(X3.x, S, X3.x);
- SecP160R2Field.Subtract(X3.x, S, X3.x);
-
- SecP160R2FieldElement Y3 = new SecP160R2FieldElement(S);
- SecP160R2Field.Subtract(S, X3.x, Y3.x);
- SecP160R2Field.Multiply(Y3.x, M, Y3.x);
- SecP160R2Field.Subtract(Y3.x, t1, Y3.x);
-
- SecP160R2FieldElement Z3 = new SecP160R2FieldElement(M);
- SecP160R2Field.Twice(Y1.x, Z3.x);
- if (!Z1.IsOne)
- {
- SecP160R2Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SecP160K1Point(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between TwicePlus and threeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SecP160K1Point(Curve, this.RawXCoord, this.RawYCoord.Negate(), this.RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP160R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecP160R1Curve.cs
deleted file mode 100644
index 87389af..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP160R1Curve.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP160R1Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF"));
-
- private const int SecP160R1_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SecP160R1Point m_infinity;
-
- public SecP160R1Curve()
- : base(q)
- {
- this.m_infinity = new SecP160R1Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC")));
- this.m_b = FromBigInteger(new BigInteger(1,
- Hex.Decode("1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45")));
- this.m_order = new BigInteger(1, Hex.Decode("0100000000000000000001F4C8F927AED3CA752257"));
- this.m_cofactor = BigInteger.One;
-
- this.m_coord = SecP160R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecP160R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecP160R1FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecP160R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecP160R1Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP160R1Field.cs b/BCCrypto/src/math/ec/custom/sec/SecP160R1Field.cs
deleted file mode 100644
index 6a5a2ef..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP160R1Field.cs
+++ /dev/null
@@ -1,186 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP160R1Field
- {
- // 2^160 - 2^31 - 1
- internal static readonly uint[] P = new uint[] { 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
- internal static readonly uint[] PExt = new uint[] { 0x00000001, 0x40000001, 0x00000000, 0x00000000, 0x00000000,
- 0xFFFFFFFE, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
- private static readonly uint[] PExtInv = new uint[]{ 0xFFFFFFFF, 0xBFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF,
- 0xFFFFFFFF, 0x00000001, 0x00000001 };
- private const uint P4 = 0xFFFFFFFF;
- private const uint PExt9 = 0xFFFFFFFF;
- private const uint PInv = 0x80000001;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- uint c = Nat160.Add(x, y, z);
- if (c != 0 || (z[4] == P4 && Nat160.Gte(z, P)))
- {
- Nat.AddWordTo(5, PInv, z);
- }
- }
-
- public static void AddExt(uint[] xx, uint[] yy, uint[] zz)
- {
- uint c = Nat.Add(10, xx, yy, zz);
- if (c != 0 || (zz[9] == PExt9 && Nat.Gte(10, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(10, zz, PExtInv.Length);
- }
- }
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- uint c = Nat.Inc(5, x, z);
- if (c != 0 || (z[4] == P4 && Nat160.Gte(z, P)))
- {
- Nat.AddWordTo(5, PInv, z);
- }
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat160.FromBigInteger(x);
- if (z[4] == P4 && Nat160.Gte(z, P))
- {
- Nat160.SubFrom(P, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- if ((x[0] & 1) == 0)
- {
- Nat.ShiftDownBit(5, x, 0, z);
- }
- else
- {
- uint c = Nat160.Add(x, P, z);
- Nat.ShiftDownBit(5, z, c);
- }
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat160.CreateExt();
- Nat160.Mul(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
- {
- uint c = Nat160.MulAddTo(x, y, zz);
- if (c != 0 || (zz[9] == PExt9 && Nat.Gte(10, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(10, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat160.IsZero(x))
- {
- Nat160.Zero(z);
- }
- else
- {
- Nat160.Sub(P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- ulong x5 = xx[5], x6 = xx[6], x7 = xx[7], x8 = xx[8], x9 = xx[9];
-
- ulong c = 0;
- c += (ulong)xx[0] + x5 + (x5 << 31);
- z[0] = (uint)c; c >>= 32;
- c += (ulong)xx[1] + x6 + (x6 << 31);
- z[1] = (uint)c; c >>= 32;
- c += (ulong)xx[2] + x7 + (x7 << 31);
- z[2] = (uint)c; c >>= 32;
- c += (ulong)xx[3] + x8 + (x8 << 31);
- z[3] = (uint)c; c >>= 32;
- c += (ulong)xx[4] + x9 + (x9 << 31);
- z[4] = (uint)c; c >>= 32;
-
- Debug.Assert(c >> 32 == 0);
-
- Reduce32((uint)c, z);
- }
-
- public static void Reduce32(uint x, uint[] z)
- {
- if ((x != 0 && Nat160.MulWordsAdd(PInv, x, z, 0) != 0)
- || (z[4] == P4 && Nat160.Gte(z, P)))
- {
- Nat.AddWordTo(5, PInv, z);
- }
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat160.CreateExt();
- Nat160.Square(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
-
- uint[] tt = Nat160.CreateExt();
- Nat160.Square(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- Nat160.Square(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat160.Sub(x, y, z);
- if (c != 0)
- {
- Nat.SubWordFrom(5, PInv, z);
- }
- }
-
- public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz)
- {
- int c = Nat.Sub(10, xx, yy, zz);
- if (c != 0)
- {
- if (Nat.SubFrom(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.DecAt(10, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- uint c = Nat.ShiftUpBit(5, x, 0, z);
- if (c != 0 || (z[4] == P4 && Nat160.Gte(z, P)))
- {
- Nat.AddWordTo(5, PInv, z);
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP160R1FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecP160R1FieldElement.cs
deleted file mode 100644
index d1fc756..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP160R1FieldElement.cs
+++ /dev/null
@@ -1,203 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP160R1FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = SecP160R1Curve.q;
-
- protected internal readonly uint[] x;
-
- public SecP160R1FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for SecP160R1FieldElement", "x");
-
- this.x = SecP160R1Field.FromBigInteger(x);
- }
-
- public SecP160R1FieldElement()
- {
- this.x = Nat160.Create();
- }
-
- protected internal SecP160R1FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat160.IsZero(x); }
- }
-
- public override bool IsOne
- {
- get { return Nat160.IsOne(x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat160.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat160.ToBigInteger(x);
- }
-
- public override string FieldName
- {
- get { return "SecP160R1Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat160.Create();
- SecP160R1Field.Add(x, ((SecP160R1FieldElement)b).x, z);
- return new SecP160R1FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat160.Create();
- SecP160R1Field.AddOne(x, z);
- return new SecP160R1FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat160.Create();
- SecP160R1Field.Subtract(x, ((SecP160R1FieldElement)b).x, z);
- return new SecP160R1FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat160.Create();
- SecP160R1Field.Multiply(x, ((SecP160R1FieldElement)b).x, z);
- return new SecP160R1FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- // return multiply(b.invert());
- uint[] z = Nat160.Create();
- Mod.Invert(SecP160R1Field.P, ((SecP160R1FieldElement)b).x, z);
- SecP160R1Field.Multiply(z, x, z);
- return new SecP160R1FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat160.Create();
- SecP160R1Field.Negate(x, z);
- return new SecP160R1FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat160.Create();
- SecP160R1Field.Square(x, z);
- return new SecP160R1FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- // return new SecP160R1FieldElement(ToBigInteger().modInverse(Q));
- uint[] z = Nat160.Create();
- Mod.Invert(SecP160R1Field.P, x, z);
- return new SecP160R1FieldElement(z);
- }
-
- // D.1.4 91
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- /*
- * Raise this element to the exponent 2^158 - 2^29
- *
- * Breaking up the exponent's binary representation into "repunits", we get:
- * { 129 1s } { 29 0s }
- *
- * Therefore we need an addition chain containing 129 (the length of the repunit) We use:
- * 1, 2, 4, 8, 16, 32, 64, 128, [129]
- */
-
- uint[] x1 = this.x;
- if (Nat160.IsZero(x1) || Nat160.IsOne(x1))
- {
- return this;
- }
-
- uint[] x2 = Nat160.Create();
- SecP160R1Field.Square(x1, x2);
- SecP160R1Field.Multiply(x2, x1, x2);
- uint[] x4 = Nat160.Create();
- SecP160R1Field.SquareN(x2, 2, x4);
- SecP160R1Field.Multiply(x4, x2, x4);
- uint[] x8 = x2;
- SecP160R1Field.SquareN(x4, 4, x8);
- SecP160R1Field.Multiply(x8, x4, x8);
- uint[] x16 = x4;
- SecP160R1Field.SquareN(x8, 8, x16);
- SecP160R1Field.Multiply(x16, x8, x16);
- uint[] x32 = x8;
- SecP160R1Field.SquareN(x16, 16, x32);
- SecP160R1Field.Multiply(x32, x16, x32);
- uint[] x64 = x16;
- SecP160R1Field.SquareN(x32, 32, x64);
- SecP160R1Field.Multiply(x64, x32, x64);
- uint[] x128 = x32;
- SecP160R1Field.SquareN(x64, 64, x128);
- SecP160R1Field.Multiply(x128, x64, x128);
- uint[] x129 = x64;
- SecP160R1Field.Square(x128, x129);
- SecP160R1Field.Multiply(x129, x1, x129);
-
- uint[] t1 = x129;
- SecP160R1Field.SquareN(t1, 29, t1);
-
- uint[] t2 = x128;
- SecP160R1Field.Square(t1, t2);
-
- return Nat160.Eq(x1, t2) ? new SecP160R1FieldElement(t1) : null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecP160R1FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecP160R1FieldElement);
- }
-
- public virtual bool Equals(SecP160R1FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat160.Eq(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 5);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP160R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecP160R1Point.cs
deleted file mode 100644
index f9f065d..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP160R1Point.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP160R1Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.CreatePoint to construct points
- */
- public SecP160R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(bool)}
- */
- public SecP160R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecP160R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecP160R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SecP160R1FieldElement X1 = (SecP160R1FieldElement)this.RawXCoord, Y1 = (SecP160R1FieldElement)this.RawYCoord;
- SecP160R1FieldElement X2 = (SecP160R1FieldElement)b.RawXCoord, Y2 = (SecP160R1FieldElement)b.RawYCoord;
-
- SecP160R1FieldElement Z1 = (SecP160R1FieldElement)this.RawZCoords[0];
- SecP160R1FieldElement Z2 = (SecP160R1FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat160.CreateExt();
- uint[] t2 = Nat160.Create();
- uint[] t3 = Nat160.Create();
- uint[] t4 = Nat160.Create();
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SecP160R1Field.Square(Z1.x, S2);
-
- U2 = t2;
- SecP160R1Field.Multiply(S2, X2.x, U2);
-
- SecP160R1Field.Multiply(S2, Z1.x, S2);
- SecP160R1Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SecP160R1Field.Square(Z2.x, S1);
-
- U1 = tt1;
- SecP160R1Field.Multiply(S1, X1.x, U1);
-
- SecP160R1Field.Multiply(S1, Z2.x, S1);
- SecP160R1Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat160.Create();
- SecP160R1Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- SecP160R1Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat160.IsZero(H))
- {
- if (Nat160.IsZero(R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SecP160R1Field.Square(H, HSquared);
-
- uint[] G = Nat160.Create();
- SecP160R1Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SecP160R1Field.Multiply(HSquared, U1, V);
-
- SecP160R1Field.Negate(G, G);
- Nat160.Mul(S1, G, tt1);
-
- c = Nat160.AddBothTo(V, V, G);
- SecP160R1Field.Reduce32(c, G);
-
- SecP160R1FieldElement X3 = new SecP160R1FieldElement(t4);
- SecP160R1Field.Square(R, X3.x);
- SecP160R1Field.Subtract(X3.x, G, X3.x);
-
- SecP160R1FieldElement Y3 = new SecP160R1FieldElement(G);
- SecP160R1Field.Subtract(V, X3.x, Y3.x);
- SecP160R1Field.MultiplyAddToExt(Y3.x, R, tt1);
- SecP160R1Field.Reduce(tt1, Y3.x);
-
- SecP160R1FieldElement Z3 = new SecP160R1FieldElement(H);
- if (!Z1IsOne)
- {
- SecP160R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SecP160R1Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[]{ Z3 };
-
- return new SecP160R1Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SecP160R1FieldElement Y1 = (SecP160R1FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SecP160R1FieldElement X1 = (SecP160R1FieldElement)this.RawXCoord, Z1 = (SecP160R1FieldElement)this.RawZCoords[0];
-
- uint c;
- uint[] t1 = Nat160.Create();
- uint[] t2 = Nat160.Create();
-
- uint[] Y1Squared = Nat160.Create();
- SecP160R1Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat160.Create();
- SecP160R1Field.Square(Y1Squared, T);
-
- bool Z1IsOne = Z1.IsOne;
-
- uint[] Z1Squared = Z1.x;
- if (!Z1IsOne)
- {
- Z1Squared = t2;
- SecP160R1Field.Square(Z1.x, Z1Squared);
- }
-
- SecP160R1Field.Subtract(X1.x, Z1Squared, t1);
-
- uint[] M = t2;
- SecP160R1Field.Add(X1.x, Z1Squared, M);
- SecP160R1Field.Multiply(M, t1, M);
- c = Nat160.AddBothTo(M, M, M);
- SecP160R1Field.Reduce32(c, M);
-
- uint[] S = Y1Squared;
- SecP160R1Field.Multiply(Y1Squared, X1.x, S);
- c = Nat.ShiftUpBits(5, S, 2, 0);
- SecP160R1Field.Reduce32(c, S);
-
- c = Nat.ShiftUpBits(5, T, 3, 0, t1);
- SecP160R1Field.Reduce32(c, t1);
-
- SecP160R1FieldElement X3 = new SecP160R1FieldElement(T);
- SecP160R1Field.Square(M, X3.x);
- SecP160R1Field.Subtract(X3.x, S, X3.x);
- SecP160R1Field.Subtract(X3.x, S, X3.x);
-
- SecP160R1FieldElement Y3 = new SecP160R1FieldElement(S);
- SecP160R1Field.Subtract(S, X3.x, Y3.x);
- SecP160R1Field.Multiply(Y3.x, M, Y3.x);
- SecP160R1Field.Subtract(Y3.x, t1, Y3.x);
-
- SecP160R1FieldElement Z3 = new SecP160R1FieldElement(M);
- SecP160R1Field.Twice(Y1.x, Z3.x);
- if (!Z1IsOne)
- {
- SecP160R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SecP160R1Point(curve, X3, Y3, new ECFieldElement[]{ Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between TwicePlus and ThreeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SecP160R1Point(Curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP160R2Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecP160R2Curve.cs
deleted file mode 100644
index 1005614..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP160R2Curve.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP160R2Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73"));
-
- private const int SecP160R2_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SecP160R2Point m_infinity;
-
- public SecP160R2Curve()
- : base(q)
- {
- this.m_infinity = new SecP160R2Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70")));
- this.m_b = FromBigInteger(new BigInteger(1,
- Hex.Decode("B4E134D3FB59EB8BAB57274904664D5AF50388BA")));
- this.m_order = new BigInteger(1, Hex.Decode("0100000000000000000000351EE786A818F3A1A16B"));
- this.m_cofactor = BigInteger.One;
-
- this.m_coord = SecP160R2_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecP160R2Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecP160R2FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecP160R2Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecP160R2Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP160R2Field.cs b/BCCrypto/src/math/ec/custom/sec/SecP160R2Field.cs
deleted file mode 100644
index 1bef32e..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP160R2Field.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP160R2Field
- {
- // 2^160 - 2^32 - 2^14 - 2^12 - 2^9 - 2^8 - 2^7 - 2^3 - 2^2 - 1
- internal static readonly uint[] P = new uint[]{ 0xFFFFAC73, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
- internal static readonly uint[] PExt = new uint[]{ 0x1B44BBA9, 0x0000A71A, 0x00000001, 0x00000000, 0x00000000,
- 0xFFFF58E6, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
- private static readonly uint[] PExtInv = new uint[]{ 0xE4BB4457, 0xFFFF58E5, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF,
- 0x0000A719, 0x00000002 };
- private const uint P4 = 0xFFFFFFFF;
- private const uint PExt9 = 0xFFFFFFFF;
- private const uint PInv33 = 0x538D;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- uint c = Nat160.Add(x, y, z);
- if (c != 0 || (z[4] == P4 && Nat160.Gte(z, P)))
- {
- Nat.Add33To(5, PInv33, z);
- }
- }
-
- public static void AddExt(uint[] xx, uint[] yy, uint[] zz)
- {
- uint c = Nat.Add(10, xx, yy, zz);
- if (c != 0 || (zz[9] == PExt9 && Nat.Gte(10, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(10, zz, PExtInv.Length);
- }
- }
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- uint c = Nat.Inc(5, x, z);
- if (c != 0 || (z[4] == P4 && Nat160.Gte(z, P)))
- {
- Nat.Add33To(5, PInv33, z);
- }
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat160.FromBigInteger(x);
- if (z[4] == P4 && Nat160.Gte(z, P))
- {
- Nat160.SubFrom(P, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- if ((x[0] & 1) == 0)
- {
- Nat.ShiftDownBit(5, x, 0, z);
- }
- else
- {
- uint c = Nat160.Add(x, P, z);
- Nat.ShiftDownBit(5, z, c);
- }
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat160.CreateExt();
- Nat160.Mul(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
- {
- uint c = Nat160.MulAddTo(x, y, zz);
- if (c != 0 || (zz[9] == PExt9 && Nat.Gte(10, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(10, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat160.IsZero(x))
- {
- Nat160.Zero(z);
- }
- else
- {
- Nat160.Sub(P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- ulong cc = Nat160.Mul33Add(PInv33, xx, 5, xx, 0, z, 0);
- uint c = Nat160.Mul33DWordAdd(PInv33, cc, z, 0);
-
- Debug.Assert(c == 0 || c == 1);
-
- if (c != 0 || (z[4] == P4 && Nat160.Gte(z, P)))
- {
- Nat.Add33To(5, PInv33, z);
- }
- }
-
- public static void Reduce32(uint x, uint[] z)
- {
- if ((x != 0 && Nat160.Mul33WordAdd(PInv33, x, z, 0) != 0)
- || (z[4] == P4 && Nat160.Gte(z, P)))
- {
- Nat.Add33To(5, PInv33, z);
- }
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat160.CreateExt();
- Nat160.Square(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
-
- uint[] tt = Nat160.CreateExt();
- Nat160.Square(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- Nat160.Square(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat160.Sub(x, y, z);
- if (c != 0)
- {
- Nat.Sub33From(5, PInv33, z);
- }
- }
-
- public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz)
- {
- int c = Nat.Sub(10, xx, yy, zz);
- if (c != 0)
- {
- if (Nat.SubFrom(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.DecAt(10, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- uint c = Nat.ShiftUpBit(5, x, 0, z);
- if (c != 0 || (z[4] == P4 && Nat160.Gte(z, P)))
- {
- Nat.Add33To(5, PInv33, z);
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP160R2FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecP160R2FieldElement.cs
deleted file mode 100644
index bdb5245..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP160R2FieldElement.cs
+++ /dev/null
@@ -1,218 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP160R2FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = SecP160R2Curve.q;
-
- protected internal readonly uint[] x;
-
- public SecP160R2FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for SecP160R2FieldElement", "x");
-
- this.x = SecP160R2Field.FromBigInteger(x);
- }
-
- public SecP160R2FieldElement()
- {
- this.x = Nat160.Create();
- }
-
- protected internal SecP160R2FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat160.IsZero(x); }
- }
-
- public override bool IsOne
- {
- get { return Nat160.IsOne(x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat160.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat160.ToBigInteger(x);
- }
-
- public override string FieldName
- {
- get { return "SecP160R2Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat160.Create();
- SecP160R2Field.Add(x, ((SecP160R2FieldElement)b).x, z);
- return new SecP160R2FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat160.Create();
- SecP160R2Field.AddOne(x, z);
- return new SecP160R2FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat160.Create();
- SecP160R2Field.Subtract(x, ((SecP160R2FieldElement)b).x, z);
- return new SecP160R2FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat160.Create();
- SecP160R2Field.Multiply(x, ((SecP160R2FieldElement)b).x, z);
- return new SecP160R2FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- // return Multiply(b.invert());
- uint[] z = Nat160.Create();
- Mod.Invert(SecP160R2Field.P, ((SecP160R2FieldElement)b).x, z);
- SecP160R2Field.Multiply(z, x, z);
- return new SecP160R2FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat160.Create();
- SecP160R2Field.Negate(x, z);
- return new SecP160R2FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat160.Create();
- SecP160R2Field.Square(x, z);
- return new SecP160R2FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- // return new SecP160R2FieldElement(ToBigInteger().modInverse(Q));
- uint[] z = Nat160.Create();
- Mod.Invert(SecP160R2Field.P, x, z);
- return new SecP160R2FieldElement(z);
- }
-
- // D.1.4 91
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- /*
- * Raise this element to the exponent 2^158 - 2^30 - 2^12 - 2^10 - 2^7 - 2^6 - 2^5 - 2^1 - 2^0
- *
- * Breaking up the exponent's binary representation into "repunits", we get: { 127 1s } { 1
- * 0s } { 17 1s } { 1 0s } { 1 1s } { 1 0s } { 2 1s } { 3 0s } { 3 1s } { 1 0s } { 1 1s }
- *
- * Therefore we need an Addition chain containing 1, 2, 3, 17, 127 (the lengths of the repunits)
- * We use: [1], [2], [3], 4, 7, 14, [17], 31, 62, 124, [127]
- */
-
- uint[] x1 = this.x;
- if (Nat160.IsZero(x1) || Nat160.IsOne(x1))
- {
- return this;
- }
-
- uint[] x2 = Nat160.Create();
- SecP160R2Field.Square(x1, x2);
- SecP160R2Field.Multiply(x2, x1, x2);
- uint[] x3 = Nat160.Create();
- SecP160R2Field.Square(x2, x3);
- SecP160R2Field.Multiply(x3, x1, x3);
- uint[] x4 = Nat160.Create();
- SecP160R2Field.Square(x3, x4);
- SecP160R2Field.Multiply(x4, x1, x4);
- uint[] x7 = Nat160.Create();
- SecP160R2Field.SquareN(x4, 3, x7);
- SecP160R2Field.Multiply(x7, x3, x7);
- uint[] x14 = x4;
- SecP160R2Field.SquareN(x7, 7, x14);
- SecP160R2Field.Multiply(x14, x7, x14);
- uint[] x17 = x7;
- SecP160R2Field.SquareN(x14, 3, x17);
- SecP160R2Field.Multiply(x17, x3, x17);
- uint[] x31 = Nat160.Create();
- SecP160R2Field.SquareN(x17, 14, x31);
- SecP160R2Field.Multiply(x31, x14, x31);
- uint[] x62 = x14;
- SecP160R2Field.SquareN(x31, 31, x62);
- SecP160R2Field.Multiply(x62, x31, x62);
- uint[] x124 = x31;
- SecP160R2Field.SquareN(x62, 62, x124);
- SecP160R2Field.Multiply(x124, x62, x124);
- uint[] x127 = x62;
- SecP160R2Field.SquareN(x124, 3, x127);
- SecP160R2Field.Multiply(x127, x3, x127);
-
- uint[] t1 = x127;
- SecP160R2Field.SquareN(t1, 18, t1);
- SecP160R2Field.Multiply(t1, x17, t1);
- SecP160R2Field.SquareN(t1, 2, t1);
- SecP160R2Field.Multiply(t1, x1, t1);
- SecP160R2Field.SquareN(t1, 3, t1);
- SecP160R2Field.Multiply(t1, x2, t1);
- SecP160R2Field.SquareN(t1, 6, t1);
- SecP160R2Field.Multiply(t1, x3, t1);
- SecP160R2Field.SquareN(t1, 2, t1);
- SecP160R2Field.Multiply(t1, x1, t1);
-
- uint[] t2 = x2;
- SecP160R2Field.Square(t1, t2);
-
- return Nat160.Eq(x1, t2) ? new SecP160R2FieldElement(t1) : null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecP160R2FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecP160R2FieldElement);
- }
-
- public virtual bool Equals(SecP160R2FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat160.Eq(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 5);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP160R2Point.cs b/BCCrypto/src/math/ec/custom/sec/SecP160R2Point.cs
deleted file mode 100644
index 343cf8c..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP160R2Point.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP160R2Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.CreatePoint to construct points
- */
- public SecP160R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(bool)}
- */
- public SecP160R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecP160R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecP160R2Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SecP160R2FieldElement X1 = (SecP160R2FieldElement)this.RawXCoord, Y1 = (SecP160R2FieldElement)this.RawYCoord;
- SecP160R2FieldElement X2 = (SecP160R2FieldElement)b.RawXCoord, Y2 = (SecP160R2FieldElement)b.RawYCoord;
-
- SecP160R2FieldElement Z1 = (SecP160R2FieldElement)this.RawZCoords[0];
- SecP160R2FieldElement Z2 = (SecP160R2FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat160.CreateExt();
- uint[] t2 = Nat160.Create();
- uint[] t3 = Nat160.Create();
- uint[] t4 = Nat160.Create();
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SecP160R2Field.Square(Z1.x, S2);
-
- U2 = t2;
- SecP160R2Field.Multiply(S2, X2.x, U2);
-
- SecP160R2Field.Multiply(S2, Z1.x, S2);
- SecP160R2Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SecP160R2Field.Square(Z2.x, S1);
-
- U1 = tt1;
- SecP160R2Field.Multiply(S1, X1.x, U1);
-
- SecP160R2Field.Multiply(S1, Z2.x, S1);
- SecP160R2Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat160.Create();
- SecP160R2Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- SecP160R2Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat160.IsZero(H))
- {
- if (Nat160.IsZero(R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SecP160R2Field.Square(H, HSquared);
-
- uint[] G = Nat160.Create();
- SecP160R2Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SecP160R2Field.Multiply(HSquared, U1, V);
-
- SecP160R2Field.Negate(G, G);
- Nat160.Mul(S1, G, tt1);
-
- c = Nat160.AddBothTo(V, V, G);
- SecP160R2Field.Reduce32(c, G);
-
- SecP160R2FieldElement X3 = new SecP160R2FieldElement(t4);
- SecP160R2Field.Square(R, X3.x);
- SecP160R2Field.Subtract(X3.x, G, X3.x);
-
- SecP160R2FieldElement Y3 = new SecP160R2FieldElement(G);
- SecP160R2Field.Subtract(V, X3.x, Y3.x);
- SecP160R2Field.MultiplyAddToExt(Y3.x, R, tt1);
- SecP160R2Field.Reduce(tt1, Y3.x);
-
- SecP160R2FieldElement Z3 = new SecP160R2FieldElement(H);
- if (!Z1IsOne)
- {
- SecP160R2Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SecP160R2Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[]{ Z3 };
-
- return new SecP160R2Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SecP160R2FieldElement Y1 = (SecP160R2FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SecP160R2FieldElement X1 = (SecP160R2FieldElement)this.RawXCoord, Z1 = (SecP160R2FieldElement)this.RawZCoords[0];
-
- uint c;
- uint[] t1 = Nat160.Create();
- uint[] t2 = Nat160.Create();
-
- uint[] Y1Squared = Nat160.Create();
- SecP160R2Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat160.Create();
- SecP160R2Field.Square(Y1Squared, T);
-
- bool Z1IsOne = Z1.IsOne;
-
- uint[] Z1Squared = Z1.x;
- if (!Z1IsOne)
- {
- Z1Squared = t2;
- SecP160R2Field.Square(Z1.x, Z1Squared);
- }
-
- SecP160R2Field.Subtract(X1.x, Z1Squared, t1);
-
- uint[] M = t2;
- SecP160R2Field.Add(X1.x, Z1Squared, M);
- SecP160R2Field.Multiply(M, t1, M);
- c = Nat160.AddBothTo(M, M, M);
- SecP160R2Field.Reduce32(c, M);
-
- uint[] S = Y1Squared;
- SecP160R2Field.Multiply(Y1Squared, X1.x, S);
- c = Nat.ShiftUpBits(5, S, 2, 0);
- SecP160R2Field.Reduce32(c, S);
-
- c = Nat.ShiftUpBits(5, T, 3, 0, t1);
- SecP160R2Field.Reduce32(c, t1);
-
- SecP160R2FieldElement X3 = new SecP160R2FieldElement(T);
- SecP160R2Field.Square(M, X3.x);
- SecP160R2Field.Subtract(X3.x, S, X3.x);
- SecP160R2Field.Subtract(X3.x, S, X3.x);
-
- SecP160R2FieldElement Y3 = new SecP160R2FieldElement(S);
- SecP160R2Field.Subtract(S, X3.x, Y3.x);
- SecP160R2Field.Multiply(Y3.x, M, Y3.x);
- SecP160R2Field.Subtract(Y3.x, t1, Y3.x);
-
- SecP160R2FieldElement Z3 = new SecP160R2FieldElement(M);
- SecP160R2Field.Twice(Y1.x, Z3.x);
- if (!Z1IsOne)
- {
- SecP160R2Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SecP160R2Point(curve, X3, Y3, new ECFieldElement[]{ Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between TwicePlus and ThreeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SecP160R2Point(Curve, this.RawXCoord, this.RawYCoord.Negate(), this.RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP192K1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecP192K1Curve.cs
deleted file mode 100644
index 81f7719..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP192K1Curve.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP192K1Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37"));
-
- private const int SECP192K1_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SecP192K1Point m_infinity;
-
- public SecP192K1Curve()
- : base(q)
- {
- this.m_infinity = new SecP192K1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.Zero);
- this.m_b = FromBigInteger(BigInteger.ValueOf(3));
- this.m_order = new BigInteger(1, Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D"));
- this.m_cofactor = BigInteger.One;
- this.m_coord = SECP192K1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecP192K1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecP192K1FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecP192K1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecP192K1Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP192K1Field.cs b/BCCrypto/src/math/ec/custom/sec/SecP192K1Field.cs
deleted file mode 100644
index a003603..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP192K1Field.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP192K1Field
- {
- // 2^192 - 2^32 - 2^12 - 2^8 - 2^7 - 2^6 - 2^3 - 1
- internal static readonly uint[] P = new uint[]{ 0xFFFFEE37, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
- internal static readonly uint[] PExt = new uint[]{ 0x013C4FD1, 0x00002392, 0x00000001, 0x00000000, 0x00000000,
- 0x00000000, 0xFFFFDC6E, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
- private static readonly uint[] PExtInv = new uint[]{ 0xFEC3B02F, 0xFFFFDC6D, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF,
- 0xFFFFFFFF, 0x00002391, 0x00000002 };
- private const uint P5 = 0xFFFFFFFF;
- private const uint PExt11 = 0xFFFFFFFF;
- private const uint PInv33 = 0x11C9;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- uint c = Nat192.Add(x, y, z);
- if (c != 0 || (z[5] == P5 && Nat192.Gte(z, P)))
- {
- Nat.Add33To(6, PInv33, z);
- }
- }
-
- public static void AddExt(uint[] xx, uint[] yy, uint[] zz)
- {
- uint c = Nat.Add(12, xx, yy, zz);
- if (c != 0 || (zz[11] == PExt11 && Nat.Gte(12, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(12, zz, PExtInv.Length);
- }
- }
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- uint c = Nat.Inc(6, x, z);
- if (c != 0 || (z[5] == P5 && Nat192.Gte(z, P)))
- {
- Nat.Add33To(6, PInv33, z);
- }
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat192.FromBigInteger(x);
- if (z[5] == P5 && Nat192.Gte(z, P))
- {
- Nat192.SubFrom(P, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- if ((x[0] & 1) == 0)
- {
- Nat.ShiftDownBit(6, x, 0, z);
- }
- else
- {
- uint c = Nat192.Add(x, P, z);
- Nat.ShiftDownBit(6, z, c);
- }
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat192.CreateExt();
- Nat192.Mul(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
- {
- uint c = Nat192.MulAddTo(x, y, zz);
- if (c != 0 || (zz[11] == PExt11 && Nat.Gte(12, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(12, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat192.IsZero(x))
- {
- Nat192.Zero(z);
- }
- else
- {
- Nat192.Sub(P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- ulong cc = Nat192.Mul33Add(PInv33, xx, 6, xx, 0, z, 0);
- uint c = Nat192.Mul33DWordAdd(PInv33, cc, z, 0);
-
- Debug.Assert(c == 0 || c == 1);
-
- if (c != 0 || (z[5] == P5 && Nat192.Gte(z, P)))
- {
- Nat.Add33To(6, PInv33, z);
- }
- }
-
- public static void Reduce32(uint x, uint[] z)
- {
- if ((x != 0 && Nat192.Mul33WordAdd(PInv33, x, z, 0) != 0)
- || (z[5] == P5 && Nat192.Gte(z, P)))
- {
- Nat.Add33To(6, PInv33, z);
- }
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat192.CreateExt();
- Nat192.Square(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
-
- uint[] tt = Nat192.CreateExt();
- Nat192.Square(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- Nat192.Square(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat192.Sub(x, y, z);
- if (c != 0)
- {
- Nat.Sub33From(6, PInv33, z);
- }
- }
-
- public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz)
- {
- int c = Nat.Sub(12, xx, yy, zz);
- if (c != 0)
- {
- if (Nat.SubFrom(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.DecAt(12, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- uint c = Nat.ShiftUpBit(6, x, 0, z);
- if (c != 0 || (z[5] == P5 && Nat192.Gte(z, P)))
- {
- Nat.Add33To(6, PInv33, z);
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP192K1FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecP192K1FieldElement.cs
deleted file mode 100644
index dce3770..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP192K1FieldElement.cs
+++ /dev/null
@@ -1,213 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP192K1FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = SecP192K1Curve.q;
-
- protected internal readonly uint[] x;
-
- public SecP192K1FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for SecP192K1FieldElement", "x");
-
- this.x = SecP192K1Field.FromBigInteger(x);
- }
-
- public SecP192K1FieldElement()
- {
- this.x = Nat192.Create();
- }
-
- protected internal SecP192K1FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat192.IsZero(x); }
- }
-
- public override bool IsOne
- {
- get { return Nat192.IsOne(x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat192.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat192.ToBigInteger(x);
- }
-
- public override string FieldName
- {
- get { return "SecP192K1Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat192.Create();
- SecP192K1Field.Add(x, ((SecP192K1FieldElement)b).x, z);
- return new SecP192K1FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat192.Create();
- SecP192K1Field.AddOne(x, z);
- return new SecP192K1FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat192.Create();
- SecP192K1Field.Subtract(x, ((SecP192K1FieldElement)b).x, z);
- return new SecP192K1FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat192.Create();
- SecP192K1Field.Multiply(x, ((SecP192K1FieldElement)b).x, z);
- return new SecP192K1FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- //return Multiply(b.Invert());
- uint[] z = Nat192.Create();
- Mod.Invert(SecP192K1Field.P, ((SecP192K1FieldElement)b).x, z);
- SecP192K1Field.Multiply(z, x, z);
- return new SecP192K1FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat192.Create();
- SecP192K1Field.Negate(x, z);
- return new SecP192K1FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat192.Create();
- SecP192K1Field.Square(x, z);
- return new SecP192K1FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- //return new SecP192K1FieldElement(ToBigInteger().ModInverse(Q));
- uint[] z = Nat192.Create();
- Mod.Invert(SecP192K1Field.P, x, z);
- return new SecP192K1FieldElement(z);
- }
-
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- /*
- * Raise this element to the exponent 2^190 - 2^30 - 2^10 - 2^6 - 2^5 - 2^4 - 2^1
- *
- * Breaking up the exponent's binary representation into "repunits", we get:
- * { 159 1s } { 1 0s } { 19 1s } { 1 0s } { 3 1s } { 3 0s} { 3 1s } { 1 0s }
- *
- * Therefore we need an addition chain containing 3, 19, 159 (the lengths of the repunits)
- * We use: 1, 2, [3], 6, 8, 16, [19], 35, 70, 140, [159]
- */
-
- uint[] x1 = this.x;
- if (Nat192.IsZero(x1) || Nat192.IsOne(x1))
- return this;
-
- uint[] x2 = Nat192.Create();
- SecP192K1Field.Square(x1, x2);
- SecP192K1Field.Multiply(x2, x1, x2);
- uint[] x3 = Nat192.Create();
- SecP192K1Field.Square(x2, x3);
- SecP192K1Field.Multiply(x3, x1, x3);
- uint[] x6 = Nat192.Create();
- SecP192K1Field.SquareN(x3, 3, x6);
- SecP192K1Field.Multiply(x6, x3, x6);
- uint[] x8 = x6;
- SecP192K1Field.SquareN(x6, 2, x8);
- SecP192K1Field.Multiply(x8, x2, x8);
- uint[] x16 = x2;
- SecP192K1Field.SquareN(x8, 8, x16);
- SecP192K1Field.Multiply(x16, x8, x16);
- uint[] x19 = x8;
- SecP192K1Field.SquareN(x16, 3, x19);
- SecP192K1Field.Multiply(x19, x3, x19);
- uint[] x35 = Nat192.Create();
- SecP192K1Field.SquareN(x19, 16, x35);
- SecP192K1Field.Multiply(x35, x16, x35);
- uint[] x70 = x16;
- SecP192K1Field.SquareN(x35, 35, x70);
- SecP192K1Field.Multiply(x70, x35, x70);
- uint[] x140 = x35;
- SecP192K1Field.SquareN(x70, 70, x140);
- SecP192K1Field.Multiply(x140, x70, x140);
- uint[] x159 = x70;
- SecP192K1Field.SquareN(x140, 19, x159);
- SecP192K1Field.Multiply(x159, x19, x159);
-
- uint[] t1 = x159;
- SecP192K1Field.SquareN(t1, 20, t1);
- SecP192K1Field.Multiply(t1, x19, t1);
- SecP192K1Field.SquareN(t1, 4, t1);
- SecP192K1Field.Multiply(t1, x3, t1);
- SecP192K1Field.SquareN(t1, 6, t1);
- SecP192K1Field.Multiply(t1, x3, t1);
- SecP192K1Field.Square(t1, t1);
-
- uint[] t2 = x3;
- SecP192K1Field.Square(t1, t2);
-
- return Nat192.Eq(x1, t2) ? new SecP192K1FieldElement(t1) : null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecP192K1FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecP192K1FieldElement);
- }
-
- public virtual bool Equals(SecP192K1FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat192.Eq(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 6);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP192K1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecP192K1Point.cs
deleted file mode 100644
index 58eb091..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP192K1Point.cs
+++ /dev/null
@@ -1,267 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP192K1Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecP192K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(bool)}
- */
- public SecP192K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecP192K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs,
- bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecP192K1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SecP192K1FieldElement X1 = (SecP192K1FieldElement)this.RawXCoord, Y1 = (SecP192K1FieldElement)this.RawYCoord;
- SecP192K1FieldElement X2 = (SecP192K1FieldElement)b.RawXCoord, Y2 = (SecP192K1FieldElement)b.RawYCoord;
-
- SecP192K1FieldElement Z1 = (SecP192K1FieldElement)this.RawZCoords[0];
- SecP192K1FieldElement Z2 = (SecP192K1FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat192.CreateExt();
- uint[] t2 = Nat192.Create();
- uint[] t3 = Nat192.Create();
- uint[] t4 = Nat192.Create();
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SecP192K1Field.Square(Z1.x, S2);
-
- U2 = t2;
- SecP192K1Field.Multiply(S2, X2.x, U2);
-
- SecP192K1Field.Multiply(S2, Z1.x, S2);
- SecP192K1Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SecP192K1Field.Square(Z2.x, S1);
-
- U1 = tt1;
- SecP192K1Field.Multiply(S1, X1.x, U1);
-
- SecP192K1Field.Multiply(S1, Z2.x, S1);
- SecP192K1Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat192.Create();
- SecP192K1Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- SecP192K1Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat192.IsZero(H))
- {
- if (Nat192.IsZero(R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SecP192K1Field.Square(H, HSquared);
-
- uint[] G = Nat192.Create();
- SecP192K1Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SecP192K1Field.Multiply(HSquared, U1, V);
-
- SecP192K1Field.Negate(G, G);
- Nat192.Mul(S1, G, tt1);
-
- c = Nat192.AddBothTo(V, V, G);
- SecP192K1Field.Reduce32(c, G);
-
- SecP192K1FieldElement X3 = new SecP192K1FieldElement(t4);
- SecP192K1Field.Square(R, X3.x);
- SecP192K1Field.Subtract(X3.x, G, X3.x);
-
- SecP192K1FieldElement Y3 = new SecP192K1FieldElement(G);
- SecP192K1Field.Subtract(V, X3.x, Y3.x);
- SecP192K1Field.MultiplyAddToExt(Y3.x, R, tt1);
- SecP192K1Field.Reduce(tt1, Y3.x);
-
- SecP192K1FieldElement Z3 = new SecP192K1FieldElement(H);
- if (!Z1IsOne)
- {
- SecP192K1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SecP192K1Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[] { Z3 };
-
- return new SecP192K1Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SecP192K1FieldElement Y1 = (SecP192K1FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SecP192K1FieldElement X1 = (SecP192K1FieldElement)this.RawXCoord, Z1 = (SecP192K1FieldElement)this.RawZCoords[0];
-
- uint c;
-
- uint[] Y1Squared = Nat192.Create();
- SecP192K1Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat192.Create();
- SecP192K1Field.Square(Y1Squared, T);
-
- uint[] M = Nat192.Create();
- SecP192K1Field.Square(X1.x, M);
- c = Nat192.AddBothTo(M, M, M);
- SecP192K1Field.Reduce32(c, M);
-
- uint[] S = Y1Squared;
- SecP192K1Field.Multiply(Y1Squared, X1.x, S);
- c = Nat.ShiftUpBits(6, S, 2, 0);
- SecP192K1Field.Reduce32(c, S);
-
- uint[] t1 = Nat192.Create();
- c = Nat.ShiftUpBits(6, T, 3, 0, t1);
- SecP192K1Field.Reduce32(c, t1);
-
- SecP192K1FieldElement X3 = new SecP192K1FieldElement(T);
- SecP192K1Field.Square(M, X3.x);
- SecP192K1Field.Subtract(X3.x, S, X3.x);
- SecP192K1Field.Subtract(X3.x, S, X3.x);
-
- SecP192K1FieldElement Y3 = new SecP192K1FieldElement(S);
- SecP192K1Field.Subtract(S, X3.x, Y3.x);
- SecP192K1Field.Multiply(Y3.x, M, Y3.x);
- SecP192K1Field.Subtract(Y3.x, t1, Y3.x);
-
- SecP192K1FieldElement Z3 = new SecP192K1FieldElement(M);
- SecP192K1Field.Twice(Y1.x, Z3.x);
- if (!Z1.IsOne)
- {
- SecP192K1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SecP192K1Point(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between TwicePlus and ThreeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SecP192K1Point(Curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP192R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecP192R1Curve.cs
deleted file mode 100644
index cb3a981..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP192R1Curve.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP192R1Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF"));
-
- private const int SecP192R1_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SecP192R1Point m_infinity;
-
- public SecP192R1Curve()
- : base(q)
- {
- this.m_infinity = new SecP192R1Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC")));
- this.m_b = FromBigInteger(new BigInteger(1,
- Hex.Decode("64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1")));
- this.m_order = new BigInteger(1, Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831"));
- this.m_cofactor = BigInteger.One;
-
- this.m_coord = SecP192R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecP192R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecP192R1FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecP192R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecP192R1Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP192R1Field.cs b/BCCrypto/src/math/ec/custom/sec/SecP192R1Field.cs
deleted file mode 100644
index 096c2b5..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP192R1Field.cs
+++ /dev/null
@@ -1,283 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP192R1Field
- {
- // 2^192 - 2^64 - 1
- internal static readonly uint[] P = new uint[]{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
- internal static readonly uint[] PExt = new uint[]{ 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000001,
- 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
- private static readonly uint[] PExtInv = new uint[]{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFE,
- 0xFFFFFFFF, 0x00000001, 0x00000000, 0x00000002 };
- private const uint P5 = 0xFFFFFFFF;
- private const uint PExt11 = 0xFFFFFFFF;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- uint c = Nat192.Add(x, y, z);
- if (c != 0 || (z[5] == P5 && Nat192.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void AddExt(uint[] xx, uint[] yy, uint[] zz)
- {
- uint c = Nat.Add(12, xx, yy, zz);
- if (c != 0 || (zz[11] == PExt11 && Nat.Gte(12, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(12, zz, PExtInv.Length);
- }
- }
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- uint c = Nat.Inc(6, x, z);
- if (c != 0 || (z[5] == P5 && Nat192.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat192.FromBigInteger(x);
- if (z[5] == P5 && Nat192.Gte(z, P))
- {
- Nat192.SubFrom(P, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- if ((x[0] & 1) == 0)
- {
- Nat.ShiftDownBit(6, x, 0, z);
- }
- else
- {
- uint c = Nat192.Add(x, P, z);
- Nat.ShiftDownBit(6, z, c);
- }
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat192.CreateExt();
- Nat192.Mul(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
- {
- uint c = Nat192.MulAddTo(x, y, zz);
- if (c != 0 || (zz[11] == PExt11 && Nat.Gte(12, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(12, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat192.IsZero(x))
- {
- Nat192.Zero(z);
- }
- else
- {
- Nat192.Sub(P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- ulong xx06 = xx[6], xx07 = xx[7], xx08 = xx[8];
- ulong xx09 = xx[9], xx10 = xx[10], xx11 = xx[11];
-
- ulong t0 = xx06 + xx10;
- ulong t1 = xx07 + xx11;
-
- ulong cc = 0;
- cc += (ulong)xx[0] + t0;
- uint z0 = (uint)cc;
- cc >>= 32;
- cc += (ulong)xx[1] + t1;
- z[1] = (uint)cc;
- cc >>= 32;
-
- t0 += xx08;
- t1 += xx09;
-
- cc += (ulong)xx[2] + t0;
- ulong z2 = (uint)cc;
- cc >>= 32;
- cc += (ulong)xx[3] + t1;
- z[3] = (uint)cc;
- cc >>= 32;
-
- t0 -= xx06;
- t1 -= xx07;
-
- cc += (ulong)xx[4] + t0;
- z[4] = (uint)cc;
- cc >>= 32;
- cc += (ulong)xx[5] + t1;
- z[5] = (uint)cc;
- cc >>= 32;
-
- z2 += cc;
-
- cc += z0;
- z[0] = (uint)cc;
- cc >>= 32;
- if (cc != 0)
- {
- cc += z[1];
- z[1] = (uint)cc;
- z2 += cc >> 32;
- }
- z[2] = (uint)z2;
- cc = z2 >> 32;
-
- Debug.Assert(cc == 0 || cc == 1);
-
- if ((cc != 0 && Nat.IncAt(6, z, 3) != 0)
- || (z[5] == P5 && Nat192.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void Reduce32(uint x, uint[] z)
- {
- ulong cc = 0;
-
- if (x != 0)
- {
- cc += (ulong)z[0] + x;
- z[0] = (uint)cc;
- cc >>= 32;
- if (cc != 0)
- {
- cc += (ulong)z[1];
- z[1] = (uint)cc;
- cc >>= 32;
- }
- cc += (ulong)z[2] + x;
- z[2] = (uint)cc;
- cc >>= 32;
-
- Debug.Assert(cc == 0 || cc == 1);
- }
-
- if ((cc != 0 && Nat.IncAt(6, z, 3) != 0)
- || (z[5] == P5 && Nat192.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat192.CreateExt();
- Nat192.Square(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
-
- uint[] tt = Nat192.CreateExt();
- Nat192.Square(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- Nat192.Square(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat192.Sub(x, y, z);
- if (c != 0)
- {
- SubPInvFrom(z);
- }
- }
-
- public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz)
- {
- int c = Nat.Sub(12, xx, yy, zz);
- if (c != 0)
- {
- if (Nat.SubFrom(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.DecAt(12, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- uint c = Nat.ShiftUpBit(6, x, 0, z);
- if (c != 0 || (z[5] == P5 && Nat192.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- private static void AddPInvTo(uint[] z)
- {
- long c = (long)z[0] + 1;
- z[0] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[1];
- z[1] = (uint)c;
- c >>= 32;
- }
- c += (long)z[2] + 1;
- z[2] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- Nat.IncAt(6, z, 3);
- }
- }
-
- private static void SubPInvFrom(uint[] z)
- {
- long c = (long)z[0] - 1;
- z[0] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[1];
- z[1] = (uint)c;
- c >>= 32;
- }
- c += (long)z[2] - 1;
- z[2] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- Nat.DecAt(6, z, 3);
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP192R1FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecP192R1FieldElement.cs
deleted file mode 100644
index 45bcb00..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP192R1FieldElement.cs
+++ /dev/null
@@ -1,188 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP192R1FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = SecP192R1Curve.q;
-
- protected internal readonly uint[] x;
-
- public SecP192R1FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for SecP192R1FieldElement", "x");
-
- this.x = SecP192R1Field.FromBigInteger(x);
- }
-
- public SecP192R1FieldElement()
- {
- this.x = Nat192.Create();
- }
-
- protected internal SecP192R1FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat192.IsZero(x); }
- }
-
- public override bool IsOne
- {
- get { return Nat192.IsOne(x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat192.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat192.ToBigInteger(x);
- }
-
- public override string FieldName
- {
- get { return "SecP192R1Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat192.Create();
- SecP192R1Field.Add(x, ((SecP192R1FieldElement)b).x, z);
- return new SecP192R1FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat192.Create();
- SecP192R1Field.AddOne(x, z);
- return new SecP192R1FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat192.Create();
- SecP192R1Field.Subtract(x, ((SecP192R1FieldElement)b).x, z);
- return new SecP192R1FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat192.Create();
- SecP192R1Field.Multiply(x, ((SecP192R1FieldElement)b).x, z);
- return new SecP192R1FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- //return Multiply(b.Invert());
- uint[] z = Nat192.Create();
- Mod.Invert(SecP192R1Field.P, ((SecP192R1FieldElement)b).x, z);
- SecP192R1Field.Multiply(z, x, z);
- return new SecP192R1FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat192.Create();
- SecP192R1Field.Negate(x, z);
- return new SecP192R1FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat192.Create();
- SecP192R1Field.Square(x, z);
- return new SecP192R1FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- //return new SecP192R1FieldElement(ToBigInteger().ModInverse(Q));
- uint[] z = Nat192.Create();
- Mod.Invert(SecP192R1Field.P, x, z);
- return new SecP192R1FieldElement(z);
- }
-
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- // Raise this element to the exponent 2^190 - 2^62
-
- uint[] x1 = this.x;
- if (Nat192.IsZero(x1) || Nat192.IsOne(x1))
- return this;
-
- uint[] t1 = Nat192.Create();
- uint[] t2 = Nat192.Create();
-
- SecP192R1Field.Square(x1, t1);
- SecP192R1Field.Multiply(t1, x1, t1);
-
- SecP192R1Field.SquareN(t1, 2, t2);
- SecP192R1Field.Multiply(t2, t1, t2);
-
- SecP192R1Field.SquareN(t2, 4, t1);
- SecP192R1Field.Multiply(t1, t2, t1);
-
- SecP192R1Field.SquareN(t1, 8, t2);
- SecP192R1Field.Multiply(t2, t1, t2);
-
- SecP192R1Field.SquareN(t2, 16, t1);
- SecP192R1Field.Multiply(t1, t2, t1);
-
- SecP192R1Field.SquareN(t1, 32, t2);
- SecP192R1Field.Multiply(t2, t1, t2);
-
- SecP192R1Field.SquareN(t2, 64, t1);
- SecP192R1Field.Multiply(t1, t2, t1);
-
- SecP192R1Field.SquareN(t1, 62, t1);
- SecP192R1Field.Square(t1, t2);
-
- return Nat192.Eq(x1, t2) ? new SecP192R1FieldElement(t1) : null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecP192R1FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecP192R1FieldElement);
- }
-
- public virtual bool Equals(SecP192R1FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat192.Eq(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 6);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP192R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecP192R1Point.cs
deleted file mode 100644
index 3b53e34..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP192R1Point.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP192R1Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecP192R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(bool)}
- */
- public SecP192R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecP192R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecP192R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SecP192R1FieldElement X1 = (SecP192R1FieldElement)this.RawXCoord, Y1 = (SecP192R1FieldElement)this.RawYCoord;
- SecP192R1FieldElement X2 = (SecP192R1FieldElement)b.RawXCoord, Y2 = (SecP192R1FieldElement)b.RawYCoord;
-
- SecP192R1FieldElement Z1 = (SecP192R1FieldElement)this.RawZCoords[0];
- SecP192R1FieldElement Z2 = (SecP192R1FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat192.CreateExt();
- uint[] t2 = Nat192.Create();
- uint[] t3 = Nat192.Create();
- uint[] t4 = Nat192.Create();
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SecP192R1Field.Square(Z1.x, S2);
-
- U2 = t2;
- SecP192R1Field.Multiply(S2, X2.x, U2);
-
- SecP192R1Field.Multiply(S2, Z1.x, S2);
- SecP192R1Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SecP192R1Field.Square(Z2.x, S1);
-
- U1 = tt1;
- SecP192R1Field.Multiply(S1, X1.x, U1);
-
- SecP192R1Field.Multiply(S1, Z2.x, S1);
- SecP192R1Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat192.Create();
- SecP192R1Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- SecP192R1Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat192.IsZero(H))
- {
- if (Nat192.IsZero(R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SecP192R1Field.Square(H, HSquared);
-
- uint[] G = Nat192.Create();
- SecP192R1Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SecP192R1Field.Multiply(HSquared, U1, V);
-
- SecP192R1Field.Negate(G, G);
- Nat192.Mul(S1, G, tt1);
-
- c = Nat192.AddBothTo(V, V, G);
- SecP192R1Field.Reduce32(c, G);
-
- SecP192R1FieldElement X3 = new SecP192R1FieldElement(t4);
- SecP192R1Field.Square(R, X3.x);
- SecP192R1Field.Subtract(X3.x, G, X3.x);
-
- SecP192R1FieldElement Y3 = new SecP192R1FieldElement(G);
- SecP192R1Field.Subtract(V, X3.x, Y3.x);
- SecP192R1Field.MultiplyAddToExt(Y3.x, R, tt1);
- SecP192R1Field.Reduce(tt1, Y3.x);
-
- SecP192R1FieldElement Z3 = new SecP192R1FieldElement(H);
- if (!Z1IsOne)
- {
- SecP192R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SecP192R1Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[] { Z3 };
-
- return new SecP192R1Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SecP192R1FieldElement Y1 = (SecP192R1FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SecP192R1FieldElement X1 = (SecP192R1FieldElement)this.RawXCoord, Z1 = (SecP192R1FieldElement)this.RawZCoords[0];
-
- uint c;
- uint[] t1 = Nat192.Create();
- uint[] t2 = Nat192.Create();
-
- uint[] Y1Squared = Nat192.Create();
- SecP192R1Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat192.Create();
- SecP192R1Field.Square(Y1Squared, T);
-
- bool Z1IsOne = Z1.IsOne;
-
- uint[] Z1Squared = Z1.x;
- if (!Z1IsOne)
- {
- Z1Squared = t2;
- SecP192R1Field.Square(Z1.x, Z1Squared);
- }
-
- SecP192R1Field.Subtract(X1.x, Z1Squared, t1);
-
- uint[] M = t2;
- SecP192R1Field.Add(X1.x, Z1Squared, M);
- SecP192R1Field.Multiply(M, t1, M);
- c = Nat192.AddBothTo(M, M, M);
- SecP192R1Field.Reduce32(c, M);
-
- uint[] S = Y1Squared;
- SecP192R1Field.Multiply(Y1Squared, X1.x, S);
- c = Nat.ShiftUpBits(6, S, 2, 0);
- SecP192R1Field.Reduce32(c, S);
-
- c = Nat.ShiftUpBits(6, T, 3, 0, t1);
- SecP192R1Field.Reduce32(c, t1);
-
- SecP192R1FieldElement X3 = new SecP192R1FieldElement(T);
- SecP192R1Field.Square(M, X3.x);
- SecP192R1Field.Subtract(X3.x, S, X3.x);
- SecP192R1Field.Subtract(X3.x, S, X3.x);
-
- SecP192R1FieldElement Y3 = new SecP192R1FieldElement(S);
- SecP192R1Field.Subtract(S, X3.x, Y3.x);
- SecP192R1Field.Multiply(Y3.x, M, Y3.x);
- SecP192R1Field.Subtract(Y3.x, t1, Y3.x);
-
- SecP192R1FieldElement Z3 = new SecP192R1FieldElement(M);
- SecP192R1Field.Twice(Y1.x, Z3.x);
- if (!Z1IsOne)
- {
- SecP192R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SecP192R1Point(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between TwicePlus and ThreeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SecP192R1Point(Curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP224K1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecP224K1Curve.cs
deleted file mode 100644
index d4be7d8..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP224K1Curve.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP224K1Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D"));
-
- private const int SECP224K1_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SecP224K1Point m_infinity;
-
- public SecP224K1Curve()
- : base(q)
- {
- this.m_infinity = new SecP224K1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.Zero);
- this.m_b = FromBigInteger(BigInteger.ValueOf(5));
- this.m_order = new BigInteger(1, Hex.Decode("010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7"));
- this.m_cofactor = BigInteger.One;
- this.m_coord = SECP224K1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecP224K1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecP224K1FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecP224K1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecP224K1Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP224K1Field.cs b/BCCrypto/src/math/ec/custom/sec/SecP224K1Field.cs
deleted file mode 100644
index 98cf777..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP224K1Field.cs
+++ /dev/null
@@ -1,179 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP224K1Field
- {
- // 2^224 - 2^32 - 2^12 - 2^11 - 2^9 - 2^7 - 2^4 - 2 - 1
- internal static readonly uint[] P = new uint[]{ 0xFFFFE56D, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
- 0xFFFFFFFF };
- internal static readonly uint[] PExt = new uint[]{ 0x02C23069, 0x00003526, 0x00000001, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0xFFFFCADA, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
- private static readonly uint[] PExtInv = new uint[]{ 0xFD3DCF97, 0xFFFFCAD9, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF,
- 0xFFFFFFFF, 0xFFFFFFFF, 0x00003525, 0x00000002 };
- private const uint P6 = 0xFFFFFFFF;
- private const uint PExt13 = 0xFFFFFFFF;
- private const uint PInv33 = 0x1A93;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- uint c = Nat224.Add(x, y, z);
- if (c != 0 || (z[6] == P6 && Nat224.Gte(z, P)))
- {
- Nat.Add33To(7, PInv33, z);
- }
- }
-
- public static void AddExt(uint[] xx, uint[] yy, uint[] zz)
- {
- uint c = Nat.Add(14, xx, yy, zz);
- if (c != 0 || (zz[13] == PExt13 && Nat.Gte(14, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(14, zz, PExtInv.Length);
- }
- }
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- uint c = Nat.Inc(7, x, z);
- if (c != 0 || (z[6] == P6 && Nat224.Gte(z, P)))
- {
- Nat.Add33To(7, PInv33, z);
- }
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat224.FromBigInteger(x);
- if (z[6] == P6 && Nat224.Gte(z, P))
- {
- Nat224.SubFrom(P, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- if ((x[0] & 1) == 0)
- {
- Nat.ShiftDownBit(7, x, 0, z);
- }
- else
- {
- uint c = Nat224.Add(x, P, z);
- Nat.ShiftDownBit(7, z, c);
- }
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat224.CreateExt();
- Nat224.Mul(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
- {
- uint c = Nat224.MulAddTo(x, y, zz);
- if (c != 0 || (zz[13] == PExt13 && Nat.Gte(14, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(14, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat224.IsZero(x))
- {
- Nat224.Zero(z);
- }
- else
- {
- Nat224.Sub(P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- ulong cc = Nat224.Mul33Add(PInv33, xx, 7, xx, 0, z, 0);
- uint c = Nat224.Mul33DWordAdd(PInv33, cc, z, 0);
-
- Debug.Assert(c == 0 || c == 1);
-
- if (c != 0 || (z[6] == P6 && Nat224.Gte(z, P)))
- {
- Nat.Add33To(7, PInv33, z);
- }
- }
-
- public static void Reduce32(uint x, uint[] z)
- {
- if ((x != 0 && Nat224.Mul33WordAdd(PInv33, x, z, 0) != 0)
- || (z[6] == P6 && Nat224.Gte(z, P)))
- {
- Nat.Add33To(7, PInv33, z);
- }
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat224.CreateExt();
- Nat224.Square(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
-
- uint[] tt = Nat224.CreateExt();
- Nat224.Square(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- Nat224.Square(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat224.Sub(x, y, z);
- if (c != 0)
- {
- Nat.Sub33From(7, PInv33, z);
- }
- }
-
- public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz)
- {
- int c = Nat.Sub(14, xx, yy, zz);
- if (c != 0)
- {
- if (Nat.SubFrom(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.DecAt(14, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- uint c = Nat.ShiftUpBit(7, x, 0, z);
- if (c != 0 || (z[6] == P6 && Nat224.Gte(z, P)))
- {
- Nat.Add33To(7, PInv33, z);
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP224K1FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecP224K1FieldElement.cs
deleted file mode 100644
index fec0743..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP224K1FieldElement.cs
+++ /dev/null
@@ -1,242 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP224K1FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = SecP224K1Curve.q;
-
- // Calculated as BigInteger.Two.ModPow(Q.ShiftRight(2), Q)
- private static readonly uint[] PRECOMP_POW2 = new uint[]{ 0x33bfd202, 0xdcfad133, 0x2287624a, 0xc3811ba8,
- 0xa85558fc, 0x1eaef5d7, 0x8edf154c };
-
- protected internal readonly uint[] x;
-
- public SecP224K1FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for SecP224K1FieldElement", "x");
-
- this.x = SecP224K1Field.FromBigInteger(x);
- }
-
- public SecP224K1FieldElement()
- {
- this.x = Nat224.Create();
- }
-
- protected internal SecP224K1FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat224.IsZero(x); }
- }
-
- public override bool IsOne
- {
- get { return Nat224.IsOne(x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat224.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat224.ToBigInteger(x);
- }
-
- public override string FieldName
- {
- get { return "SecP224K1Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat224.Create();
- SecP224K1Field.Add(x, ((SecP224K1FieldElement)b).x, z);
- return new SecP224K1FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat224.Create();
- SecP224K1Field.AddOne(x, z);
- return new SecP224K1FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat224.Create();
- SecP224K1Field.Subtract(x, ((SecP224K1FieldElement)b).x, z);
- return new SecP224K1FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat224.Create();
- SecP224K1Field.Multiply(x, ((SecP224K1FieldElement)b).x, z);
- return new SecP224K1FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- //return Multiply(b.Invert());
- uint[] z = Nat224.Create();
- Mod.Invert(SecP224K1Field.P, ((SecP224K1FieldElement)b).x, z);
- SecP224K1Field.Multiply(z, x, z);
- return new SecP224K1FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat224.Create();
- SecP224K1Field.Negate(x, z);
- return new SecP224K1FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat224.Create();
- SecP224K1Field.Square(x, z);
- return new SecP224K1FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- //return new SecP224K1FieldElement(ToBigInteger().ModInverse(Q));
- uint[] z = Nat224.Create();
- Mod.Invert(SecP224K1Field.P, x, z);
- return new SecP224K1FieldElement(z);
- }
-
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- /*
- * Q == 8m + 5, so we use Pocklington's method for this case.
- *
- * First, raise this element to the exponent 2^221 - 2^29 - 2^9 - 2^8 - 2^6 - 2^4 - 2^1 (i.e. m + 1)
- *
- * Breaking up the exponent's binary representation into "repunits", we get:
- * { 191 1s } { 1 0s } { 19 1s } { 2 0s } { 1 1s } { 1 0s} { 1 1s } { 1 0s} { 3 1s } { 1 0s}
- *
- * Therefore we need an addition chain containing 1, 3, 19, 191 (the lengths of the repunits)
- * We use: [1], 2, [3], 4, 8, 11, [19], 23, 42, 84, 107, [191]
- */
-
- uint[] x1 = this.x;
- if (Nat224.IsZero(x1) || Nat224.IsOne(x1))
- return this;
-
- uint[] x2 = Nat224.Create();
- SecP224K1Field.Square(x1, x2);
- SecP224K1Field.Multiply(x2, x1, x2);
- uint[] x3 = x2;
- SecP224K1Field.Square(x2, x3);
- SecP224K1Field.Multiply(x3, x1, x3);
- uint[] x4 = Nat224.Create();
- SecP224K1Field.Square(x3, x4);
- SecP224K1Field.Multiply(x4, x1, x4);
- uint[] x8 = Nat224.Create();
- SecP224K1Field.SquareN(x4, 4, x8);
- SecP224K1Field.Multiply(x8, x4, x8);
- uint[] x11 = Nat224.Create();
- SecP224K1Field.SquareN(x8, 3, x11);
- SecP224K1Field.Multiply(x11, x3, x11);
- uint[] x19 = x11;
- SecP224K1Field.SquareN(x11, 8, x19);
- SecP224K1Field.Multiply(x19, x8, x19);
- uint[] x23 = x8;
- SecP224K1Field.SquareN(x19, 4, x23);
- SecP224K1Field.Multiply(x23, x4, x23);
- uint[] x42 = x4;
- SecP224K1Field.SquareN(x23, 19, x42);
- SecP224K1Field.Multiply(x42, x19, x42);
- uint[] x84 = Nat224.Create();
- SecP224K1Field.SquareN(x42, 42, x84);
- SecP224K1Field.Multiply(x84, x42, x84);
- uint[] x107 = x42;
- SecP224K1Field.SquareN(x84, 23, x107);
- SecP224K1Field.Multiply(x107, x23, x107);
- uint[] x191 = x23;
- SecP224K1Field.SquareN(x107, 84, x191);
- SecP224K1Field.Multiply(x191, x84, x191);
-
- uint[] t1 = x191;
- SecP224K1Field.SquareN(t1, 20, t1);
- SecP224K1Field.Multiply(t1, x19, t1);
- SecP224K1Field.SquareN(t1, 3, t1);
- SecP224K1Field.Multiply(t1, x1, t1);
- SecP224K1Field.SquareN(t1, 2, t1);
- SecP224K1Field.Multiply(t1, x1, t1);
- SecP224K1Field.SquareN(t1, 4, t1);
- SecP224K1Field.Multiply(t1, x3, t1);
- SecP224K1Field.Square(t1, t1);
-
- uint[] t2 = x84;
- SecP224K1Field.Square(t1, t2);
-
- if (Nat224.Eq(x1, t2))
- {
- return new SecP224K1FieldElement(t1);
- }
-
- /*
- * If the first guess is incorrect, we multiply by a precomputed power of 2 to get the second guess,
- * which is ((4x)^(m + 1))/2 mod Q
- */
- SecP224K1Field.Multiply(t1, PRECOMP_POW2, t1);
-
- SecP224K1Field.Square(t1, t2);
-
- if (Nat224.Eq(x1, t2))
- {
- return new SecP224K1FieldElement(t1);
- }
-
- return null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecP224K1FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecP224K1FieldElement);
- }
-
- public virtual bool Equals(SecP224K1FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat224.Eq(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 7);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP224K1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecP224K1Point.cs
deleted file mode 100644
index 98cb292..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP224K1Point.cs
+++ /dev/null
@@ -1,267 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP224K1Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecP224K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(bool)}
- */
- public SecP224K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecP224K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs,
- bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecP224K1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SecP224K1FieldElement X1 = (SecP224K1FieldElement)this.RawXCoord, Y1 = (SecP224K1FieldElement)this.RawYCoord;
- SecP224K1FieldElement X2 = (SecP224K1FieldElement)b.RawXCoord, Y2 = (SecP224K1FieldElement)b.RawYCoord;
-
- SecP224K1FieldElement Z1 = (SecP224K1FieldElement)this.RawZCoords[0];
- SecP224K1FieldElement Z2 = (SecP224K1FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat224.CreateExt();
- uint[] t2 = Nat224.Create();
- uint[] t3 = Nat224.Create();
- uint[] t4 = Nat224.Create();
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SecP224K1Field.Square(Z1.x, S2);
-
- U2 = t2;
- SecP224K1Field.Multiply(S2, X2.x, U2);
-
- SecP224K1Field.Multiply(S2, Z1.x, S2);
- SecP224K1Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SecP224K1Field.Square(Z2.x, S1);
-
- U1 = tt1;
- SecP224K1Field.Multiply(S1, X1.x, U1);
-
- SecP224K1Field.Multiply(S1, Z2.x, S1);
- SecP224K1Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat224.Create();
- SecP224K1Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- SecP224K1Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat224.IsZero(H))
- {
- if (Nat224.IsZero(R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SecP224K1Field.Square(H, HSquared);
-
- uint[] G = Nat224.Create();
- SecP224K1Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SecP224K1Field.Multiply(HSquared, U1, V);
-
- SecP224K1Field.Negate(G, G);
- Nat224.Mul(S1, G, tt1);
-
- c = Nat224.AddBothTo(V, V, G);
- SecP224K1Field.Reduce32(c, G);
-
- SecP224K1FieldElement X3 = new SecP224K1FieldElement(t4);
- SecP224K1Field.Square(R, X3.x);
- SecP224K1Field.Subtract(X3.x, G, X3.x);
-
- SecP224K1FieldElement Y3 = new SecP224K1FieldElement(G);
- SecP224K1Field.Subtract(V, X3.x, Y3.x);
- SecP224K1Field.MultiplyAddToExt(Y3.x, R, tt1);
- SecP224K1Field.Reduce(tt1, Y3.x);
-
- SecP224K1FieldElement Z3 = new SecP224K1FieldElement(H);
- if (!Z1IsOne)
- {
- SecP224K1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SecP224K1Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[] { Z3 };
-
- return new SecP224K1Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SecP224K1FieldElement Y1 = (SecP224K1FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SecP224K1FieldElement X1 = (SecP224K1FieldElement)this.RawXCoord, Z1 = (SecP224K1FieldElement)this.RawZCoords[0];
-
- uint c;
-
- uint[] Y1Squared = Nat224.Create();
- SecP224K1Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat224.Create();
- SecP224K1Field.Square(Y1Squared, T);
-
- uint[] M = Nat224.Create();
- SecP224K1Field.Square(X1.x, M);
- c = Nat224.AddBothTo(M, M, M);
- SecP224K1Field.Reduce32(c, M);
-
- uint[] S = Y1Squared;
- SecP224K1Field.Multiply(Y1Squared, X1.x, S);
- c = Nat.ShiftUpBits(7, S, 2, 0);
- SecP224K1Field.Reduce32(c, S);
-
- uint[] t1 = Nat224.Create();
- c = Nat.ShiftUpBits(7, T, 3, 0, t1);
- SecP224K1Field.Reduce32(c, t1);
-
- SecP224K1FieldElement X3 = new SecP224K1FieldElement(T);
- SecP224K1Field.Square(M, X3.x);
- SecP224K1Field.Subtract(X3.x, S, X3.x);
- SecP224K1Field.Subtract(X3.x, S, X3.x);
-
- SecP224K1FieldElement Y3 = new SecP224K1FieldElement(S);
- SecP224K1Field.Subtract(S, X3.x, Y3.x);
- SecP224K1Field.Multiply(Y3.x, M, Y3.x);
- SecP224K1Field.Subtract(Y3.x, t1, Y3.x);
-
- SecP224K1FieldElement Z3 = new SecP224K1FieldElement(M);
- SecP224K1Field.Twice(Y1.x, Z3.x);
- if (!Z1.IsOne)
- {
- SecP224K1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SecP224K1Point(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between TwicePlus and ThreeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SecP224K1Point(Curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP224R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecP224R1Curve.cs
deleted file mode 100644
index cda8781..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP224R1Curve.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP224R1Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001"));
-
- private const int SecP224R1_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SecP224R1Point m_infinity;
-
- public SecP224R1Curve()
- : base(q)
- {
- this.m_infinity = new SecP224R1Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE")));
- this.m_b = FromBigInteger(new BigInteger(1,
- Hex.Decode("B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4")));
- this.m_order = new BigInteger(1, Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D"));
- this.m_cofactor = BigInteger.One;
-
- this.m_coord = SecP224R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecP224R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecP224R1FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecP224R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecP224R1Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP224R1Field.cs b/BCCrypto/src/math/ec/custom/sec/SecP224R1Field.cs
deleted file mode 100644
index 4f5c3bb..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP224R1Field.cs
+++ /dev/null
@@ -1,297 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP224R1Field
- {
- // 2^224 - 2^96 + 1
- internal static readonly uint[] P = new uint[] { 0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
- internal static readonly uint[] PExt = new uint[]{ 0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF,
- 0xFFFFFFFF, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
- private static readonly uint[] PExtInv = new uint[]{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000001, 0x00000000,
- 0x00000000, 0xFFFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000001 };
- private const uint P6 = 0xFFFFFFFF;
- private const uint PExt13 = 0xFFFFFFFF;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- uint c = Nat224.Add(x, y, z);
- if (c != 0 || (z[6] == P6 && Nat224.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void AddExt(uint[] xx, uint[] yy, uint[] zz)
- {
- uint c = Nat.Add(14, xx, yy, zz);
- if (c != 0 || (zz[13] == PExt13 && Nat.Gte(14, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(14, zz, PExtInv.Length);
- }
- }
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- uint c = Nat.Inc(7, x, z);
- if (c != 0 || (z[6] == P6 && Nat224.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat224.FromBigInteger(x);
- if (z[6] == P6 && Nat224.Gte(z, P))
- {
- Nat224.SubFrom(P, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- if ((x[0] & 1) == 0)
- {
- Nat.ShiftDownBit(7, x, 0, z);
- }
- else
- {
- uint c = Nat224.Add(x, P, z);
- Nat.ShiftDownBit(7, z, c);
- }
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat224.CreateExt();
- Nat224.Mul(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
- {
- uint c = Nat224.MulAddTo(x, y, zz);
- if (c != 0 || (zz[13] == PExt13 && Nat.Gte(14, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(14, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat224.IsZero(x))
- {
- Nat224.Zero(z);
- }
- else
- {
- Nat224.Sub(P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- long xx10 = xx[10], xx11 = xx[11], xx12 = xx[12], xx13 = xx[13];
-
- const long n = 1;
-
- long t0 = (long)xx[7] + xx11 - n;
- long t1 = (long)xx[8] + xx12;
- long t2 = (long)xx[9] + xx13;
-
- long cc = 0;
- cc += (long)xx[0] - t0;
- long z0 = (uint)cc;
- cc >>= 32;
- cc += (long)xx[1] - t1;
- z[1] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[2] - t2;
- z[2] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[3] + t0 - xx10;
- long z3 = (uint)cc;
- cc >>= 32;
- cc += (long)xx[4] + t1 - xx11;
- z[4] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[5] + t2 - xx12;
- z[5] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[6] + xx10 - xx13;
- z[6] = (uint)cc;
- cc >>= 32;
- cc += n;
-
- Debug.Assert(cc >= 0);
-
- z3 += cc;
-
- z0 -= cc;
- z[0] = (uint)z0;
- cc = z0 >> 32;
- if (cc != 0)
- {
- cc += (long)z[1];
- z[1] = (uint)cc;
- cc >>= 32;
- cc += (long)z[2];
- z[2] = (uint)cc;
- z3 += cc >> 32;
- }
- z[3] = (uint)z3;
- cc = z3 >> 32;
-
- Debug.Assert(cc == 0 || cc == 1);
-
- if ((cc != 0 && Nat.IncAt(7, z, 4) != 0)
- || (z[6] == P6 && Nat224.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void Reduce32(uint x, uint[] z)
- {
- long cc = 0;
-
- if (x != 0)
- {
- long xx07 = x;
-
- cc += (long)z[0] - xx07;
- z[0] = (uint)cc;
- cc >>= 32;
- if (cc != 0)
- {
- cc += (long)z[1];
- z[1] = (uint)cc;
- cc >>= 32;
- cc += (long)z[2];
- z[2] = (uint)cc;
- cc >>= 32;
- }
- cc += (long)z[3] + xx07;
- z[3] = (uint)cc;
- cc >>= 32;
-
- Debug.Assert(cc == 0 || cc == 1);
- }
-
- if ((cc != 0 && Nat.IncAt(7, z, 4) != 0)
- || (z[6] == P6 && Nat224.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat224.CreateExt();
- Nat224.Square(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
-
- uint[] tt = Nat224.CreateExt();
- Nat224.Square(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- Nat224.Square(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat224.Sub(x, y, z);
- if (c != 0)
- {
- SubPInvFrom(z);
- }
- }
-
- public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz)
- {
- int c = Nat.Sub(14, xx, yy, zz);
- if (c != 0)
- {
- if (Nat.SubFrom(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.DecAt(14, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- uint c = Nat.ShiftUpBit(7, x, 0, z);
- if (c != 0 || (z[6] == P6 && Nat224.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- private static void AddPInvTo(uint[] z)
- {
- long c = (long)z[0] - 1;
- z[0] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2];
- z[2] = (uint)c;
- c >>= 32;
- }
- c += (long)z[3] + 1;
- z[3] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- Nat.IncAt(7, z, 4);
- }
- }
-
- private static void SubPInvFrom(uint[] z)
- {
- long c = (long)z[0] + 1;
- z[0] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2];
- z[2] = (uint)c;
- c >>= 32;
- }
- c += (long)z[3] - 1;
- z[3] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- Nat.DecAt(7, z, 4);
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP224R1FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecP224R1FieldElement.cs
deleted file mode 100644
index 2b9a065..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP224R1FieldElement.cs
+++ /dev/null
@@ -1,269 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP224R1FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = SecP224R1Curve.q;
-
- protected internal readonly uint[] x;
-
- public SecP224R1FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for SecP224R1FieldElement", "x");
-
- this.x = SecP224R1Field.FromBigInteger(x);
- }
-
- public SecP224R1FieldElement()
- {
- this.x = Nat224.Create();
- }
-
- protected internal SecP224R1FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat224.IsZero(x); }
- }
-
- public override bool IsOne
- {
- get { return Nat224.IsOne(x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat224.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat224.ToBigInteger(x);
- }
-
- public override string FieldName
- {
- get { return "SecP224R1Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat224.Create();
- SecP224R1Field.Add(x, ((SecP224R1FieldElement)b).x, z);
- return new SecP224R1FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat224.Create();
- SecP224R1Field.AddOne(x, z);
- return new SecP224R1FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat224.Create();
- SecP224R1Field.Subtract(x, ((SecP224R1FieldElement)b).x, z);
- return new SecP224R1FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat224.Create();
- SecP224R1Field.Multiply(x, ((SecP224R1FieldElement)b).x, z);
- return new SecP224R1FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- //return Multiply(b.Invert());
- uint[] z = Nat224.Create();
- Mod.Invert(SecP224R1Field.P, ((SecP224R1FieldElement)b).x, z);
- SecP224R1Field.Multiply(z, x, z);
- return new SecP224R1FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat224.Create();
- SecP224R1Field.Negate(x, z);
- return new SecP224R1FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat224.Create();
- SecP224R1Field.Square(x, z);
- return new SecP224R1FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- //return new SecP224R1FieldElement(ToBigInteger().ModInverse(Q));
- uint[] z = Nat224.Create();
- Mod.Invert(SecP224R1Field.P, x, z);
- return new SecP224R1FieldElement(z);
- }
-
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- uint[] c = this.x;
- if (Nat224.IsZero(c) || Nat224.IsOne(c))
- return this;
-
- uint[] nc = Nat224.Create();
- SecP224R1Field.Negate(c, nc);
-
- uint[] r = Mod.Random(SecP224R1Field.P);
- uint[] t = Nat224.Create();
-
- if (!IsSquare(c))
- return null;
-
- while (!TrySqrt(nc, r, t))
- {
- SecP224R1Field.AddOne(r, r);
- }
-
- SecP224R1Field.Square(t, r);
-
- return Nat224.Eq(c, r) ? new SecP224R1FieldElement(t) : null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecP224R1FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecP224R1FieldElement);
- }
-
- public virtual bool Equals(SecP224R1FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat224.Eq(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 7);
- }
-
- private static bool IsSquare(uint[] x)
- {
- uint[] t1 = Nat224.Create();
- uint[] t2 = Nat224.Create();
- Nat224.Copy(x, t1);
-
- for (int i = 0; i < 7; ++i)
- {
- Nat224.Copy(t1, t2);
- SecP224R1Field.SquareN(t1, 1 << i, t1);
- SecP224R1Field.Multiply(t1, t2, t1);
- }
-
- SecP224R1Field.SquareN(t1, 95, t1);
- return Nat224.IsOne(t1);
- }
-
- private static void RM(uint[] nc, uint[] d0, uint[] e0, uint[] d1, uint[] e1, uint[] f1, uint[] t)
- {
- SecP224R1Field.Multiply(e1, e0, t);
- SecP224R1Field.Multiply(t, nc, t);
- SecP224R1Field.Multiply(d1, d0, f1);
- SecP224R1Field.Add(f1, t, f1);
- SecP224R1Field.Multiply(d1, e0, t);
- Nat224.Copy(f1, d1);
- SecP224R1Field.Multiply(e1, d0, e1);
- SecP224R1Field.Add(e1, t, e1);
- SecP224R1Field.Square(e1, f1);
- SecP224R1Field.Multiply(f1, nc, f1);
- }
-
- private static void RP(uint[] nc, uint[] d1, uint[] e1, uint[] f1, uint[] t)
- {
- Nat224.Copy(nc, f1);
-
- uint[] d0 = Nat224.Create();
- uint[] e0 = Nat224.Create();
-
- for (int i = 0; i < 7; ++i)
- {
- Nat224.Copy(d1, d0);
- Nat224.Copy(e1, e0);
-
- int j = 1 << i;
- while (--j >= 0)
- {
- RS(d1, e1, f1, t);
- }
-
- RM(nc, d0, e0, d1, e1, f1, t);
- }
- }
-
- private static void RS(uint[] d, uint[] e, uint[] f, uint[] t)
- {
- SecP224R1Field.Multiply(e, d, e);
- SecP224R1Field.Twice(e, e);
- SecP224R1Field.Square(d, t);
- SecP224R1Field.Add(f, t, d);
- SecP224R1Field.Multiply(f, t, f);
- uint c = Nat.ShiftUpBits(7, f, 2, 0);
- SecP224R1Field.Reduce32(c, f);
- }
-
- private static bool TrySqrt(uint[] nc, uint[] r, uint[] t)
- {
- uint[] d1 = Nat224.Create();
- Nat224.Copy(r, d1);
- uint[] e1 = Nat224.Create();
- e1[0] = 1;
- uint[] f1 = Nat224.Create();
- RP(nc, d1, e1, f1, t);
-
- uint[] d0 = Nat224.Create();
- uint[] e0 = Nat224.Create();
-
- for (int k = 1; k < 96; ++k)
- {
- Nat224.Copy(d1, d0);
- Nat224.Copy(e1, e0);
-
- RS(d1, e1, f1, t);
-
- if (Nat224.IsZero(d1))
- {
- Mod.Invert(SecP224R1Field.P, e0, t);
- SecP224R1Field.Multiply(t, d0, t);
- return true;
- }
- }
-
- return false;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP224R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecP224R1Point.cs
deleted file mode 100644
index 73c4f19..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP224R1Point.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP224R1Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecP224R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(bool)}
- */
- public SecP224R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecP224R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecP224R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SecP224R1FieldElement X1 = (SecP224R1FieldElement)this.RawXCoord, Y1 = (SecP224R1FieldElement)this.RawYCoord;
- SecP224R1FieldElement X2 = (SecP224R1FieldElement)b.RawXCoord, Y2 = (SecP224R1FieldElement)b.RawYCoord;
-
- SecP224R1FieldElement Z1 = (SecP224R1FieldElement)this.RawZCoords[0];
- SecP224R1FieldElement Z2 = (SecP224R1FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat224.CreateExt();
- uint[] t2 = Nat224.Create();
- uint[] t3 = Nat224.Create();
- uint[] t4 = Nat224.Create();
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SecP224R1Field.Square(Z1.x, S2);
-
- U2 = t2;
- SecP224R1Field.Multiply(S2, X2.x, U2);
-
- SecP224R1Field.Multiply(S2, Z1.x, S2);
- SecP224R1Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SecP224R1Field.Square(Z2.x, S1);
-
- U1 = tt1;
- SecP224R1Field.Multiply(S1, X1.x, U1);
-
- SecP224R1Field.Multiply(S1, Z2.x, S1);
- SecP224R1Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat224.Create();
- SecP224R1Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- SecP224R1Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat224.IsZero(H))
- {
- if (Nat224.IsZero(R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SecP224R1Field.Square(H, HSquared);
-
- uint[] G = Nat224.Create();
- SecP224R1Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SecP224R1Field.Multiply(HSquared, U1, V);
-
- SecP224R1Field.Negate(G, G);
- Nat224.Mul(S1, G, tt1);
-
- c = Nat224.AddBothTo(V, V, G);
- SecP224R1Field.Reduce32(c, G);
-
- SecP224R1FieldElement X3 = new SecP224R1FieldElement(t4);
- SecP224R1Field.Square(R, X3.x);
- SecP224R1Field.Subtract(X3.x, G, X3.x);
-
- SecP224R1FieldElement Y3 = new SecP224R1FieldElement(G);
- SecP224R1Field.Subtract(V, X3.x, Y3.x);
- SecP224R1Field.MultiplyAddToExt(Y3.x, R, tt1);
- SecP224R1Field.Reduce(tt1, Y3.x);
-
- SecP224R1FieldElement Z3 = new SecP224R1FieldElement(H);
- if (!Z1IsOne)
- {
- SecP224R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SecP224R1Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[] { Z3 };
-
- return new SecP224R1Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SecP224R1FieldElement Y1 = (SecP224R1FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SecP224R1FieldElement X1 = (SecP224R1FieldElement)this.RawXCoord, Z1 = (SecP224R1FieldElement)this.RawZCoords[0];
-
- uint c;
- uint[] t1 = Nat224.Create();
- uint[] t2 = Nat224.Create();
-
- uint[] Y1Squared = Nat224.Create();
- SecP224R1Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat224.Create();
- SecP224R1Field.Square(Y1Squared, T);
-
- bool Z1IsOne = Z1.IsOne;
-
- uint[] Z1Squared = Z1.x;
- if (!Z1IsOne)
- {
- Z1Squared = t2;
- SecP224R1Field.Square(Z1.x, Z1Squared);
- }
-
- SecP224R1Field.Subtract(X1.x, Z1Squared, t1);
-
- uint[] M = t2;
- SecP224R1Field.Add(X1.x, Z1Squared, M);
- SecP224R1Field.Multiply(M, t1, M);
- c = Nat224.AddBothTo(M, M, M);
- SecP224R1Field.Reduce32(c, M);
-
- uint[] S = Y1Squared;
- SecP224R1Field.Multiply(Y1Squared, X1.x, S);
- c = Nat.ShiftUpBits(7, S, 2, 0);
- SecP224R1Field.Reduce32(c, S);
-
- c = Nat.ShiftUpBits(7, T, 3, 0, t1);
- SecP224R1Field.Reduce32(c, t1);
-
- SecP224R1FieldElement X3 = new SecP224R1FieldElement(T);
- SecP224R1Field.Square(M, X3.x);
- SecP224R1Field.Subtract(X3.x, S, X3.x);
- SecP224R1Field.Subtract(X3.x, S, X3.x);
-
- SecP224R1FieldElement Y3 = new SecP224R1FieldElement(S);
- SecP224R1Field.Subtract(S, X3.x, Y3.x);
- SecP224R1Field.Multiply(Y3.x, M, Y3.x);
- SecP224R1Field.Subtract(Y3.x, t1, Y3.x);
-
- SecP224R1FieldElement Z3 = new SecP224R1FieldElement(M);
- SecP224R1Field.Twice(Y1.x, Z3.x);
- if (!Z1IsOne)
- {
- SecP224R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SecP224R1Point(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between TwicePlus and ThreeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SecP224R1Point(Curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP256K1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecP256K1Curve.cs
deleted file mode 100644
index 59e2cef..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP256K1Curve.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP256K1Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"));
-
- private const int SECP256K1_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SecP256K1Point m_infinity;
-
- public SecP256K1Curve()
- : base(q)
- {
- this.m_infinity = new SecP256K1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.Zero);
- this.m_b = FromBigInteger(BigInteger.ValueOf(7));
- this.m_order = new BigInteger(1, Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141"));
- this.m_cofactor = BigInteger.One;
- this.m_coord = SECP256K1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecP256K1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecP256K1FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecP256K1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecP256K1Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP256K1Field.cs b/BCCrypto/src/math/ec/custom/sec/SecP256K1Field.cs
deleted file mode 100644
index b0646e9..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP256K1Field.cs
+++ /dev/null
@@ -1,180 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP256K1Field
- {
- // 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
- internal static readonly uint[] P = new uint[]{ 0xFFFFFC2F, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
- 0xFFFFFFFF, 0xFFFFFFFF };
- internal static readonly uint[] PExt = new uint[]{ 0x000E90A1, 0x000007A2, 0x00000001, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0xFFFFF85E, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
- 0xFFFFFFFF, 0xFFFFFFFF };
- private static readonly uint[] PExtInv = new uint[]{ 0xFFF16F5F, 0xFFFFF85D, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF,
- 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000007A1, 0x00000002 };
- private const uint P7 = 0xFFFFFFFF;
- private const uint PExt15 = 0xFFFFFFFF;
- private const uint PInv33 = 0x3D1;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- uint c = Nat256.Add(x, y, z);
- if (c != 0 || (z[7] == P7 && Nat256.Gte(z, P)))
- {
- Nat.Add33To(8, PInv33, z);
- }
- }
-
- public static void AddExt(uint[] xx, uint[] yy, uint[] zz)
- {
- uint c = Nat.Add(16, xx, yy, zz);
- if (c != 0 || (zz[15] == PExt15 && Nat.Gte(16, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(16, zz, PExtInv.Length);
- }
- }
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- uint c = Nat.Inc(8, x, z);
- if (c != 0 || (z[7] == P7 && Nat256.Gte(z, P)))
- {
- Nat.Add33To(8, PInv33, z);
- }
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat256.FromBigInteger(x);
- if (z[7] == P7 && Nat256.Gte(z, P))
- {
- Nat256.SubFrom(P, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- if ((x[0] & 1) == 0)
- {
- Nat.ShiftDownBit(8, x, 0, z);
- }
- else
- {
- uint c = Nat256.Add(x, P, z);
- Nat.ShiftDownBit(8, z, c);
- }
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat256.CreateExt();
- Nat256.Mul(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
- {
- uint c = Nat256.MulAddTo(x, y, zz);
- if (c != 0 || (zz[15] == PExt15 && Nat.Gte(16, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(16, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat256.IsZero(x))
- {
- Nat256.Zero(z);
- }
- else
- {
- Nat256.Sub(P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- ulong cc = Nat256.Mul33Add(PInv33, xx, 8, xx, 0, z, 0);
- uint c = Nat256.Mul33DWordAdd(PInv33, cc, z, 0);
-
- Debug.Assert(c == 0 || c == 1);
-
- if (c != 0 || (z[7] == P7 && Nat256.Gte(z, P)))
- {
- Nat.Add33To(8, PInv33, z);
- }
- }
-
- public static void Reduce32(uint x, uint[] z)
- {
- if ((x != 0 && Nat256.Mul33WordAdd(PInv33, x, z, 0) != 0)
- || (z[7] == P7 && Nat256.Gte(z, P)))
- {
- Nat.Add33To(8, PInv33, z);
- }
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat256.CreateExt();
- Nat256.Square(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
-
- uint[] tt = Nat256.CreateExt();
- Nat256.Square(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- Nat256.Square(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat256.Sub(x, y, z);
- if (c != 0)
- {
- Nat.Sub33From(8, PInv33, z);
- }
- }
-
- public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz)
- {
- int c = Nat.Sub(16, xx, yy, zz);
- if (c != 0)
- {
- if (Nat.SubFrom(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.DecAt(16, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- uint c = Nat.ShiftUpBit(8, x, 0, z);
- if (c != 0 || (z[7] == P7 && Nat256.Gte(z, P)))
- {
- Nat.Add33To(8, PInv33, z);
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP256K1FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecP256K1FieldElement.cs
deleted file mode 100644
index 473113d..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP256K1FieldElement.cs
+++ /dev/null
@@ -1,214 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP256K1FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = SecP256K1Curve.q;
-
- protected internal readonly uint[] x;
-
- public SecP256K1FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for SecP256K1FieldElement", "x");
-
- this.x = SecP256K1Field.FromBigInteger(x);
- }
-
- public SecP256K1FieldElement()
- {
- this.x = Nat256.Create();
- }
-
- protected internal SecP256K1FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat256.IsZero(x); }
- }
-
- public override bool IsOne
- {
- get { return Nat256.IsOne(x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat256.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat256.ToBigInteger(x);
- }
-
- public override string FieldName
- {
- get { return "SecP256K1Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat256.Create();
- SecP256K1Field.Add(x, ((SecP256K1FieldElement)b).x, z);
- return new SecP256K1FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat256.Create();
- SecP256K1Field.AddOne(x, z);
- return new SecP256K1FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat256.Create();
- SecP256K1Field.Subtract(x, ((SecP256K1FieldElement)b).x, z);
- return new SecP256K1FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat256.Create();
- SecP256K1Field.Multiply(x, ((SecP256K1FieldElement)b).x, z);
- return new SecP256K1FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- //return Multiply(b.Invert());
- uint[] z = Nat256.Create();
- Mod.Invert(SecP256K1Field.P, ((SecP256K1FieldElement)b).x, z);
- SecP256K1Field.Multiply(z, x, z);
- return new SecP256K1FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat256.Create();
- SecP256K1Field.Negate(x, z);
- return new SecP256K1FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat256.Create();
- SecP256K1Field.Square(x, z);
- return new SecP256K1FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- //return new SecP256K1FieldElement(ToBigInteger().ModInverse(Q));
- uint[] z = Nat256.Create();
- Mod.Invert(SecP256K1Field.P, x, z);
- return new SecP256K1FieldElement(z);
- }
-
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- /*
- * Raise this element to the exponent 2^254 - 2^30 - 2^7 - 2^6 - 2^5 - 2^4 - 2^2
- *
- * Breaking up the exponent's binary representation into "repunits", we get:
- * { 223 1s } { 1 0s } { 22 1s } { 4 0s } { 2 1s } { 2 0s}
- *
- * Therefore we need an addition chain containing 2, 22, 223 (the lengths of the repunits)
- * We use: 1, [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223]
- */
-
- uint[] x1 = this.x;
- if (Nat256.IsZero(x1) || Nat256.IsOne(x1))
- return this;
-
- uint[] x2 = Nat256.Create();
- SecP256K1Field.Square(x1, x2);
- SecP256K1Field.Multiply(x2, x1, x2);
- uint[] x3 = Nat256.Create();
- SecP256K1Field.Square(x2, x3);
- SecP256K1Field.Multiply(x3, x1, x3);
- uint[] x6 = Nat256.Create();
- SecP256K1Field.SquareN(x3, 3, x6);
- SecP256K1Field.Multiply(x6, x3, x6);
- uint[] x9 = x6;
- SecP256K1Field.SquareN(x6, 3, x9);
- SecP256K1Field.Multiply(x9, x3, x9);
- uint[] x11 = x9;
- SecP256K1Field.SquareN(x9, 2, x11);
- SecP256K1Field.Multiply(x11, x2, x11);
- uint[] x22 = Nat256.Create();
- SecP256K1Field.SquareN(x11, 11, x22);
- SecP256K1Field.Multiply(x22, x11, x22);
- uint[] x44 = x11;
- SecP256K1Field.SquareN(x22, 22, x44);
- SecP256K1Field.Multiply(x44, x22, x44);
- uint[] x88 = Nat256.Create();
- SecP256K1Field.SquareN(x44, 44, x88);
- SecP256K1Field.Multiply(x88, x44, x88);
- uint[] x176 = Nat256.Create();
- SecP256K1Field.SquareN(x88, 88, x176);
- SecP256K1Field.Multiply(x176, x88, x176);
- uint[] x220 = x88;
- SecP256K1Field.SquareN(x176, 44, x220);
- SecP256K1Field.Multiply(x220, x44, x220);
- uint[] x223 = x44;
- SecP256K1Field.SquareN(x220, 3, x223);
- SecP256K1Field.Multiply(x223, x3, x223);
-
- uint[] t1 = x223;
- SecP256K1Field.SquareN(t1, 23, t1);
- SecP256K1Field.Multiply(t1, x22, t1);
- SecP256K1Field.SquareN(t1, 6, t1);
- SecP256K1Field.Multiply(t1, x2, t1);
- SecP256K1Field.SquareN(t1, 2, t1);
-
- uint[] t2 = x2;
- SecP256K1Field.Square(t1, t2);
-
- return Nat256.Eq(x1, t2) ? new SecP256K1FieldElement(t1) : null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecP256K1FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecP256K1FieldElement);
- }
-
- public virtual bool Equals(SecP256K1FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat256.Eq(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 8);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP256K1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecP256K1Point.cs
deleted file mode 100644
index 072a0b9..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP256K1Point.cs
+++ /dev/null
@@ -1,267 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP256K1Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecP256K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(bool)}
- */
- public SecP256K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecP256K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs,
- bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecP256K1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SecP256K1FieldElement X1 = (SecP256K1FieldElement)this.RawXCoord, Y1 = (SecP256K1FieldElement)this.RawYCoord;
- SecP256K1FieldElement X2 = (SecP256K1FieldElement)b.RawXCoord, Y2 = (SecP256K1FieldElement)b.RawYCoord;
-
- SecP256K1FieldElement Z1 = (SecP256K1FieldElement)this.RawZCoords[0];
- SecP256K1FieldElement Z2 = (SecP256K1FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat256.CreateExt();
- uint[] t2 = Nat256.Create();
- uint[] t3 = Nat256.Create();
- uint[] t4 = Nat256.Create();
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SecP256K1Field.Square(Z1.x, S2);
-
- U2 = t2;
- SecP256K1Field.Multiply(S2, X2.x, U2);
-
- SecP256K1Field.Multiply(S2, Z1.x, S2);
- SecP256K1Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SecP256K1Field.Square(Z2.x, S1);
-
- U1 = tt1;
- SecP256K1Field.Multiply(S1, X1.x, U1);
-
- SecP256K1Field.Multiply(S1, Z2.x, S1);
- SecP256K1Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat256.Create();
- SecP256K1Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- SecP256K1Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat256.IsZero(H))
- {
- if (Nat256.IsZero(R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SecP256K1Field.Square(H, HSquared);
-
- uint[] G = Nat256.Create();
- SecP256K1Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SecP256K1Field.Multiply(HSquared, U1, V);
-
- SecP256K1Field.Negate(G, G);
- Nat256.Mul(S1, G, tt1);
-
- c = Nat256.AddBothTo(V, V, G);
- SecP256K1Field.Reduce32(c, G);
-
- SecP256K1FieldElement X3 = new SecP256K1FieldElement(t4);
- SecP256K1Field.Square(R, X3.x);
- SecP256K1Field.Subtract(X3.x, G, X3.x);
-
- SecP256K1FieldElement Y3 = new SecP256K1FieldElement(G);
- SecP256K1Field.Subtract(V, X3.x, Y3.x);
- SecP256K1Field.MultiplyAddToExt(Y3.x, R, tt1);
- SecP256K1Field.Reduce(tt1, Y3.x);
-
- SecP256K1FieldElement Z3 = new SecP256K1FieldElement(H);
- if (!Z1IsOne)
- {
- SecP256K1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SecP256K1Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[] { Z3 };
-
- return new SecP256K1Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SecP256K1FieldElement Y1 = (SecP256K1FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SecP256K1FieldElement X1 = (SecP256K1FieldElement)this.RawXCoord, Z1 = (SecP256K1FieldElement)this.RawZCoords[0];
-
- uint c;
-
- uint[] Y1Squared = Nat256.Create();
- SecP256K1Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat256.Create();
- SecP256K1Field.Square(Y1Squared, T);
-
- uint[] M = Nat256.Create();
- SecP256K1Field.Square(X1.x, M);
- c = Nat256.AddBothTo(M, M, M);
- SecP256K1Field.Reduce32(c, M);
-
- uint[] S = Y1Squared;
- SecP256K1Field.Multiply(Y1Squared, X1.x, S);
- c = Nat.ShiftUpBits(8, S, 2, 0);
- SecP256K1Field.Reduce32(c, S);
-
- uint[] t1 = Nat256.Create();
- c = Nat.ShiftUpBits(8, T, 3, 0, t1);
- SecP256K1Field.Reduce32(c, t1);
-
- SecP256K1FieldElement X3 = new SecP256K1FieldElement(T);
- SecP256K1Field.Square(M, X3.x);
- SecP256K1Field.Subtract(X3.x, S, X3.x);
- SecP256K1Field.Subtract(X3.x, S, X3.x);
-
- SecP256K1FieldElement Y3 = new SecP256K1FieldElement(S);
- SecP256K1Field.Subtract(S, X3.x, Y3.x);
- SecP256K1Field.Multiply(Y3.x, M, Y3.x);
- SecP256K1Field.Subtract(Y3.x, t1, Y3.x);
-
- SecP256K1FieldElement Z3 = new SecP256K1FieldElement(M);
- SecP256K1Field.Twice(Y1.x, Z3.x);
- if (!Z1.IsOne)
- {
- SecP256K1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SecP256K1Point(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between TwicePlus and ThreeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SecP256K1Point(Curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP256R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecP256R1Curve.cs
deleted file mode 100644
index 6b3448f..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP256R1Curve.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP256R1Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = new BigInteger(1,
- Hex.Decode("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF"));
-
- private const int SecP256R1_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SecP256R1Point m_infinity;
-
- public SecP256R1Curve()
- : base(q)
- {
- this.m_infinity = new SecP256R1Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1,
- Hex.Decode("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC")));
- this.m_b = FromBigInteger(new BigInteger(1,
- Hex.Decode("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B")));
- this.m_order = new BigInteger(1, Hex.Decode("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"));
- this.m_cofactor = BigInteger.One;
- this.m_coord = SecP256R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecP256R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecP256R1FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecP256R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecP256R1Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP256R1Field.cs b/BCCrypto/src/math/ec/custom/sec/SecP256R1Field.cs
deleted file mode 100644
index 5b3de6d..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP256R1Field.cs
+++ /dev/null
@@ -1,312 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP256R1Field
- {
- // 2^256 - 2^224 + 2^192 + 2^96 - 1
- internal static readonly uint[] P = new uint[]{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
- 0x00000001, 0xFFFFFFFF };
- internal static readonly uint[] PExt = new uint[]{ 0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF,
- 0xFFFFFFFF, 0xFFFFFFFE, 0x00000001, 0xFFFFFFFE, 0x00000001, 0xFFFFFFFE, 0x00000001, 0x00000001, 0xFFFFFFFE,
- 0x00000002, 0xFFFFFFFE };
- internal const uint P7 = 0xFFFFFFFF;
- internal const uint PExt15 = 0xFFFFFFFE;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- uint c = Nat256.Add(x, y, z);
- if (c != 0 || (z[7] == P7 && Nat256.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void AddExt(uint[] xx, uint[] yy, uint[] zz)
- {
- uint c = Nat.Add(16, xx, yy, zz);
- if (c != 0 || (zz[15] >= PExt15 && Nat.Gte(16, zz, PExt)))
- {
- Nat.SubFrom(16, PExt, zz);
- }
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- uint c = Nat.Inc(8, x, z);
- if (c != 0 || (z[7] == P7 && Nat256.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat256.FromBigInteger(x);
- if (z[7] == P7 && Nat256.Gte(z, P))
- {
- Nat256.SubFrom(P, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- if ((x[0] & 1) == 0)
- {
- Nat.ShiftDownBit(8, x, 0, z);
- }
- else
- {
- uint c = Nat256.Add(x, P, z);
- Nat.ShiftDownBit(8, z, c);
- }
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat256.CreateExt();
- Nat256.Mul(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(uint[] x, uint[] y, uint[] zz)
- {
- uint c = Nat256.MulAddTo(x, y, zz);
- if (c != 0 || (zz[15] >= PExt15 && Nat.Gte(16, zz, PExt)))
- {
- Nat.SubFrom(16, PExt, zz);
- }
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat256.IsZero(x))
- {
- Nat256.Zero(z);
- }
- else
- {
- Nat256.Sub(P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- long xx08 = xx[8], xx09 = xx[9], xx10 = xx[10], xx11 = xx[11];
- long xx12 = xx[12], xx13 = xx[13], xx14 = xx[14], xx15 = xx[15];
-
- const long n = 6;
-
- xx08 -= n;
-
- long t0 = xx08 + xx09;
- long t1 = xx09 + xx10;
- long t2 = xx10 + xx11 - xx15;
- long t3 = xx11 + xx12;
- long t4 = xx12 + xx13;
- long t5 = xx13 + xx14;
- long t6 = xx14 + xx15;
- long t7 = t5 - t0;
-
- long cc = 0;
- cc += (long)xx[0] - t3 - t7;
- z[0] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[1] + t1 - t4 - t6;
- z[1] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[2] + t2 - t5;
- z[2] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[3] + (t3 << 1) + t7 - t6;
- z[3] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[4] + (t4 << 1) + xx14 - t1;
- z[4] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[5] + (t5 << 1) - t2;
- z[5] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[6] + (t6 << 1) + t7;
- z[6] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[7] + (xx15 << 1) + xx08 - t2 - t4;
- z[7] = (uint)cc;
- cc >>= 32;
- cc += n;
-
- Debug.Assert(cc >= 0);
-
- Reduce32((uint)cc, z);
- }
-
- public static void Reduce32(uint x, uint[] z)
- {
- long cc = 0;
-
- if (x != 0)
- {
- long xx08 = x;
-
- cc += (long)z[0] + xx08;
- z[0] = (uint)cc;
- cc >>= 32;
- if (cc != 0)
- {
- cc += (long)z[1];
- z[1] = (uint)cc;
- cc >>= 32;
- cc += (long)z[2];
- z[2] = (uint)cc;
- cc >>= 32;
- }
- cc += (long)z[3] - xx08;
- z[3] = (uint)cc;
- cc >>= 32;
- if (cc != 0)
- {
- cc += (long)z[4];
- z[4] = (uint)cc;
- cc >>= 32;
- cc += (long)z[5];
- z[5] = (uint)cc;
- cc >>= 32;
- }
- cc += (long)z[6] - xx08;
- z[6] = (uint)cc;
- cc >>= 32;
- cc += (long)z[7] + xx08;
- z[7] = (uint)cc;
- cc >>= 32;
-
- Debug.Assert(cc == 0 || cc == 1);
- }
-
- if (cc != 0 || (z[7] == P7 && Nat256.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat256.CreateExt();
- Nat256.Square(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
-
- uint[] tt = Nat256.CreateExt();
- Nat256.Square(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- Nat256.Square(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat256.Sub(x, y, z);
- if (c != 0)
- {
- SubPInvFrom(z);
- }
- }
-
- public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz)
- {
- int c = Nat.Sub(16, xx, yy, zz);
- if (c != 0)
- {
- Nat.AddTo(16, PExt, zz);
- }
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- uint c = Nat.ShiftUpBit(8, x, 0, z);
- if (c != 0 || (z[7] == P7 && Nat256.Gte(z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- private static void AddPInvTo(uint[] z)
- {
- long c = (long)z[0] + 1;
- z[0] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2];
- z[2] = (uint)c;
- c >>= 32;
- }
- c += (long)z[3] - 1;
- z[3] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)z[5];
- z[5] = (uint)c;
- c >>= 32;
- }
- c += (long)z[6] - 1;
- z[6] = (uint)c;
- c >>= 32;
- c += (long)z[7] + 1;
- z[7] = (uint)c;
- //c >>= 32;
- }
-
- private static void SubPInvFrom(uint[] z)
- {
- long c = (long)z[0] - 1;
- z[0] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2];
- z[2] = (uint)c;
- c >>= 32;
- }
- c += (long)z[3] + 1;
- z[3] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)z[5];
- z[5] = (uint)c;
- c >>= 32;
- }
- c += (long)z[6] + 1;
- z[6] = (uint)c;
- c >>= 32;
- c += (long)z[7] - 1;
- z[7] = (uint)c;
- //c >>= 32;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP256R1FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecP256R1FieldElement.cs
deleted file mode 100644
index d7838ae..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP256R1FieldElement.cs
+++ /dev/null
@@ -1,188 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP256R1FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = SecP256R1Curve.q;
-
- protected internal readonly uint[] x;
-
- public SecP256R1FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for SecP256R1FieldElement", "x");
-
- this.x = SecP256R1Field.FromBigInteger(x);
- }
-
- public SecP256R1FieldElement()
- {
- this.x = Nat256.Create();
- }
-
- protected internal SecP256R1FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat256.IsZero(x); }
- }
-
- public override bool IsOne
- {
- get { return Nat256.IsOne(x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat256.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat256.ToBigInteger(x);
- }
-
- public override string FieldName
- {
- get { return "SecP256R1Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat256.Create();
- SecP256R1Field.Add(x, ((SecP256R1FieldElement)b).x, z);
- return new SecP256R1FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat256.Create();
- SecP256R1Field.AddOne(x, z);
- return new SecP256R1FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat256.Create();
- SecP256R1Field.Subtract(x, ((SecP256R1FieldElement)b).x, z);
- return new SecP256R1FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat256.Create();
- SecP256R1Field.Multiply(x, ((SecP256R1FieldElement)b).x, z);
- return new SecP256R1FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- //return Multiply(b.Invert());
- uint[] z = Nat256.Create();
- Mod.Invert(SecP256R1Field.P, ((SecP256R1FieldElement)b).x, z);
- SecP256R1Field.Multiply(z, x, z);
- return new SecP256R1FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat256.Create();
- SecP256R1Field.Negate(x, z);
- return new SecP256R1FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat256.Create();
- SecP256R1Field.Square(x, z);
- return new SecP256R1FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- //return new SecP256R1FieldElement(ToBigInteger().ModInverse(Q));
- uint[] z = Nat256.Create();
- Mod.Invert(SecP256R1Field.P, x, z);
- return new SecP256R1FieldElement(z);
- }
-
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- // Raise this element to the exponent 2^254 - 2^222 + 2^190 + 2^94
-
- uint[] x1 = this.x;
- if (Nat256.IsZero(x1) || Nat256.IsOne(x1))
- return this;
-
- uint[] t1 = Nat256.Create();
- uint[] t2 = Nat256.Create();
-
- SecP256R1Field.Square(x1, t1);
- SecP256R1Field.Multiply(t1, x1, t1);
-
- SecP256R1Field.SquareN(t1, 2, t2);
- SecP256R1Field.Multiply(t2, t1, t2);
-
- SecP256R1Field.SquareN(t2, 4, t1);
- SecP256R1Field.Multiply(t1, t2, t1);
-
- SecP256R1Field.SquareN(t1, 8, t2);
- SecP256R1Field.Multiply(t2, t1, t2);
-
- SecP256R1Field.SquareN(t2, 16, t1);
- SecP256R1Field.Multiply(t1, t2, t1);
-
- SecP256R1Field.SquareN(t1, 32, t1);
- SecP256R1Field.Multiply(t1, x1, t1);
-
- SecP256R1Field.SquareN(t1, 96, t1);
- SecP256R1Field.Multiply(t1, x1, t1);
-
- SecP256R1Field.SquareN(t1, 94, t1);
- SecP256R1Field.Multiply(t1, t1, t2);
-
- return Nat256.Eq(x1, t2) ? new SecP256R1FieldElement(t1) : null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecP256R1FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecP256R1FieldElement);
- }
-
- public virtual bool Equals(SecP256R1FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat256.Eq(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 8);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP256R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecP256R1Point.cs
deleted file mode 100644
index 8332082..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP256R1Point.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP256R1Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecP256R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(bool)}
- */
- public SecP256R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecP256R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecP256R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SecP256R1FieldElement X1 = (SecP256R1FieldElement)this.RawXCoord, Y1 = (SecP256R1FieldElement)this.RawYCoord;
- SecP256R1FieldElement X2 = (SecP256R1FieldElement)b.RawXCoord, Y2 = (SecP256R1FieldElement)b.RawYCoord;
-
- SecP256R1FieldElement Z1 = (SecP256R1FieldElement)this.RawZCoords[0];
- SecP256R1FieldElement Z2 = (SecP256R1FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat256.CreateExt();
- uint[] t2 = Nat256.Create();
- uint[] t3 = Nat256.Create();
- uint[] t4 = Nat256.Create();
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SecP256R1Field.Square(Z1.x, S2);
-
- U2 = t2;
- SecP256R1Field.Multiply(S2, X2.x, U2);
-
- SecP256R1Field.Multiply(S2, Z1.x, S2);
- SecP256R1Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SecP256R1Field.Square(Z2.x, S1);
-
- U1 = tt1;
- SecP256R1Field.Multiply(S1, X1.x, U1);
-
- SecP256R1Field.Multiply(S1, Z2.x, S1);
- SecP256R1Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat256.Create();
- SecP256R1Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- SecP256R1Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat256.IsZero(H))
- {
- if (Nat256.IsZero(R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SecP256R1Field.Square(H, HSquared);
-
- uint[] G = Nat256.Create();
- SecP256R1Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SecP256R1Field.Multiply(HSquared, U1, V);
-
- SecP256R1Field.Negate(G, G);
- Nat256.Mul(S1, G, tt1);
-
- c = Nat256.AddBothTo(V, V, G);
- SecP256R1Field.Reduce32(c, G);
-
- SecP256R1FieldElement X3 = new SecP256R1FieldElement(t4);
- SecP256R1Field.Square(R, X3.x);
- SecP256R1Field.Subtract(X3.x, G, X3.x);
-
- SecP256R1FieldElement Y3 = new SecP256R1FieldElement(G);
- SecP256R1Field.Subtract(V, X3.x, Y3.x);
- SecP256R1Field.MultiplyAddToExt(Y3.x, R, tt1);
- SecP256R1Field.Reduce(tt1, Y3.x);
-
- SecP256R1FieldElement Z3 = new SecP256R1FieldElement(H);
- if (!Z1IsOne)
- {
- SecP256R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SecP256R1Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[]{ Z3 };
-
- return new SecP256R1Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SecP256R1FieldElement Y1 = (SecP256R1FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SecP256R1FieldElement X1 = (SecP256R1FieldElement)this.RawXCoord, Z1 = (SecP256R1FieldElement)this.RawZCoords[0];
-
- uint c;
- uint[] t1 = Nat256.Create();
- uint[] t2 = Nat256.Create();
-
- uint[] Y1Squared = Nat256.Create();
- SecP256R1Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat256.Create();
- SecP256R1Field.Square(Y1Squared, T);
-
- bool Z1IsOne = Z1.IsOne;
-
- uint[] Z1Squared = Z1.x;
- if (!Z1IsOne)
- {
- Z1Squared = t2;
- SecP256R1Field.Square(Z1.x, Z1Squared);
- }
-
- SecP256R1Field.Subtract(X1.x, Z1Squared, t1);
-
- uint[] M = t2;
- SecP256R1Field.Add(X1.x, Z1Squared, M);
- SecP256R1Field.Multiply(M, t1, M);
- c = Nat256.AddBothTo(M, M, M);
- SecP256R1Field.Reduce32(c, M);
-
- uint[] S = Y1Squared;
- SecP256R1Field.Multiply(Y1Squared, X1.x, S);
- c = Nat.ShiftUpBits(8, S, 2, 0);
- SecP256R1Field.Reduce32(c, S);
-
- c = Nat.ShiftUpBits(8, T, 3, 0, t1);
- SecP256R1Field.Reduce32(c, t1);
-
- SecP256R1FieldElement X3 = new SecP256R1FieldElement(T);
- SecP256R1Field.Square(M, X3.x);
- SecP256R1Field.Subtract(X3.x, S, X3.x);
- SecP256R1Field.Subtract(X3.x, S, X3.x);
-
- SecP256R1FieldElement Y3 = new SecP256R1FieldElement(S);
- SecP256R1Field.Subtract(S, X3.x, Y3.x);
- SecP256R1Field.Multiply(Y3.x, M, Y3.x);
- SecP256R1Field.Subtract(Y3.x, t1, Y3.x);
-
- SecP256R1FieldElement Z3 = new SecP256R1FieldElement(M);
- SecP256R1Field.Twice(Y1.x, Z3.x);
- if (!Z1IsOne)
- {
- SecP256R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SecP256R1Point(curve, X3, Y3, new ECFieldElement[]{ Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between TwicePlus and ThreeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SecP256R1Point(Curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP384R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecP384R1Curve.cs
deleted file mode 100644
index 7fd5827..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP384R1Curve.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP384R1Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF"));
-
- private const int SecP384R1_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SecP384R1Point m_infinity;
-
- public SecP384R1Curve()
- : base(q)
- {
- this.m_infinity = new SecP384R1Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1,
- Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC")));
- this.m_b = FromBigInteger(new BigInteger(1,
- Hex.Decode("B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF")));
- this.m_order = new BigInteger(1, Hex.Decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973"));
- this.m_cofactor = BigInteger.One;
- this.m_coord = SecP384R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecP384R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecP384R1FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecP384R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecP384R1Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP384R1Field.cs b/BCCrypto/src/math/ec/custom/sec/SecP384R1Field.cs
deleted file mode 100644
index 0780df3..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP384R1Field.cs
+++ /dev/null
@@ -1,295 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP384R1Field
- {
- // 2^384 - 2^128 - 2^96 + 2^32 - 1
- internal static readonly uint[] P = new uint[]{ 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF,
- 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
- internal static readonly uint[] PExt = new uint[]{ 0x00000001, 0xFFFFFFFE, 0x00000000, 0x00000002, 0x00000000, 0xFFFFFFFE,
- 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFE, 0x00000001, 0x00000000,
- 0xFFFFFFFE, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
- private static readonly uint[] PExtInv = new uint[]{ 0xFFFFFFFF, 0x00000001, 0xFFFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, 0x00000001,
- 0xFFFFFFFF, 0xFFFFFFFD, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000001, 0xFFFFFFFE, 0xFFFFFFFF,
- 0x00000001, 0x00000002 };
- private const uint P11 = 0xFFFFFFFF;
- private const uint PExt23 = 0xFFFFFFFF;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- uint c = Nat.Add(12, x, y, z);
- if (c != 0 || (z[11] == P11 && Nat.Gte(12, z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void AddExt(uint[] xx, uint[] yy, uint[] zz)
- {
- uint c = Nat.Add(24, xx, yy, zz);
- if (c != 0 || (zz[23] == PExt23 && Nat.Gte(24, zz, PExt)))
- {
- if (Nat.AddTo(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.IncAt(24, zz, PExtInv.Length);
- }
- }
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- uint c = Nat.Inc(12, x, z);
- if (c != 0 || (z[11] == P11 && Nat.Gte(12, z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat.FromBigInteger(384, x);
- if (z[11] == P11 && Nat.Gte(12, z, P))
- {
- Nat.SubFrom(12, P, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- if ((x[0] & 1) == 0)
- {
- Nat.ShiftDownBit(12, x, 0, z);
- }
- else
- {
- uint c = Nat.Add(12, x, P, z);
- Nat.ShiftDownBit(12, z, c);
- }
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat.Create(24);
- Nat384.Mul(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat.IsZero(12, x))
- {
- Nat.Zero(12, z);
- }
- else
- {
- Nat.Sub(12, P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- long xx16 = xx[16], xx17 = xx[17], xx18 = xx[18], xx19 = xx[19];
- long xx20 = xx[20], xx21 = xx[21], xx22 = xx[22], xx23 = xx[23];
-
- const long n = 1;
-
- long t0 = (long)xx[12] + xx20 - n;
- long t1 = (long)xx[13] + xx22;
- long t2 = (long)xx[14] + xx22 + xx23;
- long t3 = (long)xx[15] + xx23;
- long t4 = xx17 + xx21;
- long t5 = xx21 - xx23;
- long t6 = xx22 - xx23;
- long t7 = t0 + t5;
-
- long cc = 0;
- cc += (long)xx[0] + t7;
- z[0] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[1] + xx23 - t0 + t1;
- z[1] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[2] - xx21 - t1 + t2;
- z[2] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[3] - t2 + t3 + t7;
- z[3] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[4] + xx16 + xx21 + t1 - t3 + t7;
- z[4] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[5] - xx16 + t1 + t2 + t4;
- z[5] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[6] + xx18 - xx17 + t2 + t3;
- z[6] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[7] + xx16 + xx19 - xx18 + t3;
- z[7] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[8] + xx16 + xx17 + xx20 - xx19;
- z[8] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[9] + xx18 - xx20 + t4;
- z[9] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[10] + xx18 + xx19 - t5 + t6;
- z[10] = (uint)cc;
- cc >>= 32;
- cc += (long)xx[11] + xx19 + xx20 - t6;
- z[11] = (uint)cc;
- cc >>= 32;
- cc += n;
-
- Debug.Assert(cc >= 0);
-
- Reduce32((uint)cc, z);
- }
-
- public static void Reduce32(uint x, uint[] z)
- {
- long cc = 0;
-
- if (x != 0)
- {
- long xx12 = x;
-
- cc += (long)z[0] + xx12;
- z[0] = (uint)cc;
- cc >>= 32;
- cc += (long)z[1] - xx12;
- z[1] = (uint)cc;
- cc >>= 32;
- if (cc != 0)
- {
- cc += (long)z[2];
- z[2] = (uint)cc;
- cc >>= 32;
- }
- cc += (long)z[3] + xx12;
- z[3] = (uint)cc;
- cc >>= 32;
- cc += (long)z[4] + xx12;
- z[4] = (uint)cc;
- cc >>= 32;
-
- Debug.Assert(cc == 0 || cc == 1);
- }
-
- if ((cc != 0 && Nat.IncAt(12, z, 5) != 0)
- || (z[11] == P11 && Nat.Gte(12, z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat.Create(24);
- Nat384.Square(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
-
- uint[] tt = Nat.Create(24);
- Nat384.Square(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- Nat384.Square(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat.Sub(12, x, y, z);
- if (c != 0)
- {
- SubPInvFrom(z);
- }
- }
-
- public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz)
- {
- int c = Nat.Sub(24, xx, yy, zz);
- if (c != 0)
- {
- if (Nat.SubFrom(PExtInv.Length, PExtInv, zz) != 0)
- {
- Nat.DecAt(24, zz, PExtInv.Length);
- }
- }
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- uint c = Nat.ShiftUpBit(12, x, 0, z);
- if (c != 0 || (z[11] == P11 && Nat.Gte(12, z, P)))
- {
- AddPInvTo(z);
- }
- }
-
- private static void AddPInvTo(uint[] z)
- {
- long c = (long)z[0] + 1;
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - 1;
- z[1] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[2];
- z[2] = (uint)c;
- c >>= 32;
- }
- c += (long)z[3] + 1;
- z[3] = (uint)c;
- c >>= 32;
- c += (long)z[4] + 1;
- z[4] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- Nat.IncAt(12, z, 5);
- }
- }
-
- private static void SubPInvFrom(uint[] z)
- {
- long c = (long)z[0] - 1;
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] + 1;
- z[1] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- c += (long)z[2];
- z[2] = (uint)c;
- c >>= 32;
- }
- c += (long)z[3] - 1;
- z[3] = (uint)c;
- c >>= 32;
- c += (long)z[4] - 1;
- z[4] = (uint)c;
- c >>= 32;
- if (c != 0)
- {
- Nat.DecAt(12, z, 5);
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP384R1FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecP384R1FieldElement.cs
deleted file mode 100644
index 18d48a5..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP384R1FieldElement.cs
+++ /dev/null
@@ -1,210 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP384R1FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = SecP384R1Curve.q;
-
- protected internal readonly uint[] x;
-
- public SecP384R1FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for SecP384R1FieldElement", "x");
-
- this.x = SecP384R1Field.FromBigInteger(x);
- }
-
- public SecP384R1FieldElement()
- {
- this.x = Nat.Create(12);
- }
-
- protected internal SecP384R1FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat.IsZero(12, x); }
- }
-
- public override bool IsOne
- {
- get { return Nat.IsOne(12, x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat.ToBigInteger(12, x);
- }
-
- public override string FieldName
- {
- get { return "SecP384R1Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat.Create(12);
- SecP384R1Field.Add(x, ((SecP384R1FieldElement)b).x, z);
- return new SecP384R1FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat.Create(12);
- SecP384R1Field.AddOne(x, z);
- return new SecP384R1FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat.Create(12);
- SecP384R1Field.Subtract(x, ((SecP384R1FieldElement)b).x, z);
- return new SecP384R1FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat.Create(12);
- SecP384R1Field.Multiply(x, ((SecP384R1FieldElement)b).x, z);
- return new SecP384R1FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- //return Multiply(b.Invert());
- uint[] z = Nat.Create(12);
- Mod.Invert(SecP384R1Field.P, ((SecP384R1FieldElement)b).x, z);
- SecP384R1Field.Multiply(z, x, z);
- return new SecP384R1FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat.Create(12);
- SecP384R1Field.Negate(x, z);
- return new SecP384R1FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat.Create(12);
- SecP384R1Field.Square(x, z);
- return new SecP384R1FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- //return new SecP384R1FieldElement(ToBigInteger().ModInverse(Q));
- uint[] z = Nat.Create(12);
- Mod.Invert(SecP384R1Field.P, x, z);
- return new SecP384R1FieldElement(z);
- }
-
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- // Raise this element to the exponent 2^382 - 2^126 - 2^94 + 2^30
-
- uint[] x1 = this.x;
- if (Nat.IsZero(12, x1) || Nat.IsOne(12, x1))
- return this;
-
- uint[] t1 = Nat.Create(12);
- uint[] t2 = Nat.Create(12);
- uint[] t3 = Nat.Create(12);
- uint[] t4 = Nat.Create(12);
-
- SecP384R1Field.Square(x1, t1);
- SecP384R1Field.Multiply(t1, x1, t1);
-
- SecP384R1Field.SquareN(t1, 2, t2);
- SecP384R1Field.Multiply(t2, t1, t2);
-
- SecP384R1Field.Square(t2, t2);
- SecP384R1Field.Multiply(t2, x1, t2);
-
- SecP384R1Field.SquareN(t2, 5, t3);
- SecP384R1Field.Multiply(t3, t2, t3);
-
- SecP384R1Field.SquareN(t3, 5, t4);
- SecP384R1Field.Multiply(t4, t2, t4);
-
- SecP384R1Field.SquareN(t4, 15, t2);
- SecP384R1Field.Multiply(t2, t4, t2);
-
- SecP384R1Field.SquareN(t2, 2, t3);
- SecP384R1Field.Multiply(t1, t3, t1);
-
- SecP384R1Field.SquareN(t3, 28, t3);
- SecP384R1Field.Multiply(t2, t3, t2);
-
- SecP384R1Field.SquareN(t2, 60, t3);
- SecP384R1Field.Multiply(t3, t2, t3);
-
- uint[] r = t2;
-
- SecP384R1Field.SquareN(t3, 120, r);
- SecP384R1Field.Multiply(r, t3, r);
-
- SecP384R1Field.SquareN(r, 15, r);
- SecP384R1Field.Multiply(r, t4, r);
-
- SecP384R1Field.SquareN(r, 33, r);
- SecP384R1Field.Multiply(r, t1, r);
-
- SecP384R1Field.SquareN(r, 64, r);
- SecP384R1Field.Multiply(r, x1, r);
-
- SecP384R1Field.SquareN(r, 30, t1);
- SecP384R1Field.Square(t1, t2);
-
- return Nat.Eq(12, x1, t2) ? new SecP384R1FieldElement(t1) : null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecP384R1FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecP384R1FieldElement);
- }
-
- public virtual bool Equals(SecP384R1FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat.Eq(12, x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 12);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP384R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecP384R1Point.cs
deleted file mode 100644
index 83159ce..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP384R1Point.cs
+++ /dev/null
@@ -1,280 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP384R1Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecP384R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(bool)}
- */
- public SecP384R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecP384R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecP384R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SecP384R1FieldElement X1 = (SecP384R1FieldElement)this.RawXCoord, Y1 = (SecP384R1FieldElement)this.RawYCoord;
- SecP384R1FieldElement X2 = (SecP384R1FieldElement)b.RawXCoord, Y2 = (SecP384R1FieldElement)b.RawYCoord;
-
- SecP384R1FieldElement Z1 = (SecP384R1FieldElement)this.RawZCoords[0];
- SecP384R1FieldElement Z2 = (SecP384R1FieldElement)b.RawZCoords[0];
-
- uint c;
- uint[] tt1 = Nat.Create(24);
- uint[] tt2 = Nat.Create(24);
- uint[] t3 = Nat.Create(12);
- uint[] t4 = Nat.Create(12);
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SecP384R1Field.Square(Z1.x, S2);
-
- U2 = tt2;
- SecP384R1Field.Multiply(S2, X2.x, U2);
-
- SecP384R1Field.Multiply(S2, Z1.x, S2);
- SecP384R1Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SecP384R1Field.Square(Z2.x, S1);
-
- U1 = tt1;
- SecP384R1Field.Multiply(S1, X1.x, U1);
-
- SecP384R1Field.Multiply(S1, Z2.x, S1);
- SecP384R1Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat.Create(12);
- SecP384R1Field.Subtract(U1, U2, H);
-
- uint[] R = Nat.Create(12);
- SecP384R1Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat.IsZero(12, H))
- {
- if (Nat.IsZero(12, R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SecP384R1Field.Square(H, HSquared);
-
- uint[] G = Nat.Create(12);
- SecP384R1Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SecP384R1Field.Multiply(HSquared, U1, V);
-
- SecP384R1Field.Negate(G, G);
- Nat384.Mul(S1, G, tt1);
-
- c = Nat.AddBothTo(12, V, V, G);
- SecP384R1Field.Reduce32(c, G);
-
- SecP384R1FieldElement X3 = new SecP384R1FieldElement(t4);
- SecP384R1Field.Square(R, X3.x);
- SecP384R1Field.Subtract(X3.x, G, X3.x);
-
- SecP384R1FieldElement Y3 = new SecP384R1FieldElement(G);
- SecP384R1Field.Subtract(V, X3.x, Y3.x);
- Nat384.Mul(Y3.x, R, tt2);
- SecP384R1Field.AddExt(tt1, tt2, tt1);
- SecP384R1Field.Reduce(tt1, Y3.x);
-
- SecP384R1FieldElement Z3 = new SecP384R1FieldElement(H);
- if (!Z1IsOne)
- {
- SecP384R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SecP384R1Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[] { Z3 };
-
- return new SecP384R1Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SecP384R1FieldElement Y1 = (SecP384R1FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SecP384R1FieldElement X1 = (SecP384R1FieldElement)this.RawXCoord, Z1 = (SecP384R1FieldElement)this.RawZCoords[0];
-
- uint c;
- uint[] t1 = Nat.Create(12);
- uint[] t2 = Nat.Create(12);
-
- uint[] Y1Squared = Nat.Create(12);
- SecP384R1Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat.Create(12);
- SecP384R1Field.Square(Y1Squared, T);
-
- bool Z1IsOne = Z1.IsOne;
-
- uint[] Z1Squared = Z1.x;
- if (!Z1IsOne)
- {
- Z1Squared = t2;
- SecP384R1Field.Square(Z1.x, Z1Squared);
- }
-
- SecP384R1Field.Subtract(X1.x, Z1Squared, t1);
-
- uint[] M = t2;
- SecP384R1Field.Add(X1.x, Z1Squared, M);
- SecP384R1Field.Multiply(M, t1, M);
- c = Nat.AddBothTo(12, M, M, M);
- SecP384R1Field.Reduce32(c, M);
-
- uint[] S = Y1Squared;
- SecP384R1Field.Multiply(Y1Squared, X1.x, S);
- c = Nat.ShiftUpBits(12, S, 2, 0);
- SecP384R1Field.Reduce32(c, S);
-
- c = Nat.ShiftUpBits(12, T, 3, 0, t1);
- SecP384R1Field.Reduce32(c, t1);
-
- SecP384R1FieldElement X3 = new SecP384R1FieldElement(T);
- SecP384R1Field.Square(M, X3.x);
- SecP384R1Field.Subtract(X3.x, S, X3.x);
- SecP384R1Field.Subtract(X3.x, S, X3.x);
-
- SecP384R1FieldElement Y3 = new SecP384R1FieldElement(S);
- SecP384R1Field.Subtract(S, X3.x, Y3.x);
- SecP384R1Field.Multiply(Y3.x, M, Y3.x);
- SecP384R1Field.Subtract(Y3.x, t1, Y3.x);
-
- SecP384R1FieldElement Z3 = new SecP384R1FieldElement(M);
- SecP384R1Field.Twice(Y1.x, Z3.x);
- if (!Z1IsOne)
- {
- SecP384R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SecP384R1Point(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between TwicePlus and ThreeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SecP384R1Point(Curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP521R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecP521R1Curve.cs
deleted file mode 100644
index e5083c7..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP521R1Curve.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP521R1Curve
- : AbstractFpCurve
- {
- public static readonly BigInteger q = new BigInteger(1,
- Hex.Decode("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"));
-
- private const int SecP521R1_DEFAULT_COORDS = COORD_JACOBIAN;
-
- protected readonly SecP521R1Point m_infinity;
-
- public SecP521R1Curve()
- : base(q)
- {
- this.m_infinity = new SecP521R1Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1,
- Hex.Decode("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC")));
- this.m_b = FromBigInteger(new BigInteger(1,
- Hex.Decode("0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00")));
- this.m_order = new BigInteger(1, Hex.Decode("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409"));
- this.m_cofactor = BigInteger.One;
- this.m_coord = SecP521R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecP521R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_JACOBIAN:
- return true;
- default:
- return false;
- }
- }
-
- public virtual BigInteger Q
- {
- get { return q; }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return q.BitLength; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecP521R1FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecP521R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecP521R1Point(this, x, y, zs, withCompression);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP521R1Field.cs b/BCCrypto/src/math/ec/custom/sec/SecP521R1Field.cs
deleted file mode 100644
index b7f8eb1..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP521R1Field.cs
+++ /dev/null
@@ -1,155 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP521R1Field
- {
- // 2^521 - 1
- internal static readonly uint[] P = new uint[]{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
- 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FF };
- private const int P16 = 0x1FF;
-
- public static void Add(uint[] x, uint[] y, uint[] z)
- {
- uint c = Nat.Add(16, x, y, z) + x[16] + y[16];
- if (c > P16 || (c == P16 && Nat.Eq(16, z, P)))
- {
- c += Nat.Inc(16, z);
- c &= P16;
- }
- z[16] = c;
- }
-
- public static void AddOne(uint[] x, uint[] z)
- {
- uint c = Nat.Inc(16, x, z) + x[16];
- if (c > P16 || (c == P16 && Nat.Eq(16, z, P)))
- {
- c += Nat.Inc(16, z);
- c &= P16;
- }
- z[16] = c;
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- uint[] z = Nat.FromBigInteger(521, x);
- if (Nat.Eq(17, z, P))
- {
- Nat.Zero(17, z);
- }
- return z;
- }
-
- public static void Half(uint[] x, uint[] z)
- {
- uint x16 = x[16];
- uint c = Nat.ShiftDownBit(16, x, x16, z);
- z[16] = (x16 >> 1) | (c >> 23);
- }
-
- public static void Multiply(uint[] x, uint[] y, uint[] z)
- {
- uint[] tt = Nat.Create(33);
- ImplMultiply(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void Negate(uint[] x, uint[] z)
- {
- if (Nat.IsZero(17, x))
- {
- Nat.Zero(17, z);
- }
- else
- {
- Nat.Sub(17, P, x, z);
- }
- }
-
- public static void Reduce(uint[] xx, uint[] z)
- {
- Debug.Assert(xx[32] >> 18 == 0);
- uint xx32 = xx[32];
- uint c = Nat.ShiftDownBits(16, xx, 16, 9, xx32, z, 0) >> 23;
- c += xx32 >> 9;
- c += Nat.AddTo(16, xx, z);
- if (c > P16 || (c == P16 && Nat.Eq(16, z, P)))
- {
- c += Nat.Inc(16, z);
- c &= P16;
- }
- z[16] = c;
- }
-
- public static void Reduce23(uint[] z)
- {
- uint z16 = z[16];
- uint c = Nat.AddWordTo(16, z16 >> 9, z) + (z16 & P16);
- if (c > P16 || (c == P16 && Nat.Eq(16, z, P)))
- {
- c += Nat.Inc(16, z);
- c &= P16;
- }
- z[16] = c;
- }
-
- public static void Square(uint[] x, uint[] z)
- {
- uint[] tt = Nat.Create(33);
- ImplSquare(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareN(uint[] x, int n, uint[] z)
- {
- Debug.Assert(n > 0);
- uint[] tt = Nat.Create(33);
- ImplSquare(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- ImplSquare(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static void Subtract(uint[] x, uint[] y, uint[] z)
- {
- int c = Nat.Sub(16, x, y, z) + (int)(x[16] - y[16]);
- if (c < 0)
- {
- c += Nat.Dec(16, z);
- c &= P16;
- }
- z[16] = (uint)c;
- }
-
- public static void Twice(uint[] x, uint[] z)
- {
- uint x16 = x[16];
- uint c = Nat.ShiftUpBit(16, x, x16 << 23, z) | (x16 << 1);
- z[16] = c & P16;
- }
-
- protected static void ImplMultiply(uint[] x, uint[] y, uint[] zz)
- {
- Nat512.Mul(x, y, zz);
-
- uint x16 = x[16], y16 = y[16];
- zz[32] = Nat.Mul31BothAdd(16, x16, y, y16, x, zz, 16) + (x16 * y16);
- }
-
- protected static void ImplSquare(uint[] x, uint[] zz)
- {
- Nat512.Square(x, zz);
-
- uint x16 = x[16];
- zz[32] = Nat.MulWordAddTo(16, x16 << 1, x, 0, zz, 16) + (x16 * x16);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP521R1FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecP521R1FieldElement.cs
deleted file mode 100644
index 6f02a7e..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP521R1FieldElement.cs
+++ /dev/null
@@ -1,167 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP521R1FieldElement
- : ECFieldElement
- {
- public static readonly BigInteger Q = SecP521R1Curve.q;
-
- protected internal readonly uint[] x;
-
- public SecP521R1FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.CompareTo(Q) >= 0)
- throw new ArgumentException("value invalid for SecP521R1FieldElement", "x");
-
- this.x = SecP521R1Field.FromBigInteger(x);
- }
-
- public SecP521R1FieldElement()
- {
- this.x = Nat.Create(17);
- }
-
- protected internal SecP521R1FieldElement(uint[] x)
- {
- this.x = x;
- }
-
- public override bool IsZero
- {
- get { return Nat.IsZero(17, x); }
- }
-
- public override bool IsOne
- {
- get { return Nat.IsOne(17, x); }
- }
-
- public override bool TestBitZero()
- {
- return Nat.GetBit(x, 0) == 1;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat.ToBigInteger(17, x);
- }
-
- public override string FieldName
- {
- get { return "SecP521R1Field"; }
- }
-
- public override int FieldSize
- {
- get { return Q.BitLength; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- uint[] z = Nat.Create(17);
- SecP521R1Field.Add(x, ((SecP521R1FieldElement)b).x, z);
- return new SecP521R1FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- uint[] z = Nat.Create(17);
- SecP521R1Field.AddOne(x, z);
- return new SecP521R1FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- uint[] z = Nat.Create(17);
- SecP521R1Field.Subtract(x, ((SecP521R1FieldElement)b).x, z);
- return new SecP521R1FieldElement(z);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- uint[] z = Nat.Create(17);
- SecP521R1Field.Multiply(x, ((SecP521R1FieldElement)b).x, z);
- return new SecP521R1FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- //return Multiply(b.Invert());
- uint[] z = Nat.Create(17);
- Mod.Invert(SecP521R1Field.P, ((SecP521R1FieldElement)b).x, z);
- SecP521R1Field.Multiply(z, x, z);
- return new SecP521R1FieldElement(z);
- }
-
- public override ECFieldElement Negate()
- {
- uint[] z = Nat.Create(17);
- SecP521R1Field.Negate(x, z);
- return new SecP521R1FieldElement(z);
- }
-
- public override ECFieldElement Square()
- {
- uint[] z = Nat.Create(17);
- SecP521R1Field.Square(x, z);
- return new SecP521R1FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- //return new SecP521R1FieldElement(ToBigInteger().ModInverse(Q));
- uint[] z = Nat.Create(17);
- Mod.Invert(SecP521R1Field.P, x, z);
- return new SecP521R1FieldElement(z);
- }
-
- /**
- * return a sqrt root - the routine verifies that the calculation returns the right value - if
- * none exists it returns null.
- */
- public override ECFieldElement Sqrt()
- {
- // Raise this element to the exponent 2^519
-
- uint[] x1 = this.x;
- if (Nat.IsZero(17, x1) || Nat.IsOne(17, x1))
- return this;
-
- uint[] t1 = Nat.Create(17);
- uint[] t2 = Nat.Create(17);
-
- SecP521R1Field.SquareN(x1, 519, t1);
- SecP521R1Field.Square(t1, t2);
-
- return Nat.Eq(17, x1, t2) ? new SecP521R1FieldElement(t1) : null;
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecP521R1FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecP521R1FieldElement);
- }
-
- public virtual bool Equals(SecP521R1FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat.Eq(17, x, other.x);
- }
-
- public override int GetHashCode()
- {
- return Q.GetHashCode() ^ Arrays.GetHashCode(x, 0, 17);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecP521R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecP521R1Point.cs
deleted file mode 100644
index 7ad97f7..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecP521R1Point.cs
+++ /dev/null
@@ -1,275 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecP521R1Point
- : AbstractFpPoint
- {
- /**
- * Create a point which encodes with point compression.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- *
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecP521R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * Create a point that encodes with or without point compresion.
- *
- * @param curve
- * the curve to use
- * @param x
- * affine x co-ordinate
- * @param y
- * affine y co-ordinate
- * @param withCompression
- * if true encode with point compression
- *
- * @deprecated per-point compression property will be removed, refer
- * {@link #getEncoded(bool)}
- */
- public SecP521R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecP521R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecP521R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
- if (this == b)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- SecP521R1FieldElement X1 = (SecP521R1FieldElement)this.RawXCoord, Y1 = (SecP521R1FieldElement)this.RawYCoord;
- SecP521R1FieldElement X2 = (SecP521R1FieldElement)b.RawXCoord, Y2 = (SecP521R1FieldElement)b.RawYCoord;
-
- SecP521R1FieldElement Z1 = (SecP521R1FieldElement)this.RawZCoords[0];
- SecP521R1FieldElement Z2 = (SecP521R1FieldElement)b.RawZCoords[0];
-
- uint[] t1 = Nat.Create(17);
- uint[] t2 = Nat.Create(17);
- uint[] t3 = Nat.Create(17);
- uint[] t4 = Nat.Create(17);
-
- bool Z1IsOne = Z1.IsOne;
- uint[] U2, S2;
- if (Z1IsOne)
- {
- U2 = X2.x;
- S2 = Y2.x;
- }
- else
- {
- S2 = t3;
- SecP521R1Field.Square(Z1.x, S2);
-
- U2 = t2;
- SecP521R1Field.Multiply(S2, X2.x, U2);
-
- SecP521R1Field.Multiply(S2, Z1.x, S2);
- SecP521R1Field.Multiply(S2, Y2.x, S2);
- }
-
- bool Z2IsOne = Z2.IsOne;
- uint[] U1, S1;
- if (Z2IsOne)
- {
- U1 = X1.x;
- S1 = Y1.x;
- }
- else
- {
- S1 = t4;
- SecP521R1Field.Square(Z2.x, S1);
-
- U1 = t1;
- SecP521R1Field.Multiply(S1, X1.x, U1);
-
- SecP521R1Field.Multiply(S1, Z2.x, S1);
- SecP521R1Field.Multiply(S1, Y1.x, S1);
- }
-
- uint[] H = Nat.Create(17);
- SecP521R1Field.Subtract(U1, U2, H);
-
- uint[] R = t2;
- SecP521R1Field.Subtract(S1, S2, R);
-
- // Check if b == this or b == -this
- if (Nat.IsZero(17, H))
- {
- if (Nat.IsZero(17, R))
- {
- // this == b, i.e. this must be doubled
- return this.Twice();
- }
-
- // this == -b, i.e. the result is the point at infinity
- return curve.Infinity;
- }
-
- uint[] HSquared = t3;
- SecP521R1Field.Square(H, HSquared);
-
- uint[] G = Nat.Create(17);
- SecP521R1Field.Multiply(HSquared, H, G);
-
- uint[] V = t3;
- SecP521R1Field.Multiply(HSquared, U1, V);
-
- SecP521R1Field.Multiply(S1, G, t1);
-
- SecP521R1FieldElement X3 = new SecP521R1FieldElement(t4);
- SecP521R1Field.Square(R, X3.x);
- SecP521R1Field.Add(X3.x, G, X3.x);
- SecP521R1Field.Subtract(X3.x, V, X3.x);
- SecP521R1Field.Subtract(X3.x, V, X3.x);
-
- SecP521R1FieldElement Y3 = new SecP521R1FieldElement(G);
- SecP521R1Field.Subtract(V, X3.x, Y3.x);
- SecP521R1Field.Multiply(Y3.x, R, t2);
- SecP521R1Field.Subtract(t2, t1, Y3.x);
-
- SecP521R1FieldElement Z3 = new SecP521R1FieldElement(H);
- if (!Z1IsOne)
- {
- SecP521R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
- if (!Z2IsOne)
- {
- SecP521R1Field.Multiply(Z3.x, Z2.x, Z3.x);
- }
-
- ECFieldElement[] zs = new ECFieldElement[] { Z3 };
-
- return new SecP521R1Point(curve, X3, Y3, zs, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- SecP521R1FieldElement Y1 = (SecP521R1FieldElement)this.RawYCoord;
- if (Y1.IsZero)
- return curve.Infinity;
-
- SecP521R1FieldElement X1 = (SecP521R1FieldElement)this.RawXCoord, Z1 = (SecP521R1FieldElement)this.RawZCoords[0];
-
- uint[] t1 = Nat.Create(17);
- uint[] t2 = Nat.Create(17);
-
- uint[] Y1Squared = Nat.Create(17);
- SecP521R1Field.Square(Y1.x, Y1Squared);
-
- uint[] T = Nat.Create(17);
- SecP521R1Field.Square(Y1Squared, T);
-
- bool Z1IsOne = Z1.IsOne;
-
- uint[] Z1Squared = Z1.x;
- if (!Z1IsOne)
- {
- Z1Squared = t2;
- SecP521R1Field.Square(Z1.x, Z1Squared);
- }
-
- SecP521R1Field.Subtract(X1.x, Z1Squared, t1);
-
- uint[] M = t2;
- SecP521R1Field.Add(X1.x, Z1Squared, M);
- SecP521R1Field.Multiply(M, t1, M);
- Nat.AddBothTo(17, M, M, M);
- SecP521R1Field.Reduce23(M);
-
- uint[] S = Y1Squared;
- SecP521R1Field.Multiply(Y1Squared, X1.x, S);
- Nat.ShiftUpBits(17, S, 2, 0);
- SecP521R1Field.Reduce23(S);
-
- Nat.ShiftUpBits(17, T, 3, 0, t1);
- SecP521R1Field.Reduce23(t1);
-
- SecP521R1FieldElement X3 = new SecP521R1FieldElement(T);
- SecP521R1Field.Square(M, X3.x);
- SecP521R1Field.Subtract(X3.x, S, X3.x);
- SecP521R1Field.Subtract(X3.x, S, X3.x);
-
- SecP521R1FieldElement Y3 = new SecP521R1FieldElement(S);
- SecP521R1Field.Subtract(S, X3.x, Y3.x);
- SecP521R1Field.Multiply(Y3.x, M, Y3.x);
- SecP521R1Field.Subtract(Y3.x, t1, Y3.x);
-
- SecP521R1FieldElement Z3 = new SecP521R1FieldElement(M);
- SecP521R1Field.Twice(Y1.x, Z3.x);
- if (!Z1IsOne)
- {
- SecP521R1Field.Multiply(Z3.x, Z1.x, Z3.x);
- }
-
- return new SecP521R1Point(curve, X3, Y3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this == b)
- return ThreeTimes();
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECFieldElement Y1 = this.RawYCoord;
- if (Y1.IsZero)
- return b;
-
- return Twice().Add(b);
- }
-
- public override ECPoint ThreeTimes()
- {
- if (this.IsInfinity || this.RawYCoord.IsZero)
- return this;
-
- // NOTE: Be careful about recursions between TwicePlus and ThreeTimes
- return Twice().Add(this);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- return new SecP521R1Point(Curve, RawXCoord, RawYCoord.Negate(), RawZCoords, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT113Field.cs b/BCCrypto/src/math/ec/custom/sec/SecT113Field.cs
deleted file mode 100644
index 49773b6..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT113Field.cs
+++ /dev/null
@@ -1,225 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT113Field
- {
- private const ulong M49 = ulong.MaxValue >> 15;
- private const ulong M57 = ulong.MaxValue >> 7;
-
- public static void Add(ulong[] x, ulong[] y, ulong[] z)
- {
- z[0] = x[0] ^ y[0];
- z[1] = x[1] ^ y[1];
- }
-
- public static void AddExt(ulong[] xx, ulong[] yy, ulong[] zz)
- {
- zz[0] = xx[0] ^ yy[0];
- zz[1] = xx[1] ^ yy[1];
- zz[2] = xx[2] ^ yy[2];
- zz[3] = xx[3] ^ yy[3];
- }
-
- public static void AddOne(ulong[] x, ulong[] z)
- {
- z[0] = x[0] ^ 1UL;
- z[1] = x[1];
- }
-
- public static ulong[] FromBigInteger(BigInteger x)
- {
- ulong[] z = Nat128.FromBigInteger64(x);
- Reduce15(z, 0);
- return z;
- }
-
- public static void Invert(ulong[] x, ulong[] z)
- {
- if (Nat128.IsZero64(x))
- throw new InvalidOperationException();
-
- // Itoh-Tsujii inversion
-
- ulong[] t0 = Nat128.Create64();
- ulong[] t1 = Nat128.Create64();
-
- Square(x, t0);
- Multiply(t0, x, t0);
- Square(t0, t0);
- Multiply(t0, x, t0);
- SquareN(t0, 3, t1);
- Multiply(t1, t0, t1);
- Square(t1, t1);
- Multiply(t1, x, t1);
- SquareN(t1, 7, t0);
- Multiply(t0, t1, t0);
- SquareN(t0, 14, t1);
- Multiply(t1, t0, t1);
- SquareN(t1, 28, t0);
- Multiply(t0, t1, t0);
- SquareN(t0, 56, t1);
- Multiply(t1, t0, t1);
- Square(t1, z);
- }
-
- public static void Multiply(ulong[] x, ulong[] y, ulong[] z)
- {
- ulong[] tt = Nat128.CreateExt64();
- ImplMultiply(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz)
- {
- ulong[] tt = Nat128.CreateExt64();
- ImplMultiply(x, y, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void Reduce(ulong[] xx, ulong[] z)
- {
- ulong x0 = xx[0], x1 = xx[1], x2 = xx[2], x3 = xx[3];
-
- x1 ^= (x3 << 15) ^ (x3 << 24);
- x2 ^= (x3 >> 49) ^ (x3 >> 40);
-
- x0 ^= (x2 << 15) ^ (x2 << 24);
- x1 ^= (x2 >> 49) ^ (x2 >> 40);
-
- ulong t = x1 >> 49;
- z[0] = x0 ^ t ^ (t << 9);
- z[1] = x1 & M49;
- }
-
- public static void Reduce15(ulong[] z, int zOff)
- {
- ulong z1 = z[zOff + 1], t = z1 >> 49;
- z[zOff ] ^= t ^ (t << 9);
- z[zOff + 1] = z1 & M49;
- }
-
- public static void Sqrt(ulong[] x, ulong[] z)
- {
- ulong u0 = Interleave.Unshuffle(x[0]), u1 = Interleave.Unshuffle(x[1]);
- ulong e0 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- ulong c0 = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- z[0] = e0 ^ (c0 << 57) ^ (c0 << 5);
- z[1] = (c0 >> 7) ^ (c0 >> 59);
- }
-
- public static void Square(ulong[] x, ulong[] z)
- {
- ulong[] tt = Nat128.CreateExt64();
- ImplSquare(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareAddToExt(ulong[] x, ulong[] zz)
- {
- ulong[] tt = Nat128.CreateExt64();
- ImplSquare(x, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void SquareN(ulong[] x, int n, ulong[] z)
- {
- Debug.Assert(n > 0);
-
- ulong[] tt = Nat128.CreateExt64();
- ImplSquare(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- ImplSquare(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static uint Trace(ulong[] x)
- {
- // Non-zero-trace bits: 0
- return (uint)(x[0]) & 1U;
- }
-
- protected static void ImplMultiply(ulong[] x, ulong[] y, ulong[] zz)
- {
- /*
- * "Three-way recursion" as described in "Batch binary Edwards", Daniel J. Bernstein.
- */
-
- ulong f0 = x[0], f1 = x[1];
- f1 = ((f0 >> 57) ^ (f1 << 7)) & M57;
- f0 &= M57;
-
- ulong g0 = y[0], g1 = y[1];
- g1 = ((g0 >> 57) ^ (g1 << 7)) & M57;
- g0 &= M57;
-
- ulong[] H = new ulong[6];
-
- ImplMulw(f0, g0, H, 0); // H(0) 57/56 bits
- ImplMulw(f1, g1, H, 2); // H(INF) 57/54 bits
- ImplMulw(f0 ^ f1, g0 ^ g1, H, 4); // H(1) 57/56 bits
-
- ulong r = H[1] ^ H[2];
- ulong z0 = H[0],
- z3 = H[3],
- z1 = H[4] ^ z0 ^ r,
- z2 = H[5] ^ z3 ^ r;
-
- zz[0] = z0 ^ (z1 << 57);
- zz[1] = (z1 >> 7) ^ (z2 << 50);
- zz[2] = (z2 >> 14) ^ (z3 << 43);
- zz[3] = (z3 >> 21);
- }
-
- protected static void ImplMulw(ulong x, ulong y, ulong[] z, int zOff)
- {
- Debug.Assert(x >> 57 == 0);
- Debug.Assert(y >> 57 == 0);
-
- ulong[] u = new ulong[8];
- //u[0] = 0;
- u[1] = y;
- u[2] = u[1] << 1;
- u[3] = u[2] ^ y;
- u[4] = u[2] << 1;
- u[5] = u[4] ^ y;
- u[6] = u[3] << 1;
- u[7] = u[6] ^ y;
-
- uint j = (uint)x;
- ulong g, h = 0, l = u[j & 7];
- int k = 48;
- do
- {
- j = (uint)(x >> k);
- g = u[j & 7]
- ^ u[(j >> 3) & 7] << 3
- ^ u[(j >> 6) & 7] << 6;
- l ^= (g << k);
- h ^= (g >> -k);
- }
- while ((k -= 9) > 0);
-
- h ^= ((x & 0x0100804020100800UL) & (ulong)(((long)y << 7) >> 63)) >> 8;
-
- Debug.Assert(h >> 49 == 0);
-
- z[zOff ] = l & M57;
- z[zOff + 1] = (l >> 57) ^ (h << 7);
- }
-
- protected static void ImplSquare(ulong[] x, ulong[] zz)
- {
- Interleave.Expand64To128(x[0], zz, 0);
- Interleave.Expand64To128(x[1], zz, 2);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT113FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecT113FieldElement.cs
deleted file mode 100644
index 9ba25d9..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT113FieldElement.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT113FieldElement
- : ECFieldElement
- {
- protected internal readonly ulong[] x;
-
- public SecT113FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.BitLength > 113)
- throw new ArgumentException("value invalid for SecT113FieldElement", "x");
-
- this.x = SecT113Field.FromBigInteger(x);
- }
-
- public SecT113FieldElement()
- {
- this.x = Nat128.Create64();
- }
-
- protected internal SecT113FieldElement(ulong[] x)
- {
- this.x = x;
- }
-
- public override bool IsOne
- {
- get { return Nat128.IsOne64(x); }
- }
-
- public override bool IsZero
- {
- get { return Nat128.IsZero64(x); }
- }
-
- public override bool TestBitZero()
- {
- return (x[0] & 1L) != 0L;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat128.ToBigInteger64(x);
- }
-
- public override string FieldName
- {
- get { return "SecT113Field"; }
- }
-
- public override int FieldSize
- {
- get { return 113; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- ulong[] z = Nat128.Create64();
- SecT113Field.Add(x, ((SecT113FieldElement)b).x, z);
- return new SecT113FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- ulong[] z = Nat128.Create64();
- SecT113Field.AddOne(x, z);
- return new SecT113FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- // Addition and Subtraction are the same in F2m
- return Add(b);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- ulong[] z = Nat128.Create64();
- SecT113Field.Multiply(x, ((SecT113FieldElement)b).x, z);
- return new SecT113FieldElement(z);
- }
-
- public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- return MultiplyPlusProduct(b, x, y);
- }
-
- public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x, bx = ((SecT113FieldElement)b).x;
- ulong[] xx = ((SecT113FieldElement)x).x, yx = ((SecT113FieldElement)y).x;
-
- ulong[] tt = Nat128.CreateExt64();
- SecT113Field.MultiplyAddToExt(ax, bx, tt);
- SecT113Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat128.Create64();
- SecT113Field.Reduce(tt, z);
- return new SecT113FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- return Multiply(b.Invert());
- }
-
- public override ECFieldElement Negate()
- {
- return this;
- }
-
- public override ECFieldElement Square()
- {
- ulong[] z = Nat128.Create64();
- SecT113Field.Square(x, z);
- return new SecT113FieldElement(z);
- }
-
- public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y)
- {
- return SquarePlusProduct(x, y);
- }
-
- public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x;
- ulong[] xx = ((SecT113FieldElement)x).x, yx = ((SecT113FieldElement)y).x;
-
- ulong[] tt = Nat128.CreateExt64();
- SecT113Field.SquareAddToExt(ax, tt);
- SecT113Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat128.Create64();
- SecT113Field.Reduce(tt, z);
- return new SecT113FieldElement(z);
- }
-
- public override ECFieldElement SquarePow(int pow)
- {
- if (pow < 1)
- return this;
-
- ulong[] z = Nat128.Create64();
- SecT113Field.SquareN(x, pow, z);
- return new SecT113FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- ulong[] z = Nat128.Create64();
- SecT113Field.Invert(x, z);
- return new SecT113FieldElement(z);
- }
-
- public override ECFieldElement Sqrt()
- {
- ulong[] z = Nat128.Create64();
- SecT113Field.Sqrt(x, z);
- return new SecT113FieldElement(z);
- }
-
- public virtual int Representation
- {
- get { return F2mFieldElement.Tpb; }
- }
-
- public virtual int M
- {
- get { return 113; }
- }
-
- public virtual int K1
- {
- get { return 9; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecT113FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecT113FieldElement);
- }
-
- public virtual bool Equals(SecT113FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat128.Eq64(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return 113009 ^ Arrays.GetHashCode(x, 0, 2);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT113R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT113R1Curve.cs
deleted file mode 100644
index 2705c94..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT113R1Curve.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT113R1Curve
- : AbstractF2mCurve
- {
- private const int SecT113R1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT113R1Point m_infinity;
-
- public SecT113R1Curve()
- : base(113, 9, 0, 0)
- {
- this.m_infinity = new SecT113R1Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1, Hex.Decode("003088250CA6E7C7FE649CE85820F7")));
- this.m_b = FromBigInteger(new BigInteger(1, Hex.Decode("00E8BEE4D3E2260744188BE0E9C723")));
- this.m_order = new BigInteger(1, Hex.Decode("0100000000000000D9CCEC8A39E56F"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT113R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT113R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 113; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT113FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT113R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT113R1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return false; }
- }
-
- public virtual int M
- {
- get { return 113; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return true; }
- }
-
- public virtual int K1
- {
- get { return 9; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT113R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT113R1Point.cs
deleted file mode 100644
index 6ecc8b0..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT113R1Point.cs
+++ /dev/null
@@ -1,281 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT113R1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT113R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT113R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT113R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT113R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).Add(curve.A);
- if (X3.IsZero)
- {
- return new SecT113R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT113R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT113R1Point(curve, X3, L3, new ECFieldElement[]{ Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement a = curve.A;
- ECFieldElement aZ1Sq = Z1IsOne ? a : a.Multiply(Z1Sq);
- ECFieldElement T = L1.Square().Add(L1Z1).Add(aZ1Sq);
- if (T.IsZero)
- {
- return new SecT113R1Point(curve, T, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
-
- return new SecT113R1Point(curve, X3, L3, new ECFieldElement[]{ Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = curve.A.Multiply(Z1Sq).Add(L1Sq).Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = curve.A.Add(L2plus1).Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT113R1Point(curve, A, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new SecT113R1Point(curve, X3, L3, new ECFieldElement[]{ Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT113R1Point(Curve, X, L.Add(Z), new ECFieldElement[]{ Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT113R2Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT113R2Curve.cs
deleted file mode 100644
index abfd26d..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT113R2Curve.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT113R2Curve
- : AbstractF2mCurve
- {
- private const int SecT113R2_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT113R2Point m_infinity;
-
- public SecT113R2Curve()
- : base(113, 9, 0, 0)
- {
- this.m_infinity = new SecT113R2Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1, Hex.Decode("00689918DBEC7E5A0DD6DFC0AA55C7")));
- this.m_b = FromBigInteger(new BigInteger(1, Hex.Decode("0095E9A9EC9B297BD4BF36E059184F")));
- this.m_order = new BigInteger(1, Hex.Decode("010000000000000108789B2496AF93"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT113R2_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT113R2Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 113; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT113FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT113R2Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT113R2Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return false; }
- }
-
- public virtual int M
- {
- get { return 113; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return true; }
- }
-
- public virtual int K1
- {
- get { return 9; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT113R2Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT113R2Point.cs
deleted file mode 100644
index 1453d78..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT113R2Point.cs
+++ /dev/null
@@ -1,291 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT113R2Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT113R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT113R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT113R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT113R2Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- {
- return b;
- }
- if (b.IsInfinity)
- {
- return this;
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).Add(curve.A);
- if (X3.IsZero)
- {
- return new SecT113R2Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT113R2Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT113R2Point(curve, X3, L3, new ECFieldElement[]{ Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- {
- return this;
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement a = curve.A;
- ECFieldElement aZ1Sq = Z1IsOne ? a : a.Multiply(Z1Sq);
- ECFieldElement T = L1.Square().Add(L1Z1).Add(aZ1Sq);
- if (T.IsZero)
- {
- return new SecT113R2Point(curve, T, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
-
- return new SecT113R2Point(curve, X3, L3, new ECFieldElement[]{ Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- {
- return b;
- }
- if (b.IsInfinity)
- {
- return Twice();
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = curve.A.Multiply(Z1Sq).Add(L1Sq).Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = curve.A.Add(L2plus1).Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT113R2Point(curve, A, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new SecT113R2Point(curve, X3, L3, new ECFieldElement[]{ Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT113R2Point(Curve, X, L.Add(Z), new ECFieldElement[]{ Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT131Field.cs b/BCCrypto/src/math/ec/custom/sec/SecT131Field.cs
deleted file mode 100644
index 1b6697a..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT131Field.cs
+++ /dev/null
@@ -1,330 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT131Field
- {
- private const ulong M03 = ulong.MaxValue >> 61;
- private const ulong M44 = ulong.MaxValue >> 20;
-
- private static readonly ulong[] ROOT_Z = new ulong[]{ 0x26BC4D789AF13523UL, 0x26BC4D789AF135E2UL, 0x6UL };
-
- public static void Add(ulong[] x, ulong[] y, ulong[] z)
- {
- z[0] = x[0] ^ y[0];
- z[1] = x[1] ^ y[1];
- z[2] = x[2] ^ y[2];
- }
-
- public static void AddExt(ulong[] xx, ulong[] yy, ulong[] zz)
- {
- zz[0] = xx[0] ^ yy[0];
- zz[1] = xx[1] ^ yy[1];
- zz[2] = xx[2] ^ yy[2];
- zz[3] = xx[3] ^ yy[3];
- zz[4] = xx[4] ^ yy[4];
- }
-
- public static void AddOne(ulong[] x, ulong[] z)
- {
- z[0] = x[0] ^ 1UL;
- z[1] = x[1];
- z[2] = x[2];
- }
-
- public static ulong[] FromBigInteger(BigInteger x)
- {
- ulong[] z = Nat192.FromBigInteger64(x);
- Reduce61(z, 0);
- return z;
- }
-
- public static void Invert(ulong[] x, ulong[] z)
- {
- if (Nat192.IsZero64(x))
- throw new InvalidOperationException();
-
- // Itoh-Tsujii inversion
-
- ulong[] t0 = Nat192.Create64();
- ulong[] t1 = Nat192.Create64();
-
- Square(x, t0);
- Multiply(t0, x, t0);
- SquareN(t0, 2, t1);
- Multiply(t1, t0, t1);
- SquareN(t1, 4, t0);
- Multiply(t0, t1, t0);
- SquareN(t0, 8, t1);
- Multiply(t1, t0, t1);
- SquareN(t1, 16, t0);
- Multiply(t0, t1, t0);
- SquareN(t0, 32, t1);
- Multiply(t1, t0, t1);
- Square(t1, t1);
- Multiply(t1, x, t1);
- SquareN(t1, 65, t0);
- Multiply(t0, t1, t0);
- Square(t0, z);
- }
-
- public static void Multiply(ulong[] x, ulong[] y, ulong[] z)
- {
- ulong[] tt = Nat192.CreateExt64();
- ImplMultiply(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz)
- {
- ulong[] tt = Nat192.CreateExt64();
- ImplMultiply(x, y, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void Reduce(ulong[] xx, ulong[] z)
- {
- ulong x0 = xx[0], x1 = xx[1], x2 = xx[2], x3 = xx[3], x4 = xx[4];
-
- x1 ^= (x4 << 61) ^ (x4 << 63);
- x2 ^= (x4 >> 3) ^ (x4 >> 1) ^ x4 ^ (x4 << 5);
- x3 ^= (x4 >> 59);
-
- x0 ^= (x3 << 61) ^ (x3 << 63);
- x1 ^= (x3 >> 3) ^ (x3 >> 1) ^ x3 ^ (x3 << 5);
- x2 ^= (x3 >> 59);
-
- ulong t = x2 >> 3;
- z[0] = x0 ^ t ^ (t << 2) ^ (t << 3) ^ (t << 8);
- z[1] = x1 ^ (t >> 56);
- z[2] = x2 & M03;
- }
-
- public static void Reduce61(ulong[] z, int zOff)
- {
- ulong z2 = z[zOff + 2], t = z2 >> 3;
- z[zOff ] ^= t ^ (t << 2) ^ (t << 3) ^ (t << 8);
- z[zOff + 1] ^= (t >> 56);
- z[zOff + 2] = z2 & M03;
- }
-
- public static void Sqrt(ulong[] x, ulong[] z)
- {
- ulong[] odd = Nat192.Create64();
-
- ulong u0, u1;
- u0 = Interleave.Unshuffle(x[0]); u1 = Interleave.Unshuffle(x[1]);
- ulong e0 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- odd[0] = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- u0 = Interleave.Unshuffle(x[2]);
- ulong e1 = (u0 & 0x00000000FFFFFFFFUL);
- odd[1] = (u0 >> 32);
-
- Multiply(odd, ROOT_Z, z);
-
- z[0] ^= e0;
- z[1] ^= e1;
- }
-
- public static void Square(ulong[] x, ulong[] z)
- {
- ulong[] tt = Nat.Create64(5);
- ImplSquare(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareAddToExt(ulong[] x, ulong[] zz)
- {
- ulong[] tt = Nat.Create64(5);
- ImplSquare(x, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void SquareN(ulong[] x, int n, ulong[] z)
- {
- Debug.Assert(n > 0);
-
- ulong[] tt = Nat.Create64(5);
- ImplSquare(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- ImplSquare(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static uint Trace(ulong[] x)
- {
- // Non-zero-trace bits: 0, 123, 129
- return (uint)(x[0] ^ (x[1] >> 59) ^ (x[2] >> 1)) & 1U;
- }
-
- protected static void ImplCompactExt(ulong[] zz)
- {
- ulong z0 = zz[0], z1 = zz[1], z2 = zz[2], z3 = zz[3], z4 = zz[4], z5 = zz[5];
- zz[0] = z0 ^ (z1 << 44);
- zz[1] = (z1 >> 20) ^ (z2 << 24);
- zz[2] = (z2 >> 40) ^ (z3 << 4)
- ^ (z4 << 48);
- zz[3] = (z3 >> 60) ^ (z5 << 28)
- ^ (z4 >> 16);
- zz[4] = (z5 >> 36);
- zz[5] = 0;
- }
-
- protected static void ImplMultiply(ulong[] x, ulong[] y, ulong[] zz)
- {
- /*
- * "Five-way recursion" as described in "Batch binary Edwards", Daniel J. Bernstein.
- */
-
- ulong f0 = x[0], f1 = x[1], f2 = x[2];
- f2 = ((f1 >> 24) ^ (f2 << 40)) & M44;
- f1 = ((f0 >> 44) ^ (f1 << 20)) & M44;
- f0 &= M44;
-
- ulong g0 = y[0], g1 = y[1], g2 = y[2];
- g2 = ((g1 >> 24) ^ (g2 << 40)) & M44;
- g1 = ((g0 >> 44) ^ (g1 << 20)) & M44;
- g0 &= M44;
-
- ulong[] H = new ulong[10];
-
- ImplMulw(f0, g0, H, 0); // H(0) 44/43 bits
- ImplMulw(f2, g2, H, 2); // H(INF) 44/41 bits
-
- ulong t0 = f0 ^ f1 ^ f2;
- ulong t1 = g0 ^ g1 ^ g2;
-
- ImplMulw(t0, t1, H, 4); // H(1) 44/43 bits
-
- ulong t2 = (f1 << 1) ^ (f2 << 2);
- ulong t3 = (g1 << 1) ^ (g2 << 2);
-
- ImplMulw(f0 ^ t2, g0 ^ t3, H, 6); // H(t) 44/45 bits
- ImplMulw(t0 ^ t2, t1 ^ t3, H, 8); // H(t + 1) 44/45 bits
-
- ulong t4 = H[6] ^ H[8];
- ulong t5 = H[7] ^ H[9];
-
- Debug.Assert(t5 >> 44 == 0);
-
- // Calculate V
- ulong v0 = (t4 << 1) ^ H[6];
- ulong v1 = t4 ^ (t5 << 1) ^ H[7];
- ulong v2 = t5;
-
- // Calculate U
- ulong u0 = H[0];
- ulong u1 = H[1] ^ H[0] ^ H[4];
- ulong u2 = H[1] ^ H[5];
-
- // Calculate W
- ulong w0 = u0 ^ v0 ^ (H[2] << 4) ^ (H[2] << 1);
- ulong w1 = u1 ^ v1 ^ (H[3] << 4) ^ (H[3] << 1);
- ulong w2 = u2 ^ v2;
-
- // Propagate carries
- w1 ^= (w0 >> 44); w0 &= M44;
- w2 ^= (w1 >> 44); w1 &= M44;
-
- Debug.Assert((w0 & 1UL) == 0);
-
- // Divide W by t
-
- w0 = (w0 >> 1) ^ ((w1 & 1UL) << 43);
- w1 = (w1 >> 1) ^ ((w2 & 1UL) << 43);
- w2 = (w2 >> 1);
-
- // Divide W by (t + 1)
-
- w0 ^= (w0 << 1);
- w0 ^= (w0 << 2);
- w0 ^= (w0 << 4);
- w0 ^= (w0 << 8);
- w0 ^= (w0 << 16);
- w0 ^= (w0 << 32);
-
- w0 &= M44; w1 ^= (w0 >> 43);
-
- w1 ^= (w1 << 1);
- w1 ^= (w1 << 2);
- w1 ^= (w1 << 4);
- w1 ^= (w1 << 8);
- w1 ^= (w1 << 16);
- w1 ^= (w1 << 32);
-
- w1 &= M44; w2 ^= (w1 >> 43);
-
- w2 ^= (w2 << 1);
- w2 ^= (w2 << 2);
- w2 ^= (w2 << 4);
- w2 ^= (w2 << 8);
- w2 ^= (w2 << 16);
- w2 ^= (w2 << 32);
-
- Debug.Assert(w2 >> 42 == 0);
-
- zz[0] = u0;
- zz[1] = u1 ^ w0 ^ H[2];
- zz[2] = u2 ^ w1 ^ w0 ^ H[3];
- zz[3] = w2 ^ w1;
- zz[4] = w2 ^ H[2];
- zz[5] = H[3];
-
- ImplCompactExt(zz);
- }
-
- protected static void ImplMulw(ulong x, ulong y, ulong[] z, int zOff)
- {
- Debug.Assert(x >> 45 == 0);
- Debug.Assert(y >> 45 == 0);
-
- ulong[] u = new ulong[8];
- //u[0] = 0;
- u[1] = y;
- u[2] = u[1] << 1;
- u[3] = u[2] ^ y;
- u[4] = u[2] << 1;
- u[5] = u[4] ^ y;
- u[6] = u[3] << 1;
- u[7] = u[6] ^ y;
-
- uint j = (uint)x;
- ulong g, h = 0, l = u[j & 7]
- ^ u[(j >> 3) & 7] << 3
- ^ u[(j >> 6) & 7] << 6;
- int k = 33;
- do
- {
- j = (uint)(x >> k);
- g = u[j & 7]
- ^ u[(j >> 3) & 7] << 3
- ^ u[(j >> 6) & 7] << 6
- ^ u[(j >> 9) & 7] << 9;
- l ^= (g << k);
- h ^= (g >> -k);
- }
- while ((k -= 12) > 0);
-
- Debug.Assert(h >> 25 == 0);
-
- z[zOff ] = l & M44;
- z[zOff + 1] = (l >> 44) ^ (h << 20);
- }
-
- protected static void ImplSquare(ulong[] x, ulong[] zz)
- {
- Interleave.Expand64To128(x[0], zz, 0);
- Interleave.Expand64To128(x[1], zz, 2);
-
- zz[4] = Interleave.Expand8to16((uint)x[2]);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT131FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecT131FieldElement.cs
deleted file mode 100644
index e0ecc10..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT131FieldElement.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT131FieldElement
- : ECFieldElement
- {
- protected readonly ulong[] x;
-
- public SecT131FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.BitLength > 131)
- throw new ArgumentException("value invalid for SecT131FieldElement", "x");
-
- this.x = SecT131Field.FromBigInteger(x);
- }
-
- public SecT131FieldElement()
- {
- this.x = Nat192.Create64();
- }
-
- protected internal SecT131FieldElement(ulong[] x)
- {
- this.x = x;
- }
-
- public override bool IsOne
- {
- get { return Nat192.IsOne64(x); }
- }
-
- public override bool IsZero
- {
- get { return Nat192.IsZero64(x); }
- }
-
- public override bool TestBitZero()
- {
- return (x[0] & 1UL) != 0UL;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat192.ToBigInteger64(x);
- }
-
- public override string FieldName
- {
- get { return "SecT131Field"; }
- }
-
- public override int FieldSize
- {
- get { return 131; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- ulong[] z = Nat192.Create64();
- SecT131Field.Add(x, ((SecT131FieldElement)b).x, z);
- return new SecT131FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- ulong[] z = Nat192.Create64();
- SecT131Field.AddOne(x, z);
- return new SecT131FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- // Addition and Subtraction are the same in F2m
- return Add(b);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- ulong[] z = Nat192.Create64();
- SecT131Field.Multiply(x, ((SecT131FieldElement)b).x, z);
- return new SecT131FieldElement(z);
- }
-
- public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- return MultiplyPlusProduct(b, x, y);
- }
-
- public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x, bx = ((SecT131FieldElement)b).x;
- ulong[] xx = ((SecT131FieldElement)x).x, yx = ((SecT131FieldElement)y).x;
-
- ulong[] tt = Nat.Create64(5);
- SecT131Field.MultiplyAddToExt(ax, bx, tt);
- SecT131Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat192.Create64();
- SecT131Field.Reduce(tt, z);
- return new SecT131FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- return Multiply(b.Invert());
- }
-
- public override ECFieldElement Negate()
- {
- return this;
- }
-
- public override ECFieldElement Square()
- {
- ulong[] z = Nat192.Create64();
- SecT131Field.Square(x, z);
- return new SecT131FieldElement(z);
- }
-
- public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y)
- {
- return SquarePlusProduct(x, y);
- }
-
- public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x;
- ulong[] xx = ((SecT131FieldElement)x).x, yx = ((SecT131FieldElement)y).x;
-
- ulong[] tt = Nat.Create64(5);
- SecT131Field.SquareAddToExt(ax, tt);
- SecT131Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat192.Create64();
- SecT131Field.Reduce(tt, z);
- return new SecT131FieldElement(z);
- }
-
- public override ECFieldElement SquarePow(int pow)
- {
- if (pow < 1)
- return this;
-
- ulong[] z = Nat192.Create64();
- SecT131Field.SquareN(x, pow, z);
- return new SecT131FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- ulong[] z = Nat192.Create64();
- SecT131Field.Invert(x, z);
- return new SecT131FieldElement(z);
- }
-
- public override ECFieldElement Sqrt()
- {
- ulong[] z = Nat192.Create64();
- SecT131Field.Sqrt(x, z);
- return new SecT131FieldElement(z);
- }
-
- public virtual int Representation
- {
- get { return F2mFieldElement.Ppb; }
- }
-
- public virtual int M
- {
- get { return 131; }
- }
-
- public virtual int K1
- {
- get { return 2; }
- }
-
- public virtual int K2
- {
- get { return 3; }
- }
-
- public virtual int K3
- {
- get { return 8; }
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecT131FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecT131FieldElement);
- }
-
- public virtual bool Equals(SecT131FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat192.Eq64(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return 131832 ^ Arrays.GetHashCode(x, 0, 3);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT131R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT131R1Curve.cs
deleted file mode 100644
index b73964c..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT131R1Curve.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT131R1Curve
- : AbstractF2mCurve
- {
- private const int SecT131R1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT131R1Point m_infinity;
-
- public SecT131R1Curve()
- : base(131, 2, 3, 8)
- {
- this.m_infinity = new SecT131R1Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1, Hex.Decode("07A11B09A76B562144418FF3FF8C2570B8")));
- this.m_b = FromBigInteger(new BigInteger(1, Hex.Decode("0217C05610884B63B9C6C7291678F9D341")));
- this.m_order = new BigInteger(1, Hex.Decode("0400000000000000023123953A9464B54D"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT131R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT131R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 131; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT131FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT131R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT131R1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return false; }
- }
-
- public virtual int M
- {
- get { return 131; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return false; }
- }
-
- public virtual int K1
- {
- get { return 2; }
- }
-
- public virtual int K2
- {
- get { return 3; }
- }
-
- public virtual int K3
- {
- get { return 8; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT131R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT131R1Point.cs
deleted file mode 100644
index 7afdad8..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT131R1Point.cs
+++ /dev/null
@@ -1,287 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT131R1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT131R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT131R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT131R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT131R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).Add(curve.A);
- if (X3.IsZero)
- {
- return new SecT131R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT131R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT131R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- {
- return this;
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement a = curve.A;
- ECFieldElement aZ1Sq = Z1IsOne ? a : a.Multiply(Z1Sq);
- ECFieldElement T = L1.Square().Add(L1Z1).Add(aZ1Sq);
- if (T.IsZero)
- {
- return new SecT131R1Point(curve, T, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
-
- return new SecT131R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- {
- return b;
- }
- if (b.IsInfinity)
- {
- return Twice();
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = curve.A.Multiply(Z1Sq).Add(L1Sq).Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = curve.A.Add(L2plus1).Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT131R1Point(curve, A, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new SecT131R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT131R1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT131R2Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT131R2Curve.cs
deleted file mode 100644
index 724921c..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT131R2Curve.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT131R2Curve
- : AbstractF2mCurve
- {
- private const int SecT131R2_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT131R2Point m_infinity;
-
- public SecT131R2Curve()
- : base(131, 2, 3, 8)
- {
- this.m_infinity = new SecT131R2Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1, Hex.Decode("03E5A88919D7CAFCBF415F07C2176573B2")));
- this.m_b = FromBigInteger(new BigInteger(1, Hex.Decode("04B8266A46C55657AC734CE38F018F2192")));
- this.m_order = new BigInteger(1, Hex.Decode("0400000000000000016954A233049BA98F"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT131R2_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT131R2Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- public override int FieldSize
- {
- get { return 131; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT131FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT131R2Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT131R2Point(this, x, y, zs, withCompression);
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override bool IsKoblitz
- {
- get { return false; }
- }
-
- public virtual int M
- {
- get { return 131; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return false; }
- }
-
- public virtual int K1
- {
- get { return 2; }
- }
-
- public virtual int K2
- {
- get { return 3; }
- }
-
- public virtual int K3
- {
- get { return 8; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT131R2Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT131R2Point.cs
deleted file mode 100644
index be61561..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT131R2Point.cs
+++ /dev/null
@@ -1,283 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT131R2Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT131R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT131R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT131R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT131R2Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).Add(curve.A);
- if (X3.IsZero)
- {
- return new SecT131R2Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT131R2Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT131R2Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- {
- return this;
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement a = curve.A;
- ECFieldElement aZ1Sq = Z1IsOne ? a : a.Multiply(Z1Sq);
- ECFieldElement T = L1.Square().Add(L1Z1).Add(aZ1Sq);
- if (T.IsZero)
- {
- return new SecT131R2Point(curve, T, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
-
- return new SecT131R2Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = curve.A.Multiply(Z1Sq).Add(L1Sq).Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = curve.A.Add(L2plus1).Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT131R2Point(curve, A, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new SecT131R2Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT131R2Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT163Field.cs b/BCCrypto/src/math/ec/custom/sec/SecT163Field.cs
deleted file mode 100644
index b1e9aa7..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT163Field.cs
+++ /dev/null
@@ -1,340 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT163Field
- {
- private const ulong M35 = ulong.MaxValue >> 29;
- private const ulong M55 = ulong.MaxValue >> 9;
-
- private static readonly ulong[] ROOT_Z = new ulong[]{ 0xB6DB6DB6DB6DB6B0UL, 0x492492492492DB6DUL, 0x492492492UL };
-
- public static void Add(ulong[] x, ulong[] y, ulong[] z)
- {
- z[0] = x[0] ^ y[0];
- z[1] = x[1] ^ y[1];
- z[2] = x[2] ^ y[2];
- }
-
- public static void AddExt(ulong[] xx, ulong[] yy, ulong[] zz)
- {
- zz[0] = xx[0] ^ yy[0];
- zz[1] = xx[1] ^ yy[1];
- zz[2] = xx[2] ^ yy[2];
- zz[3] = xx[3] ^ yy[3];
- zz[4] = xx[4] ^ yy[4];
- zz[5] = xx[5] ^ yy[5];
- }
-
- public static void AddOne(ulong[] x, ulong[] z)
- {
- z[0] = x[0] ^ 1UL;
- z[1] = x[1];
- z[2] = x[2];
- }
-
- public static ulong[] FromBigInteger(BigInteger x)
- {
- ulong[] z = Nat192.FromBigInteger64(x);
- Reduce29(z, 0);
- return z;
- }
-
- public static void Invert(ulong[] x, ulong[] z)
- {
- if (Nat192.IsZero64(x))
- throw new InvalidOperationException();
-
- // Itoh-Tsujii inversion with bases { 2, 3 }
-
- ulong[] t0 = Nat192.Create64();
- ulong[] t1 = Nat192.Create64();
-
- Square(x, t0);
-
- // 3 | 162
- SquareN(t0, 1, t1);
- Multiply(t0, t1, t0);
- SquareN(t1, 1, t1);
- Multiply(t0, t1, t0);
-
- // 3 | 54
- SquareN(t0, 3, t1);
- Multiply(t0, t1, t0);
- SquareN(t1, 3, t1);
- Multiply(t0, t1, t0);
-
- // 3 | 18
- SquareN(t0, 9, t1);
- Multiply(t0, t1, t0);
- SquareN(t1, 9, t1);
- Multiply(t0, t1, t0);
-
- // 3 | 6
- SquareN(t0, 27, t1);
- Multiply(t0, t1, t0);
- SquareN(t1, 27, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 2
- SquareN(t0, 81, t1);
- Multiply(t0, t1, z);
- }
-
- public static void Multiply(ulong[] x, ulong[] y, ulong[] z)
- {
- ulong[] tt = Nat192.CreateExt64();
- ImplMultiply(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz)
- {
- ulong[] tt = Nat192.CreateExt64();
- ImplMultiply(x, y, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void Reduce(ulong[] xx, ulong[] z)
- {
- ulong x0 = xx[0], x1 = xx[1], x2 = xx[2], x3 = xx[3], x4 = xx[4], x5 = xx[5];
-
- x2 ^= (x5 << 29) ^ (x5 << 32) ^ (x5 << 35) ^ (x5 << 36);
- x3 ^= (x5 >> 35) ^ (x5 >> 32) ^ (x5 >> 29) ^ (x5 >> 28);
-
- x1 ^= (x4 << 29) ^ (x4 << 32) ^ (x4 << 35) ^ (x4 << 36);
- x2 ^= (x4 >> 35) ^ (x4 >> 32) ^ (x4 >> 29) ^ (x4 >> 28);
-
- x0 ^= (x3 << 29) ^ (x3 << 32) ^ (x3 << 35) ^ (x3 << 36);
- x1 ^= (x3 >> 35) ^ (x3 >> 32) ^ (x3 >> 29) ^ (x3 >> 28);
-
- ulong t = x2 >> 35;
- z[0] = x0 ^ t ^ (t << 3) ^ (t << 6) ^ (t << 7);
- z[1] = x1;
- z[2] = x2 & M35;
- }
-
- public static void Reduce29(ulong[] z, int zOff)
- {
- ulong z2 = z[zOff + 2], t = z2 >> 35;
- z[zOff ] ^= t ^ (t << 3) ^ (t << 6) ^ (t << 7);
- z[zOff + 2] = z2 & M35;
- }
-
- public static void Sqrt(ulong[] x, ulong[] z)
- {
- ulong[] odd = Nat192.Create64();
-
- ulong u0, u1;
- u0 = Interleave.Unshuffle(x[0]); u1 = Interleave.Unshuffle(x[1]);
- ulong e0 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- odd[0] = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- u0 = Interleave.Unshuffle(x[2]);
- ulong e1 = (u0 & 0x00000000FFFFFFFFUL);
- odd[1] = (u0 >> 32);
-
- Multiply(odd, ROOT_Z, z);
-
- z[0] ^= e0;
- z[1] ^= e1;
- }
-
- public static void Square(ulong[] x, ulong[] z)
- {
- ulong[] tt = Nat192.CreateExt64();
- ImplSquare(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareAddToExt(ulong[] x, ulong[] zz)
- {
- ulong[] tt = Nat192.CreateExt64();
- ImplSquare(x, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void SquareN(ulong[] x, int n, ulong[] z)
- {
- Debug.Assert(n > 0);
-
- ulong[] tt = Nat192.CreateExt64();
- ImplSquare(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- ImplSquare(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static uint Trace(ulong[] x)
- {
- // Non-zero-trace bits: 0, 157
- return (uint)(x[0] ^ (x[2] >> 29)) & 1U;
- }
-
- protected static void ImplCompactExt(ulong[] zz)
- {
- ulong z0 = zz[0], z1 = zz[1], z2 = zz[2], z3 = zz[3], z4 = zz[4], z5 = zz[5];
- zz[0] = z0 ^ (z1 << 55);
- zz[1] = (z1 >> 9) ^ (z2 << 46);
- zz[2] = (z2 >> 18) ^ (z3 << 37);
- zz[3] = (z3 >> 27) ^ (z4 << 28);
- zz[4] = (z4 >> 36) ^ (z5 << 19);
- zz[5] = (z5 >> 45);
- }
-
- protected static void ImplMultiply(ulong[] x, ulong[] y, ulong[] zz)
- {
- /*
- * "Five-way recursion" as described in "Batch binary Edwards", Daniel J. Bernstein.
- */
-
- ulong f0 = x[0], f1 = x[1], f2 = x[2];
- f2 = ((f1 >> 46) ^ (f2 << 18));
- f1 = ((f0 >> 55) ^ (f1 << 9)) & M55;
- f0 &= M55;
-
- ulong g0 = y[0], g1 = y[1], g2 = y[2];
- g2 = ((g1 >> 46) ^ (g2 << 18));
- g1 = ((g0 >> 55) ^ (g1 << 9)) & M55;
- g0 &= M55;
-
- ulong[] H = new ulong[10];
-
- ImplMulw(f0, g0, H, 0); // H(0) 55/54 bits
- ImplMulw(f2, g2, H, 2); // H(INF) 55/50 bits
-
- ulong t0 = f0 ^ f1 ^ f2;
- ulong t1 = g0 ^ g1 ^ g2;
-
- ImplMulw(t0, t1, H, 4); // H(1) 55/54 bits
-
- ulong t2 = (f1 << 1) ^ (f2 << 2);
- ulong t3 = (g1 << 1) ^ (g2 << 2);
-
- ImplMulw(f0 ^ t2, g0 ^ t3, H, 6); // H(t) 55/56 bits
- ImplMulw(t0 ^ t2, t1 ^ t3, H, 8); // H(t + 1) 55/56 bits
-
- ulong t4 = H[6] ^ H[8];
- ulong t5 = H[7] ^ H[9];
-
- Debug.Assert(t5 >> 55 == 0);
-
- // Calculate V
- ulong v0 = (t4 << 1) ^ H[6];
- ulong v1 = t4 ^ (t5 << 1) ^ H[7];
- ulong v2 = t5;
-
- // Calculate U
- ulong u0 = H[0];
- ulong u1 = H[1] ^ H[0] ^ H[4];
- ulong u2 = H[1] ^ H[5];
-
- // Calculate W
- ulong w0 = u0 ^ v0 ^ (H[2] << 4) ^ (H[2] << 1);
- ulong w1 = u1 ^ v1 ^ (H[3] << 4) ^ (H[3] << 1);
- ulong w2 = u2 ^ v2;
-
- // Propagate carries
- w1 ^= (w0 >> 55); w0 &= M55;
- w2 ^= (w1 >> 55); w1 &= M55;
-
- Debug.Assert((w0 & 1UL) == 0UL);
-
- // Divide W by t
-
- w0 = (w0 >> 1) ^ ((w1 & 1UL) << 54);
- w1 = (w1 >> 1) ^ ((w2 & 1UL) << 54);
- w2 = (w2 >> 1);
-
- // Divide W by (t + 1)
-
- w0 ^= (w0 << 1);
- w0 ^= (w0 << 2);
- w0 ^= (w0 << 4);
- w0 ^= (w0 << 8);
- w0 ^= (w0 << 16);
- w0 ^= (w0 << 32);
-
- w0 &= M55; w1 ^= (w0 >> 54);
-
- w1 ^= (w1 << 1);
- w1 ^= (w1 << 2);
- w1 ^= (w1 << 4);
- w1 ^= (w1 << 8);
- w1 ^= (w1 << 16);
- w1 ^= (w1 << 32);
-
- w1 &= M55; w2 ^= (w1 >> 54);
-
- w2 ^= (w2 << 1);
- w2 ^= (w2 << 2);
- w2 ^= (w2 << 4);
- w2 ^= (w2 << 8);
- w2 ^= (w2 << 16);
- w2 ^= (w2 << 32);
-
- Debug.Assert(w2 >> 52 == 0);
-
- zz[0] = u0;
- zz[1] = u1 ^ w0 ^ H[2];
- zz[2] = u2 ^ w1 ^ w0 ^ H[3];
- zz[3] = w2 ^ w1;
- zz[4] = w2 ^ H[2];
- zz[5] = H[3];
-
- ImplCompactExt(zz);
- }
-
- protected static void ImplMulw(ulong x, ulong y, ulong[] z, int zOff)
- {
- Debug.Assert(x >> 56 == 0);
- Debug.Assert(y >> 56 == 0);
-
- ulong[] u = new ulong[8];
- //u[0] = 0;
- u[1] = y;
- u[2] = u[1] << 1;
- u[3] = u[2] ^ y;
- u[4] = u[2] << 1;
- u[5] = u[4] ^ y;
- u[6] = u[3] << 1;
- u[7] = u[6] ^ y;
-
- uint j = (uint)x;
- ulong g, h = 0, l = u[j & 3];
- int k = 47;
- do
- {
- j = (uint)(x >> k);
- g = u[j & 7]
- ^ u[(j >> 3) & 7] << 3
- ^ u[(j >> 6) & 7] << 6;
- l ^= (g << k);
- h ^= (g >> -k);
- }
- while ((k -= 9) > 0);
-
- Debug.Assert(h >> 47 == 0);
-
- z[zOff ] = l & M55;
- z[zOff + 1] = (l >> 55) ^ (h << 9);
- }
-
- protected static void ImplSquare(ulong[] x, ulong[] zz)
- {
- Interleave.Expand64To128(x[0], zz, 0);
- Interleave.Expand64To128(x[1], zz, 2);
-
- ulong x2 = x[2];
- zz[4] = Interleave.Expand32to64((uint)x2);
- zz[5] = Interleave.Expand8to16((uint)(x2 >> 32));
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT163FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecT163FieldElement.cs
deleted file mode 100644
index 8953fb5..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT163FieldElement.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT163FieldElement
- : ECFieldElement
- {
- protected readonly ulong[] x;
-
- public SecT163FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.BitLength > 163)
- throw new ArgumentException("value invalid for SecT163FieldElement", "x");
-
- this.x = SecT163Field.FromBigInteger(x);
- }
-
- public SecT163FieldElement()
- {
- this.x = Nat192.Create64();
- }
-
- protected internal SecT163FieldElement(ulong[] x)
- {
- this.x = x;
- }
-
- public override bool IsOne
- {
- get { return Nat192.IsOne64(x); }
- }
-
- public override bool IsZero
- {
- get { return Nat192.IsZero64(x); }
- }
-
- public override bool TestBitZero()
- {
- return (x[0] & 1L) != 0L;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat192.ToBigInteger64(x);
- }
-
- public override string FieldName
- {
- get { return "SecT163Field"; }
- }
-
- public override int FieldSize
- {
- get { return 163; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- ulong[] z = Nat192.Create64();
- SecT163Field.Add(x, ((SecT163FieldElement)b).x, z);
- return new SecT163FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- ulong[] z = Nat192.Create64();
- SecT163Field.AddOne(x, z);
- return new SecT163FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- // Addition and subtraction are the same in F2m
- return Add(b);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- ulong[] z = Nat192.Create64();
- SecT163Field.Multiply(x, ((SecT163FieldElement)b).x, z);
- return new SecT163FieldElement(z);
- }
-
- public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- return MultiplyPlusProduct(b, x, y);
- }
-
- public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x, bx = ((SecT163FieldElement)b).x;
- ulong[] xx = ((SecT163FieldElement)x).x, yx = ((SecT163FieldElement)y).x;
-
- ulong[] tt = Nat192.CreateExt64();
- SecT163Field.MultiplyAddToExt(ax, bx, tt);
- SecT163Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat192.Create64();
- SecT163Field.Reduce(tt, z);
- return new SecT163FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- return Multiply(b.Invert());
- }
-
- public override ECFieldElement Negate()
- {
- return this;
- }
-
- public override ECFieldElement Square()
- {
- ulong[] z = Nat192.Create64();
- SecT163Field.Square(x, z);
- return new SecT163FieldElement(z);
- }
-
- public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y)
- {
- return SquarePlusProduct(x, y);
- }
-
- public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x;
- ulong[] xx = ((SecT163FieldElement)x).x, yx = ((SecT163FieldElement)y).x;
-
- ulong[] tt = Nat192.CreateExt64();
- SecT163Field.SquareAddToExt(ax, tt);
- SecT163Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat192.Create64();
- SecT163Field.Reduce(tt, z);
- return new SecT163FieldElement(z);
- }
-
- public override ECFieldElement SquarePow(int pow)
- {
- if (pow < 1)
- return this;
-
- ulong[] z = Nat192.Create64();
- SecT163Field.SquareN(x, pow, z);
- return new SecT163FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- ulong[] z = Nat192.Create64();
- SecT163Field.Invert(x, z);
- return new SecT163FieldElement(z);
- }
-
- public override ECFieldElement Sqrt()
- {
- ulong[] z = Nat192.Create64();
- SecT163Field.Sqrt(x, z);
- return new SecT163FieldElement(z);
- }
-
- public virtual int Representation
- {
- get { return F2mFieldElement.Ppb; }
- }
-
- public virtual int M
- {
- get { return 163; }
- }
-
- public virtual int K1
- {
- get { return 3; }
- }
-
- public virtual int K2
- {
- get { return 6; }
- }
-
- public virtual int K3
- {
- get { return 7; }
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecT163FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecT163FieldElement);
- }
-
- public virtual bool Equals(SecT163FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat192.Eq64(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return 163763 ^ Arrays.GetHashCode(x, 0, 3);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT163K1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT163K1Curve.cs
deleted file mode 100644
index 68ff646..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT163K1Curve.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT163K1Curve
- : AbstractF2mCurve
- {
- private const int SecT163K1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT163K1Point m_infinity;
-
- public SecT163K1Curve()
- : base(163, 3, 6, 7)
- {
- this.m_infinity = new SecT163K1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.One);
- this.m_b = this.m_a;
- this.m_order = new BigInteger(1, Hex.Decode("04000000000000000000020108A2E0CC0D99F8A5EF"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT163K1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT163K1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- protected override ECMultiplier CreateDefaultMultiplier()
- {
- return new WTauNafMultiplier();
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 163; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT163FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT163K1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT163K1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return true; }
- }
-
- public virtual int M
- {
- get { return 163; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return false; }
- }
-
- public virtual int K1
- {
- get { return 3; }
- }
-
- public virtual int K2
- {
- get { return 6; }
- }
-
- public virtual int K3
- {
- get { return 7; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT163K1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT163K1Point.cs
deleted file mode 100644
index 8693fe1..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT163K1Point.cs
+++ /dev/null
@@ -1,281 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT163K1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT163K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT163K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT163K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT163K1Point(null, this.AffineXCoord, this.AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).AddOne();
- if (X3.IsZero)
- {
- return new SecT163K1Point(curve, X3, curve.B, IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT163K1Point(curve, X3, curve.B, IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT163K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- {
- return this;
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement T = L1.Square().Add(L1Z1).Add(Z1Sq);
- if (T.IsZero)
- {
- return new SecT163K1Point(curve, T, curve.B, IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement t1 = L1.Add(X1).Square();
- ECFieldElement L3 = t1.Add(T).Add(Z1Sq).Multiply(t1).Add(X3);
-
- return new SecT163K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- // NOTE: TwicePlus() only optimized for lambda-affine argument
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = Z1Sq.Add(L1Sq).Add(L1Z1);
- ECFieldElement A = L2.Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT163K1Point(curve, A, curve.B, IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2.AddOne(), Z3);
-
- return new SecT163K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT163K1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT163R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT163R1Curve.cs
deleted file mode 100644
index 8ae58cc..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT163R1Curve.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT163R1Curve
- : AbstractF2mCurve
- {
- private const int SecT163R1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT163R1Point m_infinity;
-
- public SecT163R1Curve()
- : base(163, 3, 6, 7)
- {
- this.m_infinity = new SecT163R1Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1, Hex.Decode("07B6882CAAEFA84F9554FF8428BD88E246D2782AE2")));
- this.m_b = FromBigInteger(new BigInteger(1, Hex.Decode("0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9")));
- this.m_order = new BigInteger(1, Hex.Decode("03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT163R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT163R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 163; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT163FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT163R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT163R1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return false; }
- }
-
- public virtual int M
- {
- get { return 163; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return false; }
- }
-
- public virtual int K1
- {
- get { return 3; }
- }
-
- public virtual int K2
- {
- get { return 6; }
- }
-
- public virtual int K3
- {
- get { return 7; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT163R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT163R1Point.cs
deleted file mode 100644
index 811a09f..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT163R1Point.cs
+++ /dev/null
@@ -1,283 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT163R1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT163R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT163R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT163R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT163R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).Add(curve.A);
- if (X3.IsZero)
- {
- return new SecT163R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT163R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT163R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- {
- return this;
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement a = curve.A;
- ECFieldElement aZ1Sq = Z1IsOne ? a : a.Multiply(Z1Sq);
- ECFieldElement T = L1.Square().Add(L1Z1).Add(aZ1Sq);
- if (T.IsZero)
- {
- return new SecT163R1Point(curve, T, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
-
- return new SecT163R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = curve.A.Multiply(Z1Sq).Add(L1Sq).Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = curve.A.Add(L2plus1).Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT163R1Point(curve, A, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new SecT163R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT163R1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT163R2Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT163R2Curve.cs
deleted file mode 100644
index 5a4fa5a..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT163R2Curve.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT163R2Curve
- : AbstractF2mCurve
- {
- private const int SecT163R2_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT163R2Point m_infinity;
-
- public SecT163R2Curve()
- : base(163, 3, 6, 7)
- {
- this.m_infinity = new SecT163R2Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.One);
- this.m_b = FromBigInteger(new BigInteger(1, Hex.Decode("020A601907B8C953CA1481EB10512F78744A3205FD")));
- this.m_order = new BigInteger(1, Hex.Decode("040000000000000000000292FE77E70C12A4234C33"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT163R2_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT163R2Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 163; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT163FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT163R2Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT163R2Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return false; }
- }
-
- public virtual int M
- {
- get { return 163; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return false; }
- }
-
- public virtual int K1
- {
- get { return 3; }
- }
-
- public virtual int K2
- {
- get { return 6; }
- }
-
- public virtual int K3
- {
- get { return 7; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT163R2Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT163R2Point.cs
deleted file mode 100644
index 69e2497..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT163R2Point.cs
+++ /dev/null
@@ -1,286 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT163R2Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT163R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT163R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT163R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT163R2Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- {
- return Twice();
- }
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).AddOne();
- if (X3.IsZero)
- {
- return new SecT163R2Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT163R2Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT163R2Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- {
- return this;
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement T = L1.Square().Add(L1Z1).Add(Z1Sq);
- if (T.IsZero)
- {
- return new SecT163R2Point(curve, T, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
-
- return new SecT163R2Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- {
- return b;
- }
- if (b.IsInfinity)
- {
- return Twice();
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = Z1Sq.Add(L1Sq).Add(L1Z1);
- ECFieldElement A = L2.Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT163R2Point(curve, A, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2.AddOne(), Z3);
-
- return new SecT163R2Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT163R2Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT193Field.cs b/BCCrypto/src/math/ec/custom/sec/SecT193Field.cs
deleted file mode 100644
index 41acb4f..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT193Field.cs
+++ /dev/null
@@ -1,305 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT193Field
- {
- private const ulong M01 = 1UL;
- private const ulong M49 = ulong.MaxValue >> 15;
-
- public static void Add(ulong[] x, ulong[] y, ulong[] z)
- {
- z[0] = x[0] ^ y[0];
- z[1] = x[1] ^ y[1];
- z[2] = x[2] ^ y[2];
- z[3] = x[3] ^ y[3];
- }
-
- public static void AddExt(ulong[] xx, ulong[] yy, ulong[] zz)
- {
- zz[0] = xx[0] ^ yy[0];
- zz[1] = xx[1] ^ yy[1];
- zz[2] = xx[2] ^ yy[2];
- zz[3] = xx[3] ^ yy[3];
- zz[4] = xx[4] ^ yy[4];
- zz[5] = xx[5] ^ yy[5];
- zz[6] = xx[6] ^ yy[6];
- }
-
- public static void AddOne(ulong[] x, ulong[] z)
- {
- z[0] = x[0] ^ 1UL;
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- }
-
- public static ulong[] FromBigInteger(BigInteger x)
- {
- ulong[] z = Nat256.FromBigInteger64(x);
- Reduce63(z, 0);
- return z;
- }
-
- public static void Invert(ulong[] x, ulong[] z)
- {
- if (Nat256.IsZero64(x))
- throw new InvalidOperationException();
-
- // Itoh-Tsujii inversion with bases { 2, 3 }
-
- ulong[] t0 = Nat256.Create64();
- ulong[] t1 = Nat256.Create64();
-
- Square(x, t0);
-
- // 3 | 192
- SquareN(t0, 1, t1);
- Multiply(t0, t1, t0);
- SquareN(t1, 1, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 64
- SquareN(t0, 3, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 32
- SquareN(t0, 6, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 16
- SquareN(t0, 12, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 8
- SquareN(t0, 24, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 4
- SquareN(t0, 48, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 2
- SquareN(t0, 96, t1);
- Multiply(t0, t1, z);
- }
-
- public static void Multiply(ulong[] x, ulong[] y, ulong[] z)
- {
- ulong[] tt = Nat256.CreateExt64();
- ImplMultiply(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz)
- {
- ulong[] tt = Nat256.CreateExt64();
- ImplMultiply(x, y, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void Reduce(ulong[] xx, ulong[] z)
- {
- ulong x0 = xx[0], x1 = xx[1], x2 = xx[2], x3 = xx[3], x4 = xx[4], x5 = xx[5], x6 = xx[6];
-
- x2 ^= (x6 << 63);
- x3 ^= (x6 >> 1) ^ (x6 << 14);
- x4 ^= (x6 >> 50);
-
- x1 ^= (x5 << 63);
- x2 ^= (x5 >> 1) ^ (x5 << 14);
- x3 ^= (x5 >> 50);
-
- x0 ^= (x4 << 63);
- x1 ^= (x4 >> 1) ^ (x4 << 14);
- x2 ^= (x4 >> 50);
-
- ulong t = x3 >> 1;
- z[0] = x0 ^ t ^ (t << 15);
- z[1] = x1 ^ (t >> 49);
- z[2] = x2;
- z[3] = x3 & M01;
- }
-
- public static void Reduce63(ulong[] z, int zOff)
- {
- ulong z3 = z[zOff + 3], t = z3 >> 1;
- z[zOff ] ^= t ^ (t << 15);
- z[zOff + 1] ^= (t >> 49);
- z[zOff + 3] = z3 & M01;
- }
-
- public static void Sqrt(ulong[] x, ulong[] z)
- {
- ulong u0, u1;
- u0 = Interleave.Unshuffle(x[0]); u1 = Interleave.Unshuffle(x[1]);
- ulong e0 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- ulong c0 = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- u0 = Interleave.Unshuffle(x[2]);
- ulong e1 = (u0 & 0x00000000FFFFFFFFUL) ^ (x[3] << 32);
- ulong c1 = (u0 >> 32);
-
- z[0] = e0 ^ (c0 << 8);
- z[1] = e1 ^ (c1 << 8) ^ (c0 >> 56) ^ (c0 << 33);
- z[2] = (c1 >> 56) ^ (c1 << 33) ^ (c0 >> 31);
- z[3] = (c1 >> 31);
- }
-
- public static void Square(ulong[] x, ulong[] z)
- {
- ulong[] tt = Nat256.CreateExt64();
- ImplSquare(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareAddToExt(ulong[] x, ulong[] zz)
- {
- ulong[] tt = Nat256.CreateExt64();
- ImplSquare(x, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void SquareN(ulong[] x, int n, ulong[] z)
- {
- Debug.Assert(n > 0);
-
- ulong[] tt = Nat256.CreateExt64();
- ImplSquare(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- ImplSquare(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static uint Trace(ulong[] x)
- {
- // Non-zero-trace bits: 0
- return (uint)(x[0]) & 1U;
- }
-
- protected static void ImplCompactExt(ulong[] zz)
- {
- ulong z0 = zz[0], z1 = zz[1], z2 = zz[2], z3 = zz[3], z4 = zz[4], z5 = zz[5], z6 = zz[6], z7 = zz[7];
- zz[0] = z0 ^ (z1 << 49);
- zz[1] = (z1 >> 15) ^ (z2 << 34);
- zz[2] = (z2 >> 30) ^ (z3 << 19);
- zz[3] = (z3 >> 45) ^ (z4 << 4)
- ^ (z5 << 53);
- zz[4] = (z4 >> 60) ^ (z6 << 38)
- ^ (z5 >> 11);
- zz[5] = (z6 >> 26) ^ (z7 << 23);
- zz[6] = (z7 >> 41);
- zz[7] = 0;
- }
-
- protected static void ImplExpand(ulong[] x, ulong[] z)
- {
- ulong x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3];
- z[0] = x0 & M49;
- z[1] = ((x0 >> 49) ^ (x1 << 15)) & M49;
- z[2] = ((x1 >> 34) ^ (x2 << 30)) & M49;
- z[3] = ((x2 >> 19) ^ (x3 << 45));
- }
-
- protected static void ImplMultiply(ulong[] x, ulong[] y, ulong[] zz)
- {
- /*
- * "Two-level seven-way recursion" as described in "Batch binary Edwards", Daniel J. Bernstein.
- */
-
- ulong[] f = new ulong[4], g = new ulong[4];
- ImplExpand(x, f);
- ImplExpand(y, g);
-
- ImplMulwAcc(f[0], g[0], zz, 0);
- ImplMulwAcc(f[1], g[1], zz, 1);
- ImplMulwAcc(f[2], g[2], zz, 2);
- ImplMulwAcc(f[3], g[3], zz, 3);
-
- // U *= (1 - t^n)
- for (int i = 5; i > 0; --i)
- {
- zz[i] ^= zz[i - 1];
- }
-
- ImplMulwAcc(f[0] ^ f[1], g[0] ^ g[1], zz, 1);
- ImplMulwAcc(f[2] ^ f[3], g[2] ^ g[3], zz, 3);
-
- // V *= (1 - t^2n)
- for (int i = 7; i > 1; --i)
- {
- zz[i] ^= zz[i - 2];
- }
-
- // Double-length recursion
- {
- ulong c0 = f[0] ^ f[2], c1 = f[1] ^ f[3];
- ulong d0 = g[0] ^ g[2], d1 = g[1] ^ g[3];
- ImplMulwAcc(c0 ^ c1, d0 ^ d1, zz, 3);
- ulong[] t = new ulong[3];
- ImplMulwAcc(c0, d0, t, 0);
- ImplMulwAcc(c1, d1, t, 1);
- ulong t0 = t[0], t1 = t[1], t2 = t[2];
- zz[2] ^= t0;
- zz[3] ^= t0 ^ t1;
- zz[4] ^= t2 ^ t1;
- zz[5] ^= t2;
- }
-
- ImplCompactExt(zz);
- }
-
- protected static void ImplMulwAcc(ulong x, ulong y, ulong[] z, int zOff)
- {
- Debug.Assert(x >> 49 == 0);
- Debug.Assert(y >> 49 == 0);
-
- ulong[] u = new ulong[8];
- //u[0] = 0;
- u[1] = y;
- u[2] = u[1] << 1;
- u[3] = u[2] ^ y;
- u[4] = u[2] << 1;
- u[5] = u[4] ^ y;
- u[6] = u[3] << 1;
- u[7] = u[6] ^ y;
-
- uint j = (uint)x;
- ulong g, h = 0, l = u[j & 7]
- ^ (u[(j >> 3) & 7] << 3);
- int k = 36;
- do
- {
- j = (uint)(x >> k);
- g = u[j & 7]
- ^ u[(j >> 3) & 7] << 3
- ^ u[(j >> 6) & 7] << 6
- ^ u[(j >> 9) & 7] << 9
- ^ u[(j >> 12) & 7] << 12;
- l ^= (g << k);
- h ^= (g >> -k);
- }
- while ((k -= 15) > 0);
-
- Debug.Assert(h >> 33 == 0);
-
- z[zOff ] ^= l & M49;
- z[zOff + 1] ^= (l >> 49) ^ (h << 15);
- }
-
- protected static void ImplSquare(ulong[] x, ulong[] zz)
- {
- Interleave.Expand64To128(x[0], zz, 0);
- Interleave.Expand64To128(x[1], zz, 2);
- Interleave.Expand64To128(x[2], zz, 4);
- zz[6] = (x[3] & M01);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT193FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecT193FieldElement.cs
deleted file mode 100644
index a1150b3..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT193FieldElement.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT193FieldElement
- : ECFieldElement
- {
- protected readonly ulong[] x;
-
- public SecT193FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.BitLength > 193)
- throw new ArgumentException("value invalid for SecT193FieldElement", "x");
-
- this.x = SecT193Field.FromBigInteger(x);
- }
-
- public SecT193FieldElement()
- {
- this.x = Nat256.Create64();
- }
-
- protected internal SecT193FieldElement(ulong[] x)
- {
- this.x = x;
- }
-
- public override bool IsOne
- {
- get { return Nat256.IsOne64(x); }
- }
-
- public override bool IsZero
- {
- get { return Nat256.IsZero64(x); }
- }
-
- public override bool TestBitZero()
- {
- return (x[0] & 1UL) != 0UL;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat256.ToBigInteger64(x);
- }
-
- public override string FieldName
- {
- get { return "SecT193Field"; }
- }
-
- public override int FieldSize
- {
- get { return 193; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- ulong[] z = Nat256.Create64();
- SecT193Field.Add(x, ((SecT193FieldElement)b).x, z);
- return new SecT193FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- ulong[] z = Nat256.Create64();
- SecT193Field.AddOne(x, z);
- return new SecT193FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- // Addition and Subtraction are the same in F2m
- return Add(b);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- ulong[] z = Nat256.Create64();
- SecT193Field.Multiply(x, ((SecT193FieldElement)b).x, z);
- return new SecT193FieldElement(z);
- }
-
- public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- return MultiplyPlusProduct(b, x, y);
- }
-
- public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x, bx = ((SecT193FieldElement)b).x;
- ulong[] xx = ((SecT193FieldElement)x).x, yx = ((SecT193FieldElement)y).x;
-
- ulong[] tt = Nat256.CreateExt64();
- SecT193Field.MultiplyAddToExt(ax, bx, tt);
- SecT193Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat256.Create64();
- SecT193Field.Reduce(tt, z);
- return new SecT193FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- return Multiply(b.Invert());
- }
-
- public override ECFieldElement Negate()
- {
- return this;
- }
-
- public override ECFieldElement Square()
- {
- ulong[] z = Nat256.Create64();
- SecT193Field.Square(x, z);
- return new SecT193FieldElement(z);
- }
-
- public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y)
- {
- return SquarePlusProduct(x, y);
- }
-
- public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x;
- ulong[] xx = ((SecT193FieldElement)x).x, yx = ((SecT193FieldElement)y).x;
-
- ulong[] tt = Nat256.CreateExt64();
- SecT193Field.SquareAddToExt(ax, tt);
- SecT193Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat256.Create64();
- SecT193Field.Reduce(tt, z);
- return new SecT193FieldElement(z);
- }
-
- public override ECFieldElement SquarePow(int pow)
- {
- if (pow < 1)
- return this;
-
- ulong[] z = Nat256.Create64();
- SecT193Field.SquareN(x, pow, z);
- return new SecT193FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- ulong[] z = Nat256.Create64();
- SecT193Field.Invert(x, z);
- return new SecT193FieldElement(z);
- }
-
- public override ECFieldElement Sqrt()
- {
- ulong[] z = Nat256.Create64();
- SecT193Field.Sqrt(x, z);
- return new SecT193FieldElement(z);
- }
-
- public virtual int Representation
- {
- get { return F2mFieldElement.Tpb; }
- }
-
- public virtual int M
- {
- get { return 193; }
- }
-
- public virtual int K1
- {
- get { return 15; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecT193FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecT193FieldElement);
- }
-
- public virtual bool Equals(SecT193FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat256.Eq64(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return 1930015 ^ Arrays.GetHashCode(x, 0, 4);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT193R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT193R1Curve.cs
deleted file mode 100644
index a2cb5a8..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT193R1Curve.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT193R1Curve
- : AbstractF2mCurve
- {
- private const int SecT193R1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT193R1Point m_infinity;
-
- public SecT193R1Curve()
- : base(193, 15, 0, 0)
- {
- this.m_infinity = new SecT193R1Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1, Hex.Decode("0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01")));
- this.m_b = FromBigInteger(new BigInteger(1, Hex.Decode("00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814")));
- this.m_order = new BigInteger(1, Hex.Decode("01000000000000000000000000C7F34A778F443ACC920EBA49"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT193R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT193R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 193; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT193FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT193R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT193R1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return false; }
- }
-
- public virtual int M
- {
- get { return 193; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return true; }
- }
-
- public virtual int K1
- {
- get { return 15; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT193R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT193R1Point.cs
deleted file mode 100644
index 062fce9..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT193R1Point.cs
+++ /dev/null
@@ -1,283 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT193R1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT193R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT193R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT193R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT193R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).Add(curve.A);
- if (X3.IsZero)
- {
- return new SecT193R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT193R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT193R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- {
- return this;
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement a = curve.A;
- ECFieldElement aZ1Sq = Z1IsOne ? a : a.Multiply(Z1Sq);
- ECFieldElement T = L1.Square().Add(L1Z1).Add(aZ1Sq);
- if (T.IsZero)
- {
- return new SecT193R1Point(curve, T, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
-
- return new SecT193R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = curve.A.Multiply(Z1Sq).Add(L1Sq).Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = curve.A.Add(L2plus1).Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT193R1Point(curve, A, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new SecT193R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT193R1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT193R2Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT193R2Curve.cs
deleted file mode 100644
index 1c84a3e..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT193R2Curve.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT193R2Curve
- : AbstractF2mCurve
- {
- private const int SecT193R2_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT193R2Point m_infinity;
-
- public SecT193R2Curve()
- : base(193, 15, 0, 0)
- {
- this.m_infinity = new SecT193R2Point(this, null, null);
-
- this.m_a = FromBigInteger(new BigInteger(1, Hex.Decode("0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B")));
- this.m_b = FromBigInteger(new BigInteger(1, Hex.Decode("00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE")));
- this.m_order = new BigInteger(1, Hex.Decode("010000000000000000000000015AAB561B005413CCD4EE99D5"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT193R2_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT193R2Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 193; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT193FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT193R2Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT193R2Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return false; }
- }
-
- public virtual int M
- {
- get { return 193; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return true; }
- }
-
- public virtual int K1
- {
- get { return 15; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT193R2Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT193R2Point.cs
deleted file mode 100644
index 18d89e3..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT193R2Point.cs
+++ /dev/null
@@ -1,283 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT193R2Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT193R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT193R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT193R2Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT193R2Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).Add(curve.A);
- if (X3.IsZero)
- {
- return new SecT193R2Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT193R2Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT193R2Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- {
- return this;
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement a = curve.A;
- ECFieldElement aZ1Sq = Z1IsOne ? a : a.Multiply(Z1Sq);
- ECFieldElement T = L1.Square().Add(L1Z1).Add(aZ1Sq);
- if (T.IsZero)
- {
- return new SecT193R2Point(curve, T, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
-
- return new SecT193R2Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = curve.A.Multiply(Z1Sq).Add(L1Sq).Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = curve.A.Add(L2plus1).Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT193R2Point(curve, A, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new SecT193R2Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT193R2Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT233Field.cs b/BCCrypto/src/math/ec/custom/sec/SecT233Field.cs
deleted file mode 100644
index 870dade..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT233Field.cs
+++ /dev/null
@@ -1,317 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT233Field
- {
- private const ulong M41 = ulong.MaxValue >> 23;
- private const ulong M59 = ulong.MaxValue >> 5;
-
- public static void Add(ulong[] x, ulong[] y, ulong[] z)
- {
- z[0] = x[0] ^ y[0];
- z[1] = x[1] ^ y[1];
- z[2] = x[2] ^ y[2];
- z[3] = x[3] ^ y[3];
- }
-
- public static void AddExt(ulong[] xx, ulong[] yy, ulong[] zz)
- {
- zz[0] = xx[0] ^ yy[0];
- zz[1] = xx[1] ^ yy[1];
- zz[2] = xx[2] ^ yy[2];
- zz[3] = xx[3] ^ yy[3];
- zz[4] = xx[4] ^ yy[4];
- zz[5] = xx[5] ^ yy[5];
- zz[6] = xx[6] ^ yy[6];
- zz[7] = xx[7] ^ yy[7];
- }
-
- public static void AddOne(ulong[] x, ulong[] z)
- {
- z[0] = x[0] ^ 1UL;
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- }
-
- public static ulong[] FromBigInteger(BigInteger x)
- {
- ulong[] z = Nat256.FromBigInteger64(x);
- Reduce23(z, 0);
- return z;
- }
-
- public static void Invert(ulong[] x, ulong[] z)
- {
- if (Nat256.IsZero64(x))
- throw new InvalidOperationException();
-
- // Itoh-Tsujii inversion
-
- ulong[] t0 = Nat256.Create64();
- ulong[] t1 = Nat256.Create64();
-
- Square(x, t0);
- Multiply(t0, x, t0);
- Square(t0, t0);
- Multiply(t0, x, t0);
- SquareN(t0, 3, t1);
- Multiply(t1, t0, t1);
- Square(t1, t1);
- Multiply(t1, x, t1);
- SquareN(t1, 7, t0);
- Multiply(t0, t1, t0);
- SquareN(t0, 14, t1);
- Multiply(t1, t0, t1);
- Square(t1, t1);
- Multiply(t1, x, t1);
- SquareN(t1, 29, t0);
- Multiply(t0, t1, t0);
- SquareN(t0, 58, t1);
- Multiply(t1, t0, t1);
- SquareN(t1, 116, t0);
- Multiply(t0, t1, t0);
- Square(t0, z);
- }
-
- public static void Multiply(ulong[] x, ulong[] y, ulong[] z)
- {
- ulong[] tt = Nat256.CreateExt64();
- ImplMultiply(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz)
- {
- ulong[] tt = Nat256.CreateExt64();
- ImplMultiply(x, y, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void Reduce(ulong[] xx, ulong[] z)
- {
- ulong x0 = xx[0], x1 = xx[1], x2 = xx[2], x3 = xx[3];
- ulong x4 = xx[4], x5 = xx[5], x6 = xx[6], x7 = xx[7];
-
- x3 ^= (x7 << 23);
- x4 ^= (x7 >> 41) ^ (x7 << 33);
- x5 ^= (x7 >> 31);
-
- x2 ^= (x6 << 23);
- x3 ^= (x6 >> 41) ^ (x6 << 33);
- x4 ^= (x6 >> 31);
-
- x1 ^= (x5 << 23);
- x2 ^= (x5 >> 41) ^ (x5 << 33);
- x3 ^= (x5 >> 31);
-
- x0 ^= (x4 << 23);
- x1 ^= (x4 >> 41) ^ (x4 << 33);
- x2 ^= (x4 >> 31);
-
- ulong t = x3 >> 41;
- z[0] = x0 ^ t;
- z[1] = x1 ^ (t << 10);
- z[2] = x2;
- z[3] = x3 & M41;
- }
-
- public static void Reduce23(ulong[] z, int zOff)
- {
- ulong z3 = z[zOff + 3], t = z3 >> 41;
- z[zOff ] ^= t;
- z[zOff + 1] ^= (t << 10);
- z[zOff + 3] = z3 & M41;
- }
-
- public static void Sqrt(ulong[] x, ulong[] z)
- {
- ulong u0, u1;
- u0 = Interleave.Unshuffle(x[0]); u1 = Interleave.Unshuffle(x[1]);
- ulong e0 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- ulong c0 = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- u0 = Interleave.Unshuffle(x[2]); u1 = Interleave.Unshuffle(x[3]);
- ulong e1 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- ulong c1 = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- ulong c2;
- c2 = (c1 >> 27);
- c1 ^= (c0 >> 27) | (c1 << 37);
- c0 ^= (c0 << 37);
-
- ulong[] tt = Nat256.CreateExt64();
-
- int[] shifts = { 32, 117, 191 };
- for (int i = 0; i < shifts.Length; ++i)
- {
- int w = shifts[i] >> 6, s = shifts[i] & 63;
- Debug.Assert(s != 0);
- tt[w ] ^= (c0 << s);
- tt[w + 1] ^= (c1 << s) | (c0 >> -s);
- tt[w + 2] ^= (c2 << s) | (c1 >> -s);
- tt[w + 3] ^= (c2 >> -s);
- }
-
- Reduce(tt, z);
-
- z[0] ^= e0;
- z[1] ^= e1;
- }
-
- public static void Square(ulong[] x, ulong[] z)
- {
- ulong[] tt = Nat256.CreateExt64();
- ImplSquare(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareAddToExt(ulong[] x, ulong[] zz)
- {
- ulong[] tt = Nat256.CreateExt64();
- ImplSquare(x, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void SquareN(ulong[] x, int n, ulong[] z)
- {
- Debug.Assert(n > 0);
-
- ulong[] tt = Nat256.CreateExt64();
- ImplSquare(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- ImplSquare(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static uint Trace(ulong[] x)
- {
- // Non-zero-trace bits: 0, 159
- return (uint)(x[0] ^ (x[2] >> 31)) & 1U;
- }
-
- protected static void ImplCompactExt(ulong[] zz)
- {
- ulong z0 = zz[0], z1 = zz[1], z2 = zz[2], z3 = zz[3], z4 = zz[4], z5 = zz[5], z6 = zz[6], z7 = zz[7];
- zz[0] = z0 ^ (z1 << 59);
- zz[1] = (z1 >> 5) ^ (z2 << 54);
- zz[2] = (z2 >> 10) ^ (z3 << 49);
- zz[3] = (z3 >> 15) ^ (z4 << 44);
- zz[4] = (z4 >> 20) ^ (z5 << 39);
- zz[5] = (z5 >> 25) ^ (z6 << 34);
- zz[6] = (z6 >> 30) ^ (z7 << 29);
- zz[7] = (z7 >> 35);
- }
-
- protected static void ImplExpand(ulong[] x, ulong[] z)
- {
- ulong x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3];
- z[0] = x0 & M59;
- z[1] = ((x0 >> 59) ^ (x1 << 5)) & M59;
- z[2] = ((x1 >> 54) ^ (x2 << 10)) & M59;
- z[3] = ((x2 >> 49) ^ (x3 << 15));
- }
-
- protected static void ImplMultiply(ulong[] x, ulong[] y, ulong[] zz)
- {
- /*
- * "Two-level seven-way recursion" as described in "Batch binary Edwards", Daniel J. Bernstein.
- */
-
- ulong[] f = new ulong[4], g = new ulong[4];
- ImplExpand(x, f);
- ImplExpand(y, g);
-
- ImplMulwAcc(f[0], g[0], zz, 0);
- ImplMulwAcc(f[1], g[1], zz, 1);
- ImplMulwAcc(f[2], g[2], zz, 2);
- ImplMulwAcc(f[3], g[3], zz, 3);
-
- // U *= (1 - t^n)
- for (int i = 5; i > 0; --i)
- {
- zz[i] ^= zz[i - 1];
- }
-
- ImplMulwAcc(f[0] ^ f[1], g[0] ^ g[1], zz, 1);
- ImplMulwAcc(f[2] ^ f[3], g[2] ^ g[3], zz, 3);
-
- // V *= (1 - t^2n)
- for (int i = 7; i > 1; --i)
- {
- zz[i] ^= zz[i - 2];
- }
-
- // Double-length recursion
- {
- ulong c0 = f[0] ^ f[2], c1 = f[1] ^ f[3];
- ulong d0 = g[0] ^ g[2], d1 = g[1] ^ g[3];
- ImplMulwAcc(c0 ^ c1, d0 ^ d1, zz, 3);
- ulong[] t = new ulong[3];
- ImplMulwAcc(c0, d0, t, 0);
- ImplMulwAcc(c1, d1, t, 1);
- ulong t0 = t[0], t1 = t[1], t2 = t[2];
- zz[2] ^= t0;
- zz[3] ^= t0 ^ t1;
- zz[4] ^= t2 ^ t1;
- zz[5] ^= t2;
- }
-
- ImplCompactExt(zz);
- }
-
- protected static void ImplMulwAcc(ulong x, ulong y, ulong[] z, int zOff)
- {
- Debug.Assert(x >> 59 == 0);
- Debug.Assert(y >> 59 == 0);
-
- ulong[] u = new ulong[8];
- //u[0] = 0;
- u[1] = y;
- u[2] = u[1] << 1;
- u[3] = u[2] ^ y;
- u[4] = u[2] << 1;
- u[5] = u[4] ^ y;
- u[6] = u[3] << 1;
- u[7] = u[6] ^ y;
-
- uint j = (uint)x;
- ulong g, h = 0, l = u[j & 7]
- ^ (u[(j >> 3) & 7] << 3);
- int k = 54;
- do
- {
- j = (uint)(x >> k);
- g = u[j & 7]
- ^ u[(j >> 3) & 7] << 3;
- l ^= (g << k);
- h ^= (g >> -k);
- }
- while ((k -= 6) > 0);
-
- Debug.Assert(h >> 53 == 0);
-
- z[zOff ] ^= l & M59;
- z[zOff + 1] ^= (l >> 59) ^ (h << 5);
- }
-
- protected static void ImplSquare(ulong[] x, ulong[] zz)
- {
- Interleave.Expand64To128(x[0], zz, 0);
- Interleave.Expand64To128(x[1], zz, 2);
- Interleave.Expand64To128(x[2], zz, 4);
-
- ulong x3 = x[3];
- zz[6] = Interleave.Expand32to64((uint)x3);
- zz[7] = Interleave.Expand16to32((uint)(x3 >> 32));
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT233FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecT233FieldElement.cs
deleted file mode 100644
index 91b8e2f..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT233FieldElement.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT233FieldElement
- : ECFieldElement
- {
- protected readonly ulong[] x;
-
- public SecT233FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.BitLength > 233)
- throw new ArgumentException("value invalid for SecT233FieldElement", "x");
-
- this.x = SecT233Field.FromBigInteger(x);
- }
-
- public SecT233FieldElement()
- {
- this.x = Nat256.Create64();
- }
-
- protected internal SecT233FieldElement(ulong[] x)
- {
- this.x = x;
- }
-
- public override bool IsOne
- {
- get { return Nat256.IsOne64(x); }
- }
-
- public override bool IsZero
- {
- get { return Nat256.IsZero64(x); }
- }
-
- public override bool TestBitZero()
- {
- return (x[0] & 1UL) != 0UL;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat256.ToBigInteger64(x);
- }
-
- public override string FieldName
- {
- get { return "SecT233Field"; }
- }
-
- public override int FieldSize
- {
- get { return 233; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- ulong[] z = Nat256.Create64();
- SecT233Field.Add(x, ((SecT233FieldElement)b).x, z);
- return new SecT233FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- ulong[] z = Nat256.Create64();
- SecT233Field.AddOne(x, z);
- return new SecT233FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- // Addition and Subtraction are the same in F2m
- return Add(b);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- ulong[] z = Nat256.Create64();
- SecT233Field.Multiply(x, ((SecT233FieldElement)b).x, z);
- return new SecT233FieldElement(z);
- }
-
- public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- return MultiplyPlusProduct(b, x, y);
- }
-
- public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x, bx = ((SecT233FieldElement)b).x;
- ulong[] xx = ((SecT233FieldElement)x).x, yx = ((SecT233FieldElement)y).x;
-
- ulong[] tt = Nat256.CreateExt64();
- SecT233Field.MultiplyAddToExt(ax, bx, tt);
- SecT233Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat256.Create64();
- SecT233Field.Reduce(tt, z);
- return new SecT233FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- return Multiply(b.Invert());
- }
-
- public override ECFieldElement Negate()
- {
- return this;
- }
-
- public override ECFieldElement Square()
- {
- ulong[] z = Nat256.Create64();
- SecT233Field.Square(x, z);
- return new SecT233FieldElement(z);
- }
-
- public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y)
- {
- return SquarePlusProduct(x, y);
- }
-
- public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x;
- ulong[] xx = ((SecT233FieldElement)x).x, yx = ((SecT233FieldElement)y).x;
-
- ulong[] tt = Nat256.CreateExt64();
- SecT233Field.SquareAddToExt(ax, tt);
- SecT233Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat256.Create64();
- SecT233Field.Reduce(tt, z);
- return new SecT233FieldElement(z);
- }
-
- public override ECFieldElement SquarePow(int pow)
- {
- if (pow < 1)
- return this;
-
- ulong[] z = Nat256.Create64();
- SecT233Field.SquareN(x, pow, z);
- return new SecT233FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- ulong[] z = Nat256.Create64();
- SecT233Field.Invert(x, z);
- return new SecT233FieldElement(z);
- }
-
- public override ECFieldElement Sqrt()
- {
- ulong[] z = Nat256.Create64();
- SecT233Field.Sqrt(x, z);
- return new SecT233FieldElement(z);
- }
-
- public virtual int Representation
- {
- get { return F2mFieldElement.Tpb; }
- }
-
- public virtual int M
- {
- get { return 233; }
- }
-
- public virtual int K1
- {
- get { return 74; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecT233FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecT233FieldElement);
- }
-
- public virtual bool Equals(SecT233FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat256.Eq64(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return 2330074 ^ Arrays.GetHashCode(x, 0, 4);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT233K1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT233K1Curve.cs
deleted file mode 100644
index 7293591..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT233K1Curve.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT233K1Curve
- : AbstractF2mCurve
- {
- private const int SecT233K1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT233K1Point m_infinity;
-
- public SecT233K1Curve()
- : base(233, 74, 0, 0)
- {
- this.m_infinity = new SecT233K1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.Zero);
- this.m_b = FromBigInteger(BigInteger.One);
- this.m_order = new BigInteger(1, Hex.Decode("8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF"));
- this.m_cofactor = BigInteger.ValueOf(4);
-
- this.m_coord = SecT233K1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT233K1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- protected override ECMultiplier CreateDefaultMultiplier()
- {
- return new WTauNafMultiplier();
- }
-
- public override int FieldSize
- {
- get { return 233; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT233FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT233K1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT233K1Point(this, x, y, zs, withCompression);
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override bool IsKoblitz
- {
- get { return true; }
- }
-
- public virtual int M
- {
- get { return 233; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return true; }
- }
-
- public virtual int K1
- {
- get { return 74; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT233K1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT233K1Point.cs
deleted file mode 100644
index 9a357ff..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT233K1Point.cs
+++ /dev/null
@@ -1,295 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT233K1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT233K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT233K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT233K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT233K1Point(null, this.AffineXCoord, this.AffineYCoord); // earlier JDK
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- {
- return curve.Infinity;
- }
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1);
- if (X3.IsZero)
- {
- return new SecT233K1Point(curve, X3, curve.B, IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT233K1Point(curve, X3, curve.B, IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT233K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- {
- return this;
- }
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement T;
- if (Z1IsOne)
- {
- T = L1.Square().Add(L1);
- }
- else
- {
- T = L1.Add(Z1).Multiply(L1);
- }
-
- if (T.IsZero)
- {
- return new SecT233K1Point(curve, T, curve.B, IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement t1 = L1.Add(X1).Square();
- ECFieldElement t2 = Z1IsOne ? Z1 : Z1Sq.Square();
- ECFieldElement L3 = t1.Add(T).Add(Z1Sq).Multiply(t1).Add(t2).Add(X3).Add(Z3);
-
- return new SecT233K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- // NOTE: TwicePlus() only optimized for lambda-affine argument
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = L1Sq.Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = L2plus1.Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- {
- return b.Twice();
- }
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT233K1Point(curve, A, curve.B, IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new SecT233K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT233K1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT233R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT233R1Curve.cs
deleted file mode 100644
index db6e6e1..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT233R1Curve.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT233R1Curve
- : AbstractF2mCurve
- {
- private const int SecT233R1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT233R1Point m_infinity;
-
- public SecT233R1Curve()
- : base(233, 74, 0, 0)
- {
- this.m_infinity = new SecT233R1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.One);
- this.m_b = FromBigInteger(new BigInteger(1, Hex.Decode("0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD")));
- this.m_order = new BigInteger(1, Hex.Decode("01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT233R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT233R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 233; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT233FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT233R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT233R1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return false; }
- }
-
- public virtual int M
- {
- get { return 233; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return true; }
- }
-
- public virtual int K1
- {
- get { return 74; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT233R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT233R1Point.cs
deleted file mode 100644
index 6347051..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT233R1Point.cs
+++ /dev/null
@@ -1,278 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT233R1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT233R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT233R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT233R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT233R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).AddOne();
- if (X3.IsZero)
- {
- return new SecT233R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT233R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT233R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement T = L1.Square().Add(L1Z1).Add(Z1Sq);
- if (T.IsZero)
- {
- return new SecT233R1Point(curve, T, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
-
- return new SecT233R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = Z1Sq.Add(L1Sq).Add(L1Z1);
- ECFieldElement A = L2.Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT233R1Point(curve, A, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2.AddOne(), Z3);
-
- return new SecT233R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT233R1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT239Field.cs b/BCCrypto/src/math/ec/custom/sec/SecT239Field.cs
deleted file mode 100644
index 2e6ed2a..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT239Field.cs
+++ /dev/null
@@ -1,328 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT239Field
- {
- private const ulong M47 = ulong.MaxValue >> 17;
- private const ulong M60 = ulong.MaxValue >> 4;
-
- public static void Add(ulong[] x, ulong[] y, ulong[] z)
- {
- z[0] = x[0] ^ y[0];
- z[1] = x[1] ^ y[1];
- z[2] = x[2] ^ y[2];
- z[3] = x[3] ^ y[3];
- }
-
- public static void AddExt(ulong[] xx, ulong[] yy, ulong[] zz)
- {
- zz[0] = xx[0] ^ yy[0];
- zz[1] = xx[1] ^ yy[1];
- zz[2] = xx[2] ^ yy[2];
- zz[3] = xx[3] ^ yy[3];
- zz[4] = xx[4] ^ yy[4];
- zz[5] = xx[5] ^ yy[5];
- zz[6] = xx[6] ^ yy[6];
- zz[7] = xx[7] ^ yy[7];
- }
-
- public static void AddOne(ulong[] x, ulong[] z)
- {
- z[0] = x[0] ^ 1UL;
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- }
-
- public static ulong[] FromBigInteger(BigInteger x)
- {
- ulong[] z = Nat256.FromBigInteger64(x);
- Reduce17(z, 0);
- return z;
- }
-
- public static void Invert(ulong[] x, ulong[] z)
- {
- if (Nat256.IsZero64(x))
- throw new InvalidOperationException();
-
- // Itoh-Tsujii inversion
-
- ulong[] t0 = Nat256.Create64();
- ulong[] t1 = Nat256.Create64();
-
- Square(x, t0);
- Multiply(t0, x, t0);
- Square(t0, t0);
- Multiply(t0, x, t0);
- SquareN(t0, 3, t1);
- Multiply(t1, t0, t1);
- Square(t1, t1);
- Multiply(t1, x, t1);
- SquareN(t1, 7, t0);
- Multiply(t0, t1, t0);
- SquareN(t0, 14, t1);
- Multiply(t1, t0, t1);
- Square(t1, t1);
- Multiply(t1, x, t1);
- SquareN(t1, 29, t0);
- Multiply(t0, t1, t0);
- Square(t0, t0);
- Multiply(t0, x, t0);
- SquareN(t0, 59, t1);
- Multiply(t1, t0, t1);
- Square(t1, t1);
- Multiply(t1, x, t1);
- SquareN(t1, 119, t0);
- Multiply(t0, t1, t0);
- Square(t0, z);
- }
-
- public static void Multiply(ulong[] x, ulong[] y, ulong[] z)
- {
- ulong[] tt = Nat256.CreateExt64();
- ImplMultiply(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz)
- {
- ulong[] tt = Nat256.CreateExt64();
- ImplMultiply(x, y, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void Reduce(ulong[] xx, ulong[] z)
- {
- ulong x0 = xx[0], x1 = xx[1], x2 = xx[2], x3 = xx[3];
- ulong x4 = xx[4], x5 = xx[5], x6 = xx[6], x7 = xx[7];
-
- x3 ^= (x7 << 17);
- x4 ^= (x7 >> 47);
- x5 ^= (x7 << 47);
- x6 ^= (x7 >> 17);
-
- x2 ^= (x6 << 17);
- x3 ^= (x6 >> 47);
- x4 ^= (x6 << 47);
- x5 ^= (x6 >> 17);
-
- x1 ^= (x5 << 17);
- x2 ^= (x5 >> 47);
- x3 ^= (x5 << 47);
- x4 ^= (x5 >> 17);
-
- x0 ^= (x4 << 17);
- x1 ^= (x4 >> 47);
- x2 ^= (x4 << 47);
- x3 ^= (x4 >> 17);
-
- ulong t = x3 >> 47;
- z[0] = x0 ^ t;
- z[1] = x1;
- z[2] = x2 ^ (t << 30);
- z[3] = x3 & M47;
- }
-
- public static void Reduce17(ulong[] z, int zOff)
- {
- ulong z3 = z[zOff + 3], t = z3 >> 47;
- z[zOff ] ^= t;
- z[zOff + 2] ^= (t << 30);
- z[zOff + 3] = z3 & M47;
- }
-
- public static void Sqrt(ulong[] x, ulong[] z)
- {
- ulong u0, u1;
- u0 = Interleave.Unshuffle(x[0]); u1 = Interleave.Unshuffle(x[1]);
- ulong e0 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- ulong c0 = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- u0 = Interleave.Unshuffle(x[2]); u1 = Interleave.Unshuffle(x[3]);
- ulong e1 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- ulong c1 = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- ulong c2, c3;
- c3 = (c1 >> 49);
- c2 = (c0 >> 49) | (c1 << 15);
- c1 ^= (c0 << 15);
-
- ulong[] tt = Nat256.CreateExt64();
-
- int[] shifts = { 39, 120 };
- for (int i = 0; i < shifts.Length; ++i)
- {
- int w = shifts[i] >> 6, s = shifts[i] & 63;
- Debug.Assert(s != 0);
- tt[w ] ^= (c0 << s);
- tt[w + 1] ^= (c1 << s) | (c0 >> -s);
- tt[w + 2] ^= (c2 << s) | (c1 >> -s);
- tt[w + 3] ^= (c3 << s) | (c2 >> -s);
- tt[w + 4] ^= (c3 >> -s);
- }
-
- Reduce(tt, z);
-
- z[0] ^= e0;
- z[1] ^= e1;
- }
-
- public static void Square(ulong[] x, ulong[] z)
- {
- ulong[] tt = Nat256.CreateExt64();
- ImplSquare(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareAddToExt(ulong[] x, ulong[] zz)
- {
- ulong[] tt = Nat256.CreateExt64();
- ImplSquare(x, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void SquareN(ulong[] x, int n, ulong[] z)
- {
- Debug.Assert(n > 0);
-
- ulong[] tt = Nat256.CreateExt64();
- ImplSquare(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- ImplSquare(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static uint Trace(ulong[] x)
- {
- // Non-zero-trace bits: 0, 81, 162
- return (uint)(x[0] ^ (x[1] >> 17) ^ (x[2] >> 34)) & 1U;
- }
-
- protected static void ImplCompactExt(ulong[] zz)
- {
- ulong z0 = zz[0], z1 = zz[1], z2 = zz[2], z3 = zz[3], z4 = zz[4], z5 = zz[5], z6 = zz[6], z7 = zz[7];
- zz[0] = z0 ^ (z1 << 60);
- zz[1] = (z1 >> 4) ^ (z2 << 56);
- zz[2] = (z2 >> 8) ^ (z3 << 52);
- zz[3] = (z3 >> 12) ^ (z4 << 48);
- zz[4] = (z4 >> 16) ^ (z5 << 44);
- zz[5] = (z5 >> 20) ^ (z6 << 40);
- zz[6] = (z6 >> 24) ^ (z7 << 36);
- zz[7] = (z7 >> 28);
- }
-
- protected static void ImplExpand(ulong[] x, ulong[] z)
- {
- ulong x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3];
- z[0] = x0 & M60;
- z[1] = ((x0 >> 60) ^ (x1 << 4)) & M60;
- z[2] = ((x1 >> 56) ^ (x2 << 8)) & M60;
- z[3] = ((x2 >> 52) ^ (x3 << 12));
- }
-
- protected static void ImplMultiply(ulong[] x, ulong[] y, ulong[] zz)
- {
- /*
- * "Two-level seven-way recursion" as described in "Batch binary Edwards", Daniel J. Bernstein.
- */
-
- ulong[] f = new ulong[4], g = new ulong[4];
- ImplExpand(x, f);
- ImplExpand(y, g);
-
- ImplMulwAcc(f[0], g[0], zz, 0);
- ImplMulwAcc(f[1], g[1], zz, 1);
- ImplMulwAcc(f[2], g[2], zz, 2);
- ImplMulwAcc(f[3], g[3], zz, 3);
-
- // U *= (1 - t^n)
- for (int i = 5; i > 0; --i)
- {
- zz[i] ^= zz[i - 1];
- }
-
- ImplMulwAcc(f[0] ^ f[1], g[0] ^ g[1], zz, 1);
- ImplMulwAcc(f[2] ^ f[3], g[2] ^ g[3], zz, 3);
-
- // V *= (1 - t^2n)
- for (int i = 7; i > 1; --i)
- {
- zz[i] ^= zz[i - 2];
- }
-
- // Double-length recursion
- {
- ulong c0 = f[0] ^ f[2], c1 = f[1] ^ f[3];
- ulong d0 = g[0] ^ g[2], d1 = g[1] ^ g[3];
- ImplMulwAcc(c0 ^ c1, d0 ^ d1, zz, 3);
- ulong[] t = new ulong[3];
- ImplMulwAcc(c0, d0, t, 0);
- ImplMulwAcc(c1, d1, t, 1);
- ulong t0 = t[0], t1 = t[1], t2 = t[2];
- zz[2] ^= t0;
- zz[3] ^= t0 ^ t1;
- zz[4] ^= t2 ^ t1;
- zz[5] ^= t2;
- }
-
- ImplCompactExt(zz);
- }
-
- protected static void ImplMulwAcc(ulong x, ulong y, ulong[] z, int zOff)
- {
- Debug.Assert(x >> 60 == 0);
- Debug.Assert(y >> 60 == 0);
-
- ulong[] u = new ulong[8];
- //u[0] = 0;
- u[1] = y;
- u[2] = u[1] << 1;
- u[3] = u[2] ^ y;
- u[4] = u[2] << 1;
- u[5] = u[4] ^ y;
- u[6] = u[3] << 1;
- u[7] = u[6] ^ y;
-
- uint j = (uint)x;
- ulong g, h = 0, l = u[j & 7]
- ^ (u[(j >> 3) & 7] << 3);
- int k = 54;
- do
- {
- j = (uint)(x >> k);
- g = u[j & 7]
- ^ u[(j >> 3) & 7] << 3;
- l ^= (g << k);
- h ^= (g >> -k);
- }
- while ((k -= 6) > 0);
-
- h ^= ((x & 0x0820820820820820L) & (ulong)(((long)y << 4) >> 63)) >> 5;
-
- Debug.Assert(h >> 55 == 0);
-
- z[zOff ] ^= l & M60;
- z[zOff + 1] ^= (l >> 60) ^ (h << 4);
- }
-
- protected static void ImplSquare(ulong[] x, ulong[] zz)
- {
- Interleave.Expand64To128(x[0], zz, 0);
- Interleave.Expand64To128(x[1], zz, 2);
- Interleave.Expand64To128(x[2], zz, 4);
-
- ulong x3 = x[3];
- zz[6] = Interleave.Expand32to64((uint)x3);
- zz[7] = Interleave.Expand16to32((uint)(x3 >> 32));
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT239FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecT239FieldElement.cs
deleted file mode 100644
index a32ffc5..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT239FieldElement.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT239FieldElement
- : ECFieldElement
- {
- protected ulong[] x;
-
- public SecT239FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.BitLength > 239)
- throw new ArgumentException("value invalid for SecT239FieldElement", "x");
-
- this.x = SecT239Field.FromBigInteger(x);
- }
-
- public SecT239FieldElement()
- {
- this.x = Nat256.Create64();
- }
-
- protected internal SecT239FieldElement(ulong[] x)
- {
- this.x = x;
- }
-
- public override bool IsOne
- {
- get { return Nat256.IsOne64(x); }
- }
-
- public override bool IsZero
- {
- get { return Nat256.IsZero64(x); }
- }
-
- public override bool TestBitZero()
- {
- return (x[0] & 1L) != 0L;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat256.ToBigInteger64(x);
- }
-
- public override string FieldName
- {
- get { return "SecT239Field"; }
- }
-
- public override int FieldSize
- {
- get { return 239; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- ulong[] z = Nat256.Create64();
- SecT239Field.Add(x, ((SecT239FieldElement)b).x, z);
- return new SecT239FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- ulong[] z = Nat256.Create64();
- SecT239Field.AddOne(x, z);
- return new SecT239FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- // Addition and Subtraction are the same in F2m
- return Add(b);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- ulong[] z = Nat256.Create64();
- SecT239Field.Multiply(x, ((SecT239FieldElement)b).x, z);
- return new SecT239FieldElement(z);
- }
-
- public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- return MultiplyPlusProduct(b, x, y);
- }
-
- public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x, bx = ((SecT239FieldElement)b).x;
- ulong[] xx = ((SecT239FieldElement)x).x, yx = ((SecT239FieldElement)y).x;
-
- ulong[] tt = Nat256.CreateExt64();
- SecT239Field.MultiplyAddToExt(ax, bx, tt);
- SecT239Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat256.Create64();
- SecT239Field.Reduce(tt, z);
- return new SecT239FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- return Multiply(b.Invert());
- }
-
- public override ECFieldElement Negate()
- {
- return this;
- }
-
- public override ECFieldElement Square()
- {
- ulong[] z = Nat256.Create64();
- SecT239Field.Square(x, z);
- return new SecT239FieldElement(z);
- }
-
- public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y)
- {
- return SquarePlusProduct(x, y);
- }
-
- public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x;
- ulong[] xx = ((SecT239FieldElement)x).x, yx = ((SecT239FieldElement)y).x;
-
- ulong[] tt = Nat256.CreateExt64();
- SecT239Field.SquareAddToExt(ax, tt);
- SecT239Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat256.Create64();
- SecT239Field.Reduce(tt, z);
- return new SecT239FieldElement(z);
- }
-
- public override ECFieldElement SquarePow(int pow)
- {
- if (pow < 1)
- return this;
-
- ulong[] z = Nat256.Create64();
- SecT239Field.SquareN(x, pow, z);
- return new SecT239FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- ulong[] z = Nat256.Create64();
- SecT239Field.Invert(x, z);
- return new SecT239FieldElement(z);
- }
-
- public override ECFieldElement Sqrt()
- {
- ulong[] z = Nat256.Create64();
- SecT239Field.Sqrt(x, z);
- return new SecT239FieldElement(z);
- }
-
- public virtual int Representation
- {
- get { return F2mFieldElement.Tpb; }
- }
-
- public virtual int M
- {
- get { return 239; }
- }
-
- public virtual int K1
- {
- get { return 158; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecT239FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecT239FieldElement);
- }
-
- public virtual bool Equals(SecT239FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat256.Eq64(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return 23900158 ^ Arrays.GetHashCode(x, 0, 4);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT239K1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT239K1Curve.cs
deleted file mode 100644
index a499d48..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT239K1Curve.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT239K1Curve
- : AbstractF2mCurve
- {
- private const int SecT239K1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT239K1Point m_infinity;
-
- public SecT239K1Curve()
- : base(239, 158, 0, 0)
- {
- this.m_infinity = new SecT239K1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.Zero);
- this.m_b = FromBigInteger(BigInteger.One);
- this.m_order = new BigInteger(1, Hex.Decode("2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5"));
- this.m_cofactor = BigInteger.ValueOf(4);
-
- this.m_coord = SecT239K1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT239K1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- protected override ECMultiplier CreateDefaultMultiplier()
- {
- return new WTauNafMultiplier();
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 239; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT239FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT239K1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT239K1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return true; }
- }
-
- public virtual int M
- {
- get { return 239; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return true; }
- }
-
- public virtual int K1
- {
- get { return 158; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT239K1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT239K1Point.cs
deleted file mode 100644
index fbd5117..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT239K1Point.cs
+++ /dev/null
@@ -1,290 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT239K1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT239K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT239K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT239K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT239K1Point(null, this.AffineXCoord, this.AffineYCoord); // earlier JDK
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1);
- if (X3.IsZero)
- {
- return new SecT239K1Point(curve, X3, curve.B, IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT239K1Point(curve, X3, curve.B, IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT239K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement T;
- if (Z1IsOne)
- {
- T = L1.Square().Add(L1);
- }
- else
- {
- T = L1.Add(Z1).Multiply(L1);
- }
-
- if (T.IsZero)
- {
- return new SecT239K1Point(curve, T, curve.B, IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement t1 = L1.Add(X1).Square();
- ECFieldElement t2 = Z1IsOne ? Z1 : Z1Sq.Square();
- ECFieldElement L3 = t1.Add(T).Add(Z1Sq).Multiply(t1).Add(t2).Add(X3).Add(Z3);
-
- return new SecT239K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- // NOTE: TwicePlus() only optimized for lambda-affine argument
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = L1Sq.Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = L2plus1.Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT239K1Point(curve, A, curve.B, IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new SecT239K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT239K1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT283Field.cs b/BCCrypto/src/math/ec/custom/sec/SecT283Field.cs
deleted file mode 100644
index 22b7eaa..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT283Field.cs
+++ /dev/null
@@ -1,402 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT283Field
- {
- private const ulong M27 = ulong.MaxValue >> 37;
- private const ulong M57 = ulong.MaxValue >> 7;
-
- private static readonly ulong[] ROOT_Z = new ulong[]{ 0x0C30C30C30C30808UL, 0x30C30C30C30C30C3UL, 0x820820820820830CUL, 0x0820820820820820UL, 0x2082082UL };
-
- public static void Add(ulong[] x, ulong[] y, ulong[] z)
- {
- z[0] = x[0] ^ y[0];
- z[1] = x[1] ^ y[1];
- z[2] = x[2] ^ y[2];
- z[3] = x[3] ^ y[3];
- z[4] = x[4] ^ y[4];
- }
-
- public static void AddExt(ulong[] xx, ulong[] yy, ulong[] zz)
- {
- zz[0] = xx[0] ^ yy[0];
- zz[1] = xx[1] ^ yy[1];
- zz[2] = xx[2] ^ yy[2];
- zz[3] = xx[3] ^ yy[3];
- zz[4] = xx[4] ^ yy[4];
- zz[5] = xx[5] ^ yy[5];
- zz[6] = xx[6] ^ yy[6];
- zz[7] = xx[7] ^ yy[7];
- zz[8] = xx[8] ^ yy[8];
- }
-
- public static void AddOne(ulong[] x, ulong[] z)
- {
- z[0] = x[0] ^ 1UL;
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- z[4] = x[4];
- }
-
- public static ulong[] FromBigInteger(BigInteger x)
- {
- ulong[] z = Nat320.FromBigInteger64(x);
- Reduce37(z, 0);
- return z;
- }
-
- public static void Invert(ulong[] x, ulong[] z)
- {
- if (Nat320.IsZero64(x))
- throw new InvalidOperationException();
-
- // Itoh-Tsujii inversion
-
- ulong[] t0 = Nat320.Create64();
- ulong[] t1 = Nat320.Create64();
-
- Square(x, t0);
- Multiply(t0, x, t0);
- SquareN(t0, 2, t1);
- Multiply(t1, t0, t1);
- SquareN(t1, 4, t0);
- Multiply(t0, t1, t0);
- SquareN(t0, 8, t1);
- Multiply(t1, t0, t1);
- Square(t1, t1);
- Multiply(t1, x, t1);
- SquareN(t1, 17, t0);
- Multiply(t0, t1, t0);
- Square(t0, t0);
- Multiply(t0, x, t0);
- SquareN(t0, 35, t1);
- Multiply(t1, t0, t1);
- SquareN(t1, 70, t0);
- Multiply(t0, t1, t0);
- Square(t0, t0);
- Multiply(t0, x, t0);
- SquareN(t0, 141, t1);
- Multiply(t1, t0, t1);
- Square(t1, z);
- }
-
- public static void Multiply(ulong[] x, ulong[] y, ulong[] z)
- {
- ulong[] tt = Nat320.CreateExt64();
- ImplMultiply(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz)
- {
- ulong[] tt = Nat320.CreateExt64();
- ImplMultiply(x, y, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void Reduce(ulong[] xx, ulong[] z)
- {
- ulong x0 = xx[0], x1 = xx[1], x2 = xx[2], x3 = xx[3], x4 = xx[4];
- ulong x5 = xx[5], x6 = xx[6], x7 = xx[7], x8 = xx[8];
-
- x3 ^= (x8 << 37) ^ (x8 << 42) ^ (x8 << 44) ^ (x8 << 49);
- x4 ^= (x8 >> 27) ^ (x8 >> 22) ^ (x8 >> 20) ^ (x8 >> 15);
-
- x2 ^= (x7 << 37) ^ (x7 << 42) ^ (x7 << 44) ^ (x7 << 49);
- x3 ^= (x7 >> 27) ^ (x7 >> 22) ^ (x7 >> 20) ^ (x7 >> 15);
-
- x1 ^= (x6 << 37) ^ (x6 << 42) ^ (x6 << 44) ^ (x6 << 49);
- x2 ^= (x6 >> 27) ^ (x6 >> 22) ^ (x6 >> 20) ^ (x6 >> 15);
-
- x0 ^= (x5 << 37) ^ (x5 << 42) ^ (x5 << 44) ^ (x5 << 49);
- x1 ^= (x5 >> 27) ^ (x5 >> 22) ^ (x5 >> 20) ^ (x5 >> 15);
-
- ulong t = x4 >> 27;
- z[0] = x0 ^ t ^ (t << 5) ^ (t << 7) ^ (t << 12);
- z[1] = x1;
- z[2] = x2;
- z[3] = x3;
- z[4] = x4 & M27;
- }
-
- public static void Reduce37(ulong[] z, int zOff)
- {
- ulong z4 = z[zOff + 4], t = z4 >> 27;
- z[zOff ] ^= t ^ (t << 5) ^ (t << 7) ^ (t << 12);
- z[zOff + 4] = z4 & M27;
- }
-
- public static void Sqrt(ulong[] x, ulong[] z)
- {
- ulong[] odd = Nat320.Create64();
-
- ulong u0, u1;
- u0 = Interleave.Unshuffle(x[0]); u1 = Interleave.Unshuffle(x[1]);
- ulong e0 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- odd[0] = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- u0 = Interleave.Unshuffle(x[2]); u1 = Interleave.Unshuffle(x[3]);
- ulong e1 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- odd[1] = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- u0 = Interleave.Unshuffle(x[4]);
- ulong e2 = (u0 & 0x00000000FFFFFFFFUL);
- odd[2] = (u0 >> 32);
-
- Multiply(odd, ROOT_Z, z);
-
- z[0] ^= e0;
- z[1] ^= e1;
- z[2] ^= e2;
- }
-
- public static void Square(ulong[] x, ulong[] z)
- {
- ulong[] tt = Nat.Create64(9);
- ImplSquare(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareAddToExt(ulong[] x, ulong[] zz)
- {
- ulong[] tt = Nat.Create64(9);
- ImplSquare(x, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void SquareN(ulong[] x, int n, ulong[] z)
- {
- Debug.Assert(n > 0);
-
- ulong[] tt = Nat.Create64(9);
- ImplSquare(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- ImplSquare(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static uint Trace(ulong[] x)
- {
- // Non-zero-trace bits: 0, 271
- return (uint)(x[0] ^ (x[4] >> 15)) & 1U;
- }
-
- protected static void ImplCompactExt(ulong[] zz)
- {
- ulong z0 = zz[0], z1 = zz[1], z2 = zz[2], z3 = zz[3], z4 = zz[4];
- ulong z5 = zz[5], z6 = zz[6], z7 = zz[7], z8 = zz[8], z9 = zz[9];
- zz[0] = z0 ^ (z1 << 57);
- zz[1] = (z1 >> 7) ^ (z2 << 50);
- zz[2] = (z2 >> 14) ^ (z3 << 43);
- zz[3] = (z3 >> 21) ^ (z4 << 36);
- zz[4] = (z4 >> 28) ^ (z5 << 29);
- zz[5] = (z5 >> 35) ^ (z6 << 22);
- zz[6] = (z6 >> 42) ^ (z7 << 15);
- zz[7] = (z7 >> 49) ^ (z8 << 8);
- zz[8] = (z8 >> 56) ^ (z9 << 1);
- zz[9] = (z9 >> 63); // Zero!
- }
-
- protected static void ImplExpand(ulong[] x, ulong[] z)
- {
- ulong x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4];
- z[0] = x0 & M57;
- z[1] = ((x0 >> 57) ^ (x1 << 7)) & M57;
- z[2] = ((x1 >> 50) ^ (x2 << 14)) & M57;
- z[3] = ((x2 >> 43) ^ (x3 << 21)) & M57;
- z[4] = ((x3 >> 36) ^ (x4 << 28));
- }
-
- //protected static void AddMs(ulong[] zz, int zOff, ulong[] p, params int[] ms)
- //{
- // ulong t0 = 0, t1 = 0;
- // foreach (int m in ms)
- // {
- // int i = (m - 1) << 1;
- // t0 ^= p[i ];
- // t1 ^= p[i + 1];
- // }
- // zz[zOff ] ^= t0;
- // zz[zOff + 1] ^= t1;
- //}
-
- protected static void ImplMultiply(ulong[] x, ulong[] y, ulong[] zz)
- {
- /*
- * Formula (17) from "Some New Results on Binary Polynomial Multiplication",
- * Murat Cenk and M. Anwar Hasan.
- *
- * The formula as given contained an error in the term t25, as noted below
- */
- ulong[] a = new ulong[5], b = new ulong[5];
- ImplExpand(x, a);
- ImplExpand(y, b);
-
- ulong[] p = new ulong[26];
-
- ImplMulw(a[0], b[0], p, 0); // m1
- ImplMulw(a[1], b[1], p, 2); // m2
- ImplMulw(a[2], b[2], p, 4); // m3
- ImplMulw(a[3], b[3], p, 6); // m4
- ImplMulw(a[4], b[4], p, 8); // m5
-
- ulong u0 = a[0] ^ a[1], v0 = b[0] ^ b[1];
- ulong u1 = a[0] ^ a[2], v1 = b[0] ^ b[2];
- ulong u2 = a[2] ^ a[4], v2 = b[2] ^ b[4];
- ulong u3 = a[3] ^ a[4], v3 = b[3] ^ b[4];
-
- ImplMulw(u1 ^ a[3], v1 ^ b[3], p, 18); // m10
- ImplMulw(u2 ^ a[1], v2 ^ b[1], p, 20); // m11
-
- ulong A4 = u0 ^ u3 , B4 = v0 ^ v3;
- ulong A5 = A4 ^ a[2], B5 = B4 ^ b[2];
-
- ImplMulw(A4, B4, p, 22); // m12
- ImplMulw(A5, B5, p, 24); // m13
-
- ImplMulw(u0, v0, p, 10); // m6
- ImplMulw(u1, v1, p, 12); // m7
- ImplMulw(u2, v2, p, 14); // m8
- ImplMulw(u3, v3, p, 16); // m9
-
-
- // Original method, corresponding to formula (16)
- //AddMs(zz, 0, p, 1);
- //AddMs(zz, 1, p, 1, 2, 6);
- //AddMs(zz, 2, p, 1, 2, 3, 7);
- //AddMs(zz, 3, p, 1, 3, 4, 5, 8, 10, 12, 13);
- //AddMs(zz, 4, p, 1, 2, 4, 5, 6, 9, 10, 11, 13);
- //AddMs(zz, 5, p, 1, 2, 3, 5, 7, 11, 12, 13);
- //AddMs(zz, 6, p, 3, 4, 5, 8);
- //AddMs(zz, 7, p, 4, 5, 9);
- //AddMs(zz, 8, p, 5);
-
- // Improved method factors out common single-word terms
- // NOTE: p1,...,p26 in the paper maps to p[0],...,p[25] here
-
- zz[0] = p[ 0];
- zz[9] = p[ 9];
-
- ulong t1 = p[ 0] ^ p[ 1];
- ulong t2 = t1 ^ p[ 2];
- ulong t3 = t2 ^ p[10];
-
- zz[1] = t3;
-
- ulong t4 = p[ 3] ^ p[ 4];
- ulong t5 = p[11] ^ p[12];
- ulong t6 = t4 ^ t5;
- ulong t7 = t2 ^ t6;
-
- zz[2] = t7;
-
- ulong t8 = t1 ^ t4;
- ulong t9 = p[ 5] ^ p[ 6];
- ulong t10 = t8 ^ t9;
- ulong t11 = t10 ^ p[ 8];
- ulong t12 = p[13] ^ p[14];
- ulong t13 = t11 ^ t12;
- ulong t14 = p[18] ^ p[22];
- ulong t15 = t14 ^ p[24];
- ulong t16 = t13 ^ t15;
-
- zz[3] = t16;
-
- ulong t17 = p[ 7] ^ p[ 8];
- ulong t18 = t17 ^ p[ 9];
- ulong t19 = t18 ^ p[17];
-
- zz[8] = t19;
-
- ulong t20 = t18 ^ t9;
- ulong t21 = p[15] ^ p[16];
- ulong t22 = t20 ^ t21;
-
- zz[7] = t22;
-
- ulong t23 = t22 ^ t3;
- ulong t24 = p[19] ^ p[20];
- // ulong t25 = p[23] ^ p[24];
- ulong t25 = p[25] ^ p[24]; // Fixes an error in the paper: p[23] -> p{25]
- ulong t26 = p[18] ^ p[23];
- ulong t27 = t24 ^ t25;
- ulong t28 = t27 ^ t26;
- ulong t29 = t28 ^ t23;
-
- zz[4] = t29;
-
- ulong t30 = t7 ^ t19;
- ulong t31 = t27 ^ t30;
- ulong t32 = p[21] ^ p[22];
- ulong t33 = t31 ^ t32;
-
- zz[5] = t33;
-
- ulong t34 = t11 ^ p[0];
- ulong t35 = t34 ^ p[9];
- ulong t36 = t35 ^ t12;
- ulong t37 = t36 ^ p[21];
- ulong t38 = t37 ^ p[23];
- ulong t39 = t38 ^ p[25];
-
- zz[6] = t39;
-
- ImplCompactExt(zz);
- }
-
- protected static void ImplMulw(ulong x, ulong y, ulong[] z, int zOff)
- {
- Debug.Assert(x >> 57 == 0);
- Debug.Assert(y >> 57 == 0);
-
- ulong[] u = new ulong[8];
- //u[0] = 0;
- u[1] = y;
- u[2] = u[1] << 1;
- u[3] = u[2] ^ y;
- u[4] = u[2] << 1;
- u[5] = u[4] ^ y;
- u[6] = u[3] << 1;
- u[7] = u[6] ^ y;
-
- uint j = (uint)x;
- ulong g, h = 0, l = u[j & 7];
- int k = 48;
- do
- {
- j = (uint)(x >> k);
- g = u[j & 7]
- ^ u[(j >> 3) & 7] << 3
- ^ u[(j >> 6) & 7] << 6;
- l ^= (g << k);
- h ^= (g >> -k);
- }
- while ((k -= 9) > 0);
-
- h ^= ((x & 0x0100804020100800L) & (ulong)(((long)y << 7) >> 63)) >> 8;
-
- Debug.Assert(h >> 49 == 0);
-
- z[zOff ] = l & M57;
- z[zOff + 1] = (l >> 57) ^ (h << 7);
- }
-
- protected static void ImplSquare(ulong[] x, ulong[] zz)
- {
- for (int i = 0; i < 4; ++i)
- {
- Interleave.Expand64To128(x[i], zz, i << 1);
- }
- zz[8] = Interleave.Expand32to64((uint)x[4]);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT283FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecT283FieldElement.cs
deleted file mode 100644
index adfd4e0..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT283FieldElement.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT283FieldElement
- : ECFieldElement
- {
- protected readonly ulong[] x;
-
- public SecT283FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.BitLength > 283)
- throw new ArgumentException("value invalid for SecT283FieldElement", "x");
-
- this.x = SecT283Field.FromBigInteger(x);
- }
-
- public SecT283FieldElement()
- {
- this.x = Nat320.Create64();
- }
-
- protected internal SecT283FieldElement(ulong[] x)
- {
- this.x = x;
- }
-
- public override bool IsOne
- {
- get { return Nat320.IsOne64(x); }
- }
-
- public override bool IsZero
- {
- get { return Nat320.IsZero64(x); }
- }
-
- public override bool TestBitZero()
- {
- return (x[0] & 1UL) != 0UL;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat320.ToBigInteger64(x);
- }
-
- public override string FieldName
- {
- get { return "SecT283Field"; }
- }
-
- public override int FieldSize
- {
- get { return 283; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- ulong[] z = Nat320.Create64();
- SecT283Field.Add(x, ((SecT283FieldElement)b).x, z);
- return new SecT283FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- ulong[] z = Nat320.Create64();
- SecT283Field.AddOne(x, z);
- return new SecT283FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- // Addition and subtraction are the same in F2m
- return Add(b);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- ulong[] z = Nat320.Create64();
- SecT283Field.Multiply(x, ((SecT283FieldElement)b).x, z);
- return new SecT283FieldElement(z);
- }
-
- public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- return MultiplyPlusProduct(b, x, y);
- }
-
- public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x, bx = ((SecT283FieldElement)b).x;
- ulong[] xx = ((SecT283FieldElement)x).x, yx = ((SecT283FieldElement)y).x;
-
- ulong[] tt = Nat.Create64(9);
- SecT283Field.MultiplyAddToExt(ax, bx, tt);
- SecT283Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat320.Create64();
- SecT283Field.Reduce(tt, z);
- return new SecT283FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- return Multiply(b.Invert());
- }
-
- public override ECFieldElement Negate()
- {
- return this;
- }
-
- public override ECFieldElement Square()
- {
- ulong[] z = Nat320.Create64();
- SecT283Field.Square(x, z);
- return new SecT283FieldElement(z);
- }
-
- public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y)
- {
- return SquarePlusProduct(x, y);
- }
-
- public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x;
- ulong[] xx = ((SecT283FieldElement)x).x, yx = ((SecT283FieldElement)y).x;
-
- ulong[] tt = Nat.Create64(9);
- SecT283Field.SquareAddToExt(ax, tt);
- SecT283Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat320.Create64();
- SecT283Field.Reduce(tt, z);
- return new SecT283FieldElement(z);
- }
-
- public override ECFieldElement SquarePow(int pow)
- {
- if (pow < 1)
- return this;
-
- ulong[] z = Nat320.Create64();
- SecT283Field.SquareN(x, pow, z);
- return new SecT283FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- ulong[] z = Nat320.Create64();
- SecT283Field.Invert(x, z);
- return new SecT283FieldElement(z);
- }
-
- public override ECFieldElement Sqrt()
- {
- ulong[] z = Nat320.Create64();
- SecT283Field.Sqrt(x, z);
- return new SecT283FieldElement(z);
- }
-
- public virtual int Representation
- {
- get { return F2mFieldElement.Ppb; }
- }
-
- public virtual int M
- {
- get { return 283; }
- }
-
- public virtual int K1
- {
- get { return 5; }
- }
-
- public virtual int K2
- {
- get { return 7; }
- }
-
- public virtual int K3
- {
- get { return 12; }
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecT283FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecT283FieldElement);
- }
-
- public virtual bool Equals(SecT283FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat320.Eq64(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return 2831275 ^ Arrays.GetHashCode(x, 0, 5);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT283K1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT283K1Curve.cs
deleted file mode 100644
index 4053287..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT283K1Curve.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT283K1Curve
- : AbstractF2mCurve
- {
- private const int SecT283K1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT283K1Point m_infinity;
-
- public SecT283K1Curve()
- : base(283, 5, 7, 12)
- {
- this.m_infinity = new SecT283K1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.Zero);
- this.m_b = FromBigInteger(BigInteger.One);
- this.m_order = new BigInteger(1, Hex.Decode("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61"));
- this.m_cofactor = BigInteger.ValueOf(4);
-
- this.m_coord = SecT283K1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT283K1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- protected override ECMultiplier CreateDefaultMultiplier()
- {
- return new WTauNafMultiplier();
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 283; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT283FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT283K1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT283K1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return true; }
- }
-
- public virtual int M
- {
- get { return 283; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return false; }
- }
-
- public virtual int K1
- {
- get { return 5; }
- }
-
- public virtual int K2
- {
- get { return 7; }
- }
-
- public virtual int K3
- {
- get { return 12; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT283K1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT283K1Point.cs
deleted file mode 100644
index 9856894..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT283K1Point.cs
+++ /dev/null
@@ -1,289 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT283K1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT283K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT283K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT283K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT283K1Point(null, this.AffineXCoord, this.AffineYCoord); // earlier JDK
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1);
- if (X3.IsZero)
- {
- return new SecT283K1Point(curve, X3, curve.B, IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT283K1Point(curve, X3, curve.B, IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT283K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement T;
- if (Z1IsOne)
- {
- T = L1.Square().Add(L1);
- }
- else
- {
- T = L1.Add(Z1).Multiply(L1);
- }
-
- if (T.IsZero)
- {
- return new SecT283K1Point(curve, T, curve.B, IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement t1 = L1.Add(X1).Square();
- ECFieldElement t2 = Z1IsOne ? Z1 : Z1Sq.Square();
- ECFieldElement L3 = t1.Add(T).Add(Z1Sq).Multiply(t1).Add(t2).Add(X3).Add(Z3);
-
- return new SecT283K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- // NOTE: TwicePlus() only optimized for lambda-affine argument
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = L1Sq.Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = L2plus1.Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT283K1Point(curve, A, curve.B, IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new SecT283K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT283K1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT283R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT283R1Curve.cs
deleted file mode 100644
index e659675..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT283R1Curve.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT283R1Curve
- : AbstractF2mCurve
- {
- private const int SecT283R1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT283R1Point m_infinity;
-
- public SecT283R1Curve()
- : base(283, 5, 7, 12)
- {
- this.m_infinity = new SecT283R1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.One);
- this.m_b = FromBigInteger(new BigInteger(1, Hex.Decode("027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5")));
- this.m_order = new BigInteger(1, Hex.Decode("03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT283R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT283R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 283; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT283FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT283R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT283R1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return false; }
- }
-
- public virtual int M
- {
- get { return 283; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return false; }
- }
-
- public virtual int K1
- {
- get { return 5; }
- }
-
- public virtual int K2
- {
- get { return 7; }
- }
-
- public virtual int K3
- {
- get { return 12; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT283R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT283R1Point.cs
deleted file mode 100644
index 4c1a780..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT283R1Point.cs
+++ /dev/null
@@ -1,278 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT283R1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT283R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT283R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT283R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT283R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).AddOne();
- if (X3.IsZero)
- {
- return new SecT283R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT283R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT283R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement T = L1.Square().Add(L1Z1).Add(Z1Sq);
- if (T.IsZero)
- {
- return new SecT283R1Point(curve, T, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
-
- return new SecT283R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = Z1Sq.Add(L1Sq).Add(L1Z1);
- ECFieldElement A = L2.Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT283R1Point(curve, A, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2.AddOne(), Z3);
-
- return new SecT283R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT283R1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT409Field.cs b/BCCrypto/src/math/ec/custom/sec/SecT409Field.cs
deleted file mode 100644
index 861b77a..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT409Field.cs
+++ /dev/null
@@ -1,331 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT409Field
- {
- private const ulong M25 = ulong.MaxValue >> 39;
- private const ulong M59 = ulong.MaxValue >> 5;
-
- public static void Add(ulong[] x, ulong[] y, ulong[] z)
- {
- z[0] = x[0] ^ y[0];
- z[1] = x[1] ^ y[1];
- z[2] = x[2] ^ y[2];
- z[3] = x[3] ^ y[3];
- z[4] = x[4] ^ y[4];
- z[5] = x[5] ^ y[5];
- z[6] = x[6] ^ y[6];
- }
-
- public static void AddExt(ulong[] xx, ulong[] yy, ulong[] zz)
- {
- for (int i = 0; i < 13; ++i)
- {
- zz[i] = xx[i] ^ yy[i];
- }
- }
-
- public static void AddOne(ulong[] x, ulong[] z)
- {
- z[0] = x[0] ^ 1UL;
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- z[4] = x[4];
- z[5] = x[5];
- z[6] = x[6];
- }
-
- public static ulong[] FromBigInteger(BigInteger x)
- {
- ulong[] z = Nat448.FromBigInteger64(x);
- Reduce39(z, 0);
- return z;
- }
-
- public static void Invert(ulong[] x, ulong[] z)
- {
- if (Nat448.IsZero64(x))
- throw new InvalidOperationException();
-
- // Itoh-Tsujii inversion with bases { 2, 3 }
-
- ulong[] t0 = Nat448.Create64();
- ulong[] t1 = Nat448.Create64();
- ulong[] t2 = Nat448.Create64();
-
- Square(x, t0);
-
- // 3 | 408
- SquareN(t0, 1, t1);
- Multiply(t0, t1, t0);
- SquareN(t1, 1, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 136
- SquareN(t0, 3, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 68
- SquareN(t0, 6, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 34
- SquareN(t0, 12, t1);
- Multiply(t0, t1, t2);
-
- // ! {2,3} | 17
- SquareN(t2, 24, t0);
- SquareN(t0, 24, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 8
- SquareN(t0, 48, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 4
- SquareN(t0, 96, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 2
- SquareN(t0, 192, t1);
- Multiply(t0, t1, t0);
-
- Multiply(t0, t2, z);
- }
-
- public static void Multiply(ulong[] x, ulong[] y, ulong[] z)
- {
- ulong[] tt = Nat448.CreateExt64();
- ImplMultiply(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz)
- {
- ulong[] tt = Nat448.CreateExt64();
- ImplMultiply(x, y, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void Reduce(ulong[] xx, ulong[] z)
- {
- ulong x00 = xx[0], x01 = xx[1], x02 = xx[2], x03 = xx[3];
- ulong x04 = xx[4], x05 = xx[5], x06 = xx[6], x07 = xx[7];
-
- ulong u = xx[12];
- x05 ^= (u << 39);
- x06 ^= (u >> 25) ^ (u << 62);
- x07 ^= (u >> 2);
-
- u = xx[11];
- x04 ^= (u << 39);
- x05 ^= (u >> 25) ^ (u << 62);
- x06 ^= (u >> 2);
-
- u = xx[10];
- x03 ^= (u << 39);
- x04 ^= (u >> 25) ^ (u << 62);
- x05 ^= (u >> 2);
-
- u = xx[9];
- x02 ^= (u << 39);
- x03 ^= (u >> 25) ^ (u << 62);
- x04 ^= (u >> 2);
-
- u = xx[8];
- x01 ^= (u << 39);
- x02 ^= (u >> 25) ^ (u << 62);
- x03 ^= (u >> 2);
-
- u = x07;
- x00 ^= (u << 39);
- x01 ^= (u >> 25) ^ (u << 62);
- x02 ^= (u >> 2);
-
- ulong t = x06 >> 25;
- z[0] = x00 ^ t;
- z[1] = x01 ^ (t << 23);
- z[2] = x02;
- z[3] = x03;
- z[4] = x04;
- z[5] = x05;
- z[6] = x06 & M25;
- }
-
- public static void Reduce39(ulong[] z, int zOff)
- {
- ulong z6 = z[zOff + 6], t = z6 >> 25;
- z[zOff ] ^= t;
- z[zOff + 1] ^= (t << 23);
- z[zOff + 6] = z6 & M25;
- }
-
- public static void Sqrt(ulong[] x, ulong[] z)
- {
- ulong u0, u1;
- u0 = Interleave.Unshuffle(x[0]); u1 = Interleave.Unshuffle(x[1]);
- ulong e0 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- ulong c0 = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- u0 = Interleave.Unshuffle(x[2]); u1 = Interleave.Unshuffle(x[3]);
- ulong e1 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- ulong c1 = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- u0 = Interleave.Unshuffle(x[4]); u1 = Interleave.Unshuffle(x[5]);
- ulong e2 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- ulong c2 = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
-
- u0 = Interleave.Unshuffle(x[6]);
- ulong e3 = (u0 & 0x00000000FFFFFFFFUL);
- ulong c3 = (u0 >> 32);
-
- z[0] = e0 ^ (c0 << 44);
- z[1] = e1 ^ (c1 << 44) ^ (c0 >> 20);
- z[2] = e2 ^ (c2 << 44) ^ (c1 >> 20);
- z[3] = e3 ^ (c3 << 44) ^ (c2 >> 20) ^ (c0 << 13);
- z[4] = (c3 >> 20) ^ (c1 << 13) ^ (c0 >> 51);
- z[5] = (c2 << 13) ^ (c1 >> 51);
- z[6] = (c3 << 13) ^ (c2 >> 51);
-
- Debug.Assert((c3 >> 51) == 0);
- }
-
- public static void Square(ulong[] x, ulong[] z)
- {
- ulong[] tt = Nat.Create64(13);
- ImplSquare(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareAddToExt(ulong[] x, ulong[] zz)
- {
- ulong[] tt = Nat.Create64(13);
- ImplSquare(x, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void SquareN(ulong[] x, int n, ulong[] z)
- {
- Debug.Assert(n > 0);
-
- ulong[] tt = Nat.Create64(13);
- ImplSquare(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- ImplSquare(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static uint Trace(ulong[] x)
- {
- // Non-zero-trace bits: 0
- return (uint)(x[0]) & 1U;
- }
-
- protected static void ImplCompactExt(ulong[] zz)
- {
- ulong z00 = zz[ 0], z01 = zz[ 1], z02 = zz[ 2], z03 = zz[ 3], z04 = zz[ 4], z05 = zz[ 5], z06 = zz[ 6];
- ulong z07 = zz[ 7], z08 = zz[ 8], z09 = zz[ 9], z10 = zz[10], z11 = zz[11], z12 = zz[12], z13 = zz[13];
- zz[ 0] = z00 ^ (z01 << 59);
- zz[ 1] = (z01 >> 5) ^ (z02 << 54);
- zz[ 2] = (z02 >> 10) ^ (z03 << 49);
- zz[ 3] = (z03 >> 15) ^ (z04 << 44);
- zz[ 4] = (z04 >> 20) ^ (z05 << 39);
- zz[ 5] = (z05 >> 25) ^ (z06 << 34);
- zz[ 6] = (z06 >> 30) ^ (z07 << 29);
- zz[ 7] = (z07 >> 35) ^ (z08 << 24);
- zz[ 8] = (z08 >> 40) ^ (z09 << 19);
- zz[ 9] = (z09 >> 45) ^ (z10 << 14);
- zz[10] = (z10 >> 50) ^ (z11 << 9);
- zz[11] = (z11 >> 55) ^ (z12 << 4)
- ^ (z13 << 63);
- zz[12] = (z12 >> 60)
- ^ (z13 >> 1);
- zz[13] = 0;
- }
-
- protected static void ImplExpand(ulong[] x, ulong[] z)
- {
- ulong x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6];
- z[0] = x0 & M59;
- z[1] = ((x0 >> 59) ^ (x1 << 5)) & M59;
- z[2] = ((x1 >> 54) ^ (x2 << 10)) & M59;
- z[3] = ((x2 >> 49) ^ (x3 << 15)) & M59;
- z[4] = ((x3 >> 44) ^ (x4 << 20)) & M59;
- z[5] = ((x4 >> 39) ^ (x5 << 25)) & M59;
- z[6] = ((x5 >> 34) ^ (x6 << 30));
- }
-
- protected static void ImplMultiply(ulong[] x, ulong[] y, ulong[] zz)
- {
- ulong[] a = new ulong[7], b = new ulong[7];
- ImplExpand(x, a);
- ImplExpand(y, b);
-
- for (int i = 0; i < 7; ++i)
- {
- ImplMulwAcc(a, b[i], zz, i);
- }
-
- ImplCompactExt(zz);
- }
-
- protected static void ImplMulwAcc(ulong[] xs, ulong y, ulong[] z, int zOff)
- {
- Debug.Assert(y >> 59 == 0);
-
- ulong[] u = new ulong[8];
- //u[0] = 0;
- u[1] = y;
- u[2] = u[1] << 1;
- u[3] = u[2] ^ y;
- u[4] = u[2] << 1;
- u[5] = u[4] ^ y;
- u[6] = u[3] << 1;
- u[7] = u[6] ^ y;
-
- for (int i = 0; i < 7; ++i)
- {
- ulong x = xs[i];
-
- Debug.Assert(x >> 59 == 0);
-
- uint j = (uint)x;
- ulong g, h = 0, l = u[j & 7]
- ^ (u[(j >> 3) & 7] << 3);
- int k = 54;
- do
- {
- j = (uint)(x >> k);
- g = u[j & 7]
- ^ u[(j >> 3) & 7] << 3;
- l ^= (g << k);
- h ^= (g >> -k);
- }
- while ((k -= 6) > 0);
-
- Debug.Assert(h >> 53 == 0);
-
- z[zOff + i ] ^= l & M59;
- z[zOff + i + 1] ^= (l >> 59) ^ (h << 5);
- }
- }
-
- protected static void ImplSquare(ulong[] x, ulong[] zz)
- {
- for (int i = 0; i < 6; ++i)
- {
- Interleave.Expand64To128(x[i], zz, i << 1);
- }
- zz[12] = Interleave.Expand32to64((uint)x[6]);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT409FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecT409FieldElement.cs
deleted file mode 100644
index f954f46..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT409FieldElement.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT409FieldElement
- : ECFieldElement
- {
- protected ulong[] x;
-
- public SecT409FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.BitLength > 409)
- throw new ArgumentException("value invalid for SecT409FieldElement", "x");
-
- this.x = SecT409Field.FromBigInteger(x);
- }
-
- public SecT409FieldElement()
- {
- this.x = Nat448.Create64();
- }
-
- protected internal SecT409FieldElement(ulong[] x)
- {
- this.x = x;
- }
-
- public override bool IsOne
- {
- get { return Nat448.IsOne64(x); }
- }
-
- public override bool IsZero
- {
- get { return Nat448.IsZero64(x); }
- }
-
- public override bool TestBitZero()
- {
- return (x[0] & 1UL) != 0UL;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat448.ToBigInteger64(x);
- }
-
- public override string FieldName
- {
- get { return "SecT409Field"; }
- }
-
- public override int FieldSize
- {
- get { return 409; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- ulong[] z = Nat448.Create64();
- SecT409Field.Add(x, ((SecT409FieldElement)b).x, z);
- return new SecT409FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- ulong[] z = Nat448.Create64();
- SecT409Field.AddOne(x, z);
- return new SecT409FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- // Addition and subtraction are the same in F2m
- return Add(b);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- ulong[] z = Nat448.Create64();
- SecT409Field.Multiply(x, ((SecT409FieldElement)b).x, z);
- return new SecT409FieldElement(z);
- }
-
- public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- return MultiplyPlusProduct(b, x, y);
- }
-
- public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x, bx = ((SecT409FieldElement)b).x;
- ulong[] xx = ((SecT409FieldElement)x).x, yx = ((SecT409FieldElement)y).x;
-
- ulong[] tt = Nat.Create64(13);
- SecT409Field.MultiplyAddToExt(ax, bx, tt);
- SecT409Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat448.Create64();
- SecT409Field.Reduce(tt, z);
- return new SecT409FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- return Multiply(b.Invert());
- }
-
- public override ECFieldElement Negate()
- {
- return this;
- }
-
- public override ECFieldElement Square()
- {
- ulong[] z = Nat448.Create64();
- SecT409Field.Square(x, z);
- return new SecT409FieldElement(z);
- }
-
- public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y)
- {
- return SquarePlusProduct(x, y);
- }
-
- public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x;
- ulong[] xx = ((SecT409FieldElement)x).x, yx = ((SecT409FieldElement)y).x;
-
- ulong[] tt = Nat.Create64(13);
- SecT409Field.SquareAddToExt(ax, tt);
- SecT409Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat448.Create64();
- SecT409Field.Reduce(tt, z);
- return new SecT409FieldElement(z);
- }
-
- public override ECFieldElement SquarePow(int pow)
- {
- if (pow < 1)
- return this;
-
- ulong[] z = Nat448.Create64();
- SecT409Field.SquareN(x, pow, z);
- return new SecT409FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- ulong[] z = Nat448.Create64();
- SecT409Field.Invert(x, z);
- return new SecT409FieldElement(z);
- }
-
- public override ECFieldElement Sqrt()
- {
- ulong[] z = Nat448.Create64();
- SecT409Field.Sqrt(x, z);
- return new SecT409FieldElement(z);
- }
-
- public virtual int Representation
- {
- get { return F2mFieldElement.Tpb; }
- }
-
- public virtual int M
- {
- get { return 409; }
- }
-
- public virtual int K1
- {
- get { return 87; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecT409FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecT409FieldElement);
- }
-
- public virtual bool Equals(SecT409FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat448.Eq64(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return 4090087 ^ Arrays.GetHashCode(x, 0, 7);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT409K1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT409K1Curve.cs
deleted file mode 100644
index 4f57355..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT409K1Curve.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT409K1Curve
- : AbstractF2mCurve
- {
- private const int SecT409K1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT409K1Point m_infinity;
-
- public SecT409K1Curve()
- : base(409, 87, 0, 0)
- {
- this.m_infinity = new SecT409K1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.Zero);
- this.m_b = FromBigInteger(BigInteger.One);
- this.m_order = new BigInteger(1, Hex.Decode("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF"));
- this.m_cofactor = BigInteger.ValueOf(4);
-
- this.m_coord = SecT409K1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT409K1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- protected override ECMultiplier CreateDefaultMultiplier()
- {
- return new WTauNafMultiplier();
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 409; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT409FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT409K1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT409K1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return true; }
- }
-
- public virtual int M
- {
- get { return 409; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return true; }
- }
-
- public virtual int K1
- {
- get { return 87; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT409K1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT409K1Point.cs
deleted file mode 100644
index e67ca9a..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT409K1Point.cs
+++ /dev/null
@@ -1,289 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT409K1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT409K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT409K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT409K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT409K1Point(null, this.AffineXCoord, this.AffineYCoord); // earlier JDK
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1);
- if (X3.IsZero)
- {
- return new SecT409K1Point(curve, X3, curve.B, IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT409K1Point(curve, X3, curve.B, IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT409K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement T;
- if (Z1IsOne)
- {
- T = L1.Square().Add(L1);
- }
- else
- {
- T = L1.Add(Z1).Multiply(L1);
- }
-
- if (T.IsZero)
- {
- return new SecT409K1Point(curve, T, curve.B, IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement t1 = L1.Add(X1).Square();
- ECFieldElement t2 = Z1IsOne ? Z1 : Z1Sq.Square();
- ECFieldElement L3 = t1.Add(T).Add(Z1Sq).Multiply(t1).Add(t2).Add(X3).Add(Z3);
-
- return new SecT409K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- // NOTE: TwicePlus() only optimized for lambda-affine argument
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = L1Sq.Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = L2plus1.Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT409K1Point(curve, A, curve.B, IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new SecT409K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT409K1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT409R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT409R1Curve.cs
deleted file mode 100644
index 9212fb5..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT409R1Curve.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT409R1Curve
- : AbstractF2mCurve
- {
- private const int SecT409R1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT409R1Point m_infinity;
-
- public SecT409R1Curve()
- : base(409, 87, 0, 0)
- {
- this.m_infinity = new SecT409R1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.One);
- this.m_b = FromBigInteger(new BigInteger(1, Hex.Decode("0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F")));
- this.m_order = new BigInteger(1, Hex.Decode("010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT409R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT409R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 409; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT409FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT409R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT409R1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return false; }
- }
-
- public virtual int M
- {
- get { return 409; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return true; }
- }
-
- public virtual int K1
- {
- get { return 87; }
- }
-
- public virtual int K2
- {
- get { return 0; }
- }
-
- public virtual int K3
- {
- get { return 0; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT409R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT409R1Point.cs
deleted file mode 100644
index 92f6143..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT409R1Point.cs
+++ /dev/null
@@ -1,278 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT409R1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT409R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT409R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT409R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT409R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).AddOne();
- if (X3.IsZero)
- {
- return new SecT409R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT409R1Point(curve, X3, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT409R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement T = L1.Square().Add(L1Z1).Add(Z1Sq);
- if (T.IsZero)
- {
- return new SecT409R1Point(curve, T, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
-
- return new SecT409R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = Z1Sq.Add(L1Sq).Add(L1Z1);
- ECFieldElement A = L2.Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT409R1Point(curve, A, curve.B.Sqrt(), IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2.AddOne(), Z3);
-
- return new SecT409R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT409R1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT571Field.cs b/BCCrypto/src/math/ec/custom/sec/SecT571Field.cs
deleted file mode 100644
index 98f4f7f..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT571Field.cs
+++ /dev/null
@@ -1,333 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Math.Raw;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT571Field
- {
- private const ulong M59 = ulong.MaxValue >> 5;
-
- private const ulong RM = 0xEF7BDEF7BDEF7BDEUL;
-
- private static readonly ulong[] ROOT_Z = new ulong[]{ 0x2BE1195F08CAFB99UL, 0x95F08CAF84657C23UL, 0xCAF84657C232BE11UL, 0x657C232BE1195F08UL,
- 0xF84657C2308CAF84UL, 0x7C232BE1195F08CAUL, 0xBE1195F08CAF8465UL, 0x5F08CAF84657C232UL, 0x784657C232BE119UL };
-
- public static void Add(ulong[] x, ulong[] y, ulong[] z)
- {
- for (int i = 0; i < 9; ++i)
- {
- z[i] = x[i] ^ y[i];
- }
- }
-
- private static void Add(ulong[] x, int xOff, ulong[] y, int yOff, ulong[] z, int zOff)
- {
- for (int i = 0; i < 9; ++i)
- {
- z[zOff + i] = x[xOff + i] ^ y[yOff + i];
- }
- }
-
- private static void AddBothTo(ulong[] x, int xOff, ulong[] y, int yOff, ulong[] z, int zOff)
- {
- for (int i = 0; i < 9; ++i)
- {
- z[zOff + i] ^= x[xOff + i] ^ y[yOff + i];
- }
- }
-
- public static void AddExt(ulong[] xx, ulong[] yy, ulong[] zz)
- {
- for (int i = 0; i < 18; ++i)
- {
- zz[i] = xx[i] ^ yy[i];
- }
- }
-
- public static void AddOne(ulong[] x, ulong[] z)
- {
- z[0] = x[0] ^ 1UL;
- for (int i = 1; i < 9; ++i)
- {
- z[i] = x[i];
- }
- }
-
- public static ulong[] FromBigInteger(BigInteger x)
- {
- ulong[] z = Nat576.FromBigInteger64(x);
- Reduce5(z, 0);
- return z;
- }
-
- public static void Invert(ulong[] x, ulong[] z)
- {
- if (Nat576.IsZero64(x))
- throw new InvalidOperationException();
-
- // Itoh-Tsujii inversion with bases { 2, 3, 5 }
-
- ulong[] t0 = Nat576.Create64();
- ulong[] t1 = Nat576.Create64();
- ulong[] t2 = Nat576.Create64();
-
- Square(x, t2);
-
- // 5 | 570
- Square(t2, t0);
- Square(t0, t1);
- Multiply(t0, t1, t0);
- SquareN(t0, 2, t1);
- Multiply(t0, t1, t0);
- Multiply(t0, t2, t0);
-
- // 3 | 114
- SquareN(t0, 5, t1);
- Multiply(t0, t1, t0);
- SquareN(t1, 5, t1);
- Multiply(t0, t1, t0);
-
- // 2 | 38
- SquareN(t0, 15, t1);
- Multiply(t0, t1, t2);
-
- // ! {2,3,5} | 19
- SquareN(t2, 30, t0);
- SquareN(t0, 30, t1);
- Multiply(t0, t1, t0);
-
- // 3 | 9
- SquareN(t0, 60, t1);
- Multiply(t0, t1, t0);
- SquareN(t1, 60, t1);
- Multiply(t0, t1, t0);
-
- // 3 | 3
- SquareN(t0, 180, t1);
- Multiply(t0, t1, t0);
- SquareN(t1, 180, t1);
- Multiply(t0, t1, t0);
-
- Multiply(t0, t2, z);
- }
-
- public static void Multiply(ulong[] x, ulong[] y, ulong[] z)
- {
- ulong[] tt = Nat576.CreateExt64();
- ImplMultiply(x, y, tt);
- Reduce(tt, z);
- }
-
- public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz)
- {
- ulong[] tt = Nat576.CreateExt64();
- ImplMultiply(x, y, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void Reduce(ulong[] xx, ulong[] z)
- {
- ulong xx09 = xx[9];
- ulong u = xx[17], v = xx09;
-
- xx09 = v ^ (u >> 59) ^ (u >> 57) ^ (u >> 54) ^ (u >> 49);
- v = xx[8] ^ (u << 5) ^ (u << 7) ^ (u << 10) ^ (u << 15);
-
- for (int i = 16; i >= 10; --i)
- {
- u = xx[i];
- z[i - 8] = v ^ (u >> 59) ^ (u >> 57) ^ (u >> 54) ^ (u >> 49);
- v = xx[i - 9] ^ (u << 5) ^ (u << 7) ^ (u << 10) ^ (u << 15);
- }
-
- u = xx09;
- z[1] = v ^ (u >> 59) ^ (u >> 57) ^ (u >> 54) ^ (u >> 49);
- v = xx[0] ^ (u << 5) ^ (u << 7) ^ (u << 10) ^ (u << 15);
-
- ulong x08 = z[8];
- ulong t = x08 >> 59;
- z[0] = v ^ t ^ (t << 2) ^ (t << 5) ^ (t << 10);
- z[8] = x08 & M59;
- }
-
- public static void Reduce5(ulong[] z, int zOff)
- {
- ulong z8 = z[zOff + 8], t = z8 >> 59;
- z[zOff ] ^= t ^ (t << 2) ^ (t << 5) ^ (t << 10);
- z[zOff + 8] = z8 & M59;
- }
-
- public static void Sqrt(ulong[] x, ulong[] z)
- {
- ulong[] evn = Nat576.Create64(), odd = Nat576.Create64();
-
- int pos = 0;
- for (int i = 0; i < 4; ++i)
- {
- ulong u0 = Interleave.Unshuffle(x[pos++]);
- ulong u1 = Interleave.Unshuffle(x[pos++]);
- evn[i] = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);
- odd[i] = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);
- }
- {
- ulong u0 = Interleave.Unshuffle(x[pos]);
- evn[4] = (u0 & 0x00000000FFFFFFFFUL);
- odd[4] = (u0 >> 32);
- }
-
- Multiply(odd, ROOT_Z, z);
- Add(z, evn, z);
- }
-
- public static void Square(ulong[] x, ulong[] z)
- {
- ulong[] tt = Nat576.CreateExt64();
- ImplSquare(x, tt);
- Reduce(tt, z);
- }
-
- public static void SquareAddToExt(ulong[] x, ulong[] zz)
- {
- ulong[] tt = Nat576.CreateExt64();
- ImplSquare(x, tt);
- AddExt(zz, tt, zz);
- }
-
- public static void SquareN(ulong[] x, int n, ulong[] z)
- {
- Debug.Assert(n > 0);
-
- ulong[] tt = Nat576.CreateExt64();
- ImplSquare(x, tt);
- Reduce(tt, z);
-
- while (--n > 0)
- {
- ImplSquare(z, tt);
- Reduce(tt, z);
- }
- }
-
- public static uint Trace(ulong[] x)
- {
- // Non-zero-trace bits: 0, 561, 569
- return (uint)(x[0] ^ (x[8] >> 49) ^ (x[8] >> 57)) & 1U;
- }
-
- protected static void ImplMultiply(ulong[] x, ulong[] y, ulong[] zz)
- {
- //for (int i = 0; i < 9; ++i)
- //{
- // ImplMulwAcc(x, y[i], zz, i);
- //}
-
- /*
- * Precompute table of all 4-bit products of y
- */
- ulong[] T0 = new ulong[9 << 4];
- Array.Copy(y, 0, T0, 9, 9);
- // Reduce5(T0, 9);
- int tOff = 0;
- for (int i = 7; i > 0; --i)
- {
- tOff += 18;
- Nat.ShiftUpBit64(9, T0, tOff >> 1, 0UL, T0, tOff);
- Reduce5(T0, tOff);
- Add(T0, 9, T0, tOff, T0, tOff + 9);
- }
-
- /*
- * Second table with all 4-bit products of B shifted 4 bits
- */
- ulong[] T1 = new ulong[T0.Length];
- Nat.ShiftUpBits64(T0.Length, T0, 0, 4, 0L, T1, 0);
-
- uint MASK = 0xF;
-
- /*
- * Lopez-Dahab algorithm
- */
-
- for (int k = 56; k >= 0; k -= 8)
- {
- for (int j = 1; j < 9; j += 2)
- {
- uint aVal = (uint)(x[j] >> k);
- uint u = aVal & MASK;
- uint v = (aVal >> 4) & MASK;
- AddBothTo(T0, (int)(9 * u), T1, (int)(9 * v), zz, j - 1);
- }
- Nat.ShiftUpBits64(16, zz, 0, 8, 0L);
- }
-
- for (int k = 56; k >= 0; k -= 8)
- {
- for (int j = 0; j < 9; j += 2)
- {
- uint aVal = (uint)(x[j] >> k);
- uint u = aVal & MASK;
- uint v = (aVal >> 4) & MASK;
- AddBothTo(T0, (int)(9 * u), T1, (int)(9 * v), zz, j);
- }
- if (k > 0)
- {
- Nat.ShiftUpBits64(18, zz, 0, 8, 0L);
- }
- }
- }
-
- protected static void ImplMulwAcc(ulong[] xs, ulong y, ulong[] z, int zOff)
- {
- ulong[] u = new ulong[32];
- //u[0] = 0;
- u[1] = y;
- for (int i = 2; i < 32; i += 2)
- {
- u[i ] = u[i >> 1] << 1;
- u[i + 1] = u[i ] ^ y;
- }
-
- ulong l = 0;
- for (int i = 0; i < 9; ++i)
- {
- ulong x = xs[i];
-
- uint j = (uint)x;
-
- l ^= u[j & 31];
-
- ulong g, h = 0;
- int k = 60;
- do
- {
- j = (uint)(x >> k);
- g = u[j & 31];
- l ^= (g << k);
- h ^= (g >> -k);
- }
- while ((k -= 5) > 0);
-
- for (int p = 0; p < 4; ++p)
- {
- x = (x & RM) >> 1;
- h ^= x & (ulong)(((long)y << p) >> 63);
- }
-
- z[zOff + i] ^= l;
-
- l = h;
- }
- z[zOff + 9] ^= l;
- }
-
- protected static void ImplSquare(ulong[] x, ulong[] zz)
- {
- for (int i = 0; i < 9; ++i)
- {
- Interleave.Expand64To128(x[i], zz, i << 1);
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT571FieldElement.cs b/BCCrypto/src/math/ec/custom/sec/SecT571FieldElement.cs
deleted file mode 100644
index c43b8dc..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT571FieldElement.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.Raw;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT571FieldElement
- : ECFieldElement
- {
- protected readonly ulong[] x;
-
- public SecT571FieldElement(BigInteger x)
- {
- if (x == null || x.SignValue < 0 || x.BitLength > 571)
- throw new ArgumentException("value invalid for SecT571FieldElement", "x");
-
- this.x = SecT571Field.FromBigInteger(x);
- }
-
- public SecT571FieldElement()
- {
- this.x = Nat576.Create64();
- }
-
- protected internal SecT571FieldElement(ulong[] x)
- {
- this.x = x;
- }
-
- public override bool IsOne
- {
- get { return Nat576.IsOne64(x); }
- }
-
- public override bool IsZero
- {
- get { return Nat576.IsZero64(x); }
- }
-
- public override bool TestBitZero()
- {
- return (x[0] & 1UL) != 0UL;
- }
-
- public override BigInteger ToBigInteger()
- {
- return Nat576.ToBigInteger64(x);
- }
-
- public override String FieldName
- {
- get { return "SecT571Field"; }
- }
-
- public override int FieldSize
- {
- get { return 571; }
- }
-
- public override ECFieldElement Add(ECFieldElement b)
- {
- ulong[] z = Nat576.Create64();
- SecT571Field.Add(x, ((SecT571FieldElement)b).x, z);
- return new SecT571FieldElement(z);
- }
-
- public override ECFieldElement AddOne()
- {
- ulong[] z = Nat576.Create64();
- SecT571Field.AddOne(x, z);
- return new SecT571FieldElement(z);
- }
-
- public override ECFieldElement Subtract(ECFieldElement b)
- {
- // Addition and subtraction are the same in F2m
- return Add(b);
- }
-
- public override ECFieldElement Multiply(ECFieldElement b)
- {
- ulong[] z = Nat576.Create64();
- SecT571Field.Multiply(x, ((SecT571FieldElement)b).x, z);
- return new SecT571FieldElement(z);
- }
-
- public override ECFieldElement MultiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- return MultiplyPlusProduct(b, x, y);
- }
-
- public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x, bx = ((SecT571FieldElement)b).x;
- ulong[] xx = ((SecT571FieldElement)x).x, yx = ((SecT571FieldElement)y).x;
-
- ulong[] tt = Nat576.CreateExt64();
- SecT571Field.MultiplyAddToExt(ax, bx, tt);
- SecT571Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat576.Create64();
- SecT571Field.Reduce(tt, z);
- return new SecT571FieldElement(z);
- }
-
- public override ECFieldElement Divide(ECFieldElement b)
- {
- return Multiply(b.Invert());
- }
-
- public override ECFieldElement Negate()
- {
- return this;
- }
-
- public override ECFieldElement Square()
- {
- ulong[] z = Nat576.Create64();
- SecT571Field.Square(x, z);
- return new SecT571FieldElement(z);
- }
-
- public override ECFieldElement SquareMinusProduct(ECFieldElement x, ECFieldElement y)
- {
- return SquarePlusProduct(x, y);
- }
-
- public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
- {
- ulong[] ax = this.x;
- ulong[] xx = ((SecT571FieldElement)x).x, yx = ((SecT571FieldElement)y).x;
-
- ulong[] tt = Nat576.CreateExt64();
- SecT571Field.SquareAddToExt(ax, tt);
- SecT571Field.MultiplyAddToExt(xx, yx, tt);
-
- ulong[] z = Nat576.Create64();
- SecT571Field.Reduce(tt, z);
- return new SecT571FieldElement(z);
- }
-
- public override ECFieldElement SquarePow(int pow)
- {
- if (pow < 1)
- return this;
-
- ulong[] z = Nat576.Create64();
- SecT571Field.SquareN(x, pow, z);
- return new SecT571FieldElement(z);
- }
-
- public override ECFieldElement Invert()
- {
- ulong[] z = Nat576.Create64();
- SecT571Field.Invert(x, z);
- return new SecT571FieldElement(z);
- }
-
- public override ECFieldElement Sqrt()
- {
- ulong[] z = Nat576.Create64();
- SecT571Field.Sqrt(x, z);
- return new SecT571FieldElement(z);
- }
-
- public virtual int Representation
- {
- get { return F2mFieldElement.Ppb; }
- }
-
- public virtual int M
- {
- get { return 571; }
- }
-
- public virtual int K1
- {
- get { return 2; }
- }
-
- public virtual int K2
- {
- get { return 5; }
- }
-
- public virtual int K3
- {
- get { return 10; }
- }
-
- public override bool Equals(object obj)
- {
- return Equals(obj as SecT571FieldElement);
- }
-
- public override bool Equals(ECFieldElement other)
- {
- return Equals(other as SecT571FieldElement);
- }
-
- public virtual bool Equals(SecT571FieldElement other)
- {
- if (this == other)
- return true;
- if (null == other)
- return false;
- return Nat576.Eq64(x, other.x);
- }
-
- public override int GetHashCode()
- {
- return 5711052 ^ Arrays.GetHashCode(x, 0, 9);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT571K1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT571K1Curve.cs
deleted file mode 100644
index f5806f0..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT571K1Curve.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.EC.Multiplier;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT571K1Curve
- : AbstractF2mCurve
- {
- private const int SecT571K1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT571K1Point m_infinity;
-
- public SecT571K1Curve()
- : base(571, 2, 5, 10)
- {
- this.m_infinity = new SecT571K1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.Zero);
- this.m_b = FromBigInteger(BigInteger.One);
- this.m_order = new BigInteger(1, Hex.Decode("020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001"));
- this.m_cofactor = BigInteger.ValueOf(4);
-
- this.m_coord = SecT571K1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT571K1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- protected override ECMultiplier CreateDefaultMultiplier()
- {
- return new WTauNafMultiplier();
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 571; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT571FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT571K1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT571K1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return true; }
- }
-
- public virtual int M
- {
- get { return 571; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return false; }
- }
-
- public virtual int K1
- {
- get { return 2; }
- }
-
- public virtual int K2
- {
- get { return 5; }
- }
-
- public virtual int K3
- {
- get { return 10; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT571K1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT571K1Point.cs
deleted file mode 100644
index deaaf0c..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT571K1Point.cs
+++ /dev/null
@@ -1,289 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT571K1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT571K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT571K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT571K1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT571K1Point(null, this.AffineXCoord, this.AffineYCoord); // earlier JDK
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1);
- if (X3.IsZero)
- {
- return new SecT571K1Point(curve, X3, curve.B, IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT571K1Point(curve, X3, curve.B, IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT571K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement T;
- if (Z1IsOne)
- {
- T = L1.Square().Add(L1);
- }
- else
- {
- T = L1.Add(Z1).Multiply(L1);
- }
-
- if (T.IsZero)
- {
- return new SecT571K1Point(curve, T, curve.B, IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement t1 = L1.Add(X1).Square();
- ECFieldElement t2 = Z1IsOne ? Z1 : Z1Sq.Square();
- ECFieldElement L3 = t1.Add(T).Add(Z1Sq).Multiply(t1).Add(t2).Add(X3).Add(Z3);
-
- return new SecT571K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- // NOTE: TwicePlus() only optimized for lambda-affine argument
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = L1Sq.Add(L1Z1);
- ECFieldElement L2plus1 = L2.AddOne();
- ECFieldElement A = L2plus1.Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT571K1Point(curve, A, curve.B, IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2plus1, Z3);
-
- return new SecT571K1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT571K1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT571R1Curve.cs b/BCCrypto/src/math/ec/custom/sec/SecT571R1Curve.cs
deleted file mode 100644
index 082afa5..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT571R1Curve.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT571R1Curve
- : AbstractF2mCurve
- {
- private const int SecT571R1_DEFAULT_COORDS = COORD_LAMBDA_PROJECTIVE;
-
- protected readonly SecT571R1Point m_infinity;
-
- internal static readonly SecT571FieldElement SecT571R1_B = new SecT571FieldElement(
- new BigInteger(1, Hex.Decode("02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A")));
- internal static readonly SecT571FieldElement SecT571R1_B_SQRT = (SecT571FieldElement)SecT571R1_B.Sqrt();
-
- public SecT571R1Curve()
- : base(571, 2, 5, 10)
- {
- this.m_infinity = new SecT571R1Point(this, null, null);
-
- this.m_a = FromBigInteger(BigInteger.One);
- this.m_b = SecT571R1_B;
- this.m_order = new BigInteger(1, Hex.Decode("03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47"));
- this.m_cofactor = BigInteger.Two;
-
- this.m_coord = SecT571R1_DEFAULT_COORDS;
- }
-
- protected override ECCurve CloneCurve()
- {
- return new SecT571R1Curve();
- }
-
- public override bool SupportsCoordinateSystem(int coord)
- {
- switch (coord)
- {
- case COORD_LAMBDA_PROJECTIVE:
- return true;
- default:
- return false;
- }
- }
-
- public override ECPoint Infinity
- {
- get { return m_infinity; }
- }
-
- public override int FieldSize
- {
- get { return 571; }
- }
-
- public override ECFieldElement FromBigInteger(BigInteger x)
- {
- return new SecT571FieldElement(x);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, bool withCompression)
- {
- return new SecT571R1Point(this, x, y, withCompression);
- }
-
- protected internal override ECPoint CreateRawPoint(ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- {
- return new SecT571R1Point(this, x, y, zs, withCompression);
- }
-
- public override bool IsKoblitz
- {
- get { return false; }
- }
-
- public virtual int M
- {
- get { return 571; }
- }
-
- public virtual bool IsTrinomial
- {
- get { return false; }
- }
-
- public virtual int K1
- {
- get { return 2; }
- }
-
- public virtual int K2
- {
- get { return 5; }
- }
-
- public virtual int K3
- {
- get { return 10; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/custom/sec/SecT571R1Point.cs b/BCCrypto/src/math/ec/custom/sec/SecT571R1Point.cs
deleted file mode 100644
index 0d1fc98..0000000
--- a/BCCrypto/src/math/ec/custom/sec/SecT571R1Point.cs
+++ /dev/null
@@ -1,278 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Custom.Sec
-{
- internal class SecT571R1Point
- : AbstractF2mPoint
- {
- /**
- * @deprecated Use ECCurve.createPoint to construct points
- */
- public SecT571R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y)
- : this(curve, x, y, false)
- {
- }
-
- /**
- * @deprecated per-point compression property will be removed, refer {@link #getEncoded(bool)}
- */
- public SecT571R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, bool withCompression)
- : base(curve, x, y, withCompression)
- {
- if ((x == null) != (y == null))
- throw new ArgumentException("Exactly one of the field elements is null");
- }
-
- internal SecT571R1Point(ECCurve curve, ECFieldElement x, ECFieldElement y, ECFieldElement[] zs, bool withCompression)
- : base(curve, x, y, zs, withCompression)
- {
- }
-
- protected override ECPoint Detach()
- {
- return new SecT571R1Point(null, AffineXCoord, AffineYCoord);
- }
-
- public override ECFieldElement YCoord
- {
- get
- {
- ECFieldElement X = RawXCoord, L = RawYCoord;
-
- if (this.IsInfinity || X.IsZero)
- return L;
-
- // Y is actually Lambda (X + Y/X) here; convert to affine value on the fly
- ECFieldElement Y = L.Add(X).Multiply(X);
-
- ECFieldElement Z = RawZCoords[0];
- if (!Z.IsOne)
- {
- Y = Y.Divide(Z);
- }
-
- return Y;
- }
- }
-
- protected internal override bool CompressionYTilde
- {
- get
- {
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return false;
-
- ECFieldElement Y = this.RawYCoord;
-
- // Y is actually Lambda (X + Y/X) here
- return Y.TestBitZero() != X.TestBitZero();
- }
- }
-
- public override ECPoint Add(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- ECFieldElement X2 = b.RawXCoord;
-
- if (X1.IsZero)
- {
- if (X2.IsZero)
- return curve.Infinity;
-
- return b.Add(this);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord, Z2 = b.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement U2 = X2, S2 = L2;
- if (!Z1IsOne)
- {
- U2 = U2.Multiply(Z1);
- S2 = S2.Multiply(Z1);
- }
-
- bool Z2IsOne = Z2.IsOne;
- ECFieldElement U1 = X1, S1 = L1;
- if (!Z2IsOne)
- {
- U1 = U1.Multiply(Z2);
- S1 = S1.Multiply(Z2);
- }
-
- ECFieldElement A = S1.Add(S2);
- ECFieldElement B = U1.Add(U2);
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return Twice();
-
- return curve.Infinity;
- }
-
- ECFieldElement X3, L3, Z3;
- if (X2.IsZero)
- {
- // TODO This can probably be optimized quite a bit
- ECPoint p = this.Normalize();
- X1 = p.XCoord;
- ECFieldElement Y1 = p.YCoord;
-
- ECFieldElement Y2 = L2;
- ECFieldElement L = Y1.Add(Y2).Divide(X1);
-
- X3 = L.Square().Add(L).Add(X1).AddOne();
- if (X3.IsZero)
- {
- return new SecT571R1Point(curve, X3, SecT571R1Curve.SecT571R1_B_SQRT, IsCompressed);
- }
-
- ECFieldElement Y3 = L.Multiply(X1.Add(X3)).Add(X3).Add(Y1);
- L3 = Y3.Divide(X3).Add(X3);
- Z3 = curve.FromBigInteger(BigInteger.One);
- }
- else
- {
- B = B.Square();
-
- ECFieldElement AU1 = A.Multiply(U1);
- ECFieldElement AU2 = A.Multiply(U2);
-
- X3 = AU1.Multiply(AU2);
- if (X3.IsZero)
- {
- return new SecT571R1Point(curve, X3, SecT571R1Curve.SecT571R1_B_SQRT, IsCompressed);
- }
-
- ECFieldElement ABZ2 = A.Multiply(B);
- if (!Z2IsOne)
- {
- ABZ2 = ABZ2.Multiply(Z2);
- }
-
- L3 = AU2.Add(B).SquarePlusProduct(ABZ2, L1.Add(Z1));
-
- Z3 = ABZ2;
- if (!Z1IsOne)
- {
- Z3 = Z3.Multiply(Z1);
- }
- }
-
- return new SecT571R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Twice()
- {
- if (this.IsInfinity)
- return this;
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return curve.Infinity;
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
-
- bool Z1IsOne = Z1.IsOne;
- ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
- ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
- ECFieldElement T = L1.Square().Add(L1Z1).Add(Z1Sq);
- if (T.IsZero)
- {
- return new SecT571R1Point(curve, T, SecT571R1Curve.SecT571R1_B_SQRT, IsCompressed);
- }
-
- ECFieldElement X3 = T.Square();
- ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);
-
- ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
- ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);
-
- return new SecT571R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint TwicePlus(ECPoint b)
- {
- if (this.IsInfinity)
- return b;
- if (b.IsInfinity)
- return Twice();
-
- ECCurve curve = this.Curve;
-
- ECFieldElement X1 = this.RawXCoord;
- if (X1.IsZero)
- {
- // A point with X == 0 is it's own Additive inverse
- return b;
- }
-
- ECFieldElement X2 = b.RawXCoord, Z2 = b.RawZCoords[0];
- if (X2.IsZero || !Z2.IsOne)
- {
- return Twice().Add(b);
- }
-
- ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];
- ECFieldElement L2 = b.RawYCoord;
-
- ECFieldElement X1Sq = X1.Square();
- ECFieldElement L1Sq = L1.Square();
- ECFieldElement Z1Sq = Z1.Square();
- ECFieldElement L1Z1 = L1.Multiply(Z1);
-
- ECFieldElement T = Z1Sq.Add(L1Sq).Add(L1Z1);
- ECFieldElement A = L2.Multiply(Z1Sq).Add(L1Sq).MultiplyPlusProduct(T, X1Sq, Z1Sq);
- ECFieldElement X2Z1Sq = X2.Multiply(Z1Sq);
- ECFieldElement B = X2Z1Sq.Add(T).Square();
-
- if (B.IsZero)
- {
- if (A.IsZero)
- return b.Twice();
-
- return curve.Infinity;
- }
-
- if (A.IsZero)
- {
- return new SecT571R1Point(curve, A, SecT571R1Curve.SecT571R1_B_SQRT, IsCompressed);
- }
-
- ECFieldElement X3 = A.Square().Multiply(X2Z1Sq);
- ECFieldElement Z3 = A.Multiply(B).Multiply(Z1Sq);
- ECFieldElement L3 = A.Add(B).Square().MultiplyPlusProduct(T, L2.AddOne(), Z3);
-
- return new SecT571R1Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
- }
-
- public override ECPoint Negate()
- {
- if (this.IsInfinity)
- return this;
-
- ECFieldElement X = this.RawXCoord;
- if (X.IsZero)
- return this;
-
- // L is actually Lambda (X + Y/X) here
- ECFieldElement L = this.RawYCoord, Z = this.RawZCoords[0];
- return new SecT571R1Point(Curve, X, L.Add(Z), new ECFieldElement[] { Z }, IsCompressed);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/endo/ECEndomorphism.cs b/BCCrypto/src/math/ec/endo/ECEndomorphism.cs
deleted file mode 100644
index dfb3213..0000000
--- a/BCCrypto/src/math/ec/endo/ECEndomorphism.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Endo
-{
- public interface ECEndomorphism
- {
- ECPointMap PointMap { get; }
-
- bool HasEfficientPointMap { get; }
- }
-}
diff --git a/BCCrypto/src/math/ec/endo/GlvEndomorphism.cs b/BCCrypto/src/math/ec/endo/GlvEndomorphism.cs
deleted file mode 100644
index f65bdd6..0000000
--- a/BCCrypto/src/math/ec/endo/GlvEndomorphism.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Endo
-{
- public interface GlvEndomorphism
- : ECEndomorphism
- {
- BigInteger[] DecomposeScalar(BigInteger k);
- }
-}
diff --git a/BCCrypto/src/math/ec/endo/GlvTypeBEndomorphism.cs b/BCCrypto/src/math/ec/endo/GlvTypeBEndomorphism.cs
deleted file mode 100644
index d234d88..0000000
--- a/BCCrypto/src/math/ec/endo/GlvTypeBEndomorphism.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Endo
-{
- public class GlvTypeBEndomorphism
- : GlvEndomorphism
- {
- protected readonly ECCurve m_curve;
- protected readonly GlvTypeBParameters m_parameters;
- protected readonly ECPointMap m_pointMap;
-
- public GlvTypeBEndomorphism(ECCurve curve, GlvTypeBParameters parameters)
- {
- this.m_curve = curve;
- this.m_parameters = parameters;
- this.m_pointMap = new ScaleXPointMap(curve.FromBigInteger(parameters.Beta));
- }
-
- public virtual BigInteger[] DecomposeScalar(BigInteger k)
- {
- int bits = m_parameters.Bits;
- BigInteger b1 = CalculateB(k, m_parameters.G1, bits);
- BigInteger b2 = CalculateB(k, m_parameters.G2, bits);
-
- BigInteger[] v1 = m_parameters.V1, v2 = m_parameters.V2;
- BigInteger a = k.Subtract((b1.Multiply(v1[0])).Add(b2.Multiply(v2[0])));
- BigInteger b = (b1.Multiply(v1[1])).Add(b2.Multiply(v2[1])).Negate();
-
- return new BigInteger[]{ a, b };
- }
-
- public virtual ECPointMap PointMap
- {
- get { return m_pointMap; }
- }
-
- public virtual bool HasEfficientPointMap
- {
- get { return true; }
- }
-
- protected virtual BigInteger CalculateB(BigInteger k, BigInteger g, int t)
- {
- bool negative = (g.SignValue < 0);
- BigInteger b = k.Multiply(g.Abs());
- bool extra = b.TestBit(t - 1);
- b = b.ShiftRight(t);
- if (extra)
- {
- b = b.Add(BigInteger.One);
- }
- return negative ? b.Negate() : b;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/endo/GlvTypeBParameters.cs b/BCCrypto/src/math/ec/endo/GlvTypeBParameters.cs
deleted file mode 100644
index f93dfaf..0000000
--- a/BCCrypto/src/math/ec/endo/GlvTypeBParameters.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Endo
-{
- public class GlvTypeBParameters
- {
- protected readonly BigInteger m_beta;
- protected readonly BigInteger m_lambda;
- protected readonly BigInteger[] m_v1, m_v2;
- protected readonly BigInteger m_g1, m_g2;
- protected readonly int m_bits;
-
- public GlvTypeBParameters(BigInteger beta, BigInteger lambda, BigInteger[] v1, BigInteger[] v2,
- BigInteger g1, BigInteger g2, int bits)
- {
- this.m_beta = beta;
- this.m_lambda = lambda;
- this.m_v1 = v1;
- this.m_v2 = v2;
- this.m_g1 = g1;
- this.m_g2 = g2;
- this.m_bits = bits;
- }
-
- public virtual BigInteger Beta
- {
- get { return m_beta; }
- }
-
- public virtual BigInteger Lambda
- {
- get { return m_lambda; }
- }
-
- public virtual BigInteger[] V1
- {
- get { return m_v1; }
- }
-
- public virtual BigInteger[] V2
- {
- get { return m_v2; }
- }
-
- public virtual BigInteger G1
- {
- get { return m_g1; }
- }
-
- public virtual BigInteger G2
- {
- get { return m_g2; }
- }
-
- public virtual int Bits
- {
- get { return m_bits; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/AbstractECMultiplier.cs b/BCCrypto/src/math/ec/multiplier/AbstractECMultiplier.cs
deleted file mode 100644
index 5178813..0000000
--- a/BCCrypto/src/math/ec/multiplier/AbstractECMultiplier.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- public abstract class AbstractECMultiplier
- : ECMultiplier
- {
- public virtual ECPoint Multiply(ECPoint p, BigInteger k)
- {
- int sign = k.SignValue;
- if (sign == 0 || p.IsInfinity)
- return p.Curve.Infinity;
-
- ECPoint positive = MultiplyPositive(p, k.Abs());
- ECPoint result = sign > 0 ? positive : positive.Negate();
-
- /*
- * Although the various multipliers ought not to produce invalid output under normal
- * circumstances, a final check here is advised to guard against fault attacks.
- */
- return ECAlgorithms.ValidatePoint(result);
- }
-
- protected abstract ECPoint MultiplyPositive(ECPoint p, BigInteger k);
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/DoubleAddMultiplier.cs b/BCCrypto/src/math/ec/multiplier/DoubleAddMultiplier.cs
deleted file mode 100644
index 18a72c0..0000000
--- a/BCCrypto/src/math/ec/multiplier/DoubleAddMultiplier.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- public class DoubleAddMultiplier
- : AbstractECMultiplier
- {
- /**
- * Joye's double-add algorithm.
- */
- protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
- {
- ECPoint[] R = new ECPoint[]{ p.Curve.Infinity, p };
-
- int n = k.BitLength;
- for (int i = 0; i < n; ++i)
- {
- int b = k.TestBit(i) ? 1 : 0;
- int bp = 1 - b;
- R[bp] = R[bp].TwicePlus(R[b]);
- }
-
- return R[0];
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/ECMultiplier.cs b/BCCrypto/src/math/ec/multiplier/ECMultiplier.cs
deleted file mode 100644
index 8d6136b..0000000
--- a/BCCrypto/src/math/ec/multiplier/ECMultiplier.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- /**
- * Interface for classes encapsulating a point multiplication algorithm
- * for ECPoints.
- */
- public interface ECMultiplier
- {
- /**
- * Multiplies the ECPoint p by k, i.e.
- * p is added k times to itself.
- * @param p The ECPoint to be multiplied.
- * @param k The factor by which p is multiplied.
- * @return p multiplied by k.
- */
- ECPoint Multiply(ECPoint p, BigInteger k);
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/FixedPointCombMultiplier.cs b/BCCrypto/src/math/ec/multiplier/FixedPointCombMultiplier.cs
deleted file mode 100644
index a8ef5a7..0000000
--- a/BCCrypto/src/math/ec/multiplier/FixedPointCombMultiplier.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- public class FixedPointCombMultiplier
- : AbstractECMultiplier
- {
- protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
- {
- ECCurve c = p.Curve;
- int size = FixedPointUtilities.GetCombSize(c);
-
- if (k.BitLength > size)
- {
- /*
- * TODO The comb works best when the scalars are less than the (possibly unknown) order.
- * Still, if we want to handle larger scalars, we could allow customization of the comb
- * size, or alternatively we could deal with the 'extra' bits either by running the comb
- * multiple times as necessary, or by using an alternative multiplier as prelude.
- */
- throw new InvalidOperationException("fixed-point comb doesn't support scalars larger than the curve order");
- }
-
- int minWidth = GetWidthForCombSize(size);
-
- FixedPointPreCompInfo info = FixedPointUtilities.Precompute(p, minWidth);
- ECPoint[] lookupTable = info.PreComp;
- int width = info.Width;
-
- int d = (size + width - 1) / width;
-
- ECPoint R = c.Infinity;
-
- int top = d * width - 1;
- for (int i = 0; i < d; ++i)
- {
- int index = 0;
-
- for (int j = top - i; j >= 0; j -= d)
- {
- index <<= 1;
- if (k.TestBit(j))
- {
- index |= 1;
- }
- }
-
- R = R.TwicePlus(lookupTable[index]);
- }
-
- return R;
- }
-
- protected virtual int GetWidthForCombSize(int combSize)
- {
- return combSize > 257 ? 6 : 5;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/FixedPointPreCompInfo.cs b/BCCrypto/src/math/ec/multiplier/FixedPointPreCompInfo.cs
deleted file mode 100644
index 56a6326..0000000
--- a/BCCrypto/src/math/ec/multiplier/FixedPointPreCompInfo.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- /**
- * Class holding precomputation data for fixed-point multiplications.
- */
- public class FixedPointPreCompInfo
- : PreCompInfo
- {
- /**
- * Array holding the precomputed ECPoints used for a fixed
- * point multiplication.
- */
- protected ECPoint[] m_preComp = null;
-
- /**
- * The width used for the precomputation. If a larger width precomputation
- * is already available this may be larger than was requested, so calling
- * code should refer to the actual width.
- */
- protected int m_width = -1;
-
- public virtual ECPoint[] PreComp
- {
- get { return m_preComp; }
- set { this.m_preComp = value; }
- }
-
- public virtual int Width
- {
- get { return m_width; }
- set { this.m_width = value; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/FixedPointUtilities.cs b/BCCrypto/src/math/ec/multiplier/FixedPointUtilities.cs
deleted file mode 100644
index d927d01..0000000
--- a/BCCrypto/src/math/ec/multiplier/FixedPointUtilities.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- public class FixedPointUtilities
- {
- public static readonly string PRECOMP_NAME = "bc_fixed_point";
-
- public static int GetCombSize(ECCurve c)
- {
- BigInteger order = c.Order;
- return order == null ? c.FieldSize + 1 : order.BitLength;
- }
-
- public static FixedPointPreCompInfo GetFixedPointPreCompInfo(PreCompInfo preCompInfo)
- {
- if ((preCompInfo != null) && (preCompInfo is FixedPointPreCompInfo))
- {
- return (FixedPointPreCompInfo)preCompInfo;
- }
-
- return new FixedPointPreCompInfo();
- }
-
- public static FixedPointPreCompInfo Precompute(ECPoint p, int minWidth)
- {
- ECCurve c = p.Curve;
-
- int n = 1 << minWidth;
- FixedPointPreCompInfo info = GetFixedPointPreCompInfo(c.GetPreCompInfo(p, PRECOMP_NAME));
- ECPoint[] lookupTable = info.PreComp;
-
- if (lookupTable == null || lookupTable.Length < n)
- {
- int bits = GetCombSize(c);
- int d = (bits + minWidth - 1) / minWidth;
-
- ECPoint[] pow2Table = new ECPoint[minWidth];
- pow2Table[0] = p;
- for (int i = 1; i < minWidth; ++i)
- {
- pow2Table[i] = pow2Table[i - 1].TimesPow2(d);
- }
-
- c.NormalizeAll(pow2Table);
-
- lookupTable = new ECPoint[n];
- lookupTable[0] = c.Infinity;
-
- for (int bit = minWidth - 1; bit >= 0; --bit)
- {
- ECPoint pow2 = pow2Table[bit];
-
- int step = 1 << bit;
- for (int i = step; i < n; i += (step << 1))
- {
- lookupTable[i] = lookupTable[i - step].Add(pow2);
- }
- }
-
- c.NormalizeAll(lookupTable);
-
- info.PreComp = lookupTable;
- info.Width = minWidth;
-
- c.SetPreCompInfo(p, PRECOMP_NAME, info);
- }
-
- return info;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/GlvMultiplier.cs b/BCCrypto/src/math/ec/multiplier/GlvMultiplier.cs
deleted file mode 100644
index f190494..0000000
--- a/BCCrypto/src/math/ec/multiplier/GlvMultiplier.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.EC.Endo;
-
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- public class GlvMultiplier
- : AbstractECMultiplier
- {
- protected readonly ECCurve curve;
- protected readonly GlvEndomorphism glvEndomorphism;
-
- public GlvMultiplier(ECCurve curve, GlvEndomorphism glvEndomorphism)
- {
- if (curve == null || curve.Order == null)
- throw new ArgumentException("Need curve with known group order", "curve");
-
- this.curve = curve;
- this.glvEndomorphism = glvEndomorphism;
- }
-
- protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
- {
- if (!curve.Equals(p.Curve))
- throw new InvalidOperationException();
-
- BigInteger n = p.Curve.Order;
- BigInteger[] ab = glvEndomorphism.DecomposeScalar(k.Mod(n));
- BigInteger a = ab[0], b = ab[1];
-
- ECPointMap pointMap = glvEndomorphism.PointMap;
- if (glvEndomorphism.HasEfficientPointMap)
- {
- return ECAlgorithms.ImplShamirsTrickWNaf(p, a, pointMap, b);
- }
-
- return ECAlgorithms.ImplShamirsTrickWNaf(p, a, pointMap.Map(p), b);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/MixedNafR2LMultiplier.cs b/BCCrypto/src/math/ec/multiplier/MixedNafR2LMultiplier.cs
deleted file mode 100644
index a4c2018..0000000
--- a/BCCrypto/src/math/ec/multiplier/MixedNafR2LMultiplier.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- /**
- * Class implementing the NAF (Non-Adjacent Form) multiplication algorithm (right-to-left) using
- * mixed coordinates.
- */
- public class MixedNafR2LMultiplier
- : AbstractECMultiplier
- {
- protected readonly int additionCoord, doublingCoord;
-
- /**
- * By default, addition will be done in Jacobian coordinates, and doubling will be done in
- * Modified Jacobian coordinates (independent of the original coordinate system of each point).
- */
- public MixedNafR2LMultiplier()
- : this(ECCurve.COORD_JACOBIAN, ECCurve.COORD_JACOBIAN_MODIFIED)
- {
- }
-
- public MixedNafR2LMultiplier(int additionCoord, int doublingCoord)
- {
- this.additionCoord = additionCoord;
- this.doublingCoord = doublingCoord;
- }
-
- protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
- {
- ECCurve curveOrig = p.Curve;
-
- ECCurve curveAdd = ConfigureCurve(curveOrig, additionCoord);
- ECCurve curveDouble = ConfigureCurve(curveOrig, doublingCoord);
-
- int[] naf = WNafUtilities.GenerateCompactNaf(k);
-
- ECPoint Ra = curveAdd.Infinity;
- ECPoint Td = curveDouble.ImportPoint(p);
-
- int zeroes = 0;
- for (int i = 0; i < naf.Length; ++i)
- {
- int ni = naf[i];
- int digit = ni >> 16;
- zeroes += ni & 0xFFFF;
-
- Td = Td.TimesPow2(zeroes);
-
- ECPoint Tj = curveAdd.ImportPoint(Td);
- if (digit < 0)
- {
- Tj = Tj.Negate();
- }
-
- Ra = Ra.Add(Tj);
-
- zeroes = 1;
- }
-
- return curveOrig.ImportPoint(Ra);
- }
-
- protected virtual ECCurve ConfigureCurve(ECCurve c, int coord)
- {
- if (c.CoordinateSystem == coord)
- return c;
-
- if (!c.SupportsCoordinateSystem(coord))
- throw new ArgumentException("Coordinate system " + coord + " not supported by this curve", "coord");
-
- return c.Configure().SetCoordinateSystem(coord).Create();
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/MontgomeryLadderMultiplier.cs b/BCCrypto/src/math/ec/multiplier/MontgomeryLadderMultiplier.cs
deleted file mode 100644
index e2470a3..0000000
--- a/BCCrypto/src/math/ec/multiplier/MontgomeryLadderMultiplier.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- public class MontgomeryLadderMultiplier
- : AbstractECMultiplier
- {
- /**
- * Montgomery ladder.
- */
- protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
- {
- ECPoint[] R = new ECPoint[]{ p.Curve.Infinity, p };
-
- int n = k.BitLength;
- int i = n;
- while (--i >= 0)
- {
- int b = k.TestBit(i) ? 1 : 0;
- int bp = 1 - b;
- R[bp] = R[bp].Add(R[b]);
- R[b] = R[b].Twice();
- }
- return R[0];
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/NafL2RMultiplier.cs b/BCCrypto/src/math/ec/multiplier/NafL2RMultiplier.cs
deleted file mode 100644
index ac80cf9..0000000
--- a/BCCrypto/src/math/ec/multiplier/NafL2RMultiplier.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- /**
- * Class implementing the NAF (Non-Adjacent Form) multiplication algorithm (left-to-right).
- */
- public class NafL2RMultiplier
- : AbstractECMultiplier
- {
- protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
- {
- int[] naf = WNafUtilities.GenerateCompactNaf(k);
-
- ECPoint addP = p.Normalize(), subP = addP.Negate();
-
- ECPoint R = p.Curve.Infinity;
-
- int i = naf.Length;
- while (--i >= 0)
- {
- int ni = naf[i];
- int digit = ni >> 16, zeroes = ni & 0xFFFF;
-
- R = R.TwicePlus(digit < 0 ? subP : addP);
- R = R.TimesPow2(zeroes);
- }
-
- return R;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/NafR2LMultiplier.cs b/BCCrypto/src/math/ec/multiplier/NafR2LMultiplier.cs
deleted file mode 100644
index 1fa69fa..0000000
--- a/BCCrypto/src/math/ec/multiplier/NafR2LMultiplier.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- /**
- * Class implementing the NAF (Non-Adjacent Form) multiplication algorithm (right-to-left).
- */
- public class NafR2LMultiplier
- : AbstractECMultiplier
- {
- protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
- {
- int[] naf = WNafUtilities.GenerateCompactNaf(k);
-
- ECPoint R0 = p.Curve.Infinity, R1 = p;
-
- int zeroes = 0;
- for (int i = 0; i < naf.Length; ++i)
- {
- int ni = naf[i];
- int digit = ni >> 16;
- zeroes += ni & 0xFFFF;
-
- R1 = R1.TimesPow2(zeroes);
- R0 = R0.Add(digit < 0 ? R1.Negate() : R1);
-
- zeroes = 1;
- }
-
- return R0;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/PreCompInfo.cs b/BCCrypto/src/math/ec/multiplier/PreCompInfo.cs
deleted file mode 100644
index 5c32892..0000000
--- a/BCCrypto/src/math/ec/multiplier/PreCompInfo.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- /**
- * Interface for classes storing precomputation data for multiplication
- * algorithms. Used as a Memento (see GOF patterns) for
- * WNafMultiplier.
- */
- public interface PreCompInfo
- {
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/ReferenceMultiplier.cs b/BCCrypto/src/math/ec/multiplier/ReferenceMultiplier.cs
deleted file mode 100644
index 4848ada..0000000
--- a/BCCrypto/src/math/ec/multiplier/ReferenceMultiplier.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- public class ReferenceMultiplier
- : AbstractECMultiplier
- {
- protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
- {
- return ECAlgorithms.ReferenceMultiply(p, k);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/WNafL2RMultiplier.cs b/BCCrypto/src/math/ec/multiplier/WNafL2RMultiplier.cs
deleted file mode 100644
index f671f6a..0000000
--- a/BCCrypto/src/math/ec/multiplier/WNafL2RMultiplier.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- /**
- * Class implementing the WNAF (Window Non-Adjacent Form) multiplication
- * algorithm.
- */
- public class WNafL2RMultiplier
- : AbstractECMultiplier
- {
- /**
- * Multiplies this by an integer k using the
- * Window NAF method.
- * @param k The integer by which this is multiplied.
- * @return A new ECPoint which equals this
- * multiplied by k.
- */
- protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
- {
- // Clamp the window width in the range [2, 16]
- int width = System.Math.Max(2, System.Math.Min(16, GetWindowSize(k.BitLength)));
-
- WNafPreCompInfo wnafPreCompInfo = WNafUtilities.Precompute(p, width, true);
- ECPoint[] preComp = wnafPreCompInfo.PreComp;
- ECPoint[] preCompNeg = wnafPreCompInfo.PreCompNeg;
-
- int[] wnaf = WNafUtilities.GenerateCompactWindowNaf(width, k);
-
- ECPoint R = p.Curve.Infinity;
-
- int i = wnaf.Length;
-
- /*
- * NOTE: We try to optimize the first window using the precomputed points to substitute an
- * addition for 2 or more doublings.
- */
- if (i > 1)
- {
- int wi = wnaf[--i];
- int digit = wi >> 16, zeroes = wi & 0xFFFF;
-
- int n = System.Math.Abs(digit);
- ECPoint[] table = digit < 0 ? preCompNeg : preComp;
-
- // Optimization can only be used for values in the lower half of the table
- if ((n << 2) < (1 << width))
- {
- int highest = LongArray.BitLengths[n];
-
- // TODO Get addition/doubling cost ratio from curve and compare to 'scale' to see if worth substituting?
- int scale = width - highest;
- int lowBits = n ^ (1 << (highest - 1));
-
- int i1 = ((1 << (width - 1)) - 1);
- int i2 = (lowBits << scale) + 1;
- R = table[i1 >> 1].Add(table[i2 >> 1]);
-
- zeroes -= scale;
-
- //Console.WriteLine("Optimized: 2^" + scale + " * " + n + " = " + i1 + " + " + i2);
- }
- else
- {
- R = table[n >> 1];
- }
-
- R = R.TimesPow2(zeroes);
- }
-
- while (i > 0)
- {
- int wi = wnaf[--i];
- int digit = wi >> 16, zeroes = wi & 0xFFFF;
-
- int n = System.Math.Abs(digit);
- ECPoint[] table = digit < 0 ? preCompNeg : preComp;
- ECPoint r = table[n >> 1];
-
- R = R.TwicePlus(r);
- R = R.TimesPow2(zeroes);
- }
-
- return R;
- }
-
- /**
- * Determine window width to use for a scalar multiplication of the given size.
- *
- * @param bits the bit-length of the scalar to multiply by
- * @return the window size to use
- */
- protected virtual int GetWindowSize(int bits)
- {
- return WNafUtilities.GetWindowSize(bits);
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/WNafPreCompInfo.cs b/BCCrypto/src/math/ec/multiplier/WNafPreCompInfo.cs
deleted file mode 100644
index 7e0a731..0000000
--- a/BCCrypto/src/math/ec/multiplier/WNafPreCompInfo.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- /**
- * Class holding precomputation data for the WNAF (Window Non-Adjacent Form)
- * algorithm.
- */
- public class WNafPreCompInfo
- : PreCompInfo
- {
- /**
- * Array holding the precomputed ECPoints used for a Window
- * NAF multiplication.
- */
- protected ECPoint[] m_preComp = null;
-
- /**
- * Array holding the negations of the precomputed ECPoints used
- * for a Window NAF multiplication.
- */
- protected ECPoint[] m_preCompNeg = null;
-
- /**
- * Holds an ECPoint representing Twice(this). Used for the
- * Window NAF multiplication to create or extend the precomputed values.
- */
- protected ECPoint m_twice = null;
-
- public virtual ECPoint[] PreComp
- {
- get { return m_preComp; }
- set { this.m_preComp = value; }
- }
-
- public virtual ECPoint[] PreCompNeg
- {
- get { return m_preCompNeg; }
- set { this.m_preCompNeg = value; }
- }
-
- public virtual ECPoint Twice
- {
- get { return m_twice; }
- set { this.m_twice = value; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/WNafUtilities.cs b/BCCrypto/src/math/ec/multiplier/WNafUtilities.cs
deleted file mode 100644
index 7d565df..0000000
--- a/BCCrypto/src/math/ec/multiplier/WNafUtilities.cs
+++ /dev/null
@@ -1,524 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- public abstract class WNafUtilities
- {
- public static readonly string PRECOMP_NAME = "bc_wnaf";
-
- private static readonly int[] DEFAULT_WINDOW_SIZE_CUTOFFS = new int[]{ 13, 41, 121, 337, 897, 2305 };
-
- private static readonly byte[] EMPTY_BYTES = new byte[0];
- private static readonly int[] EMPTY_INTS = new int[0];
- private static readonly ECPoint[] EMPTY_POINTS = new ECPoint[0];
-
- public static int[] GenerateCompactNaf(BigInteger k)
- {
- if ((k.BitLength >> 16) != 0)
- throw new ArgumentException("must have bitlength < 2^16", "k");
- if (k.SignValue == 0)
- return EMPTY_INTS;
-
- BigInteger _3k = k.ShiftLeft(1).Add(k);
-
- int bits = _3k.BitLength;
- int[] naf = new int[bits >> 1];
-
- BigInteger diff = _3k.Xor(k);
-
- int highBit = bits - 1, length = 0, zeroes = 0;
- for (int i = 1; i < highBit; ++i)
- {
- if (!diff.TestBit(i))
- {
- ++zeroes;
- continue;
- }
-
- int digit = k.TestBit(i) ? -1 : 1;
- naf[length++] = (digit << 16) | zeroes;
- zeroes = 1;
- ++i;
- }
-
- naf[length++] = (1 << 16) | zeroes;
-
- if (naf.Length > length)
- {
- naf = Trim(naf, length);
- }
-
- return naf;
- }
-
- public static int[] GenerateCompactWindowNaf(int width, BigInteger k)
- {
- if (width == 2)
- {
- return GenerateCompactNaf(k);
- }
-
- if (width < 2 || width > 16)
- throw new ArgumentException("must be in the range [2, 16]", "width");
- if ((k.BitLength >> 16) != 0)
- throw new ArgumentException("must have bitlength < 2^16", "k");
- if (k.SignValue == 0)
- return EMPTY_INTS;
-
- int[] wnaf = new int[k.BitLength / width + 1];
-
- // 2^width and a mask and sign bit set accordingly
- int pow2 = 1 << width;
- int mask = pow2 - 1;
- int sign = pow2 >> 1;
-
- bool carry = false;
- int length = 0, pos = 0;
-
- while (pos <= k.BitLength)
- {
- if (k.TestBit(pos) == carry)
- {
- ++pos;
- continue;
- }
-
- k = k.ShiftRight(pos);
-
- int digit = k.IntValue & mask;
- if (carry)
- {
- ++digit;
- }
-
- carry = (digit & sign) != 0;
- if (carry)
- {
- digit -= pow2;
- }
-
- int zeroes = length > 0 ? pos - 1 : pos;
- wnaf[length++] = (digit << 16) | zeroes;
- pos = width;
- }
-
- // Reduce the WNAF array to its actual length
- if (wnaf.Length > length)
- {
- wnaf = Trim(wnaf, length);
- }
-
- return wnaf;
- }
-
- public static byte[] GenerateJsf(BigInteger g, BigInteger h)
- {
- int digits = System.Math.Max(g.BitLength, h.BitLength) + 1;
- byte[] jsf = new byte[digits];
-
- BigInteger k0 = g, k1 = h;
- int j = 0, d0 = 0, d1 = 0;
-
- int offset = 0;
- while ((d0 | d1) != 0 || k0.BitLength > offset || k1.BitLength > offset)
- {
- int n0 = ((int)((uint)k0.IntValue >> offset) + d0) & 7;
- int n1 = ((int)((uint)k1.IntValue >> offset) + d1) & 7;
-
- int u0 = n0 & 1;
- if (u0 != 0)
- {
- u0 -= (n0 & 2);
- if ((n0 + u0) == 4 && (n1 & 3) == 2)
- {
- u0 = -u0;
- }
- }
-
- int u1 = n1 & 1;
- if (u1 != 0)
- {
- u1 -= (n1 & 2);
- if ((n1 + u1) == 4 && (n0 & 3) == 2)
- {
- u1 = -u1;
- }
- }
-
- if ((d0 << 1) == 1 + u0)
- {
- d0 ^= 1;
- }
- if ((d1 << 1) == 1 + u1)
- {
- d1 ^= 1;
- }
-
- if (++offset == 30)
- {
- offset = 0;
- k0 = k0.ShiftRight(30);
- k1 = k1.ShiftRight(30);
- }
-
- jsf[j++] = (byte)((u0 << 4) | (u1 & 0xF));
- }
-
- // Reduce the JSF array to its actual length
- if (jsf.Length > j)
- {
- jsf = Trim(jsf, j);
- }
-
- return jsf;
- }
-
- public static byte[] GenerateNaf(BigInteger k)
- {
- if (k.SignValue == 0)
- return EMPTY_BYTES;
-
- BigInteger _3k = k.ShiftLeft(1).Add(k);
-
- int digits = _3k.BitLength - 1;
- byte[] naf = new byte[digits];
-
- BigInteger diff = _3k.Xor(k);
-
- for (int i = 1; i < digits; ++i)
- {
- if (diff.TestBit(i))
- {
- naf[i - 1] = (byte)(k.TestBit(i) ? -1 : 1);
- ++i;
- }
- }
-
- naf[digits - 1] = 1;
-
- return naf;
- }
-
- /**
- * Computes the Window NAF (non-adjacent Form) of an integer.
- * @param width The width w of the Window NAF. The width is
- * defined as the minimal number w, such that for any
- * w consecutive digits in the resulting representation, at
- * most one is non-zero.
- * @param k The integer of which the Window NAF is computed.
- * @return The Window NAF of the given width, such that the following holds:
- * k = ∑i=0 l-1 ki 2i
- * , where the ki denote the elements of the
- * returned byte[].
- */
- public static byte[] GenerateWindowNaf(int width, BigInteger k)
- {
- if (width == 2)
- {
- return GenerateNaf(k);
- }
-
- if (width < 2 || width > 8)
- throw new ArgumentException("must be in the range [2, 8]", "width");
- if (k.SignValue == 0)
- return EMPTY_BYTES;
-
- byte[] wnaf = new byte[k.BitLength + 1];
-
- // 2^width and a mask and sign bit set accordingly
- int pow2 = 1 << width;
- int mask = pow2 - 1;
- int sign = pow2 >> 1;
-
- bool carry = false;
- int length = 0, pos = 0;
-
- while (pos <= k.BitLength)
- {
- if (k.TestBit(pos) == carry)
- {
- ++pos;
- continue;
- }
-
- k = k.ShiftRight(pos);
-
- int digit = k.IntValue & mask;
- if (carry)
- {
- ++digit;
- }
-
- carry = (digit & sign) != 0;
- if (carry)
- {
- digit -= pow2;
- }
-
- length += (length > 0) ? pos - 1 : pos;
- wnaf[length++] = (byte)digit;
- pos = width;
- }
-
- // Reduce the WNAF array to its actual length
- if (wnaf.Length > length)
- {
- wnaf = Trim(wnaf, length);
- }
-
- return wnaf;
- }
-
- public static int GetNafWeight(BigInteger k)
- {
- if (k.SignValue == 0)
- return 0;
-
- BigInteger _3k = k.ShiftLeft(1).Add(k);
- BigInteger diff = _3k.Xor(k);
-
- return diff.BitCount;
- }
-
- public static WNafPreCompInfo GetWNafPreCompInfo(ECPoint p)
- {
- return GetWNafPreCompInfo(p.Curve.GetPreCompInfo(p, PRECOMP_NAME));
- }
-
- public static WNafPreCompInfo GetWNafPreCompInfo(PreCompInfo preCompInfo)
- {
- if ((preCompInfo != null) && (preCompInfo is WNafPreCompInfo))
- {
- return (WNafPreCompInfo)preCompInfo;
- }
-
- return new WNafPreCompInfo();
- }
-
- /**
- * Determine window width to use for a scalar multiplication of the given size.
- *
- * @param bits the bit-length of the scalar to multiply by
- * @return the window size to use
- */
- public static int GetWindowSize(int bits)
- {
- return GetWindowSize(bits, DEFAULT_WINDOW_SIZE_CUTOFFS);
- }
-
- /**
- * Determine window width to use for a scalar multiplication of the given size.
- *
- * @param bits the bit-length of the scalar to multiply by
- * @param windowSizeCutoffs a monotonically increasing list of bit sizes at which to increment the window width
- * @return the window size to use
- */
- public static int GetWindowSize(int bits, int[] windowSizeCutoffs)
- {
- int w = 0;
- for (; w < windowSizeCutoffs.Length; ++w)
- {
- if (bits < windowSizeCutoffs[w])
- {
- break;
- }
- }
- return w + 2;
- }
-
- public static ECPoint MapPointWithPrecomp(ECPoint p, int width, bool includeNegated,
- ECPointMap pointMap)
- {
- ECCurve c = p.Curve;
- WNafPreCompInfo wnafPreCompP = Precompute(p, width, includeNegated);
-
- ECPoint q = pointMap.Map(p);
- WNafPreCompInfo wnafPreCompQ = GetWNafPreCompInfo(c.GetPreCompInfo(q, PRECOMP_NAME));
-
- ECPoint twiceP = wnafPreCompP.Twice;
- if (twiceP != null)
- {
- ECPoint twiceQ = pointMap.Map(twiceP);
- wnafPreCompQ.Twice = twiceQ;
- }
-
- ECPoint[] preCompP = wnafPreCompP.PreComp;
- ECPoint[] preCompQ = new ECPoint[preCompP.Length];
- for (int i = 0; i < preCompP.Length; ++i)
- {
- preCompQ[i] = pointMap.Map(preCompP[i]);
- }
- wnafPreCompQ.PreComp = preCompQ;
-
- if (includeNegated)
- {
- ECPoint[] preCompNegQ = new ECPoint[preCompQ.Length];
- for (int i = 0; i < preCompNegQ.Length; ++i)
- {
- preCompNegQ[i] = preCompQ[i].Negate();
- }
- wnafPreCompQ.PreCompNeg = preCompNegQ;
- }
-
- c.SetPreCompInfo(q, PRECOMP_NAME, wnafPreCompQ);
-
- return q;
- }
-
- public static WNafPreCompInfo Precompute(ECPoint p, int width, bool includeNegated)
- {
- ECCurve c = p.Curve;
- WNafPreCompInfo wnafPreCompInfo = GetWNafPreCompInfo(c.GetPreCompInfo(p, PRECOMP_NAME));
-
- int iniPreCompLen = 0, reqPreCompLen = 1 << System.Math.Max(0, width - 2);
-
- ECPoint[] preComp = wnafPreCompInfo.PreComp;
- if (preComp == null)
- {
- preComp = EMPTY_POINTS;
- }
- else
- {
- iniPreCompLen = preComp.Length;
- }
-
- if (iniPreCompLen < reqPreCompLen)
- {
- preComp = ResizeTable(preComp, reqPreCompLen);
-
- if (reqPreCompLen == 1)
- {
- preComp[0] = p.Normalize();
- }
- else
- {
- int curPreCompLen = iniPreCompLen;
- if (curPreCompLen == 0)
- {
- preComp[0] = p;
- curPreCompLen = 1;
- }
-
- ECFieldElement iso = null;
-
- if (reqPreCompLen == 2)
- {
- preComp[1] = p.ThreeTimes();
- }
- else
- {
- ECPoint twiceP = wnafPreCompInfo.Twice, last = preComp[curPreCompLen - 1];
- if (twiceP == null)
- {
- twiceP = preComp[0].Twice();
- wnafPreCompInfo.Twice = twiceP;
-
- /*
- * For Fp curves with Jacobian projective coordinates, use a (quasi-)isomorphism
- * where 'twiceP' is "affine", so that the subsequent additions are cheaper. This
- * also requires scaling the initial point's X, Y coordinates, and reversing the
- * isomorphism as part of the subsequent normalization.
- *
- * NOTE: The correctness of this optimization depends on:
- * 1) additions do not use the curve's A, B coefficients.
- * 2) no special cases (i.e. Q +/- Q) when calculating 1P, 3P, 5P, ...
- */
- if (!twiceP.IsInfinity && ECAlgorithms.IsFpCurve(c) && c.FieldSize >= 64)
- {
- switch (c.CoordinateSystem)
- {
- case ECCurve.COORD_JACOBIAN:
- case ECCurve.COORD_JACOBIAN_CHUDNOVSKY:
- case ECCurve.COORD_JACOBIAN_MODIFIED:
- {
- iso = twiceP.GetZCoord(0);
- twiceP = c.CreatePoint(twiceP.XCoord.ToBigInteger(),
- twiceP.YCoord.ToBigInteger());
-
- ECFieldElement iso2 = iso.Square(), iso3 = iso2.Multiply(iso);
- last = last.ScaleX(iso2).ScaleY(iso3);
-
- if (iniPreCompLen == 0)
- {
- preComp[0] = last;
- }
- break;
- }
- }
- }
- }
-
- while (curPreCompLen < reqPreCompLen)
- {
- /*
- * Compute the new ECPoints for the precomputation array. The values 1, 3,
- * 5, ..., 2^(width-1)-1 times p are computed
- */
- preComp[curPreCompLen++] = last = last.Add(twiceP);
- }
- }
-
- /*
- * Having oft-used operands in affine form makes operations faster.
- */
- c.NormalizeAll(preComp, iniPreCompLen, reqPreCompLen - iniPreCompLen, iso);
- }
- }
-
- wnafPreCompInfo.PreComp = preComp;
-
- if (includeNegated)
- {
- ECPoint[] preCompNeg = wnafPreCompInfo.PreCompNeg;
-
- int pos;
- if (preCompNeg == null)
- {
- pos = 0;
- preCompNeg = new ECPoint[reqPreCompLen];
- }
- else
- {
- pos = preCompNeg.Length;
- if (pos < reqPreCompLen)
- {
- preCompNeg = ResizeTable(preCompNeg, reqPreCompLen);
- }
- }
-
- while (pos < reqPreCompLen)
- {
- preCompNeg[pos] = preComp[pos].Negate();
- ++pos;
- }
-
- wnafPreCompInfo.PreCompNeg = preCompNeg;
- }
-
- c.SetPreCompInfo(p, PRECOMP_NAME, wnafPreCompInfo);
-
- return wnafPreCompInfo;
- }
-
- private static byte[] Trim(byte[] a, int length)
- {
- byte[] result = new byte[length];
- Array.Copy(a, 0, result, 0, result.Length);
- return result;
- }
-
- private static int[] Trim(int[] a, int length)
- {
- int[] result = new int[length];
- Array.Copy(a, 0, result, 0, result.Length);
- return result;
- }
-
- private static ECPoint[] ResizeTable(ECPoint[] a, int length)
- {
- ECPoint[] result = new ECPoint[length];
- Array.Copy(a, 0, result, 0, a.Length);
- return result;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/WTauNafMultiplier.cs b/BCCrypto/src/math/ec/multiplier/WTauNafMultiplier.cs
deleted file mode 100644
index 1e7ddae..0000000
--- a/BCCrypto/src/math/ec/multiplier/WTauNafMultiplier.cs
+++ /dev/null
@@ -1,125 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math.EC.Abc;
-
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- /**
- * Class implementing the WTNAF (Window
- * τ-adic Non-Adjacent Form) algorithm.
- */
- public class WTauNafMultiplier
- : AbstractECMultiplier
- {
- // TODO Create WTauNafUtilities class and move various functionality into it
- internal static readonly string PRECOMP_NAME = "bc_wtnaf";
-
- /**
- * Multiplies a {@link org.bouncycastle.math.ec.AbstractF2mPoint AbstractF2mPoint}
- * by k using the reduced τ-adic NAF (RTNAF)
- * method.
- * @param p The AbstractF2mPoint to multiply.
- * @param k The integer by which to multiply k.
- * @return p multiplied by k.
- */
- protected override ECPoint MultiplyPositive(ECPoint point, BigInteger k)
- {
- if (!(point is AbstractF2mPoint))
- throw new ArgumentException("Only AbstractF2mPoint can be used in WTauNafMultiplier");
-
- AbstractF2mPoint p = (AbstractF2mPoint)point;
- AbstractF2mCurve curve = (AbstractF2mCurve)p.Curve;
- int m = curve.FieldSize;
- sbyte a = (sbyte)curve.A.ToBigInteger().IntValue;
- sbyte mu = Tnaf.GetMu(a);
- BigInteger[] s = curve.GetSi();
-
- ZTauElement rho = Tnaf.PartModReduction(k, m, a, s, mu, (sbyte)10);
-
- return MultiplyWTnaf(p, rho, curve.GetPreCompInfo(p, PRECOMP_NAME), a, mu);
- }
-
- /**
- * Multiplies a {@link org.bouncycastle.math.ec.AbstractF2mPoint AbstractF2mPoint}
- * by an element λ of Z [τ] using
- * the τ-adic NAF (TNAF) method.
- * @param p The AbstractF2mPoint to multiply.
- * @param lambda The element λ of
- * Z [τ] of which to compute the
- * [τ]-adic NAF.
- * @return p multiplied by λ.
- */
- private AbstractF2mPoint MultiplyWTnaf(AbstractF2mPoint p, ZTauElement lambda,
- PreCompInfo preCompInfo, sbyte a, sbyte mu)
- {
- ZTauElement[] alpha = (a == 0) ? Tnaf.Alpha0 : Tnaf.Alpha1;
-
- BigInteger tw = Tnaf.GetTw(mu, Tnaf.Width);
-
- sbyte[]u = Tnaf.TauAdicWNaf(mu, lambda, Tnaf.Width,
- BigInteger.ValueOf(Tnaf.Pow2Width), tw, alpha);
-
- return MultiplyFromWTnaf(p, u, preCompInfo);
- }
-
- /**
- * Multiplies a {@link org.bouncycastle.math.ec.AbstractF2mPoint AbstractF2mPoint}
- * by an element λ of Z [τ]
- * using the window τ-adic NAF (TNAF) method, given the
- * WTNAF of λ.
- * @param p The AbstractF2mPoint to multiply.
- * @param u The the WTNAF of λ..
- * @return λ * p
- */
- private static AbstractF2mPoint MultiplyFromWTnaf(AbstractF2mPoint p, sbyte[] u, PreCompInfo preCompInfo)
- {
- AbstractF2mCurve curve = (AbstractF2mCurve)p.Curve;
- sbyte a = (sbyte)curve.A.ToBigInteger().IntValue;
-
- AbstractF2mPoint[] pu;
- if ((preCompInfo == null) || !(preCompInfo is WTauNafPreCompInfo))
- {
- pu = Tnaf.GetPreComp(p, a);
-
- WTauNafPreCompInfo pre = new WTauNafPreCompInfo();
- pre.PreComp = pu;
- curve.SetPreCompInfo(p, PRECOMP_NAME, pre);
- }
- else
- {
- pu = ((WTauNafPreCompInfo)preCompInfo).PreComp;
- }
-
- // TODO Include negations in precomp (optionally) and use from here
- AbstractF2mPoint[] puNeg = new AbstractF2mPoint[pu.Length];
- for (int i = 0; i < pu.Length; ++i)
- {
- puNeg[i] = (AbstractF2mPoint)pu[i].Negate();
- }
-
-
- // q = infinity
- AbstractF2mPoint q = (AbstractF2mPoint) p.Curve.Infinity;
-
- int tauCount = 0;
- for (int i = u.Length - 1; i >= 0; i--)
- {
- ++tauCount;
- int ui = u[i];
- if (ui != 0)
- {
- q = q.TauPow(tauCount);
- tauCount = 0;
-
- ECPoint x = ui > 0 ? pu[ui >> 1] : puNeg[(-ui) >> 1];
- q = (AbstractF2mPoint)q.Add(x);
- }
- }
- if (tauCount > 0)
- {
- q = q.TauPow(tauCount);
- }
- return q;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/WTauNafPreCompInfo.cs b/BCCrypto/src/math/ec/multiplier/WTauNafPreCompInfo.cs
deleted file mode 100644
index 72659b3..0000000
--- a/BCCrypto/src/math/ec/multiplier/WTauNafPreCompInfo.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- /**
- * Class holding precomputation data for the WTNAF (Window
- * τ-adic Non-Adjacent Form) algorithm.
- */
- public class WTauNafPreCompInfo
- : PreCompInfo
- {
- /**
- * Array holding the precomputed AbstractF2mPoints used for the
- * WTNAF multiplication in
- * {@link org.bouncycastle.math.ec.multiplier.WTauNafMultiplier.multiply()
- * WTauNafMultiplier.multiply()}.
- */
- protected AbstractF2mPoint[] m_preComp;
-
- public virtual AbstractF2mPoint[] PreComp
- {
- get { return m_preComp; }
- set { this.m_preComp = value; }
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/ZSignedDigitL2RMultiplier.cs b/BCCrypto/src/math/ec/multiplier/ZSignedDigitL2RMultiplier.cs
deleted file mode 100644
index 554ac61..0000000
--- a/BCCrypto/src/math/ec/multiplier/ZSignedDigitL2RMultiplier.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- public class ZSignedDigitL2RMultiplier
- : AbstractECMultiplier
- {
- /**
- * 'Zeroless' Signed Digit Left-to-Right.
- */
- protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
- {
- ECPoint addP = p.Normalize(), subP = addP.Negate();
-
- ECPoint R0 = addP;
-
- int n = k.BitLength;
- int s = k.GetLowestSetBit();
-
- int i = n;
- while (--i > s)
- {
- R0 = R0.TwicePlus(k.TestBit(i) ? addP : subP);
- }
-
- R0 = R0.TimesPow2(s);
-
- return R0;
- }
- }
-}
diff --git a/BCCrypto/src/math/ec/multiplier/ZSignedDigitR2LMultiplier.cs b/BCCrypto/src/math/ec/multiplier/ZSignedDigitR2LMultiplier.cs
deleted file mode 100644
index 91c06cb..0000000
--- a/BCCrypto/src/math/ec/multiplier/ZSignedDigitR2LMultiplier.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-namespace Org.BouncyCastle.Math.EC.Multiplier
-{
- public class ZSignedDigitR2LMultiplier
- : AbstractECMultiplier
- {
- /**
- * 'Zeroless' Signed Digit Right-to-Left.
- */
- protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
- {
- ECPoint R0 = p.Curve.Infinity, R1 = p;
-
- int n = k.BitLength;
- int s = k.GetLowestSetBit();
-
- R1 = R1.TimesPow2(s);
-
- int i = s;
- while (++i < n)
- {
- R0 = R0.Add(k.TestBit(i) ? R1 : R1.Negate());
- R1 = R1.Twice();
- }
-
- R0 = R0.Add(R1);
-
- return R0;
- }
- }
-}
diff --git a/BCCrypto/src/math/field/FiniteFields.cs b/BCCrypto/src/math/field/FiniteFields.cs
deleted file mode 100644
index 7b84569..0000000
--- a/BCCrypto/src/math/field/FiniteFields.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.Field
-{
- public abstract class FiniteFields
- {
- internal static readonly IFiniteField GF_2 = new PrimeField(BigInteger.ValueOf(2));
- internal static readonly IFiniteField GF_3 = new PrimeField(BigInteger.ValueOf(3));
-
- public static IPolynomialExtensionField GetBinaryExtensionField(int[] exponents)
- {
- if (exponents[0] != 0)
- {
- throw new ArgumentException("Irreducible polynomials in GF(2) must have constant term", "exponents");
- }
- for (int i = 1; i < exponents.Length; ++i)
- {
- if (exponents[i] <= exponents[i - 1])
- {
- throw new ArgumentException("Polynomial exponents must be montonically increasing", "exponents");
- }
- }
-
- return new GenericPolynomialExtensionField(GF_2, new GF2Polynomial(exponents));
- }
-
- // public static IPolynomialExtensionField GetTernaryExtensionField(Term[] terms)
- // {
- // return new GenericPolynomialExtensionField(GF_3, new GF3Polynomial(terms));
- // }
-
- public static IFiniteField GetPrimeField(BigInteger characteristic)
- {
- int bitLength = characteristic.BitLength;
- if (characteristic.SignValue <= 0 || bitLength < 2)
- {
- throw new ArgumentException("Must be >= 2", "characteristic");
- }
-
- if (bitLength < 3)
- {
- switch (characteristic.IntValue)
- {
- case 2:
- return GF_2;
- case 3:
- return GF_3;
- }
- }
-
- return new PrimeField(characteristic);
- }
- }
-}
diff --git a/BCCrypto/src/math/field/GF2Polynomial.cs b/BCCrypto/src/math/field/GF2Polynomial.cs
deleted file mode 100644
index c062d50..0000000
--- a/BCCrypto/src/math/field/GF2Polynomial.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.Field
-{
- internal class GF2Polynomial
- : IPolynomial
- {
- protected readonly int[] exponents;
-
- internal GF2Polynomial(int[] exponents)
- {
- this.exponents = Arrays.Clone(exponents);
- }
-
- public virtual int Degree
- {
- get { return exponents[exponents.Length - 1]; }
- }
-
- public virtual int[] GetExponentsPresent()
- {
- return Arrays.Clone(exponents);
- }
-
- public override bool Equals(object obj)
- {
- if (this == obj)
- {
- return true;
- }
- GF2Polynomial other = obj as GF2Polynomial;
- if (null == other)
- {
- return false;
- }
- return Arrays.AreEqual(exponents, other.exponents);
- }
-
- public override int GetHashCode()
- {
- return Arrays.GetHashCode(exponents);
- }
- }
-}
diff --git a/BCCrypto/src/math/field/GenericPolynomialExtensionField.cs b/BCCrypto/src/math/field/GenericPolynomialExtensionField.cs
deleted file mode 100644
index 13ef571..0000000
--- a/BCCrypto/src/math/field/GenericPolynomialExtensionField.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.Field
-{
- internal class GenericPolynomialExtensionField
- : IPolynomialExtensionField
- {
- protected readonly IFiniteField subfield;
- protected readonly IPolynomial minimalPolynomial;
-
- internal GenericPolynomialExtensionField(IFiniteField subfield, IPolynomial polynomial)
- {
- this.subfield = subfield;
- this.minimalPolynomial = polynomial;
- }
-
- public virtual BigInteger Characteristic
- {
- get { return subfield.Characteristic; }
- }
-
- public virtual int Dimension
- {
- get { return subfield.Dimension * minimalPolynomial.Degree; }
- }
-
- public virtual IFiniteField Subfield
- {
- get { return subfield; }
- }
-
- public virtual int Degree
- {
- get { return minimalPolynomial.Degree; }
- }
-
- public virtual IPolynomial MinimalPolynomial
- {
- get { return minimalPolynomial; }
- }
-
- public override bool Equals(object obj)
- {
- if (this == obj)
- {
- return true;
- }
- GenericPolynomialExtensionField other = obj as GenericPolynomialExtensionField;
- if (null == other)
- {
- return false;
- }
- return subfield.Equals(other.subfield) && minimalPolynomial.Equals(other.minimalPolynomial);
- }
-
- public override int GetHashCode()
- {
- return subfield.GetHashCode() ^ Integers.RotateLeft(minimalPolynomial.GetHashCode(), 16);
- }
- }
-}
diff --git a/BCCrypto/src/math/field/IExtensionField.cs b/BCCrypto/src/math/field/IExtensionField.cs
deleted file mode 100644
index 17f45c1..0000000
--- a/BCCrypto/src/math/field/IExtensionField.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.Field
-{
- public interface IExtensionField
- : IFiniteField
- {
- IFiniteField Subfield { get; }
-
- int Degree { get; }
- }
-}
diff --git a/BCCrypto/src/math/field/IFiniteField.cs b/BCCrypto/src/math/field/IFiniteField.cs
deleted file mode 100644
index b618be7..0000000
--- a/BCCrypto/src/math/field/IFiniteField.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.Field
-{
- public interface IFiniteField
- {
- BigInteger Characteristic { get; }
-
- int Dimension { get; }
- }
-}
diff --git a/BCCrypto/src/math/field/IPolynomial.cs b/BCCrypto/src/math/field/IPolynomial.cs
deleted file mode 100644
index ad6dfb6..0000000
--- a/BCCrypto/src/math/field/IPolynomial.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.Field
-{
- public interface IPolynomial
- {
- int Degree { get; }
-
- //BigInteger[] GetCoefficients();
-
- int[] GetExponentsPresent();
-
- //Term[] GetNonZeroTerms();
- }
-}
diff --git a/BCCrypto/src/math/field/IPolynomialExtensionField.cs b/BCCrypto/src/math/field/IPolynomialExtensionField.cs
deleted file mode 100644
index 3818c18..0000000
--- a/BCCrypto/src/math/field/IPolynomialExtensionField.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.Field
-{
- public interface IPolynomialExtensionField
- : IExtensionField
- {
- IPolynomial MinimalPolynomial { get; }
- }
-}
diff --git a/BCCrypto/src/math/field/PrimeField.cs b/BCCrypto/src/math/field/PrimeField.cs
deleted file mode 100644
index f6ba629..0000000
--- a/BCCrypto/src/math/field/PrimeField.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.Field
-{
- internal class PrimeField
- : IFiniteField
- {
- protected readonly BigInteger characteristic;
-
- internal PrimeField(BigInteger characteristic)
- {
- this.characteristic = characteristic;
- }
-
- public virtual BigInteger Characteristic
- {
- get { return characteristic; }
- }
-
- public virtual int Dimension
- {
- get { return 1; }
- }
-
- public override bool Equals(object obj)
- {
- if (this == obj)
- {
- return true;
- }
- PrimeField other = obj as PrimeField;
- if (null == other)
- {
- return false;
- }
- return characteristic.Equals(other.characteristic);
- }
-
- public override int GetHashCode()
- {
- return characteristic.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Interleave.cs b/BCCrypto/src/math/raw/Interleave.cs
deleted file mode 100644
index d218406..0000000
--- a/BCCrypto/src/math/raw/Interleave.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Interleave
- {
- private const ulong M32 = 0x55555555UL;
- private const ulong M64 = 0x5555555555555555UL;
-
- /*
- * This expands 8 bit indices into 16 bit contents (high bit 14), by inserting 0s between bits.
- * In a binary field, this operation is the same as squaring an 8 bit number.
- */
- //private static readonly ushort[] INTERLEAVE2_TABLE = new ushort[]
- //{
- // 0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015,
- // 0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055,
- // 0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115,
- // 0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155,
- // 0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415,
- // 0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455,
- // 0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515,
- // 0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555,
- // 0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015,
- // 0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055,
- // 0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115,
- // 0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155,
- // 0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415,
- // 0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455,
- // 0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515,
- // 0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555,
- // 0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015,
- // 0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055,
- // 0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115,
- // 0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155,
- // 0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415,
- // 0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455,
- // 0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515,
- // 0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555,
- // 0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015,
- // 0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055,
- // 0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115,
- // 0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155,
- // 0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415,
- // 0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455,
- // 0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515,
- // 0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555
- //};
-
- internal static uint Expand8to16(uint x)
- {
- x &= 0xFFU;
- x = (x | (x << 4)) & 0x0F0FU;
- x = (x | (x << 2)) & 0x3333U;
- x = (x | (x << 1)) & 0x5555U;
- return x;
- }
-
- internal static uint Expand16to32(uint x)
- {
- x &= 0xFFFFU;
- x = (x | (x << 8)) & 0x00FF00FFU;
- x = (x | (x << 4)) & 0x0F0F0F0FU;
- x = (x | (x << 2)) & 0x33333333U;
- x = (x | (x << 1)) & 0x55555555U;
- return x;
- }
-
- internal static ulong Expand32to64(uint x)
- {
- // "shuffle" low half to even bits and high half to odd bits
- uint t;
- t = (x ^ (x >> 8)) & 0x0000FF00U; x ^= (t ^ (t << 8));
- t = (x ^ (x >> 4)) & 0x00F000F0U; x ^= (t ^ (t << 4));
- t = (x ^ (x >> 2)) & 0x0C0C0C0CU; x ^= (t ^ (t << 2));
- t = (x ^ (x >> 1)) & 0x22222222U; x ^= (t ^ (t << 1));
-
- return ((x >> 1) & M32) << 32 | (x & M32);
- }
-
- internal static void Expand64To128(ulong x, ulong[] z, int zOff)
- {
- // "shuffle" low half to even bits and high half to odd bits
- ulong t;
- t = (x ^ (x >> 16)) & 0x00000000FFFF0000UL; x ^= (t ^ (t << 16));
- t = (x ^ (x >> 8)) & 0x0000FF000000FF00UL; x ^= (t ^ (t << 8));
- t = (x ^ (x >> 4)) & 0x00F000F000F000F0UL; x ^= (t ^ (t << 4));
- t = (x ^ (x >> 2)) & 0x0C0C0C0C0C0C0C0CUL; x ^= (t ^ (t << 2));
- t = (x ^ (x >> 1)) & 0x2222222222222222UL; x ^= (t ^ (t << 1));
-
- z[zOff ] = (x ) & M64;
- z[zOff + 1] = (x >> 1) & M64;
- }
-
- internal static ulong Unshuffle(ulong x)
- {
- // "unshuffle" even bits to low half and odd bits to high half
- ulong t;
- t = (x ^ (x >> 1)) & 0x2222222222222222UL; x ^= (t ^ (t << 1));
- t = (x ^ (x >> 2)) & 0x0C0C0C0C0C0C0C0CUL; x ^= (t ^ (t << 2));
- t = (x ^ (x >> 4)) & 0x00F000F000F000F0UL; x ^= (t ^ (t << 4));
- t = (x ^ (x >> 8)) & 0x0000FF000000FF00UL; x ^= (t ^ (t << 8));
- t = (x ^ (x >> 16)) & 0x00000000FFFF0000UL; x ^= (t ^ (t << 16));
- return x;
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Mod.cs b/BCCrypto/src/math/raw/Mod.cs
deleted file mode 100644
index 8d9e8fd..0000000
--- a/BCCrypto/src/math/raw/Mod.cs
+++ /dev/null
@@ -1,186 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Utilities;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Mod
- {
- private static readonly SecureRandom RandomSource = new SecureRandom();
-
- public static void Invert(uint[] p, uint[] x, uint[] z)
- {
- int len = p.Length;
- if (Nat.IsZero(len, x))
- throw new ArgumentException("cannot be 0", "x");
- if (Nat.IsOne(len, x))
- {
- Array.Copy(x, 0, z, 0, len);
- return;
- }
-
- uint[] u = Nat.Copy(len, x);
- uint[] a = Nat.Create(len);
- a[0] = 1;
- int ac = 0;
-
- if ((u[0] & 1) == 0)
- {
- InversionStep(p, u, len, a, ref ac);
- }
- if (Nat.IsOne(len, u))
- {
- InversionResult(p, ac, a, z);
- return;
- }
-
- uint[] v = Nat.Copy(len, p);
- uint[] b = Nat.Create(len);
- int bc = 0;
-
- int uvLen = len;
-
- for (;;)
- {
- while (u[uvLen - 1] == 0 && v[uvLen - 1] == 0)
- {
- --uvLen;
- }
-
- if (Nat.Gte(len, u, v))
- {
- Nat.SubFrom(len, v, u);
- Debug.Assert((u[0] & 1) == 0);
- ac += Nat.SubFrom(len, b, a) - bc;
- InversionStep(p, u, uvLen, a, ref ac);
- if (Nat.IsOne(len, u))
- {
- InversionResult(p, ac, a, z);
- return;
- }
- }
- else
- {
- Nat.SubFrom(len, u, v);
- Debug.Assert((v[0] & 1) == 0);
- bc += Nat.SubFrom(len, a, b) - ac;
- InversionStep(p, v, uvLen, b, ref bc);
- if (Nat.IsOne(len, v))
- {
- InversionResult(p, bc, b, z);
- return;
- }
- }
- }
- }
-
- public static uint[] Random(uint[] p)
- {
- int len = p.Length;
- uint[] s = Nat.Create(len);
-
- uint m = p[len - 1];
- m |= m >> 1;
- m |= m >> 2;
- m |= m >> 4;
- m |= m >> 8;
- m |= m >> 16;
-
- do
- {
- byte[] bytes = new byte[len << 2];
- RandomSource.NextBytes(bytes);
- Pack.BE_To_UInt32(bytes, 0, s);
- s[len - 1] &= m;
- }
- while (Nat.Gte(len, s, p));
-
- return s;
- }
-
- public static void Add(uint[] p, uint[] x, uint[] y, uint[] z)
- {
- int len = p.Length;
- uint c = Nat.Add(len, x, y, z);
- if (c != 0)
- {
- Nat.SubFrom(len, p, z);
- }
- }
-
- public static void Subtract(uint[] p, uint[] x, uint[] y, uint[] z)
- {
- int len = p.Length;
- int c = Nat.Sub(len, x, y, z);
- if (c != 0)
- {
- Nat.AddTo(len, p, z);
- }
- }
-
- private static void InversionResult(uint[] p, int ac, uint[] a, uint[] z)
- {
- if (ac < 0)
- {
- Nat.Add(p.Length, a, p, z);
- }
- else
- {
- Array.Copy(a, 0, z, 0, p.Length);
- }
- }
-
- private static void InversionStep(uint[] p, uint[] u, int uLen, uint[] x, ref int xc)
- {
- int len = p.Length;
- int count = 0;
- while (u[0] == 0)
- {
- Nat.ShiftDownWord(uLen, u, 0);
- count += 32;
- }
-
- {
- int zeroes = GetTrailingZeroes(u[0]);
- if (zeroes > 0)
- {
- Nat.ShiftDownBits(uLen, u, zeroes, 0);
- count += zeroes;
- }
- }
-
- for (int i = 0; i < count; ++i)
- {
- if ((x[0] & 1) != 0)
- {
- if (xc < 0)
- {
- xc += (int)Nat.AddTo(len, p, x);
- }
- else
- {
- xc += Nat.SubFrom(len, p, x);
- }
- }
-
- Debug.Assert(xc == 0 || xc == -1);
- Nat.ShiftDownBit(len, x, (uint)xc);
- }
- }
-
- private static int GetTrailingZeroes(uint x)
- {
- Debug.Assert(x != 0);
- int count = 0;
- while ((x & 1) == 0)
- {
- x >>= 1;
- ++count;
- }
- return count;
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Nat.cs b/BCCrypto/src/math/raw/Nat.cs
deleted file mode 100644
index 1f9ab00..0000000
--- a/BCCrypto/src/math/raw/Nat.cs
+++ /dev/null
@@ -1,1053 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Nat
- {
- private const ulong M = 0xFFFFFFFFUL;
-
- public static uint Add(int len, uint[] x, uint[] y, uint[] z)
- {
- ulong c = 0;
- for (int i = 0; i < len; ++i)
- {
- c += (ulong)x[i] + y[i];
- z[i] = (uint)c;
- c >>= 32;
- }
- return (uint)c;
- }
-
- public static uint Add33At(int len, uint x, uint[] z, int zPos)
- {
- Debug.Assert(zPos <= (len - 2));
- ulong c = (ulong)z[zPos + 0] + x;
- z[zPos + 0] = (uint)c;
- c >>= 32;
- c += (ulong)z[zPos + 1] + 1;
- z[zPos + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, zPos + 2);
- }
-
- public static uint Add33At(int len, uint x, uint[] z, int zOff, int zPos)
- {
- Debug.Assert(zPos <= (len - 2));
- ulong c = (ulong)z[zOff + zPos] + x;
- z[zOff + zPos] = (uint)c;
- c >>= 32;
- c += (ulong)z[zOff + zPos + 1] + 1;
- z[zOff + zPos + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, zOff, zPos + 2);
- }
-
- public static uint Add33To(int len, uint x, uint[] z)
- {
- ulong c = (ulong)z[0] + x;
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)z[1] + 1;
- z[1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, 2);
- }
-
- public static uint Add33To(int len, uint x, uint[] z, int zOff)
- {
- ulong c = (ulong)z[zOff + 0] + x;
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)z[zOff + 1] + 1;
- z[zOff + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, zOff, 2);
- }
-
- public static uint AddBothTo(int len, uint[] x, uint[] y, uint[] z)
- {
- ulong c = 0;
- for (int i = 0; i < len; ++i)
- {
- c += (ulong)x[i] + y[i] + z[i];
- z[i] = (uint)c;
- c >>= 32;
- }
- return (uint)c;
- }
-
- public static uint AddBothTo(int len, uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- ulong c = 0;
- for (int i = 0; i < len; ++i)
- {
- c += (ulong)x[xOff + i] + y[yOff + i] + z[zOff + i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- return (uint)c;
- }
-
- public static uint AddDWordAt(int len, ulong x, uint[] z, int zPos)
- {
- Debug.Assert(zPos <= (len - 2));
- ulong c = (ulong)z[zPos + 0] + (x & M);
- z[zPos + 0] = (uint)c;
- c >>= 32;
- c += (ulong)z[zPos + 1] + (x >> 32);
- z[zPos + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, zPos + 2);
- }
-
- public static uint AddDWordAt(int len, ulong x, uint[] z, int zOff, int zPos)
- {
- Debug.Assert(zPos <= (len - 2));
- ulong c = (ulong)z[zOff + zPos] + (x & M);
- z[zOff + zPos] = (uint)c;
- c >>= 32;
- c += (ulong)z[zOff + zPos + 1] + (x >> 32);
- z[zOff + zPos + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, zOff, zPos + 2);
- }
-
- public static uint AddDWordTo(int len, ulong x, uint[] z)
- {
- ulong c = (ulong)z[0] + (x & M);
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)z[1] + (x >> 32);
- z[1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, 2);
- }
-
- public static uint AddDWordTo(int len, ulong x, uint[] z, int zOff)
- {
- ulong c = (ulong)z[zOff + 0] + (x & M);
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)z[zOff + 1] + (x >> 32);
- z[zOff + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, zOff, 2);
- }
-
- public static uint AddTo(int len, uint[] x, uint[] z)
- {
- ulong c = 0;
- for (int i = 0; i < len; ++i)
- {
- c += (ulong)x[i] + z[i];
- z[i] = (uint)c;
- c >>= 32;
- }
- return (uint)c;
- }
-
- public static uint AddTo(int len, uint[] x, int xOff, uint[] z, int zOff)
- {
- ulong c = 0;
- for (int i = 0; i < len; ++i)
- {
- c += (ulong)x[xOff + i] + z[zOff + i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- return (uint)c;
- }
-
- public static uint AddWordAt(int len, uint x, uint[] z, int zPos)
- {
- Debug.Assert(zPos <= (len - 1));
- ulong c = (ulong)x + z[zPos];
- z[zPos] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, zPos + 1);
- }
-
- public static uint AddWordAt(int len, uint x, uint[] z, int zOff, int zPos)
- {
- Debug.Assert(zPos <= (len - 1));
- ulong c = (ulong)x + z[zOff + zPos];
- z[zOff + zPos] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, zOff, zPos + 1);
- }
-
- public static uint AddWordTo(int len, uint x, uint[] z)
- {
- ulong c = (ulong)x + z[0];
- z[0] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, 1);
- }
-
- public static uint AddWordTo(int len, uint x, uint[] z, int zOff)
- {
- ulong c = (ulong)x + z[zOff];
- z[zOff] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, zOff, 1);
- }
-
- public static void Copy(int len, uint[] x, uint[] z)
- {
- Array.Copy(x, 0, z, 0, len);
- }
-
- public static uint[] Copy(int len, uint[] x)
- {
- uint[] z = new uint[len];
- Array.Copy(x, 0, z, 0, len);
- return z;
- }
-
- public static uint[] Create(int len)
- {
- return new uint[len];
- }
-
- public static ulong[] Create64(int len)
- {
- return new ulong[len];
- }
-
- public static int Dec(int len, uint[] z)
- {
- for (int i = 0; i < len; ++i)
- {
- if (--z[i] != uint.MaxValue)
- {
- return 0;
- }
- }
- return -1;
- }
-
- public static int Dec(int len, uint[] x, uint[] z)
- {
- int i = 0;
- while (i < len)
- {
- uint c = x[i] - 1;
- z[i] = c;
- ++i;
- if (c != uint.MaxValue)
- {
- while (i < len)
- {
- z[i] = x[i];
- ++i;
- }
- return 0;
- }
- }
- return -1;
- }
-
- public static int DecAt(int len, uint[] z, int zPos)
- {
- Debug.Assert(zPos <= len);
- for (int i = zPos; i < len; ++i)
- {
- if (--z[i] != uint.MaxValue)
- {
- return 0;
- }
- }
- return -1;
- }
-
- public static int DecAt(int len, uint[] z, int zOff, int zPos)
- {
- Debug.Assert(zPos <= len);
- for (int i = zPos; i < len; ++i)
- {
- if (--z[zOff + i] != uint.MaxValue)
- {
- return 0;
- }
- }
- return -1;
- }
-
- public static bool Eq(int len, uint[] x, uint[] y)
- {
- for (int i = len - 1; i >= 0; --i)
- {
- if (x[i] != y[i])
- {
- return false;
- }
- }
- return true;
- }
-
- public static uint[] FromBigInteger(int bits, BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > bits)
- throw new ArgumentException();
-
- int len = (bits + 31) >> 5;
- uint[] z = Create(len);
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (uint)x.IntValue;
- x = x.ShiftRight(32);
- }
- return z;
- }
-
- public static uint GetBit(uint[] x, int bit)
- {
- if (bit == 0)
- {
- return x[0] & 1;
- }
- int w = bit >> 5;
- if (w < 0 || w >= x.Length)
- {
- return 0;
- }
- int b = bit & 31;
- return (x[w] >> b) & 1;
- }
-
- public static bool Gte(int len, uint[] x, uint[] y)
- {
- for (int i = len - 1; i >= 0; --i)
- {
- uint x_i = x[i], y_i = y[i];
- if (x_i < y_i)
- return false;
- if (x_i > y_i)
- return true;
- }
- return true;
- }
-
- public static uint Inc(int len, uint[] z)
- {
- for (int i = 0; i < len; ++i)
- {
- if (++z[i] != uint.MinValue)
- {
- return 0;
- }
- }
- return 1;
- }
-
- public static uint Inc(int len, uint[] x, uint[] z)
- {
- int i = 0;
- while (i < len)
- {
- uint c = x[i] + 1;
- z[i] = c;
- ++i;
- if (c != 0)
- {
- while (i < len)
- {
- z[i] = x[i];
- ++i;
- }
- return 0;
- }
- }
- return 1;
- }
-
- public static uint IncAt(int len, uint[] z, int zPos)
- {
- Debug.Assert(zPos <= len);
- for (int i = zPos; i < len; ++i)
- {
- if (++z[i] != uint.MinValue)
- {
- return 0;
- }
- }
- return 1;
- }
-
- public static uint IncAt(int len, uint[] z, int zOff, int zPos)
- {
- Debug.Assert(zPos <= len);
- for (int i = zPos; i < len; ++i)
- {
- if (++z[zOff + i] != uint.MinValue)
- {
- return 0;
- }
- }
- return 1;
- }
-
- public static bool IsOne(int len, uint[] x)
- {
- if (x[0] != 1)
- {
- return false;
- }
- for (int i = 1; i < len; ++i)
- {
- if (x[i] != 0)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsZero(int len, uint[] x)
- {
- if (x[0] != 0)
- {
- return false;
- }
- for (int i = 1; i < len; ++i)
- {
- if (x[i] != 0)
- {
- return false;
- }
- }
- return true;
- }
-
- public static void Mul(int len, uint[] x, uint[] y, uint[] zz)
- {
- zz[len] = (uint)MulWord(len, x[0], y, zz);
-
- for (int i = 1; i < len; ++i)
- {
- zz[i + len] = (uint)MulWordAddTo(len, x[i], y, 0, zz, i);
- }
- }
-
- public static void Mul(int len, uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff)
- {
- zz[zzOff + len] = (uint)MulWord(len, x[xOff], y, yOff, zz, zzOff);
-
- for (int i = 1; i < len; ++i)
- {
- zz[zzOff + i + len] = (uint)MulWordAddTo(len, x[xOff + i], y, yOff, zz, zzOff + i);
- }
- }
-
- public static uint Mul31BothAdd(int len, uint a, uint[] x, uint b, uint[] y, uint[] z, int zOff)
- {
- ulong c = 0, aVal = (ulong)a, bVal = (ulong)b;
- int i = 0;
- do
- {
- c += aVal * x[i] + bVal * y[i] + z[zOff + i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- while (++i < len);
- return (uint)c;
- }
-
- public static uint MulWord(int len, uint x, uint[] y, uint[] z)
- {
- ulong c = 0, xVal = (ulong)x;
- int i = 0;
- do
- {
- c += xVal * y[i];
- z[i] = (uint)c;
- c >>= 32;
- }
- while (++i < len);
- return (uint)c;
- }
-
- public static uint MulWord(int len, uint x, uint[] y, int yOff, uint[] z, int zOff)
- {
- ulong c = 0, xVal = (ulong)x;
- int i = 0;
- do
- {
- c += xVal * y[yOff + i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- while (++i < len);
- return (uint)c;
- }
-
- public static uint MulWordAddTo(int len, uint x, uint[] y, int yOff, uint[] z, int zOff)
- {
- ulong c = 0, xVal = (ulong)x;
- int i = 0;
- do
- {
- c += xVal * y[yOff + i] + z[zOff + i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- while (++i < len);
- return (uint)c;
- }
-
- public static uint MulWordDwordAddAt(int len, uint x, ulong y, uint[] z, int zPos)
- {
- Debug.Assert(zPos <= (len - 3));
- ulong c = 0, xVal = (ulong)x;
- c += xVal * (uint)y + z[zPos + 0];
- z[zPos + 0] = (uint)c;
- c >>= 32;
- c += xVal * (y >> 32) + z[zPos + 1];
- z[zPos + 1] = (uint)c;
- c >>= 32;
- c += (ulong)z[zPos + 2];
- z[zPos + 2] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : IncAt(len, z, zPos + 3);
- }
-
- public static uint ShiftDownBit(int len, uint[] z, uint c)
- {
- int i = len;
- while (--i >= 0)
- {
- uint next = z[i];
- z[i] = (next >> 1) | (c << 31);
- c = next;
- }
- return c << 31;
- }
-
- public static uint ShiftDownBit(int len, uint[] z, int zOff, uint c)
- {
- int i = len;
- while (--i >= 0)
- {
- uint next = z[zOff + i];
- z[zOff + i] = (next >> 1) | (c << 31);
- c = next;
- }
- return c << 31;
- }
-
- public static uint ShiftDownBit(int len, uint[] x, uint c, uint[] z)
- {
- int i = len;
- while (--i >= 0)
- {
- uint next = x[i];
- z[i] = (next >> 1) | (c << 31);
- c = next;
- }
- return c << 31;
- }
-
- public static uint ShiftDownBit(int len, uint[] x, int xOff, uint c, uint[] z, int zOff)
- {
- int i = len;
- while (--i >= 0)
- {
- uint next = x[xOff + i];
- z[zOff + i] = (next >> 1) | (c << 31);
- c = next;
- }
- return c << 31;
- }
-
- public static uint ShiftDownBits(int len, uint[] z, int bits, uint c)
- {
- Debug.Assert(bits > 0 && bits < 32);
- int i = len;
- while (--i >= 0)
- {
- uint next = z[i];
- z[i] = (next >> bits) | (c << -bits);
- c = next;
- }
- return c << -bits;
- }
-
- public static uint ShiftDownBits(int len, uint[] z, int zOff, int bits, uint c)
- {
- Debug.Assert(bits > 0 && bits < 32);
- int i = len;
- while (--i >= 0)
- {
- uint next = z[zOff + i];
- z[zOff + i] = (next >> bits) | (c << -bits);
- c = next;
- }
- return c << -bits;
- }
-
- public static uint ShiftDownBits(int len, uint[] x, int bits, uint c, uint[] z)
- {
- Debug.Assert(bits > 0 && bits < 32);
- int i = len;
- while (--i >= 0)
- {
- uint next = x[i];
- z[i] = (next >> bits) | (c << -bits);
- c = next;
- }
- return c << -bits;
- }
-
- public static uint ShiftDownBits(int len, uint[] x, int xOff, int bits, uint c, uint[] z, int zOff)
- {
- Debug.Assert(bits > 0 && bits < 32);
- int i = len;
- while (--i >= 0)
- {
- uint next = x[xOff + i];
- z[zOff + i] = (next >> bits) | (c << -bits);
- c = next;
- }
- return c << -bits;
- }
-
- public static uint ShiftDownWord(int len, uint[] z, uint c)
- {
- int i = len;
- while (--i >= 0)
- {
- uint next = z[i];
- z[i] = c;
- c = next;
- }
- return c;
- }
-
- public static uint ShiftUpBit(int len, uint[] z, uint c)
- {
- for (int i = 0; i < len; ++i)
- {
- uint next = z[i];
- z[i] = (next << 1) | (c >> 31);
- c = next;
- }
- return c >> 31;
- }
-
- public static uint ShiftUpBit(int len, uint[] z, int zOff, uint c)
- {
- for (int i = 0; i < len; ++i)
- {
- uint next = z[zOff + i];
- z[zOff + i] = (next << 1) | (c >> 31);
- c = next;
- }
- return c >> 31;
- }
-
- public static uint ShiftUpBit(int len, uint[] x, uint c, uint[] z)
- {
- for (int i = 0; i < len; ++i)
- {
- uint next = x[i];
- z[i] = (next << 1) | (c >> 31);
- c = next;
- }
- return c >> 31;
- }
-
- public static uint ShiftUpBit(int len, uint[] x, int xOff, uint c, uint[] z, int zOff)
- {
- for (int i = 0; i < len; ++i)
- {
- uint next = x[xOff + i];
- z[zOff + i] = (next << 1) | (c >> 31);
- c = next;
- }
- return c >> 31;
- }
-
- public static ulong ShiftUpBit64(int len, ulong[] x, int xOff, ulong c, ulong[] z, int zOff)
- {
- for (int i = 0; i < len; ++i)
- {
- ulong next = x[xOff + i];
- z[zOff + i] = (next << 1) | (c >> 63);
- c = next;
- }
- return c >> 63;
- }
-
- public static uint ShiftUpBits(int len, uint[] z, int bits, uint c)
- {
- Debug.Assert(bits > 0 && bits < 32);
- for (int i = 0; i < len; ++i)
- {
- uint next = z[i];
- z[i] = (next << bits) | (c >> -bits);
- c = next;
- }
- return c >> -bits;
- }
-
- public static uint ShiftUpBits(int len, uint[] z, int zOff, int bits, uint c)
- {
- Debug.Assert(bits > 0 && bits < 32);
- for (int i = 0; i < len; ++i)
- {
- uint next = z[zOff + i];
- z[zOff + i] = (next << bits) | (c >> -bits);
- c = next;
- }
- return c >> -bits;
- }
-
- public static ulong ShiftUpBits64(int len, ulong[] z, int zOff, int bits, ulong c)
- {
- Debug.Assert(bits > 0 && bits < 64);
- for (int i = 0; i < len; ++i)
- {
- ulong next = z[zOff + i];
- z[zOff + i] = (next << bits) | (c >> -bits);
- c = next;
- }
- return c >> -bits;
- }
-
- public static uint ShiftUpBits(int len, uint[] x, int bits, uint c, uint[] z)
- {
- Debug.Assert(bits > 0 && bits < 32);
- for (int i = 0; i < len; ++i)
- {
- uint next = x[i];
- z[i] = (next << bits) | (c >> -bits);
- c = next;
- }
- return c >> -bits;
- }
-
- public static uint ShiftUpBits(int len, uint[] x, int xOff, int bits, uint c, uint[] z, int zOff)
- {
- Debug.Assert(bits > 0 && bits < 32);
- for (int i = 0; i < len; ++i)
- {
- uint next = x[xOff + i];
- z[zOff + i] = (next << bits) | (c >> -bits);
- c = next;
- }
- return c >> -bits;
- }
-
- public static ulong ShiftUpBits64(int len, ulong[] x, int xOff, int bits, ulong c, ulong[] z, int zOff)
- {
- Debug.Assert(bits > 0 && bits < 64);
- for (int i = 0; i < len; ++i)
- {
- ulong next = x[xOff + i];
- z[zOff + i] = (next << bits) | (c >> -bits);
- c = next;
- }
- return c >> -bits;
- }
-
- public static void Square(int len, uint[] x, uint[] zz)
- {
- int extLen = len << 1;
- uint c = 0;
- int j = len, k = extLen;
- do
- {
- ulong xVal = (ulong)x[--j];
- ulong p = xVal * xVal;
- zz[--k] = (c << 31) | (uint)(p >> 33);
- zz[--k] = (uint)(p >> 1);
- c = (uint)p;
- }
- while (j > 0);
-
- for (int i = 1; i < len; ++i)
- {
- c = SquareWordAdd(x, i, zz);
- AddWordAt(extLen, c, zz, i << 1);
- }
-
- ShiftUpBit(extLen, zz, x[0] << 31);
- }
-
- public static void Square(int len, uint[] x, int xOff, uint[] zz, int zzOff)
- {
- int extLen = len << 1;
- uint c = 0;
- int j = len, k = extLen;
- do
- {
- ulong xVal = (ulong)x[xOff + --j];
- ulong p = xVal * xVal;
- zz[zzOff + --k] = (c << 31) | (uint)(p >> 33);
- zz[zzOff + --k] = (uint)(p >> 1);
- c = (uint)p;
- }
- while (j > 0);
-
- for (int i = 1; i < len; ++i)
- {
- c = SquareWordAdd(x, xOff, i, zz, zzOff);
- AddWordAt(extLen, c, zz, zzOff, i << 1);
- }
-
- ShiftUpBit(extLen, zz, zzOff, x[xOff] << 31);
- }
-
- public static uint SquareWordAdd(uint[] x, int xPos, uint[] z)
- {
- ulong c = 0, xVal = (ulong)x[xPos];
- int i = 0;
- do
- {
- c += xVal * x[i] + z[xPos + i];
- z[xPos + i] = (uint)c;
- c >>= 32;
- }
- while (++i < xPos);
- return (uint)c;
- }
-
- public static uint SquareWordAdd(uint[] x, int xOff, int xPos, uint[] z, int zOff)
- {
- ulong c = 0, xVal = (ulong)x[xOff + xPos];
- int i = 0;
- do
- {
- c += xVal * (x[xOff + i] & M) + (z[xPos + zOff] & M);
- z[xPos + zOff] = (uint)c;
- c >>= 32;
- ++zOff;
- }
- while (++i < xPos);
- return (uint)c;
- }
-
- public static int Sub(int len, uint[] x, uint[] y, uint[] z)
- {
- long c = 0;
- for (int i = 0; i < len; ++i)
- {
- c += (long)x[i] - y[i];
- z[i] = (uint)c;
- c >>= 32;
- }
- return (int)c;
- }
-
- public static int Sub(int len, uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- long c = 0;
- for (int i = 0; i < len; ++i)
- {
- c += (long)x[xOff + i] - y[yOff + i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- return (int)c;
- }
- public static int Sub33At(int len, uint x, uint[] z, int zPos)
- {
- Debug.Assert(zPos <= (len - 2));
- long c = (long)z[zPos + 0] - x;
- z[zPos + 0] = (uint)c;
- c >>= 32;
- c += (long)z[zPos + 1] - 1;
- z[zPos + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : DecAt(len, z, zPos + 2);
- }
-
- public static int Sub33At(int len, uint x, uint[] z, int zOff, int zPos)
- {
- Debug.Assert(zPos <= (len - 2));
- long c = (long)z[zOff + zPos] - x;
- z[zOff + zPos] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + zPos + 1] - 1;
- z[zOff + zPos + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : DecAt(len, z, zOff, zPos + 2);
- }
-
- public static int Sub33From(int len, uint x, uint[] z)
- {
- long c = (long)z[0] - x;
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - 1;
- z[1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : DecAt(len, z, 2);
- }
-
- public static int Sub33From(int len, uint x, uint[] z, int zOff)
- {
- long c = (long)z[zOff + 0] - x;
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 1] - 1;
- z[zOff + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : DecAt(len, z, zOff, 2);
- }
-
- public static int SubBothFrom(int len, uint[] x, uint[] y, uint[] z)
- {
- long c = 0;
- for (int i = 0; i < len; ++i)
- {
- c += (long)z[i] - x[i] - y[i];
- z[i] = (uint)c;
- c >>= 32;
- }
- return (int)c;
- }
-
- public static int SubBothFrom(int len, uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- long c = 0;
- for (int i = 0; i < len; ++i)
- {
- c += (long)z[zOff + i] - x[xOff + i] - y[yOff + i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- return (int)c;
- }
-
- public static int SubDWordAt(int len, ulong x, uint[] z, int zPos)
- {
- Debug.Assert(zPos <= (len - 2));
- long c = (long)z[zPos + 0] - (long)(x & M);
- z[zPos + 0] = (uint)c;
- c >>= 32;
- c += (long)z[zPos + 1] - (long)(x >> 32);
- z[zPos + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : DecAt(len, z, zPos + 2);
- }
-
- public static int SubDWordAt(int len, ulong x, uint[] z, int zOff, int zPos)
- {
- Debug.Assert(zPos <= (len - 2));
- long c = (long)z[zOff + zPos] - (long)(x & M);
- z[zOff + zPos] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + zPos + 1] - (long)(x >> 32);
- z[zOff + zPos + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : DecAt(len, z, zOff, zPos + 2);
- }
-
- public static int SubDWordFrom(int len, ulong x, uint[] z)
- {
- long c = (long)z[0] - (long)(x & M);
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - (long)(x >> 32);
- z[1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : DecAt(len, z, 2);
- }
-
- public static int SubDWordFrom(int len, ulong x, uint[] z, int zOff)
- {
- long c = (long)z[zOff + 0] - (long)(x & M);
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 1] - (long)(x >> 32);
- z[zOff + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : DecAt(len, z, zOff, 2);
- }
-
- public static int SubFrom(int len, uint[] x, uint[] z)
- {
- long c = 0;
- for (int i = 0; i < len; ++i)
- {
- c += (long)z[i] - x[i];
- z[i] = (uint)c;
- c >>= 32;
- }
- return (int)c;
- }
-
- public static int SubFrom(int len, uint[] x, int xOff, uint[] z, int zOff)
- {
- long c = 0;
- for (int i = 0; i < len; ++i)
- {
- c += (long)z[zOff + i] - x[xOff + i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- return (int)c;
- }
-
- public static int SubWordAt(int len, uint x, uint[] z, int zPos)
- {
- Debug.Assert(zPos <= (len - 1));
- long c = (long)z[zPos] - x;
- z[zPos] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : DecAt(len, z, zPos + 1);
- }
-
- public static int SubWordAt(int len, uint x, uint[] z, int zOff, int zPos)
- {
- Debug.Assert(zPos <= (len - 1));
- long c = (long)z[zOff + zPos] - x;
- z[zOff + zPos] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : DecAt(len, z, zOff, zPos + 1);
- }
-
- public static int SubWordFrom(int len, uint x, uint[] z)
- {
- long c = (long)z[0] - x;
- z[0] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : DecAt(len, z, 1);
- }
-
- public static int SubWordFrom(int len, uint x, uint[] z, int zOff)
- {
- long c = (long)z[zOff + 0] - x;
- z[zOff + 0] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : DecAt(len, z, zOff, 1);
- }
-
- public static BigInteger ToBigInteger(int len, uint[] x)
- {
- byte[] bs = new byte[len << 2];
- for (int i = 0; i < len; ++i)
- {
- uint x_i = x[i];
- if (x_i != 0)
- {
- Pack.UInt32_To_BE(x_i, bs, (len - 1 - i) << 2);
- }
- }
- return new BigInteger(1, bs);
- }
-
- public static void Zero(int len, uint[] z)
- {
- for (int i = 0; i < len; ++i)
- {
- z[i] = 0;
- }
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Nat128.cs b/BCCrypto/src/math/raw/Nat128.cs
deleted file mode 100644
index 1d3b64d..0000000
--- a/BCCrypto/src/math/raw/Nat128.cs
+++ /dev/null
@@ -1,856 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Nat128
- {
- private const ulong M = 0xFFFFFFFFUL;
-
- public static uint Add(uint[] x, uint[] y, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + y[3];
- z[3] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddBothTo(uint[] x, uint[] y, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + y[0] + z[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + y[1] + z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + y[2] + z[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + y[3] + z[3];
- z[3] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddTo(uint[] x, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + z[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + z[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + z[3];
- z[3] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddTo(uint[] x, int xOff, uint[] z, int zOff, uint cIn)
- {
- ulong c = cIn;
- c += (ulong)x[xOff + 0] + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 1] + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 2] + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 3] + z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddToEachOther(uint[] u, int uOff, uint[] v, int vOff)
- {
- ulong c = 0;
- c += (ulong)u[uOff + 0] + v[vOff + 0];
- u[uOff + 0] = (uint)c;
- v[vOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 1] + v[vOff + 1];
- u[uOff + 1] = (uint)c;
- v[vOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 2] + v[vOff + 2];
- u[uOff + 2] = (uint)c;
- v[vOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 3] + v[vOff + 3];
- u[uOff + 3] = (uint)c;
- v[vOff + 3] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static void Copy(uint[] x, uint[] z)
- {
- z[0] = x[0];
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- }
-
- public static void Copy64(ulong[] x, ulong[] z)
- {
- z[0] = x[0];
- z[1] = x[1];
- }
-
- public static uint[] Create()
- {
- return new uint[4];
- }
-
- public static ulong[] Create64()
- {
- return new ulong[2];
- }
-
- public static uint[] CreateExt()
- {
- return new uint[8];
- }
-
- public static ulong[] CreateExt64()
- {
- return new ulong[4];
- }
-
- public static bool Diff(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- bool pos = Gte(x, xOff, y, yOff);
- if (pos)
- {
- Sub(x, xOff, y, yOff, z, zOff);
- }
- else
- {
- Sub(y, yOff, x, xOff, z, zOff);
- }
- return pos;
- }
-
- public static bool Eq(uint[] x, uint[] y)
- {
- for (int i = 3; i >= 0; --i)
- {
- if (x[i] != y[i])
- return false;
- }
- return true;
- }
-
- public static bool Eq64(ulong[] x, ulong[] y)
- {
- for (int i = 1; i >= 0; --i)
- {
- if (x[i] != y[i])
- return false;
- }
- return true;
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 128)
- throw new ArgumentException();
-
- uint[] z = Create();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (uint)x.IntValue;
- x = x.ShiftRight(32);
- }
- return z;
- }
-
- public static ulong[] FromBigInteger64(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 128)
- throw new ArgumentException();
-
- ulong[] z = Create64();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (ulong)x.LongValue;
- x = x.ShiftRight(64);
- }
- return z;
- }
-
- public static uint GetBit(uint[] x, int bit)
- {
- if (bit == 0)
- {
- return x[0] & 1;
- }
- if ((bit & 127) != bit)
- {
- return 0;
- }
- int w = bit >> 5;
- int b = bit & 31;
- return (x[w] >> b) & 1;
- }
-
- public static bool Gte(uint[] x, uint[] y)
- {
- for (int i = 3; i >= 0; --i)
- {
- uint x_i = x[i], y_i = y[i];
- if (x_i < y_i)
- return false;
- if (x_i > y_i)
- return true;
- }
- return true;
- }
-
- public static bool Gte(uint[] x, int xOff, uint[] y, int yOff)
- {
- for (int i = 3; i >= 0; --i)
- {
- uint x_i = x[xOff + i], y_i = y[yOff + i];
- if (x_i < y_i)
- return false;
- if (x_i > y_i)
- return true;
- }
- return true;
- }
-
- public static bool IsOne(uint[] x)
- {
- if (x[0] != 1)
- {
- return false;
- }
- for (int i = 1; i < 4; ++i)
- {
- if (x[i] != 0)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsOne64(ulong[] x)
- {
- if (x[0] != 1UL)
- {
- return false;
- }
- for (int i = 1; i < 2; ++i)
- {
- if (x[i] != 0UL)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsZero(uint[] x)
- {
- for (int i = 0; i < 4; ++i)
- {
- if (x[i] != 0)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsZero64(ulong[] x)
- {
- for (int i = 0; i < 2; ++i)
- {
- if (x[i] != 0UL)
- {
- return false;
- }
- }
- return true;
- }
-
- public static void Mul(uint[] x, uint[] y, uint[] zz)
- {
- ulong y_0 = y[0];
- ulong y_1 = y[1];
- ulong y_2 = y[2];
- ulong y_3 = y[3];
-
- {
- ulong c = 0, x_0 = x[0];
- c += x_0 * y_0;
- zz[0] = (uint)c;
- c >>= 32;
- c += x_0 * y_1;
- zz[1] = (uint)c;
- c >>= 32;
- c += x_0 * y_2;
- zz[2] = (uint)c;
- c >>= 32;
- c += x_0 * y_3;
- zz[3] = (uint)c;
- c >>= 32;
- zz[4] = (uint)c;
- }
-
- for (int i = 1; i < 4; ++i)
- {
- ulong c = 0, x_i = x[i];
- c += x_i * y_0 + zz[i + 0];
- zz[i + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[i + 1];
- zz[i + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[i + 2];
- zz[i + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[i + 3];
- zz[i + 3] = (uint)c;
- c >>= 32;
- zz[i + 4] = (uint)c;
- }
- }
-
- public static void Mul(uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff)
- {
- ulong y_0 = y[yOff + 0];
- ulong y_1 = y[yOff + 1];
- ulong y_2 = y[yOff + 2];
- ulong y_3 = y[yOff + 3];
-
- {
- ulong c = 0, x_0 = x[xOff + 0];
- c += x_0 * y_0;
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_0 * y_1;
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_0 * y_2;
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_0 * y_3;
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- zz[zzOff + 4] = (uint)c;
- }
-
- for (int i = 1; i < 4; ++i)
- {
- ++zzOff;
- ulong c = 0, x_i = x[xOff + i];
- c += x_i * y_0 + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- zz[zzOff + 4] = (uint)c;
- }
- }
-
- public static uint MulAddTo(uint[] x, uint[] y, uint[] zz)
- {
- ulong y_0 = y[0];
- ulong y_1 = y[1];
- ulong y_2 = y[2];
- ulong y_3 = y[3];
-
- ulong zc = 0;
- for (int i = 0; i < 4; ++i)
- {
- ulong c = 0, x_i = x[i];
- c += x_i * y_0 + zz[i + 0];
- zz[i + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[i + 1];
- zz[i + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[i + 2];
- zz[i + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[i + 3];
- zz[i + 3] = (uint)c;
- c >>= 32;
- c += zc + zz[i + 4];
- zz[i + 4] = (uint)c;
- zc = c >> 32;
- }
- return (uint)zc;
- }
-
- public static uint MulAddTo(uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff)
- {
- ulong y_0 = y[yOff + 0];
- ulong y_1 = y[yOff + 1];
- ulong y_2 = y[yOff + 2];
- ulong y_3 = y[yOff + 3];
-
- ulong zc = 0;
- for (int i = 0; i < 4; ++i)
- {
- ulong c = 0, x_i = x[xOff + i];
- c += x_i * y_0 + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += zc + zz[zzOff + 4];
- zz[zzOff + 4] = (uint)c;
- zc = c >> 32;
- ++zzOff;
- }
- return (uint)zc;
- }
-
- public static ulong Mul33Add(uint w, uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- Debug.Assert(w >> 31 == 0);
-
- ulong c = 0, wVal = w;
- ulong x0 = x[xOff + 0];
- c += wVal * x0 + y[yOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- ulong x1 = x[xOff + 1];
- c += wVal * x1 + x0 + y[yOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- ulong x2 = x[xOff + 2];
- c += wVal * x2 + x1 + y[yOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- ulong x3 = x[xOff + 3];
- c += wVal * x3 + x2 + y[yOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += x3;
- return c;
- }
-
- public static uint MulWordAddExt(uint x, uint[] yy, int yyOff, uint[] zz, int zzOff)
- {
- Debug.Assert(yyOff <= 4);
- Debug.Assert(zzOff <= 4);
-
- ulong c = 0, xVal = x;
- c += xVal * yy[yyOff + 0] + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += xVal * yy[yyOff + 1] + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += xVal * yy[yyOff + 2] + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += xVal * yy[yyOff + 3] + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint Mul33DWordAdd(uint x, ulong y, uint[] z, int zOff)
- {
- Debug.Assert(x >> 31 == 0);
- Debug.Assert(zOff <= 0);
- ulong c = 0, xVal = x;
- ulong y00 = y & M;
- c += xVal * y00 + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- ulong y01 = y >> 32;
- c += xVal * y01 + y00 + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += y01 + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint Mul33WordAdd(uint x, uint y, uint[] z, int zOff)
- {
- Debug.Assert(x >> 31 == 0);
- Debug.Assert(zOff <= 1);
- ulong c = 0, yVal = y;
- c += yVal * x + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += yVal + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(4, z, zOff, 3);
- }
-
- public static uint MulWordDwordAdd(uint x, ulong y, uint[] z, int zOff)
- {
- Debug.Assert(zOff <= 1);
- ulong c = 0, xVal = x;
- c += xVal * y + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += xVal * (y >> 32) + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(4, z, zOff, 3);
- }
-
- public static uint MulWordsAdd(uint x, uint y, uint[] z, int zOff)
- {
- Debug.Assert(zOff <= 2);
-
- ulong c = 0, xVal = x, yVal = y;
- c += yVal * xVal + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(4, z, zOff, 2);
- }
-
- public static uint MulWord(uint x, uint[] y, uint[] z, int zOff)
- {
- ulong c = 0, xVal = x;
- int i = 0;
- do
- {
- c += xVal * y[i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- while (++i < 4);
- return (uint)c;
- }
-
- public static void Square(uint[] x, uint[] zz)
- {
- ulong x_0 = x[0];
- ulong zz_1;
-
- uint c = 0, w;
- {
- int i = 3, j = 8;
- do
- {
- ulong xVal = x[i--];
- ulong p = xVal * xVal;
- zz[--j] = (c << 31) | (uint)(p >> 33);
- zz[--j] = (uint)(p >> 1);
- c = (uint)p;
- }
- while (i > 0);
-
- {
- ulong p = x_0 * x_0;
- zz_1 = (ulong)(c << 31) | (p >> 33);
- zz[0] = (uint)p;
- c = (uint)(p >> 32) & 1;
- }
- }
-
- ulong x_1 = x[1];
- ulong zz_2 = zz[2];
-
- {
- zz_1 += x_1 * x_0;
- w = (uint)zz_1;
- zz[1] = (w << 1) | c;
- c = w >> 31;
- zz_2 += zz_1 >> 32;
- }
-
- ulong x_2 = x[2];
- ulong zz_3 = zz[3];
- ulong zz_4 = zz[4];
- {
- zz_2 += x_2 * x_0;
- w = (uint)zz_2;
- zz[2] = (w << 1) | c;
- c = w >> 31;
- zz_3 += (zz_2 >> 32) + x_2 * x_1;
- zz_4 += zz_3 >> 32;
- zz_3 &= M;
- }
-
- ulong x_3 = x[3];
- ulong zz_5 = zz[5] + (zz_4 >> 32); zz_4 &= M;
- ulong zz_6 = zz[6] + (zz_5 >> 32); zz_5 &= M;
- {
- zz_3 += x_3 * x_0;
- w = (uint)zz_3;
- zz[3] = (w << 1) | c;
- c = w >> 31;
- zz_4 += (zz_3 >> 32) + x_3 * x_1;
- zz_5 += (zz_4 >> 32) + x_3 * x_2;
- zz_6 += zz_5 >> 32;
- }
-
- w = (uint)zz_4;
- zz[4] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_5;
- zz[5] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_6;
- zz[6] = (w << 1) | c;
- c = w >> 31;
- w = zz[7] + (uint)(zz_6 >> 32);
- zz[7] = (w << 1) | c;
- }
-
- public static void Square(uint[] x, int xOff, uint[] zz, int zzOff)
- {
- ulong x_0 = x[xOff + 0];
- ulong zz_1;
-
- uint c = 0, w;
- {
- int i = 3, j = 8;
- do
- {
- ulong xVal = x[xOff + i--];
- ulong p = xVal * xVal;
- zz[zzOff + --j] = (c << 31) | (uint)(p >> 33);
- zz[zzOff + --j] = (uint)(p >> 1);
- c = (uint)p;
- }
- while (i > 0);
-
- {
- ulong p = x_0 * x_0;
- zz_1 = (ulong)(c << 31) | (p >> 33);
- zz[zzOff + 0] = (uint)p;
- c = (uint)(p >> 32) & 1;
- }
- }
-
- ulong x_1 = x[xOff + 1];
- ulong zz_2 = zz[zzOff + 2];
-
- {
- zz_1 += x_1 * x_0;
- w = (uint)zz_1;
- zz[zzOff + 1] = (w << 1) | c;
- c = w >> 31;
- zz_2 += zz_1 >> 32;
- }
-
- ulong x_2 = x[xOff + 2];
- ulong zz_3 = zz[zzOff + 3];
- ulong zz_4 = zz[zzOff + 4];
- {
- zz_2 += x_2 * x_0;
- w = (uint)zz_2;
- zz[zzOff + 2] = (w << 1) | c;
- c = w >> 31;
- zz_3 += (zz_2 >> 32) + x_2 * x_1;
- zz_4 += zz_3 >> 32;
- zz_3 &= M;
- }
-
- ulong x_3 = x[xOff + 3];
- ulong zz_5 = zz[zzOff + 5] + (zz_4 >> 32); zz_4 &= M;
- ulong zz_6 = zz[zzOff + 6] + (zz_5 >> 32); zz_5 &= M;
- {
- zz_3 += x_3 * x_0;
- w = (uint)zz_3;
- zz[zzOff + 3] = (w << 1) | c;
- c = w >> 31;
- zz_4 += (zz_3 >> 32) + x_3 * x_1;
- zz_5 += (zz_4 >> 32) + x_3 * x_2;
- zz_6 += zz_5 >> 32;
- }
-
- w = (uint)zz_4;
- zz[zzOff + 4] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_5;
- zz[zzOff + 5] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_6;
- zz[zzOff + 6] = (w << 1) | c;
- c = w >> 31;
- w = zz[zzOff + 7] + (uint)(zz_6 >> 32);
- zz[zzOff + 7] = (w << 1) | c;
- }
-
- public static int Sub(uint[] x, uint[] y, uint[] z)
- {
- long c = 0;
- c += (long)x[0] - y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)x[1] - y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)x[2] - y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)x[3] - y[3];
- z[3] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int Sub(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- long c = 0;
- c += (long)x[xOff + 0] - y[yOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 1] - y[yOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 2] - y[yOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 3] - y[yOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubBothFrom(uint[] x, uint[] y, uint[] z)
- {
- long c = 0;
- c += (long)z[0] - x[0] - y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - x[1] - y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2] - x[2] - y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)z[3] - x[3] - y[3];
- z[3] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubFrom(uint[] x, uint[] z)
- {
- long c = 0;
- c += (long)z[0] - x[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - x[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2] - x[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)z[3] - x[3];
- z[3] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubFrom(uint[] x, int xOff, uint[] z, int zOff)
- {
- long c = 0;
- c += (long)z[zOff + 0] - x[xOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 1] - x[xOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 2] - x[xOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 3] - x[xOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static BigInteger ToBigInteger(uint[] x)
- {
- byte[] bs = new byte[16];
- for (int i = 0; i < 4; ++i)
- {
- uint x_i = x[i];
- if (x_i != 0)
- {
- Pack.UInt32_To_BE(x_i, bs, (3 - i) << 2);
- }
- }
- return new BigInteger(1, bs);
- }
-
- public static BigInteger ToBigInteger64(ulong[] x)
- {
- byte[] bs = new byte[16];
- for (int i = 0; i < 2; ++i)
- {
- ulong x_i = x[i];
- if (x_i != 0UL)
- {
- Pack.UInt64_To_BE(x_i, bs, (1 - i) << 3);
- }
- }
- return new BigInteger(1, bs);
- }
-
- public static void Zero(uint[] z)
- {
- z[0] = 0;
- z[1] = 0;
- z[2] = 0;
- z[3] = 0;
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Nat160.cs b/BCCrypto/src/math/raw/Nat160.cs
deleted file mode 100644
index 1fd00e5..0000000
--- a/BCCrypto/src/math/raw/Nat160.cs
+++ /dev/null
@@ -1,874 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Nat160
- {
- private const ulong M = 0xFFFFFFFFUL;
-
- public static uint Add(uint[] x, uint[] y, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (ulong)x[4] + y[4];
- z[4] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddBothTo(uint[] x, uint[] y, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + y[0] + z[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + y[1] + z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + y[2] + z[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + y[3] + z[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (ulong)x[4] + y[4] + z[4];
- z[4] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddTo(uint[] x, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + z[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + z[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + z[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (ulong)x[4] + z[4];
- z[4] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddTo(uint[] x, int xOff, uint[] z, int zOff, uint cIn)
- {
- ulong c = cIn;
- c += (ulong)x[xOff + 0] + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 1] + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 2] + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 3] + z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 4] + z[zOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 5] + z[zOff + 5];
- return (uint)c;
- }
-
- public static uint AddToEachOther(uint[] u, int uOff, uint[] v, int vOff)
- {
- ulong c = 0;
- c += (ulong)u[uOff + 0] + v[vOff + 0];
- u[uOff + 0] = (uint)c;
- v[vOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 1] + v[vOff + 1];
- u[uOff + 1] = (uint)c;
- v[vOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 2] + v[vOff + 2];
- u[uOff + 2] = (uint)c;
- v[vOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 3] + v[vOff + 3];
- u[uOff + 3] = (uint)c;
- v[vOff + 3] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 4] + v[vOff + 4];
- u[uOff + 4] = (uint)c;
- v[vOff + 4] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static void Copy(uint[] x, uint[] z)
- {
- z[0] = x[0];
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- z[4] = x[4];
- }
-
- public static uint[] Create()
- {
- return new uint[5];
- }
-
- public static uint[] CreateExt()
- {
- return new uint[10];
- }
-
- public static bool Diff(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- bool pos = Gte(x, xOff, y, yOff);
- if (pos)
- {
- Sub(x, xOff, y, yOff, z, zOff);
- }
- else
- {
- Sub(y, yOff, x, xOff, z, zOff);
- }
- return pos;
- }
-
- public static bool Eq(uint[] x, uint[] y)
- {
- for (int i = 4; i >= 0; --i)
- {
- if (x[i] != y[i])
- return false;
- }
- return true;
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 160)
- throw new ArgumentException();
-
- uint[] z = Create();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (uint)x.IntValue;
- x = x.ShiftRight(32);
- }
- return z;
- }
-
- public static uint GetBit(uint[] x, int bit)
- {
- if (bit == 0)
- {
- return x[0] & 1;
- }
- int w = bit >> 5;
- if (w < 0 || w >= 5)
- {
- return 0;
- }
- int b = bit & 31;
- return (x[w] >> b) & 1;
- }
-
- public static bool Gte(uint[] x, uint[] y)
- {
- for (int i = 4; i >= 0; --i)
- {
- uint x_i = x[i], y_i = y[i];
- if (x_i < y_i)
- return false;
- if (x_i > y_i)
- return true;
- }
- return true;
- }
-
- public static bool Gte(uint[] x, int xOff, uint[] y, int yOff)
- {
- for (int i = 4; i >= 0; --i)
- {
- uint x_i = x[xOff + i], y_i = y[yOff + i];
- if (x_i < y_i)
- return false;
- if (x_i > y_i)
- return true;
- }
- return true;
- }
-
- public static bool IsOne(uint[] x)
- {
- if (x[0] != 1)
- {
- return false;
- }
- for (int i = 1; i < 5; ++i)
- {
- if (x[i] != 0)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsZero(uint[] x)
- {
- for (int i = 0; i < 5; ++i)
- {
- if (x[i] != 0)
- {
- return false;
- }
- }
- return true;
- }
-
- public static void Mul(uint[] x, uint[] y, uint[] zz)
- {
- ulong y_0 = y[0];
- ulong y_1 = y[1];
- ulong y_2 = y[2];
- ulong y_3 = y[3];
- ulong y_4 = y[4];
-
- {
- ulong c = 0, x_0 = x[0];
- c += x_0 * y_0;
- zz[0] = (uint)c;
- c >>= 32;
- c += x_0 * y_1;
- zz[1] = (uint)c;
- c >>= 32;
- c += x_0 * y_2;
- zz[2] = (uint)c;
- c >>= 32;
- c += x_0 * y_3;
- zz[3] = (uint)c;
- c >>= 32;
- c += x_0 * y_4;
- zz[4] = (uint)c;
- c >>= 32;
- zz[5] = (uint)c;
- }
-
- for (int i = 1; i < 5; ++i)
- {
- ulong c = 0, x_i = x[i];
- c += x_i * y_0 + zz[i + 0];
- zz[i + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[i + 1];
- zz[i + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[i + 2];
- zz[i + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[i + 3];
- zz[i + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[i + 4];
- zz[i + 4] = (uint)c;
- c >>= 32;
- zz[i + 5] = (uint)c;
- }
- }
-
- public static void Mul(uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff)
- {
- ulong y_0 = y[yOff + 0];
- ulong y_1 = y[yOff + 1];
- ulong y_2 = y[yOff + 2];
- ulong y_3 = y[yOff + 3];
- ulong y_4 = y[yOff + 4];
-
- {
- ulong c = 0, x_0 = x[xOff + 0];
- c += x_0 * y_0;
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_0 * y_1;
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_0 * y_2;
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_0 * y_3;
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += x_0 * y_4;
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- zz[zzOff + 5] = (uint)c;
- }
-
- for (int i = 1; i < 5; ++i)
- {
- ++zzOff;
- ulong c = 0, x_i = x[xOff + i];
- c += x_i * y_0 + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[zzOff + 4];
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- zz[zzOff + 5] = (uint)c;
- }
- }
-
- public static uint MulAddTo(uint[] x, uint[] y, uint[] zz)
- {
- ulong y_0 = y[0];
- ulong y_1 = y[1];
- ulong y_2 = y[2];
- ulong y_3 = y[3];
- ulong y_4 = y[4];
-
- ulong zc = 0;
- for (int i = 0; i < 5; ++i)
- {
- ulong c = 0, x_i = x[i];
- c += x_i * y_0 + zz[i + 0];
- zz[i + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[i + 1];
- zz[i + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[i + 2];
- zz[i + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[i + 3];
- zz[i + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[i + 4];
- zz[i + 4] = (uint)c;
- c >>= 32;
- c += zc + zz[i + 5];
- zz[i + 5] = (uint)c;
- zc = c >> 32;
- }
- return (uint)zc;
- }
-
- public static uint MulAddTo(uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff)
- {
- ulong y_0 = y[yOff + 0];
- ulong y_1 = y[yOff + 1];
- ulong y_2 = y[yOff + 2];
- ulong y_3 = y[yOff + 3];
- ulong y_4 = y[yOff + 4];
-
- ulong zc = 0;
- for (int i = 0; i < 5; ++i)
- {
- ulong c = 0, x_i = x[xOff + i];
- c += x_i * y_0 + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[zzOff + 4];
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- c += zc + zz[zzOff + 5];
- zz[zzOff + 5] = (uint)c;
- zc = c >> 32;
- ++zzOff;
- }
- return (uint)zc;
- }
-
- public static ulong Mul33Add(uint w, uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- Debug.Assert(w >> 31 == 0);
-
- ulong c = 0, wVal = w;
- ulong x0 = x[xOff + 0];
- c += wVal * x0 + y[yOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- ulong x1 = x[xOff + 1];
- c += wVal * x1 + x0 + y[yOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- ulong x2 = x[xOff + 2];
- c += wVal * x2 + x1 + y[yOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- ulong x3 = x[xOff + 3];
- c += wVal * x3 + x2 + y[yOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- ulong x4 = x[xOff + 4];
- c += wVal * x4 + x3 + y[yOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += x4;
- return c;
- }
-
- public static uint MulWordAddExt(uint x, uint[] yy, int yyOff, uint[] zz, int zzOff)
- {
- Debug.Assert(yyOff <= 5);
- Debug.Assert(zzOff <= 5);
-
- ulong c = 0, xVal = x;
- c += xVal * yy[yyOff + 0] + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += xVal * yy[yyOff + 1] + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += xVal * yy[yyOff + 2] + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += xVal * yy[yyOff + 3] + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += xVal * yy[yyOff + 4] + zz[zzOff + 4];
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint Mul33DWordAdd(uint x, ulong y, uint[] z, int zOff)
- {
- Debug.Assert(x >> 31 == 0);
- Debug.Assert(zOff <= 1);
- ulong c = 0, xVal = x;
- ulong y00 = y & M;
- c += xVal * y00 + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- ulong y01 = y >> 32;
- c += xVal * y01 + y00 + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += y01 + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(5, z, zOff, 4);
- }
-
- public static uint Mul33WordAdd(uint x, uint y, uint[] z, int zOff)
- {
- Debug.Assert(x >> 31 == 0);
- Debug.Assert(zOff <= 2);
- ulong c = 0, yVal = y;
- c += yVal * x + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += yVal + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(5, z, zOff, 3);
- }
-
- public static uint MulWordDwordAdd(uint x, ulong y, uint[] z, int zOff)
- {
- Debug.Assert(zOff <= 2);
- ulong c = 0, xVal = x;
- c += xVal * y + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += xVal * (y >> 32) + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(5, z, zOff, 3);
- }
-
- public static uint MulWordsAdd(uint x, uint y, uint[] z, int zOff)
- {
- Debug.Assert(zOff <= 3);
-
- ulong c = 0, xVal = x, yVal = y;
- c += yVal * xVal + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(5, z, zOff, 2);
- }
-
- public static uint MulWord(uint x, uint[] y, uint[] z, int zOff)
- {
- ulong c = 0, xVal = x;
- int i = 0;
- do
- {
- c += xVal * y[i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- while (++i < 5);
- return (uint)c;
- }
-
- public static void Square(uint[] x, uint[] zz)
- {
- ulong x_0 = x[0];
- ulong zz_1;
-
- uint c = 0, w;
- {
- int i = 4, j = 10;
- do
- {
- ulong xVal = x[i--];
- ulong p = xVal * xVal;
- zz[--j] = (c << 31) | (uint)(p >> 33);
- zz[--j] = (uint)(p >> 1);
- c = (uint)p;
- }
- while (i > 0);
-
- {
- ulong p = x_0 * x_0;
- zz_1 = (ulong)(c << 31) | (p >> 33);
- zz[0] = (uint)p;
- c = (uint)(p >> 32) & 1;
- }
- }
-
- ulong x_1 = x[1];
- ulong zz_2 = zz[2];
-
- {
- zz_1 += x_1 * x_0;
- w = (uint)zz_1;
- zz[1] = (w << 1) | c;
- c = w >> 31;
- zz_2 += zz_1 >> 32;
- }
-
- ulong x_2 = x[2];
- ulong zz_3 = zz[3];
- ulong zz_4 = zz[4];
- {
- zz_2 += x_2 * x_0;
- w = (uint)zz_2;
- zz[2] = (w << 1) | c;
- c = w >> 31;
- zz_3 += (zz_2 >> 32) + x_2 * x_1;
- zz_4 += zz_3 >> 32;
- zz_3 &= M;
- }
-
- ulong x_3 = x[3];
- ulong zz_5 = zz[5] + (zz_4 >> 32); zz_4 &= M;
- ulong zz_6 = zz[6] + (zz_5 >> 32); zz_5 &= M;
- {
- zz_3 += x_3 * x_0;
- w = (uint)zz_3;
- zz[3] = (w << 1) | c;
- c = w >> 31;
- zz_4 += (zz_3 >> 32) + x_3 * x_1;
- zz_5 += (zz_4 >> 32) + x_3 * x_2;
- zz_4 &= M;
- zz_6 += zz_5 >> 32;
- zz_5 &= M;
- }
-
- ulong x_4 = x[4];
- ulong zz_7 = zz[7] + (zz_6 >> 32); zz_6 &= M;
- ulong zz_8 = zz[8] + (zz_7 >> 32); zz_7 &= M;
- {
- zz_4 += x_4 * x_0;
- w = (uint)zz_4;
- zz[4] = (w << 1) | c;
- c = w >> 31;
- zz_5 += (zz_4 >> 32) + x_4 * x_1;
- zz_6 += (zz_5 >> 32) + x_4 * x_2;
- zz_7 += (zz_6 >> 32) + x_4 * x_3;
- zz_8 += zz_7 >> 32;
- }
-
- w = (uint)zz_5;
- zz[5] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_6;
- zz[6] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_7;
- zz[7] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_8;
- zz[8] = (w << 1) | c;
- c = w >> 31;
- w = zz[9] + (uint)(zz_8 >> 32);
- zz[9] = (w << 1) | c;
- }
-
- public static void Square(uint[] x, int xOff, uint[] zz, int zzOff)
- {
- ulong x_0 = x[xOff + 0];
- ulong zz_1;
-
- uint c = 0, w;
- {
- int i = 4, j = 10;
- do
- {
- ulong xVal = x[xOff + i--];
- ulong p = xVal * xVal;
- zz[zzOff + --j] = (c << 31) | (uint)(p >> 33);
- zz[zzOff + --j] = (uint)(p >> 1);
- c = (uint)p;
- }
- while (i > 0);
-
- {
- ulong p = x_0 * x_0;
- zz_1 = (ulong)(c << 31) | (p >> 33);
- zz[zzOff + 0] = (uint)p;
- c = (uint)(p >> 32) & 1;
- }
- }
-
- ulong x_1 = x[xOff + 1];
- ulong zz_2 = zz[zzOff + 2];
-
- {
- zz_1 += x_1 * x_0;
- w = (uint)zz_1;
- zz[zzOff + 1] = (w << 1) | c;
- c = w >> 31;
- zz_2 += zz_1 >> 32;
- }
-
- ulong x_2 = x[xOff + 2];
- ulong zz_3 = zz[zzOff + 3];
- ulong zz_4 = zz[zzOff + 4];
- {
- zz_2 += x_2 * x_0;
- w = (uint)zz_2;
- zz[zzOff + 2] = (w << 1) | c;
- c = w >> 31;
- zz_3 += (zz_2 >> 32) + x_2 * x_1;
- zz_4 += zz_3 >> 32;
- zz_3 &= M;
- }
-
- ulong x_3 = x[xOff + 3];
- ulong zz_5 = zz[zzOff + 5] + (zz_4 >> 32); zz_4 &= M;
- ulong zz_6 = zz[zzOff + 6] + (zz_5 >> 32); zz_5 &= M;
- {
- zz_3 += x_3 * x_0;
- w = (uint)zz_3;
- zz[zzOff + 3] = (w << 1) | c;
- c = w >> 31;
- zz_4 += (zz_3 >> 32) + x_3 * x_1;
- zz_5 += (zz_4 >> 32) + x_3 * x_2;
- zz_4 &= M;
- zz_6 += zz_5 >> 32;
- zz_5 &= M;
- }
-
- ulong x_4 = x[xOff + 4];
- ulong zz_7 = zz[zzOff + 7] + (zz_6 >> 32); zz_6 &= M;
- ulong zz_8 = zz[zzOff + 8] + (zz_7 >> 32); zz_7 &= M;
- {
- zz_4 += x_4 * x_0;
- w = (uint)zz_4;
- zz[zzOff + 4] = (w << 1) | c;
- c = w >> 31;
- zz_5 += (zz_4 >> 32) + x_4 * x_1;
- zz_6 += (zz_5 >> 32) + x_4 * x_2;
- zz_7 += (zz_6 >> 32) + x_4 * x_3;
- zz_8 += zz_7 >> 32;
- }
-
- w = (uint)zz_5;
- zz[zzOff + 5] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_6;
- zz[zzOff + 6] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_7;
- zz[zzOff + 7] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_8;
- zz[zzOff + 8] = (w << 1) | c;
- c = w >> 31;
- w = zz[zzOff + 9] + (uint)(zz_8 >> 32);
- zz[zzOff + 9] = (w << 1) | c;
- }
-
- public static int Sub(uint[] x, uint[] y, uint[] z)
- {
- long c = 0;
- c += (long)x[0] - y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)x[1] - y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)x[2] - y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)x[3] - y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (long)x[4] - y[4];
- z[4] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int Sub(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- long c = 0;
- c += (long)x[xOff + 0] - y[yOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 1] - y[yOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 2] - y[yOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 3] - y[yOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 4] - y[yOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubBothFrom(uint[] x, uint[] y, uint[] z)
- {
- long c = 0;
- c += (long)z[0] - x[0] - y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - x[1] - y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2] - x[2] - y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)z[3] - x[3] - y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (long)z[4] - x[4] - y[4];
- z[4] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubFrom(uint[] x, uint[] z)
- {
- long c = 0;
- c += (long)z[0] - x[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - x[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2] - x[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)z[3] - x[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (long)z[4] - x[4];
- z[4] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubFrom(uint[] x, int xOff, uint[] z, int zOff)
- {
- long c = 0;
- c += (long)z[zOff + 0] - x[xOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 1] - x[xOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 2] - x[xOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 3] - x[xOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 4] - x[xOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static BigInteger ToBigInteger(uint[] x)
- {
- byte[] bs = new byte[20];
- for (int i = 0; i < 5; ++i)
- {
- uint x_i = x[i];
- if (x_i != 0)
- {
- Pack.UInt32_To_BE(x_i, bs, (4 - i) << 2);
- }
- }
- return new BigInteger(1, bs);
- }
-
- public static void Zero(uint[] z)
- {
- z[0] = 0;
- z[1] = 0;
- z[2] = 0;
- z[3] = 0;
- z[4] = 0;
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Nat192.cs b/BCCrypto/src/math/raw/Nat192.cs
deleted file mode 100644
index 3099baf..0000000
--- a/BCCrypto/src/math/raw/Nat192.cs
+++ /dev/null
@@ -1,1048 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Nat192
- {
- private const ulong M = 0xFFFFFFFFUL;
-
- public static uint Add(uint[] x, uint[] y, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (ulong)x[4] + y[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (ulong)x[5] + y[5];
- z[5] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddBothTo(uint[] x, uint[] y, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + y[0] + z[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + y[1] + z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + y[2] + z[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + y[3] + z[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (ulong)x[4] + y[4] + z[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (ulong)x[5] + y[5] + z[5];
- z[5] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddTo(uint[] x, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + z[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + z[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + z[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (ulong)x[4] + z[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (ulong)x[5] + z[5];
- z[5] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddTo(uint[] x, int xOff, uint[] z, int zOff, uint cIn)
- {
- ulong c = cIn;
- c += (ulong)x[xOff + 0] + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 1] + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 2] + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 3] + z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 4] + z[zOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 5] + z[zOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddToEachOther(uint[] u, int uOff, uint[] v, int vOff)
- {
- ulong c = 0;
- c += (ulong)u[uOff + 0] + v[vOff + 0];
- u[uOff + 0] = (uint)c;
- v[vOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 1] + v[vOff + 1];
- u[uOff + 1] = (uint)c;
- v[vOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 2] + v[vOff + 2];
- u[uOff + 2] = (uint)c;
- v[vOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 3] + v[vOff + 3];
- u[uOff + 3] = (uint)c;
- v[vOff + 3] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 4] + v[vOff + 4];
- u[uOff + 4] = (uint)c;
- v[vOff + 4] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 5] + v[vOff + 5];
- u[uOff + 5] = (uint)c;
- v[vOff + 5] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static void Copy(uint[] x, uint[] z)
- {
- z[0] = x[0];
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- z[4] = x[4];
- z[5] = x[5];
- }
-
- public static void Copy64(ulong[] x, ulong[] z)
- {
- z[0] = x[0];
- z[1] = x[1];
- z[2] = x[2];
- }
-
- public static uint[] Create()
- {
- return new uint[6];
- }
-
- public static ulong[] Create64()
- {
- return new ulong[3];
- }
-
- public static uint[] CreateExt()
- {
- return new uint[12];
- }
-
- public static ulong[] CreateExt64()
- {
- return new ulong[6];
- }
-
- public static bool Diff(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- bool pos = Gte(x, xOff, y, yOff);
- if (pos)
- {
- Sub(x, xOff, y, yOff, z, zOff);
- }
- else
- {
- Sub(y, yOff, x, xOff, z, zOff);
- }
- return pos;
- }
-
- public static bool Eq(uint[] x, uint[] y)
- {
- for (int i = 5; i >= 0; --i)
- {
- if (x[i] != y[i])
- return false;
- }
- return true;
- }
-
- public static bool Eq64(ulong[] x, ulong[] y)
- {
- for (int i = 2; i >= 0; --i)
- {
- if (x[i] != y[i])
- {
- return false;
- }
- }
- return true;
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 192)
- throw new ArgumentException();
-
- uint[] z = Create();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (uint)x.IntValue;
- x = x.ShiftRight(32);
- }
- return z;
- }
-
- public static ulong[] FromBigInteger64(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 192)
- throw new ArgumentException();
-
- ulong[] z = Create64();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (ulong)x.LongValue;
- x = x.ShiftRight(64);
- }
- return z;
- }
-
- public static uint GetBit(uint[] x, int bit)
- {
- if (bit == 0)
- {
- return x[0] & 1;
- }
- int w = bit >> 5;
- if (w < 0 || w >= 6)
- {
- return 0;
- }
- int b = bit & 31;
- return (x[w] >> b) & 1;
- }
-
- public static bool Gte(uint[] x, uint[] y)
- {
- for (int i = 5; i >= 0; --i)
- {
- uint x_i = x[i], y_i = y[i];
- if (x_i < y_i)
- return false;
- if (x_i > y_i)
- return true;
- }
- return true;
- }
-
- public static bool Gte(uint[] x, int xOff, uint[] y, int yOff)
- {
- for (int i = 5; i >= 0; --i)
- {
- uint x_i = x[xOff + i], y_i = y[yOff + i];
- if (x_i < y_i)
- return false;
- if (x_i > y_i)
- return true;
- }
- return true;
- }
-
- public static bool IsOne(uint[] x)
- {
- if (x[0] != 1)
- {
- return false;
- }
- for (int i = 1; i < 6; ++i)
- {
- if (x[i] != 0)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsOne64(ulong[] x)
- {
- if (x[0] != 1UL)
- {
- return false;
- }
- for (int i = 1; i < 3; ++i)
- {
- if (x[i] != 0UL)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsZero(uint[] x)
- {
- for (int i = 0; i < 6; ++i)
- {
- if (x[i] != 0)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsZero64(ulong[] x)
- {
- for (int i = 0; i < 3; ++i)
- {
- if (x[i] != 0UL)
- {
- return false;
- }
- }
- return true;
- }
-
- public static void Mul(uint[] x, uint[] y, uint[] zz)
- {
- ulong y_0 = y[0];
- ulong y_1 = y[1];
- ulong y_2 = y[2];
- ulong y_3 = y[3];
- ulong y_4 = y[4];
- ulong y_5 = y[5];
-
- {
- ulong c = 0, x_0 = x[0];
- c += x_0 * y_0;
- zz[0] = (uint)c;
- c >>= 32;
- c += x_0 * y_1;
- zz[1] = (uint)c;
- c >>= 32;
- c += x_0 * y_2;
- zz[2] = (uint)c;
- c >>= 32;
- c += x_0 * y_3;
- zz[3] = (uint)c;
- c >>= 32;
- c += x_0 * y_4;
- zz[4] = (uint)c;
- c >>= 32;
- c += x_0 * y_5;
- zz[5] = (uint)c;
- c >>= 32;
- zz[6] = (uint)c;
- }
-
- for (int i = 1; i < 6; ++i)
- {
- ulong c = 0, x_i = x[i];
- c += x_i * y_0 + zz[i + 0];
- zz[i + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[i + 1];
- zz[i + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[i + 2];
- zz[i + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[i + 3];
- zz[i + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[i + 4];
- zz[i + 4] = (uint)c;
- c >>= 32;
- c += x_i * y_5 + zz[i + 5];
- zz[i + 5] = (uint)c;
- c >>= 32;
- zz[i + 6] = (uint)c;
- }
- }
-
- public static void Mul(uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff)
- {
- ulong y_0 = y[yOff + 0];
- ulong y_1 = y[yOff + 1];
- ulong y_2 = y[yOff + 2];
- ulong y_3 = y[yOff + 3];
- ulong y_4 = y[yOff + 4];
- ulong y_5 = y[yOff + 5];
-
- {
- ulong c = 0, x_0 = x[xOff + 0];
- c += x_0 * y_0;
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_0 * y_1;
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_0 * y_2;
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_0 * y_3;
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += x_0 * y_4;
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- c += x_0 * y_5;
- zz[zzOff + 5] = (uint)c;
- c >>= 32;
- zz[zzOff + 6] = (uint)c;
- }
-
- for (int i = 1; i < 6; ++i)
- {
- ++zzOff;
- ulong c = 0, x_i = x[xOff + i];
- c += x_i * y_0 + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[zzOff + 4];
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- c += x_i * y_5 + zz[zzOff + 5];
- zz[zzOff + 5] = (uint)c;
- c >>= 32;
- zz[zzOff + 6] = (uint)c;
- }
- }
-
- public static uint MulAddTo(uint[] x, uint[] y, uint[] zz)
- {
- ulong y_0 = y[0];
- ulong y_1 = y[1];
- ulong y_2 = y[2];
- ulong y_3 = y[3];
- ulong y_4 = y[4];
- ulong y_5 = y[5];
-
- ulong zc = 0;
- for (int i = 0; i < 6; ++i)
- {
- ulong c = 0, x_i = x[i];
- c += x_i * y_0 + zz[i + 0];
- zz[i + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[i + 1];
- zz[i + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[i + 2];
- zz[i + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[i + 3];
- zz[i + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[i + 4];
- zz[i + 4] = (uint)c;
- c >>= 32;
- c += x_i * y_5 + zz[i + 5];
- zz[i + 5] = (uint)c;
- c >>= 32;
- c += zc + zz[i + 6];
- zz[i + 6] = (uint)c;
- zc = c >> 32;
- }
- return (uint)zc;
- }
-
- public static uint MulAddTo(uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff)
- {
- ulong y_0 = y[yOff + 0];
- ulong y_1 = y[yOff + 1];
- ulong y_2 = y[yOff + 2];
- ulong y_3 = y[yOff + 3];
- ulong y_4 = y[yOff + 4];
- ulong y_5 = y[yOff + 5];
-
- ulong zc = 0;
- for (int i = 0; i < 6; ++i)
- {
- ulong c = 0, x_i = x[xOff + i];
- c += x_i * y_0 + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[zzOff + 4];
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- c += x_i * y_5 + zz[zzOff + 5];
- zz[zzOff + 5] = (uint)c;
- c >>= 32;
- c += zc + zz[zzOff + 6];
- zz[zzOff + 6] = (uint)c;
- zc = c >> 32;
- ++zzOff;
- }
- return (uint)zc;
- }
-
- public static ulong Mul33Add(uint w, uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- Debug.Assert(w >> 31 == 0);
-
- ulong c = 0, wVal = w;
- ulong x0 = x[xOff + 0];
- c += wVal * x0 + y[yOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- ulong x1 = x[xOff + 1];
- c += wVal * x1 + x0 + y[yOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- ulong x2 = x[xOff + 2];
- c += wVal * x2 + x1 + y[yOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- ulong x3 = x[xOff + 3];
- c += wVal * x3 + x2 + y[yOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- ulong x4 = x[xOff + 4];
- c += wVal * x4 + x3 + y[yOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- ulong x5 = x[xOff + 5];
- c += wVal * x5 + x4 + y[yOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += x5;
- return c;
- }
-
- public static uint MulWordAddExt(uint x, uint[] yy, int yyOff, uint[] zz, int zzOff)
- {
- Debug.Assert(yyOff <= 6);
- Debug.Assert(zzOff <= 6);
- ulong c = 0, xVal = x;
- c += xVal * yy[yyOff + 0] + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += xVal * yy[yyOff + 1] + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += xVal * yy[yyOff + 2] + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += xVal * yy[yyOff + 3] + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += xVal * yy[yyOff + 4] + zz[zzOff + 4];
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- c += xVal * yy[yyOff + 5] + zz[zzOff + 5];
- zz[zzOff + 5] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint Mul33DWordAdd(uint x, ulong y, uint[] z, int zOff)
- {
- Debug.Assert(x >> 31 == 0);
- Debug.Assert(zOff <= 2);
- ulong c = 0, xVal = x;
- ulong y00 = y & M;
- c += xVal * y00 + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- ulong y01 = y >> 32;
- c += xVal * y01 + y00 + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += y01 + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(6, z, zOff, 4);
- }
-
- public static uint Mul33WordAdd(uint x, uint y, uint[] z, int zOff)
- {
- Debug.Assert(x >> 31 == 0);
- Debug.Assert(zOff <=3);
- ulong c = 0, yVal = y;
- c += yVal * x + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += yVal + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(6, z, zOff, 3);
- }
-
- public static uint MulWordDwordAdd(uint x, ulong y, uint[] z, int zOff)
- {
- Debug.Assert(zOff <= 3);
- ulong c = 0, xVal = x;
- c += xVal * y + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += xVal * (y >> 32) + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(6, z, zOff, 3);
- }
-
- public static uint MulWord(uint x, uint[] y, uint[] z, int zOff)
- {
- ulong c = 0, xVal = x;
- int i = 0;
- do
- {
- c += xVal * y[i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- while (++i < 6);
- return (uint)c;
- }
-
- public static void Square(uint[] x, uint[] zz)
- {
- ulong x_0 = x[0];
- ulong zz_1;
-
- uint c = 0, w;
- {
- int i = 5, j = 12;
- do
- {
- ulong xVal = x[i--];
- ulong p = xVal * xVal;
- zz[--j] = (c << 31) | (uint)(p >> 33);
- zz[--j] = (uint)(p >> 1);
- c = (uint)p;
- }
- while (i > 0);
-
- {
- ulong p = x_0 * x_0;
- zz_1 = (ulong)(c << 31) | (p >> 33);
- zz[0] = (uint)p;
- c = (uint)(p >> 32) & 1;
- }
- }
-
- ulong x_1 = x[1];
- ulong zz_2 = zz[2];
-
- {
- zz_1 += x_1 * x_0;
- w = (uint)zz_1;
- zz[1] = (w << 1) | c;
- c = w >> 31;
- zz_2 += zz_1 >> 32;
- }
-
- ulong x_2 = x[2];
- ulong zz_3 = zz[3];
- ulong zz_4 = zz[4];
- {
- zz_2 += x_2 * x_0;
- w = (uint)zz_2;
- zz[2] = (w << 1) | c;
- c = w >> 31;
- zz_3 += (zz_2 >> 32) + x_2 * x_1;
- zz_4 += zz_3 >> 32;
- zz_3 &= M;
- }
-
- ulong x_3 = x[3];
- ulong zz_5 = zz[5] + (zz_4 >> 32); zz_4 &= M;
- ulong zz_6 = zz[6] + (zz_5 >> 32); zz_5 &= M;
- {
- zz_3 += x_3 * x_0;
- w = (uint)zz_3;
- zz[3] = (w << 1) | c;
- c = w >> 31;
- zz_4 += (zz_3 >> 32) + x_3 * x_1;
- zz_5 += (zz_4 >> 32) + x_3 * x_2;
- zz_4 &= M;
- zz_6 += zz_5 >> 32;
- zz_5 &= M;
- }
-
- ulong x_4 = x[4];
- ulong zz_7 = zz[7] + (zz_6 >> 32); zz_6 &= M;
- ulong zz_8 = zz[8] + (zz_7 >> 32); zz_7 &= M;
- {
- zz_4 += x_4 * x_0;
- w = (uint)zz_4;
- zz[4] = (w << 1) | c;
- c = w >> 31;
- zz_5 += (zz_4 >> 32) + x_4 * x_1;
- zz_6 += (zz_5 >> 32) + x_4 * x_2;
- zz_5 &= M;
- zz_7 += (zz_6 >> 32) + x_4 * x_3;
- zz_6 &= M;
- zz_8 += zz_7 >> 32;
- zz_7 &= M;
- }
-
- ulong x_5 = x[5];
- ulong zz_9 = zz[9] + (zz_8 >> 32); zz_8 &= M;
- ulong zz_10 = zz[10] + (zz_9 >> 32); zz_9 &= M;
- {
- zz_5 += x_5 * x_0;
- w = (uint)zz_5;
- zz[5] = (w << 1) | c;
- c = w >> 31;
- zz_6 += (zz_5 >> 32) + x_5 * x_1;
- zz_7 += (zz_6 >> 32) + x_5 * x_2;
- zz_8 += (zz_7 >> 32) + x_5 * x_3;
- zz_9 += (zz_8 >> 32) + x_5 * x_4;
- zz_10 += zz_9 >> 32;
- }
-
- w = (uint)zz_6;
- zz[6] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_7;
- zz[7] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_8;
- zz[8] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_9;
- zz[9] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_10;
- zz[10] = (w << 1) | c;
- c = w >> 31;
- w = zz[11] + (uint)(zz_10 >> 32);
- zz[11] = (w << 1) | c;
- }
-
- public static void Square(uint[] x, int xOff, uint[] zz, int zzOff)
- {
- ulong x_0 = x[xOff + 0];
- ulong zz_1;
-
- uint c = 0, w;
- {
- int i = 5, j = 12;
- do
- {
- ulong xVal = x[xOff + i--];
- ulong p = xVal * xVal;
- zz[zzOff + --j] = (c << 31) | (uint)(p >> 33);
- zz[zzOff + --j] = (uint)(p >> 1);
- c = (uint)p;
- }
- while (i > 0);
-
- {
- ulong p = x_0 * x_0;
- zz_1 = (ulong)(c << 31) | (p >> 33);
- zz[zzOff + 0] = (uint)p;
- c = (uint)(p >> 32) & 1;
- }
- }
-
- ulong x_1 = x[xOff + 1];
- ulong zz_2 = zz[zzOff + 2];
-
- {
- zz_1 += x_1 * x_0;
- w = (uint)zz_1;
- zz[zzOff + 1] = (w << 1) | c;
- c = w >> 31;
- zz_2 += zz_1 >> 32;
- }
-
- ulong x_2 = x[xOff + 2];
- ulong zz_3 = zz[zzOff + 3];
- ulong zz_4 = zz[zzOff + 4];
- {
- zz_2 += x_2 * x_0;
- w = (uint)zz_2;
- zz[zzOff + 2] = (w << 1) | c;
- c = w >> 31;
- zz_3 += (zz_2 >> 32) + x_2 * x_1;
- zz_4 += zz_3 >> 32;
- zz_3 &= M;
- }
-
- ulong x_3 = x[xOff + 3];
- ulong zz_5 = zz[zzOff + 5] + (zz_4 >> 32); zz_4 &= M;
- ulong zz_6 = zz[zzOff + 6] + (zz_5 >> 32); zz_5 &= M;
- {
- zz_3 += x_3 * x_0;
- w = (uint)zz_3;
- zz[zzOff + 3] = (w << 1) | c;
- c = w >> 31;
- zz_4 += (zz_3 >> 32) + x_3 * x_1;
- zz_5 += (zz_4 >> 32) + x_3 * x_2;
- zz_4 &= M;
- zz_6 += zz_5 >> 32;
- zz_5 &= M;
- }
-
- ulong x_4 = x[xOff + 4];
- ulong zz_7 = zz[zzOff + 7] + (zz_6 >> 32); zz_6 &= M;
- ulong zz_8 = zz[zzOff + 8] + (zz_7 >> 32); zz_7 &= M;
- {
- zz_4 += x_4 * x_0;
- w = (uint)zz_4;
- zz[zzOff + 4] = (w << 1) | c;
- c = w >> 31;
- zz_5 += (zz_4 >> 32) + x_4 * x_1;
- zz_6 += (zz_5 >> 32) + x_4 * x_2;
- zz_5 &= M;
- zz_7 += (zz_6 >> 32) + x_4 * x_3;
- zz_6 &= M;
- zz_8 += zz_7 >> 32;
- zz_7 &= M;
- }
-
- ulong x_5 = x[xOff + 5];
- ulong zz_9 = zz[zzOff + 9] + (zz_8 >> 32); zz_8 &= M;
- ulong zz_10 = zz[zzOff + 10] + (zz_9 >> 32); zz_9 &= M;
- {
- zz_5 += x_5 * x_0;
- w = (uint)zz_5;
- zz[zzOff + 5] = (w << 1) | c;
- c = w >> 31;
- zz_6 += (zz_5 >> 32) + x_5 * x_1;
- zz_7 += (zz_6 >> 32) + x_5 * x_2;
- zz_8 += (zz_7 >> 32) + x_5 * x_3;
- zz_9 += (zz_8 >> 32) + x_5 * x_4;
- zz_10 += zz_9 >> 32;
- }
-
- w = (uint)zz_6;
- zz[zzOff + 6] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_7;
- zz[zzOff + 7] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_8;
- zz[zzOff + 8] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_9;
- zz[zzOff + 9] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_10;
- zz[zzOff + 10] = (w << 1) | c;
- c = w >> 31;
- w = zz[zzOff + 11] + (uint)(zz_10 >> 32);
- zz[zzOff + 11] = (w << 1) | c;
- }
-
- public static int Sub(uint[] x, uint[] y, uint[] z)
- {
- long c = 0;
- c += (long)x[0] - y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)x[1] - y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)x[2] - y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)x[3] - y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (long)x[4] - y[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)x[5] - y[5];
- z[5] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int Sub(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- long c = 0;
- c += (long)x[xOff + 0] - y[yOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 1] - y[yOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 2] - y[yOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 3] - y[yOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 4] - y[yOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 5] - y[yOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubBothFrom(uint[] x, uint[] y, uint[] z)
- {
- long c = 0;
- c += (long)z[0] - x[0] - y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - x[1] - y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2] - x[2] - y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)z[3] - x[3] - y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (long)z[4] - x[4] - y[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)z[5] - x[5] - y[5];
- z[5] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubFrom(uint[] x, uint[] z)
- {
- long c = 0;
- c += (long)z[0] - x[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - x[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2] - x[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)z[3] - x[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (long)z[4] - x[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)z[5] - x[5];
- z[5] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubFrom(uint[] x, int xOff, uint[] z, int zOff)
- {
- long c = 0;
- c += (long)z[zOff + 0] - x[xOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 1] - x[xOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 2] - x[xOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 3] - x[xOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 4] - x[xOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 5] - x[xOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static BigInteger ToBigInteger(uint[] x)
- {
- byte[] bs = new byte[24];
- for (int i = 0; i < 6; ++i)
- {
- uint x_i = x[i];
- if (x_i != 0)
- {
- Pack.UInt32_To_BE(x_i, bs, (5 - i) << 2);
- }
- }
- return new BigInteger(1, bs);
- }
-
- public static BigInteger ToBigInteger64(ulong[] x)
- {
- byte[] bs = new byte[24];
- for (int i = 0; i < 3; ++i)
- {
- ulong x_i = x[i];
- if (x_i != 0L)
- {
- Pack.UInt64_To_BE(x_i, bs, (2 - i) << 3);
- }
- }
- return new BigInteger(1, bs);
- }
-
- public static void Zero(uint[] z)
- {
- z[0] = 0;
- z[1] = 0;
- z[2] = 0;
- z[3] = 0;
- z[4] = 0;
- z[5] = 0;
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Nat224.cs b/BCCrypto/src/math/raw/Nat224.cs
deleted file mode 100644
index 978caf2..0000000
--- a/BCCrypto/src/math/raw/Nat224.cs
+++ /dev/null
@@ -1,1176 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Nat224
- {
- private const ulong M = 0xFFFFFFFFUL;
-
- public static uint Add(uint[] x, uint[] y, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (ulong)x[4] + y[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (ulong)x[5] + y[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (ulong)x[6] + y[6];
- z[6] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint Add(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- ulong c = 0;
- c += (ulong)x[xOff + 0] + y[yOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 1] + y[yOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 2] + y[yOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 3] + y[yOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 4] + y[yOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 5] + y[yOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 6] + y[yOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddBothTo(uint[] x, uint[] y, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + y[0] + z[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + y[1] + z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + y[2] + z[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + y[3] + z[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (ulong)x[4] + y[4] + z[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (ulong)x[5] + y[5] + z[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (ulong)x[6] + y[6] + z[6];
- z[6] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddBothTo(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- ulong c = 0;
- c += (ulong)x[xOff + 0] + y[yOff + 0] + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 1] + y[yOff + 1] + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 2] + y[yOff + 2] + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 3] + y[yOff + 3] + z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 4] + y[yOff + 4] + z[zOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 5] + y[yOff + 5] + z[zOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 6] + y[yOff + 6] + z[zOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddTo(uint[] x, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + z[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + z[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + z[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (ulong)x[4] + z[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (ulong)x[5] + z[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (ulong)x[6] + z[6];
- z[6] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddTo(uint[] x, int xOff, uint[] z, int zOff, uint cIn)
- {
- ulong c = cIn;
- c += (ulong)x[xOff + 0] + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 1] + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 2] + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 3] + z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 4] + z[zOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 5] + z[zOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 6] + z[zOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddToEachOther(uint[] u, int uOff, uint[] v, int vOff)
- {
- ulong c = 0;
- c += (ulong)u[uOff + 0] + v[vOff + 0];
- u[uOff + 0] = (uint)c;
- v[vOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 1] + v[vOff + 1];
- u[uOff + 1] = (uint)c;
- v[vOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 2] + v[vOff + 2];
- u[uOff + 2] = (uint)c;
- v[vOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 3] + v[vOff + 3];
- u[uOff + 3] = (uint)c;
- v[vOff + 3] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 4] + v[vOff + 4];
- u[uOff + 4] = (uint)c;
- v[vOff + 4] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 5] + v[vOff + 5];
- u[uOff + 5] = (uint)c;
- v[vOff + 5] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 6] + v[vOff + 6];
- u[uOff + 6] = (uint)c;
- v[vOff + 6] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static void Copy(uint[] x, uint[] z)
- {
- z[0] = x[0];
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- z[4] = x[4];
- z[5] = x[5];
- z[6] = x[6];
- }
-
- public static uint[] Create()
- {
- return new uint[7];
- }
-
- public static uint[] CreateExt()
- {
- return new uint[14];
- }
-
- public static bool Diff(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- bool pos = Gte(x, xOff, y, yOff);
- if (pos)
- {
- Sub(x, xOff, y, yOff, z, zOff);
- }
- else
- {
- Sub(y, yOff, x, xOff, z, zOff);
- }
- return pos;
- }
-
- public static bool Eq(uint[] x, uint[] y)
- {
- for (int i = 6; i >= 0; --i)
- {
- if (x[i] != y[i])
- return false;
- }
- return true;
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 224)
- throw new ArgumentException();
-
- uint[] z = Create();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (uint)x.IntValue;
- x = x.ShiftRight(32);
- }
- return z;
- }
-
- public static uint GetBit(uint[] x, int bit)
- {
- if (bit == 0)
- {
- return x[0] & 1;
- }
- int w = bit >> 5;
- if (w < 0 || w >= 7)
- {
- return 0;
- }
- int b = bit & 31;
- return (x[w] >> b) & 1;
- }
-
- public static bool Gte(uint[] x, uint[] y)
- {
- for (int i = 6; i >= 0; --i)
- {
- uint x_i = x[i], y_i = y[i];
- if (x_i < y_i)
- return false;
- if (x_i > y_i)
- return true;
- }
- return true;
- }
-
- public static bool Gte(uint[] x, int xOff, uint[] y, int yOff)
- {
- for (int i = 6; i >= 0; --i)
- {
- uint x_i = x[xOff + i], y_i = y[yOff + i];
- if (x_i < y_i)
- return false;
- if (x_i > y_i)
- return true;
- }
- return true;
- }
-
- public static bool IsOne(uint[] x)
- {
- if (x[0] != 1)
- {
- return false;
- }
- for (int i = 1; i < 7; ++i)
- {
- if (x[i] != 0)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsZero(uint[] x)
- {
- for (int i = 0; i < 7; ++i)
- {
- if (x[i] != 0)
- {
- return false;
- }
- }
- return true;
- }
-
- public static void Mul(uint[] x, uint[] y, uint[] zz)
- {
- ulong y_0 = y[0];
- ulong y_1 = y[1];
- ulong y_2 = y[2];
- ulong y_3 = y[3];
- ulong y_4 = y[4];
- ulong y_5 = y[5];
- ulong y_6 = y[6];
-
- {
- ulong c = 0, x_0 = x[0];
- c += x_0 * y_0;
- zz[0] = (uint)c;
- c >>= 32;
- c += x_0 * y_1;
- zz[1] = (uint)c;
- c >>= 32;
- c += x_0 * y_2;
- zz[2] = (uint)c;
- c >>= 32;
- c += x_0 * y_3;
- zz[3] = (uint)c;
- c >>= 32;
- c += x_0 * y_4;
- zz[4] = (uint)c;
- c >>= 32;
- c += x_0 * y_5;
- zz[5] = (uint)c;
- c >>= 32;
- c += x_0 * y_6;
- zz[6] = (uint)c;
- c >>= 32;
- zz[7] = (uint)c;
- }
-
- for (int i = 1; i < 7; ++i)
- {
- ulong c = 0, x_i = x[i];
- c += x_i * y_0 + zz[i + 0];
- zz[i + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[i + 1];
- zz[i + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[i + 2];
- zz[i + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[i + 3];
- zz[i + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[i + 4];
- zz[i + 4] = (uint)c;
- c >>= 32;
- c += x_i * y_5 + zz[i + 5];
- zz[i + 5] = (uint)c;
- c >>= 32;
- c += x_i * y_6 + zz[i + 6];
- zz[i + 6] = (uint)c;
- c >>= 32;
- zz[i + 7] = (uint)c;
- }
- }
-
- public static void Mul(uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff)
- {
- ulong y_0 = y[yOff + 0];
- ulong y_1 = y[yOff + 1];
- ulong y_2 = y[yOff + 2];
- ulong y_3 = y[yOff + 3];
- ulong y_4 = y[yOff + 4];
- ulong y_5 = y[yOff + 5];
- ulong y_6 = y[yOff + 6];
-
- {
- ulong c = 0, x_0 = x[xOff + 0];
- c += x_0 * y_0;
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_0 * y_1;
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_0 * y_2;
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_0 * y_3;
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += x_0 * y_4;
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- c += x_0 * y_5;
- zz[zzOff + 5] = (uint)c;
- c >>= 32;
- c += x_0 * y_6;
- zz[zzOff + 6] = (uint)c;
- c >>= 32;
- zz[zzOff + 7] = (uint)c;
- }
-
- for (int i = 1; i < 7; ++i)
- {
- ++zzOff;
- ulong c = 0, x_i = x[xOff + i];
- c += x_i * y_0 + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[zzOff + 4];
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- c += x_i * y_5 + zz[zzOff + 5];
- zz[zzOff + 5] = (uint)c;
- c >>= 32;
- c += x_i * y_6 + zz[zzOff + 6];
- zz[zzOff + 6] = (uint)c;
- c >>= 32;
- zz[zzOff + 7] = (uint)c;
- }
- }
-
- public static uint MulAddTo(uint[] x, uint[] y, uint[] zz)
- {
- ulong y_0 = y[0];
- ulong y_1 = y[1];
- ulong y_2 = y[2];
- ulong y_3 = y[3];
- ulong y_4 = y[4];
- ulong y_5 = y[5];
- ulong y_6 = y[6];
-
- ulong zc = 0;
- for (int i = 0; i < 7; ++i)
- {
- ulong c = 0, x_i = x[i];
- c += x_i * y_0 + zz[i + 0];
- zz[i + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[i + 1];
- zz[i + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[i + 2];
- zz[i + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[i + 3];
- zz[i + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[i + 4];
- zz[i + 4] = (uint)c;
- c >>= 32;
- c += x_i * y_5 + zz[i + 5];
- zz[i + 5] = (uint)c;
- c >>= 32;
- c += x_i * y_6 + zz[i + 6];
- zz[i + 6] = (uint)c;
- c >>= 32;
- c += zc + zz[i + 7];
- zz[i + 7] = (uint)c;
- zc = c >> 32;
- }
- return (uint)zc;
- }
-
- public static uint MulAddTo(uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff)
- {
- ulong y_0 = y[yOff + 0];
- ulong y_1 = y[yOff + 1];
- ulong y_2 = y[yOff + 2];
- ulong y_3 = y[yOff + 3];
- ulong y_4 = y[yOff + 4];
- ulong y_5 = y[yOff + 5];
- ulong y_6 = y[yOff + 6];
-
- ulong zc = 0;
- for (int i = 0; i < 7; ++i)
- {
- ulong c = 0, x_i = x[xOff + i];
- c += x_i * y_0 + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[zzOff + 4];
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- c += x_i * y_5 + zz[zzOff + 5];
- zz[zzOff + 5] = (uint)c;
- c >>= 32;
- c += x_i * y_6 + zz[zzOff + 6];
- zz[zzOff + 6] = (uint)c;
- c >>= 32;
- c += zc + zz[zzOff + 7];
- zz[zzOff + 7] = (uint)c;
- zc = c >> 32;
- ++zzOff;
- }
- return (uint)zc;
- }
-
- public static ulong Mul33Add(uint w, uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- Debug.Assert(w >> 31 == 0);
-
- ulong c = 0, wVal = w;
- ulong x0 = x[xOff + 0];
- c += wVal * x0 + y[yOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- ulong x1 = x[xOff + 1];
- c += wVal * x1 + x0 + y[yOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- ulong x2 = x[xOff + 2];
- c += wVal * x2 + x1 + y[yOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- ulong x3 = x[xOff + 3];
- c += wVal * x3 + x2 + y[yOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- ulong x4 = x[xOff + 4];
- c += wVal * x4 + x3 + y[yOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- ulong x5 = x[xOff + 5];
- c += wVal * x5 + x4 + y[yOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- ulong x6 = x[xOff + 6];
- c += wVal * x6 + x5 + y[yOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- c += x6;
- return c;
- }
-
- public static uint MulByWord(uint x, uint[] z)
- {
- ulong c = 0, xVal = x;
- c += xVal * (ulong)z[0];
- z[0] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[2];
- z[2] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[3];
- z[3] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[4];
- z[4] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[5];
- z[5] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[6];
- z[6] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint MulByWordAddTo(uint x, uint[] y, uint[] z)
- {
- ulong c = 0, xVal = x;
- c += xVal * (ulong)z[0] + y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[1] + y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[2] + y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[3] + y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[4] + y[4];
- z[4] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[5] + y[5];
- z[5] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[6] + y[6];
- z[6] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint MulWordAddTo(uint x, uint[] y, int yOff, uint[] z, int zOff)
- {
- ulong c = 0, xVal = x;
- c += xVal * y[yOff + 0] + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 1] + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 2] + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 3] + z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 4] + z[zOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 5] + z[zOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 6] + z[zOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint Mul33DWordAdd(uint x, ulong y, uint[] z, int zOff)
- {
- Debug.Assert(x >> 31 == 0);
- Debug.Assert(zOff <= 3);
- ulong c = 0, xVal = x;
- ulong y00 = y & M;
- c += xVal * y00 + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- ulong y01 = y >> 32;
- c += xVal * y01 + y00 + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += y01 + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(7, z, zOff, 4);
- }
-
- public static uint Mul33WordAdd(uint x, uint y, uint[] z, int zOff)
- {
- Debug.Assert(x >> 31 == 0);
- Debug.Assert(zOff <= 4);
- ulong c = 0, yVal = y;
- c += yVal * x + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += yVal + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(7, z, zOff, 3);
- }
-
- public static uint MulWordDwordAdd(uint x, ulong y, uint[] z, int zOff)
- {
- Debug.Assert(zOff <= 4);
- ulong c = 0, xVal = x;
- c += xVal * y + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += xVal * (y >> 32) + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(7, z, zOff, 3);
- }
-
- public static uint MulWord(uint x, uint[] y, uint[] z, int zOff)
- {
- ulong c = 0, xVal = x;
- int i = 0;
- do
- {
- c += xVal * y[i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- while (++i < 7);
- return (uint)c;
- }
-
- public static void Square(uint[] x, uint[] zz)
- {
- ulong x_0 = x[0];
- ulong zz_1;
-
- uint c = 0, w;
- {
- int i = 6, j = 14;
- do
- {
- ulong xVal = x[i--];
- ulong p = xVal * xVal;
- zz[--j] = (c << 31) | (uint)(p >> 33);
- zz[--j] = (uint)(p >> 1);
- c = (uint)p;
- }
- while (i > 0);
-
- {
- ulong p = x_0 * x_0;
- zz_1 = (ulong)(c << 31) | (p >> 33);
- zz[0] = (uint)p;
- c = (uint)(p >> 32) & 1;
- }
- }
-
- ulong x_1 = x[1];
- ulong zz_2 = zz[2];
-
- {
- zz_1 += x_1 * x_0;
- w = (uint)zz_1;
- zz[1] = (w << 1) | c;
- c = w >> 31;
- zz_2 += zz_1 >> 32;
- }
-
- ulong x_2 = x[2];
- ulong zz_3 = zz[3];
- ulong zz_4 = zz[4];
- {
- zz_2 += x_2 * x_0;
- w = (uint)zz_2;
- zz[2] = (w << 1) | c;
- c = w >> 31;
- zz_3 += (zz_2 >> 32) + x_2 * x_1;
- zz_4 += zz_3 >> 32;
- zz_3 &= M;
- }
-
- ulong x_3 = x[3];
- ulong zz_5 = zz[5] + (zz_4 >> 32); zz_4 &= M;
- ulong zz_6 = zz[6] + (zz_5 >> 32); zz_5 &= M;
- {
- zz_3 += x_3 * x_0;
- w = (uint)zz_3;
- zz[3] = (w << 1) | c;
- c = w >> 31;
- zz_4 += (zz_3 >> 32) + x_3 * x_1;
- zz_5 += (zz_4 >> 32) + x_3 * x_2;
- zz_4 &= M;
- zz_6 += zz_5 >> 32;
- zz_5 &= M;
- }
-
- ulong x_4 = x[4];
- ulong zz_7 = zz[7] + (zz_6 >> 32); zz_6 &= M;
- ulong zz_8 = zz[8] + (zz_7 >> 32); zz_7 &= M;
- {
- zz_4 += x_4 * x_0;
- w = (uint)zz_4;
- zz[4] = (w << 1) | c;
- c = w >> 31;
- zz_5 += (zz_4 >> 32) + x_4 * x_1;
- zz_6 += (zz_5 >> 32) + x_4 * x_2;
- zz_5 &= M;
- zz_7 += (zz_6 >> 32) + x_4 * x_3;
- zz_6 &= M;
- zz_8 += zz_7 >> 32;
- zz_7 &= M;
- }
-
- ulong x_5 = x[5];
- ulong zz_9 = zz[9] + (zz_8 >> 32); zz_8 &= M;
- ulong zz_10 = zz[10] + (zz_9 >> 32); zz_9 &= M;
- {
- zz_5 += x_5 * x_0;
- w = (uint)zz_5;
- zz[5] = (w << 1) | c;
- c = w >> 31;
- zz_6 += (zz_5 >> 32) + x_5 * x_1;
- zz_7 += (zz_6 >> 32) + x_5 * x_2;
- zz_6 &= M;
- zz_8 += (zz_7 >> 32) + x_5 * x_3;
- zz_7 &= M;
- zz_9 += (zz_8 >> 32) + x_5 * x_4;
- zz_8 &= M;
- zz_10 += zz_9 >> 32;
- zz_9 &= M;
- }
-
- ulong x_6 = x[6];
- ulong zz_11 = zz[11] + (zz_10 >> 32); zz_10 &= M;
- ulong zz_12 = zz[12] + (zz_11 >> 32); zz_11 &= M;
- {
- zz_6 += x_6 * x_0;
- w = (uint)zz_6;
- zz[6] = (w << 1) | c;
- c = w >> 31;
- zz_7 += (zz_6 >> 32) + x_6 * x_1;
- zz_8 += (zz_7 >> 32) + x_6 * x_2;
- zz_9 += (zz_8 >> 32) + x_6 * x_3;
- zz_10 += (zz_9 >> 32) + x_6 * x_4;
- zz_11 += (zz_10 >> 32) + x_6 * x_5;
- zz_12 += zz_11 >> 32;
- }
-
- w = (uint)zz_7;
- zz[7] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_8;
- zz[8] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_9;
- zz[9] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_10;
- zz[10] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_11;
- zz[11] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_12;
- zz[12] = (w << 1) | c;
- c = w >> 31;
- w = zz[13] + (uint)(zz_12 >> 32);
- zz[13] = (w << 1) | c;
- }
-
- public static void Square(uint[] x, int xOff, uint[] zz, int zzOff)
- {
- ulong x_0 = x[xOff + 0];
- ulong zz_1;
-
- uint c = 0, w;
- {
- int i = 6, j = 14;
- do
- {
- ulong xVal = x[xOff + i--];
- ulong p = xVal * xVal;
- zz[zzOff + --j] = (c << 31) | (uint)(p >> 33);
- zz[zzOff + --j] = (uint)(p >> 1);
- c = (uint)p;
- }
- while (i > 0);
-
- {
- ulong p = x_0 * x_0;
- zz_1 = (ulong)(c << 31) | (p >> 33);
- zz[zzOff + 0] = (uint)p;
- c = (uint)(p >> 32) & 1;
- }
- }
-
- ulong x_1 = x[xOff + 1];
- ulong zz_2 = zz[zzOff + 2];
-
- {
- zz_1 += x_1 * x_0;
- w = (uint)zz_1;
- zz[zzOff + 1] = (w << 1) | c;
- c = w >> 31;
- zz_2 += zz_1 >> 32;
- }
-
- ulong x_2 = x[xOff + 2];
- ulong zz_3 = zz[zzOff + 3];
- ulong zz_4 = zz[zzOff + 4];
- {
- zz_2 += x_2 * x_0;
- w = (uint)zz_2;
- zz[zzOff + 2] = (w << 1) | c;
- c = w >> 31;
- zz_3 += (zz_2 >> 32) + x_2 * x_1;
- zz_4 += zz_3 >> 32;
- zz_3 &= M;
- }
-
- ulong x_3 = x[xOff + 3];
- ulong zz_5 = zz[zzOff + 5] + (zz_4 >> 32); zz_4 &= M;
- ulong zz_6 = zz[zzOff + 6] + (zz_5 >> 32); zz_5 &= M;
- {
- zz_3 += x_3 * x_0;
- w = (uint)zz_3;
- zz[zzOff + 3] = (w << 1) | c;
- c = w >> 31;
- zz_4 += (zz_3 >> 32) + x_3 * x_1;
- zz_5 += (zz_4 >> 32) + x_3 * x_2;
- zz_4 &= M;
- zz_6 += zz_5 >> 32;
- zz_5 &= M;
- }
-
- ulong x_4 = x[xOff + 4];
- ulong zz_7 = zz[zzOff + 7] + (zz_6 >> 32); zz_6 &= M;
- ulong zz_8 = zz[zzOff + 8] + (zz_7 >> 32); zz_7 &= M;
- {
- zz_4 += x_4 * x_0;
- w = (uint)zz_4;
- zz[zzOff + 4] = (w << 1) | c;
- c = w >> 31;
- zz_5 += (zz_4 >> 32) + x_4 * x_1;
- zz_6 += (zz_5 >> 32) + x_4 * x_2;
- zz_5 &= M;
- zz_7 += (zz_6 >> 32) + x_4 * x_3;
- zz_6 &= M;
- zz_8 += zz_7 >> 32;
- zz_7 &= M;
- }
-
- ulong x_5 = x[xOff + 5];
- ulong zz_9 = zz[zzOff + 9] + (zz_8 >> 32); zz_8 &= M;
- ulong zz_10 = zz[zzOff + 10] + (zz_9 >> 32); zz_9 &= M;
- {
- zz_5 += x_5 * x_0;
- w = (uint)zz_5;
- zz[zzOff + 5] = (w << 1) | c;
- c = w >> 31;
- zz_6 += (zz_5 >> 32) + x_5 * x_1;
- zz_7 += (zz_6 >> 32) + x_5 * x_2;
- zz_6 &= M;
- zz_8 += (zz_7 >> 32) + x_5 * x_3;
- zz_7 &= M;
- zz_9 += (zz_8 >> 32) + x_5 * x_4;
- zz_8 &= M;
- zz_10 += zz_9 >> 32;
- zz_9 &= M;
- }
-
- ulong x_6 = x[xOff + 6];
- ulong zz_11 = zz[zzOff + 11] + (zz_10 >> 32); zz_10 &= M;
- ulong zz_12 = zz[zzOff + 12] + (zz_11 >> 32); zz_11 &= M;
- {
- zz_6 += x_6 * x_0;
- w = (uint)zz_6;
- zz[zzOff + 6] = (w << 1) | c;
- c = w >> 31;
- zz_7 += (zz_6 >> 32) + x_6 * x_1;
- zz_8 += (zz_7 >> 32) + x_6 * x_2;
- zz_9 += (zz_8 >> 32) + x_6 * x_3;
- zz_10 += (zz_9 >> 32) + x_6 * x_4;
- zz_11 += (zz_10 >> 32) + x_6 * x_5;
- zz_12 += zz_11 >> 32;
- }
-
- w = (uint)zz_7;
- zz[zzOff + 7] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_8;
- zz[zzOff + 8] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_9;
- zz[zzOff + 9] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_10;
- zz[zzOff + 10] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_11;
- zz[zzOff + 11] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_12;
- zz[zzOff + 12] = (w << 1) | c;
- c = w >> 31;
- w = zz[zzOff + 13] + (uint)(zz_12 >> 32);
- zz[zzOff + 13] = (w << 1) | c;
- }
-
- public static int Sub(uint[] x, uint[] y, uint[] z)
- {
- long c = 0;
- c += (long)x[0] - y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)x[1] - y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)x[2] - y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)x[3] - y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (long)x[4] - y[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)x[5] - y[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (long)x[6] - y[6];
- z[6] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int Sub(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- long c = 0;
- c += (long)x[xOff + 0] - y[yOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 1] - y[yOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 2] - y[yOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 3] - y[yOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 4] - y[yOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 5] - y[yOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 6] - y[yOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubBothFrom(uint[] x, uint[] y, uint[] z)
- {
- long c = 0;
- c += (long)z[0] - x[0] - y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - x[1] - y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2] - x[2] - y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)z[3] - x[3] - y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (long)z[4] - x[4] - y[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)z[5] - x[5] - y[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (long)z[6] - x[6] - y[6];
- z[6] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubFrom(uint[] x, uint[] z)
- {
- long c = 0;
- c += (long)z[0] - x[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - x[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2] - x[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)z[3] - x[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (long)z[4] - x[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)z[5] - x[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (long)z[6] - x[6];
- z[6] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubFrom(uint[] x, int xOff, uint[] z, int zOff)
- {
- long c = 0;
- c += (long)z[zOff + 0] - x[xOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 1] - x[xOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 2] - x[xOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 3] - x[xOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 4] - x[xOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 5] - x[xOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 6] - x[xOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static BigInteger ToBigInteger(uint[] x)
- {
- byte[] bs = new byte[28];
- for (int i = 0; i < 7; ++i)
- {
- uint x_i = x[i];
- if (x_i != 0)
- {
- Pack.UInt32_To_BE(x_i, bs, (6 - i) << 2);
- }
- }
- return new BigInteger(1, bs);
- }
-
- public static void Zero(uint[] z)
- {
- z[0] = 0;
- z[1] = 0;
- z[2] = 0;
- z[3] = 0;
- z[4] = 0;
- z[5] = 0;
- z[6] = 0;
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Nat256.cs b/BCCrypto/src/math/raw/Nat256.cs
deleted file mode 100644
index 09c751a..0000000
--- a/BCCrypto/src/math/raw/Nat256.cs
+++ /dev/null
@@ -1,1387 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Nat256
- {
- private const ulong M = 0xFFFFFFFFUL;
-
- public static uint Add(uint[] x, uint[] y, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (ulong)x[4] + y[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (ulong)x[5] + y[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (ulong)x[6] + y[6];
- z[6] = (uint)c;
- c >>= 32;
- c += (ulong)x[7] + y[7];
- z[7] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint Add(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- ulong c = 0;
- c += (ulong)x[xOff + 0] + y[yOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 1] + y[yOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 2] + y[yOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 3] + y[yOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 4] + y[yOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 5] + y[yOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 6] + y[yOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 7] + y[yOff + 7];
- z[zOff + 7] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddBothTo(uint[] x, uint[] y, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + y[0] + z[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + y[1] + z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + y[2] + z[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + y[3] + z[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (ulong)x[4] + y[4] + z[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (ulong)x[5] + y[5] + z[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (ulong)x[6] + y[6] + z[6];
- z[6] = (uint)c;
- c >>= 32;
- c += (ulong)x[7] + y[7] + z[7];
- z[7] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddBothTo(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- ulong c = 0;
- c += (ulong)x[xOff + 0] + y[yOff + 0] + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 1] + y[yOff + 1] + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 2] + y[yOff + 2] + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 3] + y[yOff + 3] + z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 4] + y[yOff + 4] + z[zOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 5] + y[yOff + 5] + z[zOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 6] + y[yOff + 6] + z[zOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 7] + y[yOff + 7] + z[zOff + 7];
- z[zOff + 7] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddTo(uint[] x, uint[] z)
- {
- ulong c = 0;
- c += (ulong)x[0] + z[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (ulong)x[1] + z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (ulong)x[2] + z[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (ulong)x[3] + z[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (ulong)x[4] + z[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (ulong)x[5] + z[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (ulong)x[6] + z[6];
- z[6] = (uint)c;
- c >>= 32;
- c += (ulong)x[7] + z[7];
- z[7] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddTo(uint[] x, int xOff, uint[] z, int zOff, uint cIn)
- {
- ulong c = cIn;
- c += (ulong)x[xOff + 0] + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 1] + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 2] + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 3] + z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 4] + z[zOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 5] + z[zOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 6] + z[zOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- c += (ulong)x[xOff + 7] + z[zOff + 7];
- z[zOff + 7] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint AddToEachOther(uint[] u, int uOff, uint[] v, int vOff)
- {
- ulong c = 0;
- c += (ulong)u[uOff + 0] + v[vOff + 0];
- u[uOff + 0] = (uint)c;
- v[vOff + 0] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 1] + v[vOff + 1];
- u[uOff + 1] = (uint)c;
- v[vOff + 1] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 2] + v[vOff + 2];
- u[uOff + 2] = (uint)c;
- v[vOff + 2] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 3] + v[vOff + 3];
- u[uOff + 3] = (uint)c;
- v[vOff + 3] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 4] + v[vOff + 4];
- u[uOff + 4] = (uint)c;
- v[vOff + 4] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 5] + v[vOff + 5];
- u[uOff + 5] = (uint)c;
- v[vOff + 5] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 6] + v[vOff + 6];
- u[uOff + 6] = (uint)c;
- v[vOff + 6] = (uint)c;
- c >>= 32;
- c += (ulong)u[uOff + 7] + v[vOff + 7];
- u[uOff + 7] = (uint)c;
- v[vOff + 7] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static void Copy(uint[] x, uint[] z)
- {
- z[0] = x[0];
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- z[4] = x[4];
- z[5] = x[5];
- z[6] = x[6];
- z[7] = x[7];
- }
-
- public static void Copy64(ulong[] x, ulong[] z)
- {
- z[0] = x[0];
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- }
-
- public static uint[] Create()
- {
- return new uint[8];
- }
-
- public static ulong[] Create64()
- {
- return new ulong[4];
- }
-
- public static uint[] CreateExt()
- {
- return new uint[16];
- }
-
- public static ulong[] CreateExt64()
- {
- return new ulong[8];
- }
-
- public static bool Diff(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- bool pos = Gte(x, xOff, y, yOff);
- if (pos)
- {
- Sub(x, xOff, y, yOff, z, zOff);
- }
- else
- {
- Sub(y, yOff, x, xOff, z, zOff);
- }
- return pos;
- }
-
- public static bool Eq(uint[] x, uint[] y)
- {
- for (int i = 7; i >= 0; --i)
- {
- if (x[i] != y[i])
- return false;
- }
- return true;
- }
-
- public static bool Eq64(ulong[] x, ulong[] y)
- {
- for (int i = 3; i >= 0; --i)
- {
- if (x[i] != y[i])
- {
- return false;
- }
- }
- return true;
- }
-
- public static uint[] FromBigInteger(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 256)
- throw new ArgumentException();
-
- uint[] z = Create();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (uint)x.IntValue;
- x = x.ShiftRight(32);
- }
- return z;
- }
-
- public static ulong[] FromBigInteger64(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 256)
- throw new ArgumentException();
-
- ulong[] z = Create64();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (ulong)x.LongValue;
- x = x.ShiftRight(64);
- }
- return z;
- }
-
- public static uint GetBit(uint[] x, int bit)
- {
- if (bit == 0)
- {
- return x[0] & 1;
- }
- if ((bit & 255) != bit)
- {
- return 0;
- }
- int w = bit >> 5;
- int b = bit & 31;
- return (x[w] >> b) & 1;
- }
-
- public static bool Gte(uint[] x, uint[] y)
- {
- for (int i = 7; i >= 0; --i)
- {
- uint x_i = x[i], y_i = y[i];
- if (x_i < y_i)
- return false;
- if (x_i > y_i)
- return true;
- }
- return true;
- }
-
- public static bool Gte(uint[] x, int xOff, uint[] y, int yOff)
- {
- for (int i = 7; i >= 0; --i)
- {
- uint x_i = x[xOff + i], y_i = y[yOff + i];
- if (x_i < y_i)
- return false;
- if (x_i > y_i)
- return true;
- }
- return true;
- }
-
- public static bool IsOne(uint[] x)
- {
- if (x[0] != 1)
- {
- return false;
- }
- for (int i = 1; i < 8; ++i)
- {
- if (x[i] != 0)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsOne64(ulong[] x)
- {
- if (x[0] != 1UL)
- {
- return false;
- }
- for (int i = 1; i < 4; ++i)
- {
- if (x[i] != 0UL)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsZero(uint[] x)
- {
- for (int i = 0; i < 8; ++i)
- {
- if (x[i] != 0)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsZero64(ulong[] x)
- {
- for (int i = 0; i < 4; ++i)
- {
- if (x[i] != 0UL)
- {
- return false;
- }
- }
- return true;
- }
-
- public static void Mul(uint[] x, uint[] y, uint[] zz)
- {
- ulong y_0 = y[0];
- ulong y_1 = y[1];
- ulong y_2 = y[2];
- ulong y_3 = y[3];
- ulong y_4 = y[4];
- ulong y_5 = y[5];
- ulong y_6 = y[6];
- ulong y_7 = y[7];
-
- {
- ulong c = 0, x_0 = x[0];
- c += x_0 * y_0;
- zz[0] = (uint)c;
- c >>= 32;
- c += x_0 * y_1;
- zz[1] = (uint)c;
- c >>= 32;
- c += x_0 * y_2;
- zz[2] = (uint)c;
- c >>= 32;
- c += x_0 * y_3;
- zz[3] = (uint)c;
- c >>= 32;
- c += x_0 * y_4;
- zz[4] = (uint)c;
- c >>= 32;
- c += x_0 * y_5;
- zz[5] = (uint)c;
- c >>= 32;
- c += x_0 * y_6;
- zz[6] = (uint)c;
- c >>= 32;
- c += x_0 * y_7;
- zz[7] = (uint)c;
- c >>= 32;
- zz[8] = (uint)c;
- }
-
- for (int i = 1; i < 8; ++i)
- {
- ulong c = 0, x_i = x[i];
- c += x_i * y_0 + zz[i + 0];
- zz[i + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[i + 1];
- zz[i + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[i + 2];
- zz[i + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[i + 3];
- zz[i + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[i + 4];
- zz[i + 4] = (uint)c;
- c >>= 32;
- c += x_i * y_5 + zz[i + 5];
- zz[i + 5] = (uint)c;
- c >>= 32;
- c += x_i * y_6 + zz[i + 6];
- zz[i + 6] = (uint)c;
- c >>= 32;
- c += x_i * y_7 + zz[i + 7];
- zz[i + 7] = (uint)c;
- c >>= 32;
- zz[i + 8] = (uint)c;
- }
- }
-
- public static void Mul(uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff)
- {
- ulong y_0 = y[yOff + 0];
- ulong y_1 = y[yOff + 1];
- ulong y_2 = y[yOff + 2];
- ulong y_3 = y[yOff + 3];
- ulong y_4 = y[yOff + 4];
- ulong y_5 = y[yOff + 5];
- ulong y_6 = y[yOff + 6];
- ulong y_7 = y[yOff + 7];
-
- {
- ulong c = 0, x_0 = x[xOff + 0];
- c += x_0 * y_0;
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_0 * y_1;
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_0 * y_2;
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_0 * y_3;
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += x_0 * y_4;
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- c += x_0 * y_5;
- zz[zzOff + 5] = (uint)c;
- c >>= 32;
- c += x_0 * y_6;
- zz[zzOff + 6] = (uint)c;
- c >>= 32;
- c += x_0 * y_7;
- zz[zzOff + 7] = (uint)c;
- c >>= 32;
- zz[zzOff + 8] = (uint)c;
- }
-
- for (int i = 1; i < 8; ++i)
- {
- ++zzOff;
- ulong c = 0, x_i = x[xOff + i];
- c += x_i * y_0 + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[zzOff + 4];
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- c += x_i * y_5 + zz[zzOff + 5];
- zz[zzOff + 5] = (uint)c;
- c >>= 32;
- c += x_i * y_6 + zz[zzOff + 6];
- zz[zzOff + 6] = (uint)c;
- c >>= 32;
- c += x_i * y_7 + zz[zzOff + 7];
- zz[zzOff + 7] = (uint)c;
- c >>= 32;
- zz[zzOff + 8] = (uint)c;
- }
- }
-
- public static uint MulAddTo(uint[] x, uint[] y, uint[] zz)
- {
- ulong y_0 = y[0];
- ulong y_1 = y[1];
- ulong y_2 = y[2];
- ulong y_3 = y[3];
- ulong y_4 = y[4];
- ulong y_5 = y[5];
- ulong y_6 = y[6];
- ulong y_7 = y[7];
-
- ulong zc = 0;
- for (int i = 0; i < 8; ++i)
- {
- ulong c = 0, x_i = x[i];
- c += x_i * y_0 + zz[i + 0];
- zz[i + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[i + 1];
- zz[i + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[i + 2];
- zz[i + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[i + 3];
- zz[i + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[i + 4];
- zz[i + 4] = (uint)c;
- c >>= 32;
- c += x_i * y_5 + zz[i + 5];
- zz[i + 5] = (uint)c;
- c >>= 32;
- c += x_i * y_6 + zz[i + 6];
- zz[i + 6] = (uint)c;
- c >>= 32;
- c += x_i * y_7 + zz[i + 7];
- zz[i + 7] = (uint)c;
- c >>= 32;
- c += zc + zz[i + 8];
- zz[i + 8] = (uint)c;
- zc = c >> 32;
- }
- return (uint)zc;
- }
-
- public static uint MulAddTo(uint[] x, int xOff, uint[] y, int yOff, uint[] zz, int zzOff)
- {
- ulong y_0 = y[yOff + 0];
- ulong y_1 = y[yOff + 1];
- ulong y_2 = y[yOff + 2];
- ulong y_3 = y[yOff + 3];
- ulong y_4 = y[yOff + 4];
- ulong y_5 = y[yOff + 5];
- ulong y_6 = y[yOff + 6];
- ulong y_7 = y[yOff + 7];
-
- ulong zc = 0;
- for (int i = 0; i < 8; ++i)
- {
- ulong c = 0, x_i = x[xOff + i];
- c += x_i * y_0 + zz[zzOff + 0];
- zz[zzOff + 0] = (uint)c;
- c >>= 32;
- c += x_i * y_1 + zz[zzOff + 1];
- zz[zzOff + 1] = (uint)c;
- c >>= 32;
- c += x_i * y_2 + zz[zzOff + 2];
- zz[zzOff + 2] = (uint)c;
- c >>= 32;
- c += x_i * y_3 + zz[zzOff + 3];
- zz[zzOff + 3] = (uint)c;
- c >>= 32;
- c += x_i * y_4 + zz[zzOff + 4];
- zz[zzOff + 4] = (uint)c;
- c >>= 32;
- c += x_i * y_5 + zz[zzOff + 5];
- zz[zzOff + 5] = (uint)c;
- c >>= 32;
- c += x_i * y_6 + zz[zzOff + 6];
- zz[zzOff + 6] = (uint)c;
- c >>= 32;
- c += x_i * y_7 + zz[zzOff + 7];
- zz[zzOff + 7] = (uint)c;
- c >>= 32;
- c += zc + zz[zzOff + 8];
- zz[zzOff + 8] = (uint)c;
- zc = c >> 32;
- ++zzOff;
- }
- return (uint)zc;
- }
-
- public static ulong Mul33Add(uint w, uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- Debug.Assert(w >> 31 == 0);
-
- ulong c = 0, wVal = w;
- ulong x0 = x[xOff + 0];
- c += wVal * x0 + y[yOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- ulong x1 = x[xOff + 1];
- c += wVal * x1 + x0 + y[yOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- ulong x2 = x[xOff + 2];
- c += wVal * x2 + x1 + y[yOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- ulong x3 = x[xOff + 3];
- c += wVal * x3 + x2 + y[yOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- ulong x4 = x[xOff + 4];
- c += wVal * x4 + x3 + y[yOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- ulong x5 = x[xOff + 5];
- c += wVal * x5 + x4 + y[yOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- ulong x6 = x[xOff + 6];
- c += wVal * x6 + x5 + y[yOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- ulong x7 = x[xOff + 7];
- c += wVal * x7 + x6 + y[yOff + 7];
- z[zOff + 7] = (uint)c;
- c >>= 32;
- c += x7;
- return c;
- }
-
- public static uint MulByWord(uint x, uint[] z)
- {
- ulong c = 0, xVal = x;
- c += xVal * (ulong)z[0];
- z[0] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[1];
- z[1] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[2];
- z[2] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[3];
- z[3] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[4];
- z[4] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[5];
- z[5] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[6];
- z[6] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[7];
- z[7] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint MulByWordAddTo(uint x, uint[] y, uint[] z)
- {
- ulong c = 0, xVal = x;
- c += xVal * (ulong)z[0] + y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[1] + y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[2] + y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[3] + y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[4] + y[4];
- z[4] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[5] + y[5];
- z[5] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[6] + y[6];
- z[6] = (uint)c;
- c >>= 32;
- c += xVal * (ulong)z[7] + y[7];
- z[7] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint MulWordAddTo(uint x, uint[] y, int yOff, uint[] z, int zOff)
- {
- ulong c = 0, xVal = x;
- c += xVal * y[yOff + 0] + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 1] + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 2] + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 3] + z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 4] + z[zOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 5] + z[zOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 6] + z[zOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- c += xVal * y[yOff + 7] + z[zOff + 7];
- z[zOff + 7] = (uint)c;
- c >>= 32;
- return (uint)c;
- }
-
- public static uint Mul33DWordAdd(uint x, ulong y, uint[] z, int zOff)
- {
- Debug.Assert(x >> 31 == 0);
- Debug.Assert(zOff <= 4);
- ulong c = 0, xVal = x;
- ulong y00 = y & M;
- c += xVal * y00 + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- ulong y01 = y >> 32;
- c += xVal * y01 + y00 + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += y01 + z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += z[zOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(8, z, zOff, 4);
- }
-
- public static uint Mul33WordAdd(uint x, uint y, uint[] z, int zOff)
- {
- Debug.Assert(x >> 31 == 0);
- Debug.Assert(zOff <= 5);
- ulong c = 0, yVal = y;
- c += yVal * x + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += yVal + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(8, z, zOff, 3);
- }
-
- public static uint MulWordDwordAdd(uint x, ulong y, uint[] z, int zOff)
- {
- Debug.Assert(zOff <= 5);
- ulong c = 0, xVal = x;
- c += xVal * y + z[zOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += xVal * (y >> 32) + z[zOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += z[zOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- return c == 0 ? 0 : Nat.IncAt(8, z, zOff, 3);
- }
-
- public static uint MulWord(uint x, uint[] y, uint[] z, int zOff)
- {
- ulong c = 0, xVal = x;
- int i = 0;
- do
- {
- c += xVal * y[i];
- z[zOff + i] = (uint)c;
- c >>= 32;
- }
- while (++i < 8);
- return (uint)c;
- }
-
- public static void Square(uint[] x, uint[] zz)
- {
- ulong x_0 = x[0];
- ulong zz_1;
-
- uint c = 0, w;
- {
- int i = 7, j = 16;
- do
- {
- ulong xVal = x[i--];
- ulong p = xVal * xVal;
- zz[--j] = (c << 31) | (uint)(p >> 33);
- zz[--j] = (uint)(p >> 1);
- c = (uint)p;
- }
- while (i > 0);
-
- {
- ulong p = x_0 * x_0;
- zz_1 = (ulong)(c << 31) | (p >> 33);
- zz[0] = (uint)p;
- c = (uint)(p >> 32) & 1;
- }
- }
-
- ulong x_1 = x[1];
- ulong zz_2 = zz[2];
-
- {
- zz_1 += x_1 * x_0;
- w = (uint)zz_1;
- zz[1] = (w << 1) | c;
- c = w >> 31;
- zz_2 += zz_1 >> 32;
- }
-
- ulong x_2 = x[2];
- ulong zz_3 = zz[3];
- ulong zz_4 = zz[4];
- {
- zz_2 += x_2 * x_0;
- w = (uint)zz_2;
- zz[2] = (w << 1) | c;
- c = w >> 31;
- zz_3 += (zz_2 >> 32) + x_2 * x_1;
- zz_4 += zz_3 >> 32;
- zz_3 &= M;
- }
-
- ulong x_3 = x[3];
- ulong zz_5 = zz[5] + (zz_4 >> 32); zz_4 &= M;
- ulong zz_6 = zz[6] + (zz_5 >> 32); zz_5 &= M;
- {
- zz_3 += x_3 * x_0;
- w = (uint)zz_3;
- zz[3] = (w << 1) | c;
- c = w >> 31;
- zz_4 += (zz_3 >> 32) + x_3 * x_1;
- zz_5 += (zz_4 >> 32) + x_3 * x_2;
- zz_4 &= M;
- zz_6 += zz_5 >> 32;
- zz_5 &= M;
- }
-
- ulong x_4 = x[4];
- ulong zz_7 = zz[7] + (zz_6 >> 32); zz_6 &= M;
- ulong zz_8 = zz[8] + (zz_7 >> 32); zz_7 &= M;
- {
- zz_4 += x_4 * x_0;
- w = (uint)zz_4;
- zz[4] = (w << 1) | c;
- c = w >> 31;
- zz_5 += (zz_4 >> 32) + x_4 * x_1;
- zz_6 += (zz_5 >> 32) + x_4 * x_2;
- zz_5 &= M;
- zz_7 += (zz_6 >> 32) + x_4 * x_3;
- zz_6 &= M;
- zz_8 += zz_7 >> 32;
- zz_7 &= M;
- }
-
- ulong x_5 = x[5];
- ulong zz_9 = zz[9] + (zz_8 >> 32); zz_8 &= M;
- ulong zz_10 = zz[10] + (zz_9 >> 32); zz_9 &= M;
- {
- zz_5 += x_5 * x_0;
- w = (uint)zz_5;
- zz[5] = (w << 1) | c;
- c = w >> 31;
- zz_6 += (zz_5 >> 32) + x_5 * x_1;
- zz_7 += (zz_6 >> 32) + x_5 * x_2;
- zz_6 &= M;
- zz_8 += (zz_7 >> 32) + x_5 * x_3;
- zz_7 &= M;
- zz_9 += (zz_8 >> 32) + x_5 * x_4;
- zz_8 &= M;
- zz_10 += zz_9 >> 32;
- zz_9 &= M;
- }
-
- ulong x_6 = x[6];
- ulong zz_11 = zz[11] + (zz_10 >> 32); zz_10 &= M;
- ulong zz_12 = zz[12] + (zz_11 >> 32); zz_11 &= M;
- {
- zz_6 += x_6 * x_0;
- w = (uint)zz_6;
- zz[6] = (w << 1) | c;
- c = w >> 31;
- zz_7 += (zz_6 >> 32) + x_6 * x_1;
- zz_8 += (zz_7 >> 32) + x_6 * x_2;
- zz_7 &= M;
- zz_9 += (zz_8 >> 32) + x_6 * x_3;
- zz_8 &= M;
- zz_10 += (zz_9 >> 32) + x_6 * x_4;
- zz_9 &= M;
- zz_11 += (zz_10 >> 32) + x_6 * x_5;
- zz_10 &= M;
- zz_12 += zz_11 >> 32;
- zz_11 &= M;
- }
-
- ulong x_7 = x[7];
- ulong zz_13 = zz[13] + (zz_12 >> 32); zz_12 &= M;
- ulong zz_14 = zz[14] + (zz_13 >> 32); zz_13 &= M;
- {
- zz_7 += x_7 * x_0;
- w = (uint)zz_7;
- zz[7] = (w << 1) | c;
- c = w >> 31;
- zz_8 += (zz_7 >> 32) + x_7 * x_1;
- zz_9 += (zz_8 >> 32) + x_7 * x_2;
- zz_10 += (zz_9 >> 32) + x_7 * x_3;
- zz_11 += (zz_10 >> 32) + x_7 * x_4;
- zz_12 += (zz_11 >> 32) + x_7 * x_5;
- zz_13 += (zz_12 >> 32) + x_7 * x_6;
- zz_14 += zz_13 >> 32;
- }
-
- w = (uint)zz_8;
- zz[8] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_9;
- zz[9] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_10;
- zz[10] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_11;
- zz[11] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_12;
- zz[12] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_13;
- zz[13] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_14;
- zz[14] = (w << 1) | c;
- c = w >> 31;
- w = zz[15] + (uint)(zz_14 >> 32);
- zz[15] = (w << 1) | c;
- }
-
- public static void Square(uint[] x, int xOff, uint[] zz, int zzOff)
- {
- ulong x_0 = x[xOff + 0];
- ulong zz_1;
-
- uint c = 0, w;
- {
- int i = 7, j = 16;
- do
- {
- ulong xVal = x[xOff + i--];
- ulong p = xVal * xVal;
- zz[zzOff + --j] = (c << 31) | (uint)(p >> 33);
- zz[zzOff + --j] = (uint)(p >> 1);
- c = (uint)p;
- }
- while (i > 0);
-
- {
- ulong p = x_0 * x_0;
- zz_1 = (ulong)(c << 31) | (p >> 33);
- zz[zzOff + 0] = (uint)p;
- c = (uint)(p >> 32) & 1;
- }
- }
-
- ulong x_1 = x[xOff + 1];
- ulong zz_2 = zz[zzOff + 2];
-
- {
- zz_1 += x_1 * x_0;
- w = (uint)zz_1;
- zz[zzOff + 1] = (w << 1) | c;
- c = w >> 31;
- zz_2 += zz_1 >> 32;
- }
-
- ulong x_2 = x[xOff + 2];
- ulong zz_3 = zz[zzOff + 3];
- ulong zz_4 = zz[zzOff + 4];
- {
- zz_2 += x_2 * x_0;
- w = (uint)zz_2;
- zz[zzOff + 2] = (w << 1) | c;
- c = w >> 31;
- zz_3 += (zz_2 >> 32) + x_2 * x_1;
- zz_4 += zz_3 >> 32;
- zz_3 &= M;
- }
-
- ulong x_3 = x[xOff + 3];
- ulong zz_5 = zz[zzOff + 5] + (zz_4 >> 32); zz_4 &= M;
- ulong zz_6 = zz[zzOff + 6] + (zz_5 >> 32); zz_5 &= M;
- {
- zz_3 += x_3 * x_0;
- w = (uint)zz_3;
- zz[zzOff + 3] = (w << 1) | c;
- c = w >> 31;
- zz_4 += (zz_3 >> 32) + x_3 * x_1;
- zz_5 += (zz_4 >> 32) + x_3 * x_2;
- zz_4 &= M;
- zz_6 += zz_5 >> 32;
- zz_5 &= M;
- }
-
- ulong x_4 = x[xOff + 4];
- ulong zz_7 = zz[zzOff + 7] + (zz_6 >> 32); zz_6 &= M;
- ulong zz_8 = zz[zzOff + 8] + (zz_7 >> 32); zz_7 &= M;
- {
- zz_4 += x_4 * x_0;
- w = (uint)zz_4;
- zz[zzOff + 4] = (w << 1) | c;
- c = w >> 31;
- zz_5 += (zz_4 >> 32) + x_4 * x_1;
- zz_6 += (zz_5 >> 32) + x_4 * x_2;
- zz_5 &= M;
- zz_7 += (zz_6 >> 32) + x_4 * x_3;
- zz_6 &= M;
- zz_8 += zz_7 >> 32;
- zz_7 &= M;
- }
-
- ulong x_5 = x[xOff + 5];
- ulong zz_9 = zz[zzOff + 9] + (zz_8 >> 32); zz_8 &= M;
- ulong zz_10 = zz[zzOff + 10] + (zz_9 >> 32); zz_9 &= M;
- {
- zz_5 += x_5 * x_0;
- w = (uint)zz_5;
- zz[zzOff + 5] = (w << 1) | c;
- c = w >> 31;
- zz_6 += (zz_5 >> 32) + x_5 * x_1;
- zz_7 += (zz_6 >> 32) + x_5 * x_2;
- zz_6 &= M;
- zz_8 += (zz_7 >> 32) + x_5 * x_3;
- zz_7 &= M;
- zz_9 += (zz_8 >> 32) + x_5 * x_4;
- zz_8 &= M;
- zz_10 += zz_9 >> 32;
- zz_9 &= M;
- }
-
- ulong x_6 = x[xOff + 6];
- ulong zz_11 = zz[zzOff + 11] + (zz_10 >> 32); zz_10 &= M;
- ulong zz_12 = zz[zzOff + 12] + (zz_11 >> 32); zz_11 &= M;
- {
- zz_6 += x_6 * x_0;
- w = (uint)zz_6;
- zz[zzOff + 6] = (w << 1) | c;
- c = w >> 31;
- zz_7 += (zz_6 >> 32) + x_6 * x_1;
- zz_8 += (zz_7 >> 32) + x_6 * x_2;
- zz_7 &= M;
- zz_9 += (zz_8 >> 32) + x_6 * x_3;
- zz_8 &= M;
- zz_10 += (zz_9 >> 32) + x_6 * x_4;
- zz_9 &= M;
- zz_11 += (zz_10 >> 32) + x_6 * x_5;
- zz_10 &= M;
- zz_12 += zz_11 >> 32;
- zz_11 &= M;
- }
-
- ulong x_7 = x[xOff + 7];
- ulong zz_13 = zz[zzOff + 13] + (zz_12 >> 32); zz_12 &= M;
- ulong zz_14 = zz[zzOff + 14] + (zz_13 >> 32); zz_13 &= M;
- {
- zz_7 += x_7 * x_0;
- w = (uint)zz_7;
- zz[zzOff + 7] = (w << 1) | c;
- c = w >> 31;
- zz_8 += (zz_7 >> 32) + x_7 * x_1;
- zz_9 += (zz_8 >> 32) + x_7 * x_2;
- zz_10 += (zz_9 >> 32) + x_7 * x_3;
- zz_11 += (zz_10 >> 32) + x_7 * x_4;
- zz_12 += (zz_11 >> 32) + x_7 * x_5;
- zz_13 += (zz_12 >> 32) + x_7 * x_6;
- zz_14 += zz_13 >> 32;
- }
-
- w = (uint)zz_8;
- zz[zzOff + 8] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_9;
- zz[zzOff + 9] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_10;
- zz[zzOff + 10] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_11;
- zz[zzOff + 11] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_12;
- zz[zzOff + 12] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_13;
- zz[zzOff + 13] = (w << 1) | c;
- c = w >> 31;
- w = (uint)zz_14;
- zz[zzOff + 14] = (w << 1) | c;
- c = w >> 31;
- w = zz[zzOff + 15] + (uint)(zz_14 >> 32);
- zz[zzOff + 15] = (w << 1) | c;
- }
-
- public static int Sub(uint[] x, uint[] y, uint[] z)
- {
- long c = 0;
- c += (long)x[0] - y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)x[1] - y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)x[2] - y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)x[3] - y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (long)x[4] - y[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)x[5] - y[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (long)x[6] - y[6];
- z[6] = (uint)c;
- c >>= 32;
- c += (long)x[7] - y[7];
- z[7] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int Sub(uint[] x, int xOff, uint[] y, int yOff, uint[] z, int zOff)
- {
- long c = 0;
- c += (long)x[xOff + 0] - y[yOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 1] - y[yOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 2] - y[yOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 3] - y[yOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 4] - y[yOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 5] - y[yOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 6] - y[yOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- c += (long)x[xOff + 7] - y[yOff + 7];
- z[zOff + 7] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubBothFrom(uint[] x, uint[] y, uint[] z)
- {
- long c = 0;
- c += (long)z[0] - x[0] - y[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - x[1] - y[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2] - x[2] - y[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)z[3] - x[3] - y[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (long)z[4] - x[4] - y[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)z[5] - x[5] - y[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (long)z[6] - x[6] - y[6];
- z[6] = (uint)c;
- c >>= 32;
- c += (long)z[7] - x[7] - y[7];
- z[7] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubFrom(uint[] x, uint[] z)
- {
- long c = 0;
- c += (long)z[0] - x[0];
- z[0] = (uint)c;
- c >>= 32;
- c += (long)z[1] - x[1];
- z[1] = (uint)c;
- c >>= 32;
- c += (long)z[2] - x[2];
- z[2] = (uint)c;
- c >>= 32;
- c += (long)z[3] - x[3];
- z[3] = (uint)c;
- c >>= 32;
- c += (long)z[4] - x[4];
- z[4] = (uint)c;
- c >>= 32;
- c += (long)z[5] - x[5];
- z[5] = (uint)c;
- c >>= 32;
- c += (long)z[6] - x[6];
- z[6] = (uint)c;
- c >>= 32;
- c += (long)z[7] - x[7];
- z[7] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static int SubFrom(uint[] x, int xOff, uint[] z, int zOff)
- {
- long c = 0;
- c += (long)z[zOff + 0] - x[xOff + 0];
- z[zOff + 0] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 1] - x[xOff + 1];
- z[zOff + 1] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 2] - x[xOff + 2];
- z[zOff + 2] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 3] - x[xOff + 3];
- z[zOff + 3] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 4] - x[xOff + 4];
- z[zOff + 4] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 5] - x[xOff + 5];
- z[zOff + 5] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 6] - x[xOff + 6];
- z[zOff + 6] = (uint)c;
- c >>= 32;
- c += (long)z[zOff + 7] - x[xOff + 7];
- z[zOff + 7] = (uint)c;
- c >>= 32;
- return (int)c;
- }
-
- public static BigInteger ToBigInteger(uint[] x)
- {
- byte[] bs = new byte[32];
- for (int i = 0; i < 8; ++i)
- {
- uint x_i = x[i];
- if (x_i != 0)
- {
- Pack.UInt32_To_BE(x_i, bs, (7 - i) << 2);
- }
- }
- return new BigInteger(1, bs);
- }
-
- public static BigInteger ToBigInteger64(ulong[] x)
- {
- byte[] bs = new byte[32];
- for (int i = 0; i < 4; ++i)
- {
- ulong x_i = x[i];
- if (x_i != 0L)
- {
- Pack.UInt64_To_BE(x_i, bs, (3 - i) << 3);
- }
- }
- return new BigInteger(1, bs);
- }
-
- public static void Zero(uint[] z)
- {
- z[0] = 0;
- z[1] = 0;
- z[2] = 0;
- z[3] = 0;
- z[4] = 0;
- z[5] = 0;
- z[6] = 0;
- z[7] = 0;
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Nat320.cs b/BCCrypto/src/math/raw/Nat320.cs
deleted file mode 100644
index c7daa71..0000000
--- a/BCCrypto/src/math/raw/Nat320.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Nat320
- {
- public static void Copy64(ulong[] x, ulong[] z)
- {
- z[0] = x[0];
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- z[4] = x[4];
- }
-
- public static ulong[] Create64()
- {
- return new ulong[5];
- }
-
- public static ulong[] CreateExt64()
- {
- return new ulong[10];
- }
-
- public static bool Eq64(ulong[] x, ulong[] y)
- {
- for (int i = 4; i >= 0; --i)
- {
- if (x[i] != y[i])
- {
- return false;
- }
- }
- return true;
- }
-
- public static ulong[] FromBigInteger64(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 320)
- throw new ArgumentException();
-
- ulong[] z = Create64();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (ulong)x.LongValue;
- x = x.ShiftRight(64);
- }
- return z;
- }
-
- public static bool IsOne64(ulong[] x)
- {
- if (x[0] != 1UL)
- {
- return false;
- }
- for (int i = 1; i < 5; ++i)
- {
- if (x[i] != 0UL)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsZero64(ulong[] x)
- {
- for (int i = 0; i < 5; ++i)
- {
- if (x[i] != 0UL)
- {
- return false;
- }
- }
- return true;
- }
-
- public static BigInteger ToBigInteger64(ulong[] x)
- {
- byte[] bs = new byte[40];
- for (int i = 0; i < 5; ++i)
- {
- ulong x_i = x[i];
- if (x_i != 0L)
- {
- Pack.UInt64_To_BE(x_i, bs, (4 - i) << 3);
- }
- }
- return new BigInteger(1, bs);
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Nat384.cs b/BCCrypto/src/math/raw/Nat384.cs
deleted file mode 100644
index ed1c47e..0000000
--- a/BCCrypto/src/math/raw/Nat384.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using System;
-using System.Diagnostics;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Nat384
- {
- public static void Mul(uint[] x, uint[] y, uint[] zz)
- {
- Nat192.Mul(x, y, zz);
- Nat192.Mul(x, 6, y, 6, zz, 12);
-
- uint c18 = Nat192.AddToEachOther(zz, 6, zz, 12);
- uint c12 = c18 + Nat192.AddTo(zz, 0, zz, 6, 0);
- c18 += Nat192.AddTo(zz, 18, zz, 12, c12);
-
- uint[] dx = Nat192.Create(), dy = Nat192.Create();
- bool neg = Nat192.Diff(x, 6, x, 0, dx, 0) != Nat192.Diff(y, 6, y, 0, dy, 0);
-
- uint[] tt = Nat192.CreateExt();
- Nat192.Mul(dx, dy, tt);
-
- c18 += neg ? Nat.AddTo(12, tt, 0, zz, 6) : (uint)Nat.SubFrom(12, tt, 0, zz, 6);
- Nat.AddWordAt(24, c18, zz, 18);
- }
-
- public static void Square(uint[] x, uint[] zz)
- {
- Nat192.Square(x, zz);
- Nat192.Square(x, 6, zz, 12);
-
- uint c18 = Nat192.AddToEachOther(zz, 6, zz, 12);
- uint c12 = c18 + Nat192.AddTo(zz, 0, zz, 6, 0);
- c18 += Nat192.AddTo(zz, 18, zz, 12, c12);
-
- uint[] dx = Nat192.Create();
- Nat192.Diff(x, 6, x, 0, dx, 0);
-
- uint[] m = Nat192.CreateExt();
- Nat192.Square(dx, m);
-
- c18 += (uint)Nat.SubFrom(12, m, 0, zz, 6);
- Nat.AddWordAt(24, c18, zz, 18);
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Nat448.cs b/BCCrypto/src/math/raw/Nat448.cs
deleted file mode 100644
index 52a253f..0000000
--- a/BCCrypto/src/math/raw/Nat448.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Nat448
- {
- public static void Copy64(ulong[] x, ulong[] z)
- {
- z[0] = x[0];
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- z[4] = x[4];
- z[5] = x[5];
- z[6] = x[6];
- }
-
- public static ulong[] Create64()
- {
- return new ulong[7];
- }
-
- public static ulong[] CreateExt64()
- {
- return new ulong[14];
- }
-
- public static bool Eq64(ulong[] x, ulong[] y)
- {
- for (int i = 6; i >= 0; --i)
- {
- if (x[i] != y[i])
- {
- return false;
- }
- }
- return true;
- }
-
- public static ulong[] FromBigInteger64(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 448)
- throw new ArgumentException();
-
- ulong[] z = Create64();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (ulong)x.LongValue;
- x = x.ShiftRight(64);
- }
- return z;
- }
-
- public static bool IsOne64(ulong[] x)
- {
- if (x[0] != 1UL)
- {
- return false;
- }
- for (int i = 1; i < 7; ++i)
- {
- if (x[i] != 0UL)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsZero64(ulong[] x)
- {
- for (int i = 0; i < 7; ++i)
- {
- if (x[i] != 0UL)
- {
- return false;
- }
- }
- return true;
- }
-
- public static BigInteger ToBigInteger64(ulong[] x)
- {
- byte[] bs = new byte[56];
- for (int i = 0; i < 7; ++i)
- {
- ulong x_i = x[i];
- if (x_i != 0L)
- {
- Pack.UInt64_To_BE(x_i, bs, (6 - i) << 3);
- }
- }
- return new BigInteger(1, bs);
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Nat512.cs b/BCCrypto/src/math/raw/Nat512.cs
deleted file mode 100644
index a9ef2b3..0000000
--- a/BCCrypto/src/math/raw/Nat512.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using System;
-using System.Diagnostics;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Nat512
- {
- public static void Mul(uint[] x, uint[] y, uint[] zz)
- {
- Nat256.Mul(x, y, zz);
- Nat256.Mul(x, 8, y, 8, zz, 16);
-
- uint c24 = Nat256.AddToEachOther(zz, 8, zz, 16);
- uint c16 = c24 + Nat256.AddTo(zz, 0, zz, 8, 0);
- c24 += Nat256.AddTo(zz, 24, zz, 16, c16);
-
- uint[] dx = Nat256.Create(), dy = Nat256.Create();
- bool neg = Nat256.Diff(x, 8, x, 0, dx, 0) != Nat256.Diff(y, 8, y, 0, dy, 0);
-
- uint[] tt = Nat256.CreateExt();
- Nat256.Mul(dx, dy, tt);
-
- c24 += neg ? Nat.AddTo(16, tt, 0, zz, 8) : (uint)Nat.SubFrom(16, tt, 0, zz, 8);
- Nat.AddWordAt(32, c24, zz, 24);
- }
-
- public static void Square(uint[] x, uint[] zz)
- {
- Nat256.Square(x, zz);
- Nat256.Square(x, 8, zz, 16);
-
- uint c24 = Nat256.AddToEachOther(zz, 8, zz, 16);
- uint c16 = c24 + Nat256.AddTo(zz, 0, zz, 8, 0);
- c24 += Nat256.AddTo(zz, 24, zz, 16, c16);
-
- uint[] dx = Nat256.Create();
- Nat256.Diff(x, 8, x, 0, dx, 0);
-
- uint[] m = Nat256.CreateExt();
- Nat256.Square(dx, m);
-
- c24 += (uint)Nat.SubFrom(16, m, 0, zz, 8);
- Nat.AddWordAt(32, c24, zz, 24);
- }
- }
-}
diff --git a/BCCrypto/src/math/raw/Nat576.cs b/BCCrypto/src/math/raw/Nat576.cs
deleted file mode 100644
index 813fb86..0000000
--- a/BCCrypto/src/math/raw/Nat576.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System;
-using System.Diagnostics;
-
-using Org.BouncyCastle.Crypto.Utilities;
-
-namespace Org.BouncyCastle.Math.Raw
-{
- internal abstract class Nat576
- {
- public static void Copy64(ulong[] x, ulong[] z)
- {
- z[0] = x[0];
- z[1] = x[1];
- z[2] = x[2];
- z[3] = x[3];
- z[4] = x[4];
- z[5] = x[5];
- z[6] = x[6];
- z[7] = x[7];
- z[8] = x[8];
- }
-
- public static ulong[] Create64()
- {
- return new ulong[9];
- }
-
- public static ulong[] CreateExt64()
- {
- return new ulong[18];
- }
-
- public static bool Eq64(ulong[] x, ulong[] y)
- {
- for (int i = 8; i >= 0; --i)
- {
- if (x[i] != y[i])
- {
- return false;
- }
- }
- return true;
- }
-
- public static ulong[] FromBigInteger64(BigInteger x)
- {
- if (x.SignValue < 0 || x.BitLength > 576)
- throw new ArgumentException();
-
- ulong[] z = Create64();
- int i = 0;
- while (x.SignValue != 0)
- {
- z[i++] = (ulong)x.LongValue;
- x = x.ShiftRight(64);
- }
- return z;
- }
-
- public static bool IsOne64(ulong[] x)
- {
- if (x[0] != 1UL)
- {
- return false;
- }
- for (int i = 1; i < 9; ++i)
- {
- if (x[i] != 0UL)
- {
- return false;
- }
- }
- return true;
- }
-
- public static bool IsZero64(ulong[] x)
- {
- for (int i = 0; i < 9; ++i)
- {
- if (x[i] != 0UL)
- {
- return false;
- }
- }
- return true;
- }
-
- public static BigInteger ToBigInteger64(ulong[] x)
- {
- byte[] bs = new byte[72];
- for (int i = 0; i < 9; ++i)
- {
- ulong x_i = x[i];
- if (x_i != 0L)
- {
- Pack.UInt64_To_BE(x_i, bs, (8 - i) << 3);
- }
- }
- return new BigInteger(1, bs);
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/BasicOCSPResp.cs b/BCCrypto/src/ocsp/BasicOCSPResp.cs
deleted file mode 100644
index 63ab892..0000000
--- a/BCCrypto/src/ocsp/BasicOCSPResp.cs
+++ /dev/null
@@ -1,220 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Ocsp
-{
- ///
- ///
- /// BasicOcspResponse ::= SEQUENCE {
- /// tbsResponseData ResponseData,
- /// signatureAlgorithm AlgorithmIdentifier,
- /// signature BIT STRING,
- /// certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL
- /// }
- ///
- ///
- public class BasicOcspResp
- : X509ExtensionBase
- {
- private readonly BasicOcspResponse resp;
- private readonly ResponseData data;
-// private readonly X509Certificate[] chain;
-
- public BasicOcspResp(
- BasicOcspResponse resp)
- {
- this.resp = resp;
- this.data = resp.TbsResponseData;
- }
-
- /// The DER encoding of the tbsResponseData field.
- /// In the event of an encoding error.
- public byte[] GetTbsResponseData()
- {
- try
- {
- return data.GetDerEncoded();
- }
- catch (IOException e)
- {
- throw new OcspException("problem encoding tbsResponseData", e);
- }
- }
-
- public int Version
- {
- get { return data.Version.Value.IntValue + 1; }
- }
-
- public RespID ResponderId
- {
- get { return new RespID(data.ResponderID); }
- }
-
- public DateTime ProducedAt
- {
- get { return data.ProducedAt.ToDateTime(); }
- }
-
- public SingleResp[] Responses
- {
- get
- {
- Asn1Sequence s = data.Responses;
- SingleResp[] rs = new SingleResp[s.Count];
-
- for (int i = 0; i != rs.Length; i++)
- {
- rs[i] = new SingleResp(SingleResponse.GetInstance(s[i]));
- }
-
- return rs;
- }
- }
-
- public X509Extensions ResponseExtensions
- {
- get { return data.ResponseExtensions; }
- }
-
- protected override X509Extensions GetX509Extensions()
- {
- return ResponseExtensions;
- }
-
- public string SignatureAlgName
- {
- get { return OcspUtilities.GetAlgorithmName(resp.SignatureAlgorithm.Algorithm); }
- }
-
- public string SignatureAlgOid
- {
- get { return resp.SignatureAlgorithm.Algorithm.Id; }
- }
-
- [Obsolete("RespData class is no longer required as all functionality is available on this class")]
- public RespData GetResponseData()
- {
- return new RespData(data);
- }
-
- public byte[] GetSignature()
- {
- return resp.GetSignatureOctets();
- }
-
- private IList GetCertList()
- {
- // load the certificates and revocation lists if we have any
-
- IList certs = Platform.CreateArrayList();
- Asn1Sequence s = resp.Certs;
-
- if (s != null)
- {
- foreach (Asn1Encodable ae in s)
- {
- try
- {
- certs.Add(new X509CertificateParser().ReadCertificate(ae.GetEncoded()));
- }
- catch (IOException ex)
- {
- throw new OcspException("can't re-encode certificate!", ex);
- }
- catch (CertificateException ex)
- {
- throw new OcspException("can't re-encode certificate!", ex);
- }
- }
- }
-
- return certs;
- }
-
- public X509Certificate[] GetCerts()
- {
- IList certs = GetCertList();
- X509Certificate[] result = new X509Certificate[certs.Count];
- for (int i = 0; i < certs.Count; ++i)
- {
- result[i] = (X509Certificate)certs[i];
- }
- return result;
- }
-
- /// The certificates, if any, associated with the response.
- /// In the event of an encoding error.
- public IX509Store GetCertificates(
- string type)
- {
- try
- {
- return X509StoreFactory.Create(
- "Certificate/" + type,
- new X509CollectionStoreParameters(this.GetCertList()));
- }
- catch (Exception e)
- {
- throw new OcspException("can't setup the CertStore", e);
- }
- }
-
- ///
- /// Verify the signature against the tbsResponseData object we contain.
- ///
- public bool Verify(
- AsymmetricKeyParameter publicKey)
- {
- try
- {
- ISigner signature = SignerUtilities.GetSigner(this.SignatureAlgName);
- signature.Init(false, publicKey);
- byte[] bs = data.GetDerEncoded();
- signature.BlockUpdate(bs, 0, bs.Length);
-
- return signature.VerifySignature(this.GetSignature());
- }
- catch (Exception e)
- {
- throw new OcspException("exception processing sig: " + e, e);
- }
- }
-
- /// The ASN.1 encoded representation of this object.
- public byte[] GetEncoded()
- {
- return resp.GetEncoded();
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- BasicOcspResp other = obj as BasicOcspResp;
-
- if (other == null)
- return false;
-
- return resp.Equals(other.resp);
- }
-
- public override int GetHashCode()
- {
- return resp.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/BasicOCSPRespGenerator.cs b/BCCrypto/src/ocsp/BasicOCSPRespGenerator.cs
deleted file mode 100644
index 0dd4e0a..0000000
--- a/BCCrypto/src/ocsp/BasicOCSPRespGenerator.cs
+++ /dev/null
@@ -1,313 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.Crypto.Operators;
-
-namespace Org.BouncyCastle.Ocsp
-{
- /**
- * Generator for basic OCSP response objects.
- */
- public class BasicOcspRespGenerator
- {
- private readonly IList list = Platform.CreateArrayList();
-
- private X509Extensions responseExtensions;
- private RespID responderID;
-
- private class ResponseObject
- {
- internal CertificateID certId;
- internal CertStatus certStatus;
- internal DerGeneralizedTime thisUpdate;
- internal DerGeneralizedTime nextUpdate;
- internal X509Extensions extensions;
-
- public ResponseObject(
- CertificateID certId,
- CertificateStatus certStatus,
- DateTime thisUpdate,
- X509Extensions extensions)
- : this(certId, certStatus, new DerGeneralizedTime(thisUpdate), null, extensions)
- {
- }
-
- public ResponseObject(
- CertificateID certId,
- CertificateStatus certStatus,
- DateTime thisUpdate,
- DateTime nextUpdate,
- X509Extensions extensions)
- : this(certId, certStatus, new DerGeneralizedTime(thisUpdate), new DerGeneralizedTime(nextUpdate), extensions)
- {
- }
-
- private ResponseObject(
- CertificateID certId,
- CertificateStatus certStatus,
- DerGeneralizedTime thisUpdate,
- DerGeneralizedTime nextUpdate,
- X509Extensions extensions)
- {
- this.certId = certId;
-
- if (certStatus == null)
- {
- this.certStatus = new CertStatus();
- }
- else if (certStatus is UnknownStatus)
- {
- this.certStatus = new CertStatus(2, DerNull.Instance);
- }
- else
- {
- RevokedStatus rs = (RevokedStatus) certStatus;
- CrlReason revocationReason = rs.HasRevocationReason
- ? new CrlReason(rs.RevocationReason)
- : null;
-
- this.certStatus = new CertStatus(
- new RevokedInfo(new DerGeneralizedTime(rs.RevocationTime), revocationReason));
- }
-
- this.thisUpdate = thisUpdate;
- this.nextUpdate = nextUpdate;
-
- this.extensions = extensions;
- }
-
- public SingleResponse ToResponse()
- {
- return new SingleResponse(certId.ToAsn1Object(), certStatus, thisUpdate, nextUpdate, extensions);
- }
- }
-
- /**
- * basic constructor
- */
- public BasicOcspRespGenerator(
- RespID responderID)
- {
- this.responderID = responderID;
- }
-
- /**
- * construct with the responderID to be the SHA-1 keyHash of the passed in public key.
- */
- public BasicOcspRespGenerator(
- AsymmetricKeyParameter publicKey)
- {
- this.responderID = new RespID(publicKey);
- }
-
- /**
- * Add a response for a particular Certificate ID.
- *
- * @param certID certificate ID details
- * @param certStatus status of the certificate - null if okay
- */
- public void AddResponse(
- CertificateID certID,
- CertificateStatus certStatus)
- {
- list.Add(new ResponseObject(certID, certStatus, DateTime.UtcNow, null));
- }
-
- /**
- * Add a response for a particular Certificate ID.
- *
- * @param certID certificate ID details
- * @param certStatus status of the certificate - null if okay
- * @param singleExtensions optional extensions
- */
- public void AddResponse(
- CertificateID certID,
- CertificateStatus certStatus,
- X509Extensions singleExtensions)
- {
- list.Add(new ResponseObject(certID, certStatus, DateTime.UtcNow, singleExtensions));
- }
-
- /**
- * Add a response for a particular Certificate ID.
- *
- * @param certID certificate ID details
- * @param nextUpdate date when next update should be requested
- * @param certStatus status of the certificate - null if okay
- * @param singleExtensions optional extensions
- */
- public void AddResponse(
- CertificateID certID,
- CertificateStatus certStatus,
- DateTime nextUpdate,
- X509Extensions singleExtensions)
- {
- list.Add(new ResponseObject(certID, certStatus, DateTime.UtcNow, nextUpdate, singleExtensions));
- }
-
- /**
- * Add a response for a particular Certificate ID.
- *
- * @param certID certificate ID details
- * @param thisUpdate date this response was valid on
- * @param nextUpdate date when next update should be requested
- * @param certStatus status of the certificate - null if okay
- * @param singleExtensions optional extensions
- */
- public void AddResponse(
- CertificateID certID,
- CertificateStatus certStatus,
- DateTime thisUpdate,
- DateTime nextUpdate,
- X509Extensions singleExtensions)
- {
- list.Add(new ResponseObject(certID, certStatus, thisUpdate, nextUpdate, singleExtensions));
- }
-
- /**
- * Set the extensions for the response.
- *
- * @param responseExtensions the extension object to carry.
- */
- public void SetResponseExtensions(
- X509Extensions responseExtensions)
- {
- this.responseExtensions = responseExtensions;
- }
-
- private BasicOcspResp GenerateResponse(
- ISignatureFactory signatureCalculator,
- X509Certificate[] chain,
- DateTime producedAt)
- {
- AlgorithmIdentifier signingAlgID = (AlgorithmIdentifier)signatureCalculator.AlgorithmDetails;
- DerObjectIdentifier signingAlgorithm = signingAlgID.Algorithm;
-
- Asn1EncodableVector responses = new Asn1EncodableVector();
-
- foreach (ResponseObject respObj in list)
- {
- try
- {
- responses.Add(respObj.ToResponse());
- }
- catch (Exception e)
- {
- throw new OcspException("exception creating Request", e);
- }
- }
-
- ResponseData tbsResp = new ResponseData(responderID.ToAsn1Object(), new DerGeneralizedTime(producedAt), new DerSequence(responses), responseExtensions);
- DerBitString bitSig = null;
-
- try
- {
- IStreamCalculator streamCalculator = signatureCalculator.CreateCalculator();
-
- byte[] encoded = tbsResp.GetDerEncoded();
-
- streamCalculator.Stream.Write(encoded, 0, encoded.Length);
-
- Platform.Dispose(streamCalculator.Stream);
-
- bitSig = new DerBitString(((IBlockResult)streamCalculator.GetResult()).Collect());
- }
- catch (Exception e)
- {
- throw new OcspException("exception processing TBSRequest: " + e, e);
- }
-
- AlgorithmIdentifier sigAlgId = OcspUtilities.GetSigAlgID(signingAlgorithm);
-
- DerSequence chainSeq = null;
- if (chain != null && chain.Length > 0)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
- try
- {
- for (int i = 0; i != chain.Length; i++)
- {
- v.Add(
- X509CertificateStructure.GetInstance(
- Asn1Object.FromByteArray(chain[i].GetEncoded())));
- }
- }
- catch (IOException e)
- {
- throw new OcspException("error processing certs", e);
- }
- catch (CertificateEncodingException e)
- {
- throw new OcspException("error encoding certs", e);
- }
-
- chainSeq = new DerSequence(v);
- }
-
- return new BasicOcspResp(new BasicOcspResponse(tbsResp, sigAlgId, bitSig, chainSeq));
- }
-
- public BasicOcspResp Generate(
- string signingAlgorithm,
- AsymmetricKeyParameter privateKey,
- X509Certificate[] chain,
- DateTime thisUpdate)
- {
- return Generate(signingAlgorithm, privateKey, chain, thisUpdate, null);
- }
-
- public BasicOcspResp Generate(
- string signingAlgorithm,
- AsymmetricKeyParameter privateKey,
- X509Certificate[] chain,
- DateTime producedAt,
- SecureRandom random)
- {
- if (signingAlgorithm == null)
- {
- throw new ArgumentException("no signing algorithm specified");
- }
-
- return GenerateResponse(new Asn1SignatureFactory(signingAlgorithm, privateKey, random), chain, producedAt);
- }
-
- ///
- /// Generate the signed response using the passed in signature calculator.
- ///
- /// Implementation of signing calculator factory.
- /// The certificate chain associated with the response signer.
- /// "produced at" date.
- ///
- public BasicOcspResp Generate(
- ISignatureFactory signatureCalculatorFactory,
- X509Certificate[] chain,
- DateTime producedAt)
- {
- if (signatureCalculatorFactory == null)
- {
- throw new ArgumentException("no signature calculator specified");
- }
-
- return GenerateResponse(signatureCalculatorFactory, chain, producedAt);
- }
-
- /**
- * Return an IEnumerable of the signature names supported by the generator.
- *
- * @return an IEnumerable containing recognised names.
- */
- public IEnumerable SignatureAlgNames
- {
- get { return OcspUtilities.AlgNames; }
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/CertificateID.cs b/BCCrypto/src/ocsp/CertificateID.cs
deleted file mode 100644
index ec902d5..0000000
--- a/BCCrypto/src/ocsp/CertificateID.cs
+++ /dev/null
@@ -1,141 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Ocsp
-{
- public class CertificateID
- {
- public const string HashSha1 = "1.3.14.3.2.26";
-
- private readonly CertID id;
-
- public CertificateID(
- CertID id)
- {
- if (id == null)
- throw new ArgumentNullException("id");
-
- this.id = id;
- }
-
- /**
- * create from an issuer certificate and the serial number of the
- * certificate it signed.
- * @exception OcspException if any problems occur creating the id fields.
- */
- public CertificateID(
- string hashAlgorithm,
- X509Certificate issuerCert,
- BigInteger serialNumber)
- {
- AlgorithmIdentifier hashAlg = new AlgorithmIdentifier(
- new DerObjectIdentifier(hashAlgorithm), DerNull.Instance);
-
- this.id = CreateCertID(hashAlg, issuerCert, new DerInteger(serialNumber));
- }
-
- public string HashAlgOid
- {
- get { return id.HashAlgorithm.Algorithm.Id; }
- }
-
- public byte[] GetIssuerNameHash()
- {
- return id.IssuerNameHash.GetOctets();
- }
-
- public byte[] GetIssuerKeyHash()
- {
- return id.IssuerKeyHash.GetOctets();
- }
-
- /**
- * return the serial number for the certificate associated
- * with this request.
- */
- public BigInteger SerialNumber
- {
- get { return id.SerialNumber.Value; }
- }
-
- public bool MatchesIssuer(
- X509Certificate issuerCert)
- {
- return CreateCertID(id.HashAlgorithm, issuerCert, id.SerialNumber).Equals(id);
- }
-
- public CertID ToAsn1Object()
- {
- return id;
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- CertificateID other = obj as CertificateID;
-
- if (other == null)
- return false;
-
- return id.ToAsn1Object().Equals(other.id.ToAsn1Object());
- }
-
- public override int GetHashCode()
- {
- return id.ToAsn1Object().GetHashCode();
- }
-
-
- /**
- * Create a new CertificateID for a new serial number derived from a previous one
- * calculated for the same CA certificate.
- *
- * @param original the previously calculated CertificateID for the CA.
- * @param newSerialNumber the serial number for the new certificate of interest.
- *
- * @return a new CertificateID for newSerialNumber
- */
- public static CertificateID DeriveCertificateID(CertificateID original, BigInteger newSerialNumber)
- {
- return new CertificateID(new CertID(original.id.HashAlgorithm, original.id.IssuerNameHash,
- original.id.IssuerKeyHash, new DerInteger(newSerialNumber)));
- }
-
- private static CertID CreateCertID(
- AlgorithmIdentifier hashAlg,
- X509Certificate issuerCert,
- DerInteger serialNumber)
- {
- try
- {
- String hashAlgorithm = hashAlg.Algorithm.Id;
-
- X509Name issuerName = PrincipalUtilities.GetSubjectX509Principal(issuerCert);
- byte[] issuerNameHash = DigestUtilities.CalculateDigest(
- hashAlgorithm, issuerName.GetEncoded());
-
- AsymmetricKeyParameter issuerKey = issuerCert.GetPublicKey();
- SubjectPublicKeyInfo info = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(issuerKey);
- byte[] issuerKeyHash = DigestUtilities.CalculateDigest(
- hashAlgorithm, info.PublicKeyData.GetBytes());
-
- return new CertID(hashAlg, new DerOctetString(issuerNameHash),
- new DerOctetString(issuerKeyHash), serialNumber);
- }
- catch (Exception e)
- {
- throw new OcspException("problem creating ID: " + e, e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/CertificateStatus.cs b/BCCrypto/src/ocsp/CertificateStatus.cs
deleted file mode 100644
index edfcc25..0000000
--- a/BCCrypto/src/ocsp/CertificateStatus.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Ocsp
-{
- public abstract class CertificateStatus
- {
- public static readonly CertificateStatus Good = null;
- }
-}
diff --git a/BCCrypto/src/ocsp/OCSPException.cs b/BCCrypto/src/ocsp/OCSPException.cs
deleted file mode 100644
index d7b14dd..0000000
--- a/BCCrypto/src/ocsp/OCSPException.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Ocsp
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class OcspException
- : Exception
- {
- public OcspException()
- {
- }
-
- public OcspException(
- string message)
- : base(message)
- {
- }
-
- public OcspException(
- string message,
- Exception e)
- : base(message, e)
- {
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/OCSPReq.cs b/BCCrypto/src/ocsp/OCSPReq.cs
deleted file mode 100644
index 0cd95c6..0000000
--- a/BCCrypto/src/ocsp/OCSPReq.cs
+++ /dev/null
@@ -1,268 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Ocsp
-{
- /**
- *
- * OcspRequest ::= SEQUENCE {
- * tbsRequest TBSRequest,
- * optionalSignature [0] EXPLICIT Signature OPTIONAL }
- *
- * TBSRequest ::= SEQUENCE {
- * version [0] EXPLICIT Version DEFAULT v1,
- * requestorName [1] EXPLICIT GeneralName OPTIONAL,
- * requestList SEQUENCE OF Request,
- * requestExtensions [2] EXPLICIT Extensions OPTIONAL }
- *
- * Signature ::= SEQUENCE {
- * signatureAlgorithm AlgorithmIdentifier,
- * signature BIT STRING,
- * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL}
- *
- * Version ::= INTEGER { v1(0) }
- *
- * Request ::= SEQUENCE {
- * reqCert CertID,
- * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL }
- *
- * CertID ::= SEQUENCE {
- * hashAlgorithm AlgorithmIdentifier,
- * issuerNameHash OCTET STRING, -- Hash of Issuer's DN
- * issuerKeyHash OCTET STRING, -- Hash of Issuers public key
- * serialNumber CertificateSerialNumber }
- *
- */
- public class OcspReq
- : X509ExtensionBase
- {
- private OcspRequest req;
-
- public OcspReq(
- OcspRequest req)
- {
- this.req = req;
- }
-
- public OcspReq(
- byte[] req)
- : this(new Asn1InputStream(req))
- {
- }
-
- public OcspReq(
- Stream inStr)
- : this(new Asn1InputStream(inStr))
- {
- }
-
- private OcspReq(
- Asn1InputStream aIn)
- {
- try
- {
- this.req = OcspRequest.GetInstance(aIn.ReadObject());
- }
- catch (ArgumentException e)
- {
- throw new IOException("malformed request: " + e.Message);
- }
- catch (InvalidCastException e)
- {
- throw new IOException("malformed request: " + e.Message);
- }
- }
-
- /**
- * Return the DER encoding of the tbsRequest field.
- * @return DER encoding of tbsRequest
- * @throws OcspException in the event of an encoding error.
- */
- public byte[] GetTbsRequest()
- {
- try
- {
- return req.TbsRequest.GetEncoded();
- }
- catch (IOException e)
- {
- throw new OcspException("problem encoding tbsRequest", e);
- }
- }
-
- public int Version
- {
- get { return req.TbsRequest.Version.Value.IntValue + 1; }
- }
-
- public GeneralName RequestorName
- {
- get { return GeneralName.GetInstance(req.TbsRequest.RequestorName); }
- }
-
- public Req[] GetRequestList()
- {
- Asn1Sequence seq = req.TbsRequest.RequestList;
- Req[] requests = new Req[seq.Count];
-
- for (int i = 0; i != requests.Length; i++)
- {
- requests[i] = new Req(Request.GetInstance(seq[i]));
- }
-
- return requests;
- }
-
- public X509Extensions RequestExtensions
- {
- get { return X509Extensions.GetInstance(req.TbsRequest.RequestExtensions); }
- }
-
- protected override X509Extensions GetX509Extensions()
- {
- return RequestExtensions;
- }
-
- /**
- * return the object identifier representing the signature algorithm
- */
- public string SignatureAlgOid
- {
- get
- {
- if (!this.IsSigned)
- return null;
-
- return req.OptionalSignature.SignatureAlgorithm.Algorithm.Id;
- }
- }
-
- public byte[] GetSignature()
- {
- if (!this.IsSigned)
- return null;
-
- return req.OptionalSignature.GetSignatureOctets();
- }
-
- private IList GetCertList()
- {
- // load the certificates if we have any
-
- IList certs = Platform.CreateArrayList();
- Asn1Sequence s = req.OptionalSignature.Certs;
-
- if (s != null)
- {
- foreach (Asn1Encodable ae in s)
- {
- try
- {
- certs.Add(new X509CertificateParser().ReadCertificate(ae.GetEncoded()));
- }
- catch (Exception e)
- {
- throw new OcspException("can't re-encode certificate!", e);
- }
- }
- }
-
- return certs;
- }
-
- public X509Certificate[] GetCerts()
- {
- if (!this.IsSigned)
- return null;
-
- IList certs = this.GetCertList();
- X509Certificate[] result = new X509Certificate[certs.Count];
- for (int i = 0; i < certs.Count; ++i)
- {
- result[i] = (X509Certificate)certs[i];
- }
- return result;
- }
-
- /**
- * If the request is signed return a possibly empty CertStore containing the certificates in the
- * request. If the request is not signed the method returns null.
- *
- * @return null if not signed, a CertStore otherwise
- * @throws OcspException
- */
- public IX509Store GetCertificates(
- string type)
- {
- if (!this.IsSigned)
- return null;
-
- try
- {
- return X509StoreFactory.Create(
- "Certificate/" + type,
- new X509CollectionStoreParameters(this.GetCertList()));
- }
- catch (Exception e)
- {
- throw new OcspException("can't setup the CertStore", e);
- }
- }
-
- /**
- * Return whether or not this request is signed.
- *
- * @return true if signed false otherwise.
- */
- public bool IsSigned
- {
- get { return req.OptionalSignature != null; }
- }
-
- /**
- * Verify the signature against the TBSRequest object we contain.
- */
- public bool Verify(
- AsymmetricKeyParameter publicKey)
- {
- if (!this.IsSigned)
- throw new OcspException("attempt to Verify signature on unsigned object");
-
- try
- {
- ISigner signature = SignerUtilities.GetSigner(this.SignatureAlgOid);
-
- signature.Init(false, publicKey);
-
- byte[] encoded = req.TbsRequest.GetEncoded();
-
- signature.BlockUpdate(encoded, 0, encoded.Length);
-
- return signature.VerifySignature(this.GetSignature());
- }
- catch (Exception e)
- {
- throw new OcspException("exception processing sig: " + e, e);
- }
- }
-
- /**
- * return the ASN.1 encoded representation of this object.
- */
- public byte[] GetEncoded()
- {
- return req.GetEncoded();
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/OCSPReqGenerator.cs b/BCCrypto/src/ocsp/OCSPReqGenerator.cs
deleted file mode 100644
index 8032a45..0000000
--- a/BCCrypto/src/ocsp/OCSPReqGenerator.cs
+++ /dev/null
@@ -1,243 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Ocsp
-{
- public class OcspReqGenerator
- {
- private IList list = Platform.CreateArrayList();
- private GeneralName requestorName = null;
- private X509Extensions requestExtensions = null;
-
- private class RequestObject
- {
- internal CertificateID certId;
- internal X509Extensions extensions;
-
- public RequestObject(
- CertificateID certId,
- X509Extensions extensions)
- {
- this.certId = certId;
- this.extensions = extensions;
- }
-
- public Request ToRequest()
- {
- return new Request(certId.ToAsn1Object(), extensions);
- }
- }
-
- /**
- * Add a request for the given CertificateID.
- *
- * @param certId certificate ID of interest
- */
- public void AddRequest(
- CertificateID certId)
- {
- list.Add(new RequestObject(certId, null));
- }
-
- /**
- * Add a request with extensions
- *
- * @param certId certificate ID of interest
- * @param singleRequestExtensions the extensions to attach to the request
- */
- public void AddRequest(
- CertificateID certId,
- X509Extensions singleRequestExtensions)
- {
- list.Add(new RequestObject(certId, singleRequestExtensions));
- }
-
- /**
- * Set the requestor name to the passed in X509Principal
- *
- * @param requestorName a X509Principal representing the requestor name.
- */
- public void SetRequestorName(
- X509Name requestorName)
- {
- try
- {
- this.requestorName = new GeneralName(GeneralName.DirectoryName, requestorName);
- }
- catch (Exception e)
- {
- throw new ArgumentException("cannot encode principal", e);
- }
- }
-
- public void SetRequestorName(
- GeneralName requestorName)
- {
- this.requestorName = requestorName;
- }
-
- public void SetRequestExtensions(
- X509Extensions requestExtensions)
- {
- this.requestExtensions = requestExtensions;
- }
-
- private OcspReq GenerateRequest(
- DerObjectIdentifier signingAlgorithm,
- AsymmetricKeyParameter privateKey,
- X509Certificate[] chain,
- SecureRandom random)
- {
- Asn1EncodableVector requests = new Asn1EncodableVector();
-
- foreach (RequestObject reqObj in list)
- {
- try
- {
- requests.Add(reqObj.ToRequest());
- }
- catch (Exception e)
- {
- throw new OcspException("exception creating Request", e);
- }
- }
-
- TbsRequest tbsReq = new TbsRequest(requestorName, new DerSequence(requests), requestExtensions);
-
- ISigner sig = null;
- Signature signature = null;
-
- if (signingAlgorithm != null)
- {
- if (requestorName == null)
- {
- throw new OcspException("requestorName must be specified if request is signed.");
- }
-
- try
- {
- sig = SignerUtilities.GetSigner(signingAlgorithm.Id);
- if (random != null)
- {
- sig.Init(true, new ParametersWithRandom(privateKey, random));
- }
- else
- {
- sig.Init(true, privateKey);
- }
- }
- catch (Exception e)
- {
- throw new OcspException("exception creating signature: " + e, e);
- }
-
- DerBitString bitSig = null;
-
- try
- {
- byte[] encoded = tbsReq.GetEncoded();
- sig.BlockUpdate(encoded, 0, encoded.Length);
-
- bitSig = new DerBitString(sig.GenerateSignature());
- }
- catch (Exception e)
- {
- throw new OcspException("exception processing TBSRequest: " + e, e);
- }
-
- AlgorithmIdentifier sigAlgId = new AlgorithmIdentifier(signingAlgorithm, DerNull.Instance);
-
- if (chain != null && chain.Length > 0)
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
- try
- {
- for (int i = 0; i != chain.Length; i++)
- {
- v.Add(
- X509CertificateStructure.GetInstance(
- Asn1Object.FromByteArray(chain[i].GetEncoded())));
- }
- }
- catch (IOException e)
- {
- throw new OcspException("error processing certs", e);
- }
- catch (CertificateEncodingException e)
- {
- throw new OcspException("error encoding certs", e);
- }
-
- signature = new Signature(sigAlgId, bitSig, new DerSequence(v));
- }
- else
- {
- signature = new Signature(sigAlgId, bitSig);
- }
- }
-
- return new OcspReq(new OcspRequest(tbsReq, signature));
- }
-
- /**
- * Generate an unsigned request
- *
- * @return the OcspReq
- * @throws OcspException
- */
- public OcspReq Generate()
- {
- return GenerateRequest(null, null, null, null);
- }
-
- public OcspReq Generate(
- string signingAlgorithm,
- AsymmetricKeyParameter privateKey,
- X509Certificate[] chain)
- {
- return Generate(signingAlgorithm, privateKey, chain, null);
- }
-
- public OcspReq Generate(
- string signingAlgorithm,
- AsymmetricKeyParameter privateKey,
- X509Certificate[] chain,
- SecureRandom random)
- {
- if (signingAlgorithm == null)
- throw new ArgumentException("no signing algorithm specified");
-
- try
- {
- DerObjectIdentifier oid = OcspUtilities.GetAlgorithmOid(signingAlgorithm);
-
- return GenerateRequest(oid, privateKey, chain, random);
- }
- catch (ArgumentException)
- {
- throw new ArgumentException("unknown signing algorithm specified: " + signingAlgorithm);
- }
- }
-
- /**
- * Return an IEnumerable of the signature names supported by the generator.
- *
- * @return an IEnumerable containing recognised names.
- */
- public IEnumerable SignatureAlgNames
- {
- get { return OcspUtilities.AlgNames; }
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/OCSPResp.cs b/BCCrypto/src/ocsp/OCSPResp.cs
deleted file mode 100644
index dc99c6a..0000000
--- a/BCCrypto/src/ocsp/OCSPResp.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-
-namespace Org.BouncyCastle.Ocsp
-{
- public class OcspResp
- {
- private OcspResponse resp;
-
- public OcspResp(
- OcspResponse resp)
- {
- this.resp = resp;
- }
-
- public OcspResp(
- byte[] resp)
- : this(new Asn1InputStream(resp))
- {
- }
-
- public OcspResp(
- Stream inStr)
- : this(new Asn1InputStream(inStr))
- {
- }
-
- private OcspResp(
- Asn1InputStream aIn)
- {
- try
- {
- this.resp = OcspResponse.GetInstance(aIn.ReadObject());
- }
- catch (Exception e)
- {
- throw new IOException("malformed response: " + e.Message, e);
- }
- }
-
- public int Status
- {
- get { return this.resp.ResponseStatus.Value.IntValue; }
- }
-
- public object GetResponseObject()
- {
- ResponseBytes rb = this.resp.ResponseBytes;
-
- if (rb == null)
- return null;
-
- if (rb.ResponseType.Equals(OcspObjectIdentifiers.PkixOcspBasic))
- {
- try
- {
- return new BasicOcspResp(
- BasicOcspResponse.GetInstance(
- Asn1Object.FromByteArray(rb.Response.GetOctets())));
- }
- catch (Exception e)
- {
- throw new OcspException("problem decoding object: " + e, e);
- }
- }
-
- return rb.Response;
- }
-
- /**
- * return the ASN.1 encoded representation of this object.
- */
- public byte[] GetEncoded()
- {
- return resp.GetEncoded();
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- OcspResp other = obj as OcspResp;
-
- if (other == null)
- return false;
-
- return resp.Equals(other.resp);
- }
-
- public override int GetHashCode()
- {
- return resp.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/OCSPRespGenerator.cs b/BCCrypto/src/ocsp/OCSPRespGenerator.cs
deleted file mode 100644
index e0eb9ae..0000000
--- a/BCCrypto/src/ocsp/OCSPRespGenerator.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-
-namespace Org.BouncyCastle.Ocsp
-{
- /**
- * base generator for an OCSP response - at the moment this only supports the
- * generation of responses containing BasicOCSP responses.
- */
- public class OCSPRespGenerator
- {
- public const int Successful = 0; // Response has valid confirmations
- public const int MalformedRequest = 1; // Illegal confirmation request
- public const int InternalError = 2; // Internal error in issuer
- public const int TryLater = 3; // Try again later
- // (4) is not used
- public const int SigRequired = 5; // Must sign the request
- public const int Unauthorized = 6; // Request unauthorized
-
- public OcspResp Generate(
- int status,
- object response)
- {
- if (response == null)
- {
- return new OcspResp(new OcspResponse(new OcspResponseStatus(status),null));
- }
- if (response is BasicOcspResp)
- {
- BasicOcspResp r = (BasicOcspResp)response;
- Asn1OctetString octs;
-
- try
- {
- octs = new DerOctetString(r.GetEncoded());
- }
- catch (Exception e)
- {
- throw new OcspException("can't encode object.", e);
- }
-
- ResponseBytes rb = new ResponseBytes(
- OcspObjectIdentifiers.PkixOcspBasic, octs);
-
- return new OcspResp(new OcspResponse(
- new OcspResponseStatus(status), rb));
- }
-
- throw new OcspException("unknown response object");
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/OCSPRespStatus.cs b/BCCrypto/src/ocsp/OCSPRespStatus.cs
deleted file mode 100644
index 9c00c70..0000000
--- a/BCCrypto/src/ocsp/OCSPRespStatus.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Ocsp
-{
- [Obsolete("Use version with correct spelling 'OcspRespStatus'")]
- public abstract class OcscpRespStatus : OcspRespStatus
- {
- }
-
- public abstract class OcspRespStatus
- {
- /**
- * note 4 is not used.
- */
- public const int Successful = 0; // --Response has valid confirmations
- public const int MalformedRequest = 1; // --Illegal confirmation request
- public const int InternalError = 2; // --Internal error in issuer
- public const int TryLater = 3; // --Try again later
- public const int SigRequired = 5; // --Must sign the request
- public const int Unauthorized = 6; // --Request unauthorized
- }
-}
diff --git a/BCCrypto/src/ocsp/OCSPUtil.cs b/BCCrypto/src/ocsp/OCSPUtil.cs
deleted file mode 100644
index cbc1e95..0000000
--- a/BCCrypto/src/ocsp/OCSPUtil.cs
+++ /dev/null
@@ -1,132 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Ocsp
-{
- class OcspUtilities
- {
- private static readonly IDictionary algorithms = Platform.CreateHashtable();
- private static readonly IDictionary oids = Platform.CreateHashtable();
- private static readonly ISet noParams = new HashSet();
-
- static OcspUtilities()
- {
- algorithms.Add("MD2WITHRSAENCRYPTION", PkcsObjectIdentifiers.MD2WithRsaEncryption);
- algorithms.Add("MD2WITHRSA", PkcsObjectIdentifiers.MD2WithRsaEncryption);
- algorithms.Add("MD5WITHRSAENCRYPTION", PkcsObjectIdentifiers.MD5WithRsaEncryption);
- algorithms.Add("MD5WITHRSA", PkcsObjectIdentifiers.MD5WithRsaEncryption);
- 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("RIPEMD160WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
- algorithms.Add("RIPEMD160WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
- algorithms.Add("RIPEMD128WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
- algorithms.Add("RIPEMD128WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
- algorithms.Add("RIPEMD256WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
- algorithms.Add("RIPEMD256WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
- algorithms.Add("SHA1WITHDSA", X9ObjectIdentifiers.IdDsaWithSha1);
- algorithms.Add("DSAWITHSHA1", X9ObjectIdentifiers.IdDsaWithSha1);
- algorithms.Add("SHA224WITHDSA", NistObjectIdentifiers.DsaWithSha224);
- algorithms.Add("SHA256WITHDSA", NistObjectIdentifiers.DsaWithSha256);
- 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);
- algorithms.Add("GOST3411WITHGOST3410", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
- algorithms.Add("GOST3411WITHGOST3410-94", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
-
- oids.Add(PkcsObjectIdentifiers.MD2WithRsaEncryption, "MD2WITHRSA");
- oids.Add(PkcsObjectIdentifiers.MD5WithRsaEncryption, "MD5WITHRSA");
- oids.Add(PkcsObjectIdentifiers.Sha1WithRsaEncryption, "SHA1WITHRSA");
- oids.Add(PkcsObjectIdentifiers.Sha224WithRsaEncryption, "SHA224WITHRSA");
- oids.Add(PkcsObjectIdentifiers.Sha256WithRsaEncryption, "SHA256WITHRSA");
- oids.Add(PkcsObjectIdentifiers.Sha384WithRsaEncryption, "SHA384WITHRSA");
- oids.Add(PkcsObjectIdentifiers.Sha512WithRsaEncryption, "SHA512WITHRSA");
- oids.Add(TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160, "RIPEMD160WITHRSA");
- oids.Add(TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128, "RIPEMD128WITHRSA");
- oids.Add(TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256, "RIPEMD256WITHRSA");
- oids.Add(X9ObjectIdentifiers.IdDsaWithSha1, "SHA1WITHDSA");
- oids.Add(NistObjectIdentifiers.DsaWithSha224, "SHA224WITHDSA");
- oids.Add(NistObjectIdentifiers.DsaWithSha256, "SHA256WITHDSA");
- oids.Add(X9ObjectIdentifiers.ECDsaWithSha1, "SHA1WITHECDSA");
- oids.Add(X9ObjectIdentifiers.ECDsaWithSha224, "SHA224WITHECDSA");
- oids.Add(X9ObjectIdentifiers.ECDsaWithSha256, "SHA256WITHECDSA");
- oids.Add(X9ObjectIdentifiers.ECDsaWithSha384, "SHA384WITHECDSA");
- oids.Add(X9ObjectIdentifiers.ECDsaWithSha512, "SHA512WITHECDSA");
- oids.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94, "GOST3411WITHGOST3410");
-
- //
- // 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);
- }
-
- internal static DerObjectIdentifier GetAlgorithmOid(
- string algorithmName)
- {
- algorithmName = Platform.ToUpperInvariant(algorithmName);
-
- if (algorithms.Contains(algorithmName))
- {
- return (DerObjectIdentifier)algorithms[algorithmName];
- }
-
- return new DerObjectIdentifier(algorithmName);
- }
-
-
- internal static string GetAlgorithmName(
- DerObjectIdentifier oid)
- {
- if (oids.Contains(oid))
- {
- return (string)oids[oid];
- }
-
- return oid.Id;
- }
-
- internal static AlgorithmIdentifier GetSigAlgID(
- DerObjectIdentifier sigOid)
- {
- if (noParams.Contains(sigOid))
- {
- return new AlgorithmIdentifier(sigOid);
- }
-
- return new AlgorithmIdentifier(sigOid, DerNull.Instance);
- }
-
- internal static IEnumerable AlgNames
- {
- get { return new EnumerableProxy(algorithms.Keys); }
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/Req.cs b/BCCrypto/src/ocsp/Req.cs
deleted file mode 100644
index 68fd9f1..0000000
--- a/BCCrypto/src/ocsp/Req.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Ocsp
-{
- public class Req
- : X509ExtensionBase
- {
- private Request req;
-
- public Req(
- Request req)
- {
- this.req = req;
- }
-
- public CertificateID GetCertID()
- {
- return new CertificateID(req.ReqCert);
- }
-
- public X509Extensions SingleRequestExtensions
- {
- get { return req.SingleRequestExtensions; }
- }
-
- protected override X509Extensions GetX509Extensions()
- {
- return SingleRequestExtensions;
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/RespData.cs b/BCCrypto/src/ocsp/RespData.cs
deleted file mode 100644
index 105726c..0000000
--- a/BCCrypto/src/ocsp/RespData.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Ocsp
-{
- public class RespData
- : X509ExtensionBase
- {
- internal readonly ResponseData data;
-
- public RespData(
- ResponseData data)
- {
- this.data = data;
- }
-
- public int Version
- {
- get { return data.Version.Value.IntValue + 1; }
- }
-
- public RespID GetResponderId()
- {
- return new RespID(data.ResponderID);
- }
-
- public DateTime ProducedAt
- {
- get { return data.ProducedAt.ToDateTime(); }
- }
-
- public SingleResp[] GetResponses()
- {
- Asn1Sequence s = data.Responses;
- SingleResp[] rs = new SingleResp[s.Count];
-
- for (int i = 0; i != rs.Length; i++)
- {
- rs[i] = new SingleResp(SingleResponse.GetInstance(s[i]));
- }
-
- return rs;
- }
-
- public X509Extensions ResponseExtensions
- {
- get { return data.ResponseExtensions; }
- }
-
- protected override X509Extensions GetX509Extensions()
- {
- return ResponseExtensions;
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/RespID.cs b/BCCrypto/src/ocsp/RespID.cs
deleted file mode 100644
index 3238b26..0000000
--- a/BCCrypto/src/ocsp/RespID.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Ocsp
-{
- /**
- * Carrier for a ResponderID.
- */
- public class RespID
- {
- internal readonly ResponderID id;
-
- public RespID(
- ResponderID id)
- {
- this.id = id;
- }
-
- public RespID(
- X509Name name)
- {
- this.id = new ResponderID(name);
- }
-
- public RespID(
- AsymmetricKeyParameter publicKey)
- {
- try
- {
- SubjectPublicKeyInfo info = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey);
-
- byte[] keyHash = DigestUtilities.CalculateDigest("SHA1", info.PublicKeyData.GetBytes());
-
- this.id = new ResponderID(new DerOctetString(keyHash));
- }
- catch (Exception e)
- {
- throw new OcspException("problem creating ID: " + e, e);
- }
- }
-
- public ResponderID ToAsn1Object()
- {
- return id;
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- RespID other = obj as RespID;
-
- if (other == null)
- return false;
-
- return id.Equals(other.id);
- }
-
- public override int GetHashCode()
- {
- return id.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/RevokedStatus.cs b/BCCrypto/src/ocsp/RevokedStatus.cs
deleted file mode 100644
index 6e5ad1b..0000000
--- a/BCCrypto/src/ocsp/RevokedStatus.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Ocsp
-{
- /**
- * wrapper for the RevokedInfo object
- */
- public class RevokedStatus
- : CertificateStatus
- {
- internal readonly RevokedInfo info;
-
- public RevokedStatus(
- RevokedInfo info)
- {
- this.info = info;
- }
-
- public RevokedStatus(
- DateTime revocationDate,
- int reason)
- {
- this.info = new RevokedInfo(new DerGeneralizedTime(revocationDate), new CrlReason(reason));
- }
-
- public DateTime RevocationTime
- {
- get { return info.RevocationTime.ToDateTime(); }
- }
-
- public bool HasRevocationReason
- {
- get { return (info.RevocationReason != null); }
- }
-
- /**
- * return the revocation reason. Note: this field is optional, test for it
- * with hasRevocationReason() first.
- * @exception InvalidOperationException if a reason is asked for and none is avaliable
- */
- public int RevocationReason
- {
- get
- {
- if (info.RevocationReason == null)
- {
- throw new InvalidOperationException("attempt to get a reason where none is available");
- }
-
- return info.RevocationReason.Value.IntValue;
- }
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/SingleResp.cs b/BCCrypto/src/ocsp/SingleResp.cs
deleted file mode 100644
index b8979c5..0000000
--- a/BCCrypto/src/ocsp/SingleResp.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ocsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities.Date;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Ocsp
-{
- public class SingleResp
- : X509ExtensionBase
- {
- internal readonly SingleResponse resp;
-
- public SingleResp(
- SingleResponse resp)
- {
- this.resp = resp;
- }
-
- public CertificateID GetCertID()
- {
- return new CertificateID(resp.CertId);
- }
-
- /**
- * Return the status object for the response - null indicates good.
- *
- * @return the status object for the response, null if it is good.
- */
- public object GetCertStatus()
- {
- CertStatus s = resp.CertStatus;
-
- if (s.TagNo == 0)
- {
- return null; // good
- }
-
- if (s.TagNo == 1)
- {
- return new RevokedStatus(RevokedInfo.GetInstance(s.Status));
- }
-
- return new UnknownStatus();
- }
-
- public DateTime ThisUpdate
- {
- get { return resp.ThisUpdate.ToDateTime(); }
- }
-
- /**
- * return the NextUpdate value - note: this is an optional field so may
- * be returned as null.
- *
- * @return nextUpdate, or null if not present.
- */
- public DateTimeObject NextUpdate
- {
- get
- {
- return resp.NextUpdate == null
- ? null
- : new DateTimeObject(resp.NextUpdate.ToDateTime());
- }
- }
-
- public X509Extensions SingleExtensions
- {
- get { return resp.SingleExtensions; }
- }
-
- protected override X509Extensions GetX509Extensions()
- {
- return SingleExtensions;
- }
- }
-}
diff --git a/BCCrypto/src/ocsp/UnknownStatus.cs b/BCCrypto/src/ocsp/UnknownStatus.cs
deleted file mode 100644
index c0f7a3a..0000000
--- a/BCCrypto/src/ocsp/UnknownStatus.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Ocsp
-{
- /**
- * wrapper for the UnknownInfo object
- */
- public class UnknownStatus
- : CertificateStatus
- {
- public UnknownStatus()
- {
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/IStreamGenerator.cs b/BCCrypto/src/openpgp/IStreamGenerator.cs
deleted file mode 100644
index 379213a..0000000
--- a/BCCrypto/src/openpgp/IStreamGenerator.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- public interface IStreamGenerator
- {
- void Close();
- }
-}
diff --git a/BCCrypto/src/openpgp/PGPKeyRing.cs b/BCCrypto/src/openpgp/PGPKeyRing.cs
deleted file mode 100644
index 6426f3f..0000000
--- a/BCCrypto/src/openpgp/PGPKeyRing.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- public abstract class PgpKeyRing
- : PgpObject
- {
- internal PgpKeyRing()
- {
- }
-
- internal static TrustPacket ReadOptionalTrustPacket(
- BcpgInputStream bcpgInput)
- {
- return (bcpgInput.NextPacketTag() == PacketTag.Trust)
- ? (TrustPacket) bcpgInput.ReadPacket()
- : null;
- }
-
- internal static IList ReadSignaturesAndTrust(
- BcpgInputStream bcpgInput)
- {
- try
- {
- IList sigList = Platform.CreateArrayList();
-
- while (bcpgInput.NextPacketTag() == PacketTag.Signature)
- {
- SignaturePacket signaturePacket = (SignaturePacket) bcpgInput.ReadPacket();
- TrustPacket trustPacket = ReadOptionalTrustPacket(bcpgInput);
-
- sigList.Add(new PgpSignature(signaturePacket, trustPacket));
- }
-
- return sigList;
- }
- catch (PgpException e)
- {
- throw new IOException("can't create signature object: " + e.Message, e);
- }
- }
-
- internal static void ReadUserIDs(
- BcpgInputStream bcpgInput,
- out IList ids,
- out IList idTrusts,
- out IList idSigs)
- {
- ids = Platform.CreateArrayList();
- idTrusts = Platform.CreateArrayList();
- idSigs = Platform.CreateArrayList();
-
- while (bcpgInput.NextPacketTag() == PacketTag.UserId
- || bcpgInput.NextPacketTag() == PacketTag.UserAttribute)
- {
- Packet obj = bcpgInput.ReadPacket();
- if (obj is UserIdPacket)
- {
- UserIdPacket id = (UserIdPacket)obj;
- ids.Add(id.GetId());
- }
- else
- {
- UserAttributePacket user = (UserAttributePacket) obj;
- ids.Add(new PgpUserAttributeSubpacketVector(user.GetSubpackets()));
- }
-
- idTrusts.Add(
- ReadOptionalTrustPacket(bcpgInput));
-
- idSigs.Add(
- ReadSignaturesAndTrust(bcpgInput));
- }
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PGPObject.cs b/BCCrypto/src/openpgp/PGPObject.cs
deleted file mode 100644
index d38276c..0000000
--- a/BCCrypto/src/openpgp/PGPObject.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- public abstract class PgpObject
- {
- internal PgpObject()
- {
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PGPUserAttributeSubpacketVectorGenerator.cs b/BCCrypto/src/openpgp/PGPUserAttributeSubpacketVectorGenerator.cs
deleted file mode 100644
index 9d56c8b..0000000
--- a/BCCrypto/src/openpgp/PGPUserAttributeSubpacketVectorGenerator.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Bcpg.Attr;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- public class PgpUserAttributeSubpacketVectorGenerator
- {
- private IList list = Platform.CreateArrayList();
-
- public virtual void SetImageAttribute(
- ImageAttrib.Format imageType,
- byte[] imageData)
- {
- if (imageData == null)
- throw new ArgumentException("attempt to set null image", "imageData");
-
- list.Add(new ImageAttrib(imageType, imageData));
- }
-
- public virtual PgpUserAttributeSubpacketVector Generate()
- {
- UserAttributeSubpacket[] a = new UserAttributeSubpacket[list.Count];
- for (int i = 0; i < list.Count; ++i)
- {
- a[i] = (UserAttributeSubpacket)list[i];
- }
- return new PgpUserAttributeSubpacketVector(a);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpCompressedData.cs b/BCCrypto/src/openpgp/PgpCompressedData.cs
deleted file mode 100644
index e64a17c..0000000
--- a/BCCrypto/src/openpgp/PgpCompressedData.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using System.IO;
-
-using Org.BouncyCastle.Apache.Bzip2;
-using Org.BouncyCastle.Utilities.Zlib;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Compressed data objects
- public class PgpCompressedData
- : PgpObject
- {
- private readonly CompressedDataPacket data;
-
- public PgpCompressedData(
- BcpgInputStream bcpgInput)
- {
- data = (CompressedDataPacket) bcpgInput.ReadPacket();
- }
-
- /// The algorithm used for compression
- public CompressionAlgorithmTag Algorithm
- {
- get { return data.Algorithm; }
- }
-
- /// Get the raw input stream contained in the object.
- public Stream GetInputStream()
- {
- return data.GetInputStream();
- }
-
- /// Return an uncompressed input stream which allows reading of the compressed data.
- public Stream GetDataStream()
- {
- switch (Algorithm)
- {
- case CompressionAlgorithmTag.Uncompressed:
- return GetInputStream();
- case CompressionAlgorithmTag.Zip:
- return new ZInputStream(GetInputStream(), true);
- case CompressionAlgorithmTag.ZLib:
- return new ZInputStream(GetInputStream());
- case CompressionAlgorithmTag.BZip2:
- return new CBZip2InputStream(GetInputStream());
- default:
- throw new PgpException("can't recognise compression algorithm: " + Algorithm);
- }
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpCompressedDataGenerator.cs b/BCCrypto/src/openpgp/PgpCompressedDataGenerator.cs
deleted file mode 100644
index 51b6452..0000000
--- a/BCCrypto/src/openpgp/PgpCompressedDataGenerator.cs
+++ /dev/null
@@ -1,221 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Apache.Bzip2;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Zlib;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Class for producing compressed data packets.
- public class PgpCompressedDataGenerator
- : IStreamGenerator
- {
- private readonly CompressionAlgorithmTag algorithm;
- private readonly int compression;
-
- private Stream dOut;
- private BcpgOutputStream pkOut;
-
- public PgpCompressedDataGenerator(
- CompressionAlgorithmTag algorithm)
- : this(algorithm, JZlib.Z_DEFAULT_COMPRESSION)
- {
- }
-
- public PgpCompressedDataGenerator(
- CompressionAlgorithmTag algorithm,
- int compression)
- {
- switch (algorithm)
- {
- case CompressionAlgorithmTag.Uncompressed:
- case CompressionAlgorithmTag.Zip:
- case CompressionAlgorithmTag.ZLib:
- case CompressionAlgorithmTag.BZip2:
- break;
- default:
- throw new ArgumentException("unknown compression algorithm", "algorithm");
- }
-
- if (compression != JZlib.Z_DEFAULT_COMPRESSION)
- {
- if ((compression < JZlib.Z_NO_COMPRESSION) || (compression > JZlib.Z_BEST_COMPRESSION))
- {
- throw new ArgumentException("unknown compression level: " + compression);
- }
- }
-
- this.algorithm = algorithm;
- this.compression = compression;
- }
-
- ///
- ///
- /// Return an output stream which will save the data being written to
- /// the compressed object.
- ///
- ///
- /// The stream created can be closed off by either calling Close()
- /// on the stream or Close() on the generator. Closing the returned
- /// stream does not close off the Stream parameter outStr .
- ///
- ///
- /// Stream to be used for output.
- /// A Stream for output of the compressed data.
- ///
- ///
- ///
- public Stream Open(
- Stream outStr)
- {
- if (dOut != null)
- throw new InvalidOperationException("generator already in open state");
- if (outStr == null)
- throw new ArgumentNullException("outStr");
-
- this.pkOut = new BcpgOutputStream(outStr, PacketTag.CompressedData);
-
- doOpen();
-
- return new WrappedGeneratorStream(this, dOut);
- }
-
- ///
- ///
- /// Return an output stream which will compress the data as it is written to it.
- /// The stream will be written out in chunks according to the size of the passed in buffer.
- ///
- ///
- /// The stream created can be closed off by either calling Close()
- /// on the stream or Close() on the generator. Closing the returned
- /// stream does not close off the Stream parameter outStr .
- ///
- ///
- /// Note : if the buffer is not a power of 2 in length only the largest power of 2
- /// bytes worth of the buffer will be used.
- ///
- ///
- /// Note : using this may break compatibility with RFC 1991 compliant tools.
- /// Only recent OpenPGP implementations are capable of accepting these streams.
- ///
- ///
- /// Stream to be used for output.
- /// The buffer to use.
- /// A Stream for output of the compressed data.
- ///
- ///
- ///
- ///
- public Stream Open(
- Stream outStr,
- byte[] buffer)
- {
- if (dOut != null)
- throw new InvalidOperationException("generator already in open state");
- if (outStr == null)
- throw new ArgumentNullException("outStr");
- if (buffer == null)
- throw new ArgumentNullException("buffer");
-
- this.pkOut = new BcpgOutputStream(outStr, PacketTag.CompressedData, buffer);
-
- doOpen();
-
- return new WrappedGeneratorStream(this, dOut);
- }
-
- private void doOpen()
- {
- pkOut.WriteByte((byte) algorithm);
-
- switch (algorithm)
- {
- case CompressionAlgorithmTag.Uncompressed:
- dOut = pkOut;
- break;
- case CompressionAlgorithmTag.Zip:
- dOut = new SafeZOutputStream(pkOut, compression, true);
- break;
- case CompressionAlgorithmTag.ZLib:
- dOut = new SafeZOutputStream(pkOut, compression, false);
- break;
- case CompressionAlgorithmTag.BZip2:
- dOut = new SafeCBZip2OutputStream(pkOut);
- break;
- default:
- // Constructor should guard against this possibility
- throw new InvalidOperationException();
- }
- }
-
- /// Close the compressed object. summary>
- public void Close()
- {
- if (dOut != null)
- {
- if (dOut != pkOut)
- {
- Platform.Dispose(dOut);
- }
- dOut = null;
-
- pkOut.Finish();
- pkOut.Flush();
- pkOut = null;
- }
- }
-
- private class SafeCBZip2OutputStream : CBZip2OutputStream
- {
- public SafeCBZip2OutputStream(Stream output)
- : base(output)
- {
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Finish();
- return;
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Finish();
- }
-#endif
- }
-
- private class SafeZOutputStream : ZOutputStream
- {
- public SafeZOutputStream(Stream output, int level, bool nowrap)
- : base(output, level, nowrap)
- {
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Finish();
- End();
- return;
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Finish();
- End();
- }
-#endif
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpDataValidationException.cs b/BCCrypto/src/openpgp/PgpDataValidationException.cs
deleted file mode 100644
index d06833c..0000000
--- a/BCCrypto/src/openpgp/PgpDataValidationException.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- ///
- /// Thrown if the IV at the start of a data stream indicates the wrong key is being used.
- ///
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class PgpDataValidationException
- : PgpException
- {
- public PgpDataValidationException() : base() {}
- public PgpDataValidationException(string message) : base(message) {}
- public PgpDataValidationException(string message, Exception exception) : base(message, exception) {}
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpEncryptedData.cs b/BCCrypto/src/openpgp/PgpEncryptedData.cs
deleted file mode 100644
index 558e0b8..0000000
--- a/BCCrypto/src/openpgp/PgpEncryptedData.cs
+++ /dev/null
@@ -1,151 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.IO;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- public abstract class PgpEncryptedData
- {
- internal class TruncatedStream
- : BaseInputStream
- {
- private const int LookAheadSize = 22;
- private const int LookAheadBufSize = 512;
- private const int LookAheadBufLimit = LookAheadBufSize - LookAheadSize;
-
- private readonly Stream inStr;
- private readonly byte[] lookAhead = new byte[LookAheadBufSize];
- private int bufStart, bufEnd;
-
- internal TruncatedStream(
- Stream inStr)
- {
- int numRead = Streams.ReadFully(inStr, lookAhead, 0, lookAhead.Length);
-
- if (numRead < LookAheadSize)
- throw new EndOfStreamException();
-
- this.inStr = inStr;
- this.bufStart = 0;
- this.bufEnd = numRead - LookAheadSize;
- }
-
- private int FillBuffer()
- {
- if (bufEnd < LookAheadBufLimit)
- return 0;
-
- Debug.Assert(bufStart == LookAheadBufLimit);
- Debug.Assert(bufEnd == LookAheadBufLimit);
-
- Array.Copy(lookAhead, LookAheadBufLimit, lookAhead, 0, LookAheadSize);
- bufEnd = Streams.ReadFully(inStr, lookAhead, LookAheadSize, LookAheadBufLimit);
- bufStart = 0;
- return bufEnd;
- }
-
- public override int ReadByte()
- {
- if (bufStart < bufEnd)
- return lookAhead[bufStart++];
-
- if (FillBuffer() < 1)
- return -1;
-
- return lookAhead[bufStart++];
- }
-
- public override int Read(byte[] buf, int off, int len)
- {
- int avail = bufEnd - bufStart;
-
- int pos = off;
- while (len > avail)
- {
- Array.Copy(lookAhead, bufStart, buf, pos, avail);
-
- bufStart += avail;
- pos += avail;
- len -= avail;
-
- if ((avail = FillBuffer()) < 1)
- return pos - off;
- }
-
- Array.Copy(lookAhead, bufStart, buf, pos, len);
- bufStart += len;
-
- return pos + len - off;
- }
-
- internal byte[] GetLookAhead()
- {
- byte[] temp = new byte[LookAheadSize];
- Array.Copy(lookAhead, bufStart, temp, 0, LookAheadSize);
- return temp;
- }
- }
-
- internal InputStreamPacket encData;
- internal Stream encStream;
- internal TruncatedStream truncStream;
-
- internal PgpEncryptedData(
- InputStreamPacket encData)
- {
- this.encData = encData;
- }
-
- /// Return the raw input stream for the data stream.
- public virtual Stream GetInputStream()
- {
- return encData.GetInputStream();
- }
-
- /// Return true if the message is integrity protected.
- /// True, if there is a modification detection code namespace associated
- /// with this stream.
- public bool IsIntegrityProtected()
- {
- return encData is SymmetricEncIntegrityPacket;
- }
-
- /// Note: This can only be called after the message has been read.
- /// True, if the message verifies, false otherwise
- public bool Verify()
- {
- if (!IsIntegrityProtected())
- throw new PgpException("data not integrity protected.");
-
- DigestStream dIn = (DigestStream) encStream;
-
- //
- // make sure we are at the end.
- //
- while (encStream.ReadByte() >= 0)
- {
- // do nothing
- }
-
- //
- // process the MDC packet
- //
- byte[] lookAhead = truncStream.GetLookAhead();
-
- IDigest hash = dIn.ReadDigest();
- hash.BlockUpdate(lookAhead, 0, 2);
- byte[] digest = DigestUtilities.DoFinal(hash);
-
- byte[] streamDigest = new byte[digest.Length];
- Array.Copy(lookAhead, 2, streamDigest, 0, streamDigest.Length);
-
- return Arrays.ConstantTimeAreEqual(digest, streamDigest);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpEncryptedDataGenerator.cs b/BCCrypto/src/openpgp/PgpEncryptedDataGenerator.cs
deleted file mode 100644
index 014281b..0000000
--- a/BCCrypto/src/openpgp/PgpEncryptedDataGenerator.cs
+++ /dev/null
@@ -1,598 +0,0 @@
-using System;
-using System.Collections;
-using System.Diagnostics;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Generator for encrypted objects.
- public class PgpEncryptedDataGenerator
- : IStreamGenerator
- {
- private BcpgOutputStream pOut;
- private CipherStream cOut;
- private IBufferedCipher c;
- private bool withIntegrityPacket;
- private bool oldFormat;
- private DigestStream digestOut;
-
- private abstract class EncMethod
- : ContainedPacket
- {
- protected byte[] sessionInfo;
- protected SymmetricKeyAlgorithmTag encAlgorithm;
- protected KeyParameter key;
-
- public abstract void AddSessionInfo(byte[] si, SecureRandom random);
- }
-
- private class PbeMethod
- : EncMethod
- {
- private S2k s2k;
-
- internal PbeMethod(
- SymmetricKeyAlgorithmTag encAlgorithm,
- S2k s2k,
- KeyParameter key)
- {
- this.encAlgorithm = encAlgorithm;
- this.s2k = s2k;
- this.key = key;
- }
-
- public KeyParameter GetKey()
- {
- return key;
- }
-
- public override void AddSessionInfo(
- byte[] si,
- SecureRandom random)
- {
- string cName = PgpUtilities.GetSymmetricCipherName(encAlgorithm);
- IBufferedCipher c = CipherUtilities.GetCipher(cName + "/CFB/NoPadding");
-
- byte[] iv = new byte[c.GetBlockSize()];
- c.Init(true, new ParametersWithRandom(new ParametersWithIV(key, iv), random));
-
- this.sessionInfo = c.DoFinal(si, 0, si.Length - 2);
- }
-
- public override void Encode(BcpgOutputStream pOut)
- {
- SymmetricKeyEncSessionPacket pk = new SymmetricKeyEncSessionPacket(
- encAlgorithm, s2k, sessionInfo);
-
- pOut.WritePacket(pk);
- }
- }
-
- private class PubMethod
- : EncMethod
- {
- internal PgpPublicKey pubKey;
- internal byte[][] data;
-
- internal PubMethod(PgpPublicKey pubKey)
- {
- this.pubKey = pubKey;
- }
-
- public override void AddSessionInfo(
- byte[] sessionInfo,
- SecureRandom random)
- {
- byte[] encryptedSessionInfo = EncryptSessionInfo(sessionInfo, random);
-
- this.data = ProcessSessionInfo(encryptedSessionInfo);
- }
-
- private byte[] EncryptSessionInfo(byte[] sessionInfo, SecureRandom random)
- {
- if (pubKey.Algorithm != PublicKeyAlgorithmTag.ECDH)
- {
- IBufferedCipher c;
- switch (pubKey.Algorithm)
- {
- case PublicKeyAlgorithmTag.RsaEncrypt:
- case PublicKeyAlgorithmTag.RsaGeneral:
- c = CipherUtilities.GetCipher("RSA//PKCS1Padding");
- break;
- case PublicKeyAlgorithmTag.ElGamalEncrypt:
- case PublicKeyAlgorithmTag.ElGamalGeneral:
- c = CipherUtilities.GetCipher("ElGamal/ECB/PKCS1Padding");
- break;
- case PublicKeyAlgorithmTag.Dsa:
- throw new PgpException("Can't use DSA for encryption.");
- case PublicKeyAlgorithmTag.ECDsa:
- throw new PgpException("Can't use ECDSA for encryption.");
- default:
- throw new PgpException("unknown asymmetric algorithm: " + pubKey.Algorithm);
- }
-
- AsymmetricKeyParameter akp = pubKey.GetKey();
- c.Init(true, new ParametersWithRandom(akp, random));
- return c.DoFinal(sessionInfo);
- }
-
- ECDHPublicBcpgKey ecKey = (ECDHPublicBcpgKey)pubKey.PublicKeyPacket.Key;
-
- // Generate the ephemeral key pair
- IAsymmetricCipherKeyPairGenerator gen = GeneratorUtilities.GetKeyPairGenerator("ECDH");
- gen.Init(new ECKeyGenerationParameters(ecKey.CurveOid, random));
-
- AsymmetricCipherKeyPair ephKp = gen.GenerateKeyPair();
- ECPrivateKeyParameters ephPriv = (ECPrivateKeyParameters)ephKp.Private;
- ECPublicKeyParameters ephPub = (ECPublicKeyParameters)ephKp.Public;
-
- ECPublicKeyParameters pub = (ECPublicKeyParameters)pubKey.GetKey();
- ECPoint S = pub.Q.Multiply(ephPriv.D).Normalize();
-
- KeyParameter key = new KeyParameter(Rfc6637Utilities.CreateKey(pubKey.PublicKeyPacket, S));
-
- IWrapper w = PgpUtilities.CreateWrapper(ecKey.SymmetricKeyAlgorithm);
- w.Init(true, new ParametersWithRandom(key, random));
-
- byte[] paddedSessionData = PgpPad.PadSessionData(sessionInfo);
-
- byte[] C = w.Wrap(paddedSessionData, 0, paddedSessionData.Length);
- byte[] VB = new MPInteger(new BigInteger(1, ephPub.Q.GetEncoded(false))).GetEncoded();
-
- byte[] rv = new byte[VB.Length + 1 + C.Length];
-
- Array.Copy(VB, 0, rv, 0, VB.Length);
- rv[VB.Length] = (byte)C.Length;
- Array.Copy(C, 0, rv, VB.Length + 1, C.Length);
-
- return rv;
- }
-
- private byte[][] ProcessSessionInfo(byte[] encryptedSessionInfo)
- {
- byte[][] data;
-
- switch (pubKey.Algorithm)
- {
- case PublicKeyAlgorithmTag.RsaEncrypt:
- case PublicKeyAlgorithmTag.RsaGeneral:
- data = new byte[][] { ConvertToEncodedMpi(encryptedSessionInfo) };
- break;
- case PublicKeyAlgorithmTag.ElGamalEncrypt:
- case PublicKeyAlgorithmTag.ElGamalGeneral:
- int halfLength = encryptedSessionInfo.Length / 2;
- byte[] b1 = new byte[halfLength];
- byte[] b2 = new byte[halfLength];
-
- Array.Copy(encryptedSessionInfo, 0, b1, 0, halfLength);
- Array.Copy(encryptedSessionInfo, halfLength, b2, 0, halfLength);
-
- data = new byte[][] {
- ConvertToEncodedMpi(b1),
- ConvertToEncodedMpi(b2),
- };
- break;
- case PublicKeyAlgorithmTag.ECDH:
- data = new byte[][]{ encryptedSessionInfo };
- break;
- default:
- throw new PgpException("unknown asymmetric algorithm: " + pubKey.Algorithm);
- }
-
- return data;
- }
-
- private byte[] ConvertToEncodedMpi(byte[] encryptedSessionInfo)
- {
- try
- {
- return new MPInteger(new BigInteger(1, encryptedSessionInfo)).GetEncoded();
- }
- catch (IOException e)
- {
- throw new PgpException("Invalid MPI encoding: " + e.Message, e);
- }
- }
-
- public override void Encode(BcpgOutputStream pOut)
- {
- PublicKeyEncSessionPacket pk = new PublicKeyEncSessionPacket(pubKey.KeyId, pubKey.Algorithm, data);
-
- pOut.WritePacket(pk);
- }
- }
-
- private readonly IList methods = Platform.CreateArrayList();
- private readonly SymmetricKeyAlgorithmTag defAlgorithm;
- private readonly SecureRandom rand;
-
- public PgpEncryptedDataGenerator(
- SymmetricKeyAlgorithmTag encAlgorithm)
- {
- this.defAlgorithm = encAlgorithm;
- this.rand = new SecureRandom();
- }
-
- public PgpEncryptedDataGenerator(
- SymmetricKeyAlgorithmTag encAlgorithm,
- bool withIntegrityPacket)
- {
- this.defAlgorithm = encAlgorithm;
- this.withIntegrityPacket = withIntegrityPacket;
- this.rand = new SecureRandom();
- }
-
- /// Existing SecureRandom constructor.
- /// The symmetric algorithm to use.
- /// Source of randomness.
- public PgpEncryptedDataGenerator(
- SymmetricKeyAlgorithmTag encAlgorithm,
- SecureRandom rand)
- {
- this.defAlgorithm = encAlgorithm;
- this.rand = rand;
- }
-
- /// Creates a cipher stream which will have an integrity packet associated with it.
- public PgpEncryptedDataGenerator(
- SymmetricKeyAlgorithmTag encAlgorithm,
- bool withIntegrityPacket,
- SecureRandom rand)
- {
- this.defAlgorithm = encAlgorithm;
- this.rand = rand;
- this.withIntegrityPacket = withIntegrityPacket;
- }
-
- /// Base constructor.
- /// The symmetric algorithm to use.
- /// Source of randomness.
- /// PGP 2.6.x compatibility required.
- public PgpEncryptedDataGenerator(
- SymmetricKeyAlgorithmTag encAlgorithm,
- SecureRandom rand,
- bool oldFormat)
- {
- this.defAlgorithm = encAlgorithm;
- this.rand = rand;
- this.oldFormat = oldFormat;
- }
-
- ///
- /// Add a PBE encryption method to the encrypted object using the default algorithm (S2K_SHA1).
- ///
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- [Obsolete("Use version that takes an explicit s2kDigest parameter")]
- public void AddMethod(char[] passPhrase)
- {
- AddMethod(passPhrase, HashAlgorithmTag.Sha1);
- }
-
- /// Add a PBE encryption method to the encrypted object.
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- public void AddMethod(char[] passPhrase, HashAlgorithmTag s2kDigest)
- {
- DoAddMethod(PgpUtilities.EncodePassPhrase(passPhrase, false), true, s2kDigest);
- }
-
- /// Add a PBE encryption method to the encrypted object.
- ///
- /// The passphrase is encoded to bytes using UTF8 (Encoding.UTF8.GetBytes).
- ///
- public void AddMethodUtf8(char[] passPhrase, HashAlgorithmTag s2kDigest)
- {
- DoAddMethod(PgpUtilities.EncodePassPhrase(passPhrase, true), true, s2kDigest);
- }
-
- /// Add a PBE encryption method to the encrypted object.
- ///
- /// Allows the caller to handle the encoding of the passphrase to bytes.
- ///
- public void AddMethodRaw(byte[] rawPassPhrase, HashAlgorithmTag s2kDigest)
- {
- DoAddMethod(rawPassPhrase, false, s2kDigest);
- }
-
- internal void DoAddMethod(byte[] rawPassPhrase, bool clearPassPhrase, HashAlgorithmTag s2kDigest)
- {
- S2k s2k = PgpUtilities.GenerateS2k(s2kDigest, 0x60, rand);
-
- methods.Add(new PbeMethod(defAlgorithm, s2k, PgpUtilities.DoMakeKeyFromPassPhrase(defAlgorithm, s2k, rawPassPhrase, clearPassPhrase)));
- }
-
- /// Add a public key encrypted session key to the encrypted object.
- public void AddMethod(
- PgpPublicKey key)
- {
- if (!key.IsEncryptionKey)
- {
- throw new ArgumentException("passed in key not an encryption key!");
- }
-
- methods.Add(new PubMethod(key));
- }
-
- private void AddCheckSum(
- byte[] sessionInfo)
- {
- Debug.Assert(sessionInfo != null);
- Debug.Assert(sessionInfo.Length >= 3);
-
- int check = 0;
-
- for (int i = 1; i < sessionInfo.Length - 2; i++)
- {
- check += sessionInfo[i];
- }
-
- sessionInfo[sessionInfo.Length - 2] = (byte)(check >> 8);
- sessionInfo[sessionInfo.Length - 1] = (byte)(check);
- }
-
- private byte[] CreateSessionInfo(
- SymmetricKeyAlgorithmTag algorithm,
- KeyParameter key)
- {
- byte[] keyBytes = key.GetKey();
- byte[] sessionInfo = new byte[keyBytes.Length + 3];
- sessionInfo[0] = (byte) algorithm;
- keyBytes.CopyTo(sessionInfo, 1);
- AddCheckSum(sessionInfo);
- return sessionInfo;
- }
-
- ///
- ///
- /// If buffer is non null stream assumed to be partial, otherwise the length will be used
- /// to output a fixed length packet.
- ///
- ///
- /// The stream created can be closed off by either calling Close()
- /// on the stream or Close() on the generator. Closing the returned
- /// stream does not close off the Stream parameter outStr .
- ///
- ///
- private Stream Open(
- Stream outStr,
- long length,
- byte[] buffer)
- {
- if (cOut != null)
- throw new InvalidOperationException("generator already in open state");
- if (methods.Count == 0)
- throw new InvalidOperationException("No encryption methods specified");
- if (outStr == null)
- throw new ArgumentNullException("outStr");
-
- pOut = new BcpgOutputStream(outStr);
-
- KeyParameter key;
-
- if (methods.Count == 1)
- {
- if (methods[0] is PbeMethod)
- {
- PbeMethod m = (PbeMethod)methods[0];
-
- key = m.GetKey();
- }
- else
- {
- key = PgpUtilities.MakeRandomKey(defAlgorithm, rand);
-
- byte[] sessionInfo = CreateSessionInfo(defAlgorithm, key);
- PubMethod m = (PubMethod)methods[0];
-
- try
- {
- m.AddSessionInfo(sessionInfo, rand);
- }
- catch (Exception e)
- {
- throw new PgpException("exception encrypting session key", e);
- }
- }
-
- pOut.WritePacket((ContainedPacket)methods[0]);
- }
- else // multiple methods
- {
- key = PgpUtilities.MakeRandomKey(defAlgorithm, rand);
- byte[] sessionInfo = CreateSessionInfo(defAlgorithm, key);
-
- for (int i = 0; i != methods.Count; i++)
- {
- EncMethod m = (EncMethod)methods[i];
-
- try
- {
- m.AddSessionInfo(sessionInfo, rand);
- }
- catch (Exception e)
- {
- throw new PgpException("exception encrypting session key", e);
- }
-
- pOut.WritePacket(m);
- }
- }
-
- string cName = PgpUtilities.GetSymmetricCipherName(defAlgorithm);
- if (cName == null)
- {
- throw new PgpException("null cipher specified");
- }
-
- try
- {
- if (withIntegrityPacket)
- {
- cName += "/CFB/NoPadding";
- }
- else
- {
- cName += "/OpenPGPCFB/NoPadding";
- }
-
- c = CipherUtilities.GetCipher(cName);
-
- // TODO Confirm the IV should be all zero bytes (not inLineIv - see below)
- byte[] iv = new byte[c.GetBlockSize()];
- c.Init(true, new ParametersWithRandom(new ParametersWithIV(key, iv), rand));
-
- if (buffer == null)
- {
- //
- // we have to Add block size + 2 for the Generated IV and + 1 + 22 if integrity protected
- //
- if (withIntegrityPacket)
- {
- pOut = new BcpgOutputStream(outStr, PacketTag.SymmetricEncryptedIntegrityProtected, length + c.GetBlockSize() + 2 + 1 + 22);
- pOut.WriteByte(1); // version number
- }
- else
- {
- pOut = new BcpgOutputStream(outStr, PacketTag.SymmetricKeyEncrypted, length + c.GetBlockSize() + 2, oldFormat);
- }
- }
- else
- {
- if (withIntegrityPacket)
- {
- pOut = new BcpgOutputStream(outStr, PacketTag.SymmetricEncryptedIntegrityProtected, buffer);
- pOut.WriteByte(1); // version number
- }
- else
- {
- pOut = new BcpgOutputStream(outStr, PacketTag.SymmetricKeyEncrypted, buffer);
- }
- }
-
- int blockSize = c.GetBlockSize();
- byte[] inLineIv = new byte[blockSize + 2];
- rand.NextBytes(inLineIv, 0, blockSize);
- Array.Copy(inLineIv, inLineIv.Length - 4, inLineIv, inLineIv.Length - 2, 2);
-
- Stream myOut = cOut = new CipherStream(pOut, null, c);
-
- if (withIntegrityPacket)
- {
- string digestName = PgpUtilities.GetDigestName(HashAlgorithmTag.Sha1);
- IDigest digest = DigestUtilities.GetDigest(digestName);
- myOut = digestOut = new DigestStream(myOut, null, digest);
- }
-
- myOut.Write(inLineIv, 0, inLineIv.Length);
-
- return new WrappedGeneratorStream(this, myOut);
- }
- catch (Exception e)
- {
- throw new PgpException("Exception creating cipher", e);
- }
- }
-
- ///
- ///
- /// Return an output stream which will encrypt the data as it is written to it.
- ///
- ///
- /// The stream created can be closed off by either calling Close()
- /// on the stream or Close() on the generator. Closing the returned
- /// stream does not close off the Stream parameter outStr .
- ///
- ///
- public Stream Open(
- Stream outStr,
- long length)
- {
- return Open(outStr, length, null);
- }
-
- ///
- ///
- /// Return an output stream which will encrypt the data as it is written to it.
- /// The stream will be written out in chunks according to the size of the passed in buffer.
- ///
- ///
- /// The stream created can be closed off by either calling Close()
- /// on the stream or Close() on the generator. Closing the returned
- /// stream does not close off the Stream parameter outStr .
- ///
- ///
- /// Note : if the buffer is not a power of 2 in length only the largest power of 2
- /// bytes worth of the buffer will be used.
- ///
- ///
- public Stream Open(
- Stream outStr,
- byte[] buffer)
- {
- return Open(outStr, 0, buffer);
- }
-
- ///
- ///
- /// Close off the encrypted object - this is equivalent to calling Close() on the stream
- /// returned by the Open() method.
- ///
- ///
- /// Note : This does not close the underlying output stream, only the stream on top of
- /// it created by the Open() method.
- ///
- ///
- public void Close()
- {
- if (cOut != null)
- {
- // TODO Should this all be under the try/catch block?
- if (digestOut != null)
- {
- //
- // hand code a mod detection packet
- //
- BcpgOutputStream bOut = new BcpgOutputStream(
- digestOut, PacketTag.ModificationDetectionCode, 20);
-
- bOut.Flush();
- digestOut.Flush();
-
- // TODO
- byte[] dig = DigestUtilities.DoFinal(digestOut.WriteDigest());
- cOut.Write(dig, 0, dig.Length);
- }
-
- cOut.Flush();
-
- try
- {
- pOut.Write(c.DoFinal());
- pOut.Finish();
- }
- catch (Exception e)
- {
- throw new IOException(e.Message, e);
- }
-
- cOut = null;
- pOut = null;
- }
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpEncryptedDataList.cs b/BCCrypto/src/openpgp/PgpEncryptedDataList.cs
deleted file mode 100644
index 8dded7c..0000000
--- a/BCCrypto/src/openpgp/PgpEncryptedDataList.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// A holder for a list of PGP encryption method packets.
- public class PgpEncryptedDataList
- : PgpObject
- {
- private IList list = Platform.CreateArrayList();
- private InputStreamPacket data;
-
- public PgpEncryptedDataList(
- BcpgInputStream bcpgInput)
- {
- while (bcpgInput.NextPacketTag() == PacketTag.PublicKeyEncryptedSession
- || bcpgInput.NextPacketTag() == PacketTag.SymmetricKeyEncryptedSessionKey)
- {
- list.Add(bcpgInput.ReadPacket());
- }
-
- data = (InputStreamPacket)bcpgInput.ReadPacket();
-
- for (int i = 0; i != list.Count; i++)
- {
- if (list[i] is SymmetricKeyEncSessionPacket)
- {
- list[i] = new PgpPbeEncryptedData((SymmetricKeyEncSessionPacket) list[i], data);
- }
- else
- {
- list[i] = new PgpPublicKeyEncryptedData((PublicKeyEncSessionPacket) list[i], data);
- }
- }
- }
-
- public PgpEncryptedData this[int index]
- {
- get { return (PgpEncryptedData) list[index]; }
- }
-
- [Obsolete("Use 'object[index]' syntax instead")]
- public object Get(int index)
- {
- return this[index];
- }
-
- [Obsolete("Use 'Count' property instead")]
- public int Size
- {
- get { return list.Count; }
- }
-
- public int Count
- {
- get { return list.Count; }
- }
-
- public bool IsEmpty
- {
- get { return list.Count == 0; }
- }
-
- public IEnumerable GetEncryptedDataObjects()
- {
- return new EnumerableProxy(list);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpException.cs b/BCCrypto/src/openpgp/PgpException.cs
deleted file mode 100644
index 230dab8..0000000
--- a/BCCrypto/src/openpgp/PgpException.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Generic exception class for PGP encoding/decoding problems.
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class PgpException
- : Exception
- {
- public PgpException() : base() {}
- public PgpException(string message) : base(message) {}
- public PgpException(string message, Exception exception) : base(message, exception) {}
-
- [Obsolete("Use InnerException property")]
- public Exception UnderlyingException
- {
- get { return InnerException; }
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpExperimental.cs b/BCCrypto/src/openpgp/PgpExperimental.cs
deleted file mode 100644
index 8518335..0000000
--- a/BCCrypto/src/openpgp/PgpExperimental.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- public class PgpExperimental
- : PgpObject
- {
- private readonly ExperimentalPacket p;
-
- public PgpExperimental(
- BcpgInputStream bcpgIn)
- {
- p = (ExperimentalPacket) bcpgIn.ReadPacket();
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpKeyFlags.cs b/BCCrypto/src/openpgp/PgpKeyFlags.cs
deleted file mode 100644
index ea18006..0000000
--- a/BCCrypto/src/openpgp/PgpKeyFlags.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Key flag values for the KeyFlags subpacket.
- public abstract class PgpKeyFlags
- {
- public const int CanCertify = 0x01; // This key may be used to certify other keys.
- public const int CanSign = 0x02; // This key may be used to sign data.
- public const int CanEncryptCommunications = 0x04; // This key may be used to encrypt communications.
- public const int CanEncryptStorage = 0x08; // This key may be used to encrypt storage.
- public const int MaybeSplit = 0x10; // The private component of this key may have been split by a secret-sharing mechanism.
- public const int MaybeShared = 0x80; // The private component of this key may be in the possession of more than one person.
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpKeyPair.cs b/BCCrypto/src/openpgp/PgpKeyPair.cs
deleted file mode 100644
index 9cf78fa..0000000
--- a/BCCrypto/src/openpgp/PgpKeyPair.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- ///
- /// General class to handle JCA key pairs and convert them into OpenPGP ones.
- ///
- /// A word for the unwary, the KeyId for an OpenPGP public key is calculated from
- /// a hash that includes the time of creation, if you pass a different date to the
- /// constructor below with the same public private key pair the KeyIs will not be the
- /// same as for previous generations of the key, so ideally you only want to do
- /// this once.
- ///
- ///
- public class PgpKeyPair
- {
- private readonly PgpPublicKey pub;
- private readonly PgpPrivateKey priv;
-
- public PgpKeyPair(
- PublicKeyAlgorithmTag algorithm,
- AsymmetricCipherKeyPair keyPair,
- DateTime time)
- : this(algorithm, keyPair.Public, keyPair.Private, time)
- {
- }
-
- public PgpKeyPair(
- PublicKeyAlgorithmTag algorithm,
- AsymmetricKeyParameter pubKey,
- AsymmetricKeyParameter privKey,
- DateTime time)
- {
- this.pub = new PgpPublicKey(algorithm, pubKey, time);
- this.priv = new PgpPrivateKey(pub.KeyId, pub.PublicKeyPacket, privKey);
- }
-
- /// Create a key pair from a PgpPrivateKey and a PgpPublicKey.
- /// The public key.
- /// The private key.
- public PgpKeyPair(
- PgpPublicKey pub,
- PgpPrivateKey priv)
- {
- this.pub = pub;
- this.priv = priv;
- }
-
- /// The keyId associated with this key pair.
- public long KeyId
- {
- get { return pub.KeyId; }
- }
-
- public PgpPublicKey PublicKey
- {
- get { return pub; }
- }
-
- public PgpPrivateKey PrivateKey
- {
- get { return priv; }
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpKeyRingGenerator.cs b/BCCrypto/src/openpgp/PgpKeyRingGenerator.cs
deleted file mode 100644
index 4f6a4b1..0000000
--- a/BCCrypto/src/openpgp/PgpKeyRingGenerator.cs
+++ /dev/null
@@ -1,402 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- ///
- /// Generator for a PGP master and subkey ring.
- /// This class will generate both the secret and public key rings
- ///
- public class PgpKeyRingGenerator
- {
- private IList keys = Platform.CreateArrayList();
- private string id;
- private SymmetricKeyAlgorithmTag encAlgorithm;
- private HashAlgorithmTag hashAlgorithm;
- private int certificationLevel;
- private byte[] rawPassPhrase;
- private bool useSha1;
- private PgpKeyPair masterKey;
- private PgpSignatureSubpacketVector hashedPacketVector;
- private PgpSignatureSubpacketVector unhashedPacketVector;
- private SecureRandom rand;
-
- ///
- /// Create a new key ring generator using old style checksumming. It is recommended to use
- /// SHA1 checksumming where possible.
- ///
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- /// The certification level for keys on this ring.
- /// The master key pair.
- /// The id to be associated with the ring.
- /// The algorithm to be used to protect secret keys.
- /// The passPhrase to be used to protect secret keys.
- /// Packets to be included in the certification hash.
- /// Packets to be attached unhashed to the certification.
- /// input secured random.
- [Obsolete("Use version taking an explicit 'useSha1' parameter instead")]
- public PgpKeyRingGenerator(
- int certificationLevel,
- PgpKeyPair masterKey,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- char[] passPhrase,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, masterKey, id, encAlgorithm, passPhrase, false, hashedPackets, unhashedPackets, rand)
- {
- }
-
- ///
- /// Create a new key ring generator.
- ///
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- /// The certification level for keys on this ring.
- /// The master key pair.
- /// The id to be associated with the ring.
- /// The algorithm to be used to protect secret keys.
- /// The passPhrase to be used to protect secret keys.
- /// Checksum the secret keys with SHA1 rather than the older 16 bit checksum.
- /// Packets to be included in the certification hash.
- /// Packets to be attached unhashed to the certification.
- /// input secured random.
- public PgpKeyRingGenerator(
- int certificationLevel,
- PgpKeyPair masterKey,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- char[] passPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, masterKey, id, encAlgorithm, false, passPhrase, useSha1, hashedPackets, unhashedPackets, rand)
- {
- }
-
- ///
- /// Create a new key ring generator.
- ///
- /// The certification level for keys on this ring.
- /// The master key pair.
- /// The id to be associated with the ring.
- /// The algorithm to be used to protect secret keys.
- ///
- /// If true, conversion of the passphrase to bytes uses Encoding.UTF8.GetBytes(), otherwise the conversion
- /// is performed using Convert.ToByte(), which is the historical behaviour of the library (1.7 and earlier).
- ///
- /// The passPhrase to be used to protect secret keys.
- /// Checksum the secret keys with SHA1 rather than the older 16 bit checksum.
- /// Packets to be included in the certification hash.
- /// Packets to be attached unhashed to the certification.
- /// input secured random.
- public PgpKeyRingGenerator(
- int certificationLevel,
- PgpKeyPair masterKey,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- bool utf8PassPhrase,
- char[] passPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, masterKey, id, encAlgorithm,
- PgpUtilities.EncodePassPhrase(passPhrase, utf8PassPhrase),
- useSha1, hashedPackets, unhashedPackets, rand)
- {
- }
-
- ///
- /// Create a new key ring generator.
- ///
- /// The certification level for keys on this ring.
- /// The master key pair.
- /// The id to be associated with the ring.
- /// The algorithm to be used to protect secret keys.
- /// The passPhrase to be used to protect secret keys.
- /// Checksum the secret keys with SHA1 rather than the older 16 bit checksum.
- /// Packets to be included in the certification hash.
- /// Packets to be attached unhashed to the certification.
- /// input secured random.
- public PgpKeyRingGenerator(
- int certificationLevel,
- PgpKeyPair masterKey,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- byte[] rawPassPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- {
- this.certificationLevel = certificationLevel;
- this.masterKey = masterKey;
- this.id = id;
- this.encAlgorithm = encAlgorithm;
- this.rawPassPhrase = rawPassPhrase;
- this.useSha1 = useSha1;
- this.hashedPacketVector = hashedPackets;
- this.unhashedPacketVector = unhashedPackets;
- this.rand = rand;
-
- keys.Add(new PgpSecretKey(certificationLevel, masterKey, id, encAlgorithm, rawPassPhrase, false, useSha1, hashedPackets, unhashedPackets, rand));
- }
-
- ///
- /// Create a new key ring generator.
- ///
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- /// The certification level for keys on this ring.
- /// The master key pair.
- /// The id to be associated with the ring.
- /// The algorithm to be used to protect secret keys.
- /// The hash algorithm.
- /// The passPhrase to be used to protect secret keys.
- /// Checksum the secret keys with SHA1 rather than the older 16 bit checksum.
- /// Packets to be included in the certification hash.
- /// Packets to be attached unhashed to the certification.
- /// input secured random.
- public PgpKeyRingGenerator(
- int certificationLevel,
- PgpKeyPair masterKey,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- HashAlgorithmTag hashAlgorithm,
- char[] passPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, masterKey, id, encAlgorithm, hashAlgorithm, false, passPhrase, useSha1, hashedPackets, unhashedPackets, rand)
- {
- }
-
- ///
- /// Create a new key ring generator.
- ///
- /// The certification level for keys on this ring.
- /// The master key pair.
- /// The id to be associated with the ring.
- /// The algorithm to be used to protect secret keys.
- /// The hash algorithm.
- ///
- /// If true, conversion of the passphrase to bytes uses Encoding.UTF8.GetBytes(), otherwise the conversion
- /// is performed using Convert.ToByte(), which is the historical behaviour of the library (1.7 and earlier).
- ///
- /// The passPhrase to be used to protect secret keys.
- /// Checksum the secret keys with SHA1 rather than the older 16 bit checksum.
- /// Packets to be included in the certification hash.
- /// Packets to be attached unhashed to the certification.
- /// input secured random.
- public PgpKeyRingGenerator(
- int certificationLevel,
- PgpKeyPair masterKey,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- HashAlgorithmTag hashAlgorithm,
- bool utf8PassPhrase,
- char[] passPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, masterKey, id, encAlgorithm, hashAlgorithm,
- PgpUtilities.EncodePassPhrase(passPhrase, utf8PassPhrase),
- useSha1, hashedPackets, unhashedPackets, rand)
- {
- }
-
- ///
- /// Create a new key ring generator.
- ///
- ///
- /// Allows the caller to handle the encoding of the passphrase to bytes.
- ///
- /// The certification level for keys on this ring.
- /// The master key pair.
- /// The id to be associated with the ring.
- /// The algorithm to be used to protect secret keys.
- /// The hash algorithm.
- /// The passPhrase to be used to protect secret keys.
- /// Checksum the secret keys with SHA1 rather than the older 16 bit checksum.
- /// Packets to be included in the certification hash.
- /// Packets to be attached unhashed to the certification.
- /// input secured random.
- public PgpKeyRingGenerator(
- int certificationLevel,
- PgpKeyPair masterKey,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- HashAlgorithmTag hashAlgorithm,
- byte[] rawPassPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- {
- this.certificationLevel = certificationLevel;
- this.masterKey = masterKey;
- this.id = id;
- this.encAlgorithm = encAlgorithm;
- this.rawPassPhrase = rawPassPhrase;
- this.useSha1 = useSha1;
- this.hashedPacketVector = hashedPackets;
- this.unhashedPacketVector = unhashedPackets;
- this.rand = rand;
- this.hashAlgorithm = hashAlgorithm;
-
- keys.Add(new PgpSecretKey(certificationLevel, masterKey, id, encAlgorithm, hashAlgorithm, rawPassPhrase, false, useSha1, hashedPackets, unhashedPackets, rand));
- }
-
- /// Add a subkey to the key ring to be generated with default certification.
- public void AddSubKey(
- PgpKeyPair keyPair)
- {
- AddSubKey(keyPair, this.hashedPacketVector, this.unhashedPacketVector);
- }
-
-
- ///
- /// Add a subkey to the key ring to be generated with default certification.
- ///
- /// The key pair.
- /// The hash algorithm.
- public void AddSubKey(PgpKeyPair keyPair, HashAlgorithmTag hashAlgorithm)
- {
- this.AddSubKey(keyPair, this.hashedPacketVector, this.unhashedPacketVector, hashAlgorithm);
- }
-
- ///
- /// Add a subkey with specific hashed and unhashed packets associated with it and
- /// default certification.
- ///
- /// Public/private key pair.
- /// Hashed packet values to be included in certification.
- /// Unhashed packets values to be included in certification.
- ///
- public void AddSubKey(
- PgpKeyPair keyPair,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets)
- {
- try
- {
- PgpSignatureGenerator sGen = new PgpSignatureGenerator(
- masterKey.PublicKey.Algorithm, HashAlgorithmTag.Sha1);
-
- //
- // Generate the certification
- //
- sGen.InitSign(PgpSignature.SubkeyBinding, masterKey.PrivateKey);
-
- sGen.SetHashedSubpackets(hashedPackets);
- sGen.SetUnhashedSubpackets(unhashedPackets);
-
- IList subSigs = Platform.CreateArrayList();
-
- subSigs.Add(sGen.GenerateCertification(masterKey.PublicKey, keyPair.PublicKey));
-
- keys.Add(new PgpSecretKey(keyPair.PrivateKey, new PgpPublicKey(keyPair.PublicKey, null, subSigs), encAlgorithm,
- rawPassPhrase, false, useSha1, rand, false));
- }
- catch (PgpException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new PgpException("exception adding subkey: ", e);
- }
- }
-
- ///
- /// Add a subkey with specific hashed and unhashed packets associated with it and
- /// default certification.
- ///
- /// Public/private key pair.
- /// Hashed packet values to be included in certification.
- /// Unhashed packets values to be included in certification.
- /// The hash algorithm.
- /// exception adding subkey:
- ///
- public void AddSubKey(
- PgpKeyPair keyPair,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- HashAlgorithmTag hashAlgorithm)
- {
- try
- {
- PgpSignatureGenerator sGen = new PgpSignatureGenerator(masterKey.PublicKey.Algorithm, hashAlgorithm);
-
- //
- // Generate the certification
- //
- sGen.InitSign(PgpSignature.SubkeyBinding, masterKey.PrivateKey);
-
- sGen.SetHashedSubpackets(hashedPackets);
- sGen.SetUnhashedSubpackets(unhashedPackets);
-
- IList subSigs = Platform.CreateArrayList();
- subSigs.Add(sGen.GenerateCertification(masterKey.PublicKey, keyPair.PublicKey));
-
- keys.Add(new PgpSecretKey(keyPair.PrivateKey, new PgpPublicKey(keyPair.PublicKey, null, subSigs), encAlgorithm,
- rawPassPhrase, false, useSha1, rand, false));
- }
- catch (PgpException)
- {
- throw;
- }
- catch (Exception e)
- {
- throw new PgpException("exception adding subkey: ", e);
- }
- }
-
-
- /// Return the secret key ring.
- public PgpSecretKeyRing GenerateSecretKeyRing()
- {
- return new PgpSecretKeyRing(keys);
- }
-
- /// Return the public key ring that corresponds to the secret key ring.
- public PgpPublicKeyRing GeneratePublicKeyRing()
- {
- IList pubKeys = Platform.CreateArrayList();
-
- IEnumerator enumerator = keys.GetEnumerator();
- enumerator.MoveNext();
-
- PgpSecretKey pgpSecretKey = (PgpSecretKey) enumerator.Current;
- pubKeys.Add(pgpSecretKey.PublicKey);
-
- while (enumerator.MoveNext())
- {
- pgpSecretKey = (PgpSecretKey) enumerator.Current;
-
- PgpPublicKey k = new PgpPublicKey(pgpSecretKey.PublicKey);
- k.publicPk = new PublicSubkeyPacket(
- k.Algorithm, k.CreationTime, k.publicPk.Key);
-
- pubKeys.Add(k);
- }
-
- return new PgpPublicKeyRing(pubKeys);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpKeyValidationException.cs b/BCCrypto/src/openpgp/PgpKeyValidationException.cs
deleted file mode 100644
index 383ae57..0000000
--- a/BCCrypto/src/openpgp/PgpKeyValidationException.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- ///
- /// Thrown if the key checksum is invalid.
- ///
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class PgpKeyValidationException
- : PgpException
- {
- public PgpKeyValidationException() : base() {}
- public PgpKeyValidationException(string message) : base(message) {}
- public PgpKeyValidationException(string message, Exception exception) : base(message, exception) {}
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpLiteralData.cs b/BCCrypto/src/openpgp/PgpLiteralData.cs
deleted file mode 100644
index 79bbc39..0000000
--- a/BCCrypto/src/openpgp/PgpLiteralData.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Class for processing literal data objects.
- public class PgpLiteralData
- : PgpObject
- {
- public const char Binary = 'b';
- public const char Text = 't';
- public const char Utf8 = 'u';
-
- /// The special name indicating a "for your eyes only" packet.
- public const string Console = "_CONSOLE";
-
- private LiteralDataPacket data;
-
- public PgpLiteralData(
- BcpgInputStream bcpgInput)
- {
- data = (LiteralDataPacket) bcpgInput.ReadPacket();
- }
-
- /// The format of the data stream - Binary or Text
- public int Format
- {
- get { return data.Format; }
- }
-
- /// The file name that's associated with the data stream.
- public string FileName
- {
- get { return data.FileName; }
- }
-
- /// Return the file name as an unintrepreted byte array.
- public byte[] GetRawFileName()
- {
- return data.GetRawFileName();
- }
-
- /// The modification time for the file.
- public DateTime ModificationTime
- {
- get { return DateTimeUtilities.UnixMsToDateTime(data.ModificationTime); }
- }
-
- /// The raw input stream for the data stream.
- public Stream GetInputStream()
- {
- return data.GetInputStream();
- }
-
- /// The input stream representing the data stream.
- public Stream GetDataStream()
- {
- return GetInputStream();
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpLiteralDataGenerator.cs b/BCCrypto/src/openpgp/PgpLiteralDataGenerator.cs
deleted file mode 100644
index 7672659..0000000
--- a/BCCrypto/src/openpgp/PgpLiteralDataGenerator.cs
+++ /dev/null
@@ -1,182 +0,0 @@
-using System;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Class for producing literal data packets.
- public class PgpLiteralDataGenerator
- : IStreamGenerator
- {
- public const char Binary = PgpLiteralData.Binary;
- public const char Text = PgpLiteralData.Text;
- public const char Utf8 = PgpLiteralData.Utf8;
-
- /// The special name indicating a "for your eyes only" packet.
- public const string Console = PgpLiteralData.Console;
-
- private BcpgOutputStream pkOut;
- private bool oldFormat;
-
- public PgpLiteralDataGenerator()
- {
- }
-
- ///
- /// Generates literal data objects in the old format.
- /// This is important if you need compatibility with PGP 2.6.x.
- ///
- /// If true, uses old format.
- public PgpLiteralDataGenerator(
- bool oldFormat)
- {
- this.oldFormat = oldFormat;
- }
-
- private void WriteHeader(
- BcpgOutputStream outStr,
- char format,
- byte[] encName,
- long modificationTime)
- {
- outStr.Write(
- (byte) format,
- (byte) encName.Length);
-
- outStr.Write(encName);
-
- long modDate = modificationTime / 1000L;
-
- outStr.Write(
- (byte)(modDate >> 24),
- (byte)(modDate >> 16),
- (byte)(modDate >> 8),
- (byte)modDate);
- }
-
- ///
- ///
- /// Open a literal data packet, returning a stream to store the data inside the packet.
- ///
- ///
- /// The stream created can be closed off by either calling Close()
- /// on the stream or Close() on the generator. Closing the returned
- /// stream does not close off the Stream parameter outStr .
- ///
- ///
- /// The stream we want the packet in.
- /// The format we are using.
- /// The name of the 'file'.
- /// The length of the data we will write.
- /// The time of last modification we want stored.
- public Stream Open(
- Stream outStr,
- char format,
- string name,
- long length,
- DateTime modificationTime)
- {
- if (pkOut != null)
- throw new InvalidOperationException("generator already in open state");
- if (outStr == null)
- throw new ArgumentNullException("outStr");
-
- // Do this first, since it might throw an exception
- long unixMs = DateTimeUtilities.DateTimeToUnixMs(modificationTime);
-
- byte[] encName = Strings.ToUtf8ByteArray(name);
-
- pkOut = new BcpgOutputStream(outStr, PacketTag.LiteralData,
- length + 2 + encName.Length + 4, oldFormat);
-
- WriteHeader(pkOut, format, encName, unixMs);
-
- return new WrappedGeneratorStream(this, pkOut);
- }
-
- ///
- ///
- /// Open a literal data packet, returning a stream to store the data inside the packet,
- /// as an indefinite length stream. The stream is written out as a series of partial
- /// packets with a chunk size determined by the size of the passed in buffer.
- ///
- ///
- /// The stream created can be closed off by either calling Close()
- /// on the stream or Close() on the generator. Closing the returned
- /// stream does not close off the Stream parameter outStr .
- ///
- ///
- /// Note : if the buffer is not a power of 2 in length only the largest power of 2
- /// bytes worth of the buffer will be used.
- ///
- /// The stream we want the packet in.
- /// The format we are using.
- /// The name of the 'file'.
- /// The time of last modification we want stored.
- /// The buffer to use for collecting data to put into chunks.
- public Stream Open(
- Stream outStr,
- char format,
- string name,
- DateTime modificationTime,
- byte[] buffer)
- {
- if (pkOut != null)
- throw new InvalidOperationException("generator already in open state");
- if (outStr == null)
- throw new ArgumentNullException("outStr");
-
- // Do this first, since it might throw an exception
- long unixMs = DateTimeUtilities.DateTimeToUnixMs(modificationTime);
-
- byte[] encName = Strings.ToUtf8ByteArray(name);
-
- pkOut = new BcpgOutputStream(outStr, PacketTag.LiteralData, buffer);
-
- WriteHeader(pkOut, format, encName, unixMs);
-
- return new WrappedGeneratorStream(this, pkOut);
- }
-
-#if !PORTABLE || DOTNET
- ///
- ///
- /// Open a literal data packet for the passed in FileInfo object, returning
- /// an output stream for saving the file contents.
- ///
- ///
- /// The stream created can be closed off by either calling Close()
- /// on the stream or Close() on the generator. Closing the returned
- /// stream does not close off the Stream parameter outStr .
- ///
- ///
- /// The stream we want the packet in.
- /// The format we are using.
- /// The FileInfo object containg the packet details.
- public Stream Open(
- Stream outStr,
- char format,
- FileInfo file)
- {
- return Open(outStr, format, file.Name, file.Length, file.LastWriteTime);
- }
-#endif
-
- ///
- /// Close the literal data packet - this is equivalent to calling Close()
- /// on the stream returned by the Open() method.
- ///
- public void Close()
- {
- if (pkOut != null)
- {
- pkOut.Finish();
- pkOut.Flush();
- pkOut = null;
- }
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpMarker.cs b/BCCrypto/src/openpgp/PgpMarker.cs
deleted file mode 100644
index 733e4e9..0000000
--- a/BCCrypto/src/openpgp/PgpMarker.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- ///
- /// A PGP marker packet - in general these should be ignored other than where
- /// the idea is to preserve the original input stream.
- ///
- public class PgpMarker
- : PgpObject
- {
- private readonly MarkerPacket p;
-
- public PgpMarker(
- BcpgInputStream bcpgIn)
- {
- p = (MarkerPacket) bcpgIn.ReadPacket();
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpObjectFactory.cs b/BCCrypto/src/openpgp/PgpObjectFactory.cs
deleted file mode 100644
index c5c6fcb..0000000
--- a/BCCrypto/src/openpgp/PgpObjectFactory.cs
+++ /dev/null
@@ -1,143 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- ///
- /// General class for reading a PGP object stream.
- ///
- /// Note: if this class finds a PgpPublicKey or a PgpSecretKey it
- /// will create a PgpPublicKeyRing, or a PgpSecretKeyRing for each
- /// key found. If all you are trying to do is read a key ring file use
- /// either PgpPublicKeyRingBundle or PgpSecretKeyRingBundle.
- ///
- public class PgpObjectFactory
- {
- private readonly BcpgInputStream bcpgIn;
-
- public PgpObjectFactory(
- Stream inputStream)
- {
- this.bcpgIn = BcpgInputStream.Wrap(inputStream);
- }
-
- public PgpObjectFactory(
- byte[] bytes)
- : this(new MemoryStream(bytes, false))
- {
- }
-
- /// Return the next object in the stream, or null if the end is reached.
- /// On a parse error
- public PgpObject NextPgpObject()
- {
- PacketTag tag = bcpgIn.NextPacketTag();
-
- if ((int) tag == -1) return null;
-
- switch (tag)
- {
- case PacketTag.Signature:
- {
- IList l = Platform.CreateArrayList();
-
- while (bcpgIn.NextPacketTag() == PacketTag.Signature)
- {
- try
- {
- l.Add(new PgpSignature(bcpgIn));
- }
- catch (PgpException e)
- {
- throw new IOException("can't create signature object: " + e);
- }
- }
-
- PgpSignature[] sigs = new PgpSignature[l.Count];
- for (int i = 0; i < l.Count; ++i)
- {
- sigs[i] = (PgpSignature)l[i];
- }
- return new PgpSignatureList(sigs);
- }
- case PacketTag.SecretKey:
- try
- {
- return new PgpSecretKeyRing(bcpgIn);
- }
- catch (PgpException e)
- {
- throw new IOException("can't create secret key object: " + e);
- }
- case PacketTag.PublicKey:
- return new PgpPublicKeyRing(bcpgIn);
- // TODO Make PgpPublicKey a PgpObject or return a PgpPublicKeyRing
-// case PacketTag.PublicSubkey:
-// return PgpPublicKeyRing.ReadSubkey(bcpgIn);
- case PacketTag.CompressedData:
- return new PgpCompressedData(bcpgIn);
- case PacketTag.LiteralData:
- return new PgpLiteralData(bcpgIn);
- case PacketTag.PublicKeyEncryptedSession:
- case PacketTag.SymmetricKeyEncryptedSessionKey:
- return new PgpEncryptedDataList(bcpgIn);
- case PacketTag.OnePassSignature:
- {
- IList l = Platform.CreateArrayList();
-
- while (bcpgIn.NextPacketTag() == PacketTag.OnePassSignature)
- {
- try
- {
- l.Add(new PgpOnePassSignature(bcpgIn));
- }
- catch (PgpException e)
- {
- throw new IOException("can't create one pass signature object: " + e);
- }
- }
-
- PgpOnePassSignature[] sigs = new PgpOnePassSignature[l.Count];
- for (int i = 0; i < l.Count; ++i)
- {
- sigs[i] = (PgpOnePassSignature)l[i];
- }
- return new PgpOnePassSignatureList(sigs);
- }
- case PacketTag.Marker:
- return new PgpMarker(bcpgIn);
- case PacketTag.Experimental1:
- case PacketTag.Experimental2:
- case PacketTag.Experimental3:
- case PacketTag.Experimental4:
- return new PgpExperimental(bcpgIn);
- }
-
- throw new IOException("unknown object in stream " + bcpgIn.NextPacketTag());
- }
-
- [Obsolete("Use NextPgpObject() instead")]
- public object NextObject()
- {
- return NextPgpObject();
- }
-
- ///
- /// Return all available objects in a list.
- ///
- /// An IList containing all objects from this factory, in order.
- public IList AllPgpObjects()
- {
- IList result = Platform.CreateArrayList();
- PgpObject pgpObject;
- while ((pgpObject = NextPgpObject()) != null)
- {
- result.Add(pgpObject);
- }
- return result;
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpOnePassSignature.cs b/BCCrypto/src/openpgp/PgpOnePassSignature.cs
deleted file mode 100644
index 68fc599..0000000
--- a/BCCrypto/src/openpgp/PgpOnePassSignature.cs
+++ /dev/null
@@ -1,179 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// A one pass signature object.
- public class PgpOnePassSignature
- {
- private OnePassSignaturePacket sigPack;
- private int signatureType;
- private ISigner sig;
- private byte lastb;
-
- internal PgpOnePassSignature(
- BcpgInputStream bcpgInput)
- : this((OnePassSignaturePacket) bcpgInput.ReadPacket())
- {
- }
-
- internal PgpOnePassSignature(
- OnePassSignaturePacket sigPack)
- {
- this.sigPack = sigPack;
- this.signatureType = sigPack.SignatureType;
- }
-
- /// Initialise the signature object for verification.
- public void InitVerify(
- PgpPublicKey pubKey)
- {
- lastb = 0;
-
- try
- {
- sig = SignerUtilities.GetSigner(
- PgpUtilities.GetSignatureName(sigPack.KeyAlgorithm, sigPack.HashAlgorithm));
- }
- catch (Exception e)
- {
- throw new PgpException("can't set up signature object.", e);
- }
-
- try
- {
- sig.Init(false, pubKey.GetKey());
- }
- catch (InvalidKeyException e)
- {
- throw new PgpException("invalid key.", e);
- }
- }
-
- public void Update(
- byte b)
- {
- if (signatureType == PgpSignature.CanonicalTextDocument)
- {
- doCanonicalUpdateByte(b);
- }
- else
- {
- sig.Update(b);
- }
- }
-
- private void doCanonicalUpdateByte(
- byte b)
- {
- if (b == '\r')
- {
- doUpdateCRLF();
- }
- else if (b == '\n')
- {
- if (lastb != '\r')
- {
- doUpdateCRLF();
- }
- }
- else
- {
- sig.Update(b);
- }
-
- lastb = b;
- }
-
- private void doUpdateCRLF()
- {
- sig.Update((byte)'\r');
- sig.Update((byte)'\n');
- }
-
- public void Update(
- byte[] bytes)
- {
- if (signatureType == PgpSignature.CanonicalTextDocument)
- {
- for (int i = 0; i != bytes.Length; i++)
- {
- doCanonicalUpdateByte(bytes[i]);
- }
- }
- else
- {
- sig.BlockUpdate(bytes, 0, bytes.Length);
- }
- }
-
- public void Update(
- byte[] bytes,
- int off,
- int length)
- {
- if (signatureType == PgpSignature.CanonicalTextDocument)
- {
- int finish = off + length;
-
- for (int i = off; i != finish; i++)
- {
- doCanonicalUpdateByte(bytes[i]);
- }
- }
- else
- {
- sig.BlockUpdate(bytes, off, length);
- }
- }
-
- /// Verify the calculated signature against the passed in PgpSignature.
- public bool Verify(
- PgpSignature pgpSig)
- {
- byte[] trailer = pgpSig.GetSignatureTrailer();
-
- sig.BlockUpdate(trailer, 0, trailer.Length);
-
- return sig.VerifySignature(pgpSig.GetSignature());
- }
-
- public long KeyId
- {
- get { return sigPack.KeyId; }
- }
-
- public int SignatureType
- {
- get { return sigPack.SignatureType; }
- }
-
- public HashAlgorithmTag HashAlgorithm
- {
- get { return sigPack.HashAlgorithm; }
- }
-
- public PublicKeyAlgorithmTag KeyAlgorithm
- {
- get { return sigPack.KeyAlgorithm; }
- }
-
- public byte[] GetEncoded()
- {
- MemoryStream bOut = new MemoryStream();
-
- Encode(bOut);
-
- return bOut.ToArray();
- }
-
- public void Encode(
- Stream outStr)
- {
- BcpgOutputStream.Wrap(outStr).WritePacket(sigPack);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpOnePassSignatureList.cs b/BCCrypto/src/openpgp/PgpOnePassSignatureList.cs
deleted file mode 100644
index 37c4288..0000000
--- a/BCCrypto/src/openpgp/PgpOnePassSignatureList.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Holder for a list of PgpOnePassSignature objects.
- public class PgpOnePassSignatureList
- : PgpObject
- {
- private readonly PgpOnePassSignature[] sigs;
-
- public PgpOnePassSignatureList(
- PgpOnePassSignature[] sigs)
- {
- this.sigs = (PgpOnePassSignature[]) sigs.Clone();
- }
-
- public PgpOnePassSignatureList(
- PgpOnePassSignature sig)
- {
- this.sigs = new PgpOnePassSignature[]{ sig };
- }
-
- public PgpOnePassSignature this[int index]
- {
- get { return sigs[index]; }
- }
-
- [Obsolete("Use 'object[index]' syntax instead")]
- public PgpOnePassSignature Get(
- int index)
- {
- return this[index];
- }
-
- [Obsolete("Use 'Count' property instead")]
- public int Size
- {
- get { return sigs.Length; }
- }
-
- public int Count
- {
- get { return sigs.Length; }
- }
-
- public bool IsEmpty
- {
- get { return (sigs.Length == 0); }
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpPad.cs b/BCCrypto/src/openpgp/PgpPad.cs
deleted file mode 100644
index 48f7f2f..0000000
--- a/BCCrypto/src/openpgp/PgpPad.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Padding functions.
- public sealed class PgpPad
- {
- private PgpPad()
- {
- }
-
- public static byte[] PadSessionData(byte[] sessionInfo)
- {
- byte[] result = new byte[40];
-
- Array.Copy(sessionInfo, 0, result, 0, sessionInfo.Length);
-
- byte padValue = (byte)(result.Length - sessionInfo.Length);
-
- for (int i = sessionInfo.Length; i != result.Length; i++)
- {
- result[i] = padValue;
- }
-
- return result;
- }
-
- public static byte[] UnpadSessionData(byte[] encoded)
- {
- byte padValue = encoded[encoded.Length - 1];
-
- for (int i = encoded.Length - padValue; i != encoded.Length; i++)
- {
- if (encoded[i] != padValue)
- throw new PgpException("bad padding found in session data");
- }
-
- byte[] taggedKey = new byte[encoded.Length - padValue];
-
- Array.Copy(encoded, 0, taggedKey, 0, taggedKey.Length);
-
- return taggedKey;
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpPbeEncryptedData.cs b/BCCrypto/src/openpgp/PgpPbeEncryptedData.cs
deleted file mode 100644
index f43f2f5..0000000
--- a/BCCrypto/src/openpgp/PgpPbeEncryptedData.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// A password based encryption object.
- public class PgpPbeEncryptedData
- : PgpEncryptedData
- {
- private readonly SymmetricKeyEncSessionPacket keyData;
-
- internal PgpPbeEncryptedData(
- SymmetricKeyEncSessionPacket keyData,
- InputStreamPacket encData)
- : base(encData)
- {
- this.keyData = keyData;
- }
-
- /// Return the raw input stream for the data stream.
- public override Stream GetInputStream()
- {
- return encData.GetInputStream();
- }
-
- /// Return the decrypted input stream, using the passed in passphrase.
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- public Stream GetDataStream(char[] passPhrase)
- {
- return DoGetDataStream(PgpUtilities.EncodePassPhrase(passPhrase, false), true);
- }
-
- /// Return the decrypted input stream, using the passed in passphrase.
- ///
- /// The passphrase is encoded to bytes using UTF8 (Encoding.UTF8.GetBytes).
- ///
- public Stream GetDataStreamUtf8(char[] passPhrase)
- {
- return DoGetDataStream(PgpUtilities.EncodePassPhrase(passPhrase, true), true);
- }
-
- /// Return the decrypted input stream, using the passed in passphrase.
- ///
- /// Allows the caller to handle the encoding of the passphrase to bytes.
- ///
- public Stream GetDataStreamRaw(byte[] rawPassPhrase)
- {
- return DoGetDataStream(rawPassPhrase, false);
- }
-
- internal Stream DoGetDataStream(byte[] rawPassPhrase, bool clearPassPhrase)
- {
- try
- {
- SymmetricKeyAlgorithmTag keyAlgorithm = keyData.EncAlgorithm;
-
- KeyParameter key = PgpUtilities.DoMakeKeyFromPassPhrase(
- keyAlgorithm, keyData.S2k, rawPassPhrase, clearPassPhrase);
-
- byte[] secKeyData = keyData.GetSecKeyData();
- if (secKeyData != null && secKeyData.Length > 0)
- {
- IBufferedCipher keyCipher = CipherUtilities.GetCipher(
- PgpUtilities.GetSymmetricCipherName(keyAlgorithm) + "/CFB/NoPadding");
-
- keyCipher.Init(false,
- new ParametersWithIV(key, new byte[keyCipher.GetBlockSize()]));
-
- byte[] keyBytes = keyCipher.DoFinal(secKeyData);
-
- keyAlgorithm = (SymmetricKeyAlgorithmTag) keyBytes[0];
-
- key = ParameterUtilities.CreateKeyParameter(
- PgpUtilities.GetSymmetricCipherName(keyAlgorithm),
- keyBytes, 1, keyBytes.Length - 1);
- }
-
-
- IBufferedCipher c = CreateStreamCipher(keyAlgorithm);
-
- byte[] iv = new byte[c.GetBlockSize()];
-
- c.Init(false, new ParametersWithIV(key, iv));
-
- encStream = BcpgInputStream.Wrap(new CipherStream(encData.GetInputStream(), c, null));
-
- if (encData is SymmetricEncIntegrityPacket)
- {
- truncStream = new TruncatedStream(encStream);
-
- string digestName = PgpUtilities.GetDigestName(HashAlgorithmTag.Sha1);
- IDigest digest = DigestUtilities.GetDigest(digestName);
-
- encStream = new DigestStream(truncStream, digest, null);
- }
-
- if (Streams.ReadFully(encStream, iv, 0, iv.Length) < iv.Length)
- throw new EndOfStreamException("unexpected end of stream.");
-
- int v1 = encStream.ReadByte();
- int v2 = encStream.ReadByte();
-
- if (v1 < 0 || v2 < 0)
- throw new EndOfStreamException("unexpected end of stream.");
-
-
- // Note: the oracle attack on the "quick check" bytes is not deemed
- // a security risk for PBE (see PgpPublicKeyEncryptedData)
-
- bool repeatCheckPassed =
- iv[iv.Length - 2] == (byte)v1
- && iv[iv.Length - 1] == (byte)v2;
-
- // Note: some versions of PGP appear to produce 0 for the extra
- // bytes rather than repeating the two previous bytes
- bool zeroesCheckPassed =
- v1 == 0
- && v2 == 0;
-
- if (!repeatCheckPassed && !zeroesCheckPassed)
- {
- throw new PgpDataValidationException("quick check failed.");
- }
-
-
- return encStream;
- }
- catch (PgpException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new PgpException("Exception creating cipher", e);
- }
- }
-
- private IBufferedCipher CreateStreamCipher(
- SymmetricKeyAlgorithmTag keyAlgorithm)
- {
- string mode = (encData is SymmetricEncIntegrityPacket)
- ? "CFB"
- : "OpenPGPCFB";
-
- string cName = PgpUtilities.GetSymmetricCipherName(keyAlgorithm)
- + "/" + mode + "/NoPadding";
-
- return CipherUtilities.GetCipher(cName);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpPrivateKey.cs b/BCCrypto/src/openpgp/PgpPrivateKey.cs
deleted file mode 100644
index 61487a5..0000000
--- a/BCCrypto/src/openpgp/PgpPrivateKey.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// General class to contain a private key for use with other OpenPGP objects.
- public class PgpPrivateKey
- {
- private readonly long keyID;
- private readonly PublicKeyPacket publicKeyPacket;
- private readonly AsymmetricKeyParameter privateKey;
-
- ///
- /// Create a PgpPrivateKey from a keyID, the associated public data packet, and a regular private key.
- ///
- /// ID of the corresponding public key.
- /// the public key data packet to be associated with this private key.
- /// the private key data packet to be associated with this private key.
- public PgpPrivateKey(
- long keyID,
- PublicKeyPacket publicKeyPacket,
- AsymmetricKeyParameter privateKey)
- {
- if (!privateKey.IsPrivate)
- throw new ArgumentException("Expected a private key", "privateKey");
-
- this.keyID = keyID;
- this.publicKeyPacket = publicKeyPacket;
- this.privateKey = privateKey;
- }
-
- /// The keyId associated with the contained private key.
- public long KeyId
- {
- get { return keyID; }
- }
-
- /// The public key packet associated with this private key, if available.
- public PublicKeyPacket PublicKeyPacket
- {
- get { return publicKeyPacket; }
- }
-
- /// The contained private key.
- public AsymmetricKeyParameter Key
- {
- get { return privateKey; }
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpPublicKey.cs b/BCCrypto/src/openpgp/PgpPublicKey.cs
deleted file mode 100644
index fc125e8..0000000
--- a/BCCrypto/src/openpgp/PgpPublicKey.cs
+++ /dev/null
@@ -1,980 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.Sec;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// General class to handle a PGP public key object.
- public class PgpPublicKey
- {
- public static byte[] CalculateFingerprint(PublicKeyPacket publicPk)
- {
- IBcpgKey key = publicPk.Key;
- IDigest digest;
-
- if (publicPk.Version <= 3)
- {
- RsaPublicBcpgKey rK = (RsaPublicBcpgKey)key;
-
- try
- {
- digest = DigestUtilities.GetDigest("MD5");
- UpdateDigest(digest, rK.Modulus);
- UpdateDigest(digest, rK.PublicExponent);
- }
- catch (Exception e)
- {
- throw new PgpException("can't encode key components: " + e.Message, e);
- }
- }
- else
- {
- try
- {
- byte[] kBytes = publicPk.GetEncodedContents();
-
- digest = DigestUtilities.GetDigest("SHA1");
-
- digest.Update(0x99);
- digest.Update((byte)(kBytes.Length >> 8));
- digest.Update((byte)kBytes.Length);
- digest.BlockUpdate(kBytes, 0, kBytes.Length);
- }
- catch (Exception e)
- {
- throw new PgpException("can't encode key components: " + e.Message, e);
- }
- }
-
- return DigestUtilities.DoFinal(digest);
- }
-
- private static void UpdateDigest(IDigest d, BigInteger b)
- {
- byte[] bytes = b.ToByteArrayUnsigned();
- d.BlockUpdate(bytes, 0, bytes.Length);
- }
-
- private static readonly int[] MasterKeyCertificationTypes = new int[]
- {
- PgpSignature.PositiveCertification,
- PgpSignature.CasualCertification,
- PgpSignature.NoCertification,
- PgpSignature.DefaultCertification
- };
-
- private long keyId;
- private byte[] fingerprint;
- private int keyStrength;
-
- internal PublicKeyPacket publicPk;
- internal TrustPacket trustPk;
- internal IList keySigs = Platform.CreateArrayList();
- internal IList ids = Platform.CreateArrayList();
- internal IList idTrusts = Platform.CreateArrayList();
- internal IList idSigs = Platform.CreateArrayList();
- internal IList subSigs;
-
- private void Init()
- {
- IBcpgKey key = publicPk.Key;
-
- this.fingerprint = CalculateFingerprint(publicPk);
-
- if (publicPk.Version <= 3)
- {
- RsaPublicBcpgKey rK = (RsaPublicBcpgKey) key;
-
- this.keyId = rK.Modulus.LongValue;
- this.keyStrength = rK.Modulus.BitLength;
- }
- else
- {
- this.keyId = (long)(((ulong)fingerprint[fingerprint.Length - 8] << 56)
- | ((ulong)fingerprint[fingerprint.Length - 7] << 48)
- | ((ulong)fingerprint[fingerprint.Length - 6] << 40)
- | ((ulong)fingerprint[fingerprint.Length - 5] << 32)
- | ((ulong)fingerprint[fingerprint.Length - 4] << 24)
- | ((ulong)fingerprint[fingerprint.Length - 3] << 16)
- | ((ulong)fingerprint[fingerprint.Length - 2] << 8)
- | (ulong)fingerprint[fingerprint.Length - 1]);
-
- if (key is RsaPublicBcpgKey)
- {
- this.keyStrength = ((RsaPublicBcpgKey)key).Modulus.BitLength;
- }
- else if (key is DsaPublicBcpgKey)
- {
- this.keyStrength = ((DsaPublicBcpgKey)key).P.BitLength;
- }
- else if (key is ElGamalPublicBcpgKey)
- {
- this.keyStrength = ((ElGamalPublicBcpgKey)key).P.BitLength;
- }
- else if (key is ECPublicBcpgKey)
- {
- this.keyStrength = ECKeyPairGenerator.FindECCurveByOid(((ECPublicBcpgKey)key).CurveOid).Curve.FieldSize;
- }
- }
- }
-
- ///
- /// Create a PgpPublicKey from the passed in lightweight one.
- ///
- ///
- /// Note: the time passed in affects the value of the key's keyId, so you probably only want
- /// to do this once for a lightweight key, or make sure you keep track of the time you used.
- ///
- /// Asymmetric algorithm type representing the public key.
- /// Actual public key to associate.
- /// Date of creation.
- /// If pubKey is not public.
- /// On key creation problem.
- public PgpPublicKey(
- PublicKeyAlgorithmTag algorithm,
- AsymmetricKeyParameter pubKey,
- DateTime time)
- {
- if (pubKey.IsPrivate)
- throw new ArgumentException("Expected a public key", "pubKey");
-
- IBcpgKey bcpgKey;
- if (pubKey is RsaKeyParameters)
- {
- RsaKeyParameters rK = (RsaKeyParameters) pubKey;
-
- bcpgKey = new RsaPublicBcpgKey(rK.Modulus, rK.Exponent);
- }
- else if (pubKey is DsaPublicKeyParameters)
- {
- DsaPublicKeyParameters dK = (DsaPublicKeyParameters) pubKey;
- DsaParameters dP = dK.Parameters;
-
- bcpgKey = new DsaPublicBcpgKey(dP.P, dP.Q, dP.G, dK.Y);
- }
- else if (pubKey is ECPublicKeyParameters)
- {
- ECPublicKeyParameters ecK = (ECPublicKeyParameters)pubKey;
-
- if (algorithm == PublicKeyAlgorithmTag.ECDH)
- {
- bcpgKey = new ECDHPublicBcpgKey(ecK.PublicKeyParamSet, ecK.Q, HashAlgorithmTag.Sha256, SymmetricKeyAlgorithmTag.Aes128);
- }
- else if (algorithm == PublicKeyAlgorithmTag.ECDsa)
- {
- bcpgKey = new ECDsaPublicBcpgKey(ecK.PublicKeyParamSet, ecK.Q);
- }
- else
- {
- throw new PgpException("unknown EC algorithm");
- }
- }
- else if (pubKey is ElGamalPublicKeyParameters)
- {
- ElGamalPublicKeyParameters eK = (ElGamalPublicKeyParameters) pubKey;
- ElGamalParameters eS = eK.Parameters;
-
- bcpgKey = new ElGamalPublicBcpgKey(eS.P, eS.G, eK.Y);
- }
- else
- {
- throw new PgpException("unknown key class");
- }
-
- this.publicPk = new PublicKeyPacket(algorithm, time, bcpgKey);
- this.ids = Platform.CreateArrayList();
- this.idSigs = Platform.CreateArrayList();
-
- try
- {
- Init();
- }
- catch (IOException e)
- {
- throw new PgpException("exception calculating keyId", e);
- }
- }
-
- public PgpPublicKey(PublicKeyPacket publicPk)
- : this(publicPk, Platform.CreateArrayList(), Platform.CreateArrayList())
- {
- }
-
- /// Constructor for a sub-key.
- internal PgpPublicKey(
- PublicKeyPacket publicPk,
- TrustPacket trustPk,
- IList sigs)
- {
- this.publicPk = publicPk;
- this.trustPk = trustPk;
- this.subSigs = sigs;
-
- Init();
- }
-
- internal PgpPublicKey(
- PgpPublicKey key,
- TrustPacket trust,
- IList subSigs)
- {
- this.publicPk = key.publicPk;
- this.trustPk = trust;
- this.subSigs = subSigs;
-
- this.fingerprint = key.fingerprint;
- this.keyId = key.keyId;
- this.keyStrength = key.keyStrength;
- }
-
- /// Copy constructor.
- /// The public key to copy.
- internal PgpPublicKey(
- PgpPublicKey pubKey)
- {
- this.publicPk = pubKey.publicPk;
-
- this.keySigs = Platform.CreateArrayList(pubKey.keySigs);
- this.ids = Platform.CreateArrayList(pubKey.ids);
- this.idTrusts = Platform.CreateArrayList(pubKey.idTrusts);
- this.idSigs = Platform.CreateArrayList(pubKey.idSigs.Count);
- for (int i = 0; i != pubKey.idSigs.Count; i++)
- {
- this.idSigs.Add(Platform.CreateArrayList((IList)pubKey.idSigs[i]));
- }
-
- if (pubKey.subSigs != null)
- {
- this.subSigs = Platform.CreateArrayList(pubKey.subSigs.Count);
- for (int i = 0; i != pubKey.subSigs.Count; i++)
- {
- this.subSigs.Add(pubKey.subSigs[i]);
- }
- }
-
- this.fingerprint = pubKey.fingerprint;
- this.keyId = pubKey.keyId;
- this.keyStrength = pubKey.keyStrength;
- }
-
- internal PgpPublicKey(
- PublicKeyPacket publicPk,
- TrustPacket trustPk,
- IList keySigs,
- IList ids,
- IList idTrusts,
- IList idSigs)
- {
- this.publicPk = publicPk;
- this.trustPk = trustPk;
- this.keySigs = keySigs;
- this.ids = ids;
- this.idTrusts = idTrusts;
- this.idSigs = idSigs;
-
- Init();
- }
-
- internal PgpPublicKey(
- PublicKeyPacket publicPk,
- IList ids,
- IList idSigs)
- {
- this.publicPk = publicPk;
- this.ids = ids;
- this.idSigs = idSigs;
- Init();
- }
-
- /// The version of this key.
- public int Version
- {
- get { return publicPk.Version; }
- }
-
- /// The creation time of this key.
- public DateTime CreationTime
- {
- get { return publicPk.GetTime(); }
- }
-
- /// The number of valid days from creation time - zero means no expiry.
- /// WARNING: This method will return 1 for keys with version > 3 that expire in less than 1 day
- [Obsolete("Use 'GetValidSeconds' instead")]
- public int ValidDays
- {
- get
- {
- if (publicPk.Version <= 3)
- {
- return publicPk.ValidDays;
- }
-
- long expSecs = GetValidSeconds();
- if (expSecs <= 0)
- return 0;
-
- int days = (int)(expSecs / (24 * 60 * 60));
- return System.Math.Max(1, days);
- }
- }
-
- /// Return the trust data associated with the public key, if present.
- /// A byte array with trust data, null otherwise.
- public byte[] GetTrustData()
- {
- if (trustPk == null)
- {
- return null;
- }
-
- return Arrays.Clone(trustPk.GetLevelAndTrustAmount());
- }
-
- /// The number of valid seconds from creation time - zero means no expiry.
- public long GetValidSeconds()
- {
- if (publicPk.Version <= 3)
- {
- return (long)publicPk.ValidDays * (24 * 60 * 60);
- }
-
- if (IsMasterKey)
- {
- for (int i = 0; i != MasterKeyCertificationTypes.Length; i++)
- {
- long seconds = GetExpirationTimeFromSig(true, MasterKeyCertificationTypes[i]);
- if (seconds >= 0)
- {
- return seconds;
- }
- }
- }
- else
- {
- long seconds = GetExpirationTimeFromSig(false, PgpSignature.SubkeyBinding);
- if (seconds >= 0)
- {
- return seconds;
- }
- }
-
- return 0;
- }
-
- private long GetExpirationTimeFromSig(bool selfSigned, int signatureType)
- {
- long expiryTime = -1;
- long lastDate = -1;
-
- foreach (PgpSignature sig in GetSignaturesOfType(signatureType))
- {
- if (selfSigned && sig.KeyId != this.KeyId)
- continue;
-
- PgpSignatureSubpacketVector hashed = sig.GetHashedSubPackets();
- if (hashed == null)
- continue;
-
- long current = hashed.GetKeyExpirationTime();
-
- if (sig.KeyId == this.KeyId)
- {
- if (sig.CreationTime.Ticks > lastDate)
- {
- lastDate = sig.CreationTime.Ticks;
- expiryTime = current;
- }
- }
- else if (current == 0 || current > expiryTime)
- {
- expiryTime = current;
- }
- }
-
- return expiryTime;
- }
-
- /// The keyId associated with the public key.
- public long KeyId
- {
- get { return keyId; }
- }
-
- /// The fingerprint of the key
- public byte[] GetFingerprint()
- {
- return (byte[]) fingerprint.Clone();
- }
-
- ///
- /// Check if this key has an algorithm type that makes it suitable to use for encryption.
- ///
- ///
- /// Note: with version 4 keys KeyFlags subpackets should also be considered when present for
- /// determining the preferred use of the key.
- ///
- ///
- /// true if this key algorithm is suitable for encryption.
- ///
- public bool IsEncryptionKey
- {
- get
- {
- switch (publicPk.Algorithm)
- {
- case PublicKeyAlgorithmTag.ECDH:
- case PublicKeyAlgorithmTag.ElGamalEncrypt:
- case PublicKeyAlgorithmTag.ElGamalGeneral:
- case PublicKeyAlgorithmTag.RsaEncrypt:
- case PublicKeyAlgorithmTag.RsaGeneral:
- return true;
- default:
- return false;
- }
- }
- }
-
- /// True, if this is a master key.
- public bool IsMasterKey
- {
- get { return subSigs == null; }
- }
-
- /// The algorithm code associated with the public key.
- public PublicKeyAlgorithmTag Algorithm
- {
- get { return publicPk.Algorithm; }
- }
-
- /// The strength of the key in bits.
- public int BitStrength
- {
- get { return keyStrength; }
- }
-
- /// The public key contained in the object.
- /// A lightweight public key.
- /// If the key algorithm is not recognised.
- public AsymmetricKeyParameter GetKey()
- {
- try
- {
- switch (publicPk.Algorithm)
- {
- case PublicKeyAlgorithmTag.RsaEncrypt:
- case PublicKeyAlgorithmTag.RsaGeneral:
- case PublicKeyAlgorithmTag.RsaSign:
- RsaPublicBcpgKey rsaK = (RsaPublicBcpgKey)publicPk.Key;
- return new RsaKeyParameters(false, rsaK.Modulus, rsaK.PublicExponent);
- case PublicKeyAlgorithmTag.Dsa:
- DsaPublicBcpgKey dsaK = (DsaPublicBcpgKey)publicPk.Key;
- return new DsaPublicKeyParameters(dsaK.Y, new DsaParameters(dsaK.P, dsaK.Q, dsaK.G));
- case PublicKeyAlgorithmTag.ECDsa:
- return GetECKey("ECDSA");
- case PublicKeyAlgorithmTag.ECDH:
- return GetECKey("ECDH");
- case PublicKeyAlgorithmTag.ElGamalEncrypt:
- case PublicKeyAlgorithmTag.ElGamalGeneral:
- ElGamalPublicBcpgKey elK = (ElGamalPublicBcpgKey)publicPk.Key;
- return new ElGamalPublicKeyParameters(elK.Y, new ElGamalParameters(elK.P, elK.G));
- default:
- throw new PgpException("unknown public key algorithm encountered");
- }
- }
- catch (PgpException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new PgpException("exception constructing public key", e);
- }
- }
-
- private ECPublicKeyParameters GetECKey(string algorithm)
- {
- ECPublicBcpgKey ecK = (ECPublicBcpgKey)publicPk.Key;
- X9ECParameters x9 = ECKeyPairGenerator.FindECCurveByOid(ecK.CurveOid);
- ECPoint q = x9.Curve.DecodePoint(BigIntegers.AsUnsignedByteArray(ecK.EncodedPoint));
- return new ECPublicKeyParameters(algorithm, q, ecK.CurveOid);
- }
-
- /// Allows enumeration of any user IDs associated with the key.
- /// An IEnumerable of string objects.
- public IEnumerable GetUserIds()
- {
- IList temp = Platform.CreateArrayList();
-
- foreach (object o in ids)
- {
- if (o is string)
- {
- temp.Add(o);
- }
- }
-
- return new EnumerableProxy(temp);
- }
-
- /// Allows enumeration of any user attribute vectors associated with the key.
- /// An IEnumerable of PgpUserAttributeSubpacketVector objects.
- public IEnumerable GetUserAttributes()
- {
- IList temp = Platform.CreateArrayList();
-
- foreach (object o in ids)
- {
- if (o is PgpUserAttributeSubpacketVector)
- {
- temp.Add(o);
- }
- }
-
- return new EnumerableProxy(temp);
- }
-
- /// Allows enumeration of any signatures associated with the passed in id.
- /// The ID to be matched.
- /// An IEnumerable of PgpSignature objects.
- public IEnumerable GetSignaturesForId(
- string id)
- {
- if (id == null)
- throw new ArgumentNullException("id");
-
- for (int i = 0; i != ids.Count; i++)
- {
- if (id.Equals(ids[i]))
- {
- return new EnumerableProxy((IList)idSigs[i]);
- }
- }
-
- return null;
- }
-
- /// Allows enumeration of signatures associated with the passed in user attributes.
- /// The vector of user attributes to be matched.
- /// An IEnumerable of PgpSignature objects.
- public IEnumerable GetSignaturesForUserAttribute(
- PgpUserAttributeSubpacketVector userAttributes)
- {
- for (int i = 0; i != ids.Count; i++)
- {
- if (userAttributes.Equals(ids[i]))
- {
- return new EnumerableProxy((IList) idSigs[i]);
- }
- }
-
- return null;
- }
-
- /// Allows enumeration of signatures of the passed in type that are on this key.
- /// The type of the signature to be returned.
- /// An IEnumerable of PgpSignature objects.
- public IEnumerable GetSignaturesOfType(
- int signatureType)
- {
- IList temp = Platform.CreateArrayList();
-
- foreach (PgpSignature sig in GetSignatures())
- {
- if (sig.SignatureType == signatureType)
- {
- temp.Add(sig);
- }
- }
-
- return new EnumerableProxy(temp);
- }
-
- /// Allows enumeration of all signatures/certifications associated with this key.
- /// An IEnumerable with all signatures/certifications.
- public IEnumerable GetSignatures()
- {
- IList sigs = subSigs;
- if (sigs == null)
- {
- sigs = Platform.CreateArrayList(keySigs);
-
- foreach (ICollection extraSigs in idSigs)
- {
- CollectionUtilities.AddRange(sigs, extraSigs);
- }
- }
-
- return new EnumerableProxy(sigs);
- }
-
- /**
- * Return all signatures/certifications directly associated with this key (ie, not to a user id).
- *
- * @return an iterator (possibly empty) with all signatures/certifications.
- */
- public IEnumerable GetKeySignatures()
- {
- IList sigs = subSigs;
- if (sigs == null)
- {
- sigs = Platform.CreateArrayList(keySigs);
- }
- return new EnumerableProxy(sigs);
- }
-
- public PublicKeyPacket PublicKeyPacket
- {
- get { return publicPk; }
- }
-
- public byte[] GetEncoded()
- {
- MemoryStream bOut = new MemoryStream();
- Encode(bOut);
- return bOut.ToArray();
- }
-
- public void Encode(
- Stream outStr)
- {
- BcpgOutputStream bcpgOut = BcpgOutputStream.Wrap(outStr);
-
- bcpgOut.WritePacket(publicPk);
- if (trustPk != null)
- {
- bcpgOut.WritePacket(trustPk);
- }
-
- if (subSigs == null) // not a sub-key
- {
- foreach (PgpSignature keySig in keySigs)
- {
- keySig.Encode(bcpgOut);
- }
-
- for (int i = 0; i != ids.Count; i++)
- {
- if (ids[i] is string)
- {
- string id = (string) ids[i];
-
- bcpgOut.WritePacket(new UserIdPacket(id));
- }
- else
- {
- PgpUserAttributeSubpacketVector v = (PgpUserAttributeSubpacketVector)ids[i];
- bcpgOut.WritePacket(new UserAttributePacket(v.ToSubpacketArray()));
- }
-
- if (idTrusts[i] != null)
- {
- bcpgOut.WritePacket((ContainedPacket)idTrusts[i]);
- }
-
- foreach (PgpSignature sig in (IList) idSigs[i])
- {
- sig.Encode(bcpgOut);
- }
- }
- }
- else
- {
- foreach (PgpSignature subSig in subSigs)
- {
- subSig.Encode(bcpgOut);
- }
- }
- }
-
- /// Check whether this (sub)key has a revocation signature on it.
- /// True, if this (sub)key has been revoked.
- public bool IsRevoked()
- {
- int ns = 0;
- bool revoked = false;
- if (IsMasterKey) // Master key
- {
- while (!revoked && (ns < keySigs.Count))
- {
- if (((PgpSignature)keySigs[ns++]).SignatureType == PgpSignature.KeyRevocation)
- {
- revoked = true;
- }
- }
- }
- else // Sub-key
- {
- while (!revoked && (ns < subSigs.Count))
- {
- if (((PgpSignature)subSigs[ns++]).SignatureType == PgpSignature.SubkeyRevocation)
- {
- revoked = true;
- }
- }
- }
- return revoked;
- }
-
- /// Add a certification for an id to the given public key.
- /// The key the certification is to be added to.
- /// The ID the certification is associated with.
- /// The new certification.
- /// The re-certified key.
- public static PgpPublicKey AddCertification(
- PgpPublicKey key,
- string id,
- PgpSignature certification)
- {
- return AddCert(key, id, certification);
- }
-
- /// Add a certification for the given UserAttributeSubpackets to the given public key.
- /// The key the certification is to be added to.
- /// The attributes the certification is associated with.
- /// The new certification.
- /// The re-certified key.
- public static PgpPublicKey AddCertification(
- PgpPublicKey key,
- PgpUserAttributeSubpacketVector userAttributes,
- PgpSignature certification)
- {
- return AddCert(key, userAttributes, certification);
- }
-
- private static PgpPublicKey AddCert(
- PgpPublicKey key,
- object id,
- PgpSignature certification)
- {
- PgpPublicKey returnKey = new PgpPublicKey(key);
- IList sigList = null;
-
- for (int i = 0; i != returnKey.ids.Count; i++)
- {
- if (id.Equals(returnKey.ids[i]))
- {
- sigList = (IList) returnKey.idSigs[i];
- }
- }
-
- if (sigList != null)
- {
- sigList.Add(certification);
- }
- else
- {
- sigList = Platform.CreateArrayList();
- sigList.Add(certification);
- returnKey.ids.Add(id);
- returnKey.idTrusts.Add(null);
- returnKey.idSigs.Add(sigList);
- }
-
- return returnKey;
- }
-
- ///
- /// Remove any certifications associated with a user attribute subpacket on a key.
- ///
- /// The key the certifications are to be removed from.
- /// The attributes to be removed.
- ///
- /// The re-certified key, or null if the user attribute subpacket was not found on the key.
- ///
- public static PgpPublicKey RemoveCertification(
- PgpPublicKey key,
- PgpUserAttributeSubpacketVector userAttributes)
- {
- return RemoveCert(key, userAttributes);
- }
-
- /// Remove any certifications associated with a given ID on a key.
- /// The key the certifications are to be removed from.
- /// The ID that is to be removed.
- /// The re-certified key, or null if the ID was not found on the key.
- public static PgpPublicKey RemoveCertification(
- PgpPublicKey key,
- string id)
- {
- return RemoveCert(key, id);
- }
-
- private static PgpPublicKey RemoveCert(
- PgpPublicKey key,
- object id)
- {
- PgpPublicKey returnKey = new PgpPublicKey(key);
- bool found = false;
-
- for (int i = 0; i < returnKey.ids.Count; i++)
- {
- if (id.Equals(returnKey.ids[i]))
- {
- found = true;
- returnKey.ids.RemoveAt(i);
- returnKey.idTrusts.RemoveAt(i);
- returnKey.idSigs.RemoveAt(i);
- }
- }
-
- return found ? returnKey : null;
- }
-
- /// Remove a certification associated with a given ID on a key.
- /// The key the certifications are to be removed from.
- /// The ID that the certfication is to be removed from.
- /// The certfication to be removed.
- /// The re-certified key, or null if the certification was not found.
- public static PgpPublicKey RemoveCertification(
- PgpPublicKey key,
- string id,
- PgpSignature certification)
- {
- return RemoveCert(key, id, certification);
- }
-
- /// Remove a certification associated with a given user attributes on a key.
- /// The key the certifications are to be removed from.
- /// The user attributes that the certfication is to be removed from.
- /// The certification to be removed.
- /// The re-certified key, or null if the certification was not found.
- public static PgpPublicKey RemoveCertification(
- PgpPublicKey key,
- PgpUserAttributeSubpacketVector userAttributes,
- PgpSignature certification)
- {
- return RemoveCert(key, userAttributes, certification);
- }
-
- private static PgpPublicKey RemoveCert(
- PgpPublicKey key,
- object id,
- PgpSignature certification)
- {
- PgpPublicKey returnKey = new PgpPublicKey(key);
- bool found = false;
-
- for (int i = 0; i < returnKey.ids.Count; i++)
- {
- if (id.Equals(returnKey.ids[i]))
- {
- IList certs = (IList) returnKey.idSigs[i];
- found = certs.Contains(certification);
-
- if (found)
- {
- certs.Remove(certification);
- }
- }
- }
-
- return found ? returnKey : null;
- }
-
- /// Add a revocation or some other key certification to a key.
- /// The key the revocation is to be added to.
- /// The key signature to be added.
- /// The new changed public key object.
- public static PgpPublicKey AddCertification(
- PgpPublicKey key,
- PgpSignature certification)
- {
- if (key.IsMasterKey)
- {
- if (certification.SignatureType == PgpSignature.SubkeyRevocation)
- {
- throw new ArgumentException("signature type incorrect for master key revocation.");
- }
- }
- else
- {
- if (certification.SignatureType == PgpSignature.KeyRevocation)
- {
- throw new ArgumentException("signature type incorrect for sub-key revocation.");
- }
- }
-
- PgpPublicKey returnKey = new PgpPublicKey(key);
-
- if (returnKey.subSigs != null)
- {
- returnKey.subSigs.Add(certification);
- }
- else
- {
- returnKey.keySigs.Add(certification);
- }
-
- return returnKey;
- }
-
- /// Remove a certification from the key.
- /// The key the certifications are to be removed from.
- /// The certfication to be removed.
- /// The modified key, null if the certification was not found.
- public static PgpPublicKey RemoveCertification(
- PgpPublicKey key,
- PgpSignature certification)
- {
- PgpPublicKey returnKey = new PgpPublicKey(key);
- IList sigs = returnKey.subSigs != null
- ? returnKey.subSigs
- : returnKey.keySigs;
-
-// bool found = sigs.Remove(certification);
- int pos = sigs.IndexOf(certification);
- bool found = pos >= 0;
-
- if (found)
- {
- sigs.RemoveAt(pos);
- }
- else
- {
- foreach (String id in key.GetUserIds())
- {
- foreach (object sig in key.GetSignaturesForId(id))
- {
- // TODO Is this the right type of equality test?
- if (certification == sig)
- {
- found = true;
- returnKey = PgpPublicKey.RemoveCertification(returnKey, id, certification);
- }
- }
- }
-
- if (!found)
- {
- foreach (PgpUserAttributeSubpacketVector id in key.GetUserAttributes())
- {
- foreach (object sig in key.GetSignaturesForUserAttribute(id))
- {
- // TODO Is this the right type of equality test?
- if (certification == sig)
- {
- found = true;
- returnKey = PgpPublicKey.RemoveCertification(returnKey, id, certification);
- }
- }
- }
- }
- }
-
- return returnKey;
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpPublicKeyEncryptedData.cs b/BCCrypto/src/openpgp/PgpPublicKeyEncryptedData.cs
deleted file mode 100644
index c2a3511..0000000
--- a/BCCrypto/src/openpgp/PgpPublicKeyEncryptedData.cs
+++ /dev/null
@@ -1,272 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.IO;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// A public key encrypted data object.
- public class PgpPublicKeyEncryptedData
- : PgpEncryptedData
- {
- private PublicKeyEncSessionPacket keyData;
-
- internal PgpPublicKeyEncryptedData(
- PublicKeyEncSessionPacket keyData,
- InputStreamPacket encData)
- : base(encData)
- {
- this.keyData = keyData;
- }
-
- private static IBufferedCipher GetKeyCipher(
- PublicKeyAlgorithmTag algorithm)
- {
- try
- {
- switch (algorithm)
- {
- case PublicKeyAlgorithmTag.RsaEncrypt:
- case PublicKeyAlgorithmTag.RsaGeneral:
- return CipherUtilities.GetCipher("RSA//PKCS1Padding");
- case PublicKeyAlgorithmTag.ElGamalEncrypt:
- case PublicKeyAlgorithmTag.ElGamalGeneral:
- return CipherUtilities.GetCipher("ElGamal/ECB/PKCS1Padding");
- default:
- throw new PgpException("unknown asymmetric algorithm: " + algorithm);
- }
- }
- catch (PgpException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new PgpException("Exception creating cipher", e);
- }
- }
-
- private bool ConfirmCheckSum(
- byte[] sessionInfo)
- {
- int check = 0;
-
- for (int i = 1; i != sessionInfo.Length - 2; i++)
- {
- check += sessionInfo[i] & 0xff;
- }
-
- return (sessionInfo[sessionInfo.Length - 2] == (byte)(check >> 8))
- && (sessionInfo[sessionInfo.Length - 1] == (byte)(check));
- }
-
- /// The key ID for the key used to encrypt the data.
- public long KeyId
- {
- get { return keyData.KeyId; }
- }
-
- ///
- /// Return the algorithm code for the symmetric algorithm used to encrypt the data.
- ///
- public SymmetricKeyAlgorithmTag GetSymmetricAlgorithm(
- PgpPrivateKey privKey)
- {
- byte[] sessionData = RecoverSessionData(privKey);
-
- return (SymmetricKeyAlgorithmTag)sessionData[0];
- }
-
- /// Return the decrypted data stream for the packet.
- public Stream GetDataStream(
- PgpPrivateKey privKey)
- {
- byte[] sessionData = RecoverSessionData(privKey);
-
- if (!ConfirmCheckSum(sessionData))
- throw new PgpKeyValidationException("key checksum failed");
-
- SymmetricKeyAlgorithmTag symmAlg = (SymmetricKeyAlgorithmTag)sessionData[0];
- if (symmAlg == SymmetricKeyAlgorithmTag.Null)
- return encData.GetInputStream();
-
- IBufferedCipher cipher;
- string cipherName = PgpUtilities.GetSymmetricCipherName(symmAlg);
- string cName = cipherName;
-
- try
- {
- if (encData is SymmetricEncIntegrityPacket)
- {
- cName += "/CFB/NoPadding";
- }
- else
- {
- cName += "/OpenPGPCFB/NoPadding";
- }
-
- cipher = CipherUtilities.GetCipher(cName);
- }
- catch (PgpException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new PgpException("exception creating cipher", e);
- }
-
- try
- {
- KeyParameter key = ParameterUtilities.CreateKeyParameter(
- cipherName, sessionData, 1, sessionData.Length - 3);
-
- byte[] iv = new byte[cipher.GetBlockSize()];
-
- cipher.Init(false, new ParametersWithIV(key, iv));
-
- encStream = BcpgInputStream.Wrap(new CipherStream(encData.GetInputStream(), cipher, null));
-
- if (encData is SymmetricEncIntegrityPacket)
- {
- truncStream = new TruncatedStream(encStream);
-
- string digestName = PgpUtilities.GetDigestName(HashAlgorithmTag.Sha1);
- IDigest digest = DigestUtilities.GetDigest(digestName);
-
- encStream = new DigestStream(truncStream, digest, null);
- }
-
- if (Streams.ReadFully(encStream, iv, 0, iv.Length) < iv.Length)
- throw new EndOfStreamException("unexpected end of stream.");
-
- int v1 = encStream.ReadByte();
- int v2 = encStream.ReadByte();
-
- if (v1 < 0 || v2 < 0)
- throw new EndOfStreamException("unexpected end of stream.");
-
- // Note: the oracle attack on the "quick check" bytes is deemed
- // a security risk for typical public key encryption usages,
- // therefore we do not perform the check.
-
-// bool repeatCheckPassed =
-// iv[iv.Length - 2] == (byte)v1
-// && iv[iv.Length - 1] == (byte)v2;
-//
-// // Note: some versions of PGP appear to produce 0 for the extra
-// // bytes rather than repeating the two previous bytes
-// bool zeroesCheckPassed =
-// v1 == 0
-// && v2 == 0;
-//
-// if (!repeatCheckPassed && !zeroesCheckPassed)
-// {
-// throw new PgpDataValidationException("quick check failed.");
-// }
-
- return encStream;
- }
- catch (PgpException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new PgpException("Exception starting decryption", e);
- }
- }
-
- private byte[] RecoverSessionData(PgpPrivateKey privKey)
- {
- byte[][] secKeyData = keyData.GetEncSessionKey();
-
- if (keyData.Algorithm == PublicKeyAlgorithmTag.ECDH)
- {
- ECDHPublicBcpgKey ecKey = (ECDHPublicBcpgKey)privKey.PublicKeyPacket.Key;
- X9ECParameters x9Params = ECKeyPairGenerator.FindECCurveByOid(ecKey.CurveOid);
-
- byte[] enc = secKeyData[0];
-
- int pLen = ((((enc[0] & 0xff) << 8) + (enc[1] & 0xff)) + 7) / 8;
- byte[] pEnc = new byte[pLen];
-
- Array.Copy(enc, 2, pEnc, 0, pLen);
-
- byte[] keyEnc = new byte[enc[pLen + 2]];
-
- Array.Copy(enc, 2 + pLen + 1, keyEnc, 0, keyEnc.Length);
-
- ECPoint publicPoint = x9Params.Curve.DecodePoint(pEnc);
-
- ECPrivateKeyParameters privKeyParams = (ECPrivateKeyParameters)privKey.Key;
- ECPoint S = publicPoint.Multiply(privKeyParams.D).Normalize();
-
- KeyParameter key = new KeyParameter(Rfc6637Utilities.CreateKey(privKey.PublicKeyPacket, S));
-
- IWrapper w = PgpUtilities.CreateWrapper(ecKey.SymmetricKeyAlgorithm);
- w.Init(false, key);
-
- return PgpPad.UnpadSessionData(w.Unwrap(keyEnc, 0, keyEnc.Length));
- }
-
- IBufferedCipher cipher = GetKeyCipher(keyData.Algorithm);
-
- try
- {
- cipher.Init(false, privKey.Key);
- }
- catch (InvalidKeyException e)
- {
- throw new PgpException("error setting asymmetric cipher", e);
- }
-
- if (keyData.Algorithm == PublicKeyAlgorithmTag.RsaEncrypt
- || keyData.Algorithm == PublicKeyAlgorithmTag.RsaGeneral)
- {
- byte[] bi = secKeyData[0];
-
- cipher.ProcessBytes(bi, 2, bi.Length - 2);
- }
- else
- {
- ElGamalPrivateKeyParameters k = (ElGamalPrivateKeyParameters)privKey.Key;
- int size = (k.Parameters.P.BitLength + 7) / 8;
-
- ProcessEncodedMpi(cipher, size, secKeyData[0]);
- ProcessEncodedMpi(cipher, size, secKeyData[1]);
- }
-
- try
- {
- return cipher.DoFinal();
- }
- catch (Exception e)
- {
- throw new PgpException("exception decrypting secret key", e);
- }
- }
-
- private static void ProcessEncodedMpi(IBufferedCipher cipher, int size, byte[] mpiEnc)
- {
- if (mpiEnc.Length - 2 > size) // leading Zero? Shouldn't happen but...
- {
- cipher.ProcessBytes(mpiEnc, 3, mpiEnc.Length - 3);
- }
- else
- {
- byte[] tmp = new byte[size];
- Array.Copy(mpiEnc, 2, tmp, tmp.Length - (mpiEnc.Length - 2), mpiEnc.Length - 2);
- cipher.ProcessBytes(tmp, 0, tmp.Length);
- }
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpPublicKeyRing.cs b/BCCrypto/src/openpgp/PgpPublicKeyRing.cs
deleted file mode 100644
index 92464d6..0000000
--- a/BCCrypto/src/openpgp/PgpPublicKeyRing.cs
+++ /dev/null
@@ -1,200 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- ///
- /// Class to hold a single master public key and its subkeys.
- ///
- /// Often PGP keyring files consist of multiple master keys, if you are trying to process
- /// or construct one of these you should use the PgpPublicKeyRingBundle class.
- ///
- ///
- public class PgpPublicKeyRing
- : PgpKeyRing
- {
- private readonly IList keys;
-
- public PgpPublicKeyRing(
- byte[] encoding)
- : this(new MemoryStream(encoding, false))
- {
- }
-
- internal PgpPublicKeyRing(
- IList pubKeys)
- {
- this.keys = pubKeys;
- }
-
- public PgpPublicKeyRing(
- Stream inputStream)
- {
- this.keys = Platform.CreateArrayList();
-
- BcpgInputStream bcpgInput = BcpgInputStream.Wrap(inputStream);
-
- PacketTag initialTag = bcpgInput.NextPacketTag();
- if (initialTag != PacketTag.PublicKey && initialTag != PacketTag.PublicSubkey)
- {
- throw new IOException("public key ring doesn't start with public key tag: "
- + "tag 0x" + ((int)initialTag).ToString("X"));
- }
-
- PublicKeyPacket pubPk = (PublicKeyPacket) bcpgInput.ReadPacket();
- TrustPacket trustPk = ReadOptionalTrustPacket(bcpgInput);
-
- // direct signatures and revocations
- IList keySigs = ReadSignaturesAndTrust(bcpgInput);
-
- IList ids, idTrusts, idSigs;
- ReadUserIDs(bcpgInput, out ids, out idTrusts, out idSigs);
-
- keys.Add(new PgpPublicKey(pubPk, trustPk, keySigs, ids, idTrusts, idSigs));
-
-
- // Read subkeys
- while (bcpgInput.NextPacketTag() == PacketTag.PublicSubkey)
- {
- keys.Add(ReadSubkey(bcpgInput));
- }
- }
-
- /// Return the first public key in the ring.
- public virtual PgpPublicKey GetPublicKey()
- {
- return (PgpPublicKey) keys[0];
- }
-
- /// Return the public key referred to by the passed in key ID if it is present.
- public virtual PgpPublicKey GetPublicKey(
- long keyId)
- {
- foreach (PgpPublicKey k in keys)
- {
- if (keyId == k.KeyId)
- {
- return k;
- }
- }
-
- return null;
- }
-
- /// Allows enumeration of all the public keys.
- /// An IEnumerable of PgpPublicKey objects.
- public virtual IEnumerable GetPublicKeys()
- {
- return new EnumerableProxy(keys);
- }
-
- public virtual byte[] GetEncoded()
- {
- MemoryStream bOut = new MemoryStream();
-
- Encode(bOut);
-
- return bOut.ToArray();
- }
-
- public virtual void Encode(
- Stream outStr)
- {
- if (outStr == null)
- throw new ArgumentNullException("outStr");
-
- foreach (PgpPublicKey k in keys)
- {
- k.Encode(outStr);
- }
- }
-
- ///
- /// Returns a new key ring with the public key passed in either added or
- /// replacing an existing one.
- ///
- /// The public key ring to be modified.
- /// The public key to be inserted.
- /// A new PgpPublicKeyRing
- public static PgpPublicKeyRing InsertPublicKey(
- PgpPublicKeyRing pubRing,
- PgpPublicKey pubKey)
- {
- IList keys = Platform.CreateArrayList(pubRing.keys);
- bool found = false;
- bool masterFound = false;
-
- for (int i = 0; i != keys.Count; i++)
- {
- PgpPublicKey key = (PgpPublicKey) keys[i];
-
- if (key.KeyId == pubKey.KeyId)
- {
- found = true;
- keys[i] = pubKey;
- }
- if (key.IsMasterKey)
- {
- masterFound = true;
- }
- }
-
- if (!found)
- {
- if (pubKey.IsMasterKey)
- {
- if (masterFound)
- throw new ArgumentException("cannot add a master key to a ring that already has one");
-
- keys.Insert(0, pubKey);
- }
- else
- {
- keys.Add(pubKey);
- }
- }
-
- return new PgpPublicKeyRing(keys);
- }
-
- /// Returns a new key ring with the public key passed in removed from the key ring.
- /// The public key ring to be modified.
- /// The public key to be removed.
- /// A new PgpPublicKeyRing , or null if pubKey is not found.
- public static PgpPublicKeyRing RemovePublicKey(
- PgpPublicKeyRing pubRing,
- PgpPublicKey pubKey)
- {
- IList keys = Platform.CreateArrayList(pubRing.keys);
- bool found = false;
-
- for (int i = 0; i < keys.Count; i++)
- {
- PgpPublicKey key = (PgpPublicKey) keys[i];
-
- if (key.KeyId == pubKey.KeyId)
- {
- found = true;
- keys.RemoveAt(i);
- }
- }
-
- return found ? new PgpPublicKeyRing(keys) : null;
- }
-
- internal static PgpPublicKey ReadSubkey(BcpgInputStream bcpgInput)
- {
- PublicKeyPacket pk = (PublicKeyPacket) bcpgInput.ReadPacket();
- TrustPacket kTrust = ReadOptionalTrustPacket(bcpgInput);
-
- // PGP 8 actually leaves out the signature.
- IList sigList = ReadSignaturesAndTrust(bcpgInput);
-
- return new PgpPublicKey(pk, kTrust, sigList);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpPublicKeyRingBundle.cs b/BCCrypto/src/openpgp/PgpPublicKeyRingBundle.cs
deleted file mode 100644
index 91113e9..0000000
--- a/BCCrypto/src/openpgp/PgpPublicKeyRingBundle.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- ///
- /// Often a PGP key ring file is made up of a succession of master/sub-key key rings.
- /// If you want to read an entire public key file in one hit this is the class for you.
- ///
- public class PgpPublicKeyRingBundle
- {
- private readonly IDictionary pubRings;
- private readonly IList order;
-
- private PgpPublicKeyRingBundle(
- IDictionary pubRings,
- IList order)
- {
- this.pubRings = pubRings;
- this.order = order;
- }
-
- public PgpPublicKeyRingBundle(
- byte[] encoding)
- : this(new MemoryStream(encoding, false))
- {
- }
-
- /// Build a PgpPublicKeyRingBundle from the passed in input stream.
- /// Input stream containing data.
- /// If a problem parsing the stream occurs.
- /// If an object is encountered which isn't a PgpPublicKeyRing.
- public PgpPublicKeyRingBundle(
- Stream inputStream)
- : this(new PgpObjectFactory(inputStream).AllPgpObjects())
- {
- }
-
- public PgpPublicKeyRingBundle(
- IEnumerable e)
- {
- this.pubRings = Platform.CreateHashtable();
- this.order = Platform.CreateArrayList();
-
- foreach (object obj in e)
- {
- PgpPublicKeyRing pgpPub = obj as PgpPublicKeyRing;
-
- if (pgpPub == null)
- {
- throw new PgpException(Platform.GetTypeName(obj) + " found where PgpPublicKeyRing expected");
- }
-
- long key = pgpPub.GetPublicKey().KeyId;
- pubRings.Add(key, pgpPub);
- order.Add(key);
- }
- }
-
- [Obsolete("Use 'Count' property instead")]
- public int Size
- {
- get { return order.Count; }
- }
-
- /// Return the number of key rings in this collection.
- public int Count
- {
- get { return order.Count; }
- }
-
- /// Allow enumeration of the public key rings making up this collection.
- public IEnumerable GetKeyRings()
- {
- return new EnumerableProxy(pubRings.Values);
- }
-
- /// Allow enumeration of the key rings associated with the passed in userId.
- /// The user ID to be matched.
- /// An IEnumerable of key rings which matched (possibly none).
- public IEnumerable GetKeyRings(
- string userId)
- {
- return GetKeyRings(userId, false, false);
- }
-
- /// Allow enumeration of the key rings associated with the passed in userId.
- /// The user ID to be matched.
- /// If true, userId need only be a substring of an actual ID string to match.
- /// An IEnumerable of key rings which matched (possibly none).
- public IEnumerable GetKeyRings(
- string userId,
- bool matchPartial)
- {
- return GetKeyRings(userId, matchPartial, false);
- }
-
- /// Allow enumeration of the key rings associated with the passed in userId.
- /// The user ID to be matched.
- /// If true, userId need only be a substring of an actual ID string to match.
- /// If true, case is ignored in user ID comparisons.
- /// An IEnumerable of key rings which matched (possibly none).
- public IEnumerable GetKeyRings(
- string userId,
- bool matchPartial,
- bool ignoreCase)
- {
- IList rings = Platform.CreateArrayList();
-
- if (ignoreCase)
- {
- userId = Platform.ToUpperInvariant(userId);
- }
-
- foreach (PgpPublicKeyRing pubRing in GetKeyRings())
- {
- foreach (string nextUserID in pubRing.GetPublicKey().GetUserIds())
- {
- string next = nextUserID;
- if (ignoreCase)
- {
- next = Platform.ToUpperInvariant(next);
- }
-
- if (matchPartial)
- {
- if (Platform.IndexOf(next, userId) > -1)
- {
- rings.Add(pubRing);
- }
- }
- else
- {
- if (next.Equals(userId))
- {
- rings.Add(pubRing);
- }
- }
- }
- }
-
- return new EnumerableProxy(rings);
- }
-
- /// Return the PGP public key associated with the given key id.
- /// The ID of the public key to return.
- public PgpPublicKey GetPublicKey(
- long keyId)
- {
- foreach (PgpPublicKeyRing pubRing in GetKeyRings())
- {
- PgpPublicKey pub = pubRing.GetPublicKey(keyId);
-
- if (pub != null)
- {
- return pub;
- }
- }
-
- return null;
- }
-
- /// Return the public key ring which contains the key referred to by keyId
- /// key ID to match against
- public PgpPublicKeyRing GetPublicKeyRing(
- long keyId)
- {
- if (pubRings.Contains(keyId))
- {
- return (PgpPublicKeyRing)pubRings[keyId];
- }
-
- foreach (PgpPublicKeyRing pubRing in GetKeyRings())
- {
- PgpPublicKey pub = pubRing.GetPublicKey(keyId);
-
- if (pub != null)
- {
- return pubRing;
- }
- }
-
- return null;
- }
-
- ///
- /// Return true if a key matching the passed in key ID is present, false otherwise.
- ///
- /// key ID to look for.
- public bool Contains(
- long keyID)
- {
- return GetPublicKey(keyID) != null;
- }
-
- public byte[] GetEncoded()
- {
- MemoryStream bOut = new MemoryStream();
-
- Encode(bOut);
-
- return bOut.ToArray();
- }
-
- public void Encode(
- Stream outStr)
- {
- BcpgOutputStream bcpgOut = BcpgOutputStream.Wrap(outStr);
-
- foreach (long key in order)
- {
- PgpPublicKeyRing sec = (PgpPublicKeyRing) pubRings[key];
-
- sec.Encode(bcpgOut);
- }
- }
-
- ///
- /// Return a new bundle containing the contents of the passed in bundle and
- /// the passed in public key ring.
- ///
- /// The PgpPublicKeyRingBundle the key ring is to be added to.
- /// The key ring to be added.
- /// A new PgpPublicKeyRingBundle merging the current one with the passed in key ring.
- /// If the keyId for the passed in key ring is already present.
- public static PgpPublicKeyRingBundle AddPublicKeyRing(
- PgpPublicKeyRingBundle bundle,
- PgpPublicKeyRing publicKeyRing)
- {
- long key = publicKeyRing.GetPublicKey().KeyId;
-
- if (bundle.pubRings.Contains(key))
- {
- throw new ArgumentException("Bundle already contains a key with a keyId for the passed in ring.");
- }
-
- IDictionary newPubRings = Platform.CreateHashtable(bundle.pubRings);
- IList newOrder = Platform.CreateArrayList(bundle.order);
-
- newPubRings[key] = publicKeyRing;
-
- newOrder.Add(key);
-
- return new PgpPublicKeyRingBundle(newPubRings, newOrder);
- }
-
- ///
- /// Return a new bundle containing the contents of the passed in bundle with
- /// the passed in public key ring removed.
- ///
- /// The PgpPublicKeyRingBundle the key ring is to be removed from.
- /// The key ring to be removed.
- /// A new PgpPublicKeyRingBundle not containing the passed in key ring.
- /// If the keyId for the passed in key ring is not present.
- public static PgpPublicKeyRingBundle RemovePublicKeyRing(
- PgpPublicKeyRingBundle bundle,
- PgpPublicKeyRing publicKeyRing)
- {
- long key = publicKeyRing.GetPublicKey().KeyId;
-
- if (!bundle.pubRings.Contains(key))
- {
- throw new ArgumentException("Bundle does not contain a key with a keyId for the passed in ring.");
- }
-
- IDictionary newPubRings = Platform.CreateHashtable(bundle.pubRings);
- IList newOrder = Platform.CreateArrayList(bundle.order);
-
- newPubRings.Remove(key);
- newOrder.Remove(key);
-
- return new PgpPublicKeyRingBundle(newPubRings, newOrder);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpSecretKey.cs b/BCCrypto/src/openpgp/PgpSecretKey.cs
deleted file mode 100644
index b398607..0000000
--- a/BCCrypto/src/openpgp/PgpSecretKey.cs
+++ /dev/null
@@ -1,1295 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// General class to handle a PGP secret key object.
- public class PgpSecretKey
- {
- private readonly SecretKeyPacket secret;
- private readonly PgpPublicKey pub;
-
- internal PgpSecretKey(
- SecretKeyPacket secret,
- PgpPublicKey pub)
- {
- this.secret = secret;
- this.pub = pub;
- }
-
- internal PgpSecretKey(
- PgpPrivateKey privKey,
- PgpPublicKey pubKey,
- SymmetricKeyAlgorithmTag encAlgorithm,
- byte[] rawPassPhrase,
- bool clearPassPhrase,
- bool useSha1,
- SecureRandom rand,
- bool isMasterKey)
- {
- BcpgObject secKey;
-
- this.pub = pubKey;
-
- switch (pubKey.Algorithm)
- {
- case PublicKeyAlgorithmTag.RsaEncrypt:
- case PublicKeyAlgorithmTag.RsaSign:
- case PublicKeyAlgorithmTag.RsaGeneral:
- RsaPrivateCrtKeyParameters rsK = (RsaPrivateCrtKeyParameters) privKey.Key;
- secKey = new RsaSecretBcpgKey(rsK.Exponent, rsK.P, rsK.Q);
- break;
- case PublicKeyAlgorithmTag.Dsa:
- DsaPrivateKeyParameters dsK = (DsaPrivateKeyParameters) privKey.Key;
- secKey = new DsaSecretBcpgKey(dsK.X);
- break;
- case PublicKeyAlgorithmTag.ECDH:
- case PublicKeyAlgorithmTag.ECDsa:
- ECPrivateKeyParameters ecK = (ECPrivateKeyParameters)privKey.Key;
- secKey = new ECSecretBcpgKey(ecK.D);
- break;
- case PublicKeyAlgorithmTag.ElGamalEncrypt:
- case PublicKeyAlgorithmTag.ElGamalGeneral:
- ElGamalPrivateKeyParameters esK = (ElGamalPrivateKeyParameters) privKey.Key;
- secKey = new ElGamalSecretBcpgKey(esK.X);
- break;
- default:
- throw new PgpException("unknown key class");
- }
-
- try
- {
- MemoryStream bOut = new MemoryStream();
- BcpgOutputStream pOut = new BcpgOutputStream(bOut);
-
- pOut.WriteObject(secKey);
-
- byte[] keyData = bOut.ToArray();
- byte[] checksumData = Checksum(useSha1, keyData, keyData.Length);
-
- keyData = Arrays.Concatenate(keyData, checksumData);
-
- if (encAlgorithm == SymmetricKeyAlgorithmTag.Null)
- {
- if (isMasterKey)
- {
- this.secret = new SecretKeyPacket(pub.publicPk, encAlgorithm, null, null, keyData);
- }
- else
- {
- this.secret = new SecretSubkeyPacket(pub.publicPk, encAlgorithm, null, null, keyData);
- }
- }
- else
- {
- S2k s2k;
- byte[] iv;
-
- byte[] encData;
- if (pub.Version >= 4)
- {
- encData = EncryptKeyDataV4(keyData, encAlgorithm, HashAlgorithmTag.Sha1, rawPassPhrase, clearPassPhrase, rand, out s2k, out iv);
- }
- else
- {
- encData = EncryptKeyDataV3(keyData, encAlgorithm, rawPassPhrase, clearPassPhrase, rand, out s2k, out iv);
- }
-
- int s2kUsage = useSha1
- ? SecretKeyPacket.UsageSha1
- : SecretKeyPacket.UsageChecksum;
-
- if (isMasterKey)
- {
- this.secret = new SecretKeyPacket(pub.publicPk, encAlgorithm, s2kUsage, s2k, iv, encData);
- }
- else
- {
- this.secret = new SecretSubkeyPacket(pub.publicPk, encAlgorithm, s2kUsage, s2k, iv, encData);
- }
- }
- }
- catch (PgpException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new PgpException("Exception encrypting key", e);
- }
- }
-
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- [Obsolete("Use the constructor taking an explicit 'useSha1' parameter instead")]
- public PgpSecretKey(
- int certificationLevel,
- PgpKeyPair keyPair,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- char[] passPhrase,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, keyPair, id, encAlgorithm, passPhrase, false, hashedPackets, unhashedPackets, rand)
- {
- }
-
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- public PgpSecretKey(
- int certificationLevel,
- PgpKeyPair keyPair,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- char[] passPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, keyPair, id, encAlgorithm, false, passPhrase, useSha1, hashedPackets, unhashedPackets, rand)
- {
- }
-
- ///
- /// If utf8PassPhrase is true, conversion of the passphrase to bytes uses Encoding.UTF8.GetBytes(), otherwise the conversion
- /// is performed using Convert.ToByte(), which is the historical behaviour of the library (1.7 and earlier).
- ///
- public PgpSecretKey(
- int certificationLevel,
- PgpKeyPair keyPair,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- bool utf8PassPhrase,
- char[] passPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, keyPair, id, encAlgorithm,
- PgpUtilities.EncodePassPhrase(passPhrase, utf8PassPhrase), true,
- useSha1, hashedPackets, unhashedPackets, rand)
- {
- }
-
- ///
- /// Allows the caller to handle the encoding of the passphrase to bytes.
- ///
- public PgpSecretKey(
- int certificationLevel,
- PgpKeyPair keyPair,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- byte[] rawPassPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, keyPair, id, encAlgorithm, rawPassPhrase, false, useSha1, hashedPackets, unhashedPackets, rand)
- {
- }
-
- internal PgpSecretKey(
- int certificationLevel,
- PgpKeyPair keyPair,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- byte[] rawPassPhrase,
- bool clearPassPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(keyPair.PrivateKey, CertifiedPublicKey(certificationLevel, keyPair, id, hashedPackets, unhashedPackets),
- encAlgorithm, rawPassPhrase, clearPassPhrase, useSha1, rand, true)
- {
- }
-
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- public PgpSecretKey(
- int certificationLevel,
- PgpKeyPair keyPair,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- HashAlgorithmTag hashAlgorithm,
- char[] passPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, keyPair, id, encAlgorithm, hashAlgorithm, false, passPhrase, useSha1, hashedPackets, unhashedPackets, rand)
- {
- }
-
- ///
- /// If utf8PassPhrase is true, conversion of the passphrase to bytes uses Encoding.UTF8.GetBytes(), otherwise the conversion
- /// is performed using Convert.ToByte(), which is the historical behaviour of the library (1.7 and earlier).
- ///
- public PgpSecretKey(
- int certificationLevel,
- PgpKeyPair keyPair,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- HashAlgorithmTag hashAlgorithm,
- bool utf8PassPhrase,
- char[] passPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, keyPair, id, encAlgorithm, hashAlgorithm,
- PgpUtilities.EncodePassPhrase(passPhrase, utf8PassPhrase), true,
- useSha1, hashedPackets, unhashedPackets, rand)
- {
- }
-
- ///
- /// Allows the caller to handle the encoding of the passphrase to bytes.
- ///
- public PgpSecretKey(
- int certificationLevel,
- PgpKeyPair keyPair,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- HashAlgorithmTag hashAlgorithm,
- byte[] rawPassPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, keyPair, id, encAlgorithm, hashAlgorithm, rawPassPhrase, false, useSha1, hashedPackets, unhashedPackets, rand)
- {
- }
-
- internal PgpSecretKey(
- int certificationLevel,
- PgpKeyPair keyPair,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- HashAlgorithmTag hashAlgorithm,
- byte[] rawPassPhrase,
- bool clearPassPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(keyPair.PrivateKey, CertifiedPublicKey(certificationLevel, keyPair, id, hashedPackets, unhashedPackets, hashAlgorithm),
- encAlgorithm, rawPassPhrase, clearPassPhrase, useSha1, rand, true)
- {
- }
-
- private static PgpPublicKey CertifiedPublicKey(
- int certificationLevel,
- PgpKeyPair keyPair,
- string id,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets)
- {
- PgpSignatureGenerator sGen;
- try
- {
- sGen = new PgpSignatureGenerator(keyPair.PublicKey.Algorithm, HashAlgorithmTag.Sha1);
- }
- catch (Exception e)
- {
- throw new PgpException("Creating signature generator: " + e.Message, e);
- }
-
- //
- // Generate the certification
- //
- sGen.InitSign(certificationLevel, keyPair.PrivateKey);
-
- sGen.SetHashedSubpackets(hashedPackets);
- sGen.SetUnhashedSubpackets(unhashedPackets);
-
- try
- {
- PgpSignature certification = sGen.GenerateCertification(id, keyPair.PublicKey);
- return PgpPublicKey.AddCertification(keyPair.PublicKey, id, certification);
- }
- catch (Exception e)
- {
- throw new PgpException("Exception doing certification: " + e.Message, e);
- }
- }
-
-
- private static PgpPublicKey CertifiedPublicKey(
- int certificationLevel,
- PgpKeyPair keyPair,
- string id,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- HashAlgorithmTag hashAlgorithm)
- {
- PgpSignatureGenerator sGen;
- try
- {
- sGen = new PgpSignatureGenerator(keyPair.PublicKey.Algorithm, hashAlgorithm);
- }
- catch (Exception e)
- {
- throw new PgpException("Creating signature generator: " + e.Message, e);
- }
-
- //
- // Generate the certification
- //
- sGen.InitSign(certificationLevel, keyPair.PrivateKey);
-
- sGen.SetHashedSubpackets(hashedPackets);
- sGen.SetUnhashedSubpackets(unhashedPackets);
-
- try
- {
- PgpSignature certification = sGen.GenerateCertification(id, keyPair.PublicKey);
- return PgpPublicKey.AddCertification(keyPair.PublicKey, id, certification);
- }
- catch (Exception e)
- {
- throw new PgpException("Exception doing certification: " + e.Message, e);
- }
- }
-
- public PgpSecretKey(
- int certificationLevel,
- PublicKeyAlgorithmTag algorithm,
- AsymmetricKeyParameter pubKey,
- AsymmetricKeyParameter privKey,
- DateTime time,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- char[] passPhrase,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel,
- new PgpKeyPair(algorithm, pubKey, privKey, time),
- id, encAlgorithm, passPhrase, false, hashedPackets, unhashedPackets, rand)
- {
- }
-
- public PgpSecretKey(
- int certificationLevel,
- PublicKeyAlgorithmTag algorithm,
- AsymmetricKeyParameter pubKey,
- AsymmetricKeyParameter privKey,
- DateTime time,
- string id,
- SymmetricKeyAlgorithmTag encAlgorithm,
- char[] passPhrase,
- bool useSha1,
- PgpSignatureSubpacketVector hashedPackets,
- PgpSignatureSubpacketVector unhashedPackets,
- SecureRandom rand)
- : this(certificationLevel, new PgpKeyPair(algorithm, pubKey, privKey, time), id, encAlgorithm, passPhrase, useSha1, hashedPackets, unhashedPackets, rand)
- {
- }
-
- ///
- /// Check if this key has an algorithm type that makes it suitable to use for signing.
- ///
- ///
- /// Note: with version 4 keys KeyFlags subpackets should also be considered when present for
- /// determining the preferred use of the key.
- ///
- ///
- /// true if this key algorithm is suitable for use with signing.
- ///
- public bool IsSigningKey
- {
- get
- {
- switch (pub.Algorithm)
- {
- case PublicKeyAlgorithmTag.RsaGeneral:
- case PublicKeyAlgorithmTag.RsaSign:
- case PublicKeyAlgorithmTag.Dsa:
- case PublicKeyAlgorithmTag.ECDsa:
- case PublicKeyAlgorithmTag.ElGamalGeneral:
- return true;
- default:
- return false;
- }
- }
- }
-
- /// True, if this is a master key.
- public bool IsMasterKey
- {
- get { return pub.IsMasterKey; }
- }
-
- /// Detect if the Secret Key's Private Key is empty or not
- public bool IsPrivateKeyEmpty
- {
- get
- {
- byte[] secKeyData = secret.GetSecretKeyData();
-
- return secKeyData == null || secKeyData.Length < 1;
- }
- }
-
- /// The algorithm the key is encrypted with.
- public SymmetricKeyAlgorithmTag KeyEncryptionAlgorithm
- {
- get { return secret.EncAlgorithm; }
- }
-
- /// The key ID of the public key associated with this key.
- public long KeyId
- {
- get { return pub.KeyId; }
- }
-
- /// Return the S2K usage associated with this key.
- public int S2kUsage
- {
- get { return secret.S2kUsage; }
- }
-
- /// Return the S2K used to process this key.
- public S2k S2k
- {
- get { return secret.S2k; }
- }
-
- /// The public key associated with this key.
- public PgpPublicKey PublicKey
- {
- get { return pub; }
- }
-
- /// Allows enumeration of any user IDs associated with the key.
- /// An IEnumerable of string objects.
- public IEnumerable UserIds
- {
- get { return pub.GetUserIds(); }
- }
-
- /// Allows enumeration of any user attribute vectors associated with the key.
- /// An IEnumerable of string objects.
- public IEnumerable UserAttributes
- {
- get { return pub.GetUserAttributes(); }
- }
-
- private byte[] ExtractKeyData(byte[] rawPassPhrase, bool clearPassPhrase)
- {
- SymmetricKeyAlgorithmTag encAlgorithm = secret.EncAlgorithm;
- byte[] encData = secret.GetSecretKeyData();
-
- if (encAlgorithm == SymmetricKeyAlgorithmTag.Null)
- // TODO Check checksum here?
- return encData;
-
- // TODO Factor this block out as 'decryptData'
- try
- {
- KeyParameter key = PgpUtilities.DoMakeKeyFromPassPhrase(secret.EncAlgorithm, secret.S2k, rawPassPhrase, clearPassPhrase);
- byte[] iv = secret.GetIV();
- byte[] data;
-
- if (secret.PublicKeyPacket.Version >= 4)
- {
- data = RecoverKeyData(encAlgorithm, "/CFB/NoPadding", key, iv, encData, 0, encData.Length);
-
- bool useSha1 = secret.S2kUsage == SecretKeyPacket.UsageSha1;
- byte[] check = Checksum(useSha1, data, (useSha1) ? data.Length - 20 : data.Length - 2);
-
- for (int i = 0; i != check.Length; i++)
- {
- if (check[i] != data[data.Length - check.Length + i])
- {
- throw new PgpException("Checksum mismatch at " + i + " of " + check.Length);
- }
- }
- }
- else // version 2 or 3, RSA only.
- {
- data = new byte[encData.Length];
-
- iv = Arrays.Clone(iv);
-
- //
- // read in the four numbers
- //
- int pos = 0;
-
- for (int i = 0; i != 4; i++)
- {
- int encLen = (((encData[pos] << 8) | (encData[pos + 1] & 0xff)) + 7) / 8;
-
- data[pos] = encData[pos];
- data[pos + 1] = encData[pos + 1];
- pos += 2;
-
- byte[] tmp = RecoverKeyData(encAlgorithm, "/CFB/NoPadding", key, iv, encData, pos, encLen);
- Array.Copy(tmp, 0, data, pos, encLen);
- pos += encLen;
-
- if (i != 3)
- {
- Array.Copy(encData, pos - iv.Length, iv, 0, iv.Length);
- }
- }
-
- //
- // verify and copy checksum
- //
-
- data[pos] = encData[pos];
- data[pos + 1] = encData[pos + 1];
-
- int cs = ((encData[pos] << 8) & 0xff00) | (encData[pos + 1] & 0xff);
- int calcCs = 0;
- for (int j = 0; j < pos; j++)
- {
- calcCs += data[j] & 0xff;
- }
-
- calcCs &= 0xffff;
- if (calcCs != cs)
- {
- throw new PgpException("Checksum mismatch: passphrase wrong, expected "
- + cs.ToString("X")
- + " found " + calcCs.ToString("X"));
- }
- }
-
- return data;
- }
- catch (PgpException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new PgpException("Exception decrypting key", e);
- }
- }
-
- private static byte[] RecoverKeyData(SymmetricKeyAlgorithmTag encAlgorithm, string modeAndPadding,
- KeyParameter key, byte[] iv, byte[] keyData, int keyOff, int keyLen)
- {
- IBufferedCipher c;
- try
- {
- string cName = PgpUtilities.GetSymmetricCipherName(encAlgorithm);
- c = CipherUtilities.GetCipher(cName + modeAndPadding);
- }
- catch (Exception e)
- {
- throw new PgpException("Exception creating cipher", e);
- }
-
- c.Init(false, new ParametersWithIV(key, iv));
-
- return c.DoFinal(keyData, keyOff, keyLen);
- }
-
- /// Extract a PgpPrivateKey from this secret key's encrypted contents.
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- public PgpPrivateKey ExtractPrivateKey(char[] passPhrase)
- {
- return DoExtractPrivateKey(PgpUtilities.EncodePassPhrase(passPhrase, false), true);
- }
-
- /// Extract a PgpPrivateKey from this secret key's encrypted contents.
- ///
- /// The passphrase is encoded to bytes using UTF8 (Encoding.UTF8.GetBytes).
- ///
- public PgpPrivateKey ExtractPrivateKeyUtf8(char[] passPhrase)
- {
- return DoExtractPrivateKey(PgpUtilities.EncodePassPhrase(passPhrase, true), true);
- }
-
- /// Extract a PgpPrivateKey from this secret key's encrypted contents.
- ///
- /// Allows the caller to handle the encoding of the passphrase to bytes.
- ///
- public PgpPrivateKey ExtractPrivateKeyRaw(byte[] rawPassPhrase)
- {
- return DoExtractPrivateKey(rawPassPhrase, false);
- }
-
- internal PgpPrivateKey DoExtractPrivateKey(byte[] rawPassPhrase, bool clearPassPhrase)
- {
- if (IsPrivateKeyEmpty)
- return null;
-
- PublicKeyPacket pubPk = secret.PublicKeyPacket;
- try
- {
- byte[] data = ExtractKeyData(rawPassPhrase, clearPassPhrase);
- BcpgInputStream bcpgIn = BcpgInputStream.Wrap(new MemoryStream(data, false));
- AsymmetricKeyParameter privateKey;
- switch (pubPk.Algorithm)
- {
- case PublicKeyAlgorithmTag.RsaEncrypt:
- case PublicKeyAlgorithmTag.RsaGeneral:
- case PublicKeyAlgorithmTag.RsaSign:
- RsaPublicBcpgKey rsaPub = (RsaPublicBcpgKey)pubPk.Key;
- RsaSecretBcpgKey rsaPriv = new RsaSecretBcpgKey(bcpgIn);
- RsaPrivateCrtKeyParameters rsaPrivSpec = new RsaPrivateCrtKeyParameters(
- rsaPriv.Modulus,
- rsaPub.PublicExponent,
- rsaPriv.PrivateExponent,
- rsaPriv.PrimeP,
- rsaPriv.PrimeQ,
- rsaPriv.PrimeExponentP,
- rsaPriv.PrimeExponentQ,
- rsaPriv.CrtCoefficient);
- privateKey = rsaPrivSpec;
- break;
- case PublicKeyAlgorithmTag.Dsa:
- DsaPublicBcpgKey dsaPub = (DsaPublicBcpgKey)pubPk.Key;
- DsaSecretBcpgKey dsaPriv = new DsaSecretBcpgKey(bcpgIn);
- DsaParameters dsaParams = new DsaParameters(dsaPub.P, dsaPub.Q, dsaPub.G);
- privateKey = new DsaPrivateKeyParameters(dsaPriv.X, dsaParams);
- break;
- case PublicKeyAlgorithmTag.ECDH:
- privateKey = GetECKey("ECDH", bcpgIn);
- break;
- case PublicKeyAlgorithmTag.ECDsa:
- privateKey = GetECKey("ECDSA", bcpgIn);
- break;
- case PublicKeyAlgorithmTag.ElGamalEncrypt:
- case PublicKeyAlgorithmTag.ElGamalGeneral:
- ElGamalPublicBcpgKey elPub = (ElGamalPublicBcpgKey)pubPk.Key;
- ElGamalSecretBcpgKey elPriv = new ElGamalSecretBcpgKey(bcpgIn);
- ElGamalParameters elParams = new ElGamalParameters(elPub.P, elPub.G);
- privateKey = new ElGamalPrivateKeyParameters(elPriv.X, elParams);
- break;
- default:
- throw new PgpException("unknown public key algorithm encountered");
- }
-
- return new PgpPrivateKey(KeyId, pubPk, privateKey);
- }
- catch (PgpException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new PgpException("Exception constructing key", e);
- }
- }
-
- private ECPrivateKeyParameters GetECKey(string algorithm, BcpgInputStream bcpgIn)
- {
- ECPublicBcpgKey ecdsaPub = (ECPublicBcpgKey)secret.PublicKeyPacket.Key;
- ECSecretBcpgKey ecdsaPriv = new ECSecretBcpgKey(bcpgIn);
- return new ECPrivateKeyParameters(algorithm, ecdsaPriv.X, ecdsaPub.CurveOid);
- }
-
- private static byte[] Checksum(
- bool useSha1,
- byte[] bytes,
- int length)
- {
- if (useSha1)
- {
- try
- {
- IDigest dig = DigestUtilities.GetDigest("SHA1");
- dig.BlockUpdate(bytes, 0, length);
- return DigestUtilities.DoFinal(dig);
- }
- //catch (NoSuchAlgorithmException e)
- catch (Exception e)
- {
- throw new PgpException("Can't find SHA-1", e);
- }
- }
- else
- {
- int Checksum = 0;
- for (int i = 0; i != length; i++)
- {
- Checksum += bytes[i];
- }
-
- return new byte[] { (byte)(Checksum >> 8), (byte)Checksum };
- }
- }
-
- public byte[] GetEncoded()
- {
- MemoryStream bOut = new MemoryStream();
- Encode(bOut);
- return bOut.ToArray();
- }
-
- public void Encode(
- Stream outStr)
- {
- BcpgOutputStream bcpgOut = BcpgOutputStream.Wrap(outStr);
-
- bcpgOut.WritePacket(secret);
- if (pub.trustPk != null)
- {
- bcpgOut.WritePacket(pub.trustPk);
- }
-
- if (pub.subSigs == null) // is not a sub key
- {
- foreach (PgpSignature keySig in pub.keySigs)
- {
- keySig.Encode(bcpgOut);
- }
-
- for (int i = 0; i != pub.ids.Count; i++)
- {
- object pubID = pub.ids[i];
- if (pubID is string)
- {
- string id = (string) pubID;
- bcpgOut.WritePacket(new UserIdPacket(id));
- }
- else
- {
- PgpUserAttributeSubpacketVector v = (PgpUserAttributeSubpacketVector) pubID;
- bcpgOut.WritePacket(new UserAttributePacket(v.ToSubpacketArray()));
- }
-
- if (pub.idTrusts[i] != null)
- {
- bcpgOut.WritePacket((ContainedPacket)pub.idTrusts[i]);
- }
-
- foreach (PgpSignature sig in (IList) pub.idSigs[i])
- {
- sig.Encode(bcpgOut);
- }
- }
- }
- else
- {
- foreach (PgpSignature subSig in pub.subSigs)
- {
- subSig.Encode(bcpgOut);
- }
- }
-
- // TODO Check that this is right/necessary
- //bcpgOut.Finish();
- }
-
- ///
- /// Return a copy of the passed in secret key, encrypted using a new password
- /// and the passed in algorithm.
- ///
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- /// The PgpSecretKey to be copied.
- /// The current password for the key.
- /// The new password for the key.
- /// The algorithm to be used for the encryption.
- /// Source of randomness.
- public static PgpSecretKey CopyWithNewPassword(
- PgpSecretKey key,
- char[] oldPassPhrase,
- char[] newPassPhrase,
- SymmetricKeyAlgorithmTag newEncAlgorithm,
- SecureRandom rand)
- {
- return DoCopyWithNewPassword(key, PgpUtilities.EncodePassPhrase(oldPassPhrase, false),
- PgpUtilities.EncodePassPhrase(newPassPhrase, false), true, newEncAlgorithm, rand);
- }
-
- ///
- /// Return a copy of the passed in secret key, encrypted using a new password
- /// and the passed in algorithm.
- ///
- ///
- /// The passphrase is encoded to bytes using UTF8 (Encoding.UTF8.GetBytes).
- ///
- /// The PgpSecretKey to be copied.
- /// The current password for the key.
- /// The new password for the key.
- /// The algorithm to be used for the encryption.
- /// Source of randomness.
- public static PgpSecretKey CopyWithNewPasswordUtf8(
- PgpSecretKey key,
- char[] oldPassPhrase,
- char[] newPassPhrase,
- SymmetricKeyAlgorithmTag newEncAlgorithm,
- SecureRandom rand)
- {
- return DoCopyWithNewPassword(key, PgpUtilities.EncodePassPhrase(oldPassPhrase, true),
- PgpUtilities.EncodePassPhrase(newPassPhrase, true), true, newEncAlgorithm, rand);
- }
-
- ///
- /// Return a copy of the passed in secret key, encrypted using a new password
- /// and the passed in algorithm.
- ///
- ///
- /// Allows the caller to handle the encoding of the passphrase to bytes.
- ///
- /// The PgpSecretKey to be copied.
- /// The current password for the key.
- /// The new password for the key.
- /// The algorithm to be used for the encryption.
- /// Source of randomness.
- public static PgpSecretKey CopyWithNewPasswordRaw(
- PgpSecretKey key,
- byte[] rawOldPassPhrase,
- byte[] rawNewPassPhrase,
- SymmetricKeyAlgorithmTag newEncAlgorithm,
- SecureRandom rand)
- {
- return DoCopyWithNewPassword(key, rawOldPassPhrase, rawNewPassPhrase, false, newEncAlgorithm, rand);
- }
-
- internal static PgpSecretKey DoCopyWithNewPassword(
- PgpSecretKey key,
- byte[] rawOldPassPhrase,
- byte[] rawNewPassPhrase,
- bool clearPassPhrase,
- SymmetricKeyAlgorithmTag newEncAlgorithm,
- SecureRandom rand)
- {
- if (key.IsPrivateKeyEmpty)
- throw new PgpException("no private key in this SecretKey - public key present only.");
-
- byte[] rawKeyData = key.ExtractKeyData(rawOldPassPhrase, clearPassPhrase);
- int s2kUsage = key.secret.S2kUsage;
- byte[] iv = null;
- S2k s2k = null;
- byte[] keyData;
- PublicKeyPacket pubKeyPacket = key.secret.PublicKeyPacket;
-
- if (newEncAlgorithm == SymmetricKeyAlgorithmTag.Null)
- {
- s2kUsage = SecretKeyPacket.UsageNone;
- if (key.secret.S2kUsage == SecretKeyPacket.UsageSha1) // SHA-1 hash, need to rewrite Checksum
- {
- keyData = new byte[rawKeyData.Length - 18];
-
- Array.Copy(rawKeyData, 0, keyData, 0, keyData.Length - 2);
-
- byte[] check = Checksum(false, keyData, keyData.Length - 2);
-
- keyData[keyData.Length - 2] = check[0];
- keyData[keyData.Length - 1] = check[1];
- }
- else
- {
- keyData = rawKeyData;
- }
- }
- else
- {
- if (s2kUsage == SecretKeyPacket.UsageNone)
- {
- s2kUsage = SecretKeyPacket.UsageChecksum;
- }
-
- try
- {
- if (pubKeyPacket.Version >= 4)
- {
- keyData = EncryptKeyDataV4(rawKeyData, newEncAlgorithm, HashAlgorithmTag.Sha1, rawNewPassPhrase, clearPassPhrase, rand, out s2k, out iv);
- }
- else
- {
- keyData = EncryptKeyDataV3(rawKeyData, newEncAlgorithm, rawNewPassPhrase, clearPassPhrase, rand, out s2k, out iv);
- }
- }
- catch (PgpException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new PgpException("Exception encrypting key", e);
- }
- }
-
- SecretKeyPacket secret;
- if (key.secret is SecretSubkeyPacket)
- {
- secret = new SecretSubkeyPacket(pubKeyPacket, newEncAlgorithm, s2kUsage, s2k, iv, keyData);
- }
- else
- {
- secret = new SecretKeyPacket(pubKeyPacket, newEncAlgorithm, s2kUsage, s2k, iv, keyData);
- }
-
- return new PgpSecretKey(secret, key.pub);
- }
-
- /// Replace the passed the public key on the passed in secret key.
- /// Secret key to change.
- /// New public key.
- /// A new secret key.
- /// If KeyId's do not match.
- public static PgpSecretKey ReplacePublicKey(
- PgpSecretKey secretKey,
- PgpPublicKey publicKey)
- {
- if (publicKey.KeyId != secretKey.KeyId)
- throw new ArgumentException("KeyId's do not match");
-
- return new PgpSecretKey(secretKey.secret, publicKey);
- }
-
- private static byte[] EncryptKeyDataV3(
- byte[] rawKeyData,
- SymmetricKeyAlgorithmTag encAlgorithm,
- byte[] rawPassPhrase,
- bool clearPassPhrase,
- SecureRandom random,
- out S2k s2k,
- out byte[] iv)
- {
- // Version 2 or 3 - RSA Keys only
-
- s2k = null;
- iv = null;
-
- KeyParameter encKey = PgpUtilities.DoMakeKeyFromPassPhrase(encAlgorithm, s2k, rawPassPhrase, clearPassPhrase);
-
- byte[] keyData = new byte[rawKeyData.Length];
-
- //
- // process 4 numbers
- //
- int pos = 0;
- for (int i = 0; i != 4; i++)
- {
- int encLen = (((rawKeyData[pos] << 8) | (rawKeyData[pos + 1] & 0xff)) + 7) / 8;
-
- keyData[pos] = rawKeyData[pos];
- keyData[pos + 1] = rawKeyData[pos + 1];
-
- byte[] tmp;
- if (i == 0)
- {
- tmp = EncryptData(encAlgorithm, encKey, rawKeyData, pos + 2, encLen, random, ref iv);
- }
- else
- {
- byte[] tmpIv = Arrays.CopyOfRange(keyData, pos - iv.Length, pos);
-
- tmp = EncryptData(encAlgorithm, encKey, rawKeyData, pos + 2, encLen, random, ref tmpIv);
- }
-
- Array.Copy(tmp, 0, keyData, pos + 2, tmp.Length);
- pos += 2 + encLen;
- }
-
- //
- // copy in checksum.
- //
- keyData[pos] = rawKeyData[pos];
- keyData[pos + 1] = rawKeyData[pos + 1];
-
- return keyData;
- }
-
- private static byte[] EncryptKeyDataV4(
- byte[] rawKeyData,
- SymmetricKeyAlgorithmTag encAlgorithm,
- HashAlgorithmTag hashAlgorithm,
- byte[] rawPassPhrase,
- bool clearPassPhrase,
- SecureRandom random,
- out S2k s2k,
- out byte[] iv)
- {
- s2k = PgpUtilities.GenerateS2k(hashAlgorithm, 0x60, random);
-
- KeyParameter key = PgpUtilities.DoMakeKeyFromPassPhrase(encAlgorithm, s2k, rawPassPhrase, clearPassPhrase);
-
- iv = null;
- return EncryptData(encAlgorithm, key, rawKeyData, 0, rawKeyData.Length, random, ref iv);
- }
-
- private static byte[] EncryptData(
- SymmetricKeyAlgorithmTag encAlgorithm,
- KeyParameter key,
- byte[] data,
- int dataOff,
- int dataLen,
- SecureRandom random,
- ref byte[] iv)
- {
- IBufferedCipher c;
- try
- {
- string cName = PgpUtilities.GetSymmetricCipherName(encAlgorithm);
- c = CipherUtilities.GetCipher(cName + "/CFB/NoPadding");
- }
- catch (Exception e)
- {
- throw new PgpException("Exception creating cipher", e);
- }
-
- if (iv == null)
- {
- iv = PgpUtilities.GenerateIV(c.GetBlockSize(), random);
- }
-
- c.Init(true, new ParametersWithRandom(new ParametersWithIV(key, iv), random));
-
- return c.DoFinal(data, dataOff, dataLen);
- }
-
- ///
- /// Parse a secret key from one of the GPG S expression keys associating it with the passed in public key.
- ///
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- public static PgpSecretKey ParseSecretKeyFromSExpr(Stream inputStream, char[] passPhrase, PgpPublicKey pubKey)
- {
- return DoParseSecretKeyFromSExpr(inputStream, PgpUtilities.EncodePassPhrase(passPhrase, false), true, pubKey);
- }
-
- ///
- /// Parse a secret key from one of the GPG S expression keys associating it with the passed in public key.
- ///
- ///
- /// The passphrase is encoded to bytes using UTF8 (Encoding.UTF8.GetBytes).
- ///
- public static PgpSecretKey ParseSecretKeyFromSExprUtf8(Stream inputStream, char[] passPhrase, PgpPublicKey pubKey)
- {
- return DoParseSecretKeyFromSExpr(inputStream, PgpUtilities.EncodePassPhrase(passPhrase, true), true, pubKey);
- }
-
- ///
- /// Parse a secret key from one of the GPG S expression keys associating it with the passed in public key.
- ///
- ///
- /// Allows the caller to handle the encoding of the passphrase to bytes.
- ///
- public static PgpSecretKey ParseSecretKeyFromSExprRaw(Stream inputStream, byte[] rawPassPhrase, PgpPublicKey pubKey)
- {
- return DoParseSecretKeyFromSExpr(inputStream, rawPassPhrase, false, pubKey);
- }
-
- internal static PgpSecretKey DoParseSecretKeyFromSExpr(Stream inputStream, byte[] rawPassPhrase, bool clearPassPhrase, PgpPublicKey pubKey)
- {
- SXprUtilities.SkipOpenParenthesis(inputStream);
-
- string type = SXprUtilities.ReadString(inputStream, inputStream.ReadByte());
- if (type.Equals("protected-private-key"))
- {
- SXprUtilities.SkipOpenParenthesis(inputStream);
-
- string curveName;
-
- string keyType = SXprUtilities.ReadString(inputStream, inputStream.ReadByte());
- if (keyType.Equals("ecc"))
- {
- SXprUtilities.SkipOpenParenthesis(inputStream);
-
- string curveID = SXprUtilities.ReadString(inputStream, inputStream.ReadByte());
- curveName = SXprUtilities.ReadString(inputStream, inputStream.ReadByte());
-
- SXprUtilities.SkipCloseParenthesis(inputStream);
- }
- else
- {
- throw new PgpException("no curve details found");
- }
-
- byte[] qVal;
-
- SXprUtilities.SkipOpenParenthesis(inputStream);
-
- type = SXprUtilities.ReadString(inputStream, inputStream.ReadByte());
- if (type.Equals("q"))
- {
- qVal = SXprUtilities.ReadBytes(inputStream, inputStream.ReadByte());
- }
- else
- {
- throw new PgpException("no q value found");
- }
-
- SXprUtilities.SkipCloseParenthesis(inputStream);
-
- byte[] dValue = GetDValue(inputStream, rawPassPhrase, clearPassPhrase, curveName);
- // TODO: check SHA-1 hash.
-
- return new PgpSecretKey(new SecretKeyPacket(pubKey.PublicKeyPacket, SymmetricKeyAlgorithmTag.Null, null, null,
- new ECSecretBcpgKey(new BigInteger(1, dValue)).GetEncoded()), pubKey);
- }
-
- throw new PgpException("unknown key type found");
- }
-
- ///
- /// Parse a secret key from one of the GPG S expression keys.
- ///
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- public static PgpSecretKey ParseSecretKeyFromSExpr(Stream inputStream, char[] passPhrase)
- {
- return DoParseSecretKeyFromSExpr(inputStream, PgpUtilities.EncodePassPhrase(passPhrase, false), true);
- }
-
- ///
- /// Parse a secret key from one of the GPG S expression keys.
- ///
- ///
- /// The passphrase is encoded to bytes using UTF8 (Encoding.UTF8.GetBytes).
- ///
- public static PgpSecretKey ParseSecretKeyFromSExprUtf8(Stream inputStream, char[] passPhrase)
- {
- return DoParseSecretKeyFromSExpr(inputStream, PgpUtilities.EncodePassPhrase(passPhrase, true), true);
- }
-
- ///
- /// Parse a secret key from one of the GPG S expression keys.
- ///
- ///
- /// Allows the caller to handle the encoding of the passphrase to bytes.
- ///
- public static PgpSecretKey ParseSecretKeyFromSExprRaw(Stream inputStream, byte[] rawPassPhrase)
- {
- return DoParseSecretKeyFromSExpr(inputStream, rawPassPhrase, false);
- }
-
- ///
- /// Parse a secret key from one of the GPG S expression keys.
- ///
- internal static PgpSecretKey DoParseSecretKeyFromSExpr(Stream inputStream, byte[] rawPassPhrase, bool clearPassPhrase)
- {
- SXprUtilities.SkipOpenParenthesis(inputStream);
-
- string type = SXprUtilities.ReadString(inputStream, inputStream.ReadByte());
- if (type.Equals("protected-private-key"))
- {
- SXprUtilities.SkipOpenParenthesis(inputStream);
-
- string curveName;
-
- string keyType = SXprUtilities.ReadString(inputStream, inputStream.ReadByte());
- if (keyType.Equals("ecc"))
- {
- SXprUtilities.SkipOpenParenthesis(inputStream);
-
- string curveID = SXprUtilities.ReadString(inputStream, inputStream.ReadByte());
- curveName = SXprUtilities.ReadString(inputStream, inputStream.ReadByte());
-
- if (Platform.StartsWith(curveName, "NIST "))
- {
- curveName = curveName.Substring("NIST ".Length);
- }
-
- SXprUtilities.SkipCloseParenthesis(inputStream);
- }
- else
- {
- throw new PgpException("no curve details found");
- }
-
- byte[] qVal;
-
- SXprUtilities.SkipOpenParenthesis(inputStream);
-
- type = SXprUtilities.ReadString(inputStream, inputStream.ReadByte());
- if (type.Equals("q"))
- {
- qVal = SXprUtilities.ReadBytes(inputStream, inputStream.ReadByte());
- }
- else
- {
- throw new PgpException("no q value found");
- }
-
- PublicKeyPacket pubPacket = new PublicKeyPacket(PublicKeyAlgorithmTag.ECDsa, DateTime.UtcNow,
- new ECDsaPublicBcpgKey(ECNamedCurveTable.GetOid(curveName), new BigInteger(1, qVal)));
-
- SXprUtilities.SkipCloseParenthesis(inputStream);
-
- byte[] dValue = GetDValue(inputStream, rawPassPhrase, clearPassPhrase, curveName);
- // TODO: check SHA-1 hash.
-
- return new PgpSecretKey(new SecretKeyPacket(pubPacket, SymmetricKeyAlgorithmTag.Null, null, null,
- new ECSecretBcpgKey(new BigInteger(1, dValue)).GetEncoded()), new PgpPublicKey(pubPacket));
- }
-
- throw new PgpException("unknown key type found");
- }
-
- private static byte[] GetDValue(Stream inputStream, byte[] rawPassPhrase, bool clearPassPhrase, string curveName)
- {
- string type;
- SXprUtilities.SkipOpenParenthesis(inputStream);
-
- string protection;
- S2k s2k;
- byte[] iv;
- byte[] secKeyData;
-
- type = SXprUtilities.ReadString(inputStream, inputStream.ReadByte());
- if (type.Equals("protected"))
- {
- protection = SXprUtilities.ReadString(inputStream, inputStream.ReadByte());
-
- SXprUtilities.SkipOpenParenthesis(inputStream);
-
- s2k = SXprUtilities.ParseS2k(inputStream);
-
- iv = SXprUtilities.ReadBytes(inputStream, inputStream.ReadByte());
-
- SXprUtilities.SkipCloseParenthesis(inputStream);
-
- secKeyData = SXprUtilities.ReadBytes(inputStream, inputStream.ReadByte());
- }
- else
- {
- throw new PgpException("protected block not found");
- }
-
- // TODO: recognise other algorithms
- KeyParameter key = PgpUtilities.DoMakeKeyFromPassPhrase(SymmetricKeyAlgorithmTag.Aes128, s2k, rawPassPhrase, clearPassPhrase);
-
- byte[] data = RecoverKeyData(SymmetricKeyAlgorithmTag.Aes128, "/CBC/NoPadding", key, iv, secKeyData, 0, secKeyData.Length);
-
- //
- // parse the secret key S-expr
- //
- Stream keyIn = new MemoryStream(data, false);
-
- SXprUtilities.SkipOpenParenthesis(keyIn);
- SXprUtilities.SkipOpenParenthesis(keyIn);
- SXprUtilities.SkipOpenParenthesis(keyIn);
- String name = SXprUtilities.ReadString(keyIn, keyIn.ReadByte());
- return SXprUtilities.ReadBytes(keyIn, keyIn.ReadByte());
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpSecretKeyRing.cs b/BCCrypto/src/openpgp/PgpSecretKeyRing.cs
deleted file mode 100644
index 70cd721..0000000
--- a/BCCrypto/src/openpgp/PgpSecretKeyRing.cs
+++ /dev/null
@@ -1,308 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- ///
- /// Class to hold a single master secret key and its subkeys.
- ///
- /// Often PGP keyring files consist of multiple master keys, if you are trying to process
- /// or construct one of these you should use the PgpSecretKeyRingBundle class.
- ///
- ///
- public class PgpSecretKeyRing
- : PgpKeyRing
- {
- private readonly IList keys;
- private readonly IList extraPubKeys;
-
- internal PgpSecretKeyRing(
- IList keys)
- : this(keys, Platform.CreateArrayList())
- {
- }
-
- private PgpSecretKeyRing(
- IList keys,
- IList extraPubKeys)
- {
- this.keys = keys;
- this.extraPubKeys = extraPubKeys;
- }
-
- public PgpSecretKeyRing(
- byte[] encoding)
- : this(new MemoryStream(encoding))
- {
- }
-
- public PgpSecretKeyRing(
- Stream inputStream)
- {
- this.keys = Platform.CreateArrayList();
- this.extraPubKeys = Platform.CreateArrayList();
-
- BcpgInputStream bcpgInput = BcpgInputStream.Wrap(inputStream);
-
- PacketTag initialTag = bcpgInput.NextPacketTag();
- if (initialTag != PacketTag.SecretKey && initialTag != PacketTag.SecretSubkey)
- {
- throw new IOException("secret key ring doesn't start with secret key tag: "
- + "tag 0x" + ((int)initialTag).ToString("X"));
- }
-
- SecretKeyPacket secret = (SecretKeyPacket) bcpgInput.ReadPacket();
-
- //
- // ignore GPG comment packets if found.
- //
- while (bcpgInput.NextPacketTag() == PacketTag.Experimental2)
- {
- bcpgInput.ReadPacket();
- }
-
- TrustPacket trust = ReadOptionalTrustPacket(bcpgInput);
-
- // revocation and direct signatures
- IList keySigs = ReadSignaturesAndTrust(bcpgInput);
-
- IList ids, idTrusts, idSigs;
- ReadUserIDs(bcpgInput, out ids, out idTrusts, out idSigs);
-
- keys.Add(new PgpSecretKey(secret, new PgpPublicKey(secret.PublicKeyPacket, trust, keySigs, ids, idTrusts, idSigs)));
-
-
- // Read subkeys
- while (bcpgInput.NextPacketTag() == PacketTag.SecretSubkey
- || bcpgInput.NextPacketTag() == PacketTag.PublicSubkey)
- {
- if (bcpgInput.NextPacketTag() == PacketTag.SecretSubkey)
- {
- SecretSubkeyPacket sub = (SecretSubkeyPacket) bcpgInput.ReadPacket();
-
- //
- // ignore GPG comment packets if found.
- //
- while (bcpgInput.NextPacketTag() == PacketTag.Experimental2)
- {
- bcpgInput.ReadPacket();
- }
-
- TrustPacket subTrust = ReadOptionalTrustPacket(bcpgInput);
- IList sigList = ReadSignaturesAndTrust(bcpgInput);
-
- keys.Add(new PgpSecretKey(sub, new PgpPublicKey(sub.PublicKeyPacket, subTrust, sigList)));
- }
- else
- {
- PublicSubkeyPacket sub = (PublicSubkeyPacket) bcpgInput.ReadPacket();
-
- TrustPacket subTrust = ReadOptionalTrustPacket(bcpgInput);
- IList sigList = ReadSignaturesAndTrust(bcpgInput);
-
- extraPubKeys.Add(new PgpPublicKey(sub, subTrust, sigList));
- }
- }
- }
-
- /// Return the public key for the master key.
- public PgpPublicKey GetPublicKey()
- {
- return ((PgpSecretKey) keys[0]).PublicKey;
- }
-
- /// Return the master private key.
- public PgpSecretKey GetSecretKey()
- {
- return (PgpSecretKey) keys[0];
- }
-
- /// Allows enumeration of the secret keys.
- /// An IEnumerable of PgpSecretKey objects.
- public IEnumerable GetSecretKeys()
- {
- return new EnumerableProxy(keys);
- }
-
- public PgpSecretKey GetSecretKey(
- long keyId)
- {
- foreach (PgpSecretKey k in keys)
- {
- if (keyId == k.KeyId)
- {
- return k;
- }
- }
-
- return null;
- }
-
- ///
- /// Return an iterator of the public keys in the secret key ring that
- /// have no matching private key. At the moment only personal certificate data
- /// appears in this fashion.
- ///
- /// An IEnumerable of unattached, or extra, public keys.
- public IEnumerable GetExtraPublicKeys()
- {
- return new EnumerableProxy(extraPubKeys);
- }
-
- public byte[] GetEncoded()
- {
- MemoryStream bOut = new MemoryStream();
-
- Encode(bOut);
-
- return bOut.ToArray();
- }
-
- public void Encode(
- Stream outStr)
- {
- if (outStr == null)
- throw new ArgumentNullException("outStr");
-
- foreach (PgpSecretKey key in keys)
- {
- key.Encode(outStr);
- }
- foreach (PgpPublicKey extraPubKey in extraPubKeys)
- {
- extraPubKey.Encode(outStr);
- }
- }
-
- ///
- /// Replace the public key set on the secret ring with the corresponding key off the public ring.
- ///
- /// Secret ring to be changed.
- /// Public ring containing the new public key set.
- public static PgpSecretKeyRing ReplacePublicKeys(
- PgpSecretKeyRing secretRing,
- PgpPublicKeyRing publicRing)
- {
- IList newList = Platform.CreateArrayList(secretRing.keys.Count);
-
- foreach (PgpSecretKey sk in secretRing.keys)
- {
- PgpPublicKey pk = publicRing.GetPublicKey(sk.KeyId);
-
- newList.Add(PgpSecretKey.ReplacePublicKey(sk, pk));
- }
-
- return new PgpSecretKeyRing(newList);
- }
-
- ///
- /// Return a copy of the passed in secret key ring, with the master key and sub keys encrypted
- /// using a new password and the passed in algorithm.
- ///
- /// The PgpSecretKeyRing to be copied.
- /// The current password for key.
- /// The new password for the key.
- /// The algorithm to be used for the encryption.
- /// Source of randomness.
- public static PgpSecretKeyRing CopyWithNewPassword(
- PgpSecretKeyRing ring,
- char[] oldPassPhrase,
- char[] newPassPhrase,
- SymmetricKeyAlgorithmTag newEncAlgorithm,
- SecureRandom rand)
- {
- IList newKeys = Platform.CreateArrayList(ring.keys.Count);
- foreach (PgpSecretKey secretKey in ring.GetSecretKeys())
- {
- if (secretKey.IsPrivateKeyEmpty)
- {
- newKeys.Add(secretKey);
- }
- else
- {
- newKeys.Add(PgpSecretKey.CopyWithNewPassword(secretKey, oldPassPhrase, newPassPhrase, newEncAlgorithm, rand));
- }
- }
-
- return new PgpSecretKeyRing(newKeys, ring.extraPubKeys);
- }
-
- ///
- /// Returns a new key ring with the secret key passed in either added or
- /// replacing an existing one with the same key ID.
- ///
- /// The secret key ring to be modified.
- /// The secret key to be inserted.
- /// A new PgpSecretKeyRing
- public static PgpSecretKeyRing InsertSecretKey(
- PgpSecretKeyRing secRing,
- PgpSecretKey secKey)
- {
- IList keys = Platform.CreateArrayList(secRing.keys);
- bool found = false;
- bool masterFound = false;
-
- for (int i = 0; i != keys.Count; i++)
- {
- PgpSecretKey key = (PgpSecretKey) keys[i];
-
- if (key.KeyId == secKey.KeyId)
- {
- found = true;
- keys[i] = secKey;
- }
- if (key.IsMasterKey)
- {
- masterFound = true;
- }
- }
-
- if (!found)
- {
- if (secKey.IsMasterKey)
- {
- if (masterFound)
- throw new ArgumentException("cannot add a master key to a ring that already has one");
-
- keys.Insert(0, secKey);
- }
- else
- {
- keys.Add(secKey);
- }
- }
-
- return new PgpSecretKeyRing(keys, secRing.extraPubKeys);
- }
-
- /// Returns a new key ring with the secret key passed in removed from the key ring.
- /// The secret key ring to be modified.
- /// The secret key to be removed.
- /// A new PgpSecretKeyRing , or null if secKey is not found.
- public static PgpSecretKeyRing RemoveSecretKey(
- PgpSecretKeyRing secRing,
- PgpSecretKey secKey)
- {
- IList keys = Platform.CreateArrayList(secRing.keys);
- bool found = false;
-
- for (int i = 0; i < keys.Count; i++)
- {
- PgpSecretKey key = (PgpSecretKey)keys[i];
-
- if (key.KeyId == secKey.KeyId)
- {
- found = true;
- keys.RemoveAt(i);
- }
- }
-
- return found ? new PgpSecretKeyRing(keys, secRing.extraPubKeys) : null;
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpSecretKeyRingBundle.cs b/BCCrypto/src/openpgp/PgpSecretKeyRingBundle.cs
deleted file mode 100644
index c9f4d39..0000000
--- a/BCCrypto/src/openpgp/PgpSecretKeyRingBundle.cs
+++ /dev/null
@@ -1,280 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- ///
- /// Often a PGP key ring file is made up of a succession of master/sub-key key rings.
- /// If you want to read an entire secret key file in one hit this is the class for you.
- ///
- public class PgpSecretKeyRingBundle
- {
- private readonly IDictionary secretRings;
- private readonly IList order;
-
- private PgpSecretKeyRingBundle(
- IDictionary secretRings,
- IList order)
- {
- this.secretRings = secretRings;
- this.order = order;
- }
-
- public PgpSecretKeyRingBundle(
- byte[] encoding)
- : this(new MemoryStream(encoding, false))
- {
- }
-
- /// Build a PgpSecretKeyRingBundle from the passed in input stream.
- /// Input stream containing data.
- /// If a problem parsing the stream occurs.
- /// If an object is encountered which isn't a PgpSecretKeyRing.
- public PgpSecretKeyRingBundle(
- Stream inputStream)
- : this(new PgpObjectFactory(inputStream).AllPgpObjects())
- {
- }
-
- public PgpSecretKeyRingBundle(
- IEnumerable e)
- {
- this.secretRings = Platform.CreateHashtable();
- this.order = Platform.CreateArrayList();
-
- foreach (object obj in e)
- {
- PgpSecretKeyRing pgpSecret = obj as PgpSecretKeyRing;
-
- if (pgpSecret == null)
- {
- throw new PgpException(Platform.GetTypeName(obj) + " found where PgpSecretKeyRing expected");
- }
-
- long key = pgpSecret.GetPublicKey().KeyId;
- secretRings.Add(key, pgpSecret);
- order.Add(key);
- }
- }
-
- [Obsolete("Use 'Count' property instead")]
- public int Size
- {
- get { return order.Count; }
- }
-
- /// Return the number of rings in this collection.
- public int Count
- {
- get { return order.Count; }
- }
-
- /// Allow enumeration of the secret key rings making up this collection.
- public IEnumerable GetKeyRings()
- {
- return new EnumerableProxy(secretRings.Values);
- }
-
- /// Allow enumeration of the key rings associated with the passed in userId.
- /// The user ID to be matched.
- /// An IEnumerable of key rings which matched (possibly none).
- public IEnumerable GetKeyRings(
- string userId)
- {
- return GetKeyRings(userId, false, false);
- }
-
- /// Allow enumeration of the key rings associated with the passed in userId.
- /// The user ID to be matched.
- /// If true, userId need only be a substring of an actual ID string to match.
- /// An IEnumerable of key rings which matched (possibly none).
- public IEnumerable GetKeyRings(
- string userId,
- bool matchPartial)
- {
- return GetKeyRings(userId, matchPartial, false);
- }
-
- /// Allow enumeration of the key rings associated with the passed in userId.
- /// The user ID to be matched.
- /// If true, userId need only be a substring of an actual ID string to match.
- /// If true, case is ignored in user ID comparisons.
- /// An IEnumerable of key rings which matched (possibly none).
- public IEnumerable GetKeyRings(
- string userId,
- bool matchPartial,
- bool ignoreCase)
- {
- IList rings = Platform.CreateArrayList();
-
- if (ignoreCase)
- {
- userId = Platform.ToUpperInvariant(userId);
- }
-
- foreach (PgpSecretKeyRing secRing in GetKeyRings())
- {
- foreach (string nextUserID in secRing.GetSecretKey().UserIds)
- {
- string next = nextUserID;
- if (ignoreCase)
- {
- next = Platform.ToUpperInvariant(next);
- }
-
- if (matchPartial)
- {
- if (Platform.IndexOf(next, userId) > -1)
- {
- rings.Add(secRing);
- }
- }
- else
- {
- if (next.Equals(userId))
- {
- rings.Add(secRing);
- }
- }
- }
- }
-
- return new EnumerableProxy(rings);
- }
-
- /// Return the PGP secret key associated with the given key id.
- /// The ID of the secret key to return.
- public PgpSecretKey GetSecretKey(
- long keyId)
- {
- foreach (PgpSecretKeyRing secRing in GetKeyRings())
- {
- PgpSecretKey sec = secRing.GetSecretKey(keyId);
-
- if (sec != null)
- {
- return sec;
- }
- }
-
- return null;
- }
-
- /// Return the secret key ring which contains the key referred to by keyId
- /// The ID of the secret key
- public PgpSecretKeyRing GetSecretKeyRing(
- long keyId)
- {
- long id = keyId;
-
- if (secretRings.Contains(id))
- {
- return (PgpSecretKeyRing) secretRings[id];
- }
-
- foreach (PgpSecretKeyRing secretRing in GetKeyRings())
- {
- PgpSecretKey secret = secretRing.GetSecretKey(keyId);
-
- if (secret != null)
- {
- return secretRing;
- }
- }
-
- return null;
- }
-
- ///
- /// Return true if a key matching the passed in key ID is present, false otherwise.
- ///
- /// key ID to look for.
- public bool Contains(
- long keyID)
- {
- return GetSecretKey(keyID) != null;
- }
-
- public byte[] GetEncoded()
- {
- MemoryStream bOut = new MemoryStream();
-
- Encode(bOut);
-
- return bOut.ToArray();
- }
-
- public void Encode(
- Stream outStr)
- {
- BcpgOutputStream bcpgOut = BcpgOutputStream.Wrap(outStr);
-
- foreach (long key in order)
- {
- PgpSecretKeyRing pub = (PgpSecretKeyRing) secretRings[key];
-
- pub.Encode(bcpgOut);
- }
- }
-
- ///
- /// Return a new bundle containing the contents of the passed in bundle and
- /// the passed in secret key ring.
- ///
- /// The PgpSecretKeyRingBundle the key ring is to be added to.
- /// The key ring to be added.
- /// A new PgpSecretKeyRingBundle merging the current one with the passed in key ring.
- /// If the keyId for the passed in key ring is already present.
- public static PgpSecretKeyRingBundle AddSecretKeyRing(
- PgpSecretKeyRingBundle bundle,
- PgpSecretKeyRing secretKeyRing)
- {
- long key = secretKeyRing.GetPublicKey().KeyId;
-
- if (bundle.secretRings.Contains(key))
- {
- throw new ArgumentException("Collection already contains a key with a keyId for the passed in ring.");
- }
-
- IDictionary newSecretRings = Platform.CreateHashtable(bundle.secretRings);
- IList newOrder = Platform.CreateArrayList(bundle.order);
-
- newSecretRings[key] = secretKeyRing;
- newOrder.Add(key);
-
- return new PgpSecretKeyRingBundle(newSecretRings, newOrder);
- }
-
- ///
- /// Return a new bundle containing the contents of the passed in bundle with
- /// the passed in secret key ring removed.
- ///
- /// The PgpSecretKeyRingBundle the key ring is to be removed from.
- /// The key ring to be removed.
- /// A new PgpSecretKeyRingBundle not containing the passed in key ring.
- /// If the keyId for the passed in key ring is not present.
- public static PgpSecretKeyRingBundle RemoveSecretKeyRing(
- PgpSecretKeyRingBundle bundle,
- PgpSecretKeyRing secretKeyRing)
- {
- long key = secretKeyRing.GetPublicKey().KeyId;
-
- if (!bundle.secretRings.Contains(key))
- {
- throw new ArgumentException("Collection does not contain a key with a keyId for the passed in ring.");
- }
-
- IDictionary newSecretRings = Platform.CreateHashtable(bundle.secretRings);
- IList newOrder = Platform.CreateArrayList(bundle.order);
-
- newSecretRings.Remove(key);
- newOrder.Remove(key);
-
- return new PgpSecretKeyRingBundle(newSecretRings, newOrder);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpSignature.cs b/BCCrypto/src/openpgp/PgpSignature.cs
deleted file mode 100644
index c8c541b..0000000
--- a/BCCrypto/src/openpgp/PgpSignature.cs
+++ /dev/null
@@ -1,447 +0,0 @@
-using System;
-using System.IO;
-using Org.BouncyCastle.Asn1;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// A PGP signature object.
- public class PgpSignature
- {
- public const int BinaryDocument = 0x00;
- public const int CanonicalTextDocument = 0x01;
- public const int StandAlone = 0x02;
-
- public const int DefaultCertification = 0x10;
- public const int NoCertification = 0x11;
- public const int CasualCertification = 0x12;
- public const int PositiveCertification = 0x13;
-
- public const int SubkeyBinding = 0x18;
- public const int PrimaryKeyBinding = 0x19;
- public const int DirectKey = 0x1f;
- public const int KeyRevocation = 0x20;
- public const int SubkeyRevocation = 0x28;
- public const int CertificationRevocation = 0x30;
- public const int Timestamp = 0x40;
-
- private readonly SignaturePacket sigPck;
- private readonly int signatureType;
- private readonly TrustPacket trustPck;
-
- private ISigner sig;
- private byte lastb; // Initial value anything but '\r'
-
- internal PgpSignature(
- BcpgInputStream bcpgInput)
- : this((SignaturePacket)bcpgInput.ReadPacket())
- {
- }
-
- internal PgpSignature(
- SignaturePacket sigPacket)
- : this(sigPacket, null)
- {
- }
-
- internal PgpSignature(
- SignaturePacket sigPacket,
- TrustPacket trustPacket)
- {
- if (sigPacket == null)
- throw new ArgumentNullException("sigPacket");
-
- this.sigPck = sigPacket;
- this.signatureType = sigPck.SignatureType;
- this.trustPck = trustPacket;
- }
-
- private void GetSig()
- {
- this.sig = SignerUtilities.GetSigner(
- PgpUtilities.GetSignatureName(sigPck.KeyAlgorithm, sigPck.HashAlgorithm));
- }
-
- /// The OpenPGP version number for this signature.
- public int Version
- {
- get { return sigPck.Version; }
- }
-
- /// The key algorithm associated with this signature.
- public PublicKeyAlgorithmTag KeyAlgorithm
- {
- get { return sigPck.KeyAlgorithm; }
- }
-
- /// The hash algorithm associated with this signature.
- public HashAlgorithmTag HashAlgorithm
- {
- get { return sigPck.HashAlgorithm; }
- }
-
- /// Return true if this signature represents a certification.
- public bool IsCertification()
- {
- return IsCertification(SignatureType);
- }
-
- public void InitVerify(
- PgpPublicKey pubKey)
- {
- lastb = 0;
- if (sig == null)
- {
- GetSig();
- }
- try
- {
- sig.Init(false, pubKey.GetKey());
- }
- catch (InvalidKeyException e)
- {
- throw new PgpException("invalid key.", e);
- }
- }
-
- public void Update(
- byte b)
- {
- if (signatureType == CanonicalTextDocument)
- {
- doCanonicalUpdateByte(b);
- }
- else
- {
- sig.Update(b);
- }
- }
-
- private void doCanonicalUpdateByte(
- byte b)
- {
- if (b == '\r')
- {
- doUpdateCRLF();
- }
- else if (b == '\n')
- {
- if (lastb != '\r')
- {
- doUpdateCRLF();
- }
- }
- else
- {
- sig.Update(b);
- }
-
- lastb = b;
- }
-
- private void doUpdateCRLF()
- {
- sig.Update((byte)'\r');
- sig.Update((byte)'\n');
- }
-
- public void Update(
- params byte[] bytes)
- {
- Update(bytes, 0, bytes.Length);
- }
-
- public void Update(
- byte[] bytes,
- int off,
- int length)
- {
- if (signatureType == CanonicalTextDocument)
- {
- int finish = off + length;
-
- for (int i = off; i != finish; i++)
- {
- doCanonicalUpdateByte(bytes[i]);
- }
- }
- else
- {
- sig.BlockUpdate(bytes, off, length);
- }
- }
-
- public bool Verify()
- {
- byte[] trailer = GetSignatureTrailer();
- sig.BlockUpdate(trailer, 0, trailer.Length);
-
- return sig.VerifySignature(GetSignature());
- }
-
- private void UpdateWithIdData(
- int header,
- byte[] idBytes)
- {
- this.Update(
- (byte) header,
- (byte)(idBytes.Length >> 24),
- (byte)(idBytes.Length >> 16),
- (byte)(idBytes.Length >> 8),
- (byte)(idBytes.Length));
- this.Update(idBytes);
- }
-
- private void UpdateWithPublicKey(
- PgpPublicKey key)
- {
- byte[] keyBytes = GetEncodedPublicKey(key);
-
- this.Update(
- (byte) 0x99,
- (byte)(keyBytes.Length >> 8),
- (byte)(keyBytes.Length));
- this.Update(keyBytes);
- }
-
- ///
- /// Verify the signature as certifying the passed in public key as associated
- /// with the passed in user attributes.
- ///
- /// User attributes the key was stored under.
- /// The key to be verified.
- /// True, if the signature matches, false otherwise.
- public bool VerifyCertification(
- PgpUserAttributeSubpacketVector userAttributes,
- PgpPublicKey key)
- {
- UpdateWithPublicKey(key);
-
- //
- // hash in the userAttributes
- //
- try
- {
- MemoryStream bOut = new MemoryStream();
- foreach (UserAttributeSubpacket packet in userAttributes.ToSubpacketArray())
- {
- packet.Encode(bOut);
- }
- UpdateWithIdData(0xd1, bOut.ToArray());
- }
- catch (IOException e)
- {
- throw new PgpException("cannot encode subpacket array", e);
- }
-
- this.Update(sigPck.GetSignatureTrailer());
-
- return sig.VerifySignature(this.GetSignature());
- }
-
- ///
- /// Verify the signature as certifying the passed in public key as associated
- /// with the passed in ID.
- ///
- /// ID the key was stored under.
- /// The key to be verified.
- /// True, if the signature matches, false otherwise.
- public bool VerifyCertification(
- string id,
- PgpPublicKey key)
- {
- UpdateWithPublicKey(key);
-
- //
- // hash in the id
- //
- UpdateWithIdData(0xb4, Strings.ToUtf8ByteArray(id));
-
- Update(sigPck.GetSignatureTrailer());
-
- return sig.VerifySignature(GetSignature());
- }
-
- /// Verify a certification for the passed in key against the passed in master key.
- /// The key we are verifying against.
- /// The key we are verifying.
- /// True, if the certification is valid, false otherwise.
- public bool VerifyCertification(
- PgpPublicKey masterKey,
- PgpPublicKey pubKey)
- {
- UpdateWithPublicKey(masterKey);
- UpdateWithPublicKey(pubKey);
-
- Update(sigPck.GetSignatureTrailer());
-
- return sig.VerifySignature(GetSignature());
- }
-
- /// Verify a key certification, such as revocation, for the passed in key.
- /// The key we are checking.
- /// True, if the certification is valid, false otherwise.
- public bool VerifyCertification(
- PgpPublicKey pubKey)
- {
- if (SignatureType != KeyRevocation
- && SignatureType != SubkeyRevocation)
- {
- throw new InvalidOperationException("signature is not a key signature");
- }
-
- UpdateWithPublicKey(pubKey);
-
- Update(sigPck.GetSignatureTrailer());
-
- return sig.VerifySignature(GetSignature());
- }
-
- public int SignatureType
- {
- get { return sigPck.SignatureType; }
- }
-
- /// The ID of the key that created the signature.
- public long KeyId
- {
- get { return sigPck.KeyId; }
- }
-
- [Obsolete("Use 'CreationTime' property instead")]
- public DateTime GetCreationTime()
- {
- return CreationTime;
- }
-
- /// The creation time of this signature.
- public DateTime CreationTime
- {
- get { return DateTimeUtilities.UnixMsToDateTime(sigPck.CreationTime); }
- }
-
- public byte[] GetSignatureTrailer()
- {
- return sigPck.GetSignatureTrailer();
- }
-
- ///
- /// Return true if the signature has either hashed or unhashed subpackets.
- ///
- public bool HasSubpackets
- {
- get
- {
- return sigPck.GetHashedSubPackets() != null
- || sigPck.GetUnhashedSubPackets() != null;
- }
- }
-
- public PgpSignatureSubpacketVector GetHashedSubPackets()
- {
- return createSubpacketVector(sigPck.GetHashedSubPackets());
- }
-
- public PgpSignatureSubpacketVector GetUnhashedSubPackets()
- {
- return createSubpacketVector(sigPck.GetUnhashedSubPackets());
- }
-
- private PgpSignatureSubpacketVector createSubpacketVector(SignatureSubpacket[] pcks)
- {
- return pcks == null ? null : new PgpSignatureSubpacketVector(pcks);
- }
-
- public byte[] GetSignature()
- {
- MPInteger[] sigValues = sigPck.GetSignature();
- byte[] signature;
-
- if (sigValues != null)
- {
- if (sigValues.Length == 1) // an RSA signature
- {
- signature = sigValues[0].Value.ToByteArrayUnsigned();
- }
- else
- {
- try
- {
- signature = new DerSequence(
- new DerInteger(sigValues[0].Value),
- new DerInteger(sigValues[1].Value)).GetEncoded();
- }
- catch (IOException e)
- {
- throw new PgpException("exception encoding DSA sig.", e);
- }
- }
- }
- else
- {
- signature = sigPck.GetSignatureBytes();
- }
-
- return signature;
- }
-
- // TODO Handle the encoding stuff by subclassing BcpgObject?
- public byte[] GetEncoded()
- {
- MemoryStream bOut = new MemoryStream();
-
- Encode(bOut);
-
- return bOut.ToArray();
- }
-
- public void Encode(
- Stream outStream)
- {
- BcpgOutputStream bcpgOut = BcpgOutputStream.Wrap(outStream);
-
- bcpgOut.WritePacket(sigPck);
-
- if (trustPck != null)
- {
- bcpgOut.WritePacket(trustPck);
- }
- }
-
- private byte[] GetEncodedPublicKey(
- PgpPublicKey pubKey)
- {
- try
- {
- return pubKey.publicPk.GetEncodedContents();
- }
- catch (IOException e)
- {
- throw new PgpException("exception preparing key.", e);
- }
- }
-
- ///
- /// Return true if the passed in signature type represents a certification, false if the signature type is not.
- ///
- ///
- /// true if signatureType is a certification, false otherwise.
- public static bool IsCertification(int signatureType)
- {
- switch (signatureType)
- {
- case DefaultCertification:
- case NoCertification:
- case CasualCertification:
- case PositiveCertification:
- return true;
- default:
- return false;
- }
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpSignatureGenerator.cs b/BCCrypto/src/openpgp/PgpSignatureGenerator.cs
deleted file mode 100644
index c530968..0000000
--- a/BCCrypto/src/openpgp/PgpSignatureGenerator.cs
+++ /dev/null
@@ -1,393 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Bcpg.Sig;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Generator for PGP signatures.
- // TODO Should be able to implement ISigner?
- public class PgpSignatureGenerator
- {
- private static readonly SignatureSubpacket[] EmptySignatureSubpackets = new SignatureSubpacket[0];
-
- private PublicKeyAlgorithmTag keyAlgorithm;
- private HashAlgorithmTag hashAlgorithm;
- private PgpPrivateKey privKey;
- private ISigner sig;
- private IDigest dig;
- private int signatureType;
- private byte lastb;
-
- private SignatureSubpacket[] unhashed = EmptySignatureSubpackets;
- private SignatureSubpacket[] hashed = EmptySignatureSubpackets;
-
- /// Create a generator for the passed in keyAlgorithm and hashAlgorithm codes.
- public PgpSignatureGenerator(
- PublicKeyAlgorithmTag keyAlgorithm,
- HashAlgorithmTag hashAlgorithm)
- {
- this.keyAlgorithm = keyAlgorithm;
- this.hashAlgorithm = hashAlgorithm;
-
- dig = DigestUtilities.GetDigest(PgpUtilities.GetDigestName(hashAlgorithm));
- sig = SignerUtilities.GetSigner(PgpUtilities.GetSignatureName(keyAlgorithm, hashAlgorithm));
- }
-
- /// Initialise the generator for signing.
- public void InitSign(
- int sigType,
- PgpPrivateKey key)
- {
- InitSign(sigType, key, null);
- }
-
- /// Initialise the generator for signing.
- public void InitSign(
- int sigType,
- PgpPrivateKey key,
- SecureRandom random)
- {
- this.privKey = key;
- this.signatureType = sigType;
-
- try
- {
- ICipherParameters cp = key.Key;
- if (random != null)
- {
- cp = new ParametersWithRandom(key.Key, random);
- }
-
- sig.Init(true, cp);
- }
- catch (InvalidKeyException e)
- {
- throw new PgpException("invalid key.", e);
- }
-
- dig.Reset();
- lastb = 0;
- }
-
- public void Update(
- byte b)
- {
- if (signatureType == PgpSignature.CanonicalTextDocument)
- {
- doCanonicalUpdateByte(b);
- }
- else
- {
- doUpdateByte(b);
- }
- }
-
- private void doCanonicalUpdateByte(
- byte b)
- {
- if (b == '\r')
- {
- doUpdateCRLF();
- }
- else if (b == '\n')
- {
- if (lastb != '\r')
- {
- doUpdateCRLF();
- }
- }
- else
- {
- doUpdateByte(b);
- }
-
- lastb = b;
- }
-
- private void doUpdateCRLF()
- {
- doUpdateByte((byte)'\r');
- doUpdateByte((byte)'\n');
- }
-
- private void doUpdateByte(
- byte b)
- {
- sig.Update(b);
- dig.Update(b);
- }
-
- public void Update(
- params byte[] b)
- {
- Update(b, 0, b.Length);
- }
-
- public void Update(
- byte[] b,
- int off,
- int len)
- {
- if (signatureType == PgpSignature.CanonicalTextDocument)
- {
- int finish = off + len;
-
- for (int i = off; i != finish; i++)
- {
- doCanonicalUpdateByte(b[i]);
- }
- }
- else
- {
- sig.BlockUpdate(b, off, len);
- dig.BlockUpdate(b, off, len);
- }
- }
-
- public void SetHashedSubpackets(
- PgpSignatureSubpacketVector hashedPackets)
- {
- hashed = hashedPackets == null
- ? EmptySignatureSubpackets
- : hashedPackets.ToSubpacketArray();
- }
-
- public void SetUnhashedSubpackets(
- PgpSignatureSubpacketVector unhashedPackets)
- {
- unhashed = unhashedPackets == null
- ? EmptySignatureSubpackets
- : unhashedPackets.ToSubpacketArray();
- }
-
- /// Return the one pass header associated with the current signature.
- public PgpOnePassSignature GenerateOnePassVersion(
- bool isNested)
- {
- return new PgpOnePassSignature(
- new OnePassSignaturePacket(
- signatureType, hashAlgorithm, keyAlgorithm, privKey.KeyId, isNested));
- }
-
- /// Return a signature object containing the current signature state.
- public PgpSignature Generate()
- {
- SignatureSubpacket[] hPkts = hashed, unhPkts = unhashed;
-
- if (!packetPresent(hashed, SignatureSubpacketTag.CreationTime))
- {
- hPkts = insertSubpacket(hPkts, new SignatureCreationTime(false, DateTime.UtcNow));
- }
-
- if (!packetPresent(hashed, SignatureSubpacketTag.IssuerKeyId)
- && !packetPresent(unhashed, SignatureSubpacketTag.IssuerKeyId))
- {
- unhPkts = insertSubpacket(unhPkts, new IssuerKeyId(false, privKey.KeyId));
- }
-
- int version = 4;
- byte[] hData;
-
- try
- {
- MemoryStream hOut = new MemoryStream();
-
- for (int i = 0; i != hPkts.Length; i++)
- {
- hPkts[i].Encode(hOut);
- }
-
- byte[] data = hOut.ToArray();
-
- MemoryStream sOut = new MemoryStream(data.Length + 6);
- sOut.WriteByte((byte)version);
- sOut.WriteByte((byte)signatureType);
- sOut.WriteByte((byte)keyAlgorithm);
- sOut.WriteByte((byte)hashAlgorithm);
- sOut.WriteByte((byte)(data.Length >> 8));
- sOut.WriteByte((byte)data.Length);
- sOut.Write(data, 0, data.Length);
-
- hData = sOut.ToArray();
- }
- catch (IOException e)
- {
- throw new PgpException("exception encoding hashed data.", e);
- }
-
- sig.BlockUpdate(hData, 0, hData.Length);
- dig.BlockUpdate(hData, 0, hData.Length);
-
- hData = new byte[]
- {
- (byte) version,
- 0xff,
- (byte)(hData.Length >> 24),
- (byte)(hData.Length >> 16),
- (byte)(hData.Length >> 8),
- (byte) hData.Length
- };
-
- sig.BlockUpdate(hData, 0, hData.Length);
- dig.BlockUpdate(hData, 0, hData.Length);
-
- byte[] sigBytes = sig.GenerateSignature();
- byte[] digest = DigestUtilities.DoFinal(dig);
- byte[] fingerPrint = new byte[] { digest[0], digest[1] };
-
- // an RSA signature
- bool isRsa = keyAlgorithm == PublicKeyAlgorithmTag.RsaSign
- || keyAlgorithm == PublicKeyAlgorithmTag.RsaGeneral;
-
- MPInteger[] sigValues = isRsa
- ? PgpUtilities.RsaSigToMpi(sigBytes)
- : PgpUtilities.DsaSigToMpi(sigBytes);
-
- return new PgpSignature(
- new SignaturePacket(signatureType, privKey.KeyId, keyAlgorithm,
- hashAlgorithm, hPkts, unhPkts, fingerPrint, sigValues));
- }
-
- /// Generate a certification for the passed in ID and key.
- /// The ID we are certifying against the public key.
- /// The key we are certifying against the ID.
- /// The certification.
- public PgpSignature GenerateCertification(
- string id,
- PgpPublicKey pubKey)
- {
- UpdateWithPublicKey(pubKey);
-
- //
- // hash in the id
- //
- UpdateWithIdData(0xb4, Strings.ToUtf8ByteArray(id));
-
- return Generate();
- }
-
- /// Generate a certification for the passed in userAttributes.
- /// The ID we are certifying against the public key.
- /// The key we are certifying against the ID.
- /// The certification.
- public PgpSignature GenerateCertification(
- PgpUserAttributeSubpacketVector userAttributes,
- PgpPublicKey pubKey)
- {
- UpdateWithPublicKey(pubKey);
-
- //
- // hash in the attributes
- //
- try
- {
- MemoryStream bOut = new MemoryStream();
- foreach (UserAttributeSubpacket packet in userAttributes.ToSubpacketArray())
- {
- packet.Encode(bOut);
- }
- UpdateWithIdData(0xd1, bOut.ToArray());
- }
- catch (IOException e)
- {
- throw new PgpException("cannot encode subpacket array", e);
- }
-
- return this.Generate();
- }
-
- /// Generate a certification for the passed in key against the passed in master key.
- /// The key we are certifying against.
- /// The key we are certifying.
- /// The certification.
- public PgpSignature GenerateCertification(
- PgpPublicKey masterKey,
- PgpPublicKey pubKey)
- {
- UpdateWithPublicKey(masterKey);
- UpdateWithPublicKey(pubKey);
-
- return Generate();
- }
-
- /// Generate a certification, such as a revocation, for the passed in key.
- /// The key we are certifying.
- /// The certification.
- public PgpSignature GenerateCertification(
- PgpPublicKey pubKey)
- {
- UpdateWithPublicKey(pubKey);
-
- return Generate();
- }
-
- private byte[] GetEncodedPublicKey(
- PgpPublicKey pubKey)
- {
- try
- {
- return pubKey.publicPk.GetEncodedContents();
- }
- catch (IOException e)
- {
- throw new PgpException("exception preparing key.", e);
- }
- }
-
- private bool packetPresent(
- SignatureSubpacket[] packets,
- SignatureSubpacketTag type)
- {
- for (int i = 0; i != packets.Length; i++)
- {
- if (packets[i].SubpacketType == type)
- {
- return true;
- }
- }
-
- return false;
- }
-
- private SignatureSubpacket[] insertSubpacket(
- SignatureSubpacket[] packets,
- SignatureSubpacket subpacket)
- {
- SignatureSubpacket[] tmp = new SignatureSubpacket[packets.Length + 1];
- tmp[0] = subpacket;
- packets.CopyTo(tmp, 1);
- return tmp;
- }
-
- private void UpdateWithIdData(
- int header,
- byte[] idBytes)
- {
- this.Update(
- (byte) header,
- (byte)(idBytes.Length >> 24),
- (byte)(idBytes.Length >> 16),
- (byte)(idBytes.Length >> 8),
- (byte)(idBytes.Length));
- this.Update(idBytes);
- }
-
- private void UpdateWithPublicKey(
- PgpPublicKey key)
- {
- byte[] keyBytes = GetEncodedPublicKey(key);
-
- this.Update(
- (byte) 0x99,
- (byte)(keyBytes.Length >> 8),
- (byte)(keyBytes.Length));
- this.Update(keyBytes);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpSignatureList.cs b/BCCrypto/src/openpgp/PgpSignatureList.cs
deleted file mode 100644
index 61976fc..0000000
--- a/BCCrypto/src/openpgp/PgpSignatureList.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// A list of PGP signatures - normally in the signature block after literal data.
- public class PgpSignatureList
- : PgpObject
- {
- private PgpSignature[] sigs;
-
- public PgpSignatureList(
- PgpSignature[] sigs)
- {
- this.sigs = (PgpSignature[]) sigs.Clone();
- }
-
- public PgpSignatureList(
- PgpSignature sig)
- {
- this.sigs = new PgpSignature[]{ sig };
- }
-
- public PgpSignature this[int index]
- {
- get { return sigs[index]; }
- }
-
- [Obsolete("Use 'object[index]' syntax instead")]
- public PgpSignature Get(
- int index)
- {
- return this[index];
- }
-
- [Obsolete("Use 'Count' property instead")]
- public int Size
- {
- get { return sigs.Length; }
- }
-
- public int Count
- {
- get { return sigs.Length; }
- }
-
- public bool IsEmpty
- {
- get { return (sigs.Length == 0); }
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpSignatureSubpacketGenerator.cs b/BCCrypto/src/openpgp/PgpSignatureSubpacketGenerator.cs
deleted file mode 100644
index d2177d0..0000000
--- a/BCCrypto/src/openpgp/PgpSignatureSubpacketGenerator.cs
+++ /dev/null
@@ -1,210 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Bcpg.Sig;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Generator for signature subpackets.
- public class PgpSignatureSubpacketGenerator
- {
- private IList list = Platform.CreateArrayList();
-
- public void SetRevocable(
- bool isCritical,
- bool isRevocable)
- {
- list.Add(new Revocable(isCritical, isRevocable));
- }
-
- public void SetExportable(
- bool isCritical,
- bool isExportable)
- {
- list.Add(new Exportable(isCritical, isExportable));
- }
-
- public void SetFeature(
- bool isCritical,
- byte feature)
- {
- list.Add(new Features(isCritical, feature));
- }
-
- ///
- /// Add a TrustSignature packet to the signature. The values for depth and trust are largely
- /// installation dependent but there are some guidelines in RFC 4880 - 5.2.3.13.
- ///
- /// true if the packet is critical.
- /// depth level.
- /// trust amount.
- public void SetTrust(
- bool isCritical,
- int depth,
- int trustAmount)
- {
- list.Add(new TrustSignature(isCritical, depth, trustAmount));
- }
-
- ///
- /// Set the number of seconds a key is valid for after the time of its creation.
- /// A value of zero means the key never expires.
- ///
- /// True, if should be treated as critical, false otherwise.
- /// The number of seconds the key is valid, or zero if no expiry.
- public void SetKeyExpirationTime(
- bool isCritical,
- long seconds)
- {
- list.Add(new KeyExpirationTime(isCritical, seconds));
- }
-
- ///
- /// Set the number of seconds a signature is valid for after the time of its creation.
- /// A value of zero means the signature never expires.
- ///
- /// True, if should be treated as critical, false otherwise.
- /// The number of seconds the signature is valid, or zero if no expiry.
- public void SetSignatureExpirationTime(
- bool isCritical,
- long seconds)
- {
- list.Add(new SignatureExpirationTime(isCritical, seconds));
- }
-
- ///
- /// Set the creation time for the signature.
- ///
- /// Note: this overrides the generation of a creation time when the signature
- /// is generated.
- ///
- public void SetSignatureCreationTime(
- bool isCritical,
- DateTime date)
- {
- list.Add(new SignatureCreationTime(isCritical, date));
- }
-
- public void SetPreferredHashAlgorithms(
- bool isCritical,
- int[] algorithms)
- {
- list.Add(new PreferredAlgorithms(SignatureSubpacketTag.PreferredHashAlgorithms, isCritical, algorithms));
- }
-
- public void SetPreferredSymmetricAlgorithms(
- bool isCritical,
- int[] algorithms)
- {
- list.Add(new PreferredAlgorithms(SignatureSubpacketTag.PreferredSymmetricAlgorithms, isCritical, algorithms));
- }
-
- public void SetPreferredCompressionAlgorithms(
- bool isCritical,
- int[] algorithms)
- {
- list.Add(new PreferredAlgorithms(SignatureSubpacketTag.PreferredCompressionAlgorithms, isCritical, algorithms));
- }
-
- public void SetKeyFlags(
- bool isCritical,
- int flags)
- {
- list.Add(new KeyFlags(isCritical, flags));
- }
-
- public void SetSignerUserId(
- bool isCritical,
- string userId)
- {
- if (userId == null)
- throw new ArgumentNullException("userId");
-
- list.Add(new SignerUserId(isCritical, userId));
- }
-
- public void SetSignerUserId(
- bool isCritical,
- byte[] rawUserId)
- {
- if (rawUserId == null)
- throw new ArgumentNullException("rawUserId");
-
- list.Add(new SignerUserId(isCritical, false, rawUserId));
- }
-
- public void SetEmbeddedSignature(
- bool isCritical,
- PgpSignature pgpSignature)
- {
- byte[] sig = pgpSignature.GetEncoded();
- byte[] data;
-
- // TODO Should be >= ?
- if (sig.Length - 1 > 256)
- {
- data = new byte[sig.Length - 3];
- }
- else
- {
- data = new byte[sig.Length - 2];
- }
-
- Array.Copy(sig, sig.Length - data.Length, data, 0, data.Length);
-
- list.Add(new EmbeddedSignature(isCritical, false, data));
- }
-
- public void SetPrimaryUserId(
- bool isCritical,
- bool isPrimaryUserId)
- {
- list.Add(new PrimaryUserId(isCritical, isPrimaryUserId));
- }
-
- public void SetNotationData(
- bool isCritical,
- bool isHumanReadable,
- string notationName,
- string notationValue)
- {
- list.Add(new NotationData(isCritical, isHumanReadable, notationName, notationValue));
- }
-
- ///
- /// Sets revocation reason sub packet
- ///
- public void SetRevocationReason(bool isCritical, RevocationReasonTag reason,
- string description)
- {
- list.Add(new RevocationReason(isCritical, reason, description));
- }
-
- ///
- /// Sets revocation key sub packet
- ///
- public void SetRevocationKey(bool isCritical, PublicKeyAlgorithmTag keyAlgorithm, byte[] fingerprint)
- {
- list.Add(new RevocationKey(isCritical, RevocationKeyTag.ClassDefault, keyAlgorithm, fingerprint));
- }
-
- ///
- /// Sets issuer key sub packet
- ///
- public void SetIssuerKeyID(bool isCritical, long keyID)
- {
- list.Add(new IssuerKeyId(isCritical, keyID));
- }
-
- public PgpSignatureSubpacketVector Generate()
- {
- SignatureSubpacket[] a = new SignatureSubpacket[list.Count];
- for (int i = 0; i < list.Count; ++i)
- {
- a[i] = (SignatureSubpacket)list[i];
- }
- return new PgpSignatureSubpacketVector(a);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpSignatureSubpacketVector.cs b/BCCrypto/src/openpgp/PgpSignatureSubpacketVector.cs
deleted file mode 100644
index 156243f..0000000
--- a/BCCrypto/src/openpgp/PgpSignatureSubpacketVector.cs
+++ /dev/null
@@ -1,239 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Bcpg.Sig;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Container for a list of signature subpackets.
- public class PgpSignatureSubpacketVector
- {
- private readonly SignatureSubpacket[] packets;
-
- internal PgpSignatureSubpacketVector(
- SignatureSubpacket[] packets)
- {
- this.packets = packets;
- }
-
- public SignatureSubpacket GetSubpacket(
- SignatureSubpacketTag type)
- {
- for (int i = 0; i != packets.Length; i++)
- {
- if (packets[i].SubpacketType == type)
- {
- return packets[i];
- }
- }
-
- return null;
- }
-
- /**
- * Return true if a particular subpacket type exists.
- *
- * @param type type to look for.
- * @return true if present, false otherwise.
- */
- public bool HasSubpacket(
- SignatureSubpacketTag type)
- {
- return GetSubpacket(type) != null;
- }
-
- /**
- * Return all signature subpackets of the passed in type.
- * @param type subpacket type code
- * @return an array of zero or more matching subpackets.
- */
- public SignatureSubpacket[] GetSubpackets(
- SignatureSubpacketTag type)
- {
- int count = 0;
- for (int i = 0; i < packets.Length; ++i)
- {
- if (packets[i].SubpacketType == type)
- {
- ++count;
- }
- }
-
- SignatureSubpacket[] result = new SignatureSubpacket[count];
-
- int pos = 0;
- for (int i = 0; i < packets.Length; ++i)
- {
- if (packets[i].SubpacketType == type)
- {
- result[pos++] = packets[i];
- }
- }
-
- return result;
- }
-
- public NotationData[] GetNotationDataOccurences()
- {
- SignatureSubpacket[] notations = GetSubpackets(SignatureSubpacketTag.NotationData);
- NotationData[] vals = new NotationData[notations.Length];
-
- for (int i = 0; i < notations.Length; i++)
- {
- vals[i] = (NotationData) notations[i];
- }
-
- return vals;
- }
-
- public long GetIssuerKeyId()
- {
- SignatureSubpacket p = GetSubpacket(SignatureSubpacketTag.IssuerKeyId);
-
- return p == null ? 0 : ((IssuerKeyId) p).KeyId;
- }
-
- public bool HasSignatureCreationTime()
- {
- return GetSubpacket(SignatureSubpacketTag.CreationTime) != null;
- }
-
- public DateTime GetSignatureCreationTime()
- {
- SignatureSubpacket p = GetSubpacket(SignatureSubpacketTag.CreationTime);
-
- if (p == null)
- {
- throw new PgpException("SignatureCreationTime not available");
- }
-
- return ((SignatureCreationTime)p).GetTime();
- }
-
- ///
- /// Return the number of seconds a signature is valid for after its creation date.
- /// A value of zero means the signature never expires.
- ///
- /// Seconds a signature is valid for.
- public long GetSignatureExpirationTime()
- {
- SignatureSubpacket p = GetSubpacket(SignatureSubpacketTag.ExpireTime);
-
- return p == null ? 0 : ((SignatureExpirationTime) p).Time;
- }
-
- ///
- /// Return the number of seconds a key is valid for after its creation date.
- /// A value of zero means the key never expires.
- ///
- /// Seconds a signature is valid for.
- public long GetKeyExpirationTime()
- {
- SignatureSubpacket p = GetSubpacket(SignatureSubpacketTag.KeyExpireTime);
-
- return p == null ? 0 : ((KeyExpirationTime) p).Time;
- }
-
- public int[] GetPreferredHashAlgorithms()
- {
- SignatureSubpacket p = GetSubpacket(SignatureSubpacketTag.PreferredHashAlgorithms);
-
- return p == null ? null : ((PreferredAlgorithms) p).GetPreferences();
- }
-
- public int[] GetPreferredSymmetricAlgorithms()
- {
- SignatureSubpacket p = GetSubpacket(SignatureSubpacketTag.PreferredSymmetricAlgorithms);
-
- return p == null ? null : ((PreferredAlgorithms) p).GetPreferences();
- }
-
- public int[] GetPreferredCompressionAlgorithms()
- {
- SignatureSubpacket p = GetSubpacket(SignatureSubpacketTag.PreferredCompressionAlgorithms);
-
- return p == null ? null : ((PreferredAlgorithms) p).GetPreferences();
- }
-
- public int GetKeyFlags()
- {
- SignatureSubpacket p = GetSubpacket(SignatureSubpacketTag.KeyFlags);
-
- return p == null ? 0 : ((KeyFlags) p).Flags;
- }
-
- public string GetSignerUserId()
- {
- SignatureSubpacket p = GetSubpacket(SignatureSubpacketTag.SignerUserId);
-
- return p == null ? null : ((SignerUserId) p).GetId();
- }
-
- public bool IsPrimaryUserId()
- {
- PrimaryUserId primaryId = (PrimaryUserId)
- this.GetSubpacket(SignatureSubpacketTag.PrimaryUserId);
-
- if (primaryId != null)
- {
- return primaryId.IsPrimaryUserId();
- }
-
- return false;
- }
-
- public SignatureSubpacketTag[] GetCriticalTags()
- {
- int count = 0;
- for (int i = 0; i != packets.Length; i++)
- {
- if (packets[i].IsCritical())
- {
- count++;
- }
- }
-
- SignatureSubpacketTag[] list = new SignatureSubpacketTag[count];
-
- count = 0;
-
- for (int i = 0; i != packets.Length; i++)
- {
- if (packets[i].IsCritical())
- {
- list[count++] = packets[i].SubpacketType;
- }
- }
-
- return list;
- }
-
- public Features GetFeatures()
- {
- SignatureSubpacket p = this.GetSubpacket(SignatureSubpacketTag.Features);
-
- if (p == null)
- return null;
-
- return new Features(p.IsCritical(), p.IsLongLength(), p.GetData());
- }
-
- [Obsolete("Use 'Count' property instead")]
- public int Size
- {
- get { return packets.Length; }
- }
-
- /// Return the number of packets this vector contains.
- public int Count
- {
- get { return packets.Length; }
- }
-
- internal SignatureSubpacket[] ToSubpacketArray()
- {
- return packets;
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpUserAttributeSubpacketVector.cs b/BCCrypto/src/openpgp/PgpUserAttributeSubpacketVector.cs
deleted file mode 100644
index 4cdbeda..0000000
--- a/BCCrypto/src/openpgp/PgpUserAttributeSubpacketVector.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-using Org.BouncyCastle.Bcpg.Attr;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Container for a list of user attribute subpackets.
- public class PgpUserAttributeSubpacketVector
- {
- private readonly UserAttributeSubpacket[] packets;
-
- internal PgpUserAttributeSubpacketVector(
- UserAttributeSubpacket[] packets)
- {
- this.packets = packets;
- }
-
- public UserAttributeSubpacket GetSubpacket(
- UserAttributeSubpacketTag type)
- {
- for (int i = 0; i != packets.Length; i++)
- {
- if (packets[i].SubpacketType == type)
- {
- return packets[i];
- }
- }
-
- return null;
- }
-
- public ImageAttrib GetImageAttribute()
- {
- UserAttributeSubpacket p = GetSubpacket(UserAttributeSubpacketTag.ImageAttribute);
-
- return p == null ? null : (ImageAttrib) p;
- }
-
- internal UserAttributeSubpacket[] ToSubpacketArray()
- {
- return packets;
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- PgpUserAttributeSubpacketVector other = obj as PgpUserAttributeSubpacketVector;
-
- if (other == null)
- return false;
-
- if (other.packets.Length != packets.Length)
- {
- return false;
- }
-
- for (int i = 0; i != packets.Length; i++)
- {
- if (!other.packets[i].Equals(packets[i]))
- {
- return false;
- }
- }
-
- return true;
- }
-
- public override int GetHashCode()
- {
- int code = 0;
-
- foreach (object o in packets)
- {
- code ^= o.GetHashCode();
- }
-
- return code;
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpUtilities.cs b/BCCrypto/src/openpgp/PgpUtilities.cs
deleted file mode 100644
index 7d96dee..0000000
--- a/BCCrypto/src/openpgp/PgpUtilities.cs
+++ /dev/null
@@ -1,518 +0,0 @@
-using System;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Basic utility class.
- public sealed class PgpUtilities
- {
- private PgpUtilities()
- {
- }
-
- public static MPInteger[] DsaSigToMpi(
- byte[] encoding)
- {
- DerInteger i1, i2;
-
- try
- {
- Asn1Sequence s = (Asn1Sequence) Asn1Object.FromByteArray(encoding);
-
- i1 = (DerInteger) s[0];
- i2 = (DerInteger) s[1];
- }
- catch (IOException e)
- {
- throw new PgpException("exception encoding signature", e);
- }
-
- return new MPInteger[]{ new MPInteger(i1.Value), new MPInteger(i2.Value) };
- }
-
- public static MPInteger[] RsaSigToMpi(
- byte[] encoding)
- {
- return new MPInteger[]{ new MPInteger(new BigInteger(1, encoding)) };
- }
-
- public static string GetDigestName(
- HashAlgorithmTag hashAlgorithm)
- {
- switch (hashAlgorithm)
- {
- case HashAlgorithmTag.Sha1:
- return "SHA1";
- case HashAlgorithmTag.MD2:
- return "MD2";
- case HashAlgorithmTag.MD5:
- return "MD5";
- case HashAlgorithmTag.RipeMD160:
- return "RIPEMD160";
- case HashAlgorithmTag.Sha224:
- return "SHA224";
- case HashAlgorithmTag.Sha256:
- return "SHA256";
- case HashAlgorithmTag.Sha384:
- return "SHA384";
- case HashAlgorithmTag.Sha512:
- return "SHA512";
- default:
- throw new PgpException("unknown hash algorithm tag in GetDigestName: " + hashAlgorithm);
- }
- }
-
- public static string GetSignatureName(
- PublicKeyAlgorithmTag keyAlgorithm,
- HashAlgorithmTag hashAlgorithm)
- {
- string encAlg;
- switch (keyAlgorithm)
- {
- case PublicKeyAlgorithmTag.RsaGeneral:
- case PublicKeyAlgorithmTag.RsaSign:
- encAlg = "RSA";
- break;
- case PublicKeyAlgorithmTag.Dsa:
- encAlg = "DSA";
- break;
- case PublicKeyAlgorithmTag.ECDH:
- encAlg = "ECDH";
- break;
- case PublicKeyAlgorithmTag.ECDsa:
- encAlg = "ECDSA";
- break;
- case PublicKeyAlgorithmTag.ElGamalEncrypt: // in some malformed cases.
- case PublicKeyAlgorithmTag.ElGamalGeneral:
- encAlg = "ElGamal";
- break;
- default:
- throw new PgpException("unknown algorithm tag in signature:" + keyAlgorithm);
- }
-
- return GetDigestName(hashAlgorithm) + "with" + encAlg;
- }
-
- public static string GetSymmetricCipherName(
- SymmetricKeyAlgorithmTag algorithm)
- {
- switch (algorithm)
- {
- case SymmetricKeyAlgorithmTag.Null:
- return null;
- case SymmetricKeyAlgorithmTag.TripleDes:
- return "DESEDE";
- case SymmetricKeyAlgorithmTag.Idea:
- return "IDEA";
- case SymmetricKeyAlgorithmTag.Cast5:
- return "CAST5";
- case SymmetricKeyAlgorithmTag.Blowfish:
- return "Blowfish";
- case SymmetricKeyAlgorithmTag.Safer:
- return "SAFER";
- case SymmetricKeyAlgorithmTag.Des:
- return "DES";
- case SymmetricKeyAlgorithmTag.Aes128:
- return "AES";
- case SymmetricKeyAlgorithmTag.Aes192:
- return "AES";
- case SymmetricKeyAlgorithmTag.Aes256:
- return "AES";
- case SymmetricKeyAlgorithmTag.Twofish:
- return "Twofish";
- case SymmetricKeyAlgorithmTag.Camellia128:
- return "Camellia";
- case SymmetricKeyAlgorithmTag.Camellia192:
- return "Camellia";
- case SymmetricKeyAlgorithmTag.Camellia256:
- return "Camellia";
- default:
- throw new PgpException("unknown symmetric algorithm: " + algorithm);
- }
- }
-
- public static int GetKeySize(SymmetricKeyAlgorithmTag algorithm)
- {
- int keySize;
- switch (algorithm)
- {
- case SymmetricKeyAlgorithmTag.Des:
- keySize = 64;
- break;
- case SymmetricKeyAlgorithmTag.Idea:
- case SymmetricKeyAlgorithmTag.Cast5:
- case SymmetricKeyAlgorithmTag.Blowfish:
- case SymmetricKeyAlgorithmTag.Safer:
- case SymmetricKeyAlgorithmTag.Aes128:
- case SymmetricKeyAlgorithmTag.Camellia128:
- keySize = 128;
- break;
- case SymmetricKeyAlgorithmTag.TripleDes:
- case SymmetricKeyAlgorithmTag.Aes192:
- case SymmetricKeyAlgorithmTag.Camellia192:
- keySize = 192;
- break;
- case SymmetricKeyAlgorithmTag.Aes256:
- case SymmetricKeyAlgorithmTag.Twofish:
- case SymmetricKeyAlgorithmTag.Camellia256:
- keySize = 256;
- break;
- default:
- throw new PgpException("unknown symmetric algorithm: " + algorithm);
- }
-
- return keySize;
- }
-
- public static KeyParameter MakeKey(
- SymmetricKeyAlgorithmTag algorithm,
- byte[] keyBytes)
- {
- string algName = GetSymmetricCipherName(algorithm);
-
- return ParameterUtilities.CreateKeyParameter(algName, keyBytes);
- }
-
- public static KeyParameter MakeRandomKey(
- SymmetricKeyAlgorithmTag algorithm,
- SecureRandom random)
- {
- int keySize = GetKeySize(algorithm);
- byte[] keyBytes = new byte[(keySize + 7) / 8];
- random.NextBytes(keyBytes);
- return MakeKey(algorithm, keyBytes);
- }
-
- internal static byte[] EncodePassPhrase(char[] passPhrase, bool utf8)
- {
- return passPhrase == null
- ? null
- : utf8
- ? Encoding.UTF8.GetBytes(passPhrase)
- : Strings.ToByteArray(passPhrase);
- }
-
- ///
- /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is
- /// the historical behaviour of the library (1.7 and earlier).
- ///
- public static KeyParameter MakeKeyFromPassPhrase(SymmetricKeyAlgorithmTag algorithm, S2k s2k, char[] passPhrase)
- {
- return DoMakeKeyFromPassPhrase(algorithm, s2k, EncodePassPhrase(passPhrase, false), true);
- }
-
- ///
- /// The passphrase is encoded to bytes using UTF8 (Encoding.UTF8.GetBytes).
- ///
- public static KeyParameter MakeKeyFromPassPhraseUtf8(SymmetricKeyAlgorithmTag algorithm, S2k s2k, char[] passPhrase)
- {
- return DoMakeKeyFromPassPhrase(algorithm, s2k, EncodePassPhrase(passPhrase, true), true);
- }
-
- ///
- /// Allows the caller to handle the encoding of the passphrase to bytes.
- ///
- public static KeyParameter MakeKeyFromPassPhraseRaw(SymmetricKeyAlgorithmTag algorithm, S2k s2k, byte[] rawPassPhrase)
- {
- return DoMakeKeyFromPassPhrase(algorithm, s2k, rawPassPhrase, false);
- }
-
- internal static KeyParameter DoMakeKeyFromPassPhrase(SymmetricKeyAlgorithmTag algorithm, S2k s2k, byte[] rawPassPhrase, bool clearPassPhrase)
- {
- int keySize = GetKeySize(algorithm);
- byte[] pBytes = rawPassPhrase;
- byte[] keyBytes = new byte[(keySize + 7) / 8];
-
- int generatedBytes = 0;
- int loopCount = 0;
-
- while (generatedBytes < keyBytes.Length)
- {
- IDigest digest;
- if (s2k != null)
- {
- string digestName = GetDigestName(s2k.HashAlgorithm);
-
- try
- {
- digest = DigestUtilities.GetDigest(digestName);
- }
- catch (Exception e)
- {
- throw new PgpException("can't find S2k digest", e);
- }
-
- for (int i = 0; i != loopCount; i++)
- {
- digest.Update(0);
- }
-
- byte[] iv = s2k.GetIV();
-
- switch (s2k.Type)
- {
- case S2k.Simple:
- digest.BlockUpdate(pBytes, 0, pBytes.Length);
- break;
- case S2k.Salted:
- digest.BlockUpdate(iv, 0, iv.Length);
- digest.BlockUpdate(pBytes, 0, pBytes.Length);
- break;
- case S2k.SaltedAndIterated:
- long count = s2k.IterationCount;
- digest.BlockUpdate(iv, 0, iv.Length);
- digest.BlockUpdate(pBytes, 0, pBytes.Length);
-
- count -= iv.Length + pBytes.Length;
-
- while (count > 0)
- {
- if (count < iv.Length)
- {
- digest.BlockUpdate(iv, 0, (int)count);
- break;
- }
- else
- {
- digest.BlockUpdate(iv, 0, iv.Length);
- count -= iv.Length;
- }
-
- if (count < pBytes.Length)
- {
- digest.BlockUpdate(pBytes, 0, (int)count);
- count = 0;
- }
- else
- {
- digest.BlockUpdate(pBytes, 0, pBytes.Length);
- count -= pBytes.Length;
- }
- }
- break;
- default:
- throw new PgpException("unknown S2k type: " + s2k.Type);
- }
- }
- else
- {
- try
- {
- digest = DigestUtilities.GetDigest("MD5");
-
- for (int i = 0; i != loopCount; i++)
- {
- digest.Update(0);
- }
-
- digest.BlockUpdate(pBytes, 0, pBytes.Length);
- }
- catch (Exception e)
- {
- throw new PgpException("can't find MD5 digest", e);
- }
- }
-
- byte[] dig = DigestUtilities.DoFinal(digest);
-
- if (dig.Length > (keyBytes.Length - generatedBytes))
- {
- Array.Copy(dig, 0, keyBytes, generatedBytes, keyBytes.Length - generatedBytes);
- }
- else
- {
- Array.Copy(dig, 0, keyBytes, generatedBytes, dig.Length);
- }
-
- generatedBytes += dig.Length;
-
- loopCount++;
- }
-
- if (clearPassPhrase && rawPassPhrase != null)
- {
- Array.Clear(rawPassPhrase, 0, rawPassPhrase.Length);
- }
-
- return MakeKey(algorithm, keyBytes);
- }
-
-#if !PORTABLE || DOTNET
- /// Write out the passed in file as a literal data packet.
- public static void WriteFileToLiteralData(
- Stream output,
- char fileType,
- FileInfo file)
- {
- PgpLiteralDataGenerator lData = new PgpLiteralDataGenerator();
- Stream pOut = lData.Open(output, fileType, file.Name, file.Length, file.LastWriteTime);
- PipeFileContents(file, pOut, 4096);
- }
-
- /// Write out the passed in file as a literal data packet in partial packet format.
- public static void WriteFileToLiteralData(
- Stream output,
- char fileType,
- FileInfo file,
- byte[] buffer)
- {
- PgpLiteralDataGenerator lData = new PgpLiteralDataGenerator();
- Stream pOut = lData.Open(output, fileType, file.Name, file.LastWriteTime, buffer);
- PipeFileContents(file, pOut, buffer.Length);
- }
-
- private static void PipeFileContents(FileInfo file, Stream pOut, int bufSize)
- {
- FileStream inputStream = file.OpenRead();
- byte[] buf = new byte[bufSize];
-
- int len;
- while ((len = inputStream.Read(buf, 0, buf.Length)) > 0)
- {
- pOut.Write(buf, 0, len);
- }
-
- Platform.Dispose(pOut);
- Platform.Dispose(inputStream);
- }
-#endif
-
- private const int ReadAhead = 60;
-
- private static bool IsPossiblyBase64(
- int ch)
- {
- return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')
- || (ch >= '0' && ch <= '9') || (ch == '+') || (ch == '/')
- || (ch == '\r') || (ch == '\n');
- }
-
- ///
- /// Return either an ArmoredInputStream or a BcpgInputStream based on whether
- /// the initial characters of the stream are binary PGP encodings or not.
- ///
- public static Stream GetDecoderStream(
- Stream inputStream)
- {
- // TODO Remove this restriction?
- if (!inputStream.CanSeek)
- throw new ArgumentException("inputStream must be seek-able", "inputStream");
-
- long markedPos = inputStream.Position;
-
- int ch = inputStream.ReadByte();
- if ((ch & 0x80) != 0)
- {
- inputStream.Position = markedPos;
-
- return inputStream;
- }
-
- if (!IsPossiblyBase64(ch))
- {
- inputStream.Position = markedPos;
-
- return new ArmoredInputStream(inputStream);
- }
-
- byte[] buf = new byte[ReadAhead];
- int count = 1;
- int index = 1;
-
- buf[0] = (byte)ch;
- while (count != ReadAhead && (ch = inputStream.ReadByte()) >= 0)
- {
- if (!IsPossiblyBase64(ch))
- {
- inputStream.Position = markedPos;
-
- return new ArmoredInputStream(inputStream);
- }
-
- if (ch != '\n' && ch != '\r')
- {
- buf[index++] = (byte)ch;
- }
-
- count++;
- }
-
- inputStream.Position = markedPos;
-
- //
- // nothing but new lines, little else, assume regular armoring
- //
- if (count < 4)
- {
- return new ArmoredInputStream(inputStream);
- }
-
- //
- // test our non-blank data
- //
- byte[] firstBlock = new byte[8];
-
- Array.Copy(buf, 0, firstBlock, 0, firstBlock.Length);
-
- try
- {
- byte[] decoded = Base64.Decode(firstBlock);
-
- //
- // it's a base64 PGP block.
- //
- bool hasHeaders = (decoded[0] & 0x80) == 0;
-
- return new ArmoredInputStream(inputStream, hasHeaders);
- }
- catch (IOException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new IOException(e.Message);
- }
- }
-
- internal static IWrapper CreateWrapper(SymmetricKeyAlgorithmTag encAlgorithm)
- {
- switch (encAlgorithm)
- {
- case SymmetricKeyAlgorithmTag.Aes128:
- case SymmetricKeyAlgorithmTag.Aes192:
- case SymmetricKeyAlgorithmTag.Aes256:
- return WrapperUtilities.GetWrapper("AESWRAP");
- case SymmetricKeyAlgorithmTag.Camellia128:
- case SymmetricKeyAlgorithmTag.Camellia192:
- case SymmetricKeyAlgorithmTag.Camellia256:
- return WrapperUtilities.GetWrapper("CAMELLIAWRAP");
- default:
- throw new PgpException("unknown wrap algorithm: " + encAlgorithm);
- }
- }
-
- internal static byte[] GenerateIV(int length, SecureRandom random)
- {
- byte[] iv = new byte[length];
- random.NextBytes(iv);
- return iv;
- }
-
- internal static S2k GenerateS2k(HashAlgorithmTag hashAlgorithm, int s2kCount, SecureRandom random)
- {
- byte[] iv = GenerateIV(8, random);
- return new S2k(hashAlgorithm, iv, s2kCount);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/PgpV3SignatureGenerator.cs b/BCCrypto/src/openpgp/PgpV3SignatureGenerator.cs
deleted file mode 100644
index fc8b42d..0000000
--- a/BCCrypto/src/openpgp/PgpV3SignatureGenerator.cs
+++ /dev/null
@@ -1,199 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /// Generator for old style PGP V3 Signatures.
- // TODO Should be able to implement ISigner?
- public class PgpV3SignatureGenerator
- {
- private PublicKeyAlgorithmTag keyAlgorithm;
- private HashAlgorithmTag hashAlgorithm;
- private PgpPrivateKey privKey;
- private ISigner sig;
- private IDigest dig;
- private int signatureType;
- private byte lastb;
-
- /// Create a generator for the passed in keyAlgorithm and hashAlgorithm codes.
- public PgpV3SignatureGenerator(
- PublicKeyAlgorithmTag keyAlgorithm,
- HashAlgorithmTag hashAlgorithm)
- {
- this.keyAlgorithm = keyAlgorithm;
- this.hashAlgorithm = hashAlgorithm;
-
- dig = DigestUtilities.GetDigest(PgpUtilities.GetDigestName(hashAlgorithm));
- sig = SignerUtilities.GetSigner(PgpUtilities.GetSignatureName(keyAlgorithm, hashAlgorithm));
- }
-
- /// Initialise the generator for signing.
- public void InitSign(
- int sigType,
- PgpPrivateKey key)
- {
- InitSign(sigType, key, null);
- }
-
- /// Initialise the generator for signing.
- public void InitSign(
- int sigType,
- PgpPrivateKey key,
- SecureRandom random)
- {
- this.privKey = key;
- this.signatureType = sigType;
-
- try
- {
- ICipherParameters cp = key.Key;
- if (random != null)
- {
- cp = new ParametersWithRandom(key.Key, random);
- }
-
- sig.Init(true, cp);
- }
- catch (InvalidKeyException e)
- {
- throw new PgpException("invalid key.", e);
- }
-
- dig.Reset();
- lastb = 0;
- }
-
- public void Update(
- byte b)
- {
- if (signatureType == PgpSignature.CanonicalTextDocument)
- {
- doCanonicalUpdateByte(b);
- }
- else
- {
- doUpdateByte(b);
- }
- }
-
- private void doCanonicalUpdateByte(
- byte b)
- {
- if (b == '\r')
- {
- doUpdateCRLF();
- }
- else if (b == '\n')
- {
- if (lastb != '\r')
- {
- doUpdateCRLF();
- }
- }
- else
- {
- doUpdateByte(b);
- }
-
- lastb = b;
- }
-
- private void doUpdateCRLF()
- {
- doUpdateByte((byte)'\r');
- doUpdateByte((byte)'\n');
- }
-
- private void doUpdateByte(
- byte b)
- {
- sig.Update(b);
- dig.Update(b);
- }
-
- public void Update(
- byte[] b)
- {
- if (signatureType == PgpSignature.CanonicalTextDocument)
- {
- for (int i = 0; i != b.Length; i++)
- {
- doCanonicalUpdateByte(b[i]);
- }
- }
- else
- {
- sig.BlockUpdate(b, 0, b.Length);
- dig.BlockUpdate(b, 0, b.Length);
- }
- }
-
- public void Update(
- byte[] b,
- int off,
- int len)
- {
- if (signatureType == PgpSignature.CanonicalTextDocument)
- {
- int finish = off + len;
-
- for (int i = off; i != finish; i++)
- {
- doCanonicalUpdateByte(b[i]);
- }
- }
- else
- {
- sig.BlockUpdate(b, off, len);
- dig.BlockUpdate(b, off, len);
- }
- }
-
- /// Return the one pass header associated with the current signature.
- public PgpOnePassSignature GenerateOnePassVersion(
- bool isNested)
- {
- return new PgpOnePassSignature(
- new OnePassSignaturePacket(signatureType, hashAlgorithm, keyAlgorithm, privKey.KeyId, isNested));
- }
-
- /// Return a V3 signature object containing the current signature state.
- public PgpSignature Generate()
- {
- long creationTime = DateTimeUtilities.CurrentUnixMs() / 1000L;
-
- byte[] hData = new byte[]
- {
- (byte) signatureType,
- (byte)(creationTime >> 24),
- (byte)(creationTime >> 16),
- (byte)(creationTime >> 8),
- (byte) creationTime
- };
-
- sig.BlockUpdate(hData, 0, hData.Length);
- dig.BlockUpdate(hData, 0, hData.Length);
-
- byte[] sigBytes = sig.GenerateSignature();
- byte[] digest = DigestUtilities.DoFinal(dig);
- byte[] fingerPrint = new byte[]{ digest[0], digest[1] };
-
- // an RSA signature
- bool isRsa = keyAlgorithm == PublicKeyAlgorithmTag.RsaSign
- || keyAlgorithm == PublicKeyAlgorithmTag.RsaGeneral;
-
- MPInteger[] sigValues = isRsa
- ? PgpUtilities.RsaSigToMpi(sigBytes)
- : PgpUtilities.DsaSigToMpi(sigBytes);
-
- return new PgpSignature(
- new SignaturePacket(3, signatureType, privKey.KeyId, keyAlgorithm,
- hashAlgorithm, creationTime * 1000L, fingerPrint, sigValues));
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/Rfc6637Utilities.cs b/BCCrypto/src/openpgp/Rfc6637Utilities.cs
deleted file mode 100644
index 5d992ec..0000000
--- a/BCCrypto/src/openpgp/Rfc6637Utilities.cs
+++ /dev/null
@@ -1,138 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- public sealed class Rfc6637Utilities
- {
- private Rfc6637Utilities()
- {
- }
-
- // "Anonymous Sender ", which is the octet sequence
- private static readonly byte[] ANONYMOUS_SENDER = Hex.Decode("416E6F6E796D6F75732053656E64657220202020");
-
- public static string GetAgreementAlgorithm(PublicKeyPacket pubKeyData)
- {
- ECDHPublicBcpgKey ecKey = (ECDHPublicBcpgKey)pubKeyData.Key;
-
- switch (ecKey.HashAlgorithm)
- {
- case HashAlgorithmTag.Sha256:
- return "ECCDHwithSHA256CKDF";
- case HashAlgorithmTag.Sha384:
- return "ECCDHwithSHA384CKDF";
- case HashAlgorithmTag.Sha512:
- return "ECCDHwithSHA512CKDF";
- default:
- throw new ArgumentException("Unknown hash algorithm specified: " + ecKey.HashAlgorithm);
- }
- }
-
- public static DerObjectIdentifier GetKeyEncryptionOID(SymmetricKeyAlgorithmTag algID)
- {
- switch (algID)
- {
- case SymmetricKeyAlgorithmTag.Aes128:
- return NistObjectIdentifiers.IdAes128Wrap;
- case SymmetricKeyAlgorithmTag.Aes192:
- return NistObjectIdentifiers.IdAes192Wrap;
- case SymmetricKeyAlgorithmTag.Aes256:
- return NistObjectIdentifiers.IdAes256Wrap;
- default:
- throw new PgpException("unknown symmetric algorithm ID: " + algID);
- }
- }
-
- public static int GetKeyLength(SymmetricKeyAlgorithmTag algID)
- {
- switch (algID)
- {
- case SymmetricKeyAlgorithmTag.Aes128:
- return 16;
- case SymmetricKeyAlgorithmTag.Aes192:
- return 24;
- case SymmetricKeyAlgorithmTag.Aes256:
- return 32;
- default:
- throw new PgpException("unknown symmetric algorithm ID: " + algID);
- }
- }
-
- public static byte[] CreateKey(PublicKeyPacket pubKeyData, ECPoint s)
- {
- byte[] userKeyingMaterial = CreateUserKeyingMaterial(pubKeyData);
-
- ECDHPublicBcpgKey ecKey = (ECDHPublicBcpgKey)pubKeyData.Key;
-
- return Kdf(ecKey.HashAlgorithm, s, GetKeyLength(ecKey.SymmetricKeyAlgorithm), userKeyingMaterial);
- }
-
- // RFC 6637 - Section 8
- // curve_OID_len = (byte)len(curve_OID);
- // Param = curve_OID_len || curve_OID || public_key_alg_ID || 03
- // || 01 || KDF_hash_ID || KEK_alg_ID for AESKeyWrap || "Anonymous
- // Sender " || recipient_fingerprint;
- // Z_len = the key size for the KEK_alg_ID used with AESKeyWrap
- // Compute Z = KDF( S, Z_len, Param );
- public static byte[] CreateUserKeyingMaterial(PublicKeyPacket pubKeyData)
- {
- MemoryStream pOut = new MemoryStream();
- ECDHPublicBcpgKey ecKey = (ECDHPublicBcpgKey)pubKeyData.Key;
- byte[] encOid = ecKey.CurveOid.GetEncoded();
-
- pOut.Write(encOid, 1, encOid.Length - 1);
- pOut.WriteByte((byte)pubKeyData.Algorithm);
- pOut.WriteByte(0x03);
- pOut.WriteByte(0x01);
- pOut.WriteByte((byte)ecKey.HashAlgorithm);
- pOut.WriteByte((byte)ecKey.SymmetricKeyAlgorithm);
- pOut.Write(ANONYMOUS_SENDER, 0, ANONYMOUS_SENDER.Length);
-
- byte[] fingerprint = PgpPublicKey.CalculateFingerprint(pubKeyData);
- pOut.Write(fingerprint, 0, fingerprint.Length);
-
- return pOut.ToArray();
- }
-
- // RFC 6637 - Section 7
- // Implements KDF( X, oBits, Param );
- // Input: point X = (x,y)
- // oBits - the desired size of output
- // hBits - the size of output of hash function Hash
- // Param - octets representing the parameters
- // Assumes that oBits <= hBits
- // Convert the point X to the octet string, see section 6:
- // ZB' = 04 || x || y
- // and extract the x portion from ZB'
- // ZB = x;
- // MB = Hash ( 00 || 00 || 00 || 01 || ZB || Param );
- // return oBits leftmost bits of MB.
- private static byte[] Kdf(HashAlgorithmTag digestAlg, ECPoint s, int keyLen, byte[] parameters)
- {
- byte[] ZB = s.XCoord.GetEncoded();
-
- string digestName = PgpUtilities.GetDigestName(digestAlg);
- IDigest digest = DigestUtilities.GetDigest(digestName);
-
- digest.Update(0x00);
- digest.Update(0x00);
- digest.Update(0x00);
- digest.Update(0x01);
- digest.BlockUpdate(ZB, 0, ZB.Length);
- digest.BlockUpdate(parameters, 0, parameters.Length);
-
- byte[] hash = DigestUtilities.DoFinal(digest);
-
- return Arrays.CopyOfRange(hash, 0, keyLen);
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/SXprUtilities.cs b/BCCrypto/src/openpgp/SXprUtilities.cs
deleted file mode 100644
index 68ff373..0000000
--- a/BCCrypto/src/openpgp/SXprUtilities.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- /**
- * Utility functions for looking a S-expression keys. This class will move when it finds a better home!
- *
- * Format documented here:
- * http://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob;f=agent/keyformat.txt;h=42c4b1f06faf1bbe71ffadc2fee0fad6bec91a97;hb=refs/heads/master
- *
- */
- public sealed class SXprUtilities
- {
- private SXprUtilities()
- {
- }
-
- private static int ReadLength(Stream input, int ch)
- {
- int len = ch - '0';
-
- while ((ch = input.ReadByte()) >= 0 && ch != ':')
- {
- len = len * 10 + ch - '0';
- }
-
- return len;
- }
-
- internal static string ReadString(Stream input, int ch)
- {
- int len = ReadLength(input, ch);
-
- char[] chars = new char[len];
-
- for (int i = 0; i != chars.Length; i++)
- {
- chars[i] = (char)input.ReadByte();
- }
-
- return new string(chars);
- }
-
- internal static byte[] ReadBytes(Stream input, int ch)
- {
- int len = ReadLength(input, ch);
-
- byte[] data = new byte[len];
-
- Streams.ReadFully(input, data);
-
- return data;
- }
-
- internal static S2k ParseS2k(Stream input)
- {
- SkipOpenParenthesis(input);
-
- string alg = ReadString(input, input.ReadByte());
- byte[] iv = ReadBytes(input, input.ReadByte());
- long iterationCount = Int64.Parse(ReadString(input, input.ReadByte()));
-
- SkipCloseParenthesis(input);
-
- // we have to return the actual iteration count provided.
- return new MyS2k(HashAlgorithmTag.Sha1, iv, iterationCount);
- }
-
- internal static void SkipOpenParenthesis(Stream input)
- {
- int ch = input.ReadByte();
- if (ch != '(')
- throw new IOException("unknown character encountered");
- }
-
- internal static void SkipCloseParenthesis(Stream input)
- {
- int ch = input.ReadByte();
- if (ch != ')')
- throw new IOException("unknown character encountered");
- }
-
- private class MyS2k : S2k
- {
- private readonly long mIterationCount64;
-
- internal MyS2k(HashAlgorithmTag algorithm, byte[] iv, long iterationCount64)
- : base(algorithm, iv, (int)iterationCount64)
- {
- this.mIterationCount64 = iterationCount64;
- }
-
- public override long IterationCount
- {
- get { return mIterationCount64; }
- }
- }
- }
-}
diff --git a/BCCrypto/src/openpgp/WrappedGeneratorStream.cs b/BCCrypto/src/openpgp/WrappedGeneratorStream.cs
deleted file mode 100644
index 5f4a4b0..0000000
--- a/BCCrypto/src/openpgp/WrappedGeneratorStream.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System.IO;
-
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.Bcpg.OpenPgp
-{
- public class WrappedGeneratorStream
- : FilterStream
- {
- private readonly IStreamGenerator gen;
-
- public WrappedGeneratorStream(
- IStreamGenerator gen,
- Stream str)
- : base(str)
- {
- this.gen = gen;
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- gen.Close();
- return;
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- gen.Close();
- }
-#endif
- }
-}
diff --git a/BCCrypto/src/openssl/EncryptionException.cs b/BCCrypto/src/openssl/EncryptionException.cs
deleted file mode 100644
index 043e902..0000000
--- a/BCCrypto/src/openssl/EncryptionException.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Security
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class EncryptionException
- : IOException
- {
- public EncryptionException(
- string message)
- : base(message)
- {
- }
-
- public EncryptionException(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/openssl/IPasswordFinder.cs b/BCCrypto/src/openssl/IPasswordFinder.cs
deleted file mode 100644
index 4fcef1b..0000000
--- a/BCCrypto/src/openssl/IPasswordFinder.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.OpenSsl
-{
- public interface IPasswordFinder
- {
- char[] GetPassword();
- }
-}
diff --git a/BCCrypto/src/openssl/MiscPemGenerator.cs b/BCCrypto/src/openssl/MiscPemGenerator.cs
deleted file mode 100644
index 22ae1ea..0000000
--- a/BCCrypto/src/openssl/MiscPemGenerator.cs
+++ /dev/null
@@ -1,275 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Pkcs;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-using Org.BouncyCastle.Utilities.IO.Pem;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.OpenSsl
-{
- /**
- * PEM generator for the original set of PEM objects used in Open SSL.
- */
- public class MiscPemGenerator
- : PemObjectGenerator
- {
- private object obj;
- private string algorithm;
- private char[] password;
- private SecureRandom random;
-
- public MiscPemGenerator(object obj)
- {
- this.obj = obj;
- }
-
- public MiscPemGenerator(
- object obj,
- string algorithm,
- char[] password,
- SecureRandom random)
- {
- this.obj = obj;
- this.algorithm = algorithm;
- this.password = password;
- this.random = random;
- }
-
- private static PemObject CreatePemObject(object obj)
- {
- if (obj == null)
- throw new ArgumentNullException("obj");
-
- if (obj is AsymmetricCipherKeyPair)
- {
- return CreatePemObject(((AsymmetricCipherKeyPair)obj).Private);
- }
-
- string type;
- byte[] encoding;
-
- if (obj is PemObject)
- return (PemObject)obj;
-
- if (obj is PemObjectGenerator)
- return ((PemObjectGenerator)obj).Generate();
-
- if (obj is X509Certificate)
- {
- // TODO Should we prefer "X509 CERTIFICATE" here?
- type = "CERTIFICATE";
- try
- {
- encoding = ((X509Certificate)obj).GetEncoded();
- }
- catch (CertificateEncodingException e)
- {
- throw new IOException("Cannot Encode object: " + e.ToString());
- }
- }
- else if (obj is X509Crl)
- {
- type = "X509 CRL";
- try
- {
- encoding = ((X509Crl)obj).GetEncoded();
- }
- catch (CrlException e)
- {
- throw new IOException("Cannot Encode object: " + e.ToString());
- }
- }
- else if (obj is AsymmetricKeyParameter)
- {
- AsymmetricKeyParameter akp = (AsymmetricKeyParameter) obj;
- if (akp.IsPrivate)
- {
- string keyType;
- encoding = EncodePrivateKey(akp, out keyType);
-
- type = keyType + " PRIVATE KEY";
- }
- else
- {
- type = "PUBLIC KEY";
-
- encoding = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(akp).GetDerEncoded();
- }
- }
- else if (obj is IX509AttributeCertificate)
- {
- type = "ATTRIBUTE CERTIFICATE";
- encoding = ((X509V2AttributeCertificate)obj).GetEncoded();
- }
- else if (obj is Pkcs10CertificationRequest)
- {
- type = "CERTIFICATE REQUEST";
- encoding = ((Pkcs10CertificationRequest)obj).GetEncoded();
- }
- else if (obj is Asn1.Cms.ContentInfo)
- {
- type = "PKCS7";
- encoding = ((Asn1.Cms.ContentInfo)obj).GetEncoded();
- }
- else
- {
- throw new PemGenerationException("Object type not supported: " + Platform.GetTypeName(obj));
- }
-
- return new PemObject(type, encoding);
- }
-
-// private string GetHexEncoded(byte[] bytes)
-// {
-// bytes = Hex.Encode(bytes);
-//
-// char[] chars = new char[bytes.Length];
-//
-// for (int i = 0; i != bytes.Length; i++)
-// {
-// chars[i] = (char)bytes[i];
-// }
-//
-// return new string(chars);
-// }
-
- private static PemObject CreatePemObject(
- object obj,
- string algorithm,
- char[] password,
- SecureRandom random)
- {
- if (obj == null)
- throw new ArgumentNullException("obj");
- if (algorithm == null)
- throw new ArgumentNullException("algorithm");
- if (password == null)
- throw new ArgumentNullException("password");
- if (random == null)
- throw new ArgumentNullException("random");
-
- if (obj is AsymmetricCipherKeyPair)
- {
- return CreatePemObject(((AsymmetricCipherKeyPair)obj).Private, algorithm, password, random);
- }
-
- string type = null;
- byte[] keyData = null;
-
- if (obj is AsymmetricKeyParameter)
- {
- AsymmetricKeyParameter akp = (AsymmetricKeyParameter) obj;
- if (akp.IsPrivate)
- {
- string keyType;
- keyData = EncodePrivateKey(akp, out keyType);
-
- type = keyType + " PRIVATE KEY";
- }
- }
-
- if (type == null || keyData == null)
- {
- // TODO Support other types?
- throw new PemGenerationException("Object type not supported: " + Platform.GetTypeName(obj));
- }
-
-
- string dekAlgName = Platform.ToUpperInvariant(algorithm);
-
- // Note: For backward compatibility
- if (dekAlgName == "DESEDE")
- {
- dekAlgName = "DES-EDE3-CBC";
- }
-
- int ivLength = Platform.StartsWith(dekAlgName, "AES-") ? 16 : 8;
-
- byte[] iv = new byte[ivLength];
- random.NextBytes(iv);
-
- byte[] encData = PemUtilities.Crypt(true, keyData, password, dekAlgName, iv);
-
- IList headers = Platform.CreateArrayList(2);
-
- headers.Add(new PemHeader("Proc-Type", "4,ENCRYPTED"));
- headers.Add(new PemHeader("DEK-Info", dekAlgName + "," + Hex.ToHexString(iv)));
-
- return new PemObject(type, headers, encData);
- }
-
- private static byte[] EncodePrivateKey(
- AsymmetricKeyParameter akp,
- out string keyType)
- {
- PrivateKeyInfo info = PrivateKeyInfoFactory.CreatePrivateKeyInfo(akp);
- AlgorithmIdentifier algID = info.PrivateKeyAlgorithm;
- DerObjectIdentifier oid = algID.Algorithm;
-
- if (oid.Equals(X9ObjectIdentifiers.IdDsa))
- {
- keyType = "DSA";
-
- DsaParameter p = DsaParameter.GetInstance(algID.Parameters);
-
- BigInteger x = ((DsaPrivateKeyParameters) akp).X;
- BigInteger y = p.G.ModPow(x, p.P);
-
- // TODO Create an ASN1 object somewhere for this?
- return new DerSequence(
- new DerInteger(0),
- new DerInteger(p.P),
- new DerInteger(p.Q),
- new DerInteger(p.G),
- new DerInteger(y),
- new DerInteger(x)).GetEncoded();
- }
-
- if (oid.Equals(PkcsObjectIdentifiers.RsaEncryption))
- {
- keyType = "RSA";
- }
- else if (oid.Equals(CryptoProObjectIdentifiers.GostR3410x2001)
- || oid.Equals(X9ObjectIdentifiers.IdECPublicKey))
- {
- keyType = "EC";
- }
- else
- {
- throw new ArgumentException("Cannot handle private key of type: " + Platform.GetTypeName(akp), "akp");
- }
-
- return info.ParsePrivateKey().GetEncoded();
- }
-
- public PemObject Generate()
- {
- try
- {
- if (algorithm != null)
- {
- return CreatePemObject(obj, algorithm, password, random);
- }
-
- return CreatePemObject(obj);
- }
- catch (IOException e)
- {
- throw new PemGenerationException("encoding exception", e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/openssl/PEMException.cs b/BCCrypto/src/openssl/PEMException.cs
deleted file mode 100644
index 6b3e510..0000000
--- a/BCCrypto/src/openssl/PEMException.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.OpenSsl
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class PemException
- : IOException
- {
- public PemException(
- string message)
- : base(message)
- {
- }
-
- public PemException(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/openssl/PEMReader.cs b/BCCrypto/src/openssl/PEMReader.cs
deleted file mode 100644
index 9a5f99b..0000000
--- a/BCCrypto/src/openssl/PEMReader.cs
+++ /dev/null
@@ -1,401 +0,0 @@
-using System;
-using System.Collections;
-using System.Diagnostics;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.Sec;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.EC;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Pkcs;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-using Org.BouncyCastle.Utilities.IO.Pem;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.OpenSsl
-{
- /**
- * Class for reading OpenSSL PEM encoded streams containing
- * X509 certificates, PKCS8 encoded keys and PKCS7 objects.
- *
- * In the case of PKCS7 objects the reader will return a CMS ContentInfo object. Keys and
- * Certificates will be returned using the appropriate java.security type.
- */
- public class PemReader
- : Org.BouncyCastle.Utilities.IO.Pem.PemReader
- {
-// private static readonly IDictionary parsers = new Hashtable();
-
- static PemReader()
- {
-// parsers.Add("CERTIFICATE REQUEST", new PKCS10CertificationRequestParser());
-// parsers.Add("NEW CERTIFICATE REQUEST", new PKCS10CertificationRequestParser());
-// parsers.Add("CERTIFICATE", new X509CertificateParser(provider));
-// parsers.Add("X509 CERTIFICATE", new X509CertificateParser(provider));
-// parsers.Add("X509 CRL", new X509CRLParser(provider));
-// parsers.Add("PKCS7", new PKCS7Parser());
-// parsers.Add("ATTRIBUTE CERTIFICATE", new X509AttributeCertificateParser());
-// parsers.Add("EC PARAMETERS", new ECNamedCurveSpecParser());
-// parsers.Add("PUBLIC KEY", new PublicKeyParser(provider));
-// parsers.Add("RSA PUBLIC KEY", new RSAPublicKeyParser(provider));
-// parsers.Add("RSA PRIVATE KEY", new RSAKeyPairParser(provider));
-// parsers.Add("DSA PRIVATE KEY", new DSAKeyPairParser(provider));
-// parsers.Add("EC PRIVATE KEY", new ECDSAKeyPairParser(provider));
-// parsers.Add("ENCRYPTED PRIVATE KEY", new EncryptedPrivateKeyParser(provider));
-// parsers.Add("PRIVATE KEY", new PrivateKeyParser(provider));
- }
-
- private readonly IPasswordFinder pFinder;
-
- /**
- * Create a new PemReader
- *
- * @param reader the Reader
- */
- public PemReader(
- TextReader reader)
- : this(reader, null)
- {
- }
-
- /**
- * Create a new PemReader with a password finder
- *
- * @param reader the Reader
- * @param pFinder the password finder
- */
- public PemReader(
- TextReader reader,
- IPasswordFinder pFinder)
- : base(reader)
- {
- this.pFinder = pFinder;
- }
-
- public object ReadObject()
- {
- PemObject obj = ReadPemObject();
-
- if (obj == null)
- return null;
-
- // TODO Follow Java build and map to parser objects?
-// if (parsers.Contains(obj.Type))
-// return ((PemObjectParser)parsers[obj.Type]).ParseObject(obj);
-
- if (Platform.EndsWith(obj.Type, "PRIVATE KEY"))
- return ReadPrivateKey(obj);
-
- switch (obj.Type)
- {
- case "PUBLIC KEY":
- return ReadPublicKey(obj);
- case "RSA PUBLIC KEY":
- return ReadRsaPublicKey(obj);
- case "CERTIFICATE REQUEST":
- case "NEW CERTIFICATE REQUEST":
- return ReadCertificateRequest(obj);
- case "CERTIFICATE":
- case "X509 CERTIFICATE":
- return ReadCertificate(obj);
- case "PKCS7":
- case "CMS":
- return ReadPkcs7(obj);
- case "X509 CRL":
- return ReadCrl(obj);
- case "ATTRIBUTE CERTIFICATE":
- return ReadAttributeCertificate(obj);
- // TODO Add back in when tests done, and return type issue resolved
- //case "EC PARAMETERS":
- // return ReadECParameters(obj);
- default:
- throw new IOException("unrecognised object: " + obj.Type);
- }
- }
-
- private AsymmetricKeyParameter ReadRsaPublicKey(PemObject pemObject)
- {
- RsaPublicKeyStructure rsaPubStructure = RsaPublicKeyStructure.GetInstance(
- Asn1Object.FromByteArray(pemObject.Content));
-
- return new RsaKeyParameters(
- false, // not private
- rsaPubStructure.Modulus,
- rsaPubStructure.PublicExponent);
- }
-
- private AsymmetricKeyParameter ReadPublicKey(PemObject pemObject)
- {
- return PublicKeyFactory.CreateKey(pemObject.Content);
- }
-
- /**
- * Reads in a X509Certificate.
- *
- * @return the X509Certificate
- * @throws IOException if an I/O error occured
- */
- private X509Certificate ReadCertificate(PemObject pemObject)
- {
- try
- {
- return new X509CertificateParser().ReadCertificate(pemObject.Content);
- }
- catch (Exception e)
- {
- throw new PemException("problem parsing cert: " + e.ToString());
- }
- }
-
- /**
- * Reads in a X509CRL.
- *
- * @return the X509Certificate
- * @throws IOException if an I/O error occured
- */
- private X509Crl ReadCrl(PemObject pemObject)
- {
- try
- {
- return new X509CrlParser().ReadCrl(pemObject.Content);
- }
- catch (Exception e)
- {
- throw new PemException("problem parsing cert: " + e.ToString());
- }
- }
-
- /**
- * Reads in a PKCS10 certification request.
- *
- * @return the certificate request.
- * @throws IOException if an I/O error occured
- */
- private Pkcs10CertificationRequest ReadCertificateRequest(PemObject pemObject)
- {
- try
- {
- return new Pkcs10CertificationRequest(pemObject.Content);
- }
- catch (Exception e)
- {
- throw new PemException("problem parsing cert: " + e.ToString());
- }
- }
-
- /**
- * Reads in a X509 Attribute Certificate.
- *
- * @return the X509 Attribute Certificate
- * @throws IOException if an I/O error occured
- */
- private IX509AttributeCertificate ReadAttributeCertificate(PemObject pemObject)
- {
- return new X509V2AttributeCertificate(pemObject.Content);
- }
-
- /**
- * Reads in a PKCS7 object. This returns a ContentInfo object suitable for use with the CMS
- * API.
- *
- * @return the X509Certificate
- * @throws IOException if an I/O error occured
- */
- // TODO Consider returning Asn1.Pkcs.ContentInfo
- private Asn1.Cms.ContentInfo ReadPkcs7(PemObject pemObject)
- {
- try
- {
- return Asn1.Cms.ContentInfo.GetInstance(
- Asn1Object.FromByteArray(pemObject.Content));
- }
- catch (Exception e)
- {
- throw new PemException("problem parsing PKCS7 object: " + e.ToString());
- }
- }
-
- /**
- * Read a Key Pair
- */
- private object ReadPrivateKey(PemObject pemObject)
- {
- //
- // extract the key
- //
- Debug.Assert(Platform.EndsWith(pemObject.Type, "PRIVATE KEY"));
-
- string type = pemObject.Type.Substring(0, pemObject.Type.Length - "PRIVATE KEY".Length).Trim();
- byte[] keyBytes = pemObject.Content;
-
- IDictionary fields = Platform.CreateHashtable();
- foreach (PemHeader header in pemObject.Headers)
- {
- fields[header.Name] = header.Value;
- }
-
- string procType = (string) fields["Proc-Type"];
-
- if (procType == "4,ENCRYPTED")
- {
- if (pFinder == null)
- throw new PasswordException("No password finder specified, but a password is required");
-
- char[] password = pFinder.GetPassword();
-
- if (password == null)
- throw new PasswordException("Password is null, but a password is required");
-
- string dekInfo = (string) fields["DEK-Info"];
- string[] tknz = dekInfo.Split(',');
-
- string dekAlgName = tknz[0].Trim();
- byte[] iv = Hex.Decode(tknz[1].Trim());
-
- keyBytes = PemUtilities.Crypt(false, keyBytes, password, dekAlgName, iv);
- }
-
- try
- {
- AsymmetricKeyParameter pubSpec, privSpec;
- Asn1Sequence seq = Asn1Sequence.GetInstance(keyBytes);
-
- switch (type)
- {
- case "RSA":
- {
- if (seq.Count != 9)
- throw new PemException("malformed sequence in RSA private key");
-
- RsaPrivateKeyStructure rsa = RsaPrivateKeyStructure.GetInstance(seq);
-
- pubSpec = new RsaKeyParameters(false, rsa.Modulus, rsa.PublicExponent);
- privSpec = new RsaPrivateCrtKeyParameters(
- rsa.Modulus, rsa.PublicExponent, rsa.PrivateExponent,
- rsa.Prime1, rsa.Prime2, rsa.Exponent1, rsa.Exponent2,
- rsa.Coefficient);
-
- break;
- }
-
- case "DSA":
- {
- if (seq.Count != 6)
- throw new PemException("malformed sequence in DSA private key");
-
- // TODO Create an ASN1 object somewhere for this?
- //DerInteger v = (DerInteger)seq[0];
- DerInteger p = (DerInteger)seq[1];
- DerInteger q = (DerInteger)seq[2];
- DerInteger g = (DerInteger)seq[3];
- DerInteger y = (DerInteger)seq[4];
- DerInteger x = (DerInteger)seq[5];
-
- DsaParameters parameters = new DsaParameters(p.Value, q.Value, g.Value);
-
- privSpec = new DsaPrivateKeyParameters(x.Value, parameters);
- pubSpec = new DsaPublicKeyParameters(y.Value, parameters);
-
- break;
- }
-
- case "EC":
- {
- ECPrivateKeyStructure pKey = ECPrivateKeyStructure.GetInstance(seq);
- AlgorithmIdentifier algId = new AlgorithmIdentifier(
- X9ObjectIdentifiers.IdECPublicKey, pKey.GetParameters());
-
- PrivateKeyInfo privInfo = new PrivateKeyInfo(algId, pKey.ToAsn1Object());
-
- // TODO Are the keys returned here ECDSA, as Java version forces?
- privSpec = PrivateKeyFactory.CreateKey(privInfo);
-
- DerBitString pubKey = pKey.GetPublicKey();
- if (pubKey != null)
- {
- SubjectPublicKeyInfo pubInfo = new SubjectPublicKeyInfo(algId, pubKey.GetBytes());
-
- // TODO Are the keys returned here ECDSA, as Java version forces?
- pubSpec = PublicKeyFactory.CreateKey(pubInfo);
- }
- else
- {
- pubSpec = ECKeyPairGenerator.GetCorrespondingPublicKey(
- (ECPrivateKeyParameters)privSpec);
- }
-
- break;
- }
-
- case "ENCRYPTED":
- {
- char[] password = pFinder.GetPassword();
-
- if (password == null)
- throw new PasswordException("Password is null, but a password is required");
-
- return PrivateKeyFactory.DecryptKey(password, EncryptedPrivateKeyInfo.GetInstance(seq));
- }
-
- case "":
- {
- return PrivateKeyFactory.CreateKey(PrivateKeyInfo.GetInstance(seq));
- }
-
- default:
- throw new ArgumentException("Unknown key type: " + type, "type");
- }
-
- return new AsymmetricCipherKeyPair(pubSpec, privSpec);
- }
- catch (IOException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new PemException(
- "problem creating " + type + " private key: " + e.ToString());
- }
- }
-
- // TODO Add an equivalent class for ECNamedCurveParameterSpec?
- //private ECNamedCurveParameterSpec ReadECParameters(
-// private X9ECParameters ReadECParameters(PemObject pemObject)
-// {
-// DerObjectIdentifier oid = (DerObjectIdentifier)Asn1Object.FromByteArray(pemObject.Content);
-//
-// //return ECNamedCurveTable.getParameterSpec(oid.Id);
-// return GetCurveParameters(oid.Id);
-// }
-
- //private static ECDomainParameters GetCurveParameters(
- private static X9ECParameters GetCurveParameters(
- string name)
- {
- // TODO ECGost3410NamedCurves support (returns ECDomainParameters though)
-
- X9ECParameters ecP = CustomNamedCurves.GetByName(name);
- if (ecP == null)
- {
- ecP = ECNamedCurveTable.GetByName(name);
- }
-
- if (ecP == null)
- throw new Exception("unknown curve name: " + name);
-
- //return new ECDomainParameters(ecP.Curve, ecP.G, ecP.N, ecP.H, ecP.GetSeed());
- return ecP;
- }
- }
-}
diff --git a/BCCrypto/src/openssl/PEMUtilities.cs b/BCCrypto/src/openssl/PEMUtilities.cs
deleted file mode 100644
index b58e5e7..0000000
--- a/BCCrypto/src/openssl/PEMUtilities.cs
+++ /dev/null
@@ -1,158 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.OpenSsl
-{
- internal sealed class PemUtilities
- {
- private enum PemBaseAlg { AES_128, AES_192, AES_256, BF, DES, DES_EDE, DES_EDE3, RC2, RC2_40, RC2_64 };
- private enum PemMode { CBC, CFB, ECB, OFB };
-
- static PemUtilities()
- {
- // Signal to obfuscation tools not to change enum constants
- ((PemBaseAlg)Enums.GetArbitraryValue(typeof(PemBaseAlg))).ToString();
- ((PemMode)Enums.GetArbitraryValue(typeof(PemMode))).ToString();
- }
-
- private static void ParseDekAlgName(
- string dekAlgName,
- out PemBaseAlg baseAlg,
- out PemMode mode)
- {
- try
- {
- mode = PemMode.ECB;
-
- if (dekAlgName == "DES-EDE" || dekAlgName == "DES-EDE3")
- {
- baseAlg = (PemBaseAlg)Enums.GetEnumValue(typeof(PemBaseAlg), dekAlgName);
- return;
- }
-
- int pos = dekAlgName.LastIndexOf('-');
- if (pos >= 0)
- {
- baseAlg = (PemBaseAlg)Enums.GetEnumValue(typeof(PemBaseAlg), dekAlgName.Substring(0, pos));
- mode = (PemMode)Enums.GetEnumValue(typeof(PemMode), dekAlgName.Substring(pos + 1));
- return;
- }
- }
- catch (ArgumentException)
- {
- }
-
- throw new EncryptionException("Unknown DEK algorithm: " + dekAlgName);
- }
-
- internal static byte[] Crypt(
- bool encrypt,
- byte[] bytes,
- char[] password,
- string dekAlgName,
- byte[] iv)
- {
- PemBaseAlg baseAlg;
- PemMode mode;
- ParseDekAlgName(dekAlgName, out baseAlg, out mode);
-
- string padding;
- switch (mode)
- {
- case PemMode.CBC:
- case PemMode.ECB:
- padding = "PKCS5Padding";
- break;
- case PemMode.CFB:
- case PemMode.OFB:
- padding = "NoPadding";
- break;
- default:
- throw new EncryptionException("Unknown DEK algorithm: " + dekAlgName);
- }
-
- string algorithm;
-
- byte[] salt = iv;
- switch (baseAlg)
- {
- case PemBaseAlg.AES_128:
- case PemBaseAlg.AES_192:
- case PemBaseAlg.AES_256:
- algorithm = "AES";
- if (salt.Length > 8)
- {
- salt = new byte[8];
- Array.Copy(iv, 0, salt, 0, salt.Length);
- }
- break;
- case PemBaseAlg.BF:
- algorithm = "BLOWFISH";
- break;
- case PemBaseAlg.DES:
- algorithm = "DES";
- break;
- case PemBaseAlg.DES_EDE:
- case PemBaseAlg.DES_EDE3:
- algorithm = "DESede";
- break;
- case PemBaseAlg.RC2:
- case PemBaseAlg.RC2_40:
- case PemBaseAlg.RC2_64:
- algorithm = "RC2";
- break;
- default:
- throw new EncryptionException("Unknown DEK algorithm: " + dekAlgName);
- }
-
- string cipherName = algorithm + "/" + mode + "/" + padding;
- IBufferedCipher cipher = CipherUtilities.GetCipher(cipherName);
-
- ICipherParameters cParams = GetCipherParameters(password, baseAlg, salt);
-
- if (mode != PemMode.ECB)
- {
- cParams = new ParametersWithIV(cParams, iv);
- }
-
- cipher.Init(encrypt, cParams);
-
- return cipher.DoFinal(bytes);
- }
-
- private static ICipherParameters GetCipherParameters(
- char[] password,
- PemBaseAlg baseAlg,
- byte[] salt)
- {
- string algorithm;
- int keyBits;
- switch (baseAlg)
- {
- case PemBaseAlg.AES_128: keyBits = 128; algorithm = "AES128"; break;
- case PemBaseAlg.AES_192: keyBits = 192; algorithm = "AES192"; break;
- case PemBaseAlg.AES_256: keyBits = 256; algorithm = "AES256"; break;
- case PemBaseAlg.BF: keyBits = 128; algorithm = "BLOWFISH"; break;
- case PemBaseAlg.DES: keyBits = 64; algorithm = "DES"; break;
- case PemBaseAlg.DES_EDE: keyBits = 128; algorithm = "DESEDE"; break;
- case PemBaseAlg.DES_EDE3: keyBits = 192; algorithm = "DESEDE3"; break;
- case PemBaseAlg.RC2: keyBits = 128; algorithm = "RC2"; break;
- case PemBaseAlg.RC2_40: keyBits = 40; algorithm = "RC2"; break;
- case PemBaseAlg.RC2_64: keyBits = 64; algorithm = "RC2"; break;
- default:
- return null;
- }
-
- OpenSslPbeParametersGenerator pGen = new OpenSslPbeParametersGenerator();
-
- pGen.Init(PbeParametersGenerator.Pkcs5PasswordToBytes(password), salt);
-
- return pGen.GenerateDerivedParameters(algorithm, keyBits);
- }
- }
-}
diff --git a/BCCrypto/src/openssl/PEMWriter.cs b/BCCrypto/src/openssl/PEMWriter.cs
deleted file mode 100644
index aefb018..0000000
--- a/BCCrypto/src/openssl/PEMWriter.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.Globalization;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Pkcs;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities.Encoders;
-using Org.BouncyCastle.Utilities.IO.Pem;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.OpenSsl
-{
- /// General purpose writer for OpenSSL PEM objects.
- public class PemWriter
- : Org.BouncyCastle.Utilities.IO.Pem.PemWriter
- {
- /// The TextWriter object to write the output to.
- public PemWriter(
- TextWriter writer)
- : base(writer)
- {
- }
-
- public void WriteObject(
- object obj)
- {
- try
- {
- base.WriteObject(new MiscPemGenerator(obj));
- }
- catch (PemGenerationException e)
- {
- if (e.InnerException is IOException)
- throw (IOException)e.InnerException;
-
- throw e;
- }
- }
-
- public void WriteObject(
- object obj,
- string algorithm,
- char[] password,
- SecureRandom random)
- {
- base.WriteObject(new MiscPemGenerator(obj, algorithm, password, random));
- }
- }
-}
diff --git a/BCCrypto/src/openssl/PasswordException.cs b/BCCrypto/src/openssl/PasswordException.cs
deleted file mode 100644
index 38e679b..0000000
--- a/BCCrypto/src/openssl/PasswordException.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Security
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class PasswordException
- : IOException
- {
- public PasswordException(
- string message)
- : base(message)
- {
- }
-
- public PasswordException(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/openssl/Pkcs8Generator.cs b/BCCrypto/src/openssl/Pkcs8Generator.cs
deleted file mode 100644
index d03ea08..0000000
--- a/BCCrypto/src/openssl/Pkcs8Generator.cs
+++ /dev/null
@@ -1,111 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Pkcs;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities.IO.Pem;
-
-namespace Org.BouncyCastle.OpenSsl
-{
- public class Pkcs8Generator
- : PemObjectGenerator
- {
- // FIXME See PbeUtilities static constructor
-// public static readonly string Aes128Cbc = NistObjectIdentifiers.IdAes128Cbc.Id;
-// public static readonly string Aes192Cbc = NistObjectIdentifiers.IdAes192Cbc.Id;
-// public static readonly string Aes256Cbc = NistObjectIdentifiers.IdAes256Cbc.Id;
-//
-// public static readonly string Des3Cbc = PkcsObjectIdentifiers.DesEde3Cbc.Id;
-
- public static readonly string PbeSha1_RC4_128 = PkcsObjectIdentifiers.PbeWithShaAnd128BitRC4.Id;
- public static readonly string PbeSha1_RC4_40 = PkcsObjectIdentifiers.PbeWithShaAnd40BitRC4.Id;
- public static readonly string PbeSha1_3DES = PkcsObjectIdentifiers.PbeWithShaAnd3KeyTripleDesCbc.Id;
- public static readonly string PbeSha1_2DES = PkcsObjectIdentifiers.PbeWithShaAnd2KeyTripleDesCbc.Id;
- public static readonly string PbeSha1_RC2_128 = PkcsObjectIdentifiers.PbeWithShaAnd128BitRC2Cbc.Id;
- public static readonly string PbeSha1_RC2_40 = PkcsObjectIdentifiers.PbewithShaAnd40BitRC2Cbc.Id;
-
- private char[] password;
- private string algorithm;
- private int iterationCount;
- private AsymmetricKeyParameter privKey;
- private SecureRandom random;
-
- /**
- * Constructor for an unencrypted private key PEM object.
- *
- * @param key private key to be encoded.
- */
- public Pkcs8Generator(AsymmetricKeyParameter privKey)
- {
- this.privKey = privKey;
- }
-
- /**
- * Constructor for an encrypted private key PEM object.
- *
- * @param key private key to be encoded
- * @param algorithm encryption algorithm to use
- * @param provider provider to use
- * @throws NoSuchAlgorithmException if algorithm/mode cannot be found
- */
- public Pkcs8Generator(AsymmetricKeyParameter privKey, string algorithm)
- {
- // TODO Check privKey.IsPrivate
- this.privKey = privKey;
- this.algorithm = algorithm;
- this.iterationCount = 2048;
- }
-
- public SecureRandom SecureRandom
- {
- set { this.random = value; }
- }
-
- public char[] Password
- {
- set { this.password = value; }
- }
-
- public int IterationCount
- {
- set { this.iterationCount = value; }
- }
-
- public PemObject Generate()
- {
- if (algorithm == null)
- {
- PrivateKeyInfo pki = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privKey);
-
- return new PemObject("PRIVATE KEY", pki.GetEncoded());
- }
-
- // TODO Theoretically, the amount of salt needed depends on the algorithm
- byte[] salt = new byte[20];
- if (random == null)
- {
- random = new SecureRandom();
- }
- random.NextBytes(salt);
-
- try
- {
- EncryptedPrivateKeyInfo epki = EncryptedPrivateKeyInfoFactory.CreateEncryptedPrivateKeyInfo(
- algorithm, password, salt, iterationCount, privKey);
-
- return new PemObject("ENCRYPTED PRIVATE KEY", epki.GetEncoded());
- }
- catch (Exception e)
- {
- throw new PemGenerationException("Couldn't encrypt private key", e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/pkcs/AsymmetricKeyEntry.cs b/BCCrypto/src/pkcs/AsymmetricKeyEntry.cs
deleted file mode 100644
index 6da3ade..0000000
--- a/BCCrypto/src/pkcs/AsymmetricKeyEntry.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Pkcs
-{
- public class AsymmetricKeyEntry
- : Pkcs12Entry
- {
- private readonly AsymmetricKeyParameter key;
-
- public AsymmetricKeyEntry(
- AsymmetricKeyParameter key)
- : base(Platform.CreateHashtable())
- {
- this.key = key;
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- [Obsolete]
- public AsymmetricKeyEntry(
- AsymmetricKeyParameter key,
- Hashtable attributes)
- : base(attributes)
- {
- this.key = key;
- }
-#endif
-
- public AsymmetricKeyEntry(
- AsymmetricKeyParameter key,
- IDictionary attributes)
- : base(attributes)
- {
- this.key = key;
- }
-
- public AsymmetricKeyParameter Key
- {
- get { return this.key; }
- }
-
- public override bool Equals(object obj)
- {
- AsymmetricKeyEntry other = obj as AsymmetricKeyEntry;
-
- if (other == null)
- return false;
-
- return key.Equals(other.key);
- }
-
- public override int GetHashCode()
- {
- return ~key.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/pkcs/EncryptedPrivateKeyInfoFactory.cs b/BCCrypto/src/pkcs/EncryptedPrivateKeyInfoFactory.cs
deleted file mode 100644
index b6b7bac..0000000
--- a/BCCrypto/src/pkcs/EncryptedPrivateKeyInfoFactory.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Pkcs
-{
- public sealed class EncryptedPrivateKeyInfoFactory
- {
- private EncryptedPrivateKeyInfoFactory()
- {
- }
-
- public static EncryptedPrivateKeyInfo CreateEncryptedPrivateKeyInfo(
- DerObjectIdentifier algorithm,
- char[] passPhrase,
- byte[] salt,
- int iterationCount,
- AsymmetricKeyParameter key)
- {
- return CreateEncryptedPrivateKeyInfo(
- algorithm.Id, passPhrase, salt, iterationCount,
- PrivateKeyInfoFactory.CreatePrivateKeyInfo(key));
- }
-
- public static EncryptedPrivateKeyInfo CreateEncryptedPrivateKeyInfo(
- string algorithm,
- char[] passPhrase,
- byte[] salt,
- int iterationCount,
- AsymmetricKeyParameter key)
- {
- return CreateEncryptedPrivateKeyInfo(
- algorithm, passPhrase, salt, iterationCount,
- PrivateKeyInfoFactory.CreatePrivateKeyInfo(key));
- }
-
- public static EncryptedPrivateKeyInfo CreateEncryptedPrivateKeyInfo(
- string algorithm,
- char[] passPhrase,
- byte[] salt,
- int iterationCount,
- PrivateKeyInfo keyInfo)
- {
- IBufferedCipher cipher = PbeUtilities.CreateEngine(algorithm) as IBufferedCipher;
- if (cipher == null)
- throw new Exception("Unknown encryption algorithm: " + algorithm);
-
- Asn1Encodable pbeParameters = PbeUtilities.GenerateAlgorithmParameters(
- algorithm, salt, iterationCount);
- ICipherParameters cipherParameters = PbeUtilities.GenerateCipherParameters(
- algorithm, passPhrase, pbeParameters);
- cipher.Init(true, cipherParameters);
- byte[] encoding = cipher.DoFinal(keyInfo.GetEncoded());
-
- DerObjectIdentifier oid = PbeUtilities.GetObjectIdentifier(algorithm);
- AlgorithmIdentifier algID = new AlgorithmIdentifier(oid, pbeParameters);
- return new EncryptedPrivateKeyInfo(algID, encoding);
- }
- }
-}
diff --git a/BCCrypto/src/pkcs/PKCS12StoreBuilder.cs b/BCCrypto/src/pkcs/PKCS12StoreBuilder.cs
deleted file mode 100644
index c8fa0f6..0000000
--- a/BCCrypto/src/pkcs/PKCS12StoreBuilder.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Pkcs;
-
-namespace Org.BouncyCastle.Pkcs
-{
- public class Pkcs12StoreBuilder
- {
- private DerObjectIdentifier keyAlgorithm = PkcsObjectIdentifiers.PbeWithShaAnd3KeyTripleDesCbc;
- private DerObjectIdentifier certAlgorithm = PkcsObjectIdentifiers.PbewithShaAnd40BitRC2Cbc;
- private bool useDerEncoding = false;
-
- public Pkcs12StoreBuilder()
- {
- }
-
- public Pkcs12Store Build()
- {
- return new Pkcs12Store(keyAlgorithm, certAlgorithm, useDerEncoding);
- }
-
- public Pkcs12StoreBuilder SetCertAlgorithm(DerObjectIdentifier certAlgorithm)
- {
- this.certAlgorithm = certAlgorithm;
- return this;
- }
-
- public Pkcs12StoreBuilder SetKeyAlgorithm(DerObjectIdentifier keyAlgorithm)
- {
- this.keyAlgorithm = keyAlgorithm;
- return this;
- }
-
- public Pkcs12StoreBuilder SetUseDerEncoding(bool useDerEncoding)
- {
- this.useDerEncoding = useDerEncoding;
- return this;
- }
- }
-}
diff --git a/BCCrypto/src/pkcs/Pkcs10CertificationRequest.cs b/BCCrypto/src/pkcs/Pkcs10CertificationRequest.cs
deleted file mode 100644
index c2504e6..0000000
--- a/BCCrypto/src/pkcs/Pkcs10CertificationRequest.cs
+++ /dev/null
@@ -1,464 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.Crypto.Operators;
-
-namespace Org.BouncyCastle.Pkcs
-{
- ///
- /// A class for verifying and creating Pkcs10 Certification requests.
- ///
- ///
- /// CertificationRequest ::= Sequence {
- /// certificationRequestInfo CertificationRequestInfo,
- /// signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
- /// signature BIT STRING
- /// }
- ///
- /// CertificationRequestInfo ::= Sequence {
- /// version Integer { v1(0) } (v1,...),
- /// subject Name,
- /// subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
- /// attributes [0] Attributes{{ CRIAttributes }}
- /// }
- ///
- /// Attributes { ATTRIBUTE:IOSet } ::= Set OF Attr{{ IOSet }}
- ///
- /// Attr { ATTRIBUTE:IOSet } ::= Sequence {
- /// type ATTRIBUTE.&id({IOSet}),
- /// values Set SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{\@type})
- /// }
- ///
- /// see
- public class Pkcs10CertificationRequest
- : CertificationRequest
- {
- protected static readonly IDictionary algorithms = Platform.CreateHashtable();
- protected static readonly IDictionary exParams = Platform.CreateHashtable();
- protected static readonly IDictionary keyAlgorithms = Platform.CreateHashtable();
- protected static readonly IDictionary oids = Platform.CreateHashtable();
- protected static readonly ISet noParams = new HashSet();
-
- static Pkcs10CertificationRequest()
- {
- algorithms.Add("MD2WITHRSAENCRYPTION", new DerObjectIdentifier("1.2.840.113549.1.1.2"));
- algorithms.Add("MD2WITHRSA", new DerObjectIdentifier("1.2.840.113549.1.1.2"));
- algorithms.Add("MD5WITHRSAENCRYPTION", new DerObjectIdentifier("1.2.840.113549.1.1.4"));
- algorithms.Add("MD5WITHRSA", new DerObjectIdentifier("1.2.840.113549.1.1.4"));
- algorithms.Add("RSAWITHMD5", new DerObjectIdentifier("1.2.840.113549.1.1.4"));
- algorithms.Add("SHA1WITHRSAENCRYPTION", new DerObjectIdentifier("1.2.840.113549.1.1.5"));
- algorithms.Add("SHA1WITHRSA", new DerObjectIdentifier("1.2.840.113549.1.1.5"));
- 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("RSAWITHSHA1", new DerObjectIdentifier("1.2.840.113549.1.1.5"));
- algorithms.Add("RIPEMD128WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
- algorithms.Add("RIPEMD128WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
- algorithms.Add("RIPEMD160WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
- algorithms.Add("RIPEMD160WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
- algorithms.Add("RIPEMD256WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
- algorithms.Add("RIPEMD256WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
- algorithms.Add("SHA1WITHDSA", new DerObjectIdentifier("1.2.840.10040.4.3"));
- algorithms.Add("DSAWITHSHA1", new DerObjectIdentifier("1.2.840.10040.4.3"));
- 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("SHA224WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha224);
- algorithms.Add("SHA256WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha256);
- algorithms.Add("SHA384WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha384);
- algorithms.Add("SHA512WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha512);
- algorithms.Add("ECDSAWITHSHA1", X9ObjectIdentifiers.ECDsaWithSha1);
- algorithms.Add("GOST3411WITHGOST3410", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
- algorithms.Add("GOST3410WITHGOST3411", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
- algorithms.Add("GOST3411WITHECGOST3410", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
- algorithms.Add("GOST3411WITHECGOST3410-2001", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
- algorithms.Add("GOST3411WITHGOST3410-2001", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
-
- //
- // reverse mappings
- //
- oids.Add(new DerObjectIdentifier("1.2.840.113549.1.1.5"), "SHA1WITHRSA");
- oids.Add(PkcsObjectIdentifiers.Sha224WithRsaEncryption, "SHA224WITHRSA");
- oids.Add(PkcsObjectIdentifiers.Sha256WithRsaEncryption, "SHA256WITHRSA");
- oids.Add(PkcsObjectIdentifiers.Sha384WithRsaEncryption, "SHA384WITHRSA");
- oids.Add(PkcsObjectIdentifiers.Sha512WithRsaEncryption, "SHA512WITHRSA");
- oids.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94, "GOST3411WITHGOST3410");
- oids.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001, "GOST3411WITHECGOST3410");
-
- oids.Add(new DerObjectIdentifier("1.2.840.113549.1.1.4"), "MD5WITHRSA");
- oids.Add(new DerObjectIdentifier("1.2.840.113549.1.1.2"), "MD2WITHRSA");
- oids.Add(new DerObjectIdentifier("1.2.840.10040.4.3"), "SHA1WITHDSA");
- oids.Add(X9ObjectIdentifiers.ECDsaWithSha1, "SHA1WITHECDSA");
- oids.Add(X9ObjectIdentifiers.ECDsaWithSha224, "SHA224WITHECDSA");
- oids.Add(X9ObjectIdentifiers.ECDsaWithSha256, "SHA256WITHECDSA");
- oids.Add(X9ObjectIdentifiers.ECDsaWithSha384, "SHA384WITHECDSA");
- oids.Add(X9ObjectIdentifiers.ECDsaWithSha512, "SHA512WITHECDSA");
- oids.Add(OiwObjectIdentifiers.Sha1WithRsa, "SHA1WITHRSA");
- oids.Add(OiwObjectIdentifiers.DsaWithSha1, "SHA1WITHDSA");
- oids.Add(NistObjectIdentifiers.DsaWithSha224, "SHA224WITHDSA");
- oids.Add(NistObjectIdentifiers.DsaWithSha256, "SHA256WITHDSA");
-
- //
- // key types
- //
- keyAlgorithms.Add(PkcsObjectIdentifiers.RsaEncryption, "RSA");
- keyAlgorithms.Add(X9ObjectIdentifiers.IdDsa, "DSA");
-
- //
- // 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);
-
- //
- // RFC 4491
- //
- noParams.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
- noParams.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
-
- //
- // explicit params
- //
- AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1, DerNull.Instance);
- exParams.Add("SHA1WITHRSAANDMGF1", CreatePssParams(sha1AlgId, 20));
-
- AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha224, DerNull.Instance);
- exParams.Add("SHA224WITHRSAANDMGF1", CreatePssParams(sha224AlgId, 28));
-
- AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha256, DerNull.Instance);
- exParams.Add("SHA256WITHRSAANDMGF1", CreatePssParams(sha256AlgId, 32));
-
- AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha384, DerNull.Instance);
- exParams.Add("SHA384WITHRSAANDMGF1", CreatePssParams(sha384AlgId, 48));
-
- AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha512, DerNull.Instance);
- exParams.Add("SHA512WITHRSAANDMGF1", CreatePssParams(sha512AlgId, 64));
- }
-
- private static RsassaPssParameters CreatePssParams(
- AlgorithmIdentifier hashAlgId,
- int saltSize)
- {
- return new RsassaPssParameters(
- hashAlgId,
- new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, hashAlgId),
- new DerInteger(saltSize),
- new DerInteger(1));
- }
-
- protected Pkcs10CertificationRequest()
- {
- }
-
- public Pkcs10CertificationRequest(
- byte[] encoded)
- : base((Asn1Sequence) Asn1Object.FromByteArray(encoded))
- {
- }
-
- public Pkcs10CertificationRequest(
- Asn1Sequence seq)
- : base(seq)
- {
- }
-
- public Pkcs10CertificationRequest(
- Stream input)
- : base((Asn1Sequence) Asn1Object.FromStream(input))
- {
- }
-
- ///
- /// Instantiate a Pkcs10CertificationRequest object with the necessary credentials.
- ///
- /// Name of Sig Alg.
- /// X509Name of subject eg OU="My unit." O="My Organisatioin" C="au"
- /// Public Key to be included in cert reqest.
- /// ASN1Set of Attributes.
- /// Matching Private key for nominated (above) public key to be used to sign the request.
- [Obsolete("Use constructor with an ISignatureFactory")]
- public Pkcs10CertificationRequest(
- string signatureAlgorithm,
- X509Name subject,
- AsymmetricKeyParameter publicKey,
- Asn1Set attributes,
- AsymmetricKeyParameter signingKey)
- {
- if (signatureAlgorithm == null)
- throw new ArgumentNullException("signatureAlgorithm");
- if (subject == null)
- throw new ArgumentNullException("subject");
- if (publicKey == null)
- throw new ArgumentNullException("publicKey");
- if (publicKey.IsPrivate)
- throw new ArgumentException("expected public key", "publicKey");
- if (!signingKey.IsPrivate)
- throw new ArgumentException("key for signing must be private", "signingKey");
-
- init(new Asn1SignatureFactory(signatureAlgorithm, signingKey), subject, publicKey, attributes, signingKey);
- }
-
- ///
- /// Instantiate a Pkcs10CertificationRequest object with the necessary credentials.
- ///
- /// The factory for signature calculators to sign the PKCS#10 request with.
- /// X509Name of subject eg OU="My unit." O="My Organisatioin" C="au"
- /// Public Key to be included in cert reqest.
- /// ASN1Set of Attributes.
- /// Matching Private key for nominated (above) public key to be used to sign the request.
- public Pkcs10CertificationRequest(
- ISignatureFactory signatureCalculatorFactory,
- X509Name subject,
- AsymmetricKeyParameter publicKey,
- Asn1Set attributes,
- AsymmetricKeyParameter signingKey)
- {
- if (signatureCalculatorFactory == null)
- throw new ArgumentNullException("signatureCalculator");
- if (subject == null)
- throw new ArgumentNullException("subject");
- if (publicKey == null)
- throw new ArgumentNullException("publicKey");
- if (publicKey.IsPrivate)
- throw new ArgumentException("expected public key", "publicKey");
- if (!signingKey.IsPrivate)
- throw new ArgumentException("key for signing must be private", "signingKey");
-
- init(signatureCalculatorFactory, subject, publicKey, attributes, signingKey);
- }
-
- private void init(
- ISignatureFactory signatureCalculator,
- X509Name subject,
- AsymmetricKeyParameter publicKey,
- Asn1Set attributes,
- AsymmetricKeyParameter signingKey)
- {
- this.sigAlgId = (AlgorithmIdentifier)signatureCalculator.AlgorithmDetails;
-
- SubjectPublicKeyInfo pubInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey);
-
- this.reqInfo = new CertificationRequestInfo(subject, pubInfo, attributes);
-
- IStreamCalculator streamCalculator = signatureCalculator.CreateCalculator();
-
- byte[] reqInfoData = reqInfo.GetDerEncoded();
-
- streamCalculator.Stream.Write(reqInfoData, 0, reqInfoData.Length);
-
- Platform.Dispose(streamCalculator.Stream);
-
- // Generate Signature.
- sigBits = new DerBitString(((IBlockResult)streamCalculator.GetResult()).Collect());
- }
-
- // internal Pkcs10CertificationRequest(
- // Asn1InputStream seqStream)
- // {
- // Asn1Sequence seq = (Asn1Sequence) seqStream.ReadObject();
- // try
- // {
- // this.reqInfo = CertificationRequestInfo.GetInstance(seq[0]);
- // this.sigAlgId = AlgorithmIdentifier.GetInstance(seq[1]);
- // this.sigBits = (DerBitString) seq[2];
- // }
- // catch (Exception ex)
- // {
- // throw new ArgumentException("Create From Asn1Sequence: " + ex.Message);
- // }
- // }
-
- ///
- /// Get the public key.
- ///
- /// The public key.
- public AsymmetricKeyParameter GetPublicKey()
- {
- return PublicKeyFactory.CreateKey(reqInfo.SubjectPublicKeyInfo);
- }
-
- ///
- /// Verify Pkcs10 Cert Request is valid.
- ///
- /// true = valid.
- public bool Verify()
- {
- return Verify(this.GetPublicKey());
- }
-
- public bool Verify(
- AsymmetricKeyParameter publicKey)
- {
- return Verify(new Asn1VerifierFactoryProvider(publicKey));
- }
-
- public bool Verify(
- IVerifierFactoryProvider verifierProvider)
- {
- return Verify(verifierProvider.CreateVerifierFactory(sigAlgId));
- }
-
- public bool Verify(
- IVerifierFactory verifier)
- {
- try
- {
- byte[] b = reqInfo.GetDerEncoded();
-
- IStreamCalculator streamCalculator = verifier.CreateCalculator();
-
- streamCalculator.Stream.Write(b, 0, b.Length);
-
- Platform.Dispose(streamCalculator.Stream);
-
- return ((IVerifier)streamCalculator.GetResult()).IsVerified(sigBits.GetOctets());
- }
- catch (Exception e)
- {
- throw new SignatureException("exception encoding TBS cert request", e);
- }
- }
-
- // ///
- // /// Get the Der Encoded Pkcs10 Certification Request.
- // ///
- // /// A byte array.
- // public byte[] GetEncoded()
- // {
- // return new CertificationRequest(reqInfo, sigAlgId, sigBits).GetDerEncoded();
- // }
-
- // TODO Figure out how to set parameters on an ISigner
- private void SetSignatureParameters(
- ISigner signature,
- Asn1Encodable asn1Params)
- {
- if (asn1Params != null && !(asn1Params is Asn1Null))
- {
-// AlgorithmParameters sigParams = AlgorithmParameters.GetInstance(signature.getAlgorithm());
-//
-// try
-// {
-// sigParams.init(asn1Params.ToAsn1Object().GetDerEncoded());
-// }
-// catch (IOException e)
-// {
-// throw new SignatureException("IOException decoding parameters: " + e.Message);
-// }
-
- if (Platform.EndsWith(signature.AlgorithmName, "MGF1"))
- {
- throw Platform.CreateNotImplementedException("signature algorithm with MGF1");
-
-// try
-// {
-// signature.setParameter(sigParams.getParameterSpec(PSSParameterSpec.class));
-// }
-// catch (GeneralSecurityException e)
-// {
-// throw new SignatureException("Exception extracting parameters: " + e.getMessage());
-// }
- }
- }
- }
-
- internal static string GetSignatureName(
- AlgorithmIdentifier sigAlgId)
- {
- Asn1Encodable asn1Params = sigAlgId.Parameters;
-
- if (asn1Params != null && !(asn1Params is Asn1Null))
- {
- if (sigAlgId.Algorithm.Equals(PkcsObjectIdentifiers.IdRsassaPss))
- {
- RsassaPssParameters rsaParams = RsassaPssParameters.GetInstance(asn1Params);
- return GetDigestAlgName(rsaParams.HashAlgorithm.Algorithm) + "withRSAandMGF1";
- }
- }
-
- return sigAlgId.Algorithm.Id;
- }
-
- private static string GetDigestAlgName(
- DerObjectIdentifier digestAlgOID)
- {
- if (PkcsObjectIdentifiers.MD5.Equals(digestAlgOID))
- {
- return "MD5";
- }
- else if (OiwObjectIdentifiers.IdSha1.Equals(digestAlgOID))
- {
- return "SHA1";
- }
- else if (NistObjectIdentifiers.IdSha224.Equals(digestAlgOID))
- {
- return "SHA224";
- }
- else if (NistObjectIdentifiers.IdSha256.Equals(digestAlgOID))
- {
- return "SHA256";
- }
- else if (NistObjectIdentifiers.IdSha384.Equals(digestAlgOID))
- {
- return "SHA384";
- }
- else if (NistObjectIdentifiers.IdSha512.Equals(digestAlgOID))
- {
- return "SHA512";
- }
- else if (TeleTrusTObjectIdentifiers.RipeMD128.Equals(digestAlgOID))
- {
- return "RIPEMD128";
- }
- else if (TeleTrusTObjectIdentifiers.RipeMD160.Equals(digestAlgOID))
- {
- return "RIPEMD160";
- }
- else if (TeleTrusTObjectIdentifiers.RipeMD256.Equals(digestAlgOID))
- {
- return "RIPEMD256";
- }
- else if (CryptoProObjectIdentifiers.GostR3411.Equals(digestAlgOID))
- {
- return "GOST3411";
- }
- else
- {
- return digestAlgOID.Id;
- }
- }
- }
-}
diff --git a/BCCrypto/src/pkcs/Pkcs10CertificationRequestDelaySigned.cs b/BCCrypto/src/pkcs/Pkcs10CertificationRequestDelaySigned.cs
deleted file mode 100644
index ecbb4ab..0000000
--- a/BCCrypto/src/pkcs/Pkcs10CertificationRequestDelaySigned.cs
+++ /dev/null
@@ -1,150 +0,0 @@
-using System;
-using System.Collections;
-using System.Globalization;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Pkcs
-{
- ///
- /// A class for creating and verifying Pkcs10 Certification requests (this is an extension on ).
- /// The requests are made using delay signing. This is useful for situations where
- /// the private key is in another environment and not directly accessible (e.g. HSM)
- /// So the first step creates the request, then the signing is done outside this
- /// object and the signature is then used to complete the request.
- ///
- ///
- /// CertificationRequest ::= Sequence {
- /// certificationRequestInfo CertificationRequestInfo,
- /// signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
- /// signature BIT STRING
- /// }
- ///
- /// CertificationRequestInfo ::= Sequence {
- /// version Integer { v1(0) } (v1,...),
- /// subject Name,
- /// subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
- /// attributes [0] Attributes{{ CRIAttributes }}
- /// }
- ///
- /// Attributes { ATTRIBUTE:IOSet } ::= Set OF Attr{{ IOSet }}
- ///
- /// Attr { ATTRIBUTE:IOSet } ::= Sequence {
- /// type ATTRIBUTE.&id({IOSet}),
- /// values Set SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{\@type})
- /// }
- ///
- /// see
- public class Pkcs10CertificationRequestDelaySigned : Pkcs10CertificationRequest
- {
- protected Pkcs10CertificationRequestDelaySigned()
- : base()
- {
- }
- public Pkcs10CertificationRequestDelaySigned(
- byte[] encoded)
- : base(encoded)
- {
- }
- public Pkcs10CertificationRequestDelaySigned(
- Asn1Sequence seq)
- : base(seq)
- {
- }
- public Pkcs10CertificationRequestDelaySigned(
- Stream input)
- : base(input)
- {
- }
- public Pkcs10CertificationRequestDelaySigned(
- string signatureAlgorithm,
- X509Name subject,
- AsymmetricKeyParameter publicKey,
- Asn1Set attributes,
- AsymmetricKeyParameter signingKey)
- : base(signatureAlgorithm, subject, publicKey, attributes, signingKey)
- {
- }
- ///
- /// Instantiate a Pkcs10CertificationRequest object with the necessary credentials.
- ///
- /// Name of Sig Alg.
- /// X509Name of subject eg OU="My unit." O="My Organisatioin" C="au"
- /// Public Key to be included in cert reqest.
- /// ASN1Set of Attributes.
- ///
- /// After the object is constructed use the and finally the
- /// SignRequest methods to finalize the request.
- ///
- public Pkcs10CertificationRequestDelaySigned(
- string signatureAlgorithm,
- X509Name subject,
- AsymmetricKeyParameter publicKey,
- Asn1Set attributes)
- {
- if (signatureAlgorithm == null)
- throw new ArgumentNullException("signatureAlgorithm");
- if (subject == null)
- throw new ArgumentNullException("subject");
- if (publicKey == null)
- throw new ArgumentNullException("publicKey");
- if (publicKey.IsPrivate)
- throw new ArgumentException("expected public key", "publicKey");
-// DerObjectIdentifier sigOid = SignerUtilities.GetObjectIdentifier(signatureAlgorithm);
- string algorithmName = Platform.ToUpperInvariant(signatureAlgorithm);
- DerObjectIdentifier sigOid = (DerObjectIdentifier) algorithms[algorithmName];
- if (sigOid == null)
- {
- try
- {
- sigOid = new DerObjectIdentifier(algorithmName);
- }
- catch (Exception e)
- {
- throw new ArgumentException("Unknown signature type requested", e);
- }
- }
- if (noParams.Contains(sigOid))
- {
- this.sigAlgId = new AlgorithmIdentifier(sigOid);
- }
- else if (exParams.Contains(algorithmName))
- {
- this.sigAlgId = new AlgorithmIdentifier(sigOid, (Asn1Encodable) exParams[algorithmName]);
- }
- else
- {
- this.sigAlgId = new AlgorithmIdentifier(sigOid, DerNull.Instance);
- }
- SubjectPublicKeyInfo pubInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey);
- this.reqInfo = new CertificationRequestInfo(subject, pubInfo, attributes);
- }
- public byte[] GetDataToSign()
- {
- return reqInfo.GetDerEncoded();
- }
- public void SignRequest(byte[] signedData)
- {
- //build the signature from the signed data
- sigBits = new DerBitString(signedData);
- }
- public void SignRequest(DerBitString signedData)
- {
- //build the signature from the signed data
- sigBits = signedData;
- }
- }
-}
diff --git a/BCCrypto/src/pkcs/Pkcs12Entry.cs b/BCCrypto/src/pkcs/Pkcs12Entry.cs
deleted file mode 100644
index 5dcc94e..0000000
--- a/BCCrypto/src/pkcs/Pkcs12Entry.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Pkcs
-{
- public abstract class Pkcs12Entry
- {
- private readonly IDictionary attributes;
-
- protected internal Pkcs12Entry(
- IDictionary attributes)
- {
- this.attributes = attributes;
-
- foreach (DictionaryEntry entry in attributes)
- {
- if (!(entry.Key is string))
- throw new ArgumentException("Attribute keys must be of type: " + typeof(string).FullName, "attributes");
- if (!(entry.Value is Asn1Encodable))
- throw new ArgumentException("Attribute values must be of type: " + typeof(Asn1Encodable).FullName, "attributes");
- }
- }
-
- [Obsolete("Use 'object[index]' syntax instead")]
- public Asn1Encodable GetBagAttribute(
- DerObjectIdentifier oid)
- {
- return (Asn1Encodable)this.attributes[oid.Id];
- }
-
- [Obsolete("Use 'object[index]' syntax instead")]
- public Asn1Encodable GetBagAttribute(
- string oid)
- {
- return (Asn1Encodable)this.attributes[oid];
- }
-
- [Obsolete("Use 'BagAttributeKeys' property")]
- public IEnumerator GetBagAttributeKeys()
- {
- return this.attributes.Keys.GetEnumerator();
- }
-
- public Asn1Encodable this[
- DerObjectIdentifier oid]
- {
- get { return (Asn1Encodable) this.attributes[oid.Id]; }
- }
-
- public Asn1Encodable this[
- string oid]
- {
- get { return (Asn1Encodable) this.attributes[oid]; }
- }
-
- public IEnumerable BagAttributeKeys
- {
- get { return new EnumerableProxy(this.attributes.Keys); }
- }
- }
-}
diff --git a/BCCrypto/src/pkcs/Pkcs12Store.cs b/BCCrypto/src/pkcs/Pkcs12Store.cs
deleted file mode 100644
index e657887..0000000
--- a/BCCrypto/src/pkcs/Pkcs12Store.cs
+++ /dev/null
@@ -1,1100 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.Utilities;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Encoders;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Pkcs
-{
- public class Pkcs12Store
- {
- private readonly IgnoresCaseHashtable keys = new IgnoresCaseHashtable();
- private readonly IDictionary localIds = Platform.CreateHashtable();
- private readonly IgnoresCaseHashtable certs = new IgnoresCaseHashtable();
- private readonly IDictionary chainCerts = Platform.CreateHashtable();
- private readonly IDictionary keyCerts = Platform.CreateHashtable();
- private readonly DerObjectIdentifier keyAlgorithm;
- private readonly DerObjectIdentifier certAlgorithm;
- private readonly bool useDerEncoding;
-
- private AsymmetricKeyEntry unmarkedKeyEntry = null;
-
- private const int MinIterations = 1024;
- private const int SaltSize = 20;
-
- private static SubjectKeyIdentifier CreateSubjectKeyID(
- AsymmetricKeyParameter pubKey)
- {
- return new SubjectKeyIdentifier(
- SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pubKey));
- }
-
- internal class CertId
- {
- private readonly byte[] id;
-
- internal CertId(
- AsymmetricKeyParameter pubKey)
- {
- this.id = CreateSubjectKeyID(pubKey).GetKeyIdentifier();
- }
-
- internal CertId(
- byte[] id)
- {
- this.id = id;
- }
-
- internal byte[] Id
- {
- get { return id; }
- }
-
- public override int GetHashCode()
- {
- return Arrays.GetHashCode(id);
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- CertId other = obj as CertId;
-
- if (other == null)
- return false;
-
- return Arrays.AreEqual(id, other.id);
- }
- }
-
- internal Pkcs12Store(
- DerObjectIdentifier keyAlgorithm,
- DerObjectIdentifier certAlgorithm,
- bool useDerEncoding)
- {
- this.keyAlgorithm = keyAlgorithm;
- this.certAlgorithm = certAlgorithm;
- this.useDerEncoding = useDerEncoding;
- }
-
- // TODO Consider making obsolete
-// [Obsolete("Use 'Pkcs12StoreBuilder' instead")]
- public Pkcs12Store()
- : this(PkcsObjectIdentifiers.PbeWithShaAnd3KeyTripleDesCbc,
- PkcsObjectIdentifiers.PbewithShaAnd40BitRC2Cbc, false)
- {
- }
-
- // TODO Consider making obsolete
-// [Obsolete("Use 'Pkcs12StoreBuilder' and 'Load' method instead")]
- public Pkcs12Store(
- Stream input,
- char[] password)
- : this()
- {
- Load(input, password);
- }
-
- protected virtual void LoadKeyBag(PrivateKeyInfo privKeyInfo, Asn1Set bagAttributes)
- {
- AsymmetricKeyParameter privKey = PrivateKeyFactory.CreateKey(privKeyInfo);
-
- IDictionary attributes = Platform.CreateHashtable();
- AsymmetricKeyEntry keyEntry = new AsymmetricKeyEntry(privKey, attributes);
-
- string alias = null;
- Asn1OctetString localId = null;
-
- if (bagAttributes != null)
- {
- foreach (Asn1Sequence sq in bagAttributes)
- {
- DerObjectIdentifier aOid = DerObjectIdentifier.GetInstance(sq[0]);
- Asn1Set attrSet = Asn1Set.GetInstance(sq[1]);
- Asn1Encodable attr = null;
-
- if (attrSet.Count > 0)
- {
- // TODO We should be adding all attributes in the set
- attr = attrSet[0];
-
- // TODO We might want to "merge" attribute sets with
- // the same OID - currently, differing values give an error
- if (attributes.Contains(aOid.Id))
- {
- // OK, but the value has to be the same
- if (!attributes[aOid.Id].Equals(attr))
- throw new IOException("attempt to add existing attribute with different value");
- }
- else
- {
- attributes.Add(aOid.Id, attr);
- }
-
- if (aOid.Equals(PkcsObjectIdentifiers.Pkcs9AtFriendlyName))
- {
- alias = ((DerBmpString)attr).GetString();
- // TODO Do these in a separate loop, just collect aliases here
- keys[alias] = keyEntry;
- }
- else if (aOid.Equals(PkcsObjectIdentifiers.Pkcs9AtLocalKeyID))
- {
- localId = (Asn1OctetString)attr;
- }
- }
- }
- }
-
- if (localId != null)
- {
- string name = Hex.ToHexString(localId.GetOctets());
-
- if (alias == null)
- {
- keys[name] = keyEntry;
- }
- else
- {
- // TODO There may have been more than one alias
- localIds[alias] = name;
- }
- }
- else
- {
- unmarkedKeyEntry = keyEntry;
- }
- }
-
- protected virtual void LoadPkcs8ShroudedKeyBag(EncryptedPrivateKeyInfo encPrivKeyInfo, Asn1Set bagAttributes,
- char[] password, bool wrongPkcs12Zero)
- {
- if (password != null)
- {
- PrivateKeyInfo privInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(
- password, wrongPkcs12Zero, encPrivKeyInfo);
-
- LoadKeyBag(privInfo, bagAttributes);
- }
- }
-
- public void Load(
- Stream input,
- char[] password)
- {
- if (input == null)
- throw new ArgumentNullException("input");
-
- Asn1Sequence obj = (Asn1Sequence) Asn1Object.FromStream(input);
- Pfx bag = new Pfx(obj);
- ContentInfo info = bag.AuthSafe;
- bool wrongPkcs12Zero = false;
-
- if (password != null && bag.MacData != null) // check the mac code
- {
- MacData mData = bag.MacData;
- DigestInfo dInfo = mData.Mac;
- AlgorithmIdentifier algId = dInfo.AlgorithmID;
- byte[] salt = mData.GetSalt();
- int itCount = mData.IterationCount.IntValue;
-
- byte[] data = ((Asn1OctetString) info.Content).GetOctets();
-
- byte[] mac = CalculatePbeMac(algId.Algorithm, salt, itCount, password, false, data);
- byte[] dig = dInfo.GetDigest();
-
- if (!Arrays.ConstantTimeAreEqual(mac, dig))
- {
- if (password.Length > 0)
- throw new IOException("PKCS12 key store MAC invalid - wrong password or corrupted file.");
-
- // Try with incorrect zero length password
- mac = CalculatePbeMac(algId.Algorithm, salt, itCount, password, true, data);
-
- if (!Arrays.ConstantTimeAreEqual(mac, dig))
- throw new IOException("PKCS12 key store MAC invalid - wrong password or corrupted file.");
-
- wrongPkcs12Zero = true;
- }
- }
-
- keys.Clear();
- localIds.Clear();
- unmarkedKeyEntry = null;
-
- IList certBags = Platform.CreateArrayList();
-
- if (info.ContentType.Equals(PkcsObjectIdentifiers.Data))
- {
- byte[] octs = ((Asn1OctetString)info.Content).GetOctets();
- AuthenticatedSafe authSafe = new AuthenticatedSafe(
- (Asn1Sequence) Asn1OctetString.FromByteArray(octs));
- ContentInfo[] cis = authSafe.GetContentInfo();
-
- foreach (ContentInfo ci in cis)
- {
- DerObjectIdentifier oid = ci.ContentType;
-
- byte[] octets = null;
- if (oid.Equals(PkcsObjectIdentifiers.Data))
- {
- octets = ((Asn1OctetString)ci.Content).GetOctets();
- }
- else if (oid.Equals(PkcsObjectIdentifiers.EncryptedData))
- {
- if (password != null)
- {
- EncryptedData d = EncryptedData.GetInstance(ci.Content);
- octets = CryptPbeData(false, d.EncryptionAlgorithm,
- password, wrongPkcs12Zero, d.Content.GetOctets());
- }
- }
- else
- {
- // TODO Other data types
- }
-
- if (octets != null)
- {
- Asn1Sequence seq = (Asn1Sequence)Asn1Object.FromByteArray(octets);
-
- foreach (Asn1Sequence subSeq in seq)
- {
- SafeBag b = new SafeBag(subSeq);
-
- if (b.BagID.Equals(PkcsObjectIdentifiers.CertBag))
- {
- certBags.Add(b);
- }
- else if (b.BagID.Equals(PkcsObjectIdentifiers.Pkcs8ShroudedKeyBag))
- {
- LoadPkcs8ShroudedKeyBag(EncryptedPrivateKeyInfo.GetInstance(b.BagValue),
- b.BagAttributes, password, wrongPkcs12Zero);
- }
- else if (b.BagID.Equals(PkcsObjectIdentifiers.KeyBag))
- {
- LoadKeyBag(PrivateKeyInfo.GetInstance(b.BagValue), b.BagAttributes);
- }
- else
- {
- // TODO Other bag types
- }
- }
- }
- }
- }
-
- certs.Clear();
- chainCerts.Clear();
- keyCerts.Clear();
-
- foreach (SafeBag b in certBags)
- {
- CertBag certBag = new CertBag((Asn1Sequence)b.BagValue);
- byte[] octets = ((Asn1OctetString)certBag.CertValue).GetOctets();
- X509Certificate cert = new X509CertificateParser().ReadCertificate(octets);
-
- //
- // set the attributes
- //
- IDictionary attributes = Platform.CreateHashtable();
- Asn1OctetString localId = null;
- string alias = null;
-
- if (b.BagAttributes != null)
- {
- foreach (Asn1Sequence sq in b.BagAttributes)
- {
- DerObjectIdentifier aOid = DerObjectIdentifier.GetInstance(sq[0]);
- Asn1Set attrSet = Asn1Set.GetInstance(sq[1]);
-
- if (attrSet.Count > 0)
- {
- // TODO We should be adding all attributes in the set
- Asn1Encodable attr = attrSet[0];
-
- // TODO We might want to "merge" attribute sets with
- // the same OID - currently, differing values give an error
- if (attributes.Contains(aOid.Id))
- {
- // OK, but the value has to be the same
- if (!attributes[aOid.Id].Equals(attr))
- {
- throw new IOException("attempt to add existing attribute with different value");
- }
- }
- else
- {
- attributes.Add(aOid.Id, attr);
- }
-
- if (aOid.Equals(PkcsObjectIdentifiers.Pkcs9AtFriendlyName))
- {
- alias = ((DerBmpString)attr).GetString();
- }
- else if (aOid.Equals(PkcsObjectIdentifiers.Pkcs9AtLocalKeyID))
- {
- localId = (Asn1OctetString)attr;
- }
- }
- }
- }
-
- CertId certId = new CertId(cert.GetPublicKey());
- X509CertificateEntry certEntry = new X509CertificateEntry(cert, attributes);
-
- chainCerts[certId] = certEntry;
-
- if (unmarkedKeyEntry != null)
- {
- if (keyCerts.Count == 0)
- {
- string name = Hex.ToHexString(certId.Id);
-
- keyCerts[name] = certEntry;
- keys[name] = unmarkedKeyEntry;
- }
- }
- else
- {
- if (localId != null)
- {
- string name = Hex.ToHexString(localId.GetOctets());
-
- keyCerts[name] = certEntry;
- }
-
- if (alias != null)
- {
- // TODO There may have been more than one alias
- certs[alias] = certEntry;
- }
- }
- }
- }
-
- public AsymmetricKeyEntry GetKey(
- string alias)
- {
- if (alias == null)
- throw new ArgumentNullException("alias");
-
- return (AsymmetricKeyEntry)keys[alias];
- }
-
- public bool IsCertificateEntry(
- string alias)
- {
- if (alias == null)
- throw new ArgumentNullException("alias");
-
- return (certs[alias] != null && keys[alias] == null);
- }
-
- public bool IsKeyEntry(
- string alias)
- {
- if (alias == null)
- throw new ArgumentNullException("alias");
-
- return (keys[alias] != null);
- }
-
- private IDictionary GetAliasesTable()
- {
- IDictionary tab = Platform.CreateHashtable();
-
- foreach (string key in certs.Keys)
- {
- tab[key] = "cert";
- }
-
- foreach (string a in keys.Keys)
- {
- if (tab[a] == null)
- {
- tab[a] = "key";
- }
- }
-
- return tab;
- }
-
- public IEnumerable Aliases
- {
- get { return new EnumerableProxy(GetAliasesTable().Keys); }
- }
-
- public bool ContainsAlias(
- string alias)
- {
- return certs[alias] != null || keys[alias] != null;
- }
-
- /**
- * simply return the cert entry for the private key
- */
- public X509CertificateEntry GetCertificate(
- string alias)
- {
- if (alias == null)
- throw new ArgumentNullException("alias");
-
- X509CertificateEntry c = (X509CertificateEntry) certs[alias];
-
- //
- // look up the key table - and try the local key id
- //
- if (c == null)
- {
- string id = (string)localIds[alias];
- if (id != null)
- {
- c = (X509CertificateEntry)keyCerts[id];
- }
- else
- {
- c = (X509CertificateEntry)keyCerts[alias];
- }
- }
-
- return c;
- }
-
- public string GetCertificateAlias(
- X509Certificate cert)
- {
- if (cert == null)
- throw new ArgumentNullException("cert");
-
- foreach (DictionaryEntry entry in certs)
- {
- X509CertificateEntry entryValue = (X509CertificateEntry) entry.Value;
- if (entryValue.Certificate.Equals(cert))
- {
- return (string) entry.Key;
- }
- }
-
- foreach (DictionaryEntry entry in keyCerts)
- {
- X509CertificateEntry entryValue = (X509CertificateEntry) entry.Value;
- if (entryValue.Certificate.Equals(cert))
- {
- return (string) entry.Key;
- }
- }
-
- return null;
- }
-
- public X509CertificateEntry[] GetCertificateChain(
- string alias)
- {
- if (alias == null)
- throw new ArgumentNullException("alias");
-
- if (!IsKeyEntry(alias))
- {
- return null;
- }
-
- X509CertificateEntry c = GetCertificate(alias);
-
- if (c != null)
- {
- IList cs = Platform.CreateArrayList();
-
- while (c != null)
- {
- X509Certificate x509c = c.Certificate;
- X509CertificateEntry nextC = null;
-
- Asn1OctetString ext = x509c.GetExtensionValue(X509Extensions.AuthorityKeyIdentifier);
- if (ext != null)
- {
- AuthorityKeyIdentifier id = AuthorityKeyIdentifier.GetInstance(
- Asn1Object.FromByteArray(ext.GetOctets()));
-
- if (id.GetKeyIdentifier() != null)
- {
- nextC = (X509CertificateEntry) chainCerts[new CertId(id.GetKeyIdentifier())];
- }
- }
-
- if (nextC == null)
- {
- //
- // no authority key id, try the Issuer DN
- //
- X509Name i = x509c.IssuerDN;
- X509Name s = x509c.SubjectDN;
-
- if (!i.Equivalent(s))
- {
- foreach (CertId certId in chainCerts.Keys)
- {
- X509CertificateEntry x509CertEntry = (X509CertificateEntry) chainCerts[certId];
-
- X509Certificate crt = x509CertEntry.Certificate;
-
- X509Name sub = crt.SubjectDN;
- if (sub.Equivalent(i))
- {
- try
- {
- x509c.Verify(crt.GetPublicKey());
-
- nextC = x509CertEntry;
- break;
- }
- catch (InvalidKeyException)
- {
- // TODO What if it doesn't verify?
- }
- }
- }
- }
- }
-
- cs.Add(c);
- if (nextC != c) // self signed - end of the chain
- {
- c = nextC;
- }
- else
- {
- c = null;
- }
- }
-
- X509CertificateEntry[] result = new X509CertificateEntry[cs.Count];
- for (int i = 0; i < cs.Count; ++i)
- {
- result[i] = (X509CertificateEntry)cs[i];
- }
- return result;
- }
-
- return null;
- }
-
- public void SetCertificateEntry(
- string alias,
- X509CertificateEntry certEntry)
- {
- if (alias == null)
- throw new ArgumentNullException("alias");
- if (certEntry == null)
- throw new ArgumentNullException("certEntry");
- if (keys[alias] != null)
- throw new ArgumentException("There is a key entry with the name " + alias + ".");
-
- certs[alias] = certEntry;
- chainCerts[new CertId(certEntry.Certificate.GetPublicKey())] = certEntry;
- }
-
- public void SetKeyEntry(
- string alias,
- AsymmetricKeyEntry keyEntry,
- X509CertificateEntry[] chain)
- {
- if (alias == null)
- throw new ArgumentNullException("alias");
- if (keyEntry == null)
- throw new ArgumentNullException("keyEntry");
- if (keyEntry.Key.IsPrivate && (chain == null))
- throw new ArgumentException("No certificate chain for private key");
-
- if (keys[alias] != null)
- {
- DeleteEntry(alias);
- }
-
- keys[alias] = keyEntry;
- certs[alias] = chain[0];
-
- for (int i = 0; i != chain.Length; i++)
- {
- chainCerts[new CertId(chain[i].Certificate.GetPublicKey())] = chain[i];
- }
- }
-
- public void DeleteEntry(
- string alias)
- {
- if (alias == null)
- throw new ArgumentNullException("alias");
-
- AsymmetricKeyEntry k = (AsymmetricKeyEntry)keys[alias];
- if (k != null)
- {
- keys.Remove(alias);
- }
-
- X509CertificateEntry c = (X509CertificateEntry)certs[alias];
-
- if (c != null)
- {
- certs.Remove(alias);
- chainCerts.Remove(new CertId(c.Certificate.GetPublicKey()));
- }
-
- if (k != null)
- {
- string id = (string)localIds[alias];
- if (id != null)
- {
- localIds.Remove(alias);
- c = (X509CertificateEntry)keyCerts[id];
- }
- if (c != null)
- {
- keyCerts.Remove(id);
- chainCerts.Remove(new CertId(c.Certificate.GetPublicKey()));
- }
- }
-
- if (c == null && k == null)
- {
- throw new ArgumentException("no such entry as " + alias);
- }
- }
-
- public bool IsEntryOfType(
- string alias,
- Type entryType)
- {
- if (entryType == typeof(X509CertificateEntry))
- return IsCertificateEntry(alias);
-
- if (entryType == typeof(AsymmetricKeyEntry))
- return IsKeyEntry(alias) && GetCertificate(alias) != null;
-
- return false;
- }
-
- [Obsolete("Use 'Count' property instead")]
- public int Size()
- {
- return Count;
- }
-
- public int Count
- {
- // TODO Seems a little inefficient
- get { return GetAliasesTable().Count; }
- }
-
- public void Save(
- Stream stream,
- char[] password,
- SecureRandom random)
- {
- if (stream == null)
- throw new ArgumentNullException("stream");
- if (random == null)
- throw new ArgumentNullException("random");
-
- //
- // handle the keys
- //
- Asn1EncodableVector keyBags = new Asn1EncodableVector();
- foreach (string name in keys.Keys)
- {
- byte[] kSalt = new byte[SaltSize];
- random.NextBytes(kSalt);
-
- AsymmetricKeyEntry privKey = (AsymmetricKeyEntry)keys[name];
-
- DerObjectIdentifier bagOid;
- Asn1Encodable bagData;
-
- if (password == null)
- {
- bagOid = PkcsObjectIdentifiers.KeyBag;
- bagData = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privKey.Key);
- }
- else
- {
- bagOid = PkcsObjectIdentifiers.Pkcs8ShroudedKeyBag;
- bagData = EncryptedPrivateKeyInfoFactory.CreateEncryptedPrivateKeyInfo(
- keyAlgorithm, password, kSalt, MinIterations, privKey.Key);
- }
-
- Asn1EncodableVector kName = new Asn1EncodableVector();
-
- foreach (string oid in privKey.BagAttributeKeys)
- {
- Asn1Encodable entry = privKey[oid];
-
- // NB: Ignore any existing FriendlyName
- if (oid.Equals(PkcsObjectIdentifiers.Pkcs9AtFriendlyName.Id))
- continue;
-
- kName.Add(
- new DerSequence(
- new DerObjectIdentifier(oid),
- new DerSet(entry)));
- }
-
- //
- // make sure we are using the local alias on store
- //
- // NB: We always set the FriendlyName based on 'name'
- //if (privKey[PkcsObjectIdentifiers.Pkcs9AtFriendlyName] == null)
- {
- kName.Add(
- new DerSequence(
- PkcsObjectIdentifiers.Pkcs9AtFriendlyName,
- new DerSet(new DerBmpString(name))));
- }
-
- //
- // make sure we have a local key-id
- //
- if (privKey[PkcsObjectIdentifiers.Pkcs9AtLocalKeyID] == null)
- {
- X509CertificateEntry ct = GetCertificate(name);
- AsymmetricKeyParameter pubKey = ct.Certificate.GetPublicKey();
- SubjectKeyIdentifier subjectKeyID = CreateSubjectKeyID(pubKey);
-
- kName.Add(
- new DerSequence(
- PkcsObjectIdentifiers.Pkcs9AtLocalKeyID,
- new DerSet(subjectKeyID)));
- }
-
- keyBags.Add(new SafeBag(bagOid, bagData.ToAsn1Object(), new DerSet(kName)));
- }
-
- byte[] keyBagsEncoding = new DerSequence(keyBags).GetDerEncoded();
- ContentInfo keysInfo = new ContentInfo(PkcsObjectIdentifiers.Data, new BerOctetString(keyBagsEncoding));
-
- //
- // certificate processing
- //
- byte[] cSalt = new byte[SaltSize];
-
- random.NextBytes(cSalt);
-
- Asn1EncodableVector certBags = new Asn1EncodableVector();
- Pkcs12PbeParams cParams = new Pkcs12PbeParams(cSalt, MinIterations);
- AlgorithmIdentifier cAlgId = new AlgorithmIdentifier(certAlgorithm, cParams.ToAsn1Object());
- ISet doneCerts = new HashSet();
-
- foreach (string name in keys.Keys)
- {
- X509CertificateEntry certEntry = GetCertificate(name);
- CertBag cBag = new CertBag(
- PkcsObjectIdentifiers.X509Certificate,
- new DerOctetString(certEntry.Certificate.GetEncoded()));
-
- Asn1EncodableVector fName = new Asn1EncodableVector();
-
- foreach (string oid in certEntry.BagAttributeKeys)
- {
- Asn1Encodable entry = certEntry[oid];
-
- // NB: Ignore any existing FriendlyName
- if (oid.Equals(PkcsObjectIdentifiers.Pkcs9AtFriendlyName.Id))
- continue;
-
- fName.Add(
- new DerSequence(
- new DerObjectIdentifier(oid),
- new DerSet(entry)));
- }
-
- //
- // make sure we are using the local alias on store
- //
- // NB: We always set the FriendlyName based on 'name'
- //if (certEntry[PkcsObjectIdentifiers.Pkcs9AtFriendlyName] == null)
- {
- fName.Add(
- new DerSequence(
- PkcsObjectIdentifiers.Pkcs9AtFriendlyName,
- new DerSet(new DerBmpString(name))));
- }
-
- //
- // make sure we have a local key-id
- //
- if (certEntry[PkcsObjectIdentifiers.Pkcs9AtLocalKeyID] == null)
- {
- AsymmetricKeyParameter pubKey = certEntry.Certificate.GetPublicKey();
- SubjectKeyIdentifier subjectKeyID = CreateSubjectKeyID(pubKey);
-
- fName.Add(
- new DerSequence(
- PkcsObjectIdentifiers.Pkcs9AtLocalKeyID,
- new DerSet(subjectKeyID)));
- }
-
- certBags.Add(new SafeBag(PkcsObjectIdentifiers.CertBag, cBag.ToAsn1Object(), new DerSet(fName)));
-
- doneCerts.Add(certEntry.Certificate);
- }
-
- foreach (string certId in certs.Keys)
- {
- X509CertificateEntry cert = (X509CertificateEntry)certs[certId];
-
- if (keys[certId] != null)
- continue;
-
- CertBag cBag = new CertBag(
- PkcsObjectIdentifiers.X509Certificate,
- new DerOctetString(cert.Certificate.GetEncoded()));
-
- Asn1EncodableVector fName = new Asn1EncodableVector();
-
- foreach (string oid in cert.BagAttributeKeys)
- {
- // a certificate not immediately linked to a key doesn't require
- // a localKeyID and will confuse some PKCS12 implementations.
- //
- // If we find one, we'll prune it out.
- if (oid.Equals(PkcsObjectIdentifiers.Pkcs9AtLocalKeyID.Id))
- continue;
-
- Asn1Encodable entry = cert[oid];
-
- // NB: Ignore any existing FriendlyName
- if (oid.Equals(PkcsObjectIdentifiers.Pkcs9AtFriendlyName.Id))
- continue;
-
- fName.Add(
- new DerSequence(
- new DerObjectIdentifier(oid),
- new DerSet(entry)));
- }
-
- //
- // make sure we are using the local alias on store
- //
- // NB: We always set the FriendlyName based on 'certId'
- //if (cert[PkcsObjectIdentifiers.Pkcs9AtFriendlyName] == null)
- {
- fName.Add(
- new DerSequence(
- PkcsObjectIdentifiers.Pkcs9AtFriendlyName,
- new DerSet(new DerBmpString(certId))));
- }
-
- certBags.Add(new SafeBag(PkcsObjectIdentifiers.CertBag, cBag.ToAsn1Object(), new DerSet(fName)));
-
- doneCerts.Add(cert.Certificate);
- }
-
- foreach (CertId certId in chainCerts.Keys)
- {
- X509CertificateEntry cert = (X509CertificateEntry)chainCerts[certId];
-
- if (doneCerts.Contains(cert.Certificate))
- continue;
-
- CertBag cBag = new CertBag(
- PkcsObjectIdentifiers.X509Certificate,
- new DerOctetString(cert.Certificate.GetEncoded()));
-
- Asn1EncodableVector fName = new Asn1EncodableVector();
-
- foreach (string oid in cert.BagAttributeKeys)
- {
- // a certificate not immediately linked to a key doesn't require
- // a localKeyID and will confuse some PKCS12 implementations.
- //
- // If we find one, we'll prune it out.
- if (oid.Equals(PkcsObjectIdentifiers.Pkcs9AtLocalKeyID.Id))
- continue;
-
- fName.Add(
- new DerSequence(
- new DerObjectIdentifier(oid),
- new DerSet(cert[oid])));
- }
-
- certBags.Add(new SafeBag(PkcsObjectIdentifiers.CertBag, cBag.ToAsn1Object(), new DerSet(fName)));
- }
-
- byte[] certBagsEncoding = new DerSequence(certBags).GetDerEncoded();
-
- ContentInfo certsInfo;
- if (password == null)
- {
- certsInfo = new ContentInfo(PkcsObjectIdentifiers.Data, new BerOctetString(certBagsEncoding));
- }
- else
- {
- byte[] certBytes = CryptPbeData(true, cAlgId, password, false, certBagsEncoding);
- EncryptedData cInfo = new EncryptedData(PkcsObjectIdentifiers.Data, cAlgId, new BerOctetString(certBytes));
- certsInfo = new ContentInfo(PkcsObjectIdentifiers.EncryptedData, cInfo.ToAsn1Object());
- }
-
- ContentInfo[] info = new ContentInfo[]{ keysInfo, certsInfo };
-
- byte[] data = new AuthenticatedSafe(info).GetEncoded(
- useDerEncoding ? Asn1Encodable.Der : Asn1Encodable.Ber);
-
- ContentInfo mainInfo = new ContentInfo(PkcsObjectIdentifiers.Data, new BerOctetString(data));
-
- //
- // create the mac
- //
- MacData macData = null;
- if (password != null)
- {
- byte[] mSalt = new byte[20];
- random.NextBytes(mSalt);
-
- byte[] mac = CalculatePbeMac(OiwObjectIdentifiers.IdSha1,
- mSalt, MinIterations, password, false, data);
-
- AlgorithmIdentifier algId = new AlgorithmIdentifier(
- OiwObjectIdentifiers.IdSha1, DerNull.Instance);
- DigestInfo dInfo = new DigestInfo(algId, mac);
-
- macData = new MacData(dInfo, mSalt, MinIterations);
- }
-
- //
- // output the Pfx
- //
- Pfx pfx = new Pfx(mainInfo, macData);
-
- DerOutputStream derOut;
- if (useDerEncoding)
- {
- derOut = new DerOutputStream(stream);
- }
- else
- {
- derOut = new BerOutputStream(stream);
- }
-
- derOut.WriteObject(pfx);
- }
-
- internal static byte[] CalculatePbeMac(
- DerObjectIdentifier oid,
- byte[] salt,
- int itCount,
- char[] password,
- bool wrongPkcs12Zero,
- byte[] data)
- {
- Asn1Encodable asn1Params = PbeUtilities.GenerateAlgorithmParameters(
- oid, salt, itCount);
- ICipherParameters cipherParams = PbeUtilities.GenerateCipherParameters(
- oid, password, wrongPkcs12Zero, asn1Params);
-
- IMac mac = (IMac) PbeUtilities.CreateEngine(oid);
- mac.Init(cipherParams);
- return MacUtilities.DoFinal(mac, data);
- }
-
- private static byte[] CryptPbeData(
- bool forEncryption,
- AlgorithmIdentifier algId,
- char[] password,
- bool wrongPkcs12Zero,
- byte[] data)
- {
- IBufferedCipher cipher = PbeUtilities.CreateEngine(algId.Algorithm) as IBufferedCipher;
-
- if (cipher == null)
- throw new Exception("Unknown encryption algorithm: " + algId.Algorithm);
-
- Pkcs12PbeParams pbeParameters = Pkcs12PbeParams.GetInstance(algId.Parameters);
- ICipherParameters cipherParams = PbeUtilities.GenerateCipherParameters(
- algId.Algorithm, password, wrongPkcs12Zero, pbeParameters);
- cipher.Init(forEncryption, cipherParams);
- return cipher.DoFinal(data);
- }
-
- private class IgnoresCaseHashtable
- : IEnumerable
- {
- private readonly IDictionary orig = Platform.CreateHashtable();
- private readonly IDictionary keys = Platform.CreateHashtable();
-
- public void Clear()
- {
- orig.Clear();
- keys.Clear();
- }
-
- public IEnumerator GetEnumerator()
- {
- return orig.GetEnumerator();
- }
-
- public ICollection Keys
- {
- get { return orig.Keys; }
- }
-
- public object Remove(
- string alias)
- {
- string upper = Platform.ToUpperInvariant(alias);
- string k = (string)keys[upper];
-
- if (k == null)
- return null;
-
- keys.Remove(upper);
-
- object o = orig[k];
- orig.Remove(k);
- return o;
- }
-
- public object this[
- string alias]
- {
- get
- {
- string upper = Platform.ToUpperInvariant(alias);
- string k = (string)keys[upper];
-
- if (k == null)
- return null;
-
- return orig[k];
- }
- set
- {
- string upper = Platform.ToUpperInvariant(alias);
- string k = (string)keys[upper];
- if (k != null)
- {
- orig.Remove(k);
- }
- keys[upper] = alias;
- orig[alias] = value;
- }
- }
-
- public ICollection Values
- {
- get { return orig.Values; }
- }
- }
- }
-}
diff --git a/BCCrypto/src/pkcs/Pkcs12Utilities.cs b/BCCrypto/src/pkcs/Pkcs12Utilities.cs
deleted file mode 100644
index 923eca5..0000000
--- a/BCCrypto/src/pkcs/Pkcs12Utilities.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Pkcs
-{
- /**
- * Utility class for reencoding PKCS#12 files to definite length.
- */
- public class Pkcs12Utilities
- {
- /**
- * Just re-encode the outer layer of the PKCS#12 file to definite length encoding.
- *
- * @param berPKCS12File - original PKCS#12 file
- * @return a byte array representing the DER encoding of the PFX structure
- * @throws IOException
- */
- public static byte[] ConvertToDefiniteLength(
- byte[] berPkcs12File)
- {
- Pfx pfx = new Pfx(Asn1Sequence.GetInstance(Asn1Object.FromByteArray(berPkcs12File)));
-
- return pfx.GetEncoded(Asn1Encodable.Der);
- }
-
- /**
- * Re-encode the PKCS#12 structure to definite length encoding at the inner layer
- * as well, recomputing the MAC accordingly.
- *
- * @param berPKCS12File - original PKCS12 file.
- * @param provider - provider to use for MAC calculation.
- * @return a byte array representing the DER encoding of the PFX structure.
- * @throws IOException on parsing, encoding errors.
- */
- public static byte[] ConvertToDefiniteLength(
- byte[] berPkcs12File,
- char[] passwd)
- {
- Pfx pfx = new Pfx(Asn1Sequence.GetInstance(Asn1Object.FromByteArray(berPkcs12File)));
-
- ContentInfo info = pfx.AuthSafe;
-
- Asn1OctetString content = Asn1OctetString.GetInstance(info.Content);
- Asn1Object obj = Asn1Object.FromByteArray(content.GetOctets());
-
- info = new ContentInfo(info.ContentType, new DerOctetString(obj.GetEncoded(Asn1Encodable.Der)));
-
- MacData mData = pfx.MacData;
-
- try
- {
- int itCount = mData.IterationCount.IntValue;
- byte[] data = Asn1OctetString.GetInstance(info.Content).GetOctets();
- byte[] res = Pkcs12Store.CalculatePbeMac(
- mData.Mac.AlgorithmID.Algorithm, mData.GetSalt(), itCount, passwd, false, data);
-
- AlgorithmIdentifier algId = new AlgorithmIdentifier(
- mData.Mac.AlgorithmID.Algorithm, DerNull.Instance);
- DigestInfo dInfo = new DigestInfo(algId, res);
-
- mData = new MacData(dInfo, mData.GetSalt(), itCount);
- }
- catch (Exception e)
- {
- throw new IOException("error constructing MAC: " + e.ToString());
- }
-
- pfx = new Pfx(info, mData);
-
- return pfx.GetEncoded(Asn1Encodable.Der);
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/pkcs/PrivateKeyInfoFactory.cs b/BCCrypto/src/pkcs/PrivateKeyInfoFactory.cs
deleted file mode 100644
index a349a11..0000000
--- a/BCCrypto/src/pkcs/PrivateKeyInfoFactory.cs
+++ /dev/null
@@ -1,205 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.Sec;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Pkcs
-{
- public sealed class PrivateKeyInfoFactory
- {
- private PrivateKeyInfoFactory()
- {
- }
-
- public static PrivateKeyInfo CreatePrivateKeyInfo(
- AsymmetricKeyParameter key)
- {
- if (key == null)
- throw new ArgumentNullException("key");
- if (!key.IsPrivate)
- throw new ArgumentException("Public key passed - private key expected", "key");
-
- if (key is ElGamalPrivateKeyParameters)
- {
- ElGamalPrivateKeyParameters _key = (ElGamalPrivateKeyParameters)key;
- return new PrivateKeyInfo(
- new AlgorithmIdentifier(
- OiwObjectIdentifiers.ElGamalAlgorithm,
- new ElGamalParameter(
- _key.Parameters.P,
- _key.Parameters.G).ToAsn1Object()),
- new DerInteger(_key.X));
- }
-
- if (key is DsaPrivateKeyParameters)
- {
- DsaPrivateKeyParameters _key = (DsaPrivateKeyParameters)key;
- return new PrivateKeyInfo(
- new AlgorithmIdentifier(
- X9ObjectIdentifiers.IdDsa,
- new DsaParameter(
- _key.Parameters.P,
- _key.Parameters.Q,
- _key.Parameters.G).ToAsn1Object()),
- new DerInteger(_key.X));
- }
-
- if (key is DHPrivateKeyParameters)
- {
- DHPrivateKeyParameters _key = (DHPrivateKeyParameters)key;
-
- DHParameter p = new DHParameter(
- _key.Parameters.P, _key.Parameters.G, _key.Parameters.L);
-
- return new PrivateKeyInfo(
- new AlgorithmIdentifier(_key.AlgorithmOid, p.ToAsn1Object()),
- new DerInteger(_key.X));
- }
-
- if (key is RsaKeyParameters)
- {
- AlgorithmIdentifier algID = new AlgorithmIdentifier(
- PkcsObjectIdentifiers.RsaEncryption, DerNull.Instance);
-
- RsaPrivateKeyStructure keyStruct;
- if (key is RsaPrivateCrtKeyParameters)
- {
- RsaPrivateCrtKeyParameters _key = (RsaPrivateCrtKeyParameters)key;
-
- keyStruct = new RsaPrivateKeyStructure(
- _key.Modulus,
- _key.PublicExponent,
- _key.Exponent,
- _key.P,
- _key.Q,
- _key.DP,
- _key.DQ,
- _key.QInv);
- }
- else
- {
- RsaKeyParameters _key = (RsaKeyParameters) key;
-
- keyStruct = new RsaPrivateKeyStructure(
- _key.Modulus,
- BigInteger.Zero,
- _key.Exponent,
- BigInteger.Zero,
- BigInteger.Zero,
- BigInteger.Zero,
- BigInteger.Zero,
- BigInteger.Zero);
- }
-
- return new PrivateKeyInfo(algID, keyStruct.ToAsn1Object());
- }
-
- if (key is ECPrivateKeyParameters)
- {
- ECPrivateKeyParameters priv = (ECPrivateKeyParameters)key;
- ECDomainParameters dp = priv.Parameters;
- int orderBitLength = dp.N.BitLength;
-
- AlgorithmIdentifier algID;
- ECPrivateKeyStructure ec;
-
- if (priv.AlgorithmName == "ECGOST3410")
- {
- if (priv.PublicKeyParamSet == null)
- throw Platform.CreateNotImplementedException("Not a CryptoPro parameter set");
-
- Gost3410PublicKeyAlgParameters gostParams = new Gost3410PublicKeyAlgParameters(
- priv.PublicKeyParamSet, CryptoProObjectIdentifiers.GostR3411x94CryptoProParamSet);
-
- algID = new AlgorithmIdentifier(CryptoProObjectIdentifiers.GostR3410x2001, gostParams);
-
- // TODO Do we need to pass any parameters here?
- ec = new ECPrivateKeyStructure(orderBitLength, priv.D);
- }
- else
- {
- X962Parameters x962;
- if (priv.PublicKeyParamSet == null)
- {
- X9ECParameters ecP = new X9ECParameters(dp.Curve, dp.G, dp.N, dp.H, dp.GetSeed());
- x962 = new X962Parameters(ecP);
- }
- else
- {
- x962 = new X962Parameters(priv.PublicKeyParamSet);
- }
-
- // TODO Possible to pass the publicKey bitstring here?
- ec = new ECPrivateKeyStructure(orderBitLength, priv.D, x962);
-
- algID = new AlgorithmIdentifier(X9ObjectIdentifiers.IdECPublicKey, x962);
- }
-
- return new PrivateKeyInfo(algID, ec);
- }
-
- if (key is Gost3410PrivateKeyParameters)
- {
- Gost3410PrivateKeyParameters _key = (Gost3410PrivateKeyParameters)key;
-
- if (_key.PublicKeyParamSet == null)
- throw Platform.CreateNotImplementedException("Not a CryptoPro parameter set");
-
- byte[] keyEnc = _key.X.ToByteArrayUnsigned();
- byte[] keyBytes = new byte[keyEnc.Length];
-
- for (int i = 0; i != keyBytes.Length; i++)
- {
- keyBytes[i] = keyEnc[keyEnc.Length - 1 - i]; // must be little endian
- }
-
- Gost3410PublicKeyAlgParameters algParams = new Gost3410PublicKeyAlgParameters(
- _key.PublicKeyParamSet, CryptoProObjectIdentifiers.GostR3411x94CryptoProParamSet, null);
-
- AlgorithmIdentifier algID = new AlgorithmIdentifier(
- CryptoProObjectIdentifiers.GostR3410x94,
- algParams.ToAsn1Object());
-
- return new PrivateKeyInfo(algID, new DerOctetString(keyBytes));
- }
-
- throw new ArgumentException("Class provided is not convertible: " + Platform.GetTypeName(key));
- }
-
- public static PrivateKeyInfo CreatePrivateKeyInfo(
- char[] passPhrase,
- EncryptedPrivateKeyInfo encInfo)
- {
- return CreatePrivateKeyInfo(passPhrase, false, encInfo);
- }
-
- public static PrivateKeyInfo CreatePrivateKeyInfo(
- char[] passPhrase,
- bool wrongPkcs12Zero,
- EncryptedPrivateKeyInfo encInfo)
- {
- AlgorithmIdentifier algID = encInfo.EncryptionAlgorithm;
-
- IBufferedCipher cipher = PbeUtilities.CreateEngine(algID) as IBufferedCipher;
- if (cipher == null)
- throw new Exception("Unknown encryption algorithm: " + algID.Algorithm);
-
- ICipherParameters cipherParameters = PbeUtilities.GenerateCipherParameters(
- algID, passPhrase, wrongPkcs12Zero);
- cipher.Init(false, cipherParameters);
- byte[] keyBytes = cipher.DoFinal(encInfo.GetEncryptedData());
-
- return PrivateKeyInfo.GetInstance(keyBytes);
- }
- }
-}
diff --git a/BCCrypto/src/pkcs/X509CertificateEntry.cs b/BCCrypto/src/pkcs/X509CertificateEntry.cs
deleted file mode 100644
index 2f81dd8..0000000
--- a/BCCrypto/src/pkcs/X509CertificateEntry.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Pkcs
-{
- public class X509CertificateEntry
- : Pkcs12Entry
- {
- private readonly X509Certificate cert;
-
- public X509CertificateEntry(
- X509Certificate cert)
- : base(Platform.CreateHashtable())
- {
- this.cert = cert;
- }
-
-#if !(SILVERLIGHT || PORTABLE)
- [Obsolete]
- public X509CertificateEntry(
- X509Certificate cert,
- Hashtable attributes)
- : base(attributes)
- {
- this.cert = cert;
- }
-#endif
-
- public X509CertificateEntry(
- X509Certificate cert,
- IDictionary attributes)
- : base(attributes)
- {
- this.cert = cert;
- }
-
- public X509Certificate Certificate
- {
- get { return this.cert; }
- }
-
- public override bool Equals(object obj)
- {
- X509CertificateEntry other = obj as X509CertificateEntry;
-
- if (other == null)
- return false;
-
- return cert.Equals(other.cert);
- }
-
- public override int GetHashCode()
- {
- return ~cert.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/pkix/CertStatus.cs b/BCCrypto/src/pkix/CertStatus.cs
deleted file mode 100644
index 4f40b7b..0000000
--- a/BCCrypto/src/pkix/CertStatus.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Pkix
-{
- public class CertStatus
- {
- public const int Unrevoked = 11;
-
- public const int Undetermined = 12;
-
- private int status = Unrevoked;
-
- DateTimeObject revocationDate = null;
-
- ///
- /// Returns the revocationDate.
- ///
- public DateTimeObject RevocationDate
- {
- get { return revocationDate; }
- set { this.revocationDate = value; }
- }
-
- ///
- /// Returns the certStatus.
- ///
- public int Status
- {
- get { return status; }
- set { this.status = value; }
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixAttrCertChecker.cs b/BCCrypto/src/pkix/PkixAttrCertChecker.cs
deleted file mode 100644
index a6eab84..0000000
--- a/BCCrypto/src/pkix/PkixAttrCertChecker.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Pkix
-{
- public abstract class PkixAttrCertChecker
- {
- /**
- * Returns an immutable Set of X.509 attribute certificate
- * extensions that this PkixAttrCertChecker supports or
- * null if no extensions are supported.
- *
- * Each element of the set is a String representing the
- * Object Identifier (OID) of the X.509 extension that is supported.
- *
- *
- * All X.509 attribute certificate extensions that a
- * PkixAttrCertChecker might possibly be able to process
- * should be included in the set.
- *
- *
- * @return an immutable Set of X.509 extension OIDs (in
- * String format) supported by this
- * PkixAttrCertChecker, or null if no
- * extensions are supported
- */
- public abstract ISet GetSupportedExtensions();
-
- /**
- * Performs checks on the specified attribute certificate. Every handled
- * extension is rmeoved from the unresolvedCritExts
- * collection.
- *
- * @param attrCert The attribute certificate to be checked.
- * @param certPath The certificate path which belongs to the attribute
- * certificate issuer public key certificate.
- * @param holderCertPath The certificate path which belongs to the holder
- * certificate.
- * @param unresolvedCritExts a Collection of OID strings
- * representing the current set of unresolved critical extensions
- * @throws CertPathValidatorException if the specified attribute certificate
- * does not pass the check.
- */
- public abstract void Check(IX509AttributeCertificate attrCert, PkixCertPath certPath,
- PkixCertPath holderCertPath, ICollection unresolvedCritExts);
-
- /**
- * Returns a clone of this object.
- *
- * @return a copy of this PkixAttrCertChecker
- */
- public abstract PkixAttrCertChecker Clone();
- }
-}
diff --git a/BCCrypto/src/pkix/PkixAttrCertPathBuilder.cs b/BCCrypto/src/pkix/PkixAttrCertPathBuilder.cs
deleted file mode 100644
index 646cc5d..0000000
--- a/BCCrypto/src/pkix/PkixAttrCertPathBuilder.cs
+++ /dev/null
@@ -1,215 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Pkix
-{
- public class PkixAttrCertPathBuilder
- {
- /**
- * Build and validate a CertPath using the given parameter.
- *
- * @param params PKIXBuilderParameters object containing all information to
- * build the CertPath
- */
- public virtual PkixCertPathBuilderResult Build(
- PkixBuilderParameters pkixParams)
- {
- // search target certificates
-
- IX509Selector certSelect = pkixParams.GetTargetConstraints();
- if (!(certSelect is X509AttrCertStoreSelector))
- {
- throw new PkixCertPathBuilderException(
- "TargetConstraints must be an instance of "
- + typeof(X509AttrCertStoreSelector).FullName
- + " for "
- + typeof(PkixAttrCertPathBuilder).FullName + " class.");
- }
-
- ICollection targets;
- try
- {
- targets = PkixCertPathValidatorUtilities.FindCertificates(
- (X509AttrCertStoreSelector)certSelect, pkixParams.GetStores());
- }
- catch (Exception e)
- {
- throw new PkixCertPathBuilderException("Error finding target attribute certificate.", e);
- }
-
- if (targets.Count == 0)
- {
- throw new PkixCertPathBuilderException(
- "No attribute certificate found matching targetContraints.");
- }
-
- PkixCertPathBuilderResult result = null;
-
- // check all potential target certificates
- foreach (IX509AttributeCertificate cert in targets)
- {
- X509CertStoreSelector selector = new X509CertStoreSelector();
- X509Name[] principals = cert.Issuer.GetPrincipals();
- ISet issuers = new HashSet();
- for (int i = 0; i < principals.Length; i++)
- {
- try
- {
- selector.Subject = principals[i];
-
- issuers.AddAll(PkixCertPathValidatorUtilities.FindCertificates(selector, pkixParams.GetStores()));
- }
- catch (Exception e)
- {
- throw new PkixCertPathBuilderException(
- "Public key certificate for attribute certificate cannot be searched.",
- e);
- }
- }
-
- if (issuers.IsEmpty)
- throw new PkixCertPathBuilderException("Public key certificate for attribute certificate cannot be found.");
-
- IList certPathList = Platform.CreateArrayList();
-
- foreach (X509Certificate issuer in issuers)
- {
- result = Build(cert, issuer, pkixParams, certPathList);
-
- if (result != null)
- break;
- }
-
- if (result != null)
- break;
- }
-
- if (result == null && certPathException != null)
- {
- throw new PkixCertPathBuilderException(
- "Possible certificate chain could not be validated.",
- certPathException);
- }
-
- if (result == null && certPathException == null)
- {
- throw new PkixCertPathBuilderException(
- "Unable to find certificate chain.");
- }
-
- return result;
- }
-
- private Exception certPathException;
-
- private PkixCertPathBuilderResult Build(
- IX509AttributeCertificate attrCert,
- X509Certificate tbvCert,
- PkixBuilderParameters pkixParams,
- IList tbvPath)
- {
- // If tbvCert is readily present in tbvPath, it indicates having run
- // into a cycle in the
- // PKI graph.
- if (tbvPath.Contains(tbvCert))
- return null;
-
- // step out, the certificate is not allowed to appear in a certification
- // chain
- if (pkixParams.GetExcludedCerts().Contains(tbvCert))
- return null;
-
- // test if certificate path exceeds maximum length
- if (pkixParams.MaxPathLength != -1)
- {
- if (tbvPath.Count - 1 > pkixParams.MaxPathLength)
- return null;
- }
-
- tbvPath.Add(tbvCert);
-
- PkixCertPathBuilderResult builderResult = null;
-
-// X509CertificateParser certParser = new X509CertificateParser();
- PkixAttrCertPathValidator validator = new PkixAttrCertPathValidator();
-
- try
- {
- // check whether the issuer of is a TrustAnchor
- if (PkixCertPathValidatorUtilities.FindTrustAnchor(tbvCert, pkixParams.GetTrustAnchors()) != null)
- {
- PkixCertPath certPath = new PkixCertPath(tbvPath);
- PkixCertPathValidatorResult result;
-
- try
- {
- result = validator.Validate(certPath, pkixParams);
- }
- catch (Exception e)
- {
- throw new Exception("Certification path could not be validated.", e);
- }
-
- return new PkixCertPathBuilderResult(certPath, result.TrustAnchor,
- result.PolicyTree, result.SubjectPublicKey);
- }
- else
- {
- // add additional X.509 stores from locations in certificate
- try
- {
- PkixCertPathValidatorUtilities.AddAdditionalStoresFromAltNames(tbvCert, pkixParams);
- }
- catch (CertificateParsingException e)
- {
- throw new Exception("No additional X.509 stores can be added from certificate locations.", e);
- }
-
- // try to get the issuer certificate from one of the stores
- ISet issuers = new HashSet();
- try
- {
- issuers.AddAll(PkixCertPathValidatorUtilities.FindIssuerCerts(tbvCert, pkixParams));
- }
- catch (Exception e)
- {
- throw new Exception("Cannot find issuer certificate for certificate in certification path.", e);
- }
-
- if (issuers.IsEmpty)
- throw new Exception("No issuer certificate for certificate in certification path found.");
-
- foreach (X509Certificate issuer in issuers)
- {
- // if untrusted self signed certificate continue
- if (PkixCertPathValidatorUtilities.IsSelfIssued(issuer))
- continue;
-
- builderResult = Build(attrCert, issuer, pkixParams, tbvPath);
-
- if (builderResult != null)
- break;
- }
- }
- }
- catch (Exception e)
- {
- certPathException = new Exception("No valid certification path could be build.", e);
- }
-
- if (builderResult == null)
- {
- tbvPath.Remove(tbvCert);
- }
-
- return builderResult;
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixAttrCertPathValidator.cs b/BCCrypto/src/pkix/PkixAttrCertPathValidator.cs
deleted file mode 100644
index 5f53bcd..0000000
--- a/BCCrypto/src/pkix/PkixAttrCertPathValidator.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-using System;
-
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Pkix
-{
- /**
- * CertPathValidatorSpi implementation for X.509 Attribute Certificates la RFC 3281.
- *
- * @see org.bouncycastle.x509.ExtendedPkixParameters
- */
- public class PkixAttrCertPathValidator
- // extends CertPathValidatorSpi
- {
- /**
- * Validates an attribute certificate with the given certificate path.
- *
- *
- * params must be an instance of
- * ExtendedPkixParameters.
- *
- * The target constraints in the params must be an
- * X509AttrCertStoreSelector with at least the attribute
- * certificate criterion set. Obey that also target informations may be
- * necessary to correctly validate this attribute certificate.
- *
- * The attribute certificate issuer must be added to the trusted attribute
- * issuers with {@link ExtendedPkixParameters#setTrustedACIssuers(Set)}.
- *
- * @param certPath The certificate path which belongs to the attribute
- * certificate issuer public key certificate.
- * @param params The PKIX parameters.
- * @return A PKIXCertPathValidatorResult of the result of
- * validating the certPath.
- * @throws InvalidAlgorithmParameterException if params is
- * inappropriate for this validator.
- * @throws CertPathValidatorException if the verification fails.
- */
- public virtual PkixCertPathValidatorResult Validate(
- PkixCertPath certPath,
- PkixParameters pkixParams)
- {
- IX509Selector certSelect = pkixParams.GetTargetConstraints();
- if (!(certSelect is X509AttrCertStoreSelector))
- {
- throw new ArgumentException(
- "TargetConstraints must be an instance of " + typeof(X509AttrCertStoreSelector).FullName,
- "pkixParams");
- }
- IX509AttributeCertificate attrCert = ((X509AttrCertStoreSelector) certSelect).AttributeCert;
-
- PkixCertPath holderCertPath = Rfc3281CertPathUtilities.ProcessAttrCert1(attrCert, pkixParams);
- PkixCertPathValidatorResult result = Rfc3281CertPathUtilities.ProcessAttrCert2(certPath, pkixParams);
- X509Certificate issuerCert = (X509Certificate)certPath.Certificates[0];
- Rfc3281CertPathUtilities.ProcessAttrCert3(issuerCert, pkixParams);
- Rfc3281CertPathUtilities.ProcessAttrCert4(issuerCert, pkixParams);
- Rfc3281CertPathUtilities.ProcessAttrCert5(attrCert, pkixParams);
- // 6 already done in X509AttrCertStoreSelector
- Rfc3281CertPathUtilities.ProcessAttrCert7(attrCert, certPath, holderCertPath, pkixParams);
- Rfc3281CertPathUtilities.AdditionalChecks(attrCert, pkixParams);
- DateTime date;
- try
- {
- date = PkixCertPathValidatorUtilities.GetValidCertDateFromValidityModel(pkixParams, null, -1);
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Could not get validity date from attribute certificate.", e);
- }
- Rfc3281CertPathUtilities.CheckCrls(attrCert, pkixParams, issuerCert, date, certPath.Certificates);
- return result;
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixBuilderParameters.cs b/BCCrypto/src/pkix/PkixBuilderParameters.cs
deleted file mode 100644
index 32fc043..0000000
--- a/BCCrypto/src/pkix/PkixBuilderParameters.cs
+++ /dev/null
@@ -1,140 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.X509.Store;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Pkix
-{
- ///
- /// Summary description for PkixBuilderParameters.
- ///
- public class PkixBuilderParameters
- : PkixParameters
- {
- private int maxPathLength = 5;
-
- private ISet excludedCerts = new HashSet();
-
- /**
- * Returns an instance of PkixBuilderParameters.
- *
- * This method can be used to get a copy from other
- * PKIXBuilderParameters, PKIXParameters,
- * and ExtendedPKIXParameters instances.
- *
- *
- * @param pkixParams The PKIX parameters to create a copy of.
- * @return An PkixBuilderParameters instance.
- */
- public static PkixBuilderParameters GetInstance(
- PkixParameters pkixParams)
- {
- PkixBuilderParameters parameters = new PkixBuilderParameters(
- pkixParams.GetTrustAnchors(),
- new X509CertStoreSelector(pkixParams.GetTargetCertConstraints()));
- parameters.SetParams(pkixParams);
- return parameters;
- }
-
- public PkixBuilderParameters(
- ISet trustAnchors,
- IX509Selector targetConstraints)
- : base(trustAnchors)
- {
- SetTargetCertConstraints(targetConstraints);
- }
-
- public virtual int MaxPathLength
- {
- get { return maxPathLength; }
- set
- {
- if (value < -1)
- {
- throw new InvalidParameterException(
- "The maximum path length parameter can not be less than -1.");
- }
- this.maxPathLength = value;
- }
- }
-
- ///
- /// Excluded certificates are not used for building a certification path.
- ///
- /// the excluded certificates.
- public virtual ISet GetExcludedCerts()
- {
- return new HashSet(excludedCerts);
- }
-
- ///
- /// Sets the excluded certificates which are not used for building a
- /// certification path. If the ISet is null an
- /// empty set is assumed.
- ///
- ///
- /// The given set is cloned to protect it against subsequent modifications.
- ///
- /// The excluded certificates to set.
- public virtual void SetExcludedCerts(
- ISet excludedCerts)
- {
- if (excludedCerts == null)
- {
- excludedCerts = new HashSet();
- }
- else
- {
- this.excludedCerts = new HashSet(excludedCerts);
- }
- }
-
- /**
- * Can alse handle ExtendedPKIXBuilderParameters and
- * PKIXBuilderParameters.
- *
- * @param params Parameters to set.
- * @see org.bouncycastle.x509.ExtendedPKIXParameters#setParams(java.security.cert.PKIXParameters)
- */
- protected override void SetParams(
- PkixParameters parameters)
- {
- base.SetParams(parameters);
- if (parameters is PkixBuilderParameters)
- {
- PkixBuilderParameters _params = (PkixBuilderParameters) parameters;
- maxPathLength = _params.maxPathLength;
- excludedCerts = new HashSet(_params.excludedCerts);
- }
- }
-
- /**
- * Makes a copy of this PKIXParameters object. Changes to the
- * copy will not affect the original and vice versa.
- *
- * @return a copy of this PKIXParameters object
- */
- public override object Clone()
- {
- PkixBuilderParameters parameters = new PkixBuilderParameters(
- GetTrustAnchors(), GetTargetCertConstraints());
- parameters.SetParams(this);
- return parameters;
- }
-
- public override string ToString()
- {
- string nl = Platform.NewLine;
- StringBuilder s = new StringBuilder();
- s.Append("PkixBuilderParameters [" + nl);
- s.Append(base.ToString());
- s.Append(" Maximum Path Length: ");
- s.Append(MaxPathLength);
- s.Append(nl + "]" + nl);
- return s.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixCertPath.cs b/BCCrypto/src/pkix/PkixCertPath.cs
deleted file mode 100644
index 3c428f6..0000000
--- a/BCCrypto/src/pkix/PkixCertPath.cs
+++ /dev/null
@@ -1,460 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Cms;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.OpenSsl;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Pkix
-{
- /**
- * An immutable sequence of certificates (a certification path).
- *
- * This is an abstract class that defines the methods common to all CertPaths.
- * Subclasses can handle different kinds of certificates (X.509, PGP, etc.).
- *
- * All CertPath objects have a type, a list of Certificates, and one or more
- * supported encodings. Because the CertPath class is immutable, a CertPath
- * cannot change in any externally visible way after being constructed. This
- * stipulation applies to all public fields and methods of this class and any
- * added or overridden by subclasses.
- *
- * The type is a string that identifies the type of Certificates in the
- * certification path. For each certificate cert in a certification path
- * certPath, cert.getType().equals(certPath.getType()) must be true.
- *
- * The list of Certificates is an ordered List of zero or more Certificates.
- * This List and all of the Certificates contained in it must be immutable.
- *
- * Each CertPath object must support one or more encodings so that the object
- * can be translated into a byte array for storage or transmission to other
- * parties. Preferably, these encodings should be well-documented standards
- * (such as PKCS#7). One of the encodings supported by a CertPath is considered
- * the default encoding. This encoding is used if no encoding is explicitly
- * requested (for the {@link #getEncoded()} method, for instance).
- *
- * All CertPath objects are also Serializable. CertPath objects are resolved
- * into an alternate {@link CertPathRep} object during serialization. This
- * allows a CertPath object to be serialized into an equivalent representation
- * regardless of its underlying implementation.
- *
- * CertPath objects can be created with a CertificateFactory or they can be
- * returned by other classes, such as a CertPathBuilder.
- *
- * By convention, X.509 CertPaths (consisting of X509Certificates), are ordered
- * starting with the target certificate and ending with a certificate issued by
- * the trust anchor. That is, the issuer of one certificate is the subject of
- * the following one. The certificate representing the
- * {@link TrustAnchor TrustAnchor} should not be included in the certification
- * path. Unvalidated X.509 CertPaths may not follow these conventions. PKIX
- * CertPathValidators will detect any departure from these conventions that
- * cause the certification path to be invalid and throw a
- * CertPathValidatorException.
- *
- * Concurrent Access
- *
- * All CertPath objects must be thread-safe. That is, multiple threads may
- * concurrently invoke the methods defined in this class on a single CertPath
- * object (or more than one) with no ill effects. This is also true for the List
- * returned by CertPath.getCertificates.
- *
- * Requiring CertPath objects to be immutable and thread-safe allows them to be
- * passed around to various pieces of code without worrying about coordinating
- * access. Providing this thread-safety is generally not difficult, since the
- * CertPath and List objects in question are immutable.
- *
- * @see CertificateFactory
- * @see CertPathBuilder
- */
- ///
- /// CertPath implementation for X.509 certificates.
- ///
- public class PkixCertPath
-// : CertPath
- {
- internal static readonly IList certPathEncodings;
-
- static PkixCertPath()
- {
- IList encodings = Platform.CreateArrayList();
- encodings.Add("PkiPath");
- encodings.Add("PEM");
- encodings.Add("PKCS7");
- certPathEncodings = CollectionUtilities.ReadOnly(encodings);
- }
-
- private readonly IList certificates;
-
- /**
- * @param certs
- */
- private static IList SortCerts(
- IList certs)
- {
- if (certs.Count < 2)
- return certs;
-
- X509Name issuer = ((X509Certificate)certs[0]).IssuerDN;
- bool okay = true;
-
- for (int i = 1; i != certs.Count; i++)
- {
- X509Certificate cert = (X509Certificate)certs[i];
-
- if (issuer.Equivalent(cert.SubjectDN, true))
- {
- issuer = ((X509Certificate)certs[i]).IssuerDN;
- }
- else
- {
- okay = false;
- break;
- }
- }
-
- if (okay)
- return certs;
-
- // find end-entity cert
- IList retList = Platform.CreateArrayList(certs.Count);
- IList orig = Platform.CreateArrayList(certs);
-
- for (int i = 0; i < certs.Count; i++)
- {
- X509Certificate cert = (X509Certificate)certs[i];
- bool found = false;
-
- X509Name subject = cert.SubjectDN;
- foreach (X509Certificate c in certs)
- {
- if (c.IssuerDN.Equivalent(subject, true))
- {
- found = true;
- break;
- }
- }
-
- if (!found)
- {
- retList.Add(cert);
- certs.RemoveAt(i);
- }
- }
-
- // can only have one end entity cert - something's wrong, give up.
- if (retList.Count > 1)
- return orig;
-
- for (int i = 0; i != retList.Count; i++)
- {
- issuer = ((X509Certificate)retList[i]).IssuerDN;
-
- for (int j = 0; j < certs.Count; j++)
- {
- X509Certificate c = (X509Certificate)certs[j];
- if (issuer.Equivalent(c.SubjectDN, true))
- {
- retList.Add(c);
- certs.RemoveAt(j);
- break;
- }
- }
- }
-
- // make sure all certificates are accounted for.
- if (certs.Count > 0)
- return orig;
-
- return retList;
- }
-
- /**
- * Creates a CertPath of the specified type.
- * This constructor is protected because most users should use
- * a CertificateFactory to create CertPaths.
- * @param type the standard name of the type of Certificatesin this path
- **/
- public PkixCertPath(
- ICollection certificates)
-// : base("X.509")
- {
- this.certificates = SortCerts(Platform.CreateArrayList(certificates));
- }
-
- public PkixCertPath(
- Stream inStream)
- : this(inStream, "PkiPath")
- {
- }
-
- /**
- * Creates a CertPath of the specified type.
- * This constructor is protected because most users should use
- * a CertificateFactory to create CertPaths.
- *
- * @param type the standard name of the type of Certificatesin this path
- **/
- public PkixCertPath(
- Stream inStream,
- string encoding)
-// : base("X.509")
- {
- string upper = Platform.ToUpperInvariant(encoding);
-
- IList certs;
- try
- {
- if (upper.Equals(Platform.ToUpperInvariant("PkiPath")))
- {
- Asn1InputStream derInStream = new Asn1InputStream(inStream);
- Asn1Object derObject = derInStream.ReadObject();
- if (!(derObject is Asn1Sequence))
- {
- throw new CertificateException(
- "input stream does not contain a ASN1 SEQUENCE while reading PkiPath encoded data to load CertPath");
- }
-
- certs = Platform.CreateArrayList();
-
- foreach (Asn1Encodable ae in (Asn1Sequence)derObject)
- {
- byte[] derBytes = ae.GetEncoded(Asn1Encodable.Der);
- Stream certInStream = new MemoryStream(derBytes, false);
-
- // TODO Is inserting at the front important (list will be sorted later anyway)?
- certs.Insert(0, new X509CertificateParser().ReadCertificate(certInStream));
- }
- }
- else if (upper.Equals("PKCS7") || upper.Equals("PEM"))
- {
- certs = Platform.CreateArrayList(new X509CertificateParser().ReadCertificates(inStream));
- }
- else
- {
- throw new CertificateException("unsupported encoding: " + encoding);
- }
- }
- catch (IOException ex)
- {
- throw new CertificateException(
- "IOException throw while decoding CertPath:\n"
- + ex.ToString());
- }
-
- this.certificates = SortCerts(certs);
- }
-
- /**
- * Returns an iteration of the encodings supported by this
- * certification path, with the default encoding
- * first. Attempts to modify the returned Iterator via its
- * remove method result in an UnsupportedOperationException.
- *
- * @return an Iterator over the names of the supported encodings (as Strings)
- **/
- public virtual IEnumerable Encodings
- {
- get { return new EnumerableProxy(certPathEncodings); }
- }
-
- /**
- * Compares this certification path for equality with the specified object.
- * Two CertPaths are equal if and only if their types are equal and their
- * certificate Lists (and by implication the Certificates in those Lists)
- * are equal. A CertPath is never equal to an object that is not a CertPath.
- *
- * This algorithm is implemented by this method. If it is overridden, the
- * behavior specified here must be maintained.
- *
- * @param other
- * the object to test for equality with this certification path
- *
- * @return true if the specified object is equal to this certification path,
- * false otherwise
- *
- * @see Object#hashCode() Object.hashCode()
- */
- public override bool Equals(
- object obj)
- {
- if (this == obj)
- return true;
-
- PkixCertPath other = obj as PkixCertPath;
- if (other == null)
- return false;
-
-// if (!this.Type.Equals(other.Type))
-// return false;
-
- //return this.Certificates.Equals(other.Certificates);
-
- // TODO Extract this to a utility class
- IList thisCerts = this.Certificates;
- IList otherCerts = other.Certificates;
-
- if (thisCerts.Count != otherCerts.Count)
- return false;
-
- IEnumerator e1 = thisCerts.GetEnumerator();
- IEnumerator e2 = thisCerts.GetEnumerator();
-
- while (e1.MoveNext())
- {
- e2.MoveNext();
-
- if (!Platform.Equals(e1.Current, e2.Current))
- return false;
- }
-
- return true;
- }
-
- public override int GetHashCode()
- {
- // FIXME?
- return this.Certificates.GetHashCode();
- }
-
- /**
- * Returns the encoded form of this certification path, using
- * the default encoding.
- *
- * @return the encoded bytes
- * @exception CertificateEncodingException if an encoding error occurs
- **/
- public virtual byte[] GetEncoded()
- {
- foreach (object enc in Encodings)
- {
- if (enc is string)
- {
- return GetEncoded((string)enc);
- }
- }
- return null;
- }
-
- /**
- * Returns the encoded form of this certification path, using
- * the specified encoding.
- *
- * @param encoding the name of the encoding to use
- * @return the encoded bytes
- * @exception CertificateEncodingException if an encoding error
- * occurs or the encoding requested is not supported
- *
- */
- public virtual byte[] GetEncoded(
- string encoding)
- {
- if (Platform.EqualsIgnoreCase(encoding, "PkiPath"))
- {
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- for (int i = certificates.Count - 1; i >= 0; i--)
- {
- v.Add(ToAsn1Object((X509Certificate) certificates[i]));
- }
-
- return ToDerEncoded(new DerSequence(v));
- }
- else if (Platform.EqualsIgnoreCase(encoding, "PKCS7"))
- {
- Asn1.Pkcs.ContentInfo encInfo = new Asn1.Pkcs.ContentInfo(
- PkcsObjectIdentifiers.Data, null);
-
- Asn1EncodableVector v = new Asn1EncodableVector();
- for (int i = 0; i != certificates.Count; i++)
- {
- v.Add(ToAsn1Object((X509Certificate)certificates[i]));
- }
-
- Asn1.Pkcs.SignedData sd = new Asn1.Pkcs.SignedData(
- new DerInteger(1),
- new DerSet(),
- encInfo,
- new DerSet(v),
- null,
- new DerSet());
-
- return ToDerEncoded(new Asn1.Pkcs.ContentInfo(PkcsObjectIdentifiers.SignedData, sd));
- }
- else if (Platform.EqualsIgnoreCase(encoding, "PEM"))
- {
- MemoryStream bOut = new MemoryStream();
- PemWriter pWrt = new PemWriter(new StreamWriter(bOut));
-
- try
- {
- for (int i = 0; i != certificates.Count; i++)
- {
- pWrt.WriteObject(certificates[i]);
- }
-
- Platform.Dispose(pWrt.Writer);
- }
- catch (Exception)
- {
- throw new CertificateEncodingException("can't encode certificate for PEM encoded path");
- }
-
- return bOut.ToArray();
- }
- else
- {
- throw new CertificateEncodingException("unsupported encoding: " + encoding);
- }
- }
-
- ///
- /// Returns the list of certificates in this certification
- /// path.
- ///
- public virtual IList Certificates
- {
- get { return CollectionUtilities.ReadOnly(certificates); }
- }
-
- /**
- * Return a DERObject containing the encoded certificate.
- *
- * @param cert the X509Certificate object to be encoded
- *
- * @return the DERObject
- **/
- private Asn1Object ToAsn1Object(
- X509Certificate cert)
- {
- try
- {
- return Asn1Object.FromByteArray(cert.GetEncoded());
- }
- catch (Exception e)
- {
- throw new CertificateEncodingException("Exception while encoding certificate", e);
- }
- }
-
- private byte[] ToDerEncoded(Asn1Encodable obj)
- {
- try
- {
- return obj.GetEncoded(Asn1Encodable.Der);
- }
- catch (IOException e)
- {
- throw new CertificateEncodingException("Exception thrown", e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixCertPathBuilder.cs b/BCCrypto/src/pkix/PkixCertPathBuilder.cs
deleted file mode 100644
index fa38a5e..0000000
--- a/BCCrypto/src/pkix/PkixCertPathBuilder.cs
+++ /dev/null
@@ -1,205 +0,0 @@
-using System;
-using System.Collections;
-using System.Text;
-
-using Org.BouncyCastle.Asn1.IsisMtt;
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X500;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Pkix
-{
- /**
- * Implements the PKIX CertPathBuilding algorithm for BouncyCastle.
- *
- * @see CertPathBuilderSpi
- */
- public class PkixCertPathBuilder
- // : CertPathBuilderSpi
- {
- /**
- * Build and validate a CertPath using the given parameter.
- *
- * @param params PKIXBuilderParameters object containing all information to
- * build the CertPath
- */
- public virtual PkixCertPathBuilderResult Build(
- PkixBuilderParameters pkixParams)
- {
- // search target certificates
-
- IX509Selector certSelect = pkixParams.GetTargetCertConstraints();
- if (!(certSelect is X509CertStoreSelector))
- {
- throw new PkixCertPathBuilderException(
- "TargetConstraints must be an instance of "
- + typeof(X509CertStoreSelector).FullName + " for "
- + Platform.GetTypeName(this) + " class.");
- }
-
- ISet targets = new HashSet();
- try
- {
- targets.AddAll(PkixCertPathValidatorUtilities.FindCertificates((X509CertStoreSelector)certSelect, pkixParams.GetStores()));
- // TODO Should this include an entry for pkixParams.GetAdditionalStores() too?
- }
- catch (Exception e)
- {
- throw new PkixCertPathBuilderException(
- "Error finding target certificate.", e);
- }
-
- if (targets.IsEmpty)
- throw new PkixCertPathBuilderException("No certificate found matching targetContraints.");
-
- PkixCertPathBuilderResult result = null;
- IList certPathList = Platform.CreateArrayList();
-
- // check all potential target certificates
- foreach (X509Certificate cert in targets)
- {
- result = Build(cert, pkixParams, certPathList);
-
- if (result != null)
- break;
- }
-
- if (result == null && certPathException != null)
- {
- throw new PkixCertPathBuilderException(certPathException.Message, certPathException.InnerException);
- }
-
- if (result == null && certPathException == null)
- {
- throw new PkixCertPathBuilderException("Unable to find certificate chain.");
- }
-
- return result;
- }
-
- private Exception certPathException;
-
- protected virtual PkixCertPathBuilderResult Build(
- X509Certificate tbvCert,
- PkixBuilderParameters pkixParams,
- IList tbvPath)
- {
- // If tbvCert is readily present in tbvPath, it indicates having run
- // into a cycle in the PKI graph.
- if (tbvPath.Contains(tbvCert))
- return null;
-
- // step out, the certificate is not allowed to appear in a certification
- // chain.
- if (pkixParams.GetExcludedCerts().Contains(tbvCert))
- return null;
-
- // test if certificate path exceeds maximum length
- if (pkixParams.MaxPathLength != -1)
- {
- if (tbvPath.Count - 1 > pkixParams.MaxPathLength)
- return null;
- }
-
- tbvPath.Add(tbvCert);
-
-// X509CertificateParser certParser = new X509CertificateParser();
- PkixCertPathBuilderResult builderResult = null;
- PkixCertPathValidator validator = new PkixCertPathValidator();
-
- try
- {
- // check whether the issuer of is a TrustAnchor
- if (PkixCertPathValidatorUtilities.FindTrustAnchor(tbvCert, pkixParams.GetTrustAnchors()) != null)
- {
- // exception message from possibly later tried certification
- // chains
- PkixCertPath certPath = null;
- try
- {
- certPath = new PkixCertPath(tbvPath);
- }
- catch (Exception e)
- {
- throw new Exception(
- "Certification path could not be constructed from certificate list.",
- e);
- }
-
- PkixCertPathValidatorResult result = null;
- try
- {
- result = (PkixCertPathValidatorResult)validator.Validate(
- certPath, pkixParams);
- }
- catch (Exception e)
- {
- throw new Exception(
- "Certification path could not be validated.", e);
- }
-
- return new PkixCertPathBuilderResult(certPath, result.TrustAnchor,
- result.PolicyTree, result.SubjectPublicKey);
- }
- else
- {
- // add additional X.509 stores from locations in certificate
- try
- {
- PkixCertPathValidatorUtilities.AddAdditionalStoresFromAltNames(
- tbvCert, pkixParams);
- }
- catch (CertificateParsingException e)
- {
- throw new Exception(
- "No additiontal X.509 stores can be added from certificate locations.",
- e);
- }
-
- // try to get the issuer certificate from one of the stores
- HashSet issuers = new HashSet();
- try
- {
- issuers.AddAll(PkixCertPathValidatorUtilities.FindIssuerCerts(tbvCert, pkixParams));
- }
- catch (Exception e)
- {
- throw new Exception(
- "Cannot find issuer certificate for certificate in certification path.",
- e);
- }
-
- if (issuers.IsEmpty)
- throw new Exception("No issuer certificate for certificate in certification path found.");
-
- foreach (X509Certificate issuer in issuers)
- {
- builderResult = Build(issuer, pkixParams, tbvPath);
-
- if (builderResult != null)
- break;
- }
- }
- }
- catch (Exception e)
- {
- certPathException = e;
- }
-
- if (builderResult == null)
- {
- tbvPath.Remove(tbvCert);
- }
-
- return builderResult;
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixCertPathBuilderException.cs b/BCCrypto/src/pkix/PkixCertPathBuilderException.cs
deleted file mode 100644
index 0f10179..0000000
--- a/BCCrypto/src/pkix/PkixCertPathBuilderException.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Pkix
-{
- ///
- /// Summary description for PkixCertPathBuilderException.
- ///
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class PkixCertPathBuilderException : GeneralSecurityException
- {
- public PkixCertPathBuilderException() : base() { }
-
- public PkixCertPathBuilderException(string message) : base(message) { }
-
- public PkixCertPathBuilderException(string message, Exception exception) : base(message, exception) { }
-
- }
-}
diff --git a/BCCrypto/src/pkix/PkixCertPathBuilderResult.cs b/BCCrypto/src/pkix/PkixCertPathBuilderResult.cs
deleted file mode 100644
index f800303..0000000
--- a/BCCrypto/src/pkix/PkixCertPathBuilderResult.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Pkix;
-
-namespace Org.BouncyCastle.Pkix
-{
- ///
- /// Summary description for PkixCertPathBuilderResult.
- ///
- public class PkixCertPathBuilderResult
- : PkixCertPathValidatorResult//, ICertPathBuilderResult
- {
- private PkixCertPath certPath;
-
- public PkixCertPathBuilderResult(
- PkixCertPath certPath,
- TrustAnchor trustAnchor,
- PkixPolicyNode policyTree,
- AsymmetricKeyParameter subjectPublicKey)
- : base(trustAnchor, policyTree, subjectPublicKey)
- {
- if (certPath == null)
- throw new ArgumentNullException("certPath");
-
- this.certPath = certPath;
- }
-
- public PkixCertPath CertPath
- {
- get { return certPath; }
- }
-
- public override string ToString()
- {
- StringBuilder s = new StringBuilder();
- s.Append("SimplePKIXCertPathBuilderResult: [\n");
- s.Append(" Certification Path: ").Append(CertPath).Append('\n');
- s.Append(" Trust Anchor: ").Append(this.TrustAnchor.TrustedCert.IssuerDN.ToString()).Append('\n');
- s.Append(" Subject Public Key: ").Append(this.SubjectPublicKey).Append("\n]");
- return s.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixCertPathChecker.cs b/BCCrypto/src/pkix/PkixCertPathChecker.cs
deleted file mode 100644
index da7e82b..0000000
--- a/BCCrypto/src/pkix/PkixCertPathChecker.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Pkix
-{
- public abstract class PkixCertPathChecker
- {
- protected PkixCertPathChecker()
- {
- }
-
- /**
- * Initializes the internal state of this PKIXCertPathChecker.
- *
- * The forward flag specifies the order that certificates
- * will be passed to the {@link #check check} method (forward or reverse). A
- * PKIXCertPathChecker must support reverse checking
- * and may support forward checking.
- *
- *
- * @param forward
- * the order that certificates are presented to the
- * check method. If true,
- * certificates are presented from target to most-trusted CA
- * (forward); if false, from most-trusted CA to
- * target (reverse).
- * @exception CertPathValidatorException
- * if this PKIXCertPathChecker is unable to
- * check certificates in the specified order; it should never
- * be thrown if the forward flag is false since reverse
- * checking must be supported
- */
- public abstract void Init(bool forward);
- //throws CertPathValidatorException;
-
- /**
- * Indicates if forward checking is supported. Forward checking refers to
- * the ability of the PKIXCertPathChecker to perform its
- * checks when certificates are presented to the check method
- * in the forward direction (from target to most-trusted CA).
- *
- * @return true if forward checking is supported,
- * false otherwise
- */
- public abstract bool IsForwardCheckingSupported();
-
- /**
- * Returns an immutable Set of X.509 certificate extensions
- * that this PKIXCertPathChecker supports (i.e. recognizes,
- * is able to process), or null if no extensions are
- * supported.
- *
- * Each element of the set is a String representing the
- * Object Identifier (OID) of the X.509 extension that is supported. The OID
- * is represented by a set of nonnegative integers separated by periods.
- *
- * All X.509 certificate extensions that a PKIXCertPathChecker
- * might possibly be able to process should be included in the set.
- *
- *
- * @return an immutable Set of X.509 extension OIDs (in
- * String format) supported by this
- * PKIXCertPathChecker, or null if no
- * extensions are supported
- */
- public abstract ISet GetSupportedExtensions();
-
- /**
- * Performs the check(s) on the specified certificate using its internal
- * state and removes any critical extensions that it processes from the
- * specified collection of OID strings that represent the unresolved
- * critical extensions. The certificates are presented in the order
- * specified by the init method.
- *
- * @param cert
- * the Certificate to be checked
- * @param unresolvedCritExts
- * a Collection of OID strings representing the
- * current set of unresolved critical extensions
- * @exception CertPathValidatorException
- * if the specified certificate does not pass the check
- */
- public abstract void Check(X509Certificate cert, ISet unresolvedCritExts);
- //throws CertPathValidatorException;
-
- /**
- * Returns a clone of this object. Calls the Object.clone()
- * method. All subclasses which maintain state must support and override
- * this method, if necessary.
- *
- * @return a copy of this PKIXCertPathChecker
- */
- public virtual object Clone()
- {
- // TODO Check this
- return base.MemberwiseClone();
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixCertPathValidator.cs b/BCCrypto/src/pkix/PkixCertPathValidator.cs
deleted file mode 100644
index fcfa638..0000000
--- a/BCCrypto/src/pkix/PkixCertPathValidator.cs
+++ /dev/null
@@ -1,420 +0,0 @@
-using System;
-using System.Collections;
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Pkix
-{
- /**
- * The Service Provider Interface (SPI )
- * for the {@link CertPathValidator CertPathValidator} class. All
- * CertPathValidator implementations must include a class (the
- * SPI class) that extends this class (CertPathValidatorSpi)
- * and implements all of its methods. In general, instances of this class
- * should only be accessed through the CertPathValidator class.
- * For details, see the Java Cryptography Architecture.
- *
- * Concurrent Access
- *
- * Instances of this class need not be protected against concurrent
- * access from multiple threads. Threads that need to access a single
- * CertPathValidatorSpi instance concurrently should synchronize
- * amongst themselves and provide the necessary locking before calling the
- * wrapping CertPathValidator object.
- *
- * However, implementations of CertPathValidatorSpi may still
- * encounter concurrency issues, since multiple threads each
- * manipulating a different CertPathValidatorSpi instance need not
- * synchronize.
- */
- ///
- /// CertPathValidatorSpi implementation for X.509 Certificate validation a la RFC
- /// 3280.
- ///
- public class PkixCertPathValidator
- {
- public virtual PkixCertPathValidatorResult Validate(
- PkixCertPath certPath,
- PkixParameters paramsPkix)
- {
- if (paramsPkix.GetTrustAnchors() == null)
- {
- throw new ArgumentException(
- "trustAnchors is null, this is not allowed for certification path validation.",
- "parameters");
- }
-
- //
- // 6.1.1 - inputs
- //
-
- //
- // (a)
- //
- IList certs = certPath.Certificates;
- int n = certs.Count;
-
- if (certs.Count == 0)
- throw new PkixCertPathValidatorException("Certification path is empty.", null, certPath, 0);
-
- //
- // (b)
- //
- // DateTime validDate = PkixCertPathValidatorUtilities.GetValidDate(paramsPkix);
-
- //
- // (c)
- //
- ISet userInitialPolicySet = paramsPkix.GetInitialPolicies();
-
- //
- // (d)
- //
- TrustAnchor trust;
- try
- {
- trust = PkixCertPathValidatorUtilities.FindTrustAnchor(
- (X509Certificate)certs[certs.Count - 1],
- paramsPkix.GetTrustAnchors());
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(e.Message, e, certPath, certs.Count - 1);
- }
-
- if (trust == null)
- throw new PkixCertPathValidatorException("Trust anchor for certification path not found.", null, certPath, -1);
-
- //
- // (e), (f), (g) are part of the paramsPkix object.
- //
- IEnumerator certIter;
- int index = 0;
- int i;
- // Certificate for each interation of the validation loop
- // Signature information for each iteration of the validation loop
- //
- // 6.1.2 - setup
- //
-
- //
- // (a)
- //
- IList[] policyNodes = new IList[n + 1];
- for (int j = 0; j < policyNodes.Length; j++)
- {
- policyNodes[j] = Platform.CreateArrayList();
- }
-
- ISet policySet = new HashSet();
-
- policySet.Add(Rfc3280CertPathUtilities.ANY_POLICY);
-
- PkixPolicyNode validPolicyTree = new PkixPolicyNode(Platform.CreateArrayList(), 0, policySet, null, new HashSet(),
- Rfc3280CertPathUtilities.ANY_POLICY, false);
-
- policyNodes[0].Add(validPolicyTree);
-
- //
- // (b) and (c)
- //
- PkixNameConstraintValidator nameConstraintValidator = new PkixNameConstraintValidator();
-
- // (d)
- //
- int explicitPolicy;
- ISet acceptablePolicies = new HashSet();
-
- if (paramsPkix.IsExplicitPolicyRequired)
- {
- explicitPolicy = 0;
- }
- else
- {
- explicitPolicy = n + 1;
- }
-
- //
- // (e)
- //
- int inhibitAnyPolicy;
-
- if (paramsPkix.IsAnyPolicyInhibited)
- {
- inhibitAnyPolicy = 0;
- }
- else
- {
- inhibitAnyPolicy = n + 1;
- }
-
- //
- // (f)
- //
- int policyMapping;
-
- if (paramsPkix.IsPolicyMappingInhibited)
- {
- policyMapping = 0;
- }
- else
- {
- policyMapping = n + 1;
- }
-
- //
- // (g), (h), (i), (j)
- //
- AsymmetricKeyParameter workingPublicKey;
- X509Name workingIssuerName;
-
- X509Certificate sign = trust.TrustedCert;
- try
- {
- if (sign != null)
- {
- workingIssuerName = sign.SubjectDN;
- workingPublicKey = sign.GetPublicKey();
- }
- else
- {
- workingIssuerName = new X509Name(trust.CAName);
- workingPublicKey = trust.CAPublicKey;
- }
- }
- catch (ArgumentException ex)
- {
- throw new PkixCertPathValidatorException("Subject of trust anchor could not be (re)encoded.", ex, certPath,
- -1);
- }
-
- AlgorithmIdentifier workingAlgId = null;
- try
- {
- workingAlgId = PkixCertPathValidatorUtilities.GetAlgorithmIdentifier(workingPublicKey);
- }
- catch (PkixCertPathValidatorException e)
- {
- throw new PkixCertPathValidatorException(
- "Algorithm identifier of public key of trust anchor could not be read.", e, certPath, -1);
- }
-
-// DerObjectIdentifier workingPublicKeyAlgorithm = workingAlgId.Algorithm;
-// Asn1Encodable workingPublicKeyParameters = workingAlgId.Parameters;
-
- //
- // (k)
- //
- int maxPathLength = n;
-
- //
- // 6.1.3
- //
-
- X509CertStoreSelector certConstraints = paramsPkix.GetTargetCertConstraints();
- if (certConstraints != null && !certConstraints.Match((X509Certificate)certs[0]))
- {
- throw new PkixCertPathValidatorException(
- "Target certificate in certification path does not match targetConstraints.", null, certPath, 0);
- }
-
- //
- // initialize CertPathChecker's
- //
- IList pathCheckers = paramsPkix.GetCertPathCheckers();
- certIter = pathCheckers.GetEnumerator();
-
- while (certIter.MoveNext())
- {
- ((PkixCertPathChecker)certIter.Current).Init(false);
- }
-
- X509Certificate cert = null;
-
- for (index = certs.Count - 1; index >= 0; index--)
- {
- // try
- // {
- //
- // i as defined in the algorithm description
- //
- i = n - index;
-
- //
- // set certificate to be checked in this round
- // sign and workingPublicKey and workingIssuerName are set
- // at the end of the for loop and initialized the
- // first time from the TrustAnchor
- //
- cert = (X509Certificate)certs[index];
-
- //
- // 6.1.3
- //
-
- Rfc3280CertPathUtilities.ProcessCertA(certPath, paramsPkix, index, workingPublicKey,
- workingIssuerName, sign);
-
- Rfc3280CertPathUtilities.ProcessCertBC(certPath, index, nameConstraintValidator);
-
- validPolicyTree = Rfc3280CertPathUtilities.ProcessCertD(certPath, index,
- acceptablePolicies, validPolicyTree, policyNodes, inhibitAnyPolicy);
-
- validPolicyTree = Rfc3280CertPathUtilities.ProcessCertE(certPath, index, validPolicyTree);
-
- Rfc3280CertPathUtilities.ProcessCertF(certPath, index, validPolicyTree, explicitPolicy);
-
- //
- // 6.1.4
- //
-
- if (i != n)
- {
- if (cert != null && cert.Version == 1)
- {
- throw new PkixCertPathValidatorException(
- "Version 1 certificates can't be used as CA ones.", null, certPath, index);
- }
-
- Rfc3280CertPathUtilities.PrepareNextCertA(certPath, index);
-
- validPolicyTree = Rfc3280CertPathUtilities.PrepareCertB(certPath, index, policyNodes,
- validPolicyTree, policyMapping);
-
- Rfc3280CertPathUtilities.PrepareNextCertG(certPath, index, nameConstraintValidator);
-
- // (h)
- explicitPolicy = Rfc3280CertPathUtilities.PrepareNextCertH1(certPath, index, explicitPolicy);
- policyMapping = Rfc3280CertPathUtilities.PrepareNextCertH2(certPath, index, policyMapping);
- inhibitAnyPolicy = Rfc3280CertPathUtilities.PrepareNextCertH3(certPath, index, inhibitAnyPolicy);
-
- //
- // (i)
- //
- explicitPolicy = Rfc3280CertPathUtilities.PrepareNextCertI1(certPath, index, explicitPolicy);
- policyMapping = Rfc3280CertPathUtilities.PrepareNextCertI2(certPath, index, policyMapping);
-
- // (j)
- inhibitAnyPolicy = Rfc3280CertPathUtilities.PrepareNextCertJ(certPath, index, inhibitAnyPolicy);
-
- // (k)
- Rfc3280CertPathUtilities.PrepareNextCertK(certPath, index);
-
- // (l)
- maxPathLength = Rfc3280CertPathUtilities.PrepareNextCertL(certPath, index, maxPathLength);
-
- // (m)
- maxPathLength = Rfc3280CertPathUtilities.PrepareNextCertM(certPath, index, maxPathLength);
-
- // (n)
- Rfc3280CertPathUtilities.PrepareNextCertN(certPath, index);
-
- ISet criticalExtensions1 = cert.GetCriticalExtensionOids();
-
- if (criticalExtensions1 != null)
- {
- criticalExtensions1 = new HashSet(criticalExtensions1);
-
- // these extensions are handled by the algorithm
- criticalExtensions1.Remove(X509Extensions.KeyUsage.Id);
- criticalExtensions1.Remove(X509Extensions.CertificatePolicies.Id);
- criticalExtensions1.Remove(X509Extensions.PolicyMappings.Id);
- criticalExtensions1.Remove(X509Extensions.InhibitAnyPolicy.Id);
- criticalExtensions1.Remove(X509Extensions.IssuingDistributionPoint.Id);
- criticalExtensions1.Remove(X509Extensions.DeltaCrlIndicator.Id);
- criticalExtensions1.Remove(X509Extensions.PolicyConstraints.Id);
- criticalExtensions1.Remove(X509Extensions.BasicConstraints.Id);
- criticalExtensions1.Remove(X509Extensions.SubjectAlternativeName.Id);
- criticalExtensions1.Remove(X509Extensions.NameConstraints.Id);
- }
- else
- {
- criticalExtensions1 = new HashSet();
- }
-
- // (o)
- Rfc3280CertPathUtilities.PrepareNextCertO(certPath, index, criticalExtensions1, pathCheckers);
-
- // set signing certificate for next round
- sign = cert;
-
- // (c)
- workingIssuerName = sign.SubjectDN;
-
- // (d)
- try
- {
- workingPublicKey = PkixCertPathValidatorUtilities.GetNextWorkingKey(certPath.Certificates, index);
- }
- catch (PkixCertPathValidatorException e)
- {
- throw new PkixCertPathValidatorException("Next working key could not be retrieved.", e, certPath, index);
- }
-
- workingAlgId = PkixCertPathValidatorUtilities.GetAlgorithmIdentifier(workingPublicKey);
- // (f)
-// workingPublicKeyAlgorithm = workingAlgId.Algorithm;
- // (e)
-// workingPublicKeyParameters = workingAlgId.Parameters;
- }
- }
-
- //
- // 6.1.5 Wrap-up procedure
- //
-
- explicitPolicy = Rfc3280CertPathUtilities.WrapupCertA(explicitPolicy, cert);
-
- explicitPolicy = Rfc3280CertPathUtilities.WrapupCertB(certPath, index + 1, explicitPolicy);
-
- //
- // (c) (d) and (e) are already done
- //
-
- //
- // (f)
- //
- ISet criticalExtensions = cert.GetCriticalExtensionOids();
-
- if (criticalExtensions != null)
- {
- criticalExtensions = new HashSet(criticalExtensions);
-
- // Requires .Id
- // these extensions are handled by the algorithm
- criticalExtensions.Remove(X509Extensions.KeyUsage.Id);
- criticalExtensions.Remove(X509Extensions.CertificatePolicies.Id);
- criticalExtensions.Remove(X509Extensions.PolicyMappings.Id);
- criticalExtensions.Remove(X509Extensions.InhibitAnyPolicy.Id);
- criticalExtensions.Remove(X509Extensions.IssuingDistributionPoint.Id);
- criticalExtensions.Remove(X509Extensions.DeltaCrlIndicator.Id);
- criticalExtensions.Remove(X509Extensions.PolicyConstraints.Id);
- criticalExtensions.Remove(X509Extensions.BasicConstraints.Id);
- criticalExtensions.Remove(X509Extensions.SubjectAlternativeName.Id);
- criticalExtensions.Remove(X509Extensions.NameConstraints.Id);
- criticalExtensions.Remove(X509Extensions.CrlDistributionPoints.Id);
- }
- else
- {
- criticalExtensions = new HashSet();
- }
-
- Rfc3280CertPathUtilities.WrapupCertF(certPath, index + 1, pathCheckers, criticalExtensions);
-
- PkixPolicyNode intersection = Rfc3280CertPathUtilities.WrapupCertG(certPath, paramsPkix, userInitialPolicySet,
- index + 1, policyNodes, validPolicyTree, acceptablePolicies);
-
- if ((explicitPolicy > 0) || (intersection != null))
- {
- return new PkixCertPathValidatorResult(trust, intersection, cert.GetPublicKey());
- }
-
- throw new PkixCertPathValidatorException("Path processing failed on policy.", null, certPath, index);
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixCertPathValidatorException.cs b/BCCrypto/src/pkix/PkixCertPathValidatorException.cs
deleted file mode 100644
index a477f7d..0000000
--- a/BCCrypto/src/pkix/PkixCertPathValidatorException.cs
+++ /dev/null
@@ -1,221 +0,0 @@
-using System;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Pkix
-{
- /**
- * An exception indicating one of a variety of problems encountered when
- * validating a certification path.
- *
- * A CertPathValidatorException provides support for wrapping
- * exceptions. The {@link #getCause getCause} method returns the throwable,
- * if any, that caused this exception to be thrown.
- *
- * A CertPathValidatorException may also include the
- * certification path that was being validated when the exception was thrown
- * and the index of the certificate in the certification path that caused the
- * exception to be thrown. Use the {@link #getCertPath getCertPath} and
- * {@link #getIndex getIndex} methods to retrieve this information.
- *
- * Concurrent Access
- *
- * Unless otherwise specified, the methods defined in this class are not
- * thread-safe. Multiple threads that need to access a single
- * object concurrently should synchronize amongst themselves and
- * provide the necessary locking. Multiple threads each manipulating
- * separate objects need not synchronize.
- *
- * @see CertPathValidator
- **/
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class PkixCertPathValidatorException
- : GeneralSecurityException
- {
- private Exception cause;
- private PkixCertPath certPath;
- private int index = -1;
-
- public PkixCertPathValidatorException() : base() { }
-
- ///
- /// Creates a PkixCertPathValidatorException with the given detail
- /// message. A detail message is a String that describes this
- /// particular exception.
- ///
- /// the detail message
- public PkixCertPathValidatorException(string message) : base(message) { }
-
- ///
- /// Creates a PkixCertPathValidatorException with the specified
- /// detail message and cause.
- ///
- /// the detail message
- /// the cause (which is saved for later retrieval by the
- /// {@link #getCause getCause()} method). (A null
- /// value is permitted, and indicates that the cause is
- /// nonexistent or unknown.)
- public PkixCertPathValidatorException(string message, Exception cause) : base(message)
- {
- this.cause = cause;
- }
-
- ///
- /// Creates a PkixCertPathValidatorException with the specified
- /// detail message, cause, certification path, and index.
- ///
- /// the detail message (or null if none)
- /// the cause (or null if none)
- /// the certification path that was in the process of being
- /// validated when the error was encountered
- /// the index of the certificate in the certification path that *
- public PkixCertPathValidatorException(
- string message,
- Exception cause,
- PkixCertPath certPath,
- int index)
- : base(message)
- {
- if (certPath == null && index != -1)
- {
- throw new ArgumentNullException(
- "certPath = null and index != -1");
- }
- if (index < -1
- || (certPath != null && index >= certPath.Certificates.Count))
- {
- throw new IndexOutOfRangeException(
- " index < -1 or out of bound of certPath.getCertificates()");
- }
-
- this.cause = cause;
- this.certPath = certPath;
- this.index = index;
- }
-
- //
- // Prints a stack trace to a PrintWriter, including the
- // backtrace of the cause, if any.
- //
- // @param pw
- // the PrintWriter to use for output
- //
- // public void printStackTrace(PrintWriter pw)
- // {
- // super.printStackTrace(pw);
- // if (getCause() != null)
- // {
- // getCause().printStackTrace(pw);
- // }
- // }
- //}
-
-
- // /**
- // * Creates a CertPathValidatorException that wraps the
- // * specified throwable. This allows any exception to be converted into a
- // * CertPathValidatorException, while retaining information
- // * about the wrapped exception, which may be useful for debugging. The
- // * detail message is set to (cause==null ? null : cause.toString()
- // * )
- // * (which typically contains the class and detail message of cause).
- // *
- // * @param cause
- // * the cause (which is saved for later retrieval by the
- // * {@link #getCause getCause()} method). (A null
- // * value is permitted, and indicates that the cause is
- // * nonexistent or unknown.)
- // */
- // public PkixCertPathValidatorException(Throwable cause)
- // {
- // this.cause = cause;
- // }
- //
-
- ///
- /// Returns the detail message for this CertPathValidatorException.
- ///
- /// the detail message, or null if neither the message nor cause were specified
- public override string Message
- {
- get
- {
- string message = base.Message;
-
- if (message != null)
- {
- return message;
- }
-
- if (cause != null)
- {
- return cause.Message;
- }
-
- return null;
- }
- }
-
- /**
- * Returns the certification path that was being validated when the
- * exception was thrown.
- *
- * @return the CertPath that was being validated when the
- * exception was thrown (or null if not specified)
- */
- public PkixCertPath CertPath
- {
- get { return certPath; }
- }
-
- /**
- * Returns the index of the certificate in the certification path that
- * caused the exception to be thrown. Note that the list of certificates in
- * a CertPath is zero based. If no index has been set, -1 is
- * returned.
- *
- * @return the index that has been set, or -1 if none has been set
- */
- public int Index
- {
- get { return index; }
- }
-
-// /**
-// * Returns the cause of this CertPathValidatorException or
-// * null if the cause is nonexistent or unknown.
-// *
-// * @return the cause of this throwable or null if the cause
-// * is nonexistent or unknown.
-// */
-// public Throwable getCause()
-// {
-// return cause;
-// }
-//
-// /**
-// * Returns a string describing this exception, including a description of
-// * the internal (wrapped) cause if there is one.
-// *
-// * @return a string representation of this
-// * CertPathValidatorException
-// */
-// public String toString()
-// {
-// StringBuffer sb = new StringBuffer();
-// String s = getMessage();
-// if (s != null)
-// {
-// sb.append(s);
-// }
-// if (getIndex() >= 0)
-// {
-// sb.append("index in certpath: ").append(getIndex()).append('\n');
-// sb.append(getCertPath());
-// }
-// return sb.toString();
-// }
-
- }
-}
diff --git a/BCCrypto/src/pkix/PkixCertPathValidatorResult.cs b/BCCrypto/src/pkix/PkixCertPathValidatorResult.cs
deleted file mode 100644
index c7d81c7..0000000
--- a/BCCrypto/src/pkix/PkixCertPathValidatorResult.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Pkix
-{
- ///
- /// Summary description for PkixCertPathValidatorResult.
- ///
- public class PkixCertPathValidatorResult
- //: ICertPathValidatorResult
- {
- private TrustAnchor trustAnchor;
- private PkixPolicyNode policyTree;
- private AsymmetricKeyParameter subjectPublicKey;
-
- public PkixPolicyNode PolicyTree
- {
- get { return this.policyTree; }
- }
-
- public TrustAnchor TrustAnchor
- {
- get { return this.trustAnchor; }
- }
-
- public AsymmetricKeyParameter SubjectPublicKey
- {
- get { return this.subjectPublicKey; }
- }
-
- public PkixCertPathValidatorResult(
- TrustAnchor trustAnchor,
- PkixPolicyNode policyTree,
- AsymmetricKeyParameter subjectPublicKey)
- {
- if (subjectPublicKey == null)
- {
- throw new NullReferenceException("subjectPublicKey must be non-null");
- }
- if (trustAnchor == null)
- {
- throw new NullReferenceException("trustAnchor must be non-null");
- }
-
- this.trustAnchor = trustAnchor;
- this.policyTree = policyTree;
- this.subjectPublicKey = subjectPublicKey;
- }
-
- public object Clone()
- {
- return new PkixCertPathValidatorResult(this.TrustAnchor, this.PolicyTree, this.SubjectPublicKey);
- }
-
- public override String ToString()
- {
- StringBuilder sB = new StringBuilder();
- sB.Append("PKIXCertPathValidatorResult: [ \n");
- sB.Append(" Trust Anchor: ").Append(this.TrustAnchor).Append('\n');
- sB.Append(" Policy Tree: ").Append(this.PolicyTree).Append('\n');
- sB.Append(" Subject Public Key: ").Append(this.SubjectPublicKey).Append("\n]");
- return sB.ToString();
- }
-
- }
-}
diff --git a/BCCrypto/src/pkix/PkixCertPathValidatorUtilities.cs b/BCCrypto/src/pkix/PkixCertPathValidatorUtilities.cs
deleted file mode 100644
index a2704a7..0000000
--- a/BCCrypto/src/pkix/PkixCertPathValidatorUtilities.cs
+++ /dev/null
@@ -1,1194 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.IsisMtt;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Date;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Extension;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Pkix
-{
- ///
- /// Summary description for PkixCertPathValidatorUtilities.
- ///
- public class PkixCertPathValidatorUtilities
- {
- private static readonly PkixCrlUtilities CrlUtilities = new PkixCrlUtilities();
-
- internal static readonly string ANY_POLICY = "2.5.29.32.0";
-
- internal static readonly string CRL_NUMBER = X509Extensions.CrlNumber.Id;
-
- ///
- /// key usage bits
- ///
- internal static readonly int KEY_CERT_SIGN = 5;
- internal static readonly int CRL_SIGN = 6;
-
- internal static readonly string[] crlReasons = new string[]
- {
- "unspecified",
- "keyCompromise",
- "cACompromise",
- "affiliationChanged",
- "superseded",
- "cessationOfOperation",
- "certificateHold",
- "unknown",
- "removeFromCRL",
- "privilegeWithdrawn",
- "aACompromise"
- };
-
- ///
- /// Search the given Set of TrustAnchor's for one that is the
- /// issuer of the given X509 certificate.
- ///
- /// the X509 certificate
- /// a Set of TrustAnchor's
- /// the TrustAnchor object if found or
- /// null if not.
- ///
- /// @exception
- internal static TrustAnchor FindTrustAnchor(
- X509Certificate cert,
- ISet trustAnchors)
- {
- IEnumerator iter = trustAnchors.GetEnumerator();
- TrustAnchor trust = null;
- AsymmetricKeyParameter trustPublicKey = null;
- Exception invalidKeyEx = null;
-
- X509CertStoreSelector certSelectX509 = new X509CertStoreSelector();
-
- try
- {
- certSelectX509.Subject = GetIssuerPrincipal(cert);
- }
- catch (IOException ex)
- {
- throw new Exception("Cannot set subject search criteria for trust anchor.", ex);
- }
-
- while (iter.MoveNext() && trust == null)
- {
- trust = (TrustAnchor) iter.Current;
- if (trust.TrustedCert != null)
- {
- if (certSelectX509.Match(trust.TrustedCert))
- {
- trustPublicKey = trust.TrustedCert.GetPublicKey();
- }
- else
- {
- trust = null;
- }
- }
- else if (trust.CAName != null && trust.CAPublicKey != null)
- {
- try
- {
- X509Name certIssuer = GetIssuerPrincipal(cert);
- X509Name caName = new X509Name(trust.CAName);
-
- if (certIssuer.Equivalent(caName, true))
- {
- trustPublicKey = trust.CAPublicKey;
- }
- else
- {
- trust = null;
- }
- }
- catch (InvalidParameterException)
- {
- trust = null;
- }
- }
- else
- {
- trust = null;
- }
-
- if (trustPublicKey != null)
- {
- try
- {
- cert.Verify(trustPublicKey);
- }
- catch (Exception ex)
- {
- invalidKeyEx = ex;
- trust = null;
- }
- }
- }
-
- if (trust == null && invalidKeyEx != null)
- {
- throw new Exception("TrustAnchor found but certificate validation failed.", invalidKeyEx);
- }
-
- return trust;
- }
-
- internal static void AddAdditionalStoresFromAltNames(
- X509Certificate cert,
- PkixParameters pkixParams)
- {
- // if in the IssuerAltName extension an URI
- // is given, add an additinal X.509 store
- if (cert.GetIssuerAlternativeNames() != null)
- {
- IEnumerator it = cert.GetIssuerAlternativeNames().GetEnumerator();
- while (it.MoveNext())
- {
- // look for URI
- IList list = (IList)it.Current;
- //if (list[0].Equals(new Integer(GeneralName.UniformResourceIdentifier)))
- if (list[0].Equals(GeneralName.UniformResourceIdentifier))
- {
- // found
- string temp = (string)list[1];
- PkixCertPathValidatorUtilities.AddAdditionalStoreFromLocation(temp, pkixParams);
- }
- }
- }
- }
-
- internal static DateTime GetValidDate(PkixParameters paramsPKIX)
- {
- DateTimeObject validDate = paramsPKIX.Date;
-
- if (validDate == null)
- return DateTime.UtcNow;
-
- return validDate.Value;
- }
-
- ///
- /// Returns the issuer of an attribute certificate or certificate.
- ///
- /// The attribute certificate or certificate.
- /// The issuer as X500Principal.
- internal static X509Name GetIssuerPrincipal(
- object cert)
- {
- if (cert is X509Certificate)
- {
- return ((X509Certificate)cert).IssuerDN;
- }
- else
- {
- return ((IX509AttributeCertificate)cert).Issuer.GetPrincipals()[0];
- }
- }
-
- internal static bool IsSelfIssued(
- X509Certificate cert)
- {
- return cert.SubjectDN.Equivalent(cert.IssuerDN, true);
- }
-
- internal static AlgorithmIdentifier GetAlgorithmIdentifier(
- AsymmetricKeyParameter key)
- {
- try
- {
- SubjectPublicKeyInfo info = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(key);
-
- return info.AlgorithmID;
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException("Subject public key cannot be decoded.", e);
- }
- }
-
- internal static bool IsAnyPolicy(
- ISet policySet)
- {
- return policySet == null || policySet.Contains(ANY_POLICY) || policySet.Count == 0;
- }
-
- internal static void AddAdditionalStoreFromLocation(
- string location,
- PkixParameters pkixParams)
- {
- if (pkixParams.IsAdditionalLocationsEnabled)
- {
- try
- {
- if (Platform.StartsWith(location, "ldap://"))
- {
- // ldap://directory.d-trust.net/CN=D-TRUST
- // Qualified CA 2003 1:PN,O=D-Trust GmbH,C=DE
- // skip "ldap://"
- location = location.Substring(7);
- // after first / baseDN starts
- string url;//, baseDN;
- int slashPos = location.IndexOf('/');
- if (slashPos != -1)
- {
- url = "ldap://" + location.Substring(0, slashPos);
-// baseDN = location.Substring(slashPos);
- }
- else
- {
- url = "ldap://" + location;
-// baseDN = nsull;
- }
-
- throw Platform.CreateNotImplementedException("LDAP cert/CRL stores");
-
- // use all purpose parameters
- //X509LDAPCertStoreParameters ldapParams = new X509LDAPCertStoreParameters.Builder(
- // url, baseDN).build();
- //pkixParams.AddAdditionalStore(X509Store.getInstance(
- // "CERTIFICATE/LDAP", ldapParams));
- //pkixParams.AddAdditionalStore(X509Store.getInstance(
- // "CRL/LDAP", ldapParams));
- //pkixParams.AddAdditionalStore(X509Store.getInstance(
- // "ATTRIBUTECERTIFICATE/LDAP", ldapParams));
- //pkixParams.AddAdditionalStore(X509Store.getInstance(
- // "CERTIFICATEPAIR/LDAP", ldapParams));
- }
- }
- catch (Exception)
- {
- // cannot happen
- throw new Exception("Exception adding X.509 stores.");
- }
- }
- }
-
- private static BigInteger GetSerialNumber(
- object cert)
- {
- if (cert is X509Certificate)
- {
- return ((X509Certificate)cert).SerialNumber;
- }
- else
- {
- return ((X509V2AttributeCertificate)cert).SerialNumber;
- }
- }
-
- //
- // policy checking
- //
-
- internal static ISet GetQualifierSet(Asn1Sequence qualifiers)
- {
- ISet pq = new HashSet();
-
- if (qualifiers == null)
- {
- return pq;
- }
-
- foreach (Asn1Encodable ae in qualifiers)
- {
- try
- {
-// pq.Add(PolicyQualifierInfo.GetInstance(Asn1Object.FromByteArray(ae.GetEncoded())));
- pq.Add(PolicyQualifierInfo.GetInstance(ae.ToAsn1Object()));
- }
- catch (IOException ex)
- {
- throw new PkixCertPathValidatorException("Policy qualifier info cannot be decoded.", ex);
- }
- }
-
- return pq;
- }
-
- internal static PkixPolicyNode RemovePolicyNode(
- PkixPolicyNode validPolicyTree,
- IList[] policyNodes,
- PkixPolicyNode _node)
- {
- PkixPolicyNode _parent = (PkixPolicyNode)_node.Parent;
-
- if (validPolicyTree == null)
- {
- return null;
- }
-
- if (_parent == null)
- {
- for (int j = 0; j < policyNodes.Length; j++)
- {
- policyNodes[j] = Platform.CreateArrayList();
- }
-
- return null;
- }
- else
- {
- _parent.RemoveChild(_node);
- RemovePolicyNodeRecurse(policyNodes, _node);
-
- return validPolicyTree;
- }
- }
-
- private static void RemovePolicyNodeRecurse(IList[] policyNodes, PkixPolicyNode _node)
- {
- policyNodes[_node.Depth].Remove(_node);
-
- if (_node.HasChildren)
- {
- foreach (PkixPolicyNode _child in _node.Children)
- {
- RemovePolicyNodeRecurse(policyNodes, _child);
- }
- }
- }
-
- internal static void PrepareNextCertB1(
- int i,
- IList[] policyNodes,
- string id_p,
- IDictionary m_idp,
- X509Certificate cert)
- {
- bool idp_found = false;
- IEnumerator nodes_i = policyNodes[i].GetEnumerator();
- while (nodes_i.MoveNext())
- {
- PkixPolicyNode node = (PkixPolicyNode)nodes_i.Current;
- if (node.ValidPolicy.Equals(id_p))
- {
- idp_found = true;
- node.ExpectedPolicies = (ISet)m_idp[id_p];
- break;
- }
- }
-
- if (!idp_found)
- {
- nodes_i = policyNodes[i].GetEnumerator();
- while (nodes_i.MoveNext())
- {
- PkixPolicyNode node = (PkixPolicyNode)nodes_i.Current;
- if (ANY_POLICY.Equals(node.ValidPolicy))
- {
- ISet pq = null;
- Asn1Sequence policies = null;
- try
- {
- policies = DerSequence.GetInstance(GetExtensionValue(cert, X509Extensions.CertificatePolicies));
- }
- catch (Exception e)
- {
- throw new Exception("Certificate policies cannot be decoded.", e);
- }
-
- IEnumerator enm = policies.GetEnumerator();
- while (enm.MoveNext())
- {
- PolicyInformation pinfo = null;
-
- try
- {
- pinfo = PolicyInformation.GetInstance(enm.Current);
- }
- catch (Exception ex)
- {
- throw new Exception("Policy information cannot be decoded.", ex);
- }
-
- if (ANY_POLICY.Equals(pinfo.PolicyIdentifier.Id))
- {
- try
- {
- pq = GetQualifierSet(pinfo.PolicyQualifiers);
- }
- catch (PkixCertPathValidatorException ex)
- {
- throw new PkixCertPathValidatorException(
- "Policy qualifier info set could not be built.", ex);
- }
- break;
- }
- }
- bool ci = false;
- ISet critExtOids = cert.GetCriticalExtensionOids();
- if (critExtOids != null)
- {
- ci = critExtOids.Contains(X509Extensions.CertificatePolicies.Id);
- }
-
- PkixPolicyNode p_node = (PkixPolicyNode)node.Parent;
- if (ANY_POLICY.Equals(p_node.ValidPolicy))
- {
- PkixPolicyNode c_node = new PkixPolicyNode(
- Platform.CreateArrayList(), i,
- (ISet)m_idp[id_p],
- p_node, pq, id_p, ci);
- p_node.AddChild(c_node);
- policyNodes[i].Add(c_node);
- }
- break;
- }
- }
- }
- }
-
- internal static PkixPolicyNode PrepareNextCertB2(
- int i,
- IList[] policyNodes,
- string id_p,
- PkixPolicyNode validPolicyTree)
- {
- int pos = 0;
-
- // Copy to avoid RemoveAt calls interfering with enumeration
- foreach (PkixPolicyNode node in Platform.CreateArrayList(policyNodes[i]))
- {
- if (node.ValidPolicy.Equals(id_p))
- {
- PkixPolicyNode p_node = (PkixPolicyNode)node.Parent;
- p_node.RemoveChild(node);
-
- // Removal of element at current iterator position not supported in C#
- //nodes_i.remove();
- policyNodes[i].RemoveAt(pos);
-
- for (int k = (i - 1); k >= 0; k--)
- {
- IList nodes = policyNodes[k];
- for (int l = 0; l < nodes.Count; l++)
- {
- PkixPolicyNode node2 = (PkixPolicyNode)nodes[l];
- if (!node2.HasChildren)
- {
- validPolicyTree = RemovePolicyNode(validPolicyTree, policyNodes, node2);
- if (validPolicyTree == null)
- break;
- }
- }
- }
- }
- else
- {
- ++pos;
- }
- }
- return validPolicyTree;
- }
-
- internal static void GetCertStatus(
- DateTime validDate,
- X509Crl crl,
- Object cert,
- CertStatus certStatus)
- {
- X509Crl bcCRL = null;
-
- try
- {
- bcCRL = new X509Crl(CertificateList.GetInstance((Asn1Sequence)Asn1Sequence.FromByteArray(crl.GetEncoded())));
- }
- catch (Exception exception)
- {
- throw new Exception("Bouncy Castle X509Crl could not be created.", exception);
- }
-
- X509CrlEntry crl_entry = (X509CrlEntry)bcCRL.GetRevokedCertificate(GetSerialNumber(cert));
-
- if (crl_entry == null)
- return;
-
- X509Name issuer = GetIssuerPrincipal(cert);
-
- if (issuer.Equivalent(crl_entry.GetCertificateIssuer(), true)
- || issuer.Equivalent(crl.IssuerDN, true))
- {
- DerEnumerated reasonCode = null;
- if (crl_entry.HasExtensions)
- {
- try
- {
- reasonCode = DerEnumerated.GetInstance(
- GetExtensionValue(crl_entry, X509Extensions.ReasonCode));
- }
- catch (Exception e)
- {
- throw new Exception(
- "Reason code CRL entry extension could not be decoded.",
- e);
- }
- }
-
- // for reason keyCompromise, caCompromise, aACompromise or
- // unspecified
- if (!(validDate.Ticks < crl_entry.RevocationDate.Ticks)
- || reasonCode == null
- || reasonCode.Value.TestBit(0)
- || reasonCode.Value.TestBit(1)
- || reasonCode.Value.TestBit(2)
- || reasonCode.Value.TestBit(8))
- {
- if (reasonCode != null) // (i) or (j) (1)
- {
- certStatus.Status = reasonCode.Value.SignValue;
- }
- else // (i) or (j) (2)
- {
- certStatus.Status = CrlReason.Unspecified;
- }
- certStatus.RevocationDate = new DateTimeObject(crl_entry.RevocationDate);
- }
- }
- }
-
- /**
- * Return the next working key inheriting DSA parameters if necessary.
- *
- * This methods inherits DSA parameters from the indexed certificate or
- * previous certificates in the certificate chain to the returned
- * PublicKey. The list is searched upwards, meaning the end
- * certificate is at position 0 and previous certificates are following.
- *
- *
- * If the indexed certificate does not contain a DSA key this method simply
- * returns the public key. If the DSA key already contains DSA parameters
- * the key is also only returned.
- *
- *
- * @param certs The certification path.
- * @param index The index of the certificate which contains the public key
- * which should be extended with DSA parameters.
- * @return The public key of the certificate in list position
- * index extended with DSA parameters if applicable.
- * @throws Exception if DSA parameters cannot be inherited.
- */
- internal static AsymmetricKeyParameter GetNextWorkingKey(
- IList certs,
- int index)
- {
- //Only X509Certificate
- X509Certificate cert = (X509Certificate)certs[index];
-
- AsymmetricKeyParameter pubKey = cert.GetPublicKey();
-
- if (!(pubKey is DsaPublicKeyParameters))
- return pubKey;
-
- DsaPublicKeyParameters dsaPubKey = (DsaPublicKeyParameters)pubKey;
-
- if (dsaPubKey.Parameters != null)
- return dsaPubKey;
-
- for (int i = index + 1; i < certs.Count; i++)
- {
- X509Certificate parentCert = (X509Certificate)certs[i];
- pubKey = parentCert.GetPublicKey();
-
- if (!(pubKey is DsaPublicKeyParameters))
- {
- throw new PkixCertPathValidatorException(
- "DSA parameters cannot be inherited from previous certificate.");
- }
-
- DsaPublicKeyParameters prevDSAPubKey = (DsaPublicKeyParameters)pubKey;
-
- if (prevDSAPubKey.Parameters == null)
- continue;
-
- DsaParameters dsaParams = prevDSAPubKey.Parameters;
-
- try
- {
- return new DsaPublicKeyParameters(dsaPubKey.Y, dsaParams);
- }
- catch (Exception exception)
- {
- throw new Exception(exception.Message);
- }
- }
-
- throw new PkixCertPathValidatorException("DSA parameters cannot be inherited from previous certificate.");
- }
-
- internal static DateTime GetValidCertDateFromValidityModel(
- PkixParameters paramsPkix,
- PkixCertPath certPath,
- int index)
- {
- if (paramsPkix.ValidityModel != PkixParameters.ChainValidityModel)
- {
- return GetValidDate(paramsPkix);
- }
-
- // if end cert use given signing/encryption/... time
- if (index <= 0)
- {
- return PkixCertPathValidatorUtilities.GetValidDate(paramsPkix);
- // else use time when previous cert was created
- }
-
- if (index - 1 == 0)
- {
- DerGeneralizedTime dateOfCertgen = null;
- try
- {
- X509Certificate cert = (X509Certificate)certPath.Certificates[index - 1];
- Asn1OctetString extVal = cert.GetExtensionValue(
- IsisMttObjectIdentifiers.IdIsisMttATDateOfCertGen);
- dateOfCertgen = DerGeneralizedTime.GetInstance(extVal);
- }
- catch (ArgumentException)
- {
- throw new Exception(
- "Date of cert gen extension could not be read.");
- }
- if (dateOfCertgen != null)
- {
- try
- {
- return dateOfCertgen.ToDateTime();
- }
- catch (ArgumentException e)
- {
- throw new Exception(
- "Date from date of cert gen extension could not be parsed.",
- e);
- }
- }
- }
-
- return ((X509Certificate)certPath.Certificates[index - 1]).NotBefore;
- }
-
- ///
- /// Return a Collection of all certificates or attribute certificates found
- /// in the X509Store's that are matching the certSelect criteriums.
- ///
- /// a {@link Selector} object that will be used to select
- /// the certificates
- /// a List containing only X509Store objects. These
- /// are used to search for certificates.
- /// a Collection of all found or
- /// objects.
- /// May be empty but never null.
- ///
- internal static ICollection FindCertificates(
- X509CertStoreSelector certSelect,
- IList certStores)
- {
- ISet certs = new HashSet();
-
- foreach (IX509Store certStore in certStores)
- {
- try
- {
-// certs.AddAll(certStore.GetMatches(certSelect));
- foreach (X509Certificate c in certStore.GetMatches(certSelect))
- {
- certs.Add(c);
- }
- }
- catch (Exception e)
- {
- throw new Exception("Problem while picking certificates from X.509 store.", e);
- }
- }
-
- return certs;
- }
-
- /**
- * Add the CRL issuers from the cRLIssuer field of the distribution point or
- * from the certificate if not given to the issuer criterion of the
- * selector.
- *
- * The issuerPrincipals are a collection with a single
- * X500Principal for X509Certificates. For
- * {@link X509AttributeCertificate}s the issuer may contain more than one
- * X500Principal.
- *
- *
- * @param dp The distribution point.
- * @param issuerPrincipals The issuers of the certificate or attribute
- * certificate which contains the distribution point.
- * @param selector The CRL selector.
- * @param pkixParams The PKIX parameters containing the cert stores.
- * @throws Exception if an exception occurs while processing.
- * @throws ClassCastException if issuerPrincipals does not
- * contain only X500Principals.
- */
- internal static void GetCrlIssuersFromDistributionPoint(
- DistributionPoint dp,
- ICollection issuerPrincipals,
- X509CrlStoreSelector selector,
- PkixParameters pkixParams)
- {
- IList issuers = Platform.CreateArrayList();
- // indirect CRL
- if (dp.CrlIssuer != null)
- {
- GeneralName[] genNames = dp.CrlIssuer.GetNames();
- // look for a DN
- for (int j = 0; j < genNames.Length; j++)
- {
- if (genNames[j].TagNo == GeneralName.DirectoryName)
- {
- try
- {
- issuers.Add(X509Name.GetInstance(genNames[j].Name.ToAsn1Object()));
- }
- catch (IOException e)
- {
- throw new Exception(
- "CRL issuer information from distribution point cannot be decoded.",
- e);
- }
- }
- }
- }
- else
- {
- /*
- * certificate issuer is CRL issuer, distributionPoint field MUST be
- * present.
- */
- if (dp.DistributionPointName == null)
- {
- throw new Exception(
- "CRL issuer is omitted from distribution point but no distributionPoint field present.");
- }
-
- // add and check issuer principals
- for (IEnumerator it = issuerPrincipals.GetEnumerator(); it.MoveNext(); )
- {
- issuers.Add((X509Name)it.Current);
- }
- }
- // TODO: is not found although this should correctly add the rel name. selector of Sun is buggy here or PKI test case is invalid
- // distributionPoint
- // if (dp.getDistributionPoint() != null)
- // {
- // // look for nameRelativeToCRLIssuer
- // if (dp.getDistributionPoint().getType() == DistributionPointName.NAME_RELATIVE_TO_CRL_ISSUER)
- // {
- // // append fragment to issuer, only one
- // // issuer can be there, if this is given
- // if (issuers.size() != 1)
- // {
- // throw new AnnotatedException(
- // "nameRelativeToCRLIssuer field is given but more than one CRL issuer is given.");
- // }
- // DEREncodable relName = dp.getDistributionPoint().getName();
- // Iterator it = issuers.iterator();
- // List issuersTemp = new ArrayList(issuers.size());
- // while (it.hasNext())
- // {
- // Enumeration e = null;
- // try
- // {
- // e = ASN1Sequence.getInstance(
- // new ASN1InputStream(((X500Principal) it.next())
- // .getEncoded()).readObject()).getObjects();
- // }
- // catch (IOException ex)
- // {
- // throw new AnnotatedException(
- // "Cannot decode CRL issuer information.", ex);
- // }
- // ASN1EncodableVector v = new ASN1EncodableVector();
- // while (e.hasMoreElements())
- // {
- // v.add((DEREncodable) e.nextElement());
- // }
- // v.add(relName);
- // issuersTemp.add(new X500Principal(new DERSequence(v)
- // .getDEREncoded()));
- // }
- // issuers.clear();
- // issuers.addAll(issuersTemp);
- // }
- // }
-
- selector.Issuers = issuers;
- }
-
- /**
- * Fetches complete CRLs according to RFC 3280.
- *
- * @param dp The distribution point for which the complete CRL
- * @param cert The X509Certificate or
- * {@link org.bouncycastle.x509.X509AttributeCertificate} for
- * which the CRL should be searched.
- * @param currentDate The date for which the delta CRLs must be valid.
- * @param paramsPKIX The extended PKIX parameters.
- * @return A Set of X509CRLs with complete
- * CRLs.
- * @throws Exception if an exception occurs while picking the CRLs
- * or no CRLs are found.
- */
- internal static ISet GetCompleteCrls(
- DistributionPoint dp,
- object cert,
- DateTime currentDate,
- PkixParameters paramsPKIX)
- {
- X509CrlStoreSelector crlselect = new X509CrlStoreSelector();
- try
- {
- ISet issuers = new HashSet();
- if (cert is X509V2AttributeCertificate)
- {
- issuers.Add(((X509V2AttributeCertificate)cert)
- .Issuer.GetPrincipals()[0]);
- }
- else
- {
- issuers.Add(GetIssuerPrincipal(cert));
- }
- PkixCertPathValidatorUtilities.GetCrlIssuersFromDistributionPoint(dp, issuers, crlselect, paramsPKIX);
- }
- catch (Exception e)
- {
- throw new Exception("Could not get issuer information from distribution point.", e);
- }
-
- if (cert is X509Certificate)
- {
- crlselect.CertificateChecking = (X509Certificate)cert;
- }
- else if (cert is X509V2AttributeCertificate)
- {
- crlselect.AttrCertChecking = (IX509AttributeCertificate)cert;
- }
-
- crlselect.CompleteCrlEnabled = true;
- ISet crls = CrlUtilities.FindCrls(crlselect, paramsPKIX, currentDate);
-
- if (crls.IsEmpty)
- {
- if (cert is IX509AttributeCertificate)
- {
- IX509AttributeCertificate aCert = (IX509AttributeCertificate)cert;
-
- throw new Exception("No CRLs found for issuer \"" + aCert.Issuer.GetPrincipals()[0] + "\"");
- }
- else
- {
- X509Certificate xCert = (X509Certificate)cert;
-
- throw new Exception("No CRLs found for issuer \"" + xCert.IssuerDN + "\"");
- }
- }
-
- return crls;
- }
-
- /**
- * Fetches delta CRLs according to RFC 3280 section 5.2.4.
- *
- * @param currentDate The date for which the delta CRLs must be valid.
- * @param paramsPKIX The extended PKIX parameters.
- * @param completeCRL The complete CRL the delta CRL is for.
- * @return A Set of X509CRLs with delta CRLs.
- * @throws Exception if an exception occurs while picking the delta
- * CRLs.
- */
- internal static ISet GetDeltaCrls(
- DateTime currentDate,
- PkixParameters paramsPKIX,
- X509Crl completeCRL)
- {
- X509CrlStoreSelector deltaSelect = new X509CrlStoreSelector();
-
- // 5.2.4 (a)
- try
- {
- IList deltaSelectIssuer = Platform.CreateArrayList();
- deltaSelectIssuer.Add(completeCRL.IssuerDN);
- deltaSelect.Issuers = deltaSelectIssuer;
- }
- catch (IOException e)
- {
- throw new Exception("Cannot extract issuer from CRL.", e);
- }
-
- BigInteger completeCRLNumber = null;
- try
- {
- Asn1Object asn1Object = GetExtensionValue(completeCRL, X509Extensions.CrlNumber);
- if (asn1Object != null)
- {
- completeCRLNumber = CrlNumber.GetInstance(asn1Object).PositiveValue;
- }
- }
- catch (Exception e)
- {
- throw new Exception(
- "CRL number extension could not be extracted from CRL.", e);
- }
-
- // 5.2.4 (b)
- byte[] idp = null;
-
- try
- {
- Asn1Object obj = GetExtensionValue(completeCRL, X509Extensions.IssuingDistributionPoint);
- if (obj != null)
- {
- idp = obj.GetDerEncoded();
- }
- }
- catch (Exception e)
- {
- throw new Exception(
- "Issuing distribution point extension value could not be read.",
- e);
- }
-
- // 5.2.4 (d)
-
- deltaSelect.MinCrlNumber = (completeCRLNumber == null)
- ? null
- : completeCRLNumber.Add(BigInteger.One);
-
- deltaSelect.IssuingDistributionPoint = idp;
- deltaSelect.IssuingDistributionPointEnabled = true;
-
- // 5.2.4 (c)
- deltaSelect.MaxBaseCrlNumber = completeCRLNumber;
-
- // find delta CRLs
- ISet temp = CrlUtilities.FindCrls(deltaSelect, paramsPKIX, currentDate);
-
- ISet result = new HashSet();
-
- foreach (X509Crl crl in temp)
- {
- if (isDeltaCrl(crl))
- {
- result.Add(crl);
- }
- }
-
- return result;
- }
-
- private static bool isDeltaCrl(
- X509Crl crl)
- {
- ISet critical = crl.GetCriticalExtensionOids();
-
- return critical.Contains(X509Extensions.DeltaCrlIndicator.Id);
- }
-
- internal static ICollection FindCertificates(
- X509AttrCertStoreSelector certSelect,
- IList certStores)
- {
- ISet certs = new HashSet();
-
- foreach (IX509Store certStore in certStores)
- {
- try
- {
-// certs.AddAll(certStore.GetMatches(certSelect));
- foreach (X509V2AttributeCertificate ac in certStore.GetMatches(certSelect))
- {
- certs.Add(ac);
- }
- }
- catch (Exception e)
- {
- throw new Exception(
- "Problem while picking certificates from X.509 store.", e);
- }
- }
-
- return certs;
- }
-
- internal static void AddAdditionalStoresFromCrlDistributionPoint(
- CrlDistPoint crldp,
- PkixParameters pkixParams)
- {
- if (crldp != null)
- {
- DistributionPoint[] dps = null;
- try
- {
- dps = crldp.GetDistributionPoints();
- }
- catch (Exception e)
- {
- throw new Exception(
- "Distribution points could not be read.", e);
- }
- for (int i = 0; i < dps.Length; i++)
- {
- DistributionPointName dpn = dps[i].DistributionPointName;
- // look for URIs in fullName
- if (dpn != null)
- {
- if (dpn.PointType == DistributionPointName.FullName)
- {
- GeneralName[] genNames = GeneralNames.GetInstance(
- dpn.Name).GetNames();
- // look for an URI
- for (int j = 0; j < genNames.Length; j++)
- {
- if (genNames[j].TagNo == GeneralName.UniformResourceIdentifier)
- {
- string location = DerIA5String.GetInstance(
- genNames[j].Name).GetString();
- PkixCertPathValidatorUtilities.AddAdditionalStoreFromLocation(
- location, pkixParams);
- }
- }
- }
- }
- }
- }
- }
-
- internal static bool ProcessCertD1i(
- int index,
- IList[] policyNodes,
- DerObjectIdentifier pOid,
- ISet pq)
- {
- IList policyNodeVec = policyNodes[index - 1];
-
- for (int j = 0; j < policyNodeVec.Count; j++)
- {
- PkixPolicyNode node = (PkixPolicyNode)policyNodeVec[j];
- ISet expectedPolicies = node.ExpectedPolicies;
-
- if (expectedPolicies.Contains(pOid.Id))
- {
- ISet childExpectedPolicies = new HashSet();
- childExpectedPolicies.Add(pOid.Id);
-
- PkixPolicyNode child = new PkixPolicyNode(Platform.CreateArrayList(),
- index,
- childExpectedPolicies,
- node,
- pq,
- pOid.Id,
- false);
- node.AddChild(child);
- policyNodes[index].Add(child);
-
- return true;
- }
- }
-
- return false;
- }
-
- internal static void ProcessCertD1ii(
- int index,
- IList[] policyNodes,
- DerObjectIdentifier _poid,
- ISet _pq)
- {
- IList policyNodeVec = policyNodes[index - 1];
-
- for (int j = 0; j < policyNodeVec.Count; j++)
- {
- PkixPolicyNode _node = (PkixPolicyNode)policyNodeVec[j];
-
- if (ANY_POLICY.Equals(_node.ValidPolicy))
- {
- ISet _childExpectedPolicies = new HashSet();
- _childExpectedPolicies.Add(_poid.Id);
-
- PkixPolicyNode _child = new PkixPolicyNode(Platform.CreateArrayList(),
- index,
- _childExpectedPolicies,
- _node,
- _pq,
- _poid.Id,
- false);
- _node.AddChild(_child);
- policyNodes[index].Add(_child);
- return;
- }
- }
- }
-
- /**
- * Find the issuer certificates of a given certificate.
- *
- * @param cert
- * The certificate for which an issuer should be found.
- * @param pkixParams
- * @return A Collection object containing the issuer
- * X509Certificates. Never null.
- *
- * @exception Exception
- * if an error occurs.
- */
- internal static ICollection FindIssuerCerts(
- X509Certificate cert,
- PkixBuilderParameters pkixParams)
- {
- X509CertStoreSelector certSelect = new X509CertStoreSelector();
- ISet certs = new HashSet();
- try
- {
- certSelect.Subject = cert.IssuerDN;
- }
- catch (IOException ex)
- {
- throw new Exception(
- "Subject criteria for certificate selector to find issuer certificate could not be set.", ex);
- }
-
- try
- {
- certs.AddAll(PkixCertPathValidatorUtilities.FindCertificates(certSelect, pkixParams.GetStores()));
- certs.AddAll(PkixCertPathValidatorUtilities.FindCertificates(certSelect, pkixParams.GetAdditionalStores()));
- }
- catch (Exception e)
- {
- throw new Exception("Issuer certificate cannot be searched.", e);
- }
-
- return certs;
- }
-
- ///
- /// Extract the value of the given extension, if it exists.
- ///
- /// The extension object.
- /// The object identifier to obtain.
- /// Asn1Object
- /// if the extension cannot be read.
- internal static Asn1Object GetExtensionValue(
- IX509Extension ext,
- DerObjectIdentifier oid)
- {
- Asn1OctetString bytes = ext.GetExtensionValue(oid);
-
- if (bytes == null)
- return null;
-
- return X509ExtensionUtilities.FromExtensionValue(bytes);
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixCrlUtilities.cs b/BCCrypto/src/pkix/PkixCrlUtilities.cs
deleted file mode 100644
index c386b8a..0000000
--- a/BCCrypto/src/pkix/PkixCrlUtilities.cs
+++ /dev/null
@@ -1,114 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Pkix
-{
- public class PkixCrlUtilities
- {
- public virtual ISet FindCrls(X509CrlStoreSelector crlselect, PkixParameters paramsPkix, DateTime currentDate)
- {
- ISet initialSet = new HashSet();
-
- // get complete CRL(s)
- try
- {
- initialSet.AddAll(FindCrls(crlselect, paramsPkix.GetAdditionalStores()));
- initialSet.AddAll(FindCrls(crlselect, paramsPkix.GetStores()));
- }
- catch (Exception e)
- {
- throw new Exception("Exception obtaining complete CRLs.", e);
- }
-
- ISet finalSet = new HashSet();
- DateTime validityDate = currentDate;
-
- if (paramsPkix.Date != null)
- {
- validityDate = paramsPkix.Date.Value;
- }
-
- // based on RFC 5280 6.3.3
- foreach (X509Crl crl in initialSet)
- {
- if (crl.NextUpdate.Value.CompareTo(validityDate) > 0)
- {
- X509Certificate cert = crlselect.CertificateChecking;
-
- if (cert != null)
- {
- if (crl.ThisUpdate.CompareTo(cert.NotAfter) < 0)
- {
- finalSet.Add(crl);
- }
- }
- else
- {
- finalSet.Add(crl);
- }
- }
- }
-
- return finalSet;
- }
-
- public virtual ISet FindCrls(X509CrlStoreSelector crlselect, PkixParameters paramsPkix)
- {
- ISet completeSet = new HashSet();
-
- // get complete CRL(s)
- try
- {
- completeSet.AddAll(FindCrls(crlselect, paramsPkix.GetStores()));
- }
- catch (Exception e)
- {
- throw new Exception("Exception obtaining complete CRLs.", e);
- }
-
- return completeSet;
- }
-
- ///
- /// crl checking
- /// Return a Collection of all CRLs found in the X509Store's that are
- /// matching the crlSelect criteriums.
- ///
- /// a {@link X509CRLStoreSelector} object that will be used
- /// to select the CRLs
- /// a List containing only {@link org.bouncycastle.x509.X509Store
- /// X509Store} objects. These are used to search for CRLs
- /// a Collection of all found {@link X509CRL X509CRL} objects. May be
- /// empty but never null.
- ///
- private ICollection FindCrls(X509CrlStoreSelector crlSelect, IList crlStores)
- {
- ISet crls = new HashSet();
-
- Exception lastException = null;
- bool foundValidStore = false;
-
- foreach (IX509Store store in crlStores)
- {
- try
- {
- crls.AddAll(store.GetMatches(crlSelect));
- foundValidStore = true;
- }
- catch (X509StoreException e)
- {
- lastException = new Exception("Exception searching in X.509 CRL store.", e);
- }
- }
-
- if (!foundValidStore && lastException != null)
- throw lastException;
-
- return crls;
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixNameConstraintValidator.cs b/BCCrypto/src/pkix/PkixNameConstraintValidator.cs
deleted file mode 100644
index f4ae739..0000000
--- a/BCCrypto/src/pkix/PkixNameConstraintValidator.cs
+++ /dev/null
@@ -1,1939 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Pkix
-{
- public class PkixNameConstraintValidator
- {
- private ISet excludedSubtreesDN = new HashSet();
-
- private ISet excludedSubtreesDNS = new HashSet();
-
- private ISet excludedSubtreesEmail = new HashSet();
-
- private ISet excludedSubtreesURI = new HashSet();
-
- private ISet excludedSubtreesIP = new HashSet();
-
- private ISet permittedSubtreesDN;
-
- private ISet permittedSubtreesDNS;
-
- private ISet permittedSubtreesEmail;
-
- private ISet permittedSubtreesURI;
-
- private ISet permittedSubtreesIP;
-
- public PkixNameConstraintValidator()
- {
- }
-
- private static bool WithinDNSubtree(
- Asn1Sequence dns,
- Asn1Sequence subtree)
- {
- if (subtree.Count < 1)
- {
- return false;
- }
-
- if (subtree.Count > dns.Count)
- {
- return false;
- }
-
- for (int j = subtree.Count - 1; j >= 0; j--)
- {
- if (!(subtree[j].Equals(dns[j])))
- {
- return false;
- }
- }
-
- return true;
- }
-
- public void CheckPermittedDN(Asn1Sequence dns)
- //throws PkixNameConstraintValidatorException
- {
- CheckPermittedDN(permittedSubtreesDN, dns);
- }
-
- public void CheckExcludedDN(Asn1Sequence dns)
- //throws PkixNameConstraintValidatorException
- {
- CheckExcludedDN(excludedSubtreesDN, dns);
- }
-
- private void CheckPermittedDN(ISet permitted, Asn1Sequence dns)
- //throws PkixNameConstraintValidatorException
- {
- if (permitted == null)
- {
- return;
- }
-
- if ((permitted.Count == 0) && dns.Count == 0)
- {
- return;
- }
-
- IEnumerator it = permitted.GetEnumerator();
-
- while (it.MoveNext())
- {
- Asn1Sequence subtree = (Asn1Sequence)it.Current;
-
- if (WithinDNSubtree(dns, subtree))
- {
- return;
- }
- }
-
- throw new PkixNameConstraintValidatorException(
- "Subject distinguished name is not from a permitted subtree");
- }
-
- private void CheckExcludedDN(ISet excluded, Asn1Sequence dns)
- //throws PkixNameConstraintValidatorException
- {
- if (excluded.IsEmpty)
- {
- return;
- }
-
- IEnumerator it = excluded.GetEnumerator();
-
- while (it.MoveNext())
- {
- Asn1Sequence subtree = (Asn1Sequence)it.Current;
-
- if (WithinDNSubtree(dns, subtree))
- {
- throw new PkixNameConstraintValidatorException(
- "Subject distinguished name is from an excluded subtree");
- }
- }
- }
-
- private ISet IntersectDN(ISet permitted, ISet dns)
- {
- ISet intersect = new HashSet();
- for (IEnumerator it = dns.GetEnumerator(); it.MoveNext(); )
- {
- Asn1Sequence dn = Asn1Sequence.GetInstance(((GeneralSubtree)it
- .Current).Base.Name.ToAsn1Object());
- if (permitted == null)
- {
- if (dn != null)
- {
- intersect.Add(dn);
- }
- }
- else
- {
- IEnumerator _iter = permitted.GetEnumerator();
- while (_iter.MoveNext())
- {
- Asn1Sequence subtree = (Asn1Sequence)_iter.Current;
-
- if (WithinDNSubtree(dn, subtree))
- {
- intersect.Add(dn);
- }
- else if (WithinDNSubtree(subtree, dn))
- {
- intersect.Add(subtree);
- }
- }
- }
- }
- return intersect;
- }
-
- private ISet UnionDN(ISet excluded, Asn1Sequence dn)
- {
- if (excluded.IsEmpty)
- {
- if (dn == null)
- {
- return excluded;
- }
- excluded.Add(dn);
-
- return excluded;
- }
- else
- {
- ISet intersect = new HashSet();
-
- IEnumerator it = excluded.GetEnumerator();
- while (it.MoveNext())
- {
- Asn1Sequence subtree = (Asn1Sequence)it.Current;
-
- if (WithinDNSubtree(dn, subtree))
- {
- intersect.Add(subtree);
- }
- else if (WithinDNSubtree(subtree, dn))
- {
- intersect.Add(dn);
- }
- else
- {
- intersect.Add(subtree);
- intersect.Add(dn);
- }
- }
-
- return intersect;
- }
- }
-
- private ISet IntersectEmail(ISet permitted, ISet emails)
- {
- ISet intersect = new HashSet();
- for (IEnumerator it = emails.GetEnumerator(); it.MoveNext(); )
- {
- String email = ExtractNameAsString(((GeneralSubtree)it.Current)
- .Base);
-
- if (permitted == null)
- {
- if (email != null)
- {
- intersect.Add(email);
- }
- }
- else
- {
- IEnumerator it2 = permitted.GetEnumerator();
- while (it2.MoveNext())
- {
- String _permitted = (String)it2.Current;
-
- intersectEmail(email, _permitted, intersect);
- }
- }
- }
- return intersect;
- }
-
- private ISet UnionEmail(ISet excluded, String email)
- {
- if (excluded.IsEmpty)
- {
- if (email == null)
- {
- return excluded;
- }
- excluded.Add(email);
- return excluded;
- }
- else
- {
- ISet union = new HashSet();
-
- IEnumerator it = excluded.GetEnumerator();
- while (it.MoveNext())
- {
- String _excluded = (String)it.Current;
-
- unionEmail(_excluded, email, union);
- }
-
- return union;
- }
- }
-
- /**
- * Returns the intersection of the permitted IP ranges in
- * permitted with ip.
- *
- * @param permitted A Set of permitted IP addresses with
- * their subnet mask as byte arrays.
- * @param ips The IP address with its subnet mask.
- * @return The Set of permitted IP ranges intersected with
- * ip.
- */
- private ISet IntersectIP(ISet permitted, ISet ips)
- {
- ISet intersect = new HashSet();
- for (IEnumerator it = ips.GetEnumerator(); it.MoveNext(); )
- {
- byte[] ip = Asn1OctetString.GetInstance(
- ((GeneralSubtree)it.Current).Base.Name).GetOctets();
- if (permitted == null)
- {
- if (ip != null)
- {
- intersect.Add(ip);
- }
- }
- else
- {
- IEnumerator it2 = permitted.GetEnumerator();
- while (it2.MoveNext())
- {
- byte[] _permitted = (byte[])it2.Current;
- intersect.AddAll(IntersectIPRange(_permitted, ip));
- }
- }
- }
- return intersect;
- }
-
- /**
- * Returns the union of the excluded IP ranges in excluded
- * with ip.
- *
- * @param excluded A Set of excluded IP addresses with their
- * subnet mask as byte arrays.
- * @param ip The IP address with its subnet mask.
- * @return The Set of excluded IP ranges unified with
- * ip as byte arrays.
- */
- private ISet UnionIP(ISet excluded, byte[] ip)
- {
- if (excluded.IsEmpty)
- {
- if (ip == null)
- {
- return excluded;
- }
- excluded.Add(ip);
-
- return excluded;
- }
- else
- {
- ISet union = new HashSet();
-
- IEnumerator it = excluded.GetEnumerator();
- while (it.MoveNext())
- {
- byte[] _excluded = (byte[])it.Current;
- union.AddAll(UnionIPRange(_excluded, ip));
- }
-
- return union;
- }
- }
-
- /**
- * Calculates the union if two IP ranges.
- *
- * @param ipWithSubmask1 The first IP address with its subnet mask.
- * @param ipWithSubmask2 The second IP address with its subnet mask.
- * @return A Set with the union of both addresses.
- */
- private ISet UnionIPRange(byte[] ipWithSubmask1, byte[] ipWithSubmask2)
- {
- ISet set = new HashSet();
-
- // difficult, adding always all IPs is not wrong
- if (Org.BouncyCastle.Utilities.Arrays.AreEqual(ipWithSubmask1, ipWithSubmask2))
- {
- set.Add(ipWithSubmask1);
- }
- else
- {
- set.Add(ipWithSubmask1);
- set.Add(ipWithSubmask2);
- }
- return set;
- }
-
- /**
- * Calculates the interesction if two IP ranges.
- *
- * @param ipWithSubmask1 The first IP address with its subnet mask.
- * @param ipWithSubmask2 The second IP address with its subnet mask.
- * @return A Set with the single IP address with its subnet
- * mask as a byte array or an empty Set.
- */
- private ISet IntersectIPRange(byte[] ipWithSubmask1, byte[] ipWithSubmask2)
- {
- if (ipWithSubmask1.Length != ipWithSubmask2.Length)
- {
- //Collections.EMPTY_SET;
- return new HashSet();
- }
-
- byte[][] temp = ExtractIPsAndSubnetMasks(ipWithSubmask1, ipWithSubmask2);
- byte[] ip1 = temp[0];
- byte[] subnetmask1 = temp[1];
- byte[] ip2 = temp[2];
- byte[] subnetmask2 = temp[3];
-
- byte[][] minMax = MinMaxIPs(ip1, subnetmask1, ip2, subnetmask2);
- byte[] min;
- byte[] max;
- max = Min(minMax[1], minMax[3]);
- min = Max(minMax[0], minMax[2]);
-
- // minimum IP address must be bigger than max
- if (CompareTo(min, max) == 1)
- {
- //return Collections.EMPTY_SET;
- return new HashSet();
- }
- // OR keeps all significant bits
- byte[] ip = Or(minMax[0], minMax[2]);
- byte[] subnetmask = Or(subnetmask1, subnetmask2);
-
- //return new HashSet( ICollectionsingleton(IpWithSubnetMask(ip, subnetmask));
- ISet hs = new HashSet();
- hs.Add(IpWithSubnetMask(ip, subnetmask));
-
- return hs;
- }
-
- /**
- * Concatenates the IP address with its subnet mask.
- *
- * @param ip The IP address.
- * @param subnetMask Its subnet mask.
- * @return The concatenated IP address with its subnet mask.
- */
- private byte[] IpWithSubnetMask(byte[] ip, byte[] subnetMask)
- {
- int ipLength = ip.Length;
- byte[] temp = new byte[ipLength * 2];
- Array.Copy(ip, 0, temp, 0, ipLength);
- Array.Copy(subnetMask, 0, temp, ipLength, ipLength);
- return temp;
- }
-
- /**
- * Splits the IP addresses and their subnet mask.
- *
- * @param ipWithSubmask1 The first IP address with the subnet mask.
- * @param ipWithSubmask2 The second IP address with the subnet mask.
- * @return An array with two elements. Each element contains the IP address
- * and the subnet mask in this order.
- */
- private byte[][] ExtractIPsAndSubnetMasks(
- byte[] ipWithSubmask1,
- byte[] ipWithSubmask2)
- {
- int ipLength = ipWithSubmask1.Length / 2;
- byte[] ip1 = new byte[ipLength];
- byte[] subnetmask1 = new byte[ipLength];
- Array.Copy(ipWithSubmask1, 0, ip1, 0, ipLength);
- Array.Copy(ipWithSubmask1, ipLength, subnetmask1, 0, ipLength);
-
- byte[] ip2 = new byte[ipLength];
- byte[] subnetmask2 = new byte[ipLength];
- Array.Copy(ipWithSubmask2, 0, ip2, 0, ipLength);
- Array.Copy(ipWithSubmask2, ipLength, subnetmask2, 0, ipLength);
- return new byte[][]
- {ip1, subnetmask1, ip2, subnetmask2};
- }
-
- /**
- * Based on the two IP addresses and their subnet masks the IP range is
- * computed for each IP address - subnet mask pair and returned as the
- * minimum IP address and the maximum address of the range.
- *
- * @param ip1 The first IP address.
- * @param subnetmask1 The subnet mask of the first IP address.
- * @param ip2 The second IP address.
- * @param subnetmask2 The subnet mask of the second IP address.
- * @return A array with two elements. The first/second element contains the
- * min and max IP address of the first/second IP address and its
- * subnet mask.
- */
- private byte[][] MinMaxIPs(
- byte[] ip1,
- byte[] subnetmask1,
- byte[] ip2,
- byte[] subnetmask2)
- {
- int ipLength = ip1.Length;
- byte[] min1 = new byte[ipLength];
- byte[] max1 = new byte[ipLength];
-
- byte[] min2 = new byte[ipLength];
- byte[] max2 = new byte[ipLength];
-
- for (int i = 0; i < ipLength; i++)
- {
- min1[i] = (byte)(ip1[i] & subnetmask1[i]);
- max1[i] = (byte)(ip1[i] & subnetmask1[i] | ~subnetmask1[i]);
-
- min2[i] = (byte)(ip2[i] & subnetmask2[i]);
- max2[i] = (byte)(ip2[i] & subnetmask2[i] | ~subnetmask2[i]);
- }
-
- return new byte[][] { min1, max1, min2, max2 };
- }
-
- private void CheckPermittedEmail(ISet permitted, String email)
- //throws PkixNameConstraintValidatorException
- {
- if (permitted == null)
- {
- return;
- }
-
- IEnumerator it = permitted.GetEnumerator();
-
- while (it.MoveNext())
- {
- String str = ((String)it.Current);
-
- if (EmailIsConstrained(email, str))
- {
- return;
- }
- }
-
- if (email.Length == 0 && permitted.Count == 0)
- {
- return;
- }
-
- throw new PkixNameConstraintValidatorException(
- "Subject email address is not from a permitted subtree.");
- }
-
- private void CheckExcludedEmail(ISet excluded, String email)
- //throws PkixNameConstraintValidatorException
- {
- if (excluded.IsEmpty)
- {
- return;
- }
-
- IEnumerator it = excluded.GetEnumerator();
-
- while (it.MoveNext())
- {
- String str = (String)it.Current;
-
- if (EmailIsConstrained(email, str))
- {
- throw new PkixNameConstraintValidatorException(
- "Email address is from an excluded subtree.");
- }
- }
- }
-
- /**
- * Checks if the IP ip is included in the permitted ISet
- * permitted.
- *
- * @param permitted A Set of permitted IP addresses with
- * their subnet mask as byte arrays.
- * @param ip The IP address.
- * @throws PkixNameConstraintValidatorException
- * if the IP is not permitted.
- */
- private void CheckPermittedIP(ISet permitted, byte[] ip)
- //throws PkixNameConstraintValidatorException
- {
- if (permitted == null)
- {
- return;
- }
-
- IEnumerator it = permitted.GetEnumerator();
-
- while (it.MoveNext())
- {
- byte[] ipWithSubnet = (byte[])it.Current;
-
- if (IsIPConstrained(ip, ipWithSubnet))
- {
- return;
- }
- }
- if (ip.Length == 0 && permitted.Count == 0)
- {
- return;
- }
- throw new PkixNameConstraintValidatorException(
- "IP is not from a permitted subtree.");
- }
-
- /**
- * Checks if the IP ip is included in the excluded ISet
- * excluded.
- *
- * @param excluded A Set of excluded IP addresses with their
- * subnet mask as byte arrays.
- * @param ip The IP address.
- * @throws PkixNameConstraintValidatorException
- * if the IP is excluded.
- */
- private void checkExcludedIP(ISet excluded, byte[] ip)
- //throws PkixNameConstraintValidatorException
- {
- if (excluded.IsEmpty)
- {
- return;
- }
-
- IEnumerator it = excluded.GetEnumerator();
-
- while (it.MoveNext())
- {
- byte[] ipWithSubnet = (byte[])it.Current;
-
- if (IsIPConstrained(ip, ipWithSubnet))
- {
- throw new PkixNameConstraintValidatorException(
- "IP is from an excluded subtree.");
- }
- }
- }
-
- /**
- * Checks if the IP address ip is constrained by
- * constraint.
- *
- * @param ip The IP address.
- * @param constraint The constraint. This is an IP address concatenated with
- * its subnetmask.
- * @return true if constrained, false
- * otherwise.
- */
- private bool IsIPConstrained(byte[] ip, byte[] constraint)
- {
- int ipLength = ip.Length;
-
- if (ipLength != (constraint.Length / 2))
- {
- return false;
- }
-
- byte[] subnetMask = new byte[ipLength];
- Array.Copy(constraint, ipLength, subnetMask, 0, ipLength);
-
- byte[] permittedSubnetAddress = new byte[ipLength];
-
- byte[] ipSubnetAddress = new byte[ipLength];
-
- // the resulting IP address by applying the subnet mask
- for (int i = 0; i < ipLength; i++)
- {
- permittedSubnetAddress[i] = (byte)(constraint[i] & subnetMask[i]);
- ipSubnetAddress[i] = (byte)(ip[i] & subnetMask[i]);
- }
-
- return Org.BouncyCastle.Utilities.Arrays.AreEqual(permittedSubnetAddress, ipSubnetAddress);
- }
-
- private bool EmailIsConstrained(String email, String constraint)
- {
- String sub = email.Substring(email.IndexOf('@') + 1);
- // a particular mailbox
- if (constraint.IndexOf('@') != -1)
- {
- if (Platform.ToUpperInvariant(email).Equals(Platform.ToUpperInvariant(constraint)))
- {
- return true;
- }
- }
- // on particular host
- else if (!(constraint[0].Equals('.')))
- {
- if (Platform.ToUpperInvariant(sub).Equals(Platform.ToUpperInvariant(constraint)))
- {
- return true;
- }
- }
- // address in sub domain
- else if (WithinDomain(sub, constraint))
- {
- return true;
- }
- return false;
- }
-
- private bool WithinDomain(String testDomain, String domain)
- {
- String tempDomain = domain;
- if (Platform.StartsWith(tempDomain, "."))
- {
- tempDomain = tempDomain.Substring(1);
- }
- String[] domainParts = tempDomain.Split('.'); // Strings.split(tempDomain, '.');
- String[] testDomainParts = testDomain.Split('.'); // Strings.split(testDomain, '.');
-
- // must have at least one subdomain
- if (testDomainParts.Length <= domainParts.Length)
- {
- return false;
- }
-
- int d = testDomainParts.Length - domainParts.Length;
- for (int i = -1; i < domainParts.Length; i++)
- {
- if (i == -1)
- {
- if (testDomainParts[i + d].Equals(""))
- {
- return false;
- }
- }
- else if (!Platform.EqualsIgnoreCase(testDomainParts[i + d], domainParts[i]))
- {
- return false;
- }
- }
- return true;
- }
-
- private void CheckPermittedDNS(ISet permitted, String dns)
- //throws PkixNameConstraintValidatorException
- {
- if (permitted == null)
- {
- return;
- }
-
- IEnumerator it = permitted.GetEnumerator();
-
- while (it.MoveNext())
- {
- String str = ((String)it.Current);
-
- // is sub domain
- if (WithinDomain(dns, str)
- || Platform.ToUpperInvariant(dns).Equals(Platform.ToUpperInvariant(str)))
- {
- return;
- }
- }
- if (dns.Length == 0 && permitted.Count == 0)
- {
- return;
- }
- throw new PkixNameConstraintValidatorException(
- "DNS is not from a permitted subtree.");
- }
-
- private void checkExcludedDNS(ISet excluded, String dns)
- // throws PkixNameConstraintValidatorException
- {
- if (excluded.IsEmpty)
- {
- return;
- }
-
- IEnumerator it = excluded.GetEnumerator();
-
- while (it.MoveNext())
- {
- String str = ((String)it.Current);
-
- // is sub domain or the same
- if (WithinDomain(dns, str) || Platform.EqualsIgnoreCase(dns, str))
- {
- throw new PkixNameConstraintValidatorException(
- "DNS is from an excluded subtree.");
- }
- }
- }
-
- /**
- * The common part of email1 and email2 is
- * added to the union union. If email1 and
- * email2 have nothing in common they are added both.
- *
- * @param email1 Email address constraint 1.
- * @param email2 Email address constraint 2.
- * @param union The union.
- */
- private void unionEmail(String email1, String email2, ISet union)
- {
- // email1 is a particular address
- if (email1.IndexOf('@') != -1)
- {
- String _sub = email1.Substring(email1.IndexOf('@') + 1);
- // both are a particular mailbox
- if (email2.IndexOf('@') != -1)
- {
- if (Platform.EqualsIgnoreCase(email1, email2))
- {
- union.Add(email1);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- // email2 specifies a domain
- else if (Platform.StartsWith(email2, "."))
- {
- if (WithinDomain(_sub, email2))
- {
- union.Add(email2);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- // email2 specifies a particular host
- else
- {
- if (Platform.EqualsIgnoreCase(_sub, email2))
- {
- union.Add(email2);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- }
- // email1 specifies a domain
- else if (Platform.StartsWith(email1, "."))
- {
- if (email2.IndexOf('@') != -1)
- {
- String _sub = email2.Substring(email1.IndexOf('@') + 1);
- if (WithinDomain(_sub, email1))
- {
- union.Add(email1);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- // email2 specifies a domain
- else if (Platform.StartsWith(email2, "."))
- {
- if (WithinDomain(email1, email2) || Platform.EqualsIgnoreCase(email1, email2))
- {
- union.Add(email2);
- }
- else if (WithinDomain(email2, email1))
- {
- union.Add(email1);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- else
- {
- if (WithinDomain(email2, email1))
- {
- union.Add(email1);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- }
- // email specifies a host
- else
- {
- if (email2.IndexOf('@') != -1)
- {
- String _sub = email2.Substring(email1.IndexOf('@') + 1);
- if (Platform.EqualsIgnoreCase(_sub, email1))
- {
- union.Add(email1);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- // email2 specifies a domain
- else if (Platform.StartsWith(email2, "."))
- {
- if (WithinDomain(email1, email2))
- {
- union.Add(email2);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- // email2 specifies a particular host
- else
- {
- if (Platform.EqualsIgnoreCase(email1, email2))
- {
- union.Add(email1);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- }
- }
-
- private void unionURI(String email1, String email2, ISet union)
- {
- // email1 is a particular address
- if (email1.IndexOf('@') != -1)
- {
- String _sub = email1.Substring(email1.IndexOf('@') + 1);
- // both are a particular mailbox
- if (email2.IndexOf('@') != -1)
- {
- if (Platform.EqualsIgnoreCase(email1, email2))
- {
- union.Add(email1);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- // email2 specifies a domain
- else if (Platform.StartsWith(email2, "."))
- {
- if (WithinDomain(_sub, email2))
- {
- union.Add(email2);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- // email2 specifies a particular host
- else
- {
- if (Platform.EqualsIgnoreCase(_sub, email2))
- {
- union.Add(email2);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
-
- }
- }
- }
- // email1 specifies a domain
- else if (Platform.StartsWith(email1, "."))
- {
- if (email2.IndexOf('@') != -1)
- {
- String _sub = email2.Substring(email1.IndexOf('@') + 1);
- if (WithinDomain(_sub, email1))
- {
- union.Add(email1);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- // email2 specifies a domain
- else if (Platform.StartsWith(email2, "."))
- {
- if (WithinDomain(email1, email2) || Platform.EqualsIgnoreCase(email1, email2))
- {
- union.Add(email2);
- }
- else if (WithinDomain(email2, email1))
- {
- union.Add(email1);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- else
- {
- if (WithinDomain(email2, email1))
- {
- union.Add(email1);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- }
- // email specifies a host
- else
- {
- if (email2.IndexOf('@') != -1)
- {
- String _sub = email2.Substring(email1.IndexOf('@') + 1);
- if (Platform.EqualsIgnoreCase(_sub, email1))
- {
- union.Add(email1);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- // email2 specifies a domain
- else if (Platform.StartsWith(email2, "."))
- {
- if (WithinDomain(email1, email2))
- {
- union.Add(email2);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- // email2 specifies a particular host
- else
- {
- if (Platform.EqualsIgnoreCase(email1, email2))
- {
- union.Add(email1);
- }
- else
- {
- union.Add(email1);
- union.Add(email2);
- }
- }
- }
- }
-
- private ISet intersectDNS(ISet permitted, ISet dnss)
- {
- ISet intersect = new HashSet();
- for (IEnumerator it = dnss.GetEnumerator(); it.MoveNext(); )
- {
- String dns = ExtractNameAsString(((GeneralSubtree)it.Current)
- .Base);
- if (permitted == null)
- {
- if (dns != null)
- {
- intersect.Add(dns);
- }
- }
- else
- {
- IEnumerator _iter = permitted.GetEnumerator();
- while (_iter.MoveNext())
- {
- String _permitted = (String)_iter.Current;
-
- if (WithinDomain(_permitted, dns))
- {
- intersect.Add(_permitted);
- }
- else if (WithinDomain(dns, _permitted))
- {
- intersect.Add(dns);
- }
- }
- }
- }
-
- return intersect;
- }
-
- protected ISet unionDNS(ISet excluded, String dns)
- {
- if (excluded.IsEmpty)
- {
- if (dns == null)
- {
- return excluded;
- }
- excluded.Add(dns);
-
- return excluded;
- }
- else
- {
- ISet union = new HashSet();
-
- IEnumerator _iter = excluded.GetEnumerator();
- while (_iter.MoveNext())
- {
- String _permitted = (String)_iter.Current;
-
- if (WithinDomain(_permitted, dns))
- {
- union.Add(dns);
- }
- else if (WithinDomain(dns, _permitted))
- {
- union.Add(_permitted);
- }
- else
- {
- union.Add(_permitted);
- union.Add(dns);
- }
- }
-
- return union;
- }
- }
-
- /**
- * The most restricting part from email1 and
- * email2 is added to the intersection intersect.
- *
- * @param email1 Email address constraint 1.
- * @param email2 Email address constraint 2.
- * @param intersect The intersection.
- */
- private void intersectEmail(String email1, String email2, ISet intersect)
- {
- // email1 is a particular address
- if (email1.IndexOf('@') != -1)
- {
- String _sub = email1.Substring(email1.IndexOf('@') + 1);
- // both are a particular mailbox
- if (email2.IndexOf('@') != -1)
- {
- if (Platform.EqualsIgnoreCase(email1, email2))
- {
- intersect.Add(email1);
- }
- }
- // email2 specifies a domain
- else if (Platform.StartsWith(email2, "."))
- {
- if (WithinDomain(_sub, email2))
- {
- intersect.Add(email1);
- }
- }
- // email2 specifies a particular host
- else
- {
- if (Platform.EqualsIgnoreCase(_sub, email2))
- {
- intersect.Add(email1);
- }
- }
- }
- // email specifies a domain
- else if (Platform.StartsWith(email1, "."))
- {
- if (email2.IndexOf('@') != -1)
- {
- String _sub = email2.Substring(email1.IndexOf('@') + 1);
- if (WithinDomain(_sub, email1))
- {
- intersect.Add(email2);
- }
- }
- // email2 specifies a domain
- else if (Platform.StartsWith(email2, "."))
- {
- if (WithinDomain(email1, email2) || Platform.EqualsIgnoreCase(email1, email2))
- {
- intersect.Add(email1);
- }
- else if (WithinDomain(email2, email1))
- {
- intersect.Add(email2);
- }
- }
- else
- {
- if (WithinDomain(email2, email1))
- {
- intersect.Add(email2);
- }
- }
- }
- // email1 specifies a host
- else
- {
- if (email2.IndexOf('@') != -1)
- {
- String _sub = email2.Substring(email2.IndexOf('@') + 1);
- if (Platform.EqualsIgnoreCase(_sub, email1))
- {
- intersect.Add(email2);
- }
- }
- // email2 specifies a domain
- else if (Platform.StartsWith(email2, "."))
- {
- if (WithinDomain(email1, email2))
- {
- intersect.Add(email1);
- }
- }
- // email2 specifies a particular host
- else
- {
- if (Platform.EqualsIgnoreCase(email1, email2))
- {
- intersect.Add(email1);
- }
- }
- }
- }
-
- private void checkExcludedURI(ISet excluded, String uri)
- // throws PkixNameConstraintValidatorException
- {
- if (excluded.IsEmpty)
- {
- return;
- }
-
- IEnumerator it = excluded.GetEnumerator();
-
- while (it.MoveNext())
- {
- String str = ((String)it.Current);
-
- if (IsUriConstrained(uri, str))
- {
- throw new PkixNameConstraintValidatorException(
- "URI is from an excluded subtree.");
- }
- }
- }
-
- private ISet intersectURI(ISet permitted, ISet uris)
- {
- ISet intersect = new HashSet();
- for (IEnumerator it = uris.GetEnumerator(); it.MoveNext(); )
- {
- String uri = ExtractNameAsString(((GeneralSubtree)it.Current)
- .Base);
- if (permitted == null)
- {
- if (uri != null)
- {
- intersect.Add(uri);
- }
- }
- else
- {
- IEnumerator _iter = permitted.GetEnumerator();
- while (_iter.MoveNext())
- {
- String _permitted = (String)_iter.Current;
- intersectURI(_permitted, uri, intersect);
- }
- }
- }
- return intersect;
- }
-
- private ISet unionURI(ISet excluded, String uri)
- {
- if (excluded.IsEmpty)
- {
- if (uri == null)
- {
- return excluded;
- }
- excluded.Add(uri);
-
- return excluded;
- }
- else
- {
- ISet union = new HashSet();
-
- IEnumerator _iter = excluded.GetEnumerator();
- while (_iter.MoveNext())
- {
- String _excluded = (String)_iter.Current;
-
- unionURI(_excluded, uri, union);
- }
-
- return union;
- }
- }
-
- private void intersectURI(String email1, String email2, ISet intersect)
- {
- // email1 is a particular address
- if (email1.IndexOf('@') != -1)
- {
- String _sub = email1.Substring(email1.IndexOf('@') + 1);
- // both are a particular mailbox
- if (email2.IndexOf('@') != -1)
- {
- if (Platform.EqualsIgnoreCase(email1, email2))
- {
- intersect.Add(email1);
- }
- }
- // email2 specifies a domain
- else if (Platform.StartsWith(email2, "."))
- {
- if (WithinDomain(_sub, email2))
- {
- intersect.Add(email1);
- }
- }
- // email2 specifies a particular host
- else
- {
- if (Platform.EqualsIgnoreCase(_sub, email2))
- {
- intersect.Add(email1);
- }
- }
- }
- // email specifies a domain
- else if (Platform.StartsWith(email1, "."))
- {
- if (email2.IndexOf('@') != -1)
- {
- String _sub = email2.Substring(email1.IndexOf('@') + 1);
- if (WithinDomain(_sub, email1))
- {
- intersect.Add(email2);
- }
- }
- // email2 specifies a domain
- else if (Platform.StartsWith(email2, "."))
- {
- if (WithinDomain(email1, email2) || Platform.EqualsIgnoreCase(email1, email2))
- {
- intersect.Add(email1);
- }
- else if (WithinDomain(email2, email1))
- {
- intersect.Add(email2);
- }
- }
- else
- {
- if (WithinDomain(email2, email1))
- {
- intersect.Add(email2);
- }
- }
- }
- // email1 specifies a host
- else
- {
- if (email2.IndexOf('@') != -1)
- {
- String _sub = email2.Substring(email2.IndexOf('@') + 1);
- if (Platform.EqualsIgnoreCase(_sub, email1))
- {
- intersect.Add(email2);
- }
- }
- // email2 specifies a domain
- else if (Platform.StartsWith(email2, "."))
- {
- if (WithinDomain(email1, email2))
- {
- intersect.Add(email1);
- }
- }
- // email2 specifies a particular host
- else
- {
- if (Platform.EqualsIgnoreCase(email1, email2))
- {
- intersect.Add(email1);
- }
- }
- }
- }
-
- private void CheckPermittedURI(ISet permitted, String uri)
- // throws PkixNameConstraintValidatorException
- {
- if (permitted == null)
- {
- return;
- }
-
- IEnumerator it = permitted.GetEnumerator();
-
- while (it.MoveNext())
- {
- String str = ((String)it.Current);
-
- if (IsUriConstrained(uri, str))
- {
- return;
- }
- }
- if (uri.Length == 0 && permitted.Count == 0)
- {
- return;
- }
- throw new PkixNameConstraintValidatorException(
- "URI is not from a permitted subtree.");
- }
-
- private bool IsUriConstrained(String uri, String constraint)
- {
- String host = ExtractHostFromURL(uri);
- // a host
- if (!Platform.StartsWith(constraint, "."))
- {
- if (Platform.EqualsIgnoreCase(host, constraint))
- {
- return true;
- }
- }
-
- // in sub domain or domain
- else if (WithinDomain(host, constraint))
- {
- return true;
- }
-
- return false;
- }
-
- private static String ExtractHostFromURL(String url)
- {
- // see RFC 1738
- // remove ':' after protocol, e.g. http:
- String sub = url.Substring(url.IndexOf(':') + 1);
- // extract host from Common Internet Scheme Syntax, e.g. http://
- int idxOfSlashes = Platform.IndexOf(sub, "//");
- if (idxOfSlashes != -1)
- {
- sub = sub.Substring(idxOfSlashes + 2);
- }
- // first remove port, e.g. http://test.com:21
- if (sub.LastIndexOf(':') != -1)
- {
- sub = sub.Substring(0, sub.LastIndexOf(':'));
- }
- // remove user and password, e.g. http://john:password@test.com
- sub = sub.Substring(sub.IndexOf(':') + 1);
- sub = sub.Substring(sub.IndexOf('@') + 1);
- // remove local parts, e.g. http://test.com/bla
- if (sub.IndexOf('/') != -1)
- {
- sub = sub.Substring(0, sub.IndexOf('/'));
- }
- return sub;
- }
-
- /**
- * Checks if the given GeneralName is in the permitted ISet.
- *
- * @param name The GeneralName
- * @throws PkixNameConstraintValidatorException
- * If the name
- */
- public void checkPermitted(GeneralName name)
- // throws PkixNameConstraintValidatorException
- {
- switch (name.TagNo)
- {
- case 1:
- CheckPermittedEmail(permittedSubtreesEmail,
- ExtractNameAsString(name));
- break;
- case 2:
- CheckPermittedDNS(permittedSubtreesDNS, DerIA5String.GetInstance(
- name.Name).GetString());
- break;
- case 4:
- CheckPermittedDN(Asn1Sequence.GetInstance(name.Name.ToAsn1Object()));
- break;
- case 6:
- CheckPermittedURI(permittedSubtreesURI, DerIA5String.GetInstance(
- name.Name).GetString());
- break;
- case 7:
- byte[] ip = Asn1OctetString.GetInstance(name.Name).GetOctets();
-
- CheckPermittedIP(permittedSubtreesIP, ip);
- break;
- }
- }
-
- /**
- * Check if the given GeneralName is contained in the excluded ISet.
- *
- * @param name The GeneralName.
- * @throws PkixNameConstraintValidatorException
- * If the name is
- * excluded.
- */
- public void checkExcluded(GeneralName name)
- // throws PkixNameConstraintValidatorException
- {
- switch (name.TagNo)
- {
- case 1:
- CheckExcludedEmail(excludedSubtreesEmail, ExtractNameAsString(name));
- break;
- case 2:
- checkExcludedDNS(excludedSubtreesDNS, DerIA5String.GetInstance(
- name.Name).GetString());
- break;
- case 4:
- CheckExcludedDN(Asn1Sequence.GetInstance(name.Name.ToAsn1Object()));
- break;
- case 6:
- checkExcludedURI(excludedSubtreesURI, DerIA5String.GetInstance(
- name.Name).GetString());
- break;
- case 7:
- byte[] ip = Asn1OctetString.GetInstance(name.Name).GetOctets();
-
- checkExcludedIP(excludedSubtreesIP, ip);
- break;
- }
- }
-
- /**
- * Updates the permitted ISet of these name constraints with the intersection
- * with the given subtree.
- *
- * @param permitted The permitted subtrees
- */
-
- public void IntersectPermittedSubtree(Asn1Sequence permitted)
- {
- IDictionary subtreesMap = Platform.CreateHashtable();
-
- // group in ISets in a map ordered by tag no.
- for (IEnumerator e = permitted.GetEnumerator(); e.MoveNext(); )
- {
- GeneralSubtree subtree = GeneralSubtree.GetInstance(e.Current);
-
- int tagNo = subtree.Base.TagNo;
- if (subtreesMap[tagNo] == null)
- {
- subtreesMap[tagNo] = new HashSet();
- }
-
- ((ISet)subtreesMap[tagNo]).Add(subtree);
- }
-
- for (IEnumerator it = subtreesMap.GetEnumerator(); it.MoveNext(); )
- {
- DictionaryEntry entry = (DictionaryEntry)it.Current;
-
- // go through all subtree groups
- switch ((int)entry.Key )
- {
- case 1:
- permittedSubtreesEmail = IntersectEmail(permittedSubtreesEmail,
- (ISet)entry.Value);
- break;
- case 2:
- permittedSubtreesDNS = intersectDNS(permittedSubtreesDNS,
- (ISet)entry.Value);
- break;
- case 4:
- permittedSubtreesDN = IntersectDN(permittedSubtreesDN,
- (ISet)entry.Value);
- break;
- case 6:
- permittedSubtreesURI = intersectURI(permittedSubtreesURI,
- (ISet)entry.Value);
- break;
- case 7:
- permittedSubtreesIP = IntersectIP(permittedSubtreesIP,
- (ISet)entry.Value);
- break;
- }
- }
- }
-
- private String ExtractNameAsString(GeneralName name)
- {
- return DerIA5String.GetInstance(name.Name).GetString();
- }
-
- public void IntersectEmptyPermittedSubtree(int nameType)
- {
- switch (nameType)
- {
- case 1:
- permittedSubtreesEmail = new HashSet();
- break;
- case 2:
- permittedSubtreesDNS = new HashSet();
- break;
- case 4:
- permittedSubtreesDN = new HashSet();
- break;
- case 6:
- permittedSubtreesURI = new HashSet();
- break;
- case 7:
- permittedSubtreesIP = new HashSet();
- break;
- }
- }
-
- /**
- * Adds a subtree to the excluded ISet of these name constraints.
- *
- * @param subtree A subtree with an excluded GeneralName.
- */
- public void AddExcludedSubtree(GeneralSubtree subtree)
- {
- GeneralName subTreeBase = subtree.Base;
-
- switch (subTreeBase.TagNo)
- {
- case 1:
- excludedSubtreesEmail = UnionEmail(excludedSubtreesEmail,
- ExtractNameAsString(subTreeBase));
- break;
- case 2:
- excludedSubtreesDNS = unionDNS(excludedSubtreesDNS,
- ExtractNameAsString(subTreeBase));
- break;
- case 4:
- excludedSubtreesDN = UnionDN(excludedSubtreesDN,
- (Asn1Sequence)subTreeBase.Name.ToAsn1Object());
- break;
- case 6:
- excludedSubtreesURI = unionURI(excludedSubtreesURI,
- ExtractNameAsString(subTreeBase));
- break;
- case 7:
- excludedSubtreesIP = UnionIP(excludedSubtreesIP, Asn1OctetString
- .GetInstance(subTreeBase.Name).GetOctets());
- break;
- }
- }
-
- /**
- * Returns the maximum IP address.
- *
- * @param ip1 The first IP address.
- * @param ip2 The second IP address.
- * @return The maximum IP address.
- */
- private static byte[] Max(byte[] ip1, byte[] ip2)
- {
- for (int i = 0; i < ip1.Length; i++)
- {
- if ((ip1[i] & 0xFFFF) > (ip2[i] & 0xFFFF))
- {
- return ip1;
- }
- }
- return ip2;
- }
-
- /**
- * Returns the minimum IP address.
- *
- * @param ip1 The first IP address.
- * @param ip2 The second IP address.
- * @return The minimum IP address.
- */
- private static byte[] Min(byte[] ip1, byte[] ip2)
- {
- for (int i = 0; i < ip1.Length; i++)
- {
- if ((ip1[i] & 0xFFFF) < (ip2[i] & 0xFFFF))
- {
- return ip1;
- }
- }
- return ip2;
- }
-
- /**
- * Compares IP address ip1 with ip2. If ip1
- * is equal to ip2 0 is returned. If ip1 is bigger 1 is returned, -1
- * otherwise.
- *
- * @param ip1 The first IP address.
- * @param ip2 The second IP address.
- * @return 0 if ip1 is equal to ip2, 1 if ip1 is bigger, -1 otherwise.
- */
- private static int CompareTo(byte[] ip1, byte[] ip2)
- {
- if (Org.BouncyCastle.Utilities.Arrays.AreEqual(ip1, ip2))
- {
- return 0;
- }
- if (Org.BouncyCastle.Utilities.Arrays.AreEqual(Max(ip1, ip2), ip1))
- {
- return 1;
- }
- return -1;
- }
-
- /**
- * Returns the logical OR of the IP addresses ip1 and
- * ip2.
- *
- * @param ip1 The first IP address.
- * @param ip2 The second IP address.
- * @return The OR of ip1 and ip2.
- */
- private static byte[] Or(byte[] ip1, byte[] ip2)
- {
- byte[] temp = new byte[ip1.Length];
- for (int i = 0; i < ip1.Length; i++)
- {
- temp[i] = (byte)(ip1[i] | ip2[i]);
- }
- return temp;
- }
-
- [Obsolete("Use GetHashCode instead")]
- public int HashCode()
- {
- return GetHashCode();
- }
-
- public override int GetHashCode()
- {
- return HashCollection(excludedSubtreesDN)
- + HashCollection(excludedSubtreesDNS)
- + HashCollection(excludedSubtreesEmail)
- + HashCollection(excludedSubtreesIP)
- + HashCollection(excludedSubtreesURI)
- + HashCollection(permittedSubtreesDN)
- + HashCollection(permittedSubtreesDNS)
- + HashCollection(permittedSubtreesEmail)
- + HashCollection(permittedSubtreesIP)
- + HashCollection(permittedSubtreesURI);
- }
-
- private int HashCollection(ICollection coll)
- {
- if (coll == null)
- {
- return 0;
- }
- int hash = 0;
- IEnumerator it1 = coll.GetEnumerator();
- while (it1.MoveNext())
- {
- Object o = it1.Current;
- if (o is byte[])
- {
- hash += Org.BouncyCastle.Utilities.Arrays.GetHashCode((byte[])o);
- }
- else
- {
- hash += o.GetHashCode();
- }
- }
- return hash;
- }
-
- public override bool Equals(Object o)
- {
- if (!(o is PkixNameConstraintValidator))
- return false;
-
- PkixNameConstraintValidator constraintValidator = (PkixNameConstraintValidator)o;
-
- return CollectionsAreEqual(constraintValidator.excludedSubtreesDN, excludedSubtreesDN)
- && CollectionsAreEqual(constraintValidator.excludedSubtreesDNS, excludedSubtreesDNS)
- && CollectionsAreEqual(constraintValidator.excludedSubtreesEmail, excludedSubtreesEmail)
- && CollectionsAreEqual(constraintValidator.excludedSubtreesIP, excludedSubtreesIP)
- && CollectionsAreEqual(constraintValidator.excludedSubtreesURI, excludedSubtreesURI)
- && CollectionsAreEqual(constraintValidator.permittedSubtreesDN, permittedSubtreesDN)
- && CollectionsAreEqual(constraintValidator.permittedSubtreesDNS, permittedSubtreesDNS)
- && CollectionsAreEqual(constraintValidator.permittedSubtreesEmail, permittedSubtreesEmail)
- && CollectionsAreEqual(constraintValidator.permittedSubtreesIP, permittedSubtreesIP)
- && CollectionsAreEqual(constraintValidator.permittedSubtreesURI, permittedSubtreesURI);
- }
-
- private bool CollectionsAreEqual(ICollection coll1, ICollection coll2)
- {
- if (coll1 == coll2)
- {
- return true;
- }
- if (coll1 == null || coll2 == null)
- {
- return false;
- }
- if (coll1.Count != coll2.Count)
- {
- return false;
- }
- IEnumerator it1 = coll1.GetEnumerator();
-
- while (it1.MoveNext())
- {
- Object a = it1.Current;
- IEnumerator it2 = coll2.GetEnumerator();
- bool found = false;
- while (it2.MoveNext())
- {
- Object b = it2.Current;
- if (SpecialEquals(a, b))
- {
- found = true;
- break;
- }
- }
- if (!found)
- {
- return false;
- }
- }
- return true;
- }
-
- private bool SpecialEquals(Object o1, Object o2)
- {
- if (o1 == o2)
- {
- return true;
- }
- if (o1 == null || o2 == null)
- {
- return false;
- }
- if ((o1 is byte[]) && (o2 is byte[]))
- {
- return Org.BouncyCastle.Utilities.Arrays.AreEqual((byte[])o1, (byte[])o2);
- }
- else
- {
- return o1.Equals(o2);
- }
- }
-
- /**
- * Stringifies an IPv4 or v6 address with subnet mask.
- *
- * @param ip The IP with subnet mask.
- * @return The stringified IP address.
- */
- private String StringifyIP(byte[] ip)
- {
- String temp = "";
- for (int i = 0; i < ip.Length / 2; i++)
- {
- //temp += Integer.toString(ip[i] & 0x00FF) + ".";
- temp += (ip[i] & 0x00FF) + ".";
- }
- temp = temp.Substring(0, temp.Length - 1);
- temp += "/";
- for (int i = ip.Length / 2; i < ip.Length; i++)
- {
- //temp += Integer.toString(ip[i] & 0x00FF) + ".";
- temp += (ip[i] & 0x00FF) + ".";
- }
- temp = temp.Substring(0, temp.Length - 1);
- return temp;
- }
-
- private String StringifyIPCollection(ISet ips)
- {
- String temp = "";
- temp += "[";
- for (IEnumerator it = ips.GetEnumerator(); it.MoveNext(); )
- {
- temp += StringifyIP((byte[])it.Current) + ",";
- }
- if (temp.Length > 1)
- {
- temp = temp.Substring(0, temp.Length - 1);
- }
- temp += "]";
-
- return temp;
- }
-
- public override String ToString()
- {
- String temp = "";
-
- temp += "permitted:\n";
- if (permittedSubtreesDN != null)
- {
- temp += "DN:\n";
- temp += permittedSubtreesDN.ToString() + "\n";
- }
- if (permittedSubtreesDNS != null)
- {
- temp += "DNS:\n";
- temp += permittedSubtreesDNS.ToString() + "\n";
- }
- if (permittedSubtreesEmail != null)
- {
- temp += "Email:\n";
- temp += permittedSubtreesEmail.ToString() + "\n";
- }
- if (permittedSubtreesURI != null)
- {
- temp += "URI:\n";
- temp += permittedSubtreesURI.ToString() + "\n";
- }
- if (permittedSubtreesIP != null)
- {
- temp += "IP:\n";
- temp += StringifyIPCollection(permittedSubtreesIP) + "\n";
- }
- temp += "excluded:\n";
- if (!(excludedSubtreesDN.IsEmpty))
- {
- temp += "DN:\n";
- temp += excludedSubtreesDN.ToString() + "\n";
- }
- if (!excludedSubtreesDNS.IsEmpty)
- {
- temp += "DNS:\n";
- temp += excludedSubtreesDNS.ToString() + "\n";
- }
- if (!excludedSubtreesEmail.IsEmpty)
- {
- temp += "Email:\n";
- temp += excludedSubtreesEmail.ToString() + "\n";
- }
- if (!excludedSubtreesURI.IsEmpty)
- {
- temp += "URI:\n";
- temp += excludedSubtreesURI.ToString() + "\n";
- }
- if (!excludedSubtreesIP.IsEmpty)
- {
- temp += "IP:\n";
- temp += StringifyIPCollection(excludedSubtreesIP) + "\n";
- }
- return temp;
- }
-
- }
-}
diff --git a/BCCrypto/src/pkix/PkixNameConstraintValidatorException.cs b/BCCrypto/src/pkix/PkixNameConstraintValidatorException.cs
deleted file mode 100644
index b187525..0000000
--- a/BCCrypto/src/pkix/PkixNameConstraintValidatorException.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Pkix
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class PkixNameConstraintValidatorException
- : Exception
- {
- public PkixNameConstraintValidatorException(String msg)
- : base(msg)
- {
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixParameters.cs b/BCCrypto/src/pkix/PkixParameters.cs
deleted file mode 100644
index 01ed9d4..0000000
--- a/BCCrypto/src/pkix/PkixParameters.cs
+++ /dev/null
@@ -1,893 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Date;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Pkix
-{
- ///
- /// Summary description for PkixParameters.
- ///
- public class PkixParameters
-// : ICertPathParameters
- {
- /**
- * This is the default PKIX validity model. Actually there are two variants
- * of this: The PKIX model and the modified PKIX model. The PKIX model
- * verifies that all involved certificates must have been valid at the
- * current time. The modified PKIX model verifies that all involved
- * certificates were valid at the signing time. Both are indirectly choosen
- * with the {@link PKIXParameters#setDate(java.util.Date)} method, so this
- * methods sets the Date when all certificates must have been
- * valid.
- */
- public const int PkixValidityModel = 0;
-
- /**
- * This model uses the following validity model. Each certificate must have
- * been valid at the moment where is was used. That means the end
- * certificate must have been valid at the time the signature was done. The
- * CA certificate which signed the end certificate must have been valid,
- * when the end certificate was signed. The CA (or Root CA) certificate must
- * have been valid, when the CA certificate was signed and so on. So the
- * {@link PKIXParameters#setDate(java.util.Date)} method sets the time, when
- * the end certificate must have been valid.
It is used e.g.
- * in the German signature law.
- */
- public const int ChainValidityModel = 1;
-
- private ISet trustAnchors;
- private DateTimeObject date;
- private IList certPathCheckers;
- private bool revocationEnabled = true;
- private ISet initialPolicies;
- //private bool checkOnlyEECertificateCrl = false;
- private bool explicitPolicyRequired = false;
- private bool anyPolicyInhibited = false;
- private bool policyMappingInhibited = false;
- private bool policyQualifiersRejected = true;
- private IX509Selector certSelector;
- private IList stores;
- private IX509Selector selector;
- private bool additionalLocationsEnabled;
- private IList additionalStores;
- private ISet trustedACIssuers;
- private ISet necessaryACAttributes;
- private ISet prohibitedACAttributes;
- private ISet attrCertCheckers;
- private int validityModel = PkixValidityModel;
- private bool useDeltas = false;
-
- /**
- * Creates an instance of PKIXParameters with the specified Set of
- * most-trusted CAs. Each element of the set is a TrustAnchor.
- *
- * Note that the Set is copied to protect against subsequent modifications.
- *
- * @param trustAnchors
- * a Set of TrustAnchors
- *
- * @exception InvalidAlgorithmParameterException
- * if the specified Set is empty
- * (trustAnchors.isEmpty() == true)
- * @exception NullPointerException
- * if the specified Set is null
- * @exception ClassCastException
- * if any of the elements in the Set are not of type
- * java.security.cert.TrustAnchor
- */
- public PkixParameters(
- ISet trustAnchors)
- {
- SetTrustAnchors(trustAnchors);
-
- this.initialPolicies = new HashSet();
- this.certPathCheckers = Platform.CreateArrayList();
- this.stores = Platform.CreateArrayList();
- this.additionalStores = Platform.CreateArrayList();
- this.trustedACIssuers = new HashSet();
- this.necessaryACAttributes = new HashSet();
- this.prohibitedACAttributes = new HashSet();
- this.attrCertCheckers = new HashSet();
- }
-
-// // TODO implement for other keystores (see Java build)?
-// /**
-// * Creates an instance of PKIXParameters that
-// * populates the set of most-trusted CAs from the trusted
-// * certificate entries contained in the specified KeyStore.
-// * Only keystore entries that contain trusted X509Certificates
-// * are considered; all other certificate types are ignored.
-// *
-// * @param keystore a KeyStore from which the set of
-// * most-trusted CAs will be populated
-// * @throws KeyStoreException if the keystore has not been initialized
-// * @throws InvalidAlgorithmParameterException if the keystore does
-// * not contain at least one trusted certificate entry
-// * @throws NullPointerException if the keystore is null
-// */
-// public PkixParameters(
-// Pkcs12Store keystore)
-//// throws KeyStoreException, InvalidAlgorithmParameterException
-// {
-// if (keystore == null)
-// throw new ArgumentNullException("keystore");
-// ISet trustAnchors = new HashSet();
-// foreach (string alias in keystore.Aliases)
-// {
-// if (keystore.IsCertificateEntry(alias))
-// {
-// X509CertificateEntry x509Entry = keystore.GetCertificate(alias);
-// trustAnchors.Add(new TrustAnchor(x509Entry.Certificate, null));
-// }
-// }
-// SetTrustAnchors(trustAnchors);
-//
-// this.initialPolicies = new HashSet();
-// this.certPathCheckers = new ArrayList();
-// this.stores = new ArrayList();
-// this.additionalStores = new ArrayList();
-// this.trustedACIssuers = new HashSet();
-// this.necessaryACAttributes = new HashSet();
-// this.prohibitedACAttributes = new HashSet();
-// this.attrCertCheckers = new HashSet();
-// }
-
- public virtual bool IsRevocationEnabled
- {
- get { return revocationEnabled; }
- set { revocationEnabled = value; }
- }
-
- public virtual bool IsExplicitPolicyRequired
- {
- get { return explicitPolicyRequired; }
- set { this.explicitPolicyRequired = value; }
- }
-
- public virtual bool IsAnyPolicyInhibited
- {
- get { return anyPolicyInhibited; }
- set { this.anyPolicyInhibited = value; }
- }
-
- public virtual bool IsPolicyMappingInhibited
- {
- get { return policyMappingInhibited; }
- set { this.policyMappingInhibited = value; }
- }
-
- public virtual bool IsPolicyQualifiersRejected
- {
- get { return policyQualifiersRejected; }
- set { this.policyQualifiersRejected = value; }
- }
-
- //public bool IsCheckOnlyEECertificateCrl
- //{
- // get { return this.checkOnlyEECertificateCrl; }
- // set { this.checkOnlyEECertificateCrl = value; }
- //}
-
- public virtual DateTimeObject Date
- {
- get { return this.date; }
- set { this.date = value; }
- }
-
- // Returns a Set of the most-trusted CAs.
- public virtual ISet GetTrustAnchors()
- {
- return new HashSet(this.trustAnchors);
- }
-
- // Sets the set of most-trusted CAs.
- // Set is copied to protect against subsequent modifications.
- public virtual void SetTrustAnchors(
- ISet tas)
- {
- if (tas == null)
- throw new ArgumentNullException("value");
- if (tas.IsEmpty)
- throw new ArgumentException("non-empty set required", "value");
-
- // Explicit copy to enforce type-safety
- this.trustAnchors = new HashSet();
- foreach (TrustAnchor ta in tas)
- {
- if (ta != null)
- {
- trustAnchors.Add(ta);
- }
- }
- }
-
- /**
- * Returns the required constraints on the target certificate. The
- * constraints are returned as an instance of CertSelector. If
- * null, no constraints are defined.
- *
- * Note that the CertSelector returned is cloned to protect against
- * subsequent modifications.
- *
- * @return a CertSelector specifying the constraints on the target
- * certificate (or null)
- *
- * @see #setTargetCertConstraints(CertSelector)
- */
- public virtual X509CertStoreSelector GetTargetCertConstraints()
- {
- if (certSelector == null)
- {
- return null;
- }
-
- return (X509CertStoreSelector)certSelector.Clone();
- }
-
- /**
- * Sets the required constraints on the target certificate. The constraints
- * are specified as an instance of CertSelector. If null, no constraints are
- * defined.
- *
- * Note that the CertSelector specified is cloned to protect against
- * subsequent modifications.
- *
- * @param selector
- * a CertSelector specifying the constraints on the target
- * certificate (or null)
- *
- * @see #getTargetCertConstraints()
- */
- public virtual void SetTargetCertConstraints(
- IX509Selector selector)
- {
- if (selector == null)
- {
- certSelector = null;
- }
- else
- {
- certSelector = (IX509Selector)selector.Clone();
- }
- }
-
- /**
- * Returns an immutable Set of initial policy identifiers (OID strings),
- * indicating that any one of these policies would be acceptable to the
- * certificate user for the purposes of certification path processing. The
- * default return value is an empty Set, which is
- * interpreted as meaning that any policy would be acceptable.
- *
- * @return an immutable Set of initial policy OIDs in String
- * format, or an empty Set (implying any policy is
- * acceptable). Never returns null.
- *
- * @see #setInitialPolicies(java.util.Set)
- */
- public virtual ISet GetInitialPolicies()
- {
- ISet returnSet = initialPolicies;
-
- // TODO Can it really be null?
- if (initialPolicies == null)
- {
- returnSet = new HashSet();
- }
-
- return new HashSet(returnSet);
- }
-
- /**
- * Sets the Set of initial policy identifiers (OID strings),
- * indicating that any one of these policies would be acceptable to the
- * certificate user for the purposes of certification path processing. By
- * default, any policy is acceptable (i.e. all policies), so a user that
- * wants to allow any policy as acceptable does not need to call this
- * method, or can call it with an empty Set (or
- * null).
- *
- * Note that the Set is copied to protect against subsequent modifications.
- *
- *
- * @param initialPolicies
- * a Set of initial policy OIDs in String format (or
- * null)
- *
- * @exception ClassCastException
- * if any of the elements in the set are not of type String
- *
- * @see #getInitialPolicies()
- */
- public virtual void SetInitialPolicies(
- ISet initialPolicies)
- {
- this.initialPolicies = new HashSet();
- if (initialPolicies != null)
- {
- foreach (string obj in initialPolicies)
- {
- if (obj != null)
- {
- this.initialPolicies.Add(obj);
- }
- }
- }
- }
-
- /**
- * Sets a List of additional certification path checkers. If
- * the specified List contains an object that is not a PKIXCertPathChecker,
- * it is ignored.
- *
- * Each PKIXCertPathChecker specified implements additional
- * checks on a certificate. Typically, these are checks to process and
- * verify private extensions contained in certificates. Each
- * PKIXCertPathChecker should be instantiated with any
- * initialization parameters needed to execute the check.
- *
- * This method allows sophisticated applications to extend a PKIX
- * CertPathValidator or CertPathBuilder. Each
- * of the specified PKIXCertPathCheckers will be called, in turn, by a PKIX
- * CertPathValidator or CertPathBuilder for
- * each certificate processed or validated.
- *
- * Regardless of whether these additional PKIXCertPathCheckers are set, a
- * PKIX CertPathValidator or CertPathBuilder
- * must perform all of the required PKIX checks on each certificate. The one
- * exception to this rule is if the RevocationEnabled flag is set to false
- * (see the {@link #setRevocationEnabled(boolean) setRevocationEnabled}
- * method).
- *
- * Note that the List supplied here is copied and each PKIXCertPathChecker
- * in the list is cloned to protect against subsequent modifications.
- *
- * @param checkers
- * a List of PKIXCertPathCheckers. May be null, in which case no
- * additional checkers will be used.
- * @exception ClassCastException
- * if any of the elements in the list are not of type
- * java.security.cert.PKIXCertPathChecker
- * @see #getCertPathCheckers()
- */
- public virtual void SetCertPathCheckers(IList checkers)
- {
- certPathCheckers = Platform.CreateArrayList();
- if (checkers != null)
- {
- foreach (PkixCertPathChecker obj in checkers)
- {
- certPathCheckers.Add(obj.Clone());
- }
- }
- }
-
- /**
- * Returns the List of certification path checkers. Each PKIXCertPathChecker
- * in the returned IList is cloned to protect against subsequent modifications.
- *
- * @return an immutable List of PKIXCertPathCheckers (may be empty, but not
- * null)
- *
- * @see #setCertPathCheckers(java.util.List)
- */
- public virtual IList GetCertPathCheckers()
- {
- IList checkers = Platform.CreateArrayList();
- foreach (PkixCertPathChecker obj in certPathCheckers)
- {
- checkers.Add(obj.Clone());
- }
- return checkers;
- }
-
- /**
- * Adds a PKIXCertPathChecker to the list of certification
- * path checkers. See the {@link #setCertPathCheckers setCertPathCheckers}
- * method for more details.
- *
- * Note that the PKIXCertPathChecker is cloned to protect
- * against subsequent modifications.
- *
- * @param checker a PKIXCertPathChecker to add to the list of
- * checks. If null, the checker is ignored (not added to list).
- */
- public virtual void AddCertPathChecker(
- PkixCertPathChecker checker)
- {
- if (checker != null)
- {
- certPathCheckers.Add(checker.Clone());
- }
- }
-
- public virtual object Clone()
- {
- // FIXME Check this whole method against the Java implementation!
-
- PkixParameters parameters = new PkixParameters(GetTrustAnchors());
- parameters.SetParams(this);
- return parameters;
-
-
-// PkixParameters obj = new PkixParameters(new HashSet());
-//// (PkixParameters) this.MemberwiseClone();
-// obj.x509Stores = new ArrayList(x509Stores);
-// obj.certPathCheckers = new ArrayList(certPathCheckers);
-//
-// //Iterator iter = certPathCheckers.iterator();
-// //obj.certPathCheckers = new ArrayList();
-// //while (iter.hasNext())
-// //{
-// // obj.certPathCheckers.add(((PKIXCertPathChecker)iter.next())
-// // .clone());
-// //}
-// //if (initialPolicies != null)
-// //{
-// // obj.initialPolicies = new HashSet(initialPolicies);
-// //}
-//// if (trustAnchors != null)
-//// {
-//// obj.trustAnchors = new HashSet(trustAnchors);
-//// }
-//// if (certSelector != null)
-//// {
-//// obj.certSelector = (X509CertStoreSelector) certSelector.Clone();
-//// }
-// return obj;
- }
-
- /**
- * Method to support Clone() under J2ME.
- * super.Clone() does not exist and fields are not copied.
- *
- * @param params Parameters to set. If this are
- * ExtendedPkixParameters they are copied to.
- */
- protected virtual void SetParams(
- PkixParameters parameters)
- {
- Date = parameters.Date;
- SetCertPathCheckers(parameters.GetCertPathCheckers());
- IsAnyPolicyInhibited = parameters.IsAnyPolicyInhibited;
- IsExplicitPolicyRequired = parameters.IsExplicitPolicyRequired;
- IsPolicyMappingInhibited = parameters.IsPolicyMappingInhibited;
- IsRevocationEnabled = parameters.IsRevocationEnabled;
- SetInitialPolicies(parameters.GetInitialPolicies());
- IsPolicyQualifiersRejected = parameters.IsPolicyQualifiersRejected;
- SetTargetCertConstraints(parameters.GetTargetCertConstraints());
- SetTrustAnchors(parameters.GetTrustAnchors());
-
- validityModel = parameters.validityModel;
- useDeltas = parameters.useDeltas;
- additionalLocationsEnabled = parameters.additionalLocationsEnabled;
- selector = parameters.selector == null ? null
- : (IX509Selector) parameters.selector.Clone();
- stores = Platform.CreateArrayList(parameters.stores);
- additionalStores = Platform.CreateArrayList(parameters.additionalStores);
- trustedACIssuers = new HashSet(parameters.trustedACIssuers);
- prohibitedACAttributes = new HashSet(parameters.prohibitedACAttributes);
- necessaryACAttributes = new HashSet(parameters.necessaryACAttributes);
- attrCertCheckers = new HashSet(parameters.attrCertCheckers);
- }
-
- /**
- * Whether delta CRLs should be used for checking the revocation status.
- * Defaults to false.
- */
- public virtual bool IsUseDeltasEnabled
- {
- get { return useDeltas; }
- set { useDeltas = value; }
- }
-
- /**
- * The validity model.
- * @see #CHAIN_VALIDITY_MODEL
- * @see #PKIX_VALIDITY_MODEL
- */
- public virtual int ValidityModel
- {
- get { return validityModel; }
- set { validityModel = value; }
- }
-
- /**
- * Sets the Bouncy Castle Stores for finding CRLs, certificates, attribute
- * certificates or cross certificates.
- *
- * The IList is cloned.
- *
- *
- * @param stores A list of stores to use.
- * @see #getStores
- * @throws ClassCastException if an element of stores is not
- * a {@link Store}.
- */
- public virtual void SetStores(
- IList stores)
- {
- if (stores == null)
- {
- this.stores = Platform.CreateArrayList();
- }
- else
- {
- foreach (object obj in stores)
- {
- if (!(obj is IX509Store))
- {
- throw new InvalidCastException(
- "All elements of list must be of type " + typeof(IX509Store).FullName);
- }
- }
- this.stores = Platform.CreateArrayList(stores);
- }
- }
-
- /**
- * Adds a Bouncy Castle {@link Store} to find CRLs, certificates, attribute
- * certificates or cross certificates.
- *
- * This method should be used to add local stores, like collection based
- * X.509 stores, if available. Local stores should be considered first,
- * before trying to use additional (remote) locations, because they do not
- * need possible additional network traffic.
- *
- * If store is null it is ignored.
- *
- *
- * @param store The store to add.
- * @see #getStores
- */
- public virtual void AddStore(
- IX509Store store)
- {
- if (store != null)
- {
- stores.Add(store);
- }
- }
-
- /**
- * Adds an additional Bouncy Castle {@link Store} to find CRLs, certificates,
- * attribute certificates or cross certificates.
- *
- * You should not use this method. This method is used for adding additional
- * X.509 stores, which are used to add (remote) locations, e.g. LDAP, found
- * during X.509 object processing, e.g. in certificates or CRLs. This method
- * is used in PKIX certification path processing.
- *
- * If store is null it is ignored.
- *
- *
- * @param store The store to add.
- * @see #getStores()
- */
- public virtual void AddAdditionalStore(
- IX509Store store)
- {
- if (store != null)
- {
- additionalStores.Add(store);
- }
- }
-
- /**
- * Returns an IList of additional Bouncy Castle
- * Stores used for finding CRLs, certificates, attribute
- * certificates or cross certificates.
- *
- * @return an immutable IList of additional Bouncy Castle
- * Stores. Never null.
- *
- * @see #addAddionalStore(Store)
- */
- public virtual IList GetAdditionalStores()
- {
- return Platform.CreateArrayList(additionalStores);
- }
-
- /**
- * Returns an IList of Bouncy Castle
- * Stores used for finding CRLs, certificates, attribute
- * certificates or cross certificates.
- *
- * @return an immutable IList of Bouncy Castle
- * Stores. Never null.
- *
- * @see #setStores(IList)
- */
- public virtual IList GetStores()
- {
- return Platform.CreateArrayList(stores);
- }
-
- /**
- * Returns if additional {@link X509Store}s for locations like LDAP found
- * in certificates or CRLs should be used.
- *
- * @return Returns true if additional stores are used.
- */
- public virtual bool IsAdditionalLocationsEnabled
- {
- get { return additionalLocationsEnabled; }
- }
-
- /**
- * Sets if additional {@link X509Store}s for locations like LDAP found in
- * certificates or CRLs should be used.
- *
- * @param enabled true if additional stores are used.
- */
- public virtual void SetAdditionalLocationsEnabled(
- bool enabled)
- {
- additionalLocationsEnabled = enabled;
- }
-
- /**
- * Returns the required constraints on the target certificate or attribute
- * certificate. The constraints are returned as an instance of
- * IX509Selector. If null, no constraints are
- * defined.
- *
- *
- * The target certificate in a PKIX path may be a certificate or an
- * attribute certificate.
- *
- * Note that the IX509Selector returned is cloned to protect
- * against subsequent modifications.
- *
- * @return a IX509Selector specifying the constraints on the
- * target certificate or attribute certificate (or null)
- * @see #setTargetConstraints
- * @see X509CertStoreSelector
- * @see X509AttributeCertStoreSelector
- */
- public virtual IX509Selector GetTargetConstraints()
- {
- if (selector != null)
- {
- return (IX509Selector) selector.Clone();
- }
- else
- {
- return null;
- }
- }
-
- /**
- * Sets the required constraints on the target certificate or attribute
- * certificate. The constraints are specified as an instance of
- * IX509Selector. If null, no constraints are
- * defined.
- *
- * The target certificate in a PKIX path may be a certificate or an
- * attribute certificate.
- *
- * Note that the IX509Selector specified is cloned to protect
- * against subsequent modifications.
- *
- *
- * @param selector a IX509Selector specifying the constraints on
- * the target certificate or attribute certificate (or
- * null)
- * @see #getTargetConstraints
- * @see X509CertStoreSelector
- * @see X509AttributeCertStoreSelector
- */
- public virtual void SetTargetConstraints(IX509Selector selector)
- {
- if (selector != null)
- {
- this.selector = (IX509Selector) selector.Clone();
- }
- else
- {
- this.selector = null;
- }
- }
-
- /**
- * Returns the trusted attribute certificate issuers. If attribute
- * certificates is verified the trusted AC issuers must be set.
- *
- * The returned ISet consists of TrustAnchors.
- *
- * The returned ISet is immutable. Never null
- *
- *
- * @return Returns an immutable set of the trusted AC issuers.
- */
- public virtual ISet GetTrustedACIssuers()
- {
- return new HashSet(trustedACIssuers);
- }
-
- /**
- * Sets the trusted attribute certificate issuers. If attribute certificates
- * is verified the trusted AC issuers must be set.
- *
- * The trustedACIssuers must be a ISet of
- * TrustAnchor
- *
- * The given set is cloned.
- *
- *
- * @param trustedACIssuers The trusted AC issuers to set. Is never
- * null.
- * @throws ClassCastException if an element of stores is not
- * a TrustAnchor.
- */
- public virtual void SetTrustedACIssuers(
- ISet trustedACIssuers)
- {
- if (trustedACIssuers == null)
- {
- this.trustedACIssuers = new HashSet();
- }
- else
- {
- foreach (object obj in trustedACIssuers)
- {
- if (!(obj is TrustAnchor))
- {
- throw new InvalidCastException("All elements of set must be "
- + "of type " + typeof(TrustAnchor).FullName + ".");
- }
- }
- this.trustedACIssuers = new HashSet(trustedACIssuers);
- }
- }
-
- /**
- * Returns the necessary attributes which must be contained in an attribute
- * certificate.
- *
- * The returned ISet is immutable and contains
- * Strings with the OIDs.
- *
- *
- * @return Returns the necessary AC attributes.
- */
- public virtual ISet GetNecessaryACAttributes()
- {
- return new HashSet(necessaryACAttributes);
- }
-
- /**
- * Sets the necessary which must be contained in an attribute certificate.
- *
- * The ISet must contain Strings with the
- * OIDs.
- *
- * The set is cloned.
- *
- *
- * @param necessaryACAttributes The necessary AC attributes to set.
- * @throws ClassCastException if an element of
- * necessaryACAttributes is not a
- * String.
- */
- public virtual void SetNecessaryACAttributes(
- ISet necessaryACAttributes)
- {
- if (necessaryACAttributes == null)
- {
- this.necessaryACAttributes = new HashSet();
- }
- else
- {
- foreach (object obj in necessaryACAttributes)
- {
- if (!(obj is string))
- {
- throw new InvalidCastException("All elements of set must be "
- + "of type string.");
- }
- }
- this.necessaryACAttributes = new HashSet(necessaryACAttributes);
- }
- }
-
- /**
- * Returns the attribute certificates which are not allowed.
- *
- * The returned ISet is immutable and contains
- * Strings with the OIDs.
- *
- *
- * @return Returns the prohibited AC attributes. Is never null.
- */
- public virtual ISet GetProhibitedACAttributes()
- {
- return new HashSet(prohibitedACAttributes);
- }
-
- /**
- * Sets the attribute certificates which are not allowed.
- *
- * The ISet must contain Strings with the
- * OIDs.
- *
- * The set is cloned.
- *
- *
- * @param prohibitedACAttributes The prohibited AC attributes to set.
- * @throws ClassCastException if an element of
- * prohibitedACAttributes is not a
- * String.
- */
- public virtual void SetProhibitedACAttributes(
- ISet prohibitedACAttributes)
- {
- if (prohibitedACAttributes == null)
- {
- this.prohibitedACAttributes = new HashSet();
- }
- else
- {
- foreach (object obj in prohibitedACAttributes)
- {
- if (!(obj is String))
- {
- throw new InvalidCastException("All elements of set must be "
- + "of type string.");
- }
- }
- this.prohibitedACAttributes = new HashSet(prohibitedACAttributes);
- }
- }
-
- /**
- * Returns the attribute certificate checker. The returned set contains
- * {@link PKIXAttrCertChecker}s and is immutable.
- *
- * @return Returns the attribute certificate checker. Is never
- * null.
- */
- public virtual ISet GetAttrCertCheckers()
- {
- return new HashSet(attrCertCheckers);
- }
-
- /**
- * Sets the attribute certificate checkers.
- *
- * All elements in the ISet must a {@link PKIXAttrCertChecker}.
- *
- *
- * The given set is cloned.
- *
- *
- * @param attrCertCheckers The attribute certificate checkers to set. Is
- * never null.
- * @throws ClassCastException if an element of attrCertCheckers
- * is not a PKIXAttrCertChecker.
- */
- public virtual void SetAttrCertCheckers(
- ISet attrCertCheckers)
- {
- if (attrCertCheckers == null)
- {
- this.attrCertCheckers = new HashSet();
- }
- else
- {
- foreach (object obj in attrCertCheckers)
- {
- if (!(obj is PkixAttrCertChecker))
- {
- throw new InvalidCastException("All elements of set must be "
- + "of type " + typeof(PkixAttrCertChecker).FullName + ".");
- }
- }
- this.attrCertCheckers = new HashSet(attrCertCheckers);
- }
- }
- }
-}
diff --git a/BCCrypto/src/pkix/PkixPolicyNode.cs b/BCCrypto/src/pkix/PkixPolicyNode.cs
deleted file mode 100644
index fc5b82f..0000000
--- a/BCCrypto/src/pkix/PkixPolicyNode.cs
+++ /dev/null
@@ -1,158 +0,0 @@
-using System;
-using System.Collections;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Pkix
-{
- ///
- /// Summary description for PkixPolicyNode.
- ///
- public class PkixPolicyNode
-// : IPolicyNode
- {
- protected IList mChildren;
- protected int mDepth;
- protected ISet mExpectedPolicies;
- protected PkixPolicyNode mParent;
- protected ISet mPolicyQualifiers;
- protected string mValidPolicy;
- protected bool mCritical;
-
- public virtual int Depth
- {
- get { return this.mDepth; }
- }
-
- public virtual IEnumerable Children
- {
- get { return new EnumerableProxy(mChildren); }
- }
-
- public virtual bool IsCritical
- {
- get { return this.mCritical; }
- set { this.mCritical = value; }
- }
-
- public virtual ISet PolicyQualifiers
- {
- get { return new HashSet(this.mPolicyQualifiers); }
- }
-
- public virtual string ValidPolicy
- {
- get { return this.mValidPolicy; }
- }
-
- public virtual bool HasChildren
- {
- get { return mChildren.Count != 0; }
- }
-
- public virtual ISet ExpectedPolicies
- {
- get { return new HashSet(this.mExpectedPolicies); }
- set { this.mExpectedPolicies = new HashSet(value); }
- }
-
- public virtual PkixPolicyNode Parent
- {
- get { return this.mParent; }
- set { this.mParent = value; }
- }
-
- /// Constructors
- public PkixPolicyNode(
- IList children,
- int depth,
- ISet expectedPolicies,
- PkixPolicyNode parent,
- ISet policyQualifiers,
- string validPolicy,
- bool critical)
- {
- if (children == null)
- {
- this.mChildren = Platform.CreateArrayList();
- }
- else
- {
- this.mChildren = Platform.CreateArrayList(children);
- }
-
- this.mDepth = depth;
- this.mExpectedPolicies = expectedPolicies;
- this.mParent = parent;
- this.mPolicyQualifiers = policyQualifiers;
- this.mValidPolicy = validPolicy;
- this.mCritical = critical;
- }
-
- public virtual void AddChild(
- PkixPolicyNode child)
- {
- child.Parent = this;
- mChildren.Add(child);
- }
-
- public virtual void RemoveChild(
- PkixPolicyNode child)
- {
- mChildren.Remove(child);
- }
-
- public override string ToString()
- {
- return ToString("");
- }
-
- public virtual string ToString(
- string indent)
- {
- StringBuilder buf = new StringBuilder();
- buf.Append(indent);
- buf.Append(mValidPolicy);
- buf.Append(" {");
- buf.Append(Platform.NewLine);
-
- foreach (PkixPolicyNode child in mChildren)
- {
- buf.Append(child.ToString(indent + " "));
- }
-
- buf.Append(indent);
- buf.Append("}");
- buf.Append(Platform.NewLine);
- return buf.ToString();
- }
-
- public virtual object Clone()
- {
- return Copy();
- }
-
- public virtual PkixPolicyNode Copy()
- {
- PkixPolicyNode node = new PkixPolicyNode(
- Platform.CreateArrayList(),
- mDepth,
- new HashSet(mExpectedPolicies),
- null,
- new HashSet(mPolicyQualifiers),
- mValidPolicy,
- mCritical);
-
- foreach (PkixPolicyNode child in mChildren)
- {
- PkixPolicyNode copy = child.Copy();
- copy.Parent = node;
- node.AddChild(copy);
- }
-
- return node;
- }
- }
-}
diff --git a/BCCrypto/src/pkix/ReasonsMask.cs b/BCCrypto/src/pkix/ReasonsMask.cs
deleted file mode 100644
index e389bfe..0000000
--- a/BCCrypto/src/pkix/ReasonsMask.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.Pkix
-{
- ///
- /// This class helps to handle CRL revocation reasons mask. Each CRL handles a
- /// certain set of revocation reasons.
- ///
- internal class ReasonsMask
- {
- private int _reasons;
-
- ///
- /// Constructs are reason mask with the reasons.
- ///
- /// The reasons.
- internal ReasonsMask(
- int reasons)
- {
- _reasons = reasons;
- }
-
- ///
- /// A reason mask with no reason.
- ///
- internal ReasonsMask()
- : this(0)
- {
- }
-
- ///
- /// A mask with all revocation reasons.
- ///
- internal static readonly ReasonsMask AllReasons = new ReasonsMask(
- ReasonFlags.AACompromise | ReasonFlags.AffiliationChanged | ReasonFlags.CACompromise
- | ReasonFlags.CertificateHold | ReasonFlags.CessationOfOperation
- | ReasonFlags.KeyCompromise | ReasonFlags.PrivilegeWithdrawn | ReasonFlags.Unused
- | ReasonFlags.Superseded);
-
- /**
- * Adds all reasons from the reasons mask to this mask.
- *
- * @param mask The reasons mask to add.
- */
- internal void AddReasons(
- ReasonsMask mask)
- {
- _reasons = _reasons | mask.Reasons.IntValue;
- }
-
- ///
- /// Returns true if this reasons mask contains all possible
- /// reasons.
- ///
- /// true if this reasons mask contains all possible reasons.
- ///
- internal bool IsAllReasons
- {
- get { return _reasons == AllReasons._reasons; }
- }
-
- ///
- /// Intersects this mask with the given reasons mask.
- ///
- /// mask The mask to intersect with.
- /// The intersection of this and teh given mask.
- internal ReasonsMask Intersect(
- ReasonsMask mask)
- {
- ReasonsMask _mask = new ReasonsMask();
- _mask.AddReasons(new ReasonsMask(_reasons & mask.Reasons.IntValue));
- return _mask;
- }
-
- ///
- /// Returns true if the passed reasons mask has new reasons.
- ///
- /// The reasons mask which should be tested for new reasons.
- /// true if the passed reasons mask has new reasons.
- internal bool HasNewReasons(
- ReasonsMask mask)
- {
- return ((_reasons | mask.Reasons.IntValue ^ _reasons) != 0);
- }
-
- ///
- /// Returns the reasons in this mask.
- ///
- public ReasonFlags Reasons
- {
- get { return new ReasonFlags(_reasons); }
- }
- }
-}
diff --git a/BCCrypto/src/pkix/Rfc3280CertPathUtilities.cs b/BCCrypto/src/pkix/Rfc3280CertPathUtilities.cs
deleted file mode 100644
index c6f3fbf..0000000
--- a/BCCrypto/src/pkix/Rfc3280CertPathUtilities.cs
+++ /dev/null
@@ -1,2448 +0,0 @@
-using System;
-using System.Collections;
-using System.Globalization;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Date;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Pkix
-{
- public class Rfc3280CertPathUtilities
- {
- private static readonly PkixCrlUtilities CrlUtilities = new PkixCrlUtilities();
-
- internal static readonly string ANY_POLICY = "2.5.29.32.0";
-
- // key usage bits
- internal static readonly int KEY_CERT_SIGN = 5;
- internal static readonly int CRL_SIGN = 6;
-
- /**
- * If the complete CRL includes an issuing distribution point (IDP) CRL
- * extension check the following:
- *
- * (i) If the distribution point name is present in the IDP CRL extension
- * and the distribution field is present in the DP, then verify that one of
- * the names in the IDP matches one of the names in the DP. If the
- * distribution point name is present in the IDP CRL extension and the
- * distribution field is omitted from the DP, then verify that one of the
- * names in the IDP matches one of the names in the cRLIssuer field of the
- * DP.
- *
- *
- * (ii) If the onlyContainsUserCerts boolean is asserted in the IDP CRL
- * extension, verify that the certificate does not include the basic
- * constraints extension with the cA boolean asserted.
- *
- *
- * (iii) If the onlyContainsCACerts boolean is asserted in the IDP CRL
- * extension, verify that the certificate includes the basic constraints
- * extension with the cA boolean asserted.
- *
- *
- * (iv) Verify that the onlyContainsAttributeCerts boolean is not asserted.
- *
- *
- * @param dp The distribution point.
- * @param cert The certificate.
- * @param crl The CRL.
- * @throws AnnotatedException if one of the conditions is not met or an error occurs.
- */
- internal static void ProcessCrlB2(
- DistributionPoint dp,
- object cert,
- X509Crl crl)
- {
- IssuingDistributionPoint idp = null;
- try
- {
- idp = IssuingDistributionPoint.GetInstance(PkixCertPathValidatorUtilities.GetExtensionValue(crl, X509Extensions.IssuingDistributionPoint));
- }
- catch (Exception e)
- {
- throw new Exception("0 Issuing distribution point extension could not be decoded.", e);
- }
- // (b) (2) (i)
- // distribution point name is present
- if (idp != null)
- {
- if (idp.DistributionPoint != null)
- {
- // make list of names
- DistributionPointName dpName = IssuingDistributionPoint.GetInstance(idp).DistributionPoint;
- IList names = Platform.CreateArrayList();
-
- if (dpName.PointType == DistributionPointName.FullName)
- {
- GeneralName[] genNames = GeneralNames.GetInstance(dpName.Name).GetNames();
- for (int j = 0; j < genNames.Length; j++)
- {
- names.Add(genNames[j]);
- }
- }
- if (dpName.PointType == DistributionPointName.NameRelativeToCrlIssuer)
- {
- Asn1EncodableVector vec = new Asn1EncodableVector();
- try
- {
- IEnumerator e = Asn1Sequence.GetInstance(
- Asn1Sequence.FromByteArray(crl.IssuerDN.GetEncoded())).GetEnumerator();
- while (e.MoveNext())
- {
- vec.Add((Asn1Encodable)e.Current);
- }
- }
- catch (IOException e)
- {
- throw new Exception("Could not read CRL issuer.", e);
- }
- vec.Add(dpName.Name);
- names.Add(new GeneralName(X509Name.GetInstance(new DerSequence(vec))));
- }
- bool matches = false;
- // verify that one of the names in the IDP matches one
- // of the names in the DP.
- if (dp.DistributionPointName != null)
- {
- dpName = dp.DistributionPointName;
- GeneralName[] genNames = null;
- if (dpName.PointType == DistributionPointName.FullName)
- {
- genNames = GeneralNames.GetInstance(dpName.Name).GetNames();
- }
- if (dpName.PointType == DistributionPointName.NameRelativeToCrlIssuer)
- {
- if (dp.CrlIssuer != null)
- {
- genNames = dp.CrlIssuer.GetNames();
- }
- else
- {
- genNames = new GeneralName[1];
- try
- {
- genNames[0] = new GeneralName(
- PkixCertPathValidatorUtilities.GetIssuerPrincipal(cert));
- }
- catch (IOException e)
- {
- throw new Exception("Could not read certificate issuer.", e);
- }
- }
- for (int j = 0; j < genNames.Length; j++)
- {
- IEnumerator e = Asn1Sequence.GetInstance(genNames[j].Name.ToAsn1Object()).GetEnumerator();
- Asn1EncodableVector vec = new Asn1EncodableVector();
- while (e.MoveNext())
- {
- vec.Add((Asn1Encodable)e.Current);
- }
- vec.Add(dpName.Name);
- genNames[j] = new GeneralName(X509Name.GetInstance(new DerSequence(vec)));
- }
- }
- if (genNames != null)
- {
- for (int j = 0; j < genNames.Length; j++)
- {
- if (names.Contains(genNames[j]))
- {
- matches = true;
- break;
- }
- }
- }
- if (!matches)
- {
- throw new Exception(
- "No match for certificate CRL issuing distribution point name to cRLIssuer CRL distribution point.");
- }
- }
- // verify that one of the names in
- // the IDP matches one of the names in the cRLIssuer field of
- // the DP
- else
- {
- if (dp.CrlIssuer == null)
- {
- throw new Exception("Either the cRLIssuer or the distributionPoint field must "
- + "be contained in DistributionPoint.");
- }
- GeneralName[] genNames = dp.CrlIssuer.GetNames();
- for (int j = 0; j < genNames.Length; j++)
- {
- if (names.Contains(genNames[j]))
- {
- matches = true;
- break;
- }
- }
- if (!matches)
- {
- throw new Exception(
- "No match for certificate CRL issuing distribution point name to cRLIssuer CRL distribution point.");
- }
- }
- }
- BasicConstraints bc = null;
- try
- {
- bc = BasicConstraints.GetInstance(PkixCertPathValidatorUtilities.GetExtensionValue(
- (IX509Extension)cert, X509Extensions.BasicConstraints));
- }
- catch (Exception e)
- {
- throw new Exception("Basic constraints extension could not be decoded.", e);
- }
-
- //if (cert is X509Certificate)
- {
- // (b) (2) (ii)
- if (idp.OnlyContainsUserCerts && ((bc != null) && bc.IsCA()))
- {
- throw new Exception("CA Cert CRL only contains user certificates.");
- }
-
- // (b) (2) (iii)
- if (idp.OnlyContainsCACerts && (bc == null || !bc.IsCA()))
- {
- throw new Exception("End CRL only contains CA certificates.");
- }
- }
-
- // (b) (2) (iv)
- if (idp.OnlyContainsAttributeCerts)
- {
- throw new Exception("onlyContainsAttributeCerts boolean is asserted.");
- }
- }
- }
-
- internal static void ProcessCertBC(
- PkixCertPath certPath,
- int index,
- PkixNameConstraintValidator nameConstraintValidator)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
- int n = certs.Count;
- // i as defined in the algorithm description
- int i = n - index;
- //
- // (b), (c) permitted and excluded subtree checking.
- //
- if (!(PkixCertPathValidatorUtilities.IsSelfIssued(cert) && (i < n)))
- {
- X509Name principal = cert.SubjectDN;
- Asn1InputStream aIn = new Asn1InputStream(principal.GetEncoded());
- Asn1Sequence dns;
-
- try
- {
- dns = DerSequence.GetInstance(aIn.ReadObject());
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Exception extracting subject name when checking subtrees.", e, certPath, index);
- }
-
- try
- {
- nameConstraintValidator.CheckPermittedDN(dns);
- nameConstraintValidator.CheckExcludedDN(dns);
- }
- catch (PkixNameConstraintValidatorException e)
- {
- throw new PkixCertPathValidatorException(
- "Subtree check for certificate subject failed.", e, certPath, index);
- }
-
- GeneralNames altName = null;
- try
- {
- altName = GeneralNames.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.SubjectAlternativeName));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Subject alternative name extension could not be decoded.", e, certPath, index);
- }
-
- IList emails = X509Name.GetInstance(dns).GetValueList(X509Name.EmailAddress);
- foreach (string email in emails)
- {
- GeneralName emailAsGeneralName = new GeneralName(GeneralName.Rfc822Name, email);
- try
- {
- nameConstraintValidator.checkPermitted(emailAsGeneralName);
- nameConstraintValidator.checkExcluded(emailAsGeneralName);
- }
- catch (PkixNameConstraintValidatorException ex)
- {
- throw new PkixCertPathValidatorException(
- "Subtree check for certificate subject alternative email failed.", ex, certPath, index);
- }
- }
- if (altName != null)
- {
- GeneralName[] genNames = null;
- try
- {
- genNames = altName.GetNames();
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Subject alternative name contents could not be decoded.", e, certPath, index);
- }
- foreach (GeneralName genName in genNames)
- {
- try
- {
- nameConstraintValidator.checkPermitted(genName);
- nameConstraintValidator.checkExcluded(genName);
- }
- catch (PkixNameConstraintValidatorException e)
- {
- throw new PkixCertPathValidatorException(
- "Subtree check for certificate subject alternative name failed.", e, certPath, index);
- }
- }
- }
- }
- }
-
- internal static void PrepareNextCertA(
- PkixCertPath certPath,
- int index)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
- //
- //
- // (a) check the policy mappings
- //
- Asn1Sequence pm = null;
- try
- {
- pm = Asn1Sequence.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.PolicyMappings));
- }
- catch (Exception ex)
- {
- throw new PkixCertPathValidatorException(
- "Policy mappings extension could not be decoded.", ex, certPath, index);
- }
- if (pm != null)
- {
- Asn1Sequence mappings = pm;
-
- for (int j = 0; j < mappings.Count; j++)
- {
- DerObjectIdentifier issuerDomainPolicy = null;
- DerObjectIdentifier subjectDomainPolicy = null;
- try
- {
- Asn1Sequence mapping = DerSequence.GetInstance(mappings[j]);
-
- issuerDomainPolicy = DerObjectIdentifier.GetInstance(mapping[0]);
- subjectDomainPolicy = DerObjectIdentifier.GetInstance(mapping[1]);
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Policy mappings extension contents could not be decoded.", e, certPath, index);
- }
-
- if (Rfc3280CertPathUtilities.ANY_POLICY.Equals(issuerDomainPolicy.Id))
- throw new PkixCertPathValidatorException(
- "IssuerDomainPolicy is anyPolicy", null, certPath, index);
-
- if (Rfc3280CertPathUtilities.ANY_POLICY.Equals(subjectDomainPolicy.Id))
- throw new PkixCertPathValidatorException(
- "SubjectDomainPolicy is anyPolicy,", null, certPath, index);
- }
- }
- }
-
- internal static PkixPolicyNode ProcessCertD(
- PkixCertPath certPath,
- int index,
- ISet acceptablePolicies,
- PkixPolicyNode validPolicyTree,
- IList[] policyNodes,
- int inhibitAnyPolicy)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
- int n = certs.Count;
- // i as defined in the algorithm description
- int i = n - index;
- //
- // (d) policy Information checking against initial policy and
- // policy mapping
- //
- Asn1Sequence certPolicies = null;
- try
- {
- certPolicies = DerSequence.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.CertificatePolicies));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Could not read certificate policies extension from certificate.", e, certPath, index);
- }
- if (certPolicies != null && validPolicyTree != null)
- {
- //
- // (d) (1)
- //
- ISet pols = new HashSet();
-
- foreach (Asn1Encodable ae in certPolicies)
- {
- PolicyInformation pInfo = PolicyInformation.GetInstance(ae.ToAsn1Object());
- DerObjectIdentifier pOid = pInfo.PolicyIdentifier;
-
- pols.Add(pOid.Id);
-
- if (!Rfc3280CertPathUtilities.ANY_POLICY.Equals(pOid.Id))
- {
- ISet pq = null;
- try
- {
- pq = PkixCertPathValidatorUtilities.GetQualifierSet(pInfo.PolicyQualifiers);
- }
- catch (PkixCertPathValidatorException ex)
- {
- throw new PkixCertPathValidatorException(
- "Policy qualifier info set could not be build.", ex, certPath, index);
- }
-
- bool match = PkixCertPathValidatorUtilities.ProcessCertD1i(i, policyNodes, pOid, pq);
-
- if (!match)
- {
- PkixCertPathValidatorUtilities.ProcessCertD1ii(i, policyNodes, pOid, pq);
- }
- }
- }
-
- if (acceptablePolicies.IsEmpty || acceptablePolicies.Contains(Rfc3280CertPathUtilities.ANY_POLICY))
- {
- acceptablePolicies.Clear();
- acceptablePolicies.AddAll(pols);
- }
- else
- {
- ISet t1 = new HashSet();
-
- foreach (object o in acceptablePolicies)
- {
- if (pols.Contains(o))
- {
- t1.Add(o);
- }
- }
- acceptablePolicies.Clear();
- acceptablePolicies.AddAll(t1);
- }
-
- //
- // (d) (2)
- //
- if ((inhibitAnyPolicy > 0) || ((i < n) && PkixCertPathValidatorUtilities.IsSelfIssued(cert)))
- {
- foreach (Asn1Encodable ae in certPolicies)
- {
- PolicyInformation pInfo = PolicyInformation.GetInstance(ae.ToAsn1Object());
- if (Rfc3280CertPathUtilities.ANY_POLICY.Equals(pInfo.PolicyIdentifier.Id))
- {
- ISet _apq = PkixCertPathValidatorUtilities.GetQualifierSet(pInfo.PolicyQualifiers);
- IList _nodes = policyNodes[i - 1];
-
- for (int k = 0; k < _nodes.Count; k++)
- {
- PkixPolicyNode _node = (PkixPolicyNode)_nodes[k];
-
- IEnumerator _policySetIter = _node.ExpectedPolicies.GetEnumerator();
- while (_policySetIter.MoveNext())
- {
- object _tmp = _policySetIter.Current;
-
- string _policy;
- if (_tmp is string)
- {
- _policy = (string)_tmp;
- }
- else if (_tmp is DerObjectIdentifier)
- {
- _policy = ((DerObjectIdentifier)_tmp).Id;
- }
- else
- {
- continue;
- }
-
- bool _found = false;
-
- foreach (PkixPolicyNode _child in _node.Children)
- {
- if (_policy.Equals(_child.ValidPolicy))
- {
- _found = true;
- }
- }
-
- if (!_found)
- {
- ISet _newChildExpectedPolicies = new HashSet();
- _newChildExpectedPolicies.Add(_policy);
-
- PkixPolicyNode _newChild = new PkixPolicyNode(Platform.CreateArrayList(), i,
- _newChildExpectedPolicies, _node, _apq, _policy, false);
- _node.AddChild(_newChild);
- policyNodes[i].Add(_newChild);
- }
- }
- }
- break;
- }
- }
- }
-
- PkixPolicyNode _validPolicyTree = validPolicyTree;
- //
- // (d) (3)
- //
- for (int j = (i - 1); j >= 0; j--)
- {
- IList nodes = policyNodes[j];
-
- for (int k = 0; k < nodes.Count; k++)
- {
- PkixPolicyNode node = (PkixPolicyNode)nodes[k];
- if (!node.HasChildren)
- {
- _validPolicyTree = PkixCertPathValidatorUtilities.RemovePolicyNode(_validPolicyTree, policyNodes,
- node);
- if (_validPolicyTree == null)
- {
- break;
- }
- }
- }
- }
-
- //
- // d (4)
- //
- ISet criticalExtensionOids = cert.GetCriticalExtensionOids();
-
- if (criticalExtensionOids != null)
- {
- bool critical = criticalExtensionOids.Contains(X509Extensions.CertificatePolicies.Id);
-
- IList nodes = policyNodes[i];
- for (int j = 0; j < nodes.Count; j++)
- {
- PkixPolicyNode node = (PkixPolicyNode)nodes[j];
- node.IsCritical = critical;
- }
- }
- return _validPolicyTree;
- }
- return null;
- }
-
- /**
- * If the DP includes cRLIssuer, then verify that the issuer field in the
- * complete CRL matches cRLIssuer in the DP and that the complete CRL
- * contains an
- * g distribution point extension with the indirectCRL
- * boolean asserted. Otherwise, verify that the CRL issuer matches the
- * certificate issuer.
- *
- * @param dp The distribution point.
- * @param cert The certificate ot attribute certificate.
- * @param crl The CRL for cert.
- * @throws AnnotatedException if one of the above conditions does not apply or an error
- * occurs.
- */
- internal static void ProcessCrlB1(
- DistributionPoint dp,
- object cert,
- X509Crl crl)
- {
- Asn1Object idp = PkixCertPathValidatorUtilities.GetExtensionValue(
- crl, X509Extensions.IssuingDistributionPoint);
-
- bool isIndirect = false;
- if (idp != null)
- {
- if (IssuingDistributionPoint.GetInstance(idp).IsIndirectCrl)
- {
- isIndirect = true;
- }
- }
- byte[] issuerBytes = crl.IssuerDN.GetEncoded();
-
- bool matchIssuer = false;
- if (dp.CrlIssuer != null)
- {
- GeneralName[] genNames = dp.CrlIssuer.GetNames();
- for (int j = 0; j < genNames.Length; j++)
- {
- if (genNames[j].TagNo == GeneralName.DirectoryName)
- {
- try
- {
- if (Org.BouncyCastle.Utilities.Arrays.AreEqual(genNames[j].Name.ToAsn1Object().GetEncoded(), issuerBytes))
- {
- matchIssuer = true;
- }
- }
- catch (IOException e)
- {
- throw new Exception(
- "CRL issuer information from distribution point cannot be decoded.", e);
- }
- }
- }
- if (matchIssuer && !isIndirect)
- {
- throw new Exception("Distribution point contains cRLIssuer field but CRL is not indirect.");
- }
- if (!matchIssuer)
- {
- throw new Exception("CRL issuer of CRL does not match CRL issuer of distribution point.");
- }
- }
- else
- {
- if (crl.IssuerDN.Equivalent(PkixCertPathValidatorUtilities.GetIssuerPrincipal(cert), true))
- {
- matchIssuer = true;
- }
- }
- if (!matchIssuer)
- {
- throw new Exception("Cannot find matching CRL issuer for certificate.");
- }
- }
-
- internal static ReasonsMask ProcessCrlD(
- X509Crl crl,
- DistributionPoint dp)
- //throws AnnotatedException
- {
- IssuingDistributionPoint idp = null;
- try
- {
- idp = IssuingDistributionPoint.GetInstance(PkixCertPathValidatorUtilities.GetExtensionValue(crl, X509Extensions.IssuingDistributionPoint));
- }
- catch (Exception e)
- {
- throw new Exception("issuing distribution point extension could not be decoded.", e);
- }
-
- // (d) (1)
- if (idp != null && idp.OnlySomeReasons != null && dp.Reasons != null)
- {
- return new ReasonsMask(dp.Reasons.IntValue).Intersect(new ReasonsMask(idp.OnlySomeReasons
- .IntValue));
- }
- // (d) (4)
- if ((idp == null || idp.OnlySomeReasons == null) && dp.Reasons == null)
- {
- return ReasonsMask.AllReasons;
- }
-
- // (d) (2) and (d)(3)
-
- ReasonsMask dpReasons = null;
-
- if (dp.Reasons == null)
- {
- dpReasons = ReasonsMask.AllReasons;
- }
- else
- {
- dpReasons = new ReasonsMask(dp.Reasons.IntValue);
- }
-
- ReasonsMask idpReasons = null;
-
- if (idp == null)
- {
- idpReasons = ReasonsMask.AllReasons;
- }
- else
- {
- idpReasons = new ReasonsMask(idp.OnlySomeReasons.IntValue);
- }
-
- return dpReasons.Intersect(idpReasons);
- }
-
- /**
- * Obtain and validate the certification path for the complete CRL issuer.
- * If a key usage extension is present in the CRL issuer's certificate,
- * verify that the cRLSign bit is set.
- *
- * @param crl CRL which contains revocation information for the certificate
- * cert.
- * @param cert The attribute certificate or certificate to check if it is
- * revoked.
- * @param defaultCRLSignCert The issuer certificate of the certificate cert.
- * @param defaultCRLSignKey The public key of the issuer certificate
- * defaultCRLSignCert.
- * @param paramsPKIX paramsPKIX PKIX parameters.
- * @param certPathCerts The certificates on the certification path.
- * @return A Set with all keys of possible CRL issuer
- * certificates.
- * @throws AnnotatedException if the CRL is not valid or the status cannot be checked or
- * some error occurs.
- */
- internal static ISet ProcessCrlF(
- X509Crl crl,
- object cert,
- X509Certificate defaultCRLSignCert,
- AsymmetricKeyParameter defaultCRLSignKey,
- PkixParameters paramsPKIX,
- IList certPathCerts)
- {
- // (f)
-
- // get issuer from CRL
- X509CertStoreSelector selector = new X509CertStoreSelector();
- try
- {
- selector.Subject = crl.IssuerDN;
- }
- catch (IOException e)
- {
- throw new Exception(
- "Subject criteria for certificate selector to find issuer certificate for CRL could not be set.", e);
- }
-
- // get CRL signing certs
- IList coll = Platform.CreateArrayList();
-
- try
- {
- CollectionUtilities.AddRange(coll, PkixCertPathValidatorUtilities.FindCertificates(selector, paramsPKIX.GetStores()));
- CollectionUtilities.AddRange(coll, PkixCertPathValidatorUtilities.FindCertificates(selector, paramsPKIX.GetAdditionalStores()));
- }
- catch (Exception e)
- {
- throw new Exception("Issuer certificate for CRL cannot be searched.", e);
- }
-
- coll.Add(defaultCRLSignCert);
-
- IEnumerator cert_it = coll.GetEnumerator();
-
- IList validCerts = Platform.CreateArrayList();
- IList validKeys = Platform.CreateArrayList();
-
- while (cert_it.MoveNext())
- {
- X509Certificate signingCert = (X509Certificate)cert_it.Current;
-
- /*
- * CA of the certificate, for which this CRL is checked, has also
- * signed CRL, so skip the path validation, because is already done
- */
- if (signingCert.Equals(defaultCRLSignCert))
- {
- validCerts.Add(signingCert);
- validKeys.Add(defaultCRLSignKey);
- continue;
- }
- try
- {
-// CertPathBuilder builder = CertPathBuilder.GetInstance("PKIX");
- PkixCertPathBuilder builder = new PkixCertPathBuilder();
- selector = new X509CertStoreSelector();
- selector.Certificate = signingCert;
-
- PkixParameters temp = (PkixParameters)paramsPKIX.Clone();
- temp.SetTargetCertConstraints(selector);
-
- PkixBuilderParameters parameters = (PkixBuilderParameters)
- PkixBuilderParameters.GetInstance(temp);
-
- /*
- * if signingCert is placed not higher on the cert path a
- * dependency loop results. CRL for cert is checked, but
- * signingCert is needed for checking the CRL which is dependent
- * on checking cert because it is higher in the cert path and so
- * signing signingCert transitively. so, revocation is disabled,
- * forgery attacks of the CRL are detected in this outer loop
- * for all other it must be enabled to prevent forgery attacks
- */
- if (certPathCerts.Contains(signingCert))
- {
- parameters.IsRevocationEnabled = false;
- }
- else
- {
- parameters.IsRevocationEnabled = true;
- }
- IList certs = builder.Build(parameters).CertPath.Certificates;
- validCerts.Add(signingCert);
- validKeys.Add(PkixCertPathValidatorUtilities.GetNextWorkingKey(certs, 0));
- }
- catch (PkixCertPathBuilderException e)
- {
- throw new Exception("Internal error.", e);
- }
- catch (PkixCertPathValidatorException e)
- {
- throw new Exception("Public key of issuer certificate of CRL could not be retrieved.", e);
- }
- //catch (Exception e)
- //{
- // throw new Exception(e.Message);
- //}
- }
-
- ISet checkKeys = new HashSet();
-
- Exception lastException = null;
- for (int i = 0; i < validCerts.Count; i++)
- {
- X509Certificate signCert = (X509Certificate)validCerts[i];
- bool[] keyusage = signCert.GetKeyUsage();
-
- if (keyusage != null && (keyusage.Length < 7 || !keyusage[CRL_SIGN]))
- {
- lastException = new Exception(
- "Issuer certificate key usage extension does not permit CRL signing.");
- }
- else
- {
- checkKeys.Add(validKeys[i]);
- }
- }
-
- if ((checkKeys.Count == 0) && lastException == null)
- {
- throw new Exception("Cannot find a valid issuer certificate.");
- }
- if ((checkKeys.Count == 0) && lastException != null)
- {
- throw lastException;
- }
-
- return checkKeys;
- }
-
- internal static AsymmetricKeyParameter ProcessCrlG(
- X509Crl crl,
- ISet keys)
- {
- Exception lastException = null;
- foreach (AsymmetricKeyParameter key in keys)
- {
- try
- {
- crl.Verify(key);
- return key;
- }
- catch (Exception e)
- {
- lastException = e;
- }
- }
- throw new Exception("Cannot verify CRL.", lastException);
- }
-
- internal static X509Crl ProcessCrlH(
- ISet deltaCrls,
- AsymmetricKeyParameter key)
- {
- Exception lastException = null;
- foreach (X509Crl crl in deltaCrls)
- {
- try
- {
- crl.Verify(key);
- return crl;
- }
- catch (Exception e)
- {
- lastException = e;
- }
- }
- if (lastException != null)
- {
- throw new Exception("Cannot verify delta CRL.", lastException);
- }
- return null;
- }
-
- /**
- * Checks a distribution point for revocation information for the
- * certificate cert.
- *
- * @param dp The distribution point to consider.
- * @param paramsPKIX PKIX parameters.
- * @param cert Certificate to check if it is revoked.
- * @param validDate The date when the certificate revocation status should be
- * checked.
- * @param defaultCRLSignCert The issuer certificate of the certificate cert.
- * @param defaultCRLSignKey The public key of the issuer certificate
- * defaultCRLSignCert.
- * @param certStatus The current certificate revocation status.
- * @param reasonMask The reasons mask which is already checked.
- * @param certPathCerts The certificates of the certification path.
- * @throws AnnotatedException if the certificate is revoked or the status cannot be checked
- * or some error occurs.
- */
- private static void CheckCrl(
- DistributionPoint dp,
- PkixParameters paramsPKIX,
- X509Certificate cert,
- DateTime validDate,
- X509Certificate defaultCRLSignCert,
- AsymmetricKeyParameter defaultCRLSignKey,
- CertStatus certStatus,
- ReasonsMask reasonMask,
- IList certPathCerts)
- //throws AnnotatedException
- {
- DateTime currentDate = DateTime.UtcNow;
-
- if (validDate.Ticks > currentDate.Ticks)
- {
- throw new Exception("Validation time is in future.");
- }
-
- // (a)
- /*
- * We always get timely valid CRLs, so there is no step (a) (1).
- * "locally cached" CRLs are assumed to be in getStore(), additional
- * CRLs must be enabled in the ExtendedPKIXParameters and are in
- * getAdditionalStore()
- */
-
- ISet crls = PkixCertPathValidatorUtilities.GetCompleteCrls(dp, cert, currentDate, paramsPKIX);
- bool validCrlFound = false;
- Exception lastException = null;
-
- IEnumerator crl_iter = crls.GetEnumerator();
-
- while (crl_iter.MoveNext() && certStatus.Status == CertStatus.Unrevoked && !reasonMask.IsAllReasons)
- {
- try
- {
- X509Crl crl = (X509Crl)crl_iter.Current;
-
- // (d)
- ReasonsMask interimReasonsMask = Rfc3280CertPathUtilities.ProcessCrlD(crl, dp);
-
- // (e)
- /*
- * The reasons mask is updated at the end, so only valid CRLs
- * can update it. If this CRL does not contain new reasons it
- * must be ignored.
- */
- if (!interimReasonsMask.HasNewReasons(reasonMask))
- {
- continue;
- }
-
- // (f)
- ISet keys = Rfc3280CertPathUtilities.ProcessCrlF(crl, cert, defaultCRLSignCert, defaultCRLSignKey,
- paramsPKIX, certPathCerts);
- // (g)
- AsymmetricKeyParameter key = Rfc3280CertPathUtilities.ProcessCrlG(crl, keys);
-
- X509Crl deltaCRL = null;
-
- if (paramsPKIX.IsUseDeltasEnabled)
- {
- // get delta CRLs
- ISet deltaCRLs = PkixCertPathValidatorUtilities.GetDeltaCrls(currentDate, paramsPKIX, crl);
- // we only want one valid delta CRL
- // (h)
- deltaCRL = Rfc3280CertPathUtilities.ProcessCrlH(deltaCRLs, key);
- }
-
- /*
- * CRL must be be valid at the current time, not the validation
- * time. If a certificate is revoked with reason keyCompromise,
- * cACompromise, it can be used for forgery, also for the past.
- * This reason may not be contained in older CRLs.
- */
-
- /*
- * in the chain model signatures stay valid also after the
- * certificate has been expired, so they do not have to be in
- * the CRL validity time
- */
-
- if (paramsPKIX.ValidityModel != PkixParameters.ChainValidityModel)
- {
- /*
- * if a certificate has expired, but was revoked, it is not
- * more in the CRL, so it would be regarded as valid if the
- * first check is not done
- */
- if (cert.NotAfter.Ticks < crl.ThisUpdate.Ticks)
- {
- throw new Exception("No valid CRL for current time found.");
- }
- }
-
- Rfc3280CertPathUtilities.ProcessCrlB1(dp, cert, crl);
-
- // (b) (2)
- Rfc3280CertPathUtilities.ProcessCrlB2(dp, cert, crl);
-
- // (c)
- Rfc3280CertPathUtilities.ProcessCrlC(deltaCRL, crl, paramsPKIX);
-
- // (i)
- Rfc3280CertPathUtilities.ProcessCrlI(validDate, deltaCRL, cert, certStatus, paramsPKIX);
-
- // (j)
- Rfc3280CertPathUtilities.ProcessCrlJ(validDate, crl, cert, certStatus);
-
- // (k)
- if (certStatus.Status == CrlReason.RemoveFromCrl)
- {
- certStatus.Status = CertStatus.Unrevoked;
- }
-
- // update reasons mask
- reasonMask.AddReasons(interimReasonsMask);
-
- ISet criticalExtensions = crl.GetCriticalExtensionOids();
-
- if (criticalExtensions != null)
- {
- criticalExtensions = new HashSet(criticalExtensions);
- criticalExtensions.Remove(X509Extensions.IssuingDistributionPoint.Id);
- criticalExtensions.Remove(X509Extensions.DeltaCrlIndicator.Id);
-
- if (!criticalExtensions.IsEmpty)
- throw new Exception("CRL contains unsupported critical extensions.");
- }
-
- if (deltaCRL != null)
- {
- criticalExtensions = deltaCRL.GetCriticalExtensionOids();
- if (criticalExtensions != null)
- {
- criticalExtensions = new HashSet(criticalExtensions);
- criticalExtensions.Remove(X509Extensions.IssuingDistributionPoint.Id);
- criticalExtensions.Remove(X509Extensions.DeltaCrlIndicator.Id);
-
- if (!criticalExtensions.IsEmpty)
- throw new Exception("Delta CRL contains unsupported critical extension.");
- }
- }
-
- validCrlFound = true;
- }
- catch (Exception e)
- {
- lastException = e;
- }
- }
- if (!validCrlFound)
- {
- throw lastException;
- }
- }
-
- /**
- * Checks a certificate if it is revoked.
- *
- * @param paramsPKIX PKIX parameters.
- * @param cert Certificate to check if it is revoked.
- * @param validDate The date when the certificate revocation status should be
- * checked.
- * @param sign The issuer certificate of the certificate cert.
- * @param workingPublicKey The public key of the issuer certificate sign.
- * @param certPathCerts The certificates of the certification path.
- * @throws AnnotatedException if the certificate is revoked or the status cannot be checked
- * or some error occurs.
- */
- protected static void CheckCrls(
- PkixParameters paramsPKIX,
- X509Certificate cert,
- DateTime validDate,
- X509Certificate sign,
- AsymmetricKeyParameter workingPublicKey,
- IList certPathCerts)
- {
- Exception lastException = null;
- CrlDistPoint crldp = null;
-
- try
- {
- crldp = CrlDistPoint.GetInstance(PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.CrlDistributionPoints));
- }
- catch (Exception e)
- {
- throw new Exception("CRL distribution point extension could not be read.", e);
- }
-
- try
- {
- PkixCertPathValidatorUtilities.AddAdditionalStoresFromCrlDistributionPoint(crldp, paramsPKIX);
- }
- catch (Exception e)
- {
- throw new Exception(
- "No additional CRL locations could be decoded from CRL distribution point extension.", e);
- }
- CertStatus certStatus = new CertStatus();
- ReasonsMask reasonsMask = new ReasonsMask();
-
- bool validCrlFound = false;
-
- // for each distribution point
- if (crldp != null)
- {
- DistributionPoint[] dps = null;
- try
- {
- dps = crldp.GetDistributionPoints();
- }
- catch (Exception e)
- {
- throw new Exception("Distribution points could not be read.", e);
- }
- if (dps != null)
- {
- for (int i = 0; i < dps.Length && certStatus.Status == CertStatus.Unrevoked && !reasonsMask.IsAllReasons; i++)
- {
- PkixParameters paramsPKIXClone = (PkixParameters)paramsPKIX.Clone();
- try
- {
- CheckCrl(dps[i], paramsPKIXClone, cert, validDate, sign, workingPublicKey, certStatus, reasonsMask, certPathCerts);
- validCrlFound = true;
- }
- catch (Exception e)
- {
- lastException = e;
- }
- }
- }
- }
-
- /*
- * If the revocation status has not been determined, repeat the process
- * above with any available CRLs not specified in a distribution point
- * but issued by the certificate issuer.
- */
-
- if (certStatus.Status == CertStatus.Unrevoked && !reasonsMask.IsAllReasons)
- {
- try
- {
- /*
- * assume a DP with both the reasons and the cRLIssuer fields
- * omitted and a distribution point name of the certificate
- * issuer.
- */
- Asn1Object issuer = null;
- try
- {
- issuer = new Asn1InputStream(cert.IssuerDN.GetEncoded()).ReadObject();
- }
- catch (Exception e)
- {
- throw new Exception("Issuer from certificate for CRL could not be reencoded.", e);
- }
- DistributionPoint dp = new DistributionPoint(new DistributionPointName(0, new GeneralNames(
- new GeneralName(GeneralName.DirectoryName, issuer))), null, null);
- PkixParameters paramsPKIXClone = (PkixParameters)paramsPKIX.Clone();
-
- CheckCrl(dp, paramsPKIXClone, cert, validDate, sign, workingPublicKey, certStatus, reasonsMask,
- certPathCerts);
-
- validCrlFound = true;
- }
- catch (Exception e)
- {
- lastException = e;
- }
- }
-
- if (!validCrlFound)
- {
- throw lastException;
- }
- if (certStatus.Status != CertStatus.Unrevoked)
- {
- // This format is enforced by the NistCertPath tests
- string formattedDate = certStatus.RevocationDate.Value.ToString(
- "ddd MMM dd HH:mm:ss K yyyy");
- string message = "Certificate revocation after " + formattedDate;
- message += ", reason: " + CrlReasons[certStatus.Status];
- throw new Exception(message);
- }
-
- if (!reasonsMask.IsAllReasons && certStatus.Status == CertStatus.Unrevoked)
- {
- certStatus.Status = CertStatus.Undetermined;
- }
-
- if (certStatus.Status == CertStatus.Undetermined)
- {
- throw new Exception("Certificate status could not be determined.");
- }
- }
-
- internal static PkixPolicyNode PrepareCertB(
- PkixCertPath certPath,
- int index,
- IList[] policyNodes,
- PkixPolicyNode validPolicyTree,
- int policyMapping)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
- int n = certs.Count;
- // i as defined in the algorithm description
- int i = n - index;
- // (b)
- //
- Asn1Sequence pm = null;
- try
- {
- pm = (Asn1Sequence)Asn1Sequence.GetInstance(PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.PolicyMappings));
- }
- catch (Exception ex)
- {
- throw new PkixCertPathValidatorException(
- "Policy mappings extension could not be decoded.", ex, certPath, index);
- }
- PkixPolicyNode _validPolicyTree = validPolicyTree;
- if (pm != null)
- {
- Asn1Sequence mappings = (Asn1Sequence)pm;
- IDictionary m_idp = Platform.CreateHashtable();
- ISet s_idp = new HashSet();
-
- for (int j = 0; j < mappings.Count; j++)
- {
- Asn1Sequence mapping = (Asn1Sequence) mappings[j];
- string id_p = ((DerObjectIdentifier) mapping[0]).Id;
- string sd_p = ((DerObjectIdentifier) mapping[1]).Id;
- ISet tmp;
-
- if (!m_idp.Contains(id_p))
- {
- tmp = new HashSet();
- tmp.Add(sd_p);
- m_idp[id_p] = tmp;
- s_idp.Add(id_p);
- }
- else
- {
- tmp = (ISet)m_idp[id_p];
- tmp.Add(sd_p);
- }
- }
-
- IEnumerator it_idp = s_idp.GetEnumerator();
- while (it_idp.MoveNext())
- {
- string id_p = (string)it_idp.Current;
-
- //
- // (1)
- //
- if (policyMapping > 0)
- {
- bool idp_found = false;
- IEnumerator nodes_i = policyNodes[i].GetEnumerator();
-
- while (nodes_i.MoveNext())
- {
- PkixPolicyNode node = (PkixPolicyNode)nodes_i.Current;
- if (node.ValidPolicy.Equals(id_p))
- {
- idp_found = true;
- node.ExpectedPolicies = (ISet)m_idp[id_p];
- break;
- }
- }
-
- if (!idp_found)
- {
- nodes_i = policyNodes[i].GetEnumerator();
- while (nodes_i.MoveNext())
- {
- PkixPolicyNode node = (PkixPolicyNode)nodes_i.Current;
- if (Rfc3280CertPathUtilities.ANY_POLICY.Equals(node.ValidPolicy))
- {
- ISet pq = null;
- Asn1Sequence policies = null;
- try
- {
- policies = (Asn1Sequence)PkixCertPathValidatorUtilities.GetExtensionValue(cert,
- X509Extensions.CertificatePolicies);
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Certificate policies extension could not be decoded.", e, certPath, index);
- }
-
- foreach (Asn1Encodable ae in policies)
- {
- PolicyInformation pinfo = null;
- try
- {
- pinfo = PolicyInformation.GetInstance(ae.ToAsn1Object());
- }
- catch (Exception ex)
- {
- throw new PkixCertPathValidatorException(
- "Policy information could not be decoded.", ex, certPath, index);
- }
- if (Rfc3280CertPathUtilities.ANY_POLICY.Equals(pinfo.PolicyIdentifier.Id))
- {
- try
- {
- pq = PkixCertPathValidatorUtilities
- .GetQualifierSet(pinfo.PolicyQualifiers);
- }
- catch (PkixCertPathValidatorException ex)
- {
- throw new PkixCertPathValidatorException(
- "Policy qualifier info set could not be decoded.", ex, certPath,
- index);
- }
- break;
- }
- }
- bool ci = false;
- ISet critExtOids = cert.GetCriticalExtensionOids();
- if (critExtOids != null)
- {
- ci = critExtOids.Contains(X509Extensions.CertificatePolicies.Id);
- }
-
- PkixPolicyNode p_node = (PkixPolicyNode)node.Parent;
- if (Rfc3280CertPathUtilities.ANY_POLICY.Equals(p_node.ValidPolicy))
- {
- PkixPolicyNode c_node = new PkixPolicyNode(Platform.CreateArrayList(), i,
- (ISet)m_idp[id_p], p_node, pq, id_p, ci);
- p_node.AddChild(c_node);
- policyNodes[i].Add(c_node);
- }
- break;
- }
- }
- }
-
- //
- // (2)
- //
- }
- else if (policyMapping <= 0)
- {
- foreach (PkixPolicyNode node in Platform.CreateArrayList(policyNodes[i]))
- {
- if (node.ValidPolicy.Equals(id_p))
- {
- node.Parent.RemoveChild(node);
-
- for (int k = i - 1; k >= 0; k--)
- {
- foreach (PkixPolicyNode node2 in Platform.CreateArrayList(policyNodes[k]))
- {
- if (!node2.HasChildren)
- {
- _validPolicyTree = PkixCertPathValidatorUtilities.RemovePolicyNode(
- _validPolicyTree, policyNodes, node2);
-
- if (_validPolicyTree == null)
- break;
- }
- }
- }
- }
- }
- }
- }
- }
- return _validPolicyTree;
- }
-
- internal static ISet[] ProcessCrlA1ii(
- DateTime currentDate,
- PkixParameters paramsPKIX,
- X509Certificate cert,
- X509Crl crl)
- {
- ISet deltaSet = new HashSet();
- X509CrlStoreSelector crlselect = new X509CrlStoreSelector();
- crlselect.CertificateChecking = cert;
-
- try
- {
- IList issuer = Platform.CreateArrayList();
- issuer.Add(crl.IssuerDN);
- crlselect.Issuers = issuer;
- }
- catch (IOException e)
- {
- throw new Exception("Cannot extract issuer from CRL." + e, e);
- }
-
- crlselect.CompleteCrlEnabled = true;
- ISet completeSet = CrlUtilities.FindCrls(crlselect, paramsPKIX, currentDate);
-
- if (paramsPKIX.IsUseDeltasEnabled)
- {
- // get delta CRL(s)
- try
- {
- deltaSet.AddAll(PkixCertPathValidatorUtilities.GetDeltaCrls(currentDate, paramsPKIX, crl));
- }
- catch (Exception e)
- {
- throw new Exception("Exception obtaining delta CRLs.", e);
- }
- }
-
- return new ISet[]{ completeSet, deltaSet };
- }
-
- internal static ISet ProcessCrlA1i(
- DateTime currentDate,
- PkixParameters paramsPKIX,
- X509Certificate cert,
- X509Crl crl)
- {
- ISet deltaSet = new HashSet();
- if (paramsPKIX.IsUseDeltasEnabled)
- {
- CrlDistPoint freshestCRL = null;
- try
- {
- freshestCRL = CrlDistPoint.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.FreshestCrl));
- }
- catch (Exception e)
- {
- throw new Exception("Freshest CRL extension could not be decoded from certificate.", e);
- }
-
- if (freshestCRL == null)
- {
- try
- {
- freshestCRL = CrlDistPoint.GetInstance(PkixCertPathValidatorUtilities.GetExtensionValue(crl, X509Extensions.FreshestCrl));
- }
- catch (Exception e)
- {
- throw new Exception("Freshest CRL extension could not be decoded from CRL.", e);
- }
- }
- if (freshestCRL != null)
- {
- try
- {
- PkixCertPathValidatorUtilities.AddAdditionalStoresFromCrlDistributionPoint(freshestCRL, paramsPKIX);
- }
- catch (Exception e)
- {
- throw new Exception(
- "No new delta CRL locations could be added from Freshest CRL extension.", e);
- }
- // get delta CRL(s)
- try
- {
- deltaSet.AddAll(PkixCertPathValidatorUtilities.GetDeltaCrls(currentDate, paramsPKIX, crl));
- }
- catch (Exception e)
- {
- throw new Exception("Exception obtaining delta CRLs.", e);
- }
- }
- }
- return deltaSet;
- }
-
- internal static void ProcessCertF(
- PkixCertPath certPath,
- int index,
- PkixPolicyNode validPolicyTree,
- int explicitPolicy)
- {
- //
- // (f)
- //
- if (explicitPolicy <= 0 && validPolicyTree == null)
- {
- throw new PkixCertPathValidatorException(
- "No valid policy tree found when one expected.", null, certPath, index);
- }
- }
-
- internal static void ProcessCertA(
- PkixCertPath certPath,
- PkixParameters paramsPKIX,
- int index,
- AsymmetricKeyParameter workingPublicKey,
- X509Name workingIssuerName,
- X509Certificate sign)
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
- //
- // (a) verify
- //
- try
- {
- // (a) (1)
- //
- cert.Verify(workingPublicKey);
- }
- catch (GeneralSecurityException e)
- {
- throw new PkixCertPathValidatorException("Could not validate certificate signature.", e, certPath, index);
- }
-
- try
- {
- // (a) (2)
- //
- cert.CheckValidity(PkixCertPathValidatorUtilities
- .GetValidCertDateFromValidityModel(paramsPKIX, certPath, index));
- }
- catch (CertificateExpiredException e)
- {
- throw new PkixCertPathValidatorException("Could not validate certificate: " + e.Message, e, certPath, index);
- }
- catch (CertificateNotYetValidException e)
- {
- throw new PkixCertPathValidatorException("Could not validate certificate: " + e.Message, e, certPath, index);
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException("Could not validate time of certificate.", e, certPath, index);
- }
-
- //
- // (a) (3)
- //
- if (paramsPKIX.IsRevocationEnabled)
- {
- try
- {
- CheckCrls(paramsPKIX, cert, PkixCertPathValidatorUtilities.GetValidCertDateFromValidityModel(paramsPKIX,
- certPath, index), sign, workingPublicKey, certs);
- }
- catch (Exception e)
- {
- Exception cause = e.InnerException;
- if (cause == null)
- {
- cause = e;
- }
- throw new PkixCertPathValidatorException(e.Message, cause, certPath, index);
- }
- }
-
- //
- // (a) (4) name chaining
- //
- X509Name issuer = PkixCertPathValidatorUtilities.GetIssuerPrincipal(cert);
- if (!issuer.Equivalent(workingIssuerName, true))
- {
- throw new PkixCertPathValidatorException("IssuerName(" + issuer
- + ") does not match SubjectName(" + workingIssuerName + ") of signing certificate.", null,
- certPath, index);
- }
- }
-
- internal static int PrepareNextCertI1(
- PkixCertPath certPath,
- int index,
- int explicitPolicy)
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
- //
- // (i)
- //
- Asn1Sequence pc = null;
- try
- {
- pc = DerSequence.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.PolicyConstraints));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Policy constraints extension cannot be decoded.", e, certPath, index);
- }
-
- int tmpInt;
-
- if (pc != null)
- {
- IEnumerator policyConstraints = pc.GetEnumerator();
-
- while (policyConstraints.MoveNext())
- {
- try
- {
- Asn1TaggedObject constraint = Asn1TaggedObject.GetInstance(policyConstraints.Current);
- if (constraint.TagNo == 0)
- {
- tmpInt = DerInteger.GetInstance(constraint, false).Value.IntValue;
- if (tmpInt < explicitPolicy)
- {
- return tmpInt;
- }
- break;
- }
- }
- catch (ArgumentException e)
- {
- throw new PkixCertPathValidatorException(
- "Policy constraints extension contents cannot be decoded.", e, certPath, index);
- }
- }
- }
- return explicitPolicy;
- }
-
- internal static int PrepareNextCertI2(
- PkixCertPath certPath,
- int index,
- int policyMapping)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
-
- //
- // (i)
- //
- Asn1Sequence pc = null;
- try
- {
- pc = DerSequence.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.PolicyConstraints));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Policy constraints extension cannot be decoded.", e, certPath, index);
- }
-
- int tmpInt;
-
- if (pc != null)
- {
- IEnumerator policyConstraints = pc.GetEnumerator();
-
- while (policyConstraints.MoveNext())
- {
- try
- {
- Asn1TaggedObject constraint = Asn1TaggedObject.GetInstance(policyConstraints.Current);
- if (constraint.TagNo == 1)
- {
- tmpInt = DerInteger.GetInstance(constraint, false).Value.IntValue;
- if (tmpInt < policyMapping)
- {
- return tmpInt;
- }
- break;
- }
- }
- catch (ArgumentException e)
- {
- throw new PkixCertPathValidatorException(
- "Policy constraints extension contents cannot be decoded.", e, certPath, index);
- }
- }
- }
- return policyMapping;
- }
-
- internal static void PrepareNextCertG(
- PkixCertPath certPath,
- int index,
- PkixNameConstraintValidator nameConstraintValidator)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
-
- //
- // (g) handle the name constraints extension
- //
- NameConstraints nc = null;
- try
- {
- Asn1Sequence ncSeq = DerSequence.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.NameConstraints));
- if (ncSeq != null)
- {
- nc = new NameConstraints(ncSeq);
- }
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Name constraints extension could not be decoded.", e, certPath, index);
- }
- if (nc != null)
- {
- //
- // (g) (1) permitted subtrees
- //
- Asn1Sequence permitted = nc.PermittedSubtrees;
- if (permitted != null)
- {
- try
- {
- nameConstraintValidator.IntersectPermittedSubtree(permitted);
- }
- catch (Exception ex)
- {
- throw new PkixCertPathValidatorException(
- "Permitted subtrees cannot be build from name constraints extension.", ex, certPath, index);
- }
- }
-
- //
- // (g) (2) excluded subtrees
- //
- Asn1Sequence excluded = nc.ExcludedSubtrees;
- if (excluded != null)
- {
- IEnumerator e = excluded.GetEnumerator();
- try
- {
- while (e.MoveNext())
- {
- GeneralSubtree subtree = GeneralSubtree.GetInstance(e.Current);
- nameConstraintValidator.AddExcludedSubtree(subtree);
- }
- }
- catch (Exception ex)
- {
- throw new PkixCertPathValidatorException(
- "Excluded subtrees cannot be build from name constraints extension.", ex, certPath, index);
- }
- }
- }
- }
-
- internal static int PrepareNextCertJ(
- PkixCertPath certPath,
- int index,
- int inhibitAnyPolicy)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
-
- //
- // (j)
- //
- DerInteger iap = null;
- try
- {
- iap = DerInteger.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.InhibitAnyPolicy));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Inhibit any-policy extension cannot be decoded.", e, certPath, index);
- }
-
- if (iap != null)
- {
- int _inhibitAnyPolicy = iap.Value.IntValue;
-
- if (_inhibitAnyPolicy < inhibitAnyPolicy)
- return _inhibitAnyPolicy;
- }
- return inhibitAnyPolicy;
- }
-
- internal static void PrepareNextCertK(
- PkixCertPath certPath,
- int index)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
- //
- // (k)
- //
- BasicConstraints bc = null;
- try
- {
- bc = BasicConstraints.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.BasicConstraints));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException("Basic constraints extension cannot be decoded.", e, certPath,
- index);
- }
- if (bc != null)
- {
- if (!(bc.IsCA()))
- throw new PkixCertPathValidatorException("Not a CA certificate");
- }
- else
- {
- throw new PkixCertPathValidatorException("Intermediate certificate lacks BasicConstraints");
- }
- }
-
- internal static int PrepareNextCertL(
- PkixCertPath certPath,
- int index,
- int maxPathLength)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
- //
- // (l)
- //
- if (!PkixCertPathValidatorUtilities.IsSelfIssued(cert))
- {
- if (maxPathLength <= 0)
- {
- throw new PkixCertPathValidatorException("Max path length not greater than zero", null, certPath, index);
- }
-
- return maxPathLength - 1;
- }
- return maxPathLength;
- }
-
- internal static int PrepareNextCertM(
- PkixCertPath certPath,
- int index,
- int maxPathLength)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
-
- //
- // (m)
- //
- BasicConstraints bc = null;
- try
- {
- bc = BasicConstraints.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.BasicConstraints));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException("Basic constraints extension cannot be decoded.", e, certPath,
- index);
- }
- if (bc != null)
- {
- BigInteger _pathLengthConstraint = bc.PathLenConstraint;
-
- if (_pathLengthConstraint != null)
- {
- int _plc = _pathLengthConstraint.IntValue;
-
- if (_plc < maxPathLength)
- {
- return _plc;
- }
- }
- }
- return maxPathLength;
- }
-
- internal static void PrepareNextCertN(
- PkixCertPath certPath,
- int index)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
-
- //
- // (n)
- //
- bool[] _usage = cert.GetKeyUsage();
-
- if ((_usage != null) && !_usage[Rfc3280CertPathUtilities.KEY_CERT_SIGN])
- {
- throw new PkixCertPathValidatorException(
- "Issuer certificate keyusage extension is critical and does not permit key signing.", null,
- certPath, index);
- }
- }
-
- internal static void PrepareNextCertO(
- PkixCertPath certPath,
- int index,
- ISet criticalExtensions,
- IList pathCheckers)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
-
- //
- // (o)
- //
- IEnumerator tmpIter = pathCheckers.GetEnumerator();
- while (tmpIter.MoveNext())
- {
- try
- {
- ((PkixCertPathChecker)tmpIter.Current).Check(cert, criticalExtensions);
- }
- catch (PkixCertPathValidatorException e)
- {
- throw new PkixCertPathValidatorException(e.Message, e.InnerException, certPath, index);
- }
- }
- if (!criticalExtensions.IsEmpty)
- {
- throw new PkixCertPathValidatorException("Certificate has unsupported critical extension.", null, certPath,
- index);
- }
- }
-
- internal static int PrepareNextCertH1(
- PkixCertPath certPath,
- int index,
- int explicitPolicy)
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
-
- //
- // (h)
- //
- if (!PkixCertPathValidatorUtilities.IsSelfIssued(cert))
- {
- //
- // (1)
- //
- if (explicitPolicy != 0)
- return explicitPolicy - 1;
- }
- return explicitPolicy;
- }
-
- internal static int PrepareNextCertH2(
- PkixCertPath certPath,
- int index,
- int policyMapping)
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
-
- //
- // (h)
- //
- if (!PkixCertPathValidatorUtilities.IsSelfIssued(cert))
- {
- //
- // (2)
- //
- if (policyMapping != 0)
- return policyMapping - 1;
- }
- return policyMapping;
- }
-
-
- internal static int PrepareNextCertH3(
- PkixCertPath certPath,
- int index,
- int inhibitAnyPolicy)
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
-
- //
- // (h)
- //
- if (!PkixCertPathValidatorUtilities.IsSelfIssued(cert))
- {
- //
- // (3)
- //
- if (inhibitAnyPolicy != 0)
- return inhibitAnyPolicy - 1;
- }
- return inhibitAnyPolicy;
- }
-
- internal static int WrapupCertA(
- int explicitPolicy,
- X509Certificate cert)
- {
- //
- // (a)
- //
- if (!PkixCertPathValidatorUtilities.IsSelfIssued(cert) && (explicitPolicy != 0))
- {
- explicitPolicy--;
- }
- return explicitPolicy;
- }
-
- internal static int WrapupCertB(
- PkixCertPath certPath,
- int index,
- int explicitPolicy)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
-
- //
- // (b)
- //
- int tmpInt;
- Asn1Sequence pc = null;
- try
- {
- pc = DerSequence.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.PolicyConstraints));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException("Policy constraints could not be decoded.", e, certPath, index);
- }
-
- if (pc != null)
- {
- IEnumerator policyConstraints = pc.GetEnumerator();
-
- while (policyConstraints.MoveNext())
- {
- Asn1TaggedObject constraint = (Asn1TaggedObject)policyConstraints.Current;
- switch (constraint.TagNo)
- {
- case 0:
- try
- {
- tmpInt = DerInteger.GetInstance(constraint, false).Value.IntValue;
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Policy constraints requireExplicitPolicy field could not be decoded.", e, certPath,
- index);
- }
- if (tmpInt == 0)
- {
- return 0;
- }
- break;
- }
- }
- }
- return explicitPolicy;
- }
-
- internal static void WrapupCertF(
- PkixCertPath certPath,
- int index,
- IList pathCheckers,
- ISet criticalExtensions)
- //throws CertPathValidatorException
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
- IEnumerator tmpIter = pathCheckers.GetEnumerator();
-
- while (tmpIter.MoveNext())
- {
- try
- {
- ((PkixCertPathChecker)tmpIter.Current).Check(cert, criticalExtensions);
- }
- catch (PkixCertPathValidatorException e)
- {
- throw new PkixCertPathValidatorException("Additional certificate path checker failed.", e, certPath,
- index);
- }
- }
-
- if (!criticalExtensions.IsEmpty)
- {
- throw new PkixCertPathValidatorException("Certificate has unsupported critical extension",
- null, certPath, index);
- }
- }
-
- internal static PkixPolicyNode WrapupCertG(
- PkixCertPath certPath,
- PkixParameters paramsPKIX,
- ISet userInitialPolicySet,
- int index,
- IList[] policyNodes,
- PkixPolicyNode validPolicyTree,
- ISet acceptablePolicies)
- {
- int n = certPath.Certificates.Count;
-
- //
- // (g)
- //
- PkixPolicyNode intersection;
-
- //
- // (g) (i)
- //
- if (validPolicyTree == null)
- {
- if (paramsPKIX.IsExplicitPolicyRequired)
- {
- throw new PkixCertPathValidatorException(
- "Explicit policy requested but none available.", null, certPath, index);
- }
- intersection = null;
- }
- else if (PkixCertPathValidatorUtilities.IsAnyPolicy(userInitialPolicySet)) // (g)
- // (ii)
- {
- if (paramsPKIX.IsExplicitPolicyRequired)
- {
- if (acceptablePolicies.IsEmpty)
- {
- throw new PkixCertPathValidatorException(
- "Explicit policy requested but none available.", null, certPath, index);
- }
- else
- {
- ISet _validPolicyNodeSet = new HashSet();
-
- for (int j = 0; j < policyNodes.Length; j++)
- {
- IList _nodeDepth = policyNodes[j];
-
- for (int k = 0; k < _nodeDepth.Count; k++)
- {
- PkixPolicyNode _node = (PkixPolicyNode)_nodeDepth[k];
-
- if (Rfc3280CertPathUtilities.ANY_POLICY.Equals(_node.ValidPolicy))
- {
- foreach (object o in _node.Children)
- {
- _validPolicyNodeSet.Add(o);
- }
- }
- }
- }
-
- foreach (PkixPolicyNode _node in _validPolicyNodeSet)
- {
- string _validPolicy = _node.ValidPolicy;
-
- if (!acceptablePolicies.Contains(_validPolicy))
- {
- // TODO?
- // validPolicyTree =
- // removePolicyNode(validPolicyTree, policyNodes,
- // _node);
- }
- }
- if (validPolicyTree != null)
- {
- for (int j = (n - 1); j >= 0; j--)
- {
- IList nodes = policyNodes[j];
-
- for (int k = 0; k < nodes.Count; k++)
- {
- PkixPolicyNode node = (PkixPolicyNode)nodes[k];
- if (!node.HasChildren)
- {
- validPolicyTree = PkixCertPathValidatorUtilities.RemovePolicyNode(validPolicyTree,
- policyNodes, node);
- }
- }
- }
- }
- }
- }
-
- intersection = validPolicyTree;
- }
- else
- {
- //
- // (g) (iii)
- //
- // This implementation is not exactly same as the one described in
- // RFC3280.
- // However, as far as the validation result is concerned, both
- // produce
- // adequate result. The only difference is whether AnyPolicy is
- // remain
- // in the policy tree or not.
- //
- // (g) (iii) 1
- //
- ISet _validPolicyNodeSet = new HashSet();
-
- for (int j = 0; j < policyNodes.Length; j++)
- {
- IList _nodeDepth = policyNodes[j];
-
- for (int k = 0; k < _nodeDepth.Count; k++)
- {
- PkixPolicyNode _node = (PkixPolicyNode)_nodeDepth[k];
-
- if (Rfc3280CertPathUtilities.ANY_POLICY.Equals(_node.ValidPolicy))
- {
- foreach (PkixPolicyNode _c_node in _node.Children)
- {
- if (!Rfc3280CertPathUtilities.ANY_POLICY.Equals(_c_node.ValidPolicy))
- {
- _validPolicyNodeSet.Add(_c_node);
- }
- }
- }
- }
- }
-
- //
- // (g) (iii) 2
- //
- IEnumerator _vpnsIter = _validPolicyNodeSet.GetEnumerator();
- while (_vpnsIter.MoveNext())
- {
- PkixPolicyNode _node = (PkixPolicyNode)_vpnsIter.Current;
- string _validPolicy = _node.ValidPolicy;
-
- if (!userInitialPolicySet.Contains(_validPolicy))
- {
- validPolicyTree = PkixCertPathValidatorUtilities.RemovePolicyNode(validPolicyTree, policyNodes, _node);
- }
- }
-
- //
- // (g) (iii) 4
- //
- if (validPolicyTree != null)
- {
- for (int j = (n - 1); j >= 0; j--)
- {
- IList nodes = policyNodes[j];
-
- for (int k = 0; k < nodes.Count; k++)
- {
- PkixPolicyNode node = (PkixPolicyNode)nodes[k];
- if (!node.HasChildren)
- {
- validPolicyTree = PkixCertPathValidatorUtilities.RemovePolicyNode(validPolicyTree, policyNodes,
- node);
- }
- }
- }
- }
-
- intersection = validPolicyTree;
- }
- return intersection;
- }
-
- /**
- * If use-deltas is set, verify the issuer and scope of the delta CRL.
- *
- * @param deltaCRL The delta CRL.
- * @param completeCRL The complete CRL.
- * @param pkixParams The PKIX paramaters.
- * @throws AnnotatedException if an exception occurs.
- */
- internal static void ProcessCrlC(
- X509Crl deltaCRL,
- X509Crl completeCRL,
- PkixParameters pkixParams)
- {
- if (deltaCRL == null)
- return;
-
- IssuingDistributionPoint completeidp = null;
- try
- {
- completeidp = IssuingDistributionPoint.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(completeCRL, X509Extensions.IssuingDistributionPoint));
- }
- catch (Exception e)
- {
- throw new Exception("000 Issuing distribution point extension could not be decoded.", e);
- }
-
- if (pkixParams.IsUseDeltasEnabled)
- {
- // (c) (1)
- if (!deltaCRL.IssuerDN.Equivalent(completeCRL.IssuerDN, true))
- throw new Exception("Complete CRL issuer does not match delta CRL issuer.");
-
- // (c) (2)
- IssuingDistributionPoint deltaidp = null;
- try
- {
- deltaidp = IssuingDistributionPoint.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(deltaCRL, X509Extensions.IssuingDistributionPoint));
- }
- catch (Exception e)
- {
- throw new Exception(
- "Issuing distribution point extension from delta CRL could not be decoded.", e);
- }
-
- if (!Platform.Equals(completeidp, deltaidp))
- {
- throw new Exception(
- "Issuing distribution point extension from delta CRL and complete CRL does not match.");
- }
-
- // (c) (3)
- Asn1Object completeKeyIdentifier = null;
- try
- {
- completeKeyIdentifier = PkixCertPathValidatorUtilities.GetExtensionValue(
- completeCRL, X509Extensions.AuthorityKeyIdentifier);
- }
- catch (Exception e)
- {
- throw new Exception(
- "Authority key identifier extension could not be extracted from complete CRL.", e);
- }
-
- Asn1Object deltaKeyIdentifier = null;
- try
- {
- deltaKeyIdentifier = PkixCertPathValidatorUtilities.GetExtensionValue(
- deltaCRL, X509Extensions.AuthorityKeyIdentifier);
- }
- catch (Exception e)
- {
- throw new Exception(
- "Authority key identifier extension could not be extracted from delta CRL.", e);
- }
-
- if (completeKeyIdentifier == null)
- throw new Exception("CRL authority key identifier is null.");
-
- if (deltaKeyIdentifier == null)
- throw new Exception("Delta CRL authority key identifier is null.");
-
- if (!completeKeyIdentifier.Equals(deltaKeyIdentifier))
- {
- throw new Exception(
- "Delta CRL authority key identifier does not match complete CRL authority key identifier.");
- }
- }
- }
-
- internal static void ProcessCrlI(
- DateTime validDate,
- X509Crl deltacrl,
- object cert,
- CertStatus certStatus,
- PkixParameters pkixParams)
- {
- if (pkixParams.IsUseDeltasEnabled && deltacrl != null)
- {
- PkixCertPathValidatorUtilities.GetCertStatus(validDate, deltacrl, cert, certStatus);
- }
- }
-
- internal static void ProcessCrlJ(
- DateTime validDate,
- X509Crl completecrl,
- object cert,
- CertStatus certStatus)
- {
- if (certStatus.Status == CertStatus.Unrevoked)
- {
- PkixCertPathValidatorUtilities.GetCertStatus(validDate, completecrl, cert, certStatus);
- }
- }
-
- internal static PkixPolicyNode ProcessCertE(
- PkixCertPath certPath,
- int index,
- PkixPolicyNode validPolicyTree)
- {
- IList certs = certPath.Certificates;
- X509Certificate cert = (X509Certificate)certs[index];
-
- //
- // (e)
- //
- Asn1Sequence certPolicies = null;
- try
- {
- certPolicies = DerSequence.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(cert, X509Extensions.CertificatePolicies));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException("Could not read certificate policies extension from certificate.",
- e, certPath, index);
- }
- if (certPolicies == null)
- {
- validPolicyTree = null;
- }
- return validPolicyTree;
- }
-
- internal static readonly string[] CrlReasons = new string[]
- {
- "unspecified",
- "keyCompromise",
- "cACompromise",
- "affiliationChanged",
- "superseded",
- "cessationOfOperation",
- "certificateHold",
- "unknown",
- "removeFromCRL",
- "privilegeWithdrawn",
- "aACompromise"
- };
- }
-}
diff --git a/BCCrypto/src/pkix/Rfc3281CertPathUtilities.cs b/BCCrypto/src/pkix/Rfc3281CertPathUtilities.cs
deleted file mode 100644
index 101ef5e..0000000
--- a/BCCrypto/src/pkix/Rfc3281CertPathUtilities.cs
+++ /dev/null
@@ -1,608 +0,0 @@
-using System;
-using System.Collections;
-using System.Globalization;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Pkix
-{
- internal class Rfc3281CertPathUtilities
- {
- internal static void ProcessAttrCert7(
- IX509AttributeCertificate attrCert,
- PkixCertPath certPath,
- PkixCertPath holderCertPath,
- PkixParameters pkixParams)
- {
- // TODO:
- // AA Controls
- // Attribute encryption
- // Proxy
- ISet critExtOids = attrCert.GetCriticalExtensionOids();
-
- // 7.1
- // process extensions
-
- // target information checked in step 6 / X509AttributeCertStoreSelector
- if (critExtOids.Contains(X509Extensions.TargetInformation.Id))
- {
- try
- {
- TargetInformation.GetInstance(PkixCertPathValidatorUtilities
- .GetExtensionValue(attrCert, X509Extensions.TargetInformation));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Target information extension could not be read.", e);
- }
- }
- critExtOids.Remove(X509Extensions.TargetInformation.Id);
- foreach (PkixAttrCertChecker checker in pkixParams.GetAttrCertCheckers())
- {
- checker.Check(attrCert, certPath, holderCertPath, critExtOids);
- }
- if (!critExtOids.IsEmpty)
- {
- throw new PkixCertPathValidatorException(
- "Attribute certificate contains unsupported critical extensions: "
- + critExtOids);
- }
- }
-
- /**
- * Checks if an attribute certificate is revoked.
- *
- * @param attrCert Attribute certificate to check if it is revoked.
- * @param paramsPKIX PKIX parameters.
- * @param issuerCert The issuer certificate of the attribute certificate
- * attrCert.
- * @param validDate The date when the certificate revocation status should
- * be checked.
- * @param certPathCerts The certificates of the certification path to be
- * checked.
- *
- * @throws CertPathValidatorException if the certificate is revoked or the
- * status cannot be checked or some error occurs.
- */
- internal static void CheckCrls(
- IX509AttributeCertificate attrCert,
- PkixParameters paramsPKIX,
- X509Certificate issuerCert,
- DateTime validDate,
- IList certPathCerts)
- {
- if (paramsPKIX.IsRevocationEnabled)
- {
- // check if revocation is available
- if (attrCert.GetExtensionValue(X509Extensions.NoRevAvail) == null)
- {
- CrlDistPoint crldp = null;
- try
- {
- crldp = CrlDistPoint.GetInstance(
- PkixCertPathValidatorUtilities.GetExtensionValue(
- attrCert, X509Extensions.CrlDistributionPoints));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "CRL distribution point extension could not be read.", e);
- }
- try
- {
- PkixCertPathValidatorUtilities
- .AddAdditionalStoresFromCrlDistributionPoint(crldp, paramsPKIX);
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "No additional CRL locations could be decoded from CRL distribution point extension.", e);
- }
- CertStatus certStatus = new CertStatus();
- ReasonsMask reasonsMask = new ReasonsMask();
-
- Exception lastException = null;
- bool validCrlFound = false;
- // for each distribution point
- if (crldp != null)
- {
- DistributionPoint[] dps = null;
- try
- {
- dps = crldp.GetDistributionPoints();
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Distribution points could not be read.", e);
- }
- try
- {
- for (int i = 0; i < dps.Length
- && certStatus.Status == CertStatus.Unrevoked
- && !reasonsMask.IsAllReasons; i++)
- {
- PkixParameters paramsPKIXClone = (PkixParameters) paramsPKIX
- .Clone();
- CheckCrl(dps[i], attrCert, paramsPKIXClone,
- validDate, issuerCert, certStatus, reasonsMask,
- certPathCerts);
- validCrlFound = true;
- }
- }
- catch (Exception e)
- {
- lastException = new Exception(
- "No valid CRL for distribution point found.", e);
- }
- }
-
- /*
- * If the revocation status has not been determined, repeat the
- * process above with any available CRLs not specified in a
- * distribution point but issued by the certificate issuer.
- */
-
- if (certStatus.Status == CertStatus.Unrevoked
- && !reasonsMask.IsAllReasons)
- {
- try
- {
- /*
- * assume a DP with both the reasons and the cRLIssuer
- * fields omitted and a distribution point name of the
- * certificate issuer.
- */
- Asn1Object issuer = null;
- try
- {
- issuer = new Asn1InputStream(
- attrCert.Issuer.GetPrincipals()[0].GetEncoded()).ReadObject();
- }
- catch (Exception e)
- {
- throw new Exception(
- "Issuer from certificate for CRL could not be reencoded.",
- e);
- }
- DistributionPoint dp = new DistributionPoint(
- new DistributionPointName(0, new GeneralNames(
- new GeneralName(GeneralName.DirectoryName, issuer))), null, null);
- PkixParameters paramsPKIXClone = (PkixParameters) paramsPKIX.Clone();
- CheckCrl(dp, attrCert, paramsPKIXClone, validDate,
- issuerCert, certStatus, reasonsMask, certPathCerts);
- validCrlFound = true;
- }
- catch (Exception e)
- {
- lastException = new Exception(
- "No valid CRL for distribution point found.", e);
- }
- }
-
- if (!validCrlFound)
- {
- throw new PkixCertPathValidatorException(
- "No valid CRL found.", lastException);
- }
- if (certStatus.Status != CertStatus.Unrevoked)
- {
- // This format is enforced by the NistCertPath tests
- string formattedDate = certStatus.RevocationDate.Value.ToString(
- "ddd MMM dd HH:mm:ss K yyyy");
- string message = "Attribute certificate revocation after "
- + formattedDate;
- message += ", reason: "
- + Rfc3280CertPathUtilities.CrlReasons[certStatus.Status];
- throw new PkixCertPathValidatorException(message);
- }
- if (!reasonsMask.IsAllReasons
- && certStatus.Status == CertStatus.Unrevoked)
- {
- certStatus.Status = CertStatus.Undetermined;
- }
- if (certStatus.Status == CertStatus.Undetermined)
- {
- throw new PkixCertPathValidatorException(
- "Attribute certificate status could not be determined.");
- }
-
- }
- else
- {
- if (attrCert.GetExtensionValue(X509Extensions.CrlDistributionPoints) != null
- || attrCert.GetExtensionValue(X509Extensions.AuthorityInfoAccess) != null)
- {
- throw new PkixCertPathValidatorException(
- "No rev avail extension is set, but also an AC revocation pointer.");
- }
- }
- }
- }
-
- internal static void AdditionalChecks(
- IX509AttributeCertificate attrCert,
- PkixParameters pkixParams)
- {
- // 1
- foreach (string oid in pkixParams.GetProhibitedACAttributes())
- {
- if (attrCert.GetAttributes(oid) != null)
- {
- throw new PkixCertPathValidatorException(
- "Attribute certificate contains prohibited attribute: "
- + oid + ".");
- }
- }
- foreach (string oid in pkixParams.GetNecessaryACAttributes())
- {
- if (attrCert.GetAttributes(oid) == null)
- {
- throw new PkixCertPathValidatorException(
- "Attribute certificate does not contain necessary attribute: "
- + oid + ".");
- }
- }
- }
-
- internal static void ProcessAttrCert5(
- IX509AttributeCertificate attrCert,
- PkixParameters pkixParams)
- {
- try
- {
- attrCert.CheckValidity(PkixCertPathValidatorUtilities.GetValidDate(pkixParams));
- }
- catch (CertificateExpiredException e)
- {
- throw new PkixCertPathValidatorException(
- "Attribute certificate is not valid.", e);
- }
- catch (CertificateNotYetValidException e)
- {
- throw new PkixCertPathValidatorException(
- "Attribute certificate is not valid.", e);
- }
- }
-
- internal static void ProcessAttrCert4(
- X509Certificate acIssuerCert,
- PkixParameters pkixParams)
- {
- ISet set = pkixParams.GetTrustedACIssuers();
- bool trusted = false;
- foreach (TrustAnchor anchor in set)
- {
- IDictionary symbols = X509Name.RFC2253Symbols;
- if (acIssuerCert.SubjectDN.ToString(false, symbols).Equals(anchor.CAName)
- || acIssuerCert.Equals(anchor.TrustedCert))
- {
- trusted = true;
- }
- }
- if (!trusted)
- {
- throw new PkixCertPathValidatorException(
- "Attribute certificate issuer is not directly trusted.");
- }
- }
-
- internal static void ProcessAttrCert3(
- X509Certificate acIssuerCert,
- PkixParameters pkixParams)
- {
- if (acIssuerCert.GetKeyUsage() != null
- && (!acIssuerCert.GetKeyUsage()[0] && !acIssuerCert.GetKeyUsage()[1]))
- {
- throw new PkixCertPathValidatorException(
- "Attribute certificate issuer public key cannot be used to validate digital signatures.");
- }
- if (acIssuerCert.GetBasicConstraints() != -1)
- {
- throw new PkixCertPathValidatorException(
- "Attribute certificate issuer is also a public key certificate issuer.");
- }
- }
-
- internal static PkixCertPathValidatorResult ProcessAttrCert2(
- PkixCertPath certPath,
- PkixParameters pkixParams)
- {
- PkixCertPathValidator validator = new PkixCertPathValidator();
-
- try
- {
- return validator.Validate(certPath, pkixParams);
- }
- catch (PkixCertPathValidatorException e)
- {
- throw new PkixCertPathValidatorException(
- "Certification path for issuer certificate of attribute certificate could not be validated.",
- e);
- }
- }
-
- /**
- * Searches for a holder public key certificate and verifies its
- * certification path.
- *
- * @param attrCert the attribute certificate.
- * @param pkixParams The PKIX parameters.
- * @return The certificate path of the holder certificate.
- * @throws Exception if
- *
- * no public key certificate can be found although holder
- * information is given by an entity name or a base certificate
- * ID
- * support classes cannot be created
- * no certification path for the public key certificate can
- * be built
- *
- */
- internal static PkixCertPath ProcessAttrCert1(
- IX509AttributeCertificate attrCert,
- PkixParameters pkixParams)
- {
- PkixCertPathBuilderResult result = null;
- // find holder PKCs
- ISet holderPKCs = new HashSet();
- if (attrCert.Holder.GetIssuer() != null)
- {
- X509CertStoreSelector selector = new X509CertStoreSelector();
- selector.SerialNumber = attrCert.Holder.SerialNumber;
- X509Name[] principals = attrCert.Holder.GetIssuer();
- for (int i = 0; i < principals.Length; i++)
- {
- try
- {
-// if (principals[i] is X500Principal)
- {
- selector.Issuer = principals[i];
- }
- holderPKCs.AddAll(PkixCertPathValidatorUtilities
- .FindCertificates(selector, pkixParams.GetStores()));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Public key certificate for attribute certificate cannot be searched.",
- e);
- }
- }
- if (holderPKCs.IsEmpty)
- {
- throw new PkixCertPathValidatorException(
- "Public key certificate specified in base certificate ID for attribute certificate cannot be found.");
- }
- }
- if (attrCert.Holder.GetEntityNames() != null)
- {
- X509CertStoreSelector selector = new X509CertStoreSelector();
- X509Name[] principals = attrCert.Holder.GetEntityNames();
- for (int i = 0; i < principals.Length; i++)
- {
- try
- {
-// if (principals[i] is X500Principal)
- {
- selector.Issuer = principals[i];
- }
- holderPKCs.AddAll(PkixCertPathValidatorUtilities
- .FindCertificates(selector, pkixParams.GetStores()));
- }
- catch (Exception e)
- {
- throw new PkixCertPathValidatorException(
- "Public key certificate for attribute certificate cannot be searched.",
- e);
- }
- }
- if (holderPKCs.IsEmpty)
- {
- throw new PkixCertPathValidatorException(
- "Public key certificate specified in entity name for attribute certificate cannot be found.");
- }
- }
-
- // verify cert paths for PKCs
- PkixBuilderParameters parameters = (PkixBuilderParameters)
- PkixBuilderParameters.GetInstance(pkixParams);
-
- PkixCertPathValidatorException lastException = null;
- foreach (X509Certificate cert in holderPKCs)
- {
- X509CertStoreSelector selector = new X509CertStoreSelector();
- selector.Certificate = cert;
- parameters.SetTargetConstraints(selector);
-
- PkixCertPathBuilder builder = new PkixCertPathBuilder();
-
- try
- {
- result = builder.Build(PkixBuilderParameters.GetInstance(parameters));
- }
- catch (PkixCertPathBuilderException e)
- {
- lastException = new PkixCertPathValidatorException(
- "Certification path for public key certificate of attribute certificate could not be build.",
- e);
- }
- }
- if (lastException != null)
- {
- throw lastException;
- }
- return result.CertPath;
- }
-
- /**
- *
- * Checks a distribution point for revocation information for the
- * certificate attrCert.
- *
- * @param dp The distribution point to consider.
- * @param attrCert The attribute certificate which should be checked.
- * @param paramsPKIX PKIX parameters.
- * @param validDate The date when the certificate revocation status should
- * be checked.
- * @param issuerCert Certificate to check if it is revoked.
- * @param reasonMask The reasons mask which is already checked.
- * @param certPathCerts The certificates of the certification path to be
- * checked.
- * @throws Exception if the certificate is revoked or the status
- * cannot be checked or some error occurs.
- */
- private static void CheckCrl(
- DistributionPoint dp,
- IX509AttributeCertificate attrCert,
- PkixParameters paramsPKIX,
- DateTime validDate,
- X509Certificate issuerCert,
- CertStatus certStatus,
- ReasonsMask reasonMask,
- IList certPathCerts)
- {
- /*
- * 4.3.6 No Revocation Available
- *
- * The noRevAvail extension, defined in [X.509-2000], allows an AC
- * issuer to indicate that no revocation information will be made
- * available for this AC.
- */
- if (attrCert.GetExtensionValue(X509Extensions.NoRevAvail) != null)
- {
- return;
- }
-
- DateTime currentDate = DateTime.UtcNow;
- if (validDate.CompareTo(currentDate) > 0)
- {
- throw new Exception("Validation time is in future.");
- }
-
- // (a)
- /*
- * We always get timely valid CRLs, so there is no step (a) (1).
- * "locally cached" CRLs are assumed to be in getStore(), additional
- * CRLs must be enabled in the ExtendedPkixParameters and are in
- * getAdditionalStore()
- */
- ISet crls = PkixCertPathValidatorUtilities.GetCompleteCrls(dp, attrCert,
- currentDate, paramsPKIX);
- bool validCrlFound = false;
- Exception lastException = null;
-
- IEnumerator crl_iter = crls.GetEnumerator();
-
- while (crl_iter.MoveNext()
- && certStatus.Status == CertStatus.Unrevoked
- && !reasonMask.IsAllReasons)
- {
- try
- {
- X509Crl crl = (X509Crl) crl_iter.Current;
-
- // (d)
- ReasonsMask interimReasonsMask = Rfc3280CertPathUtilities.ProcessCrlD(crl, dp);
-
- // (e)
- /*
- * The reasons mask is updated at the end, so only valid CRLs
- * can update it. If this CRL does not contain new reasons it
- * must be ignored.
- */
- if (!interimReasonsMask.HasNewReasons(reasonMask))
- {
- continue;
- }
-
- // (f)
- ISet keys = Rfc3280CertPathUtilities.ProcessCrlF(crl, attrCert,
- null, null, paramsPKIX, certPathCerts);
- // (g)
- AsymmetricKeyParameter pubKey = Rfc3280CertPathUtilities.ProcessCrlG(crl, keys);
-
- X509Crl deltaCRL = null;
-
- if (paramsPKIX.IsUseDeltasEnabled)
- {
- // get delta CRLs
- ISet deltaCRLs = PkixCertPathValidatorUtilities.GetDeltaCrls(
- currentDate, paramsPKIX, crl);
- // we only want one valid delta CRL
- // (h)
- deltaCRL = Rfc3280CertPathUtilities.ProcessCrlH(deltaCRLs, pubKey);
- }
-
- /*
- * CRL must be be valid at the current time, not the validation
- * time. If a certificate is revoked with reason keyCompromise,
- * cACompromise, it can be used for forgery, also for the past.
- * This reason may not be contained in older CRLs.
- */
-
- /*
- * in the chain model signatures stay valid also after the
- * certificate has been expired, so they do not have to be in
- * the CRL vality time
- */
- if (paramsPKIX.ValidityModel != PkixParameters.ChainValidityModel)
- {
- /*
- * if a certificate has expired, but was revoked, it is not
- * more in the CRL, so it would be regarded as valid if the
- * first check is not done
- */
- if (attrCert.NotAfter.CompareTo(crl.ThisUpdate) < 0)
- {
- throw new Exception(
- "No valid CRL for current time found.");
- }
- }
-
- Rfc3280CertPathUtilities.ProcessCrlB1(dp, attrCert, crl);
-
- // (b) (2)
- Rfc3280CertPathUtilities.ProcessCrlB2(dp, attrCert, crl);
-
- // (c)
- Rfc3280CertPathUtilities.ProcessCrlC(deltaCRL, crl, paramsPKIX);
-
- // (i)
- Rfc3280CertPathUtilities.ProcessCrlI(validDate, deltaCRL,
- attrCert, certStatus, paramsPKIX);
-
- // (j)
- Rfc3280CertPathUtilities.ProcessCrlJ(validDate, crl, attrCert,
- certStatus);
-
- // (k)
- if (certStatus.Status == CrlReason.RemoveFromCrl)
- {
- certStatus.Status = CertStatus.Unrevoked;
- }
-
- // update reasons mask
- reasonMask.AddReasons(interimReasonsMask);
- validCrlFound = true;
- }
- catch (Exception e)
- {
- lastException = e;
- }
- }
- if (!validCrlFound)
- {
- throw lastException;
- }
- }
- }
-}
diff --git a/BCCrypto/src/pkix/TrustAnchor.cs b/BCCrypto/src/pkix/TrustAnchor.cs
deleted file mode 100644
index 22078ba..0000000
--- a/BCCrypto/src/pkix/TrustAnchor.cs
+++ /dev/null
@@ -1,259 +0,0 @@
-using System;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Pkix
-{
- ///
- /// A trust anchor or most-trusted Certification Authority (CA).
- ///
- /// This class represents a "most-trusted CA", which is used as a trust anchor
- /// for validating X.509 certification paths. A most-trusted CA includes the
- /// public key of the CA, the CA's name, and any constraints upon the set of
- /// paths which may be validated using this key. These parameters can be
- /// specified in the form of a trusted X509Certificate or as individual
- /// parameters.
- ///
- public class TrustAnchor
- {
- private readonly AsymmetricKeyParameter pubKey;
- private readonly string caName;
- private readonly X509Name caPrincipal;
- private readonly X509Certificate trustedCert;
- private byte[] ncBytes;
- private NameConstraints nc;
-
- ///
- /// Creates an instance of TrustAnchor with the specified X509Certificate and
- /// optional name constraints, which are intended to be used as additional
- /// constraints when validating an X.509 certification path.
- /// The name constraints are specified as a byte array. This byte array
- /// should contain the DER encoded form of the name constraints, as they
- /// would appear in the NameConstraints structure defined in RFC 2459 and
- /// X.509. The ASN.1 definition of this structure appears below.
- ///
- ///
- /// NameConstraints ::= SEQUENCE {
- /// permittedSubtrees [0] GeneralSubtrees OPTIONAL,
- /// excludedSubtrees [1] GeneralSubtrees OPTIONAL }
- ///
- /// GeneralSubtrees ::= SEQUENCE SIZE (1..MAX) OF GeneralSubtree
- ///
- /// GeneralSubtree ::= SEQUENCE {
- /// base GeneralName,
- /// minimum [0] BaseDistance DEFAULT 0,
- /// maximum [1] BaseDistance OPTIONAL }
- ///
- /// BaseDistance ::= INTEGER (0..MAX)
- ///
- /// GeneralName ::= CHOICE {
- /// otherName [0] OtherName,
- /// rfc822Name [1] IA5String,
- /// dNSName [2] IA5String,
- /// x400Address [3] ORAddress,
- /// directoryName [4] Name,
- /// ediPartyName [5] EDIPartyName,
- /// uniformResourceIdentifier [6] IA5String,
- /// iPAddress [7] OCTET STRING,
- /// registeredID [8] OBJECT IDENTIFIER}
- ///
- ///
- /// Note that the name constraints byte array supplied is cloned to protect
- /// against subsequent modifications.
- ///
- /// a trusted X509Certificate
- /// a byte array containing the ASN.1 DER encoding of a
- /// NameConstraints extension to be used for checking name
- /// constraints. Only the value of the extension is included, not
- /// the OID or criticality flag. Specify null to omit the
- /// parameter.
- /// if the specified X509Certificate is null
- public TrustAnchor(
- X509Certificate trustedCert,
- byte[] nameConstraints)
- {
- if (trustedCert == null)
- throw new ArgumentNullException("trustedCert");
-
- this.trustedCert = trustedCert;
- this.pubKey = null;
- this.caName = null;
- this.caPrincipal = null;
- setNameConstraints(nameConstraints);
- }
-
- ///
- /// Creates an instance of TrustAnchor where the
- /// most-trusted CA is specified as an X500Principal and public key.
- ///
- ///
- ///
- /// Name constraints are an optional parameter, and are intended to be used
- /// as additional constraints when validating an X.509 certification path.
- ///
- /// The name constraints are specified as a byte array. This byte array
- /// contains the DER encoded form of the name constraints, as they
- /// would appear in the NameConstraints structure defined in RFC 2459
- /// and X.509. The ASN.1 notation for this structure is supplied in the
- /// documentation for the other constructors.
- ///
- /// Note that the name constraints byte array supplied here is cloned to
- /// protect against subsequent modifications.
- ///
- ///
- /// the name of the most-trusted CA as X509Name
- /// the public key of the most-trusted CA
- ///
- /// a byte array containing the ASN.1 DER encoding of a NameConstraints extension to
- /// be used for checking name constraints. Only the value of the extension is included,
- /// not the OID or criticality flag. Specify null to omit the parameter.
- ///
- ///
- /// if caPrincipal or pubKey is null
- ///
- public TrustAnchor(
- X509Name caPrincipal,
- AsymmetricKeyParameter pubKey,
- byte[] nameConstraints)
- {
- if (caPrincipal == null)
- throw new ArgumentNullException("caPrincipal");
- if (pubKey == null)
- throw new ArgumentNullException("pubKey");
-
- this.trustedCert = null;
- this.caPrincipal = caPrincipal;
- this.caName = caPrincipal.ToString();
- this.pubKey = pubKey;
- setNameConstraints(nameConstraints);
- }
-
- ///
- /// Creates an instance of TrustAnchor where the most-trusted
- /// CA is specified as a distinguished name and public key. Name constraints
- /// are an optional parameter, and are intended to be used as additional
- /// constraints when validating an X.509 certification path.
- ///
- /// The name constraints are specified as a byte array. This byte array
- /// contains the DER encoded form of the name constraints, as they would
- /// appear in the NameConstraints structure defined in RFC 2459 and X.509.
- ///
- /// the X.500 distinguished name of the most-trusted CA in RFC
- /// 2253 string format
- /// the public key of the most-trusted CA
- /// a byte array containing the ASN.1 DER encoding of a
- /// NameConstraints extension to be used for checking name
- /// constraints. Only the value of the extension is included, not
- /// the OID or criticality flag. Specify null to omit the
- /// parameter.
- /// throws NullPointerException, IllegalArgumentException
- public TrustAnchor(
- string caName,
- AsymmetricKeyParameter pubKey,
- byte[] nameConstraints)
- {
- if (caName == null)
- throw new ArgumentNullException("caName");
- if (pubKey == null)
- throw new ArgumentNullException("pubKey");
- if (caName.Length == 0)
- throw new ArgumentException("caName can not be an empty string");
-
- this.caPrincipal = new X509Name(caName);
- this.pubKey = pubKey;
- this.caName = caName;
- this.trustedCert = null;
- setNameConstraints(nameConstraints);
- }
-
- ///
- /// Returns the most-trusted CA certificate.
- ///
- public X509Certificate TrustedCert
- {
- get { return this.trustedCert; }
- }
-
- ///
- /// Returns the name of the most-trusted CA as an X509Name.
- ///
- public X509Name CA
- {
- get { return this.caPrincipal; }
- }
-
- ///
- /// Returns the name of the most-trusted CA in RFC 2253 string format.
- ///
- public string CAName
- {
- get { return this.caName; }
- }
-
- ///
- /// Returns the public key of the most-trusted CA.
- ///
- public AsymmetricKeyParameter CAPublicKey
- {
- get { return this.pubKey; }
- }
-
- ///
- /// Decode the name constraints and clone them if not null.
- ///
- private void setNameConstraints(
- byte[] bytes)
- {
- if (bytes == null)
- {
- ncBytes = null;
- nc = null;
- }
- else
- {
- ncBytes = (byte[]) bytes.Clone();
- // validate DER encoding
- //nc = new NameConstraintsExtension(Boolean.FALSE, bytes);
- nc = NameConstraints.GetInstance(Asn1Object.FromByteArray(bytes));
- }
- }
-
- public byte[] GetNameConstraints
- {
- get { return Arrays.Clone(ncBytes); }
- }
-
- ///
- /// Returns a formatted string describing the TrustAnchor.
- ///
- /// a formatted string describing the TrustAnchor
- public override string ToString()
- {
- // TODO Some of the sub-objects might not implement ToString() properly
- string nl = Platform.NewLine;
- StringBuilder sb = new StringBuilder();
- sb.Append("[");
- sb.Append(nl);
- if (this.pubKey != null)
- {
- sb.Append(" Trusted CA Public Key: ").Append(this.pubKey).Append(nl);
- sb.Append(" Trusted CA Issuer Name: ").Append(this.caName).Append(nl);
- }
- else
- {
- sb.Append(" Trusted CA cert: ").Append(this.TrustedCert).Append(nl);
- }
- if (nc != null)
- {
- sb.Append(" Name Constraints: ").Append(nc).Append(nl);
- }
- return sb.ToString();
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/security/AgreementUtilities.cs b/BCCrypto/src/security/AgreementUtilities.cs
deleted file mode 100644
index 12d427c..0000000
--- a/BCCrypto/src/security/AgreementUtilities.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Agreement;
-using Org.BouncyCastle.Crypto.Agreement.Kdf;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Security
-{
- ///
- /// Utility class for creating IBasicAgreement objects from their names/Oids
- ///
- public sealed class AgreementUtilities
- {
- private AgreementUtilities()
- {
- }
-
- private static readonly IDictionary algorithms = Platform.CreateHashtable();
- //private static readonly IDictionary oids = Platform.CreateHashtable();
-
- static AgreementUtilities()
- {
- algorithms[X9ObjectIdentifiers.DHSinglePassCofactorDHSha1KdfScheme.Id] = "ECCDHWITHSHA1KDF";
- algorithms[X9ObjectIdentifiers.DHSinglePassStdDHSha1KdfScheme.Id] = "ECDHWITHSHA1KDF";
- algorithms[X9ObjectIdentifiers.MqvSinglePassSha1KdfScheme.Id] = "ECMQVWITHSHA1KDF";
- }
-
- public static IBasicAgreement GetBasicAgreement(
- DerObjectIdentifier oid)
- {
- return GetBasicAgreement(oid.Id);
- }
-
- public static IBasicAgreement GetBasicAgreement(
- string algorithm)
- {
- string upper = Platform.ToUpperInvariant(algorithm);
- string mechanism = (string) algorithms[upper];
-
- if (mechanism == null)
- {
- mechanism = upper;
- }
-
- if (mechanism == "DH" || mechanism == "DIFFIEHELLMAN")
- return new DHBasicAgreement();
-
- if (mechanism == "ECDH")
- return new ECDHBasicAgreement();
-
- if (mechanism == "ECDHC" || mechanism == "ECCDH")
- return new ECDHCBasicAgreement();
-
- if (mechanism == "ECMQV")
- return new ECMqvBasicAgreement();
-
- throw new SecurityUtilityException("Basic Agreement " + algorithm + " not recognised.");
- }
-
- public static IBasicAgreement GetBasicAgreementWithKdf(
- DerObjectIdentifier oid,
- string wrapAlgorithm)
- {
- return GetBasicAgreementWithKdf(oid.Id, wrapAlgorithm);
- }
-
- public static IBasicAgreement GetBasicAgreementWithKdf(
- string agreeAlgorithm,
- string wrapAlgorithm)
- {
- string upper = Platform.ToUpperInvariant(agreeAlgorithm);
- string mechanism = (string) algorithms[upper];
-
- if (mechanism == null)
- {
- mechanism = upper;
- }
-
- // 'DHWITHSHA1KDF' retained for backward compatibility
- if (mechanism == "DHWITHSHA1KDF" || mechanism == "ECDHWITHSHA1KDF")
- return new ECDHWithKdfBasicAgreement(
- wrapAlgorithm,
- new ECDHKekGenerator(
- new Sha1Digest()));
-
- if (mechanism == "ECMQVWITHSHA1KDF")
- return new ECMqvWithKdfBasicAgreement(
- wrapAlgorithm,
- new ECDHKekGenerator(
- new Sha1Digest()));
-
- throw new SecurityUtilityException("Basic Agreement (with KDF) " + agreeAlgorithm + " not recognised.");
- }
-
- public static string GetAlgorithmName(
- DerObjectIdentifier oid)
- {
- return (string) algorithms[oid.Id];
- }
- }
-}
diff --git a/BCCrypto/src/security/CipherUtilities.cs b/BCCrypto/src/security/CipherUtilities.cs
deleted file mode 100644
index de05bc9..0000000
--- a/BCCrypto/src/security/CipherUtilities.cs
+++ /dev/null
@@ -1,755 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Kisa;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Ntt;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Agreement;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Encodings;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Paddings;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Security
-{
- ///
- /// Cipher Utility class contains methods that can not be specifically grouped into other classes.
- ///
- public sealed class CipherUtilities
- {
- private enum CipherAlgorithm {
- AES,
- ARC4,
- BLOWFISH,
- CAMELLIA,
- CAST5,
- CAST6,
- DES,
- DESEDE,
- ELGAMAL,
- GOST28147,
- HC128,
- HC256,
- IDEA,
- NOEKEON,
- PBEWITHSHAAND128BITRC4,
- PBEWITHSHAAND40BITRC4,
- RC2,
- RC5,
- RC5_64,
- RC6,
- RIJNDAEL,
- RSA,
- SALSA20,
- SEED,
- SERPENT,
- SKIPJACK,
- TEA,
- THREEFISH_256,
- THREEFISH_512,
- THREEFISH_1024,
- TNEPRES,
- TWOFISH,
- VMPC,
- VMPC_KSA3,
- XTEA,
- };
-
- private enum CipherMode { ECB, NONE, CBC, CCM, CFB, CTR, CTS, EAX, GCM, GOFB, OCB, OFB, OPENPGPCFB, SIC };
- private enum CipherPadding
- {
- NOPADDING,
- RAW,
- ISO10126PADDING,
- ISO10126D2PADDING,
- ISO10126_2PADDING,
- ISO7816_4PADDING,
- ISO9797_1PADDING,
- ISO9796_1,
- ISO9796_1PADDING,
- OAEP,
- OAEPPADDING,
- OAEPWITHMD5ANDMGF1PADDING,
- OAEPWITHSHA1ANDMGF1PADDING,
- OAEPWITHSHA_1ANDMGF1PADDING,
- OAEPWITHSHA224ANDMGF1PADDING,
- OAEPWITHSHA_224ANDMGF1PADDING,
- OAEPWITHSHA256ANDMGF1PADDING,
- OAEPWITHSHA_256ANDMGF1PADDING,
- OAEPWITHSHA384ANDMGF1PADDING,
- OAEPWITHSHA_384ANDMGF1PADDING,
- OAEPWITHSHA512ANDMGF1PADDING,
- OAEPWITHSHA_512ANDMGF1PADDING,
- PKCS1,
- PKCS1PADDING,
- PKCS5,
- PKCS5PADDING,
- PKCS7,
- PKCS7PADDING,
- TBCPADDING,
- WITHCTS,
- X923PADDING,
- ZEROBYTEPADDING,
- };
-
- private static readonly IDictionary algorithms = Platform.CreateHashtable();
- private static readonly IDictionary oids = Platform.CreateHashtable();
-
- static CipherUtilities()
- {
- // Signal to obfuscation tools not to change enum constants
- ((CipherAlgorithm)Enums.GetArbitraryValue(typeof(CipherAlgorithm))).ToString();
- ((CipherMode)Enums.GetArbitraryValue(typeof(CipherMode))).ToString();
- ((CipherPadding)Enums.GetArbitraryValue(typeof(CipherPadding))).ToString();
-
- // TODO Flesh out the list of aliases
-
- algorithms[NistObjectIdentifiers.IdAes128Ecb.Id] = "AES/ECB/PKCS7PADDING";
- algorithms[NistObjectIdentifiers.IdAes192Ecb.Id] = "AES/ECB/PKCS7PADDING";
- algorithms[NistObjectIdentifiers.IdAes256Ecb.Id] = "AES/ECB/PKCS7PADDING";
- algorithms["AES//PKCS7"] = "AES/ECB/PKCS7PADDING";
- algorithms["AES//PKCS7PADDING"] = "AES/ECB/PKCS7PADDING";
- algorithms["AES//PKCS5"] = "AES/ECB/PKCS7PADDING";
- algorithms["AES//PKCS5PADDING"] = "AES/ECB/PKCS7PADDING";
-
- algorithms[NistObjectIdentifiers.IdAes128Cbc.Id] = "AES/CBC/PKCS7PADDING";
- algorithms[NistObjectIdentifiers.IdAes192Cbc.Id] = "AES/CBC/PKCS7PADDING";
- algorithms[NistObjectIdentifiers.IdAes256Cbc.Id] = "AES/CBC/PKCS7PADDING";
-
- algorithms[NistObjectIdentifiers.IdAes128Ofb.Id] = "AES/OFB/NOPADDING";
- algorithms[NistObjectIdentifiers.IdAes192Ofb.Id] = "AES/OFB/NOPADDING";
- algorithms[NistObjectIdentifiers.IdAes256Ofb.Id] = "AES/OFB/NOPADDING";
-
- algorithms[NistObjectIdentifiers.IdAes128Cfb.Id] = "AES/CFB/NOPADDING";
- algorithms[NistObjectIdentifiers.IdAes192Cfb.Id] = "AES/CFB/NOPADDING";
- algorithms[NistObjectIdentifiers.IdAes256Cfb.Id] = "AES/CFB/NOPADDING";
-
- algorithms["RSA/ECB/PKCS1"] = "RSA//PKCS1PADDING";
- algorithms["RSA/ECB/PKCS1PADDING"] = "RSA//PKCS1PADDING";
- algorithms[PkcsObjectIdentifiers.RsaEncryption.Id] = "RSA//PKCS1PADDING";
- algorithms[PkcsObjectIdentifiers.IdRsaesOaep.Id] = "RSA//OAEPPADDING";
-
- algorithms[OiwObjectIdentifiers.DesCbc.Id] = "DES/CBC";
- algorithms[OiwObjectIdentifiers.DesCfb.Id] = "DES/CFB";
- algorithms[OiwObjectIdentifiers.DesEcb.Id] = "DES/ECB";
- algorithms[OiwObjectIdentifiers.DesOfb.Id] = "DES/OFB";
- algorithms[OiwObjectIdentifiers.DesEde.Id] = "DESEDE";
- algorithms["TDEA"] = "DESEDE";
- algorithms[PkcsObjectIdentifiers.DesEde3Cbc.Id] = "DESEDE/CBC";
- algorithms[PkcsObjectIdentifiers.RC2Cbc.Id] = "RC2/CBC";
- algorithms["1.3.6.1.4.1.188.7.1.1.2"] = "IDEA/CBC";
- algorithms["1.2.840.113533.7.66.10"] = "CAST5/CBC";
-
- algorithms["RC4"] = "ARC4";
- algorithms["ARCFOUR"] = "ARC4";
- algorithms["1.2.840.113549.3.4"] = "ARC4";
-
-
-
- algorithms["PBEWITHSHA1AND128BITRC4"] = "PBEWITHSHAAND128BITRC4";
- algorithms[PkcsObjectIdentifiers.PbeWithShaAnd128BitRC4.Id] = "PBEWITHSHAAND128BITRC4";
- algorithms["PBEWITHSHA1AND40BITRC4"] = "PBEWITHSHAAND40BITRC4";
- algorithms[PkcsObjectIdentifiers.PbeWithShaAnd40BitRC4.Id] = "PBEWITHSHAAND40BITRC4";
-
- algorithms["PBEWITHSHA1ANDDES"] = "PBEWITHSHA1ANDDES-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithSha1AndDesCbc.Id] = "PBEWITHSHA1ANDDES-CBC";
- algorithms["PBEWITHSHA1ANDRC2"] = "PBEWITHSHA1ANDRC2-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithSha1AndRC2Cbc.Id] = "PBEWITHSHA1ANDRC2-CBC";
-
- algorithms["PBEWITHSHA1AND3-KEYTRIPLEDES-CBC"] = "PBEWITHSHAAND3-KEYTRIPLEDES-CBC";
- algorithms["PBEWITHSHAAND3KEYTRIPLEDES"] = "PBEWITHSHAAND3-KEYTRIPLEDES-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithShaAnd3KeyTripleDesCbc.Id] = "PBEWITHSHAAND3-KEYTRIPLEDES-CBC";
- algorithms["PBEWITHSHA1ANDDESEDE"] = "PBEWITHSHAAND3-KEYTRIPLEDES-CBC";
-
- algorithms["PBEWITHSHA1AND2-KEYTRIPLEDES-CBC"] = "PBEWITHSHAAND2-KEYTRIPLEDES-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithShaAnd2KeyTripleDesCbc.Id] = "PBEWITHSHAAND2-KEYTRIPLEDES-CBC";
-
- algorithms["PBEWITHSHA1AND128BITRC2-CBC"] = "PBEWITHSHAAND128BITRC2-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithShaAnd128BitRC2Cbc.Id] = "PBEWITHSHAAND128BITRC2-CBC";
-
- algorithms["PBEWITHSHA1AND40BITRC2-CBC"] = "PBEWITHSHAAND40BITRC2-CBC";
- algorithms[PkcsObjectIdentifiers.PbewithShaAnd40BitRC2Cbc.Id] = "PBEWITHSHAAND40BITRC2-CBC";
-
- algorithms["PBEWITHSHA1AND128BITAES-CBC-BC"] = "PBEWITHSHAAND128BITAES-CBC-BC";
- algorithms["PBEWITHSHA-1AND128BITAES-CBC-BC"] = "PBEWITHSHAAND128BITAES-CBC-BC";
-
- algorithms["PBEWITHSHA1AND192BITAES-CBC-BC"] = "PBEWITHSHAAND192BITAES-CBC-BC";
- algorithms["PBEWITHSHA-1AND192BITAES-CBC-BC"] = "PBEWITHSHAAND192BITAES-CBC-BC";
-
- algorithms["PBEWITHSHA1AND256BITAES-CBC-BC"] = "PBEWITHSHAAND256BITAES-CBC-BC";
- algorithms["PBEWITHSHA-1AND256BITAES-CBC-BC"] = "PBEWITHSHAAND256BITAES-CBC-BC";
-
- algorithms["PBEWITHSHA-256AND128BITAES-CBC-BC"] = "PBEWITHSHA256AND128BITAES-CBC-BC";
- algorithms["PBEWITHSHA-256AND192BITAES-CBC-BC"] = "PBEWITHSHA256AND192BITAES-CBC-BC";
- algorithms["PBEWITHSHA-256AND256BITAES-CBC-BC"] = "PBEWITHSHA256AND256BITAES-CBC-BC";
-
-
- algorithms["GOST"] = "GOST28147";
- algorithms["GOST-28147"] = "GOST28147";
- algorithms[CryptoProObjectIdentifiers.GostR28147Cbc.Id] = "GOST28147/CBC/PKCS7PADDING";
-
- algorithms["RC5-32"] = "RC5";
-
- algorithms[NttObjectIdentifiers.IdCamellia128Cbc.Id] = "CAMELLIA/CBC/PKCS7PADDING";
- algorithms[NttObjectIdentifiers.IdCamellia192Cbc.Id] = "CAMELLIA/CBC/PKCS7PADDING";
- algorithms[NttObjectIdentifiers.IdCamellia256Cbc.Id] = "CAMELLIA/CBC/PKCS7PADDING";
-
- algorithms[KisaObjectIdentifiers.IdSeedCbc.Id] = "SEED/CBC/PKCS7PADDING";
-
- algorithms["1.3.6.1.4.1.3029.1.2"] = "BLOWFISH/CBC";
- }
-
- private CipherUtilities()
- {
- }
-
- ///
- /// Returns a ObjectIdentifier for a give encoding.
- ///
- /// A string representation of the encoding.
- /// A DerObjectIdentifier, null if the Oid is not available.
- // TODO Don't really want to support this
- public static DerObjectIdentifier GetObjectIdentifier(
- string mechanism)
- {
- if (mechanism == null)
- throw new ArgumentNullException("mechanism");
-
- mechanism = Platform.ToUpperInvariant(mechanism);
- string aliased = (string) algorithms[mechanism];
-
- if (aliased != null)
- mechanism = aliased;
-
- return (DerObjectIdentifier) oids[mechanism];
- }
-
- public static ICollection Algorithms
- {
- get { return oids.Keys; }
- }
-
- public static IBufferedCipher GetCipher(
- DerObjectIdentifier oid)
- {
- return GetCipher(oid.Id);
- }
-
- public static IBufferedCipher GetCipher(
- string algorithm)
- {
- if (algorithm == null)
- throw new ArgumentNullException("algorithm");
-
- algorithm = Platform.ToUpperInvariant(algorithm);
-
- {
- string aliased = (string) algorithms[algorithm];
-
- if (aliased != null)
- algorithm = aliased;
- }
-
- IBasicAgreement iesAgreement = null;
- if (algorithm == "IES")
- {
- iesAgreement = new DHBasicAgreement();
- }
- else if (algorithm == "ECIES")
- {
- iesAgreement = new ECDHBasicAgreement();
- }
-
- if (iesAgreement != null)
- {
- return new BufferedIesCipher(
- new IesEngine(
- iesAgreement,
- new Kdf2BytesGenerator(
- new Sha1Digest()),
- new HMac(
- new Sha1Digest())));
- }
-
-
-
- if (Platform.StartsWith(algorithm, "PBE"))
- {
- if (Platform.EndsWith(algorithm, "-CBC"))
- {
- if (algorithm == "PBEWITHSHA1ANDDES-CBC")
- {
- return new PaddedBufferedBlockCipher(
- new CbcBlockCipher(new DesEngine()));
- }
- else if (algorithm == "PBEWITHSHA1ANDRC2-CBC")
- {
- return new PaddedBufferedBlockCipher(
- new CbcBlockCipher(new RC2Engine()));
- }
- else if (Strings.IsOneOf(algorithm,
- "PBEWITHSHAAND2-KEYTRIPLEDES-CBC", "PBEWITHSHAAND3-KEYTRIPLEDES-CBC"))
- {
- return new PaddedBufferedBlockCipher(
- new CbcBlockCipher(new DesEdeEngine()));
- }
- else if (Strings.IsOneOf(algorithm,
- "PBEWITHSHAAND128BITRC2-CBC", "PBEWITHSHAAND40BITRC2-CBC"))
- {
- return new PaddedBufferedBlockCipher(
- new CbcBlockCipher(new RC2Engine()));
- }
- }
- else if (Platform.EndsWith(algorithm, "-BC") || Platform.EndsWith(algorithm, "-OPENSSL"))
- {
- if (Strings.IsOneOf(algorithm,
- "PBEWITHSHAAND128BITAES-CBC-BC",
- "PBEWITHSHAAND192BITAES-CBC-BC",
- "PBEWITHSHAAND256BITAES-CBC-BC",
- "PBEWITHSHA256AND128BITAES-CBC-BC",
- "PBEWITHSHA256AND192BITAES-CBC-BC",
- "PBEWITHSHA256AND256BITAES-CBC-BC",
- "PBEWITHMD5AND128BITAES-CBC-OPENSSL",
- "PBEWITHMD5AND192BITAES-CBC-OPENSSL",
- "PBEWITHMD5AND256BITAES-CBC-OPENSSL"))
- {
- return new PaddedBufferedBlockCipher(
- new CbcBlockCipher(new AesEngine()));
- }
- }
- }
-
-
-
- string[] parts = algorithm.Split('/');
-
- IBlockCipher blockCipher = null;
- IAsymmetricBlockCipher asymBlockCipher = null;
- IStreamCipher streamCipher = null;
-
- string algorithmName = parts[0];
-
- {
- string aliased = (string)algorithms[algorithmName];
-
- if (aliased != null)
- algorithmName = aliased;
- }
-
- CipherAlgorithm cipherAlgorithm;
- try
- {
- cipherAlgorithm = (CipherAlgorithm)Enums.GetEnumValue(typeof(CipherAlgorithm), algorithmName);
- }
- catch (ArgumentException)
- {
- throw new SecurityUtilityException("Cipher " + algorithm + " not recognised.");
- }
-
- switch (cipherAlgorithm)
- {
- case CipherAlgorithm.AES:
- blockCipher = new AesEngine();
- break;
- case CipherAlgorithm.ARC4:
- streamCipher = new RC4Engine();
- break;
- case CipherAlgorithm.BLOWFISH:
- blockCipher = new BlowfishEngine();
- break;
- case CipherAlgorithm.CAMELLIA:
- blockCipher = new CamelliaEngine();
- break;
- case CipherAlgorithm.CAST5:
- blockCipher = new Cast5Engine();
- break;
- case CipherAlgorithm.CAST6:
- blockCipher = new Cast6Engine();
- break;
- case CipherAlgorithm.DES:
- blockCipher = new DesEngine();
- break;
- case CipherAlgorithm.DESEDE:
- blockCipher = new DesEdeEngine();
- break;
- case CipherAlgorithm.ELGAMAL:
- asymBlockCipher = new ElGamalEngine();
- break;
- case CipherAlgorithm.GOST28147:
- blockCipher = new Gost28147Engine();
- break;
- case CipherAlgorithm.HC128:
- streamCipher = new HC128Engine();
- break;
- case CipherAlgorithm.HC256:
- streamCipher = new HC256Engine();
- break;
- case CipherAlgorithm.IDEA:
- blockCipher = new IdeaEngine();
- break;
- case CipherAlgorithm.NOEKEON:
- blockCipher = new NoekeonEngine();
- break;
- case CipherAlgorithm.PBEWITHSHAAND128BITRC4:
- case CipherAlgorithm.PBEWITHSHAAND40BITRC4:
- streamCipher = new RC4Engine();
- break;
- case CipherAlgorithm.RC2:
- blockCipher = new RC2Engine();
- break;
- case CipherAlgorithm.RC5:
- blockCipher = new RC532Engine();
- break;
- case CipherAlgorithm.RC5_64:
- blockCipher = new RC564Engine();
- break;
- case CipherAlgorithm.RC6:
- blockCipher = new RC6Engine();
- break;
- case CipherAlgorithm.RIJNDAEL:
- blockCipher = new RijndaelEngine();
- break;
- case CipherAlgorithm.RSA:
- asymBlockCipher = new RsaBlindedEngine();
- break;
- case CipherAlgorithm.SALSA20:
- streamCipher = new Salsa20Engine();
- break;
- case CipherAlgorithm.SEED:
- blockCipher = new SeedEngine();
- break;
- case CipherAlgorithm.SERPENT:
- blockCipher = new SerpentEngine();
- break;
- case CipherAlgorithm.SKIPJACK:
- blockCipher = new SkipjackEngine();
- break;
- case CipherAlgorithm.TEA:
- blockCipher = new TeaEngine();
- break;
- case CipherAlgorithm.THREEFISH_256:
- blockCipher = new ThreefishEngine(ThreefishEngine.BLOCKSIZE_256);
- break;
- case CipherAlgorithm.THREEFISH_512:
- blockCipher = new ThreefishEngine(ThreefishEngine.BLOCKSIZE_512);
- break;
- case CipherAlgorithm.THREEFISH_1024:
- blockCipher = new ThreefishEngine(ThreefishEngine.BLOCKSIZE_1024);
- break;
- case CipherAlgorithm.TNEPRES:
- blockCipher = new TnepresEngine();
- break;
- case CipherAlgorithm.TWOFISH:
- blockCipher = new TwofishEngine();
- break;
- case CipherAlgorithm.VMPC:
- streamCipher = new VmpcEngine();
- break;
- case CipherAlgorithm.VMPC_KSA3:
- streamCipher = new VmpcKsa3Engine();
- break;
- case CipherAlgorithm.XTEA:
- blockCipher = new XteaEngine();
- break;
- default:
- throw new SecurityUtilityException("Cipher " + algorithm + " not recognised.");
- }
-
- if (streamCipher != null)
- {
- if (parts.Length > 1)
- throw new ArgumentException("Modes and paddings not used for stream ciphers");
-
- return new BufferedStreamCipher(streamCipher);
- }
-
-
- bool cts = false;
- bool padded = true;
- IBlockCipherPadding padding = null;
- IAeadBlockCipher aeadBlockCipher = null;
-
- if (parts.Length > 2)
- {
- if (streamCipher != null)
- throw new ArgumentException("Paddings not used for stream ciphers");
-
- string paddingName = parts[2];
-
- CipherPadding cipherPadding;
- if (paddingName == "")
- {
- cipherPadding = CipherPadding.RAW;
- }
- else if (paddingName == "X9.23PADDING")
- {
- cipherPadding = CipherPadding.X923PADDING;
- }
- else
- {
- try
- {
- cipherPadding = (CipherPadding)Enums.GetEnumValue(typeof(CipherPadding), paddingName);
- }
- catch (ArgumentException)
- {
- throw new SecurityUtilityException("Cipher " + algorithm + " not recognised.");
- }
- }
-
- switch (cipherPadding)
- {
- case CipherPadding.NOPADDING:
- padded = false;
- break;
- case CipherPadding.RAW:
- break;
- case CipherPadding.ISO10126PADDING:
- case CipherPadding.ISO10126D2PADDING:
- case CipherPadding.ISO10126_2PADDING:
- padding = new ISO10126d2Padding();
- break;
- case CipherPadding.ISO7816_4PADDING:
- case CipherPadding.ISO9797_1PADDING:
- padding = new ISO7816d4Padding();
- break;
- case CipherPadding.ISO9796_1:
- case CipherPadding.ISO9796_1PADDING:
- asymBlockCipher = new ISO9796d1Encoding(asymBlockCipher);
- break;
- case CipherPadding.OAEP:
- case CipherPadding.OAEPPADDING:
- asymBlockCipher = new OaepEncoding(asymBlockCipher);
- break;
- case CipherPadding.OAEPWITHMD5ANDMGF1PADDING:
- asymBlockCipher = new OaepEncoding(asymBlockCipher, new MD5Digest());
- break;
- case CipherPadding.OAEPWITHSHA1ANDMGF1PADDING:
- case CipherPadding.OAEPWITHSHA_1ANDMGF1PADDING:
- asymBlockCipher = new OaepEncoding(asymBlockCipher, new Sha1Digest());
- break;
- case CipherPadding.OAEPWITHSHA224ANDMGF1PADDING:
- case CipherPadding.OAEPWITHSHA_224ANDMGF1PADDING:
- asymBlockCipher = new OaepEncoding(asymBlockCipher, new Sha224Digest());
- break;
- case CipherPadding.OAEPWITHSHA256ANDMGF1PADDING:
- case CipherPadding.OAEPWITHSHA_256ANDMGF1PADDING:
- asymBlockCipher = new OaepEncoding(asymBlockCipher, new Sha256Digest());
- break;
- case CipherPadding.OAEPWITHSHA384ANDMGF1PADDING:
- case CipherPadding.OAEPWITHSHA_384ANDMGF1PADDING:
- asymBlockCipher = new OaepEncoding(asymBlockCipher, new Sha384Digest());
- break;
- case CipherPadding.OAEPWITHSHA512ANDMGF1PADDING:
- case CipherPadding.OAEPWITHSHA_512ANDMGF1PADDING:
- asymBlockCipher = new OaepEncoding(asymBlockCipher, new Sha512Digest());
- break;
- case CipherPadding.PKCS1:
- case CipherPadding.PKCS1PADDING:
- asymBlockCipher = new Pkcs1Encoding(asymBlockCipher);
- break;
- case CipherPadding.PKCS5:
- case CipherPadding.PKCS5PADDING:
- case CipherPadding.PKCS7:
- case CipherPadding.PKCS7PADDING:
- padding = new Pkcs7Padding();
- break;
- case CipherPadding.TBCPADDING:
- padding = new TbcPadding();
- break;
- case CipherPadding.WITHCTS:
- cts = true;
- break;
- case CipherPadding.X923PADDING:
- padding = new X923Padding();
- break;
- case CipherPadding.ZEROBYTEPADDING:
- padding = new ZeroBytePadding();
- break;
- default:
- throw new SecurityUtilityException("Cipher " + algorithm + " not recognised.");
- }
- }
-
- string mode = "";
- if (parts.Length > 1)
- {
- mode = parts[1];
-
- int di = GetDigitIndex(mode);
- string modeName = di >= 0 ? mode.Substring(0, di) : mode;
-
- try
- {
- CipherMode cipherMode = modeName == ""
- ? CipherMode.NONE
- : (CipherMode)Enums.GetEnumValue(typeof(CipherMode), modeName);
-
- switch (cipherMode)
- {
- case CipherMode.ECB:
- case CipherMode.NONE:
- break;
- case CipherMode.CBC:
- blockCipher = new CbcBlockCipher(blockCipher);
- break;
- case CipherMode.CCM:
- aeadBlockCipher = new CcmBlockCipher(blockCipher);
- break;
- case CipherMode.CFB:
- {
- int bits = (di < 0)
- ? 8 * blockCipher.GetBlockSize()
- : int.Parse(mode.Substring(di));
-
- blockCipher = new CfbBlockCipher(blockCipher, bits);
- break;
- }
- case CipherMode.CTR:
- blockCipher = new SicBlockCipher(blockCipher);
- break;
- case CipherMode.CTS:
- cts = true;
- blockCipher = new CbcBlockCipher(blockCipher);
- break;
- case CipherMode.EAX:
- aeadBlockCipher = new EaxBlockCipher(blockCipher);
- break;
- case CipherMode.GCM:
- aeadBlockCipher = new GcmBlockCipher(blockCipher);
- break;
- case CipherMode.GOFB:
- blockCipher = new GOfbBlockCipher(blockCipher);
- break;
- case CipherMode.OCB:
- aeadBlockCipher = new OcbBlockCipher(blockCipher, CreateBlockCipher(cipherAlgorithm));
- break;
- case CipherMode.OFB:
- {
- int bits = (di < 0)
- ? 8 * blockCipher.GetBlockSize()
- : int.Parse(mode.Substring(di));
-
- blockCipher = new OfbBlockCipher(blockCipher, bits);
- break;
- }
- case CipherMode.OPENPGPCFB:
- blockCipher = new OpenPgpCfbBlockCipher(blockCipher);
- break;
- case CipherMode.SIC:
- if (blockCipher.GetBlockSize() < 16)
- {
- throw new ArgumentException("Warning: SIC-Mode can become a twotime-pad if the blocksize of the cipher is too small. Use a cipher with a block size of at least 128 bits (e.g. AES)");
- }
- blockCipher = new SicBlockCipher(blockCipher);
- break;
- default:
- throw new SecurityUtilityException("Cipher " + algorithm + " not recognised.");
- }
- }
- catch (ArgumentException)
- {
- throw new SecurityUtilityException("Cipher " + algorithm + " not recognised.");
- }
- }
-
- if (aeadBlockCipher != null)
- {
- if (cts)
- throw new SecurityUtilityException("CTS mode not valid for AEAD ciphers.");
- if (padded && parts.Length > 2 && parts[2] != "")
- throw new SecurityUtilityException("Bad padding specified for AEAD cipher.");
-
- return new BufferedAeadBlockCipher(aeadBlockCipher);
- }
-
- if (blockCipher != null)
- {
- if (cts)
- {
- return new CtsBlockCipher(blockCipher);
- }
-
- if (padding != null)
- {
- return new PaddedBufferedBlockCipher(blockCipher, padding);
- }
-
- if (!padded || blockCipher.IsPartialBlockOkay)
- {
- return new BufferedBlockCipher(blockCipher);
- }
-
- return new PaddedBufferedBlockCipher(blockCipher);
- }
-
- if (asymBlockCipher != null)
- {
- return new BufferedAsymmetricBlockCipher(asymBlockCipher);
- }
-
- throw new SecurityUtilityException("Cipher " + algorithm + " not recognised.");
- }
-
- public static string GetAlgorithmName(
- DerObjectIdentifier oid)
- {
- return (string) algorithms[oid.Id];
- }
-
- private static int GetDigitIndex(
- string s)
- {
- for (int i = 0; i < s.Length; ++i)
- {
- if (char.IsDigit(s[i]))
- return i;
- }
-
- return -1;
- }
-
- private static IBlockCipher CreateBlockCipher(CipherAlgorithm cipherAlgorithm)
- {
- switch (cipherAlgorithm)
- {
- case CipherAlgorithm.AES: return new AesEngine();
- case CipherAlgorithm.BLOWFISH: return new BlowfishEngine();
- case CipherAlgorithm.CAMELLIA: return new CamelliaEngine();
- case CipherAlgorithm.CAST5: return new Cast5Engine();
- case CipherAlgorithm.CAST6: return new Cast6Engine();
- case CipherAlgorithm.DES: return new DesEngine();
- case CipherAlgorithm.DESEDE: return new DesEdeEngine();
- case CipherAlgorithm.GOST28147: return new Gost28147Engine();
- case CipherAlgorithm.IDEA: return new IdeaEngine();
- case CipherAlgorithm.NOEKEON: return new NoekeonEngine();
- case CipherAlgorithm.RC2: return new RC2Engine();
- case CipherAlgorithm.RC5: return new RC532Engine();
- case CipherAlgorithm.RC5_64: return new RC564Engine();
- case CipherAlgorithm.RC6: return new RC6Engine();
- case CipherAlgorithm.RIJNDAEL: return new RijndaelEngine();
- case CipherAlgorithm.SEED: return new SeedEngine();
- case CipherAlgorithm.SERPENT: return new SerpentEngine();
- case CipherAlgorithm.SKIPJACK: return new SkipjackEngine();
- case CipherAlgorithm.TEA: return new TeaEngine();
- case CipherAlgorithm.THREEFISH_256: return new ThreefishEngine(ThreefishEngine.BLOCKSIZE_256);
- case CipherAlgorithm.THREEFISH_512: return new ThreefishEngine(ThreefishEngine.BLOCKSIZE_512);
- case CipherAlgorithm.THREEFISH_1024: return new ThreefishEngine(ThreefishEngine.BLOCKSIZE_1024);
- case CipherAlgorithm.TNEPRES: return new TnepresEngine();
- case CipherAlgorithm.TWOFISH: return new TwofishEngine();
- case CipherAlgorithm.XTEA: return new XteaEngine();
- default:
- throw new SecurityUtilityException("Cipher " + cipherAlgorithm + " not recognised or not a block cipher");
- }
- }
- }
-}
diff --git a/BCCrypto/src/security/DigestUtilities.cs b/BCCrypto/src/security/DigestUtilities.cs
deleted file mode 100644
index 7ddf6c8..0000000
--- a/BCCrypto/src/security/DigestUtilities.cs
+++ /dev/null
@@ -1,222 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Security
-{
- ///
- /// Utility class for creating IDigest objects from their names/Oids
- ///
- public sealed class DigestUtilities
- {
- private enum DigestAlgorithm {
- GOST3411,
- KECCAK_224, KECCAK_256, KECCAK_288, KECCAK_384, KECCAK_512,
- MD2, MD4, MD5,
- RIPEMD128, RIPEMD160, RIPEMD256, RIPEMD320,
- SHA_1, SHA_224, SHA_256, SHA_384, SHA_512,
- SHA_512_224, SHA_512_256,
- SHA3_224, SHA3_256, SHA3_384, SHA3_512,
- SHAKE128, SHAKE256,
- TIGER,
- WHIRLPOOL,
- };
-
- private DigestUtilities()
- {
- }
-
- private static readonly IDictionary algorithms = Platform.CreateHashtable();
- private static readonly IDictionary oids = Platform.CreateHashtable();
-
- static DigestUtilities()
- {
- // Signal to obfuscation tools not to change enum constants
- ((DigestAlgorithm)Enums.GetArbitraryValue(typeof(DigestAlgorithm))).ToString();
-
- algorithms[PkcsObjectIdentifiers.MD2.Id] = "MD2";
- algorithms[PkcsObjectIdentifiers.MD4.Id] = "MD4";
- algorithms[PkcsObjectIdentifiers.MD5.Id] = "MD5";
-
- algorithms["SHA1"] = "SHA-1";
- algorithms[OiwObjectIdentifiers.IdSha1.Id] = "SHA-1";
- algorithms["SHA224"] = "SHA-224";
- algorithms[NistObjectIdentifiers.IdSha224.Id] = "SHA-224";
- algorithms["SHA256"] = "SHA-256";
- algorithms[NistObjectIdentifiers.IdSha256.Id] = "SHA-256";
- algorithms["SHA384"] = "SHA-384";
- algorithms[NistObjectIdentifiers.IdSha384.Id] = "SHA-384";
- algorithms["SHA512"] = "SHA-512";
- algorithms[NistObjectIdentifiers.IdSha512.Id] = "SHA-512";
- algorithms["SHA512/224"] = "SHA-512/224";
- algorithms[NistObjectIdentifiers.IdSha512_224.Id] = "SHA-512/224";
- algorithms["SHA512/256"] = "SHA-512/256";
- algorithms[NistObjectIdentifiers.IdSha512_256.Id] = "SHA-512/256";
-
- algorithms["RIPEMD-128"] = "RIPEMD128";
- algorithms[TeleTrusTObjectIdentifiers.RipeMD128.Id] = "RIPEMD128";
- algorithms["RIPEMD-160"] = "RIPEMD160";
- algorithms[TeleTrusTObjectIdentifiers.RipeMD160.Id] = "RIPEMD160";
- algorithms["RIPEMD-256"] = "RIPEMD256";
- algorithms[TeleTrusTObjectIdentifiers.RipeMD256.Id] = "RIPEMD256";
- algorithms["RIPEMD-320"] = "RIPEMD320";
-// algorithms[TeleTrusTObjectIdentifiers.RipeMD320.Id] = "RIPEMD320";
-
- algorithms[CryptoProObjectIdentifiers.GostR3411.Id] = "GOST3411";
-
- algorithms[NistObjectIdentifiers.IdSha3_224.Id] = "SHA3-224";
- algorithms[NistObjectIdentifiers.IdSha3_256.Id] = "SHA3-256";
- algorithms[NistObjectIdentifiers.IdSha3_384.Id] = "SHA3-384";
- algorithms[NistObjectIdentifiers.IdSha3_512.Id] = "SHA3-512";
- algorithms[NistObjectIdentifiers.IdShake128.Id] = "SHAKE128";
- algorithms[NistObjectIdentifiers.IdShake256.Id] = "SHAKE256";
-
- oids["MD2"] = PkcsObjectIdentifiers.MD2;
- oids["MD4"] = PkcsObjectIdentifiers.MD4;
- oids["MD5"] = PkcsObjectIdentifiers.MD5;
- oids["SHA-1"] = OiwObjectIdentifiers.IdSha1;
- oids["SHA-224"] = NistObjectIdentifiers.IdSha224;
- oids["SHA-256"] = NistObjectIdentifiers.IdSha256;
- oids["SHA-384"] = NistObjectIdentifiers.IdSha384;
- oids["SHA-512"] = NistObjectIdentifiers.IdSha512;
- oids["SHA-512/224"] = NistObjectIdentifiers.IdSha512_224;
- oids["SHA-512/256"] = NistObjectIdentifiers.IdSha512_256;
- oids["SHA3-224"] = NistObjectIdentifiers.IdSha3_224;
- oids["SHA3-256"] = NistObjectIdentifiers.IdSha3_256;
- oids["SHA3-384"] = NistObjectIdentifiers.IdSha3_384;
- oids["SHA3-512"] = NistObjectIdentifiers.IdSha3_512;
- oids["SHAKE128"] = NistObjectIdentifiers.IdShake128;
- oids["SHAKE256"] = NistObjectIdentifiers.IdShake256;
- oids["RIPEMD128"] = TeleTrusTObjectIdentifiers.RipeMD128;
- oids["RIPEMD160"] = TeleTrusTObjectIdentifiers.RipeMD160;
- oids["RIPEMD256"] = TeleTrusTObjectIdentifiers.RipeMD256;
- oids["GOST3411"] = CryptoProObjectIdentifiers.GostR3411;
- }
-
- ///
- /// Returns a ObjectIdentifier for a given digest mechanism.
- ///
- /// A string representation of the digest meanism.
- /// A DerObjectIdentifier, null if the Oid is not available.
-
- public static DerObjectIdentifier GetObjectIdentifier(
- string mechanism)
- {
- if (mechanism == null)
- throw new System.ArgumentNullException("mechanism");
-
- mechanism = Platform.ToUpperInvariant(mechanism);
- string aliased = (string) algorithms[mechanism];
-
- if (aliased != null)
- mechanism = aliased;
-
- return (DerObjectIdentifier) oids[mechanism];
- }
-
- public static ICollection Algorithms
- {
- get { return oids.Keys; }
- }
-
- public static IDigest GetDigest(
- DerObjectIdentifier id)
- {
- return GetDigest(id.Id);
- }
-
- public static IDigest GetDigest(
- string algorithm)
- {
- string upper = Platform.ToUpperInvariant(algorithm);
- string mechanism = (string) algorithms[upper];
-
- if (mechanism == null)
- {
- mechanism = upper;
- }
-
- try
- {
- DigestAlgorithm digestAlgorithm = (DigestAlgorithm)Enums.GetEnumValue(
- typeof(DigestAlgorithm), mechanism);
-
- switch (digestAlgorithm)
- {
- case DigestAlgorithm.GOST3411: return new Gost3411Digest();
- case DigestAlgorithm.KECCAK_224: return new KeccakDigest(224);
- case DigestAlgorithm.KECCAK_256: return new KeccakDigest(256);
- case DigestAlgorithm.KECCAK_288: return new KeccakDigest(288);
- case DigestAlgorithm.KECCAK_384: return new KeccakDigest(384);
- case DigestAlgorithm.KECCAK_512: return new KeccakDigest(512);
- case DigestAlgorithm.MD2: return new MD2Digest();
- case DigestAlgorithm.MD4: return new MD4Digest();
- case DigestAlgorithm.MD5: return new MD5Digest();
- case DigestAlgorithm.RIPEMD128: return new RipeMD128Digest();
- case DigestAlgorithm.RIPEMD160: return new RipeMD160Digest();
- case DigestAlgorithm.RIPEMD256: return new RipeMD256Digest();
- case DigestAlgorithm.RIPEMD320: return new RipeMD320Digest();
- case DigestAlgorithm.SHA_1: return new Sha1Digest();
- case DigestAlgorithm.SHA_224: return new Sha224Digest();
- case DigestAlgorithm.SHA_256: return new Sha256Digest();
- case DigestAlgorithm.SHA_384: return new Sha384Digest();
- case DigestAlgorithm.SHA_512: return new Sha512Digest();
- case DigestAlgorithm.SHA_512_224: return new Sha512tDigest(224);
- case DigestAlgorithm.SHA_512_256: return new Sha512tDigest(256);
- case DigestAlgorithm.SHA3_224: return new Sha3Digest(224);
- case DigestAlgorithm.SHA3_256: return new Sha3Digest(256);
- case DigestAlgorithm.SHA3_384: return new Sha3Digest(384);
- case DigestAlgorithm.SHA3_512: return new Sha3Digest(512);
- case DigestAlgorithm.SHAKE128: return new ShakeDigest(128);
- case DigestAlgorithm.SHAKE256: return new ShakeDigest(256);
- case DigestAlgorithm.TIGER: return new TigerDigest();
- case DigestAlgorithm.WHIRLPOOL: return new WhirlpoolDigest();
- }
- }
- catch (ArgumentException)
- {
- }
-
- throw new SecurityUtilityException("Digest " + mechanism + " not recognised.");
- }
-
- public static string GetAlgorithmName(
- DerObjectIdentifier oid)
- {
- return (string) algorithms[oid.Id];
- }
-
- public static byte[] CalculateDigest(string algorithm, byte[] input)
- {
- IDigest digest = GetDigest(algorithm);
- digest.BlockUpdate(input, 0, input.Length);
- return DoFinal(digest);
- }
-
- public static byte[] DoFinal(
- IDigest digest)
- {
- byte[] b = new byte[digest.GetDigestSize()];
- digest.DoFinal(b, 0);
- return b;
- }
-
- public static byte[] DoFinal(
- IDigest digest,
- byte[] input)
- {
- digest.BlockUpdate(input, 0, input.Length);
- return DoFinal(digest);
- }
- }
-}
diff --git a/BCCrypto/src/security/DotNetUtilities.cs b/BCCrypto/src/security/DotNetUtilities.cs
deleted file mode 100644
index 69322b5..0000000
--- a/BCCrypto/src/security/DotNetUtilities.cs
+++ /dev/null
@@ -1,245 +0,0 @@
-#if !(NETCF_1_0 || SILVERLIGHT || PORTABLE)
-
-using System;
-using System.Security.Cryptography;
-using SystemX509 = System.Security.Cryptography.X509Certificates;
-
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Security
-{
- ///
- /// A class containing methods to interface the BouncyCastle world to the .NET Crypto world.
- ///
- public sealed class DotNetUtilities
- {
- private DotNetUtilities()
- {
- }
-
- ///
- /// Create an System.Security.Cryptography.X509Certificate from an X509Certificate Structure.
- ///
- ///
- /// A System.Security.Cryptography.X509Certificate.
- public static SystemX509.X509Certificate ToX509Certificate(
- X509CertificateStructure x509Struct)
- {
- return new SystemX509.X509Certificate(x509Struct.GetDerEncoded());
- }
-
- public static SystemX509.X509Certificate ToX509Certificate(
- X509Certificate x509Cert)
- {
- return new SystemX509.X509Certificate(x509Cert.GetEncoded());
- }
-
- public static X509Certificate FromX509Certificate(
- SystemX509.X509Certificate x509Cert)
- {
- return new X509CertificateParser().ReadCertificate(x509Cert.GetRawCertData());
- }
-
- public static AsymmetricCipherKeyPair GetDsaKeyPair(
- DSA dsa)
- {
- return GetDsaKeyPair(dsa.ExportParameters(true));
- }
-
- public static AsymmetricCipherKeyPair GetDsaKeyPair(
- DSAParameters dp)
- {
- DsaValidationParameters validationParameters = (dp.Seed != null)
- ? new DsaValidationParameters(dp.Seed, dp.Counter)
- : null;
-
- DsaParameters parameters = new DsaParameters(
- new BigInteger(1, dp.P),
- new BigInteger(1, dp.Q),
- new BigInteger(1, dp.G),
- validationParameters);
-
- DsaPublicKeyParameters pubKey = new DsaPublicKeyParameters(
- new BigInteger(1, dp.Y),
- parameters);
-
- DsaPrivateKeyParameters privKey = new DsaPrivateKeyParameters(
- new BigInteger(1, dp.X),
- parameters);
-
- return new AsymmetricCipherKeyPair(pubKey, privKey);
- }
-
- public static DsaPublicKeyParameters GetDsaPublicKey(
- DSA dsa)
- {
- return GetDsaPublicKey(dsa.ExportParameters(false));
- }
-
- public static DsaPublicKeyParameters GetDsaPublicKey(
- DSAParameters dp)
- {
- DsaValidationParameters validationParameters = (dp.Seed != null)
- ? new DsaValidationParameters(dp.Seed, dp.Counter)
- : null;
-
- DsaParameters parameters = new DsaParameters(
- new BigInteger(1, dp.P),
- new BigInteger(1, dp.Q),
- new BigInteger(1, dp.G),
- validationParameters);
-
- return new DsaPublicKeyParameters(
- new BigInteger(1, dp.Y),
- parameters);
- }
-
- public static AsymmetricCipherKeyPair GetRsaKeyPair(
- RSA rsa)
- {
- return GetRsaKeyPair(rsa.ExportParameters(true));
- }
-
- public static AsymmetricCipherKeyPair GetRsaKeyPair(
- RSAParameters rp)
- {
- BigInteger modulus = new BigInteger(1, rp.Modulus);
- BigInteger pubExp = new BigInteger(1, rp.Exponent);
-
- RsaKeyParameters pubKey = new RsaKeyParameters(
- false,
- modulus,
- pubExp);
-
- RsaPrivateCrtKeyParameters privKey = new RsaPrivateCrtKeyParameters(
- modulus,
- pubExp,
- new BigInteger(1, rp.D),
- new BigInteger(1, rp.P),
- new BigInteger(1, rp.Q),
- new BigInteger(1, rp.DP),
- new BigInteger(1, rp.DQ),
- new BigInteger(1, rp.InverseQ));
-
- return new AsymmetricCipherKeyPair(pubKey, privKey);
- }
-
- public static RsaKeyParameters GetRsaPublicKey(
- RSA rsa)
- {
- return GetRsaPublicKey(rsa.ExportParameters(false));
- }
-
- public static RsaKeyParameters GetRsaPublicKey(
- RSAParameters rp)
- {
- return new RsaKeyParameters(
- false,
- new BigInteger(1, rp.Modulus),
- new BigInteger(1, rp.Exponent));
- }
-
- public static AsymmetricCipherKeyPair GetKeyPair(AsymmetricAlgorithm privateKey)
- {
- if (privateKey is DSA)
- {
- return GetDsaKeyPair((DSA)privateKey);
- }
-
- if (privateKey is RSA)
- {
- return GetRsaKeyPair((RSA)privateKey);
- }
-
- throw new ArgumentException("Unsupported algorithm specified", "privateKey");
- }
-
- public static RSA ToRSA(RsaKeyParameters rsaKey)
- {
- // TODO This appears to not work for private keys (when no CRT info)
- return CreateRSAProvider(ToRSAParameters(rsaKey));
- }
-
- public static RSA ToRSA(RsaPrivateCrtKeyParameters privKey)
- {
- return CreateRSAProvider(ToRSAParameters(privKey));
- }
-
- public static RSA ToRSA(RsaPrivateKeyStructure privKey)
- {
- return CreateRSAProvider(ToRSAParameters(privKey));
- }
-
- public static RSAParameters ToRSAParameters(RsaKeyParameters rsaKey)
- {
- RSAParameters rp = new RSAParameters();
- rp.Modulus = rsaKey.Modulus.ToByteArrayUnsigned();
- if (rsaKey.IsPrivate)
- rp.D = ConvertRSAParametersField(rsaKey.Exponent, rp.Modulus.Length);
- else
- rp.Exponent = rsaKey.Exponent.ToByteArrayUnsigned();
- return rp;
- }
-
- public static RSAParameters ToRSAParameters(RsaPrivateCrtKeyParameters privKey)
- {
- RSAParameters rp = new RSAParameters();
- rp.Modulus = privKey.Modulus.ToByteArrayUnsigned();
- rp.Exponent = privKey.PublicExponent.ToByteArrayUnsigned();
- rp.P = privKey.P.ToByteArrayUnsigned();
- rp.Q = privKey.Q.ToByteArrayUnsigned();
- rp.D = ConvertRSAParametersField(privKey.Exponent, rp.Modulus.Length);
- rp.DP = ConvertRSAParametersField(privKey.DP, rp.P.Length);
- rp.DQ = ConvertRSAParametersField(privKey.DQ, rp.Q.Length);
- rp.InverseQ = ConvertRSAParametersField(privKey.QInv, rp.Q.Length);
- return rp;
- }
-
- public static RSAParameters ToRSAParameters(RsaPrivateKeyStructure privKey)
- {
- RSAParameters rp = new RSAParameters();
- rp.Modulus = privKey.Modulus.ToByteArrayUnsigned();
- rp.Exponent = privKey.PublicExponent.ToByteArrayUnsigned();
- rp.P = privKey.Prime1.ToByteArrayUnsigned();
- rp.Q = privKey.Prime2.ToByteArrayUnsigned();
- rp.D = ConvertRSAParametersField(privKey.PrivateExponent, rp.Modulus.Length);
- rp.DP = ConvertRSAParametersField(privKey.Exponent1, rp.P.Length);
- rp.DQ = ConvertRSAParametersField(privKey.Exponent2, rp.Q.Length);
- rp.InverseQ = ConvertRSAParametersField(privKey.Coefficient, rp.Q.Length);
- return rp;
- }
-
- // TODO Move functionality to more general class
- private static byte[] ConvertRSAParametersField(BigInteger n, int size)
- {
- byte[] bs = n.ToByteArrayUnsigned();
-
- if (bs.Length == size)
- return bs;
-
- if (bs.Length > size)
- throw new ArgumentException("Specified size too small", "size");
-
- byte[] padded = new byte[size];
- Array.Copy(bs, 0, padded, size - bs.Length, bs.Length);
- return padded;
- }
-
- private static RSA CreateRSAProvider(RSAParameters rp)
- {
- CspParameters csp = new CspParameters();
- csp.KeyContainerName = string.Format("BouncyCastle-{0}", Guid.NewGuid());
- RSACryptoServiceProvider rsaCsp = new RSACryptoServiceProvider(csp);
- rsaCsp.ImportParameters(rp);
- return rsaCsp;
- }
- }
-}
-
-#endif
diff --git a/BCCrypto/src/security/GeneralSecurityException.cs b/BCCrypto/src/security/GeneralSecurityException.cs
deleted file mode 100644
index d4ab38c..0000000
--- a/BCCrypto/src/security/GeneralSecurityException.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class GeneralSecurityException
- : Exception
- {
- public GeneralSecurityException()
- : base()
- {
- }
-
- public GeneralSecurityException(
- string message)
- : base(message)
- {
- }
-
- public GeneralSecurityException(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/security/GeneratorUtilities.cs b/BCCrypto/src/security/GeneratorUtilities.cs
deleted file mode 100644
index 3beebd0..0000000
--- a/BCCrypto/src/security/GeneratorUtilities.cs
+++ /dev/null
@@ -1,352 +0,0 @@
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Iana;
-using Org.BouncyCastle.Asn1.Kisa;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Ntt;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Security
-{
- public sealed class GeneratorUtilities
- {
- private GeneratorUtilities()
- {
- }
-
- private static readonly IDictionary kgAlgorithms = Platform.CreateHashtable();
- private static readonly IDictionary kpgAlgorithms = Platform.CreateHashtable();
- private static readonly IDictionary defaultKeySizes = Platform.CreateHashtable();
-
- static GeneratorUtilities()
- {
- //
- // key generators.
- //
- AddKgAlgorithm("AES",
- "AESWRAP");
- AddKgAlgorithm("AES128",
- "2.16.840.1.101.3.4.2",
- NistObjectIdentifiers.IdAes128Cbc,
- NistObjectIdentifiers.IdAes128Cfb,
- NistObjectIdentifiers.IdAes128Ecb,
- NistObjectIdentifiers.IdAes128Ofb,
- NistObjectIdentifiers.IdAes128Wrap);
- AddKgAlgorithm("AES192",
- "2.16.840.1.101.3.4.22",
- NistObjectIdentifiers.IdAes192Cbc,
- NistObjectIdentifiers.IdAes192Cfb,
- NistObjectIdentifiers.IdAes192Ecb,
- NistObjectIdentifiers.IdAes192Ofb,
- NistObjectIdentifiers.IdAes192Wrap);
- AddKgAlgorithm("AES256",
- "2.16.840.1.101.3.4.42",
- NistObjectIdentifiers.IdAes256Cbc,
- NistObjectIdentifiers.IdAes256Cfb,
- NistObjectIdentifiers.IdAes256Ecb,
- NistObjectIdentifiers.IdAes256Ofb,
- NistObjectIdentifiers.IdAes256Wrap);
- AddKgAlgorithm("BLOWFISH",
- "1.3.6.1.4.1.3029.1.2");
- AddKgAlgorithm("CAMELLIA",
- "CAMELLIAWRAP");
- AddKgAlgorithm("CAMELLIA128",
- NttObjectIdentifiers.IdCamellia128Cbc,
- NttObjectIdentifiers.IdCamellia128Wrap);
- AddKgAlgorithm("CAMELLIA192",
- NttObjectIdentifiers.IdCamellia192Cbc,
- NttObjectIdentifiers.IdCamellia192Wrap);
- AddKgAlgorithm("CAMELLIA256",
- NttObjectIdentifiers.IdCamellia256Cbc,
- NttObjectIdentifiers.IdCamellia256Wrap);
- AddKgAlgorithm("CAST5",
- "1.2.840.113533.7.66.10");
- AddKgAlgorithm("CAST6");
- AddKgAlgorithm("DES",
- OiwObjectIdentifiers.DesCbc,
- OiwObjectIdentifiers.DesCfb,
- OiwObjectIdentifiers.DesEcb,
- OiwObjectIdentifiers.DesOfb);
- AddKgAlgorithm("DESEDE",
- "DESEDEWRAP",
- "TDEA",
- OiwObjectIdentifiers.DesEde);
- AddKgAlgorithm("DESEDE3",
- PkcsObjectIdentifiers.DesEde3Cbc,
- PkcsObjectIdentifiers.IdAlgCms3DesWrap);
- AddKgAlgorithm("GOST28147",
- "GOST",
- "GOST-28147",
- CryptoProObjectIdentifiers.GostR28147Cbc);
- AddKgAlgorithm("HC128");
- AddKgAlgorithm("HC256");
- AddKgAlgorithm("IDEA",
- "1.3.6.1.4.1.188.7.1.1.2");
- AddKgAlgorithm("NOEKEON");
- AddKgAlgorithm("RC2",
- PkcsObjectIdentifiers.RC2Cbc,
- PkcsObjectIdentifiers.IdAlgCmsRC2Wrap);
- AddKgAlgorithm("RC4",
- "ARC4",
- "1.2.840.113549.3.4");
- AddKgAlgorithm("RC5",
- "RC5-32");
- AddKgAlgorithm("RC5-64");
- AddKgAlgorithm("RC6");
- AddKgAlgorithm("RIJNDAEL");
- AddKgAlgorithm("SALSA20");
- AddKgAlgorithm("SEED",
- KisaObjectIdentifiers.IdNpkiAppCmsSeedWrap,
- KisaObjectIdentifiers.IdSeedCbc);
- AddKgAlgorithm("SERPENT");
- AddKgAlgorithm("SKIPJACK");
- AddKgAlgorithm("TEA");
- AddKgAlgorithm("THREEFISH-256");
- AddKgAlgorithm("THREEFISH-512");
- AddKgAlgorithm("THREEFISH-1024");
- AddKgAlgorithm("TNEPRES");
- AddKgAlgorithm("TWOFISH");
- AddKgAlgorithm("VMPC");
- AddKgAlgorithm("VMPC-KSA3");
- AddKgAlgorithm("XTEA");
-
- //
- // HMac key generators
- //
- AddHMacKeyGenerator("MD2");
- AddHMacKeyGenerator("MD4");
- AddHMacKeyGenerator("MD5",
- IanaObjectIdentifiers.HmacMD5);
- AddHMacKeyGenerator("SHA1",
- PkcsObjectIdentifiers.IdHmacWithSha1,
- IanaObjectIdentifiers.HmacSha1);
- AddHMacKeyGenerator("SHA224",
- PkcsObjectIdentifiers.IdHmacWithSha224);
- AddHMacKeyGenerator("SHA256",
- PkcsObjectIdentifiers.IdHmacWithSha256);
- AddHMacKeyGenerator("SHA384",
- PkcsObjectIdentifiers.IdHmacWithSha384);
- AddHMacKeyGenerator("SHA512",
- PkcsObjectIdentifiers.IdHmacWithSha512);
- AddHMacKeyGenerator("SHA512/224");
- AddHMacKeyGenerator("SHA512/256");
- AddHMacKeyGenerator("SHA3-224");
- AddHMacKeyGenerator("SHA3-256");
- AddHMacKeyGenerator("SHA3-384");
- AddHMacKeyGenerator("SHA3-512");
- AddHMacKeyGenerator("RIPEMD128");
- AddHMacKeyGenerator("RIPEMD160",
- IanaObjectIdentifiers.HmacRipeMD160);
- AddHMacKeyGenerator("TIGER",
- IanaObjectIdentifiers.HmacTiger);
-
-
-
- //
- // key pair generators.
- //
- AddKpgAlgorithm("DH",
- "DIFFIEHELLMAN");
- AddKpgAlgorithm("DSA");
- AddKpgAlgorithm("EC",
- // TODO Should this be an alias for ECDH?
- X9ObjectIdentifiers.DHSinglePassStdDHSha1KdfScheme);
- AddKpgAlgorithm("ECDH",
- "ECIES");
- AddKpgAlgorithm("ECDHC");
- AddKpgAlgorithm("ECMQV",
- X9ObjectIdentifiers.MqvSinglePassSha1KdfScheme);
- AddKpgAlgorithm("ECDSA");
- AddKpgAlgorithm("ECGOST3410",
- "ECGOST-3410",
- "GOST-3410-2001");
- AddKpgAlgorithm("ELGAMAL");
- AddKpgAlgorithm("GOST3410",
- "GOST-3410",
- "GOST-3410-94");
- AddKpgAlgorithm("RSA",
- "1.2.840.113549.1.1.1");
-
- AddDefaultKeySizeEntries(64, "DES");
- AddDefaultKeySizeEntries(80, "SKIPJACK");
- AddDefaultKeySizeEntries(128, "AES128", "BLOWFISH", "CAMELLIA128", "CAST5", "DESEDE",
- "HC128", "HMACMD2", "HMACMD4", "HMACMD5", "HMACRIPEMD128", "IDEA", "NOEKEON",
- "RC2", "RC4", "RC5", "SALSA20", "SEED", "TEA", "XTEA", "VMPC", "VMPC-KSA3");
- AddDefaultKeySizeEntries(160, "HMACRIPEMD160", "HMACSHA1");
- AddDefaultKeySizeEntries(192, "AES", "AES192", "CAMELLIA192", "DESEDE3", "HMACTIGER",
- "RIJNDAEL", "SERPENT", "TNEPRES");
- AddDefaultKeySizeEntries(224, "HMACSHA224", "HMACSHA512/224");
- AddDefaultKeySizeEntries(256, "AES256", "CAMELLIA", "CAMELLIA256", "CAST6", "GOST28147",
- "HC256", "HMACSHA256", "HMACSHA512/256", "RC5-64", "RC6", "THREEFISH-256", "TWOFISH");
- AddDefaultKeySizeEntries(384, "HMACSHA384");
- AddDefaultKeySizeEntries(512, "HMACSHA512", "THREEFISH-512");
- AddDefaultKeySizeEntries(1024, "THREEFISH-1024");
- }
-
- private static void AddDefaultKeySizeEntries(int size, params string[] algorithms)
- {
- foreach (string algorithm in algorithms)
- {
- defaultKeySizes.Add(algorithm, size);
- }
- }
-
- private static void AddKgAlgorithm(
- string canonicalName,
- params object[] aliases)
- {
- kgAlgorithms[canonicalName] = canonicalName;
-
- foreach (object alias in aliases)
- {
- kgAlgorithms[alias.ToString()] = canonicalName;
- }
- }
-
- private static void AddKpgAlgorithm(
- string canonicalName,
- params object[] aliases)
- {
- kpgAlgorithms[canonicalName] = canonicalName;
-
- foreach (object alias in aliases)
- {
- kpgAlgorithms[alias.ToString()] = canonicalName;
- }
- }
-
- private static void AddHMacKeyGenerator(
- string algorithm,
- params object[] aliases)
- {
- string mainName = "HMAC" + algorithm;
-
- kgAlgorithms[mainName] = mainName;
- kgAlgorithms["HMAC-" + algorithm] = mainName;
- kgAlgorithms["HMAC/" + algorithm] = mainName;
-
- foreach (object alias in aliases)
- {
- kgAlgorithms[alias.ToString()] = mainName;
- }
- }
-
- // TODO Consider making this public
- internal static string GetCanonicalKeyGeneratorAlgorithm(
- string algorithm)
- {
- return (string) kgAlgorithms[Platform.ToUpperInvariant(algorithm)];
- }
-
- // TODO Consider making this public
- internal static string GetCanonicalKeyPairGeneratorAlgorithm(
- string algorithm)
- {
- return (string)kpgAlgorithms[Platform.ToUpperInvariant(algorithm)];
- }
-
- public static CipherKeyGenerator GetKeyGenerator(
- DerObjectIdentifier oid)
- {
- return GetKeyGenerator(oid.Id);
- }
-
- public static CipherKeyGenerator GetKeyGenerator(
- string algorithm)
- {
- string canonicalName = GetCanonicalKeyGeneratorAlgorithm(algorithm);
-
- if (canonicalName == null)
- throw new SecurityUtilityException("KeyGenerator " + algorithm + " not recognised.");
-
- int defaultKeySize = FindDefaultKeySize(canonicalName);
- if (defaultKeySize == -1)
- throw new SecurityUtilityException("KeyGenerator " + algorithm
- + " (" + canonicalName + ") not supported.");
-
- if (canonicalName == "DES")
- return new DesKeyGenerator(defaultKeySize);
-
- if (canonicalName == "DESEDE" || canonicalName == "DESEDE3")
- return new DesEdeKeyGenerator(defaultKeySize);
-
- return new CipherKeyGenerator(defaultKeySize);
- }
-
- public static IAsymmetricCipherKeyPairGenerator GetKeyPairGenerator(
- DerObjectIdentifier oid)
- {
- return GetKeyPairGenerator(oid.Id);
- }
-
- public static IAsymmetricCipherKeyPairGenerator GetKeyPairGenerator(
- string algorithm)
- {
- string canonicalName = GetCanonicalKeyPairGeneratorAlgorithm(algorithm);
-
- if (canonicalName == null)
- throw new SecurityUtilityException("KeyPairGenerator " + algorithm + " not recognised.");
-
- if (canonicalName == "DH")
- return new DHKeyPairGenerator();
-
- if (canonicalName == "DSA")
- return new DsaKeyPairGenerator();
-
- // "EC", "ECDH", "ECDHC", "ECDSA", "ECGOST3410", "ECMQV"
- if (Platform.StartsWith(canonicalName, "EC"))
- return new ECKeyPairGenerator(canonicalName);
-
- if (canonicalName == "ELGAMAL")
- return new ElGamalKeyPairGenerator();
-
- if (canonicalName == "GOST3410")
- return new Gost3410KeyPairGenerator();
-
- if (canonicalName == "RSA")
- return new RsaKeyPairGenerator();
-
- throw new SecurityUtilityException("KeyPairGenerator " + algorithm
- + " (" + canonicalName + ") not supported.");
- }
-
- internal static int GetDefaultKeySize(
- DerObjectIdentifier oid)
- {
- return GetDefaultKeySize(oid.Id);
- }
-
- internal static int GetDefaultKeySize(
- string algorithm)
- {
- string canonicalName = GetCanonicalKeyGeneratorAlgorithm(algorithm);
-
- if (canonicalName == null)
- throw new SecurityUtilityException("KeyGenerator " + algorithm + " not recognised.");
-
- int defaultKeySize = FindDefaultKeySize(canonicalName);
- if (defaultKeySize == -1)
- throw new SecurityUtilityException("KeyGenerator " + algorithm
- + " (" + canonicalName + ") not supported.");
-
- return defaultKeySize;
- }
-
- private static int FindDefaultKeySize(
- string canonicalName)
- {
- if (!defaultKeySizes.Contains(canonicalName))
- return -1;
-
- return (int)defaultKeySizes[canonicalName];
- }
- }
-}
diff --git a/BCCrypto/src/security/InvalidKeyException.cs b/BCCrypto/src/security/InvalidKeyException.cs
deleted file mode 100644
index ebad9e3..0000000
--- a/BCCrypto/src/security/InvalidKeyException.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class InvalidKeyException : KeyException
- {
- public InvalidKeyException() : base() { }
- public InvalidKeyException(string message) : base(message) { }
- public InvalidKeyException(string message, Exception exception) : base(message, exception) { }
- }
-}
diff --git a/BCCrypto/src/security/InvalidParameterException.cs b/BCCrypto/src/security/InvalidParameterException.cs
deleted file mode 100644
index 48172f4..0000000
--- a/BCCrypto/src/security/InvalidParameterException.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class InvalidParameterException : KeyException
- {
- public InvalidParameterException() : base() { }
- public InvalidParameterException(string message) : base(message) { }
- public InvalidParameterException(string message, Exception exception) : base(message, exception) { }
- }
-}
diff --git a/BCCrypto/src/security/KeyException.cs b/BCCrypto/src/security/KeyException.cs
deleted file mode 100644
index e19fa89..0000000
--- a/BCCrypto/src/security/KeyException.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class KeyException : GeneralSecurityException
- {
- public KeyException() : base() { }
- public KeyException(string message) : base(message) { }
- public KeyException(string message, Exception exception) : base(message, exception) { }
- }
-}
diff --git a/BCCrypto/src/security/MacUtilities.cs b/BCCrypto/src/security/MacUtilities.cs
deleted file mode 100644
index c651c62..0000000
--- a/BCCrypto/src/security/MacUtilities.cs
+++ /dev/null
@@ -1,262 +0,0 @@
-using System;
-using System.Collections;
-using System.Globalization;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Iana;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Paddings;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Security
-{
- ///
- /// Utility class for creating HMac object from their names/Oids
- ///
- public sealed class MacUtilities
- {
- private MacUtilities()
- {
- }
-
- private static readonly IDictionary algorithms = Platform.CreateHashtable();
- //private static readonly IDictionary oids = Platform.CreateHashtable();
-
- static MacUtilities()
- {
- algorithms[IanaObjectIdentifiers.HmacMD5.Id] = "HMAC-MD5";
- algorithms[IanaObjectIdentifiers.HmacRipeMD160.Id] = "HMAC-RIPEMD160";
- algorithms[IanaObjectIdentifiers.HmacSha1.Id] = "HMAC-SHA1";
- algorithms[IanaObjectIdentifiers.HmacTiger.Id] = "HMAC-TIGER";
-
- algorithms[PkcsObjectIdentifiers.IdHmacWithSha1.Id] = "HMAC-SHA1";
- algorithms[PkcsObjectIdentifiers.IdHmacWithSha224.Id] = "HMAC-SHA224";
- algorithms[PkcsObjectIdentifiers.IdHmacWithSha256.Id] = "HMAC-SHA256";
- algorithms[PkcsObjectIdentifiers.IdHmacWithSha384.Id] = "HMAC-SHA384";
- algorithms[PkcsObjectIdentifiers.IdHmacWithSha512.Id] = "HMAC-SHA512";
-
- // TODO AESMAC?
-
- algorithms["DES"] = "DESMAC";
- algorithms["DES/CFB8"] = "DESMAC/CFB8";
- algorithms["DES64"] = "DESMAC64";
- algorithms["DESEDE"] = "DESEDEMAC";
- algorithms[PkcsObjectIdentifiers.DesEde3Cbc.Id] = "DESEDEMAC";
- algorithms["DESEDE/CFB8"] = "DESEDEMAC/CFB8";
- algorithms["DESISO9797MAC"] = "DESWITHISO9797";
- algorithms["DESEDE64"] = "DESEDEMAC64";
-
- algorithms["DESEDE64WITHISO7816-4PADDING"] = "DESEDEMAC64WITHISO7816-4PADDING";
- algorithms["DESEDEISO9797ALG1MACWITHISO7816-4PADDING"] = "DESEDEMAC64WITHISO7816-4PADDING";
- algorithms["DESEDEISO9797ALG1WITHISO7816-4PADDING"] = "DESEDEMAC64WITHISO7816-4PADDING";
-
- algorithms["ISO9797ALG3"] = "ISO9797ALG3MAC";
- algorithms["ISO9797ALG3MACWITHISO7816-4PADDING"] = "ISO9797ALG3WITHISO7816-4PADDING";
-
- algorithms["SKIPJACK"] = "SKIPJACKMAC";
- algorithms["SKIPJACK/CFB8"] = "SKIPJACKMAC/CFB8";
- algorithms["IDEA"] = "IDEAMAC";
- algorithms["IDEA/CFB8"] = "IDEAMAC/CFB8";
- algorithms["RC2"] = "RC2MAC";
- algorithms["RC2/CFB8"] = "RC2MAC/CFB8";
- algorithms["RC5"] = "RC5MAC";
- algorithms["RC5/CFB8"] = "RC5MAC/CFB8";
- algorithms["GOST28147"] = "GOST28147MAC";
- algorithms["VMPC"] = "VMPCMAC";
- algorithms["VMPC-MAC"] = "VMPCMAC";
- algorithms["SIPHASH"] = "SIPHASH-2-4";
-
- algorithms["PBEWITHHMACSHA"] = "PBEWITHHMACSHA1";
- algorithms["1.3.14.3.2.26"] = "PBEWITHHMACSHA1";
- }
-
-// ///
-// /// Returns a ObjectIdentifier for a given digest mechanism.
-// ///
-// /// A string representation of the digest meanism.
-// /// A DerObjectIdentifier, null if the Oid is not available.
-// public static DerObjectIdentifier GetObjectIdentifier(
-// string mechanism)
-// {
-// mechanism = (string) algorithms[Platform.ToUpperInvariant(mechanism)];
-//
-// if (mechanism != null)
-// {
-// return (DerObjectIdentifier)oids[mechanism];
-// }
-//
-// return null;
-// }
-
-// public static ICollection Algorithms
-// {
-// get { return oids.Keys; }
-// }
-
- public static IMac GetMac(
- DerObjectIdentifier id)
- {
- return GetMac(id.Id);
- }
-
- public static IMac GetMac(
- string algorithm)
- {
- string upper = Platform.ToUpperInvariant(algorithm);
-
- string mechanism = (string) algorithms[upper];
-
- if (mechanism == null)
- {
- mechanism = upper;
- }
-
- if (Platform.StartsWith(mechanism, "PBEWITH"))
- {
- mechanism = mechanism.Substring("PBEWITH".Length);
- }
-
- if (Platform.StartsWith(mechanism, "HMAC"))
- {
- string digestName;
- if (Platform.StartsWith(mechanism, "HMAC-") || Platform.StartsWith(mechanism, "HMAC/"))
- {
- digestName = mechanism.Substring(5);
- }
- else
- {
- digestName = mechanism.Substring(4);
- }
-
- return new HMac(DigestUtilities.GetDigest(digestName));
- }
-
- if (mechanism == "AESCMAC")
- {
- return new CMac(new AesEngine());
- }
- if (mechanism == "DESMAC")
- {
- return new CbcBlockCipherMac(new DesEngine());
- }
- if (mechanism == "DESMAC/CFB8")
- {
- return new CfbBlockCipherMac(new DesEngine());
- }
- if (mechanism == "DESMAC64")
- {
- return new CbcBlockCipherMac(new DesEngine(), 64);
- }
- if (mechanism == "DESEDECMAC")
- {
- return new CMac(new DesEdeEngine());
- }
- if (mechanism == "DESEDEMAC")
- {
- return new CbcBlockCipherMac(new DesEdeEngine());
- }
- if (mechanism == "DESEDEMAC/CFB8")
- {
- return new CfbBlockCipherMac(new DesEdeEngine());
- }
- if (mechanism == "DESEDEMAC64")
- {
- return new CbcBlockCipherMac(new DesEdeEngine(), 64);
- }
- if (mechanism == "DESEDEMAC64WITHISO7816-4PADDING")
- {
- return new CbcBlockCipherMac(new DesEdeEngine(), 64, new ISO7816d4Padding());
- }
- if (mechanism == "DESWITHISO9797"
- || mechanism == "ISO9797ALG3MAC")
- {
- return new ISO9797Alg3Mac(new DesEngine());
- }
- if (mechanism == "ISO9797ALG3WITHISO7816-4PADDING")
- {
- return new ISO9797Alg3Mac(new DesEngine(), new ISO7816d4Padding());
- }
- if (mechanism == "SKIPJACKMAC")
- {
- return new CbcBlockCipherMac(new SkipjackEngine());
- }
- if (mechanism == "SKIPJACKMAC/CFB8")
- {
- return new CfbBlockCipherMac(new SkipjackEngine());
- }
- if (mechanism == "IDEAMAC")
- {
- return new CbcBlockCipherMac(new IdeaEngine());
- }
- if (mechanism == "IDEAMAC/CFB8")
- {
- return new CfbBlockCipherMac(new IdeaEngine());
- }
- if (mechanism == "RC2MAC")
- {
- return new CbcBlockCipherMac(new RC2Engine());
- }
- if (mechanism == "RC2MAC/CFB8")
- {
- return new CfbBlockCipherMac(new RC2Engine());
- }
- if (mechanism == "RC5MAC")
- {
- return new CbcBlockCipherMac(new RC532Engine());
- }
- if (mechanism == "RC5MAC/CFB8")
- {
- return new CfbBlockCipherMac(new RC532Engine());
- }
- if (mechanism == "GOST28147MAC")
- {
- return new Gost28147Mac();
- }
- if (mechanism == "VMPCMAC")
- {
- return new VmpcMac();
- }
- if (mechanism == "SIPHASH-2-4")
- {
- return new SipHash();
- }
- throw new SecurityUtilityException("Mac " + mechanism + " not recognised.");
- }
-
- public static string GetAlgorithmName(
- DerObjectIdentifier oid)
- {
- return (string) algorithms[oid.Id];
- }
-
- public static byte[] CalculateMac(string algorithm, ICipherParameters cp, byte[] input)
- {
- IMac mac = GetMac(algorithm);
- mac.Init(cp);
- mac.BlockUpdate(input, 0, input.Length);
- return DoFinal(mac);
- }
-
- public static byte[] DoFinal(IMac mac)
- {
- byte[] b = new byte[mac.GetMacSize()];
- mac.DoFinal(b, 0);
- return b;
- }
-
- public static int DoFinalOut(IMac mac, byte[] outBuffer)
- {
- mac.DoFinal(outBuffer, 0);
- return mac.GetMacSize();
- }
-
- public static byte[] DoFinal(IMac mac, byte[] input)
- {
- mac.BlockUpdate(input, 0, input.Length);
- return DoFinal(mac);
- }
- }
-}
diff --git a/BCCrypto/src/security/NoSuchAlgorithmException.cs b/BCCrypto/src/security/NoSuchAlgorithmException.cs
deleted file mode 100644
index c56ec65..0000000
--- a/BCCrypto/src/security/NoSuchAlgorithmException.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security
-{
- [Obsolete("Never thrown")]
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class NoSuchAlgorithmException : GeneralSecurityException
- {
- public NoSuchAlgorithmException() : base() {}
- public NoSuchAlgorithmException(string message) : base(message) {}
- public NoSuchAlgorithmException(string message, Exception exception) : base(message, exception) {}
- }
-}
diff --git a/BCCrypto/src/security/ParameterUtilities.cs b/BCCrypto/src/security/ParameterUtilities.cs
deleted file mode 100644
index c121558..0000000
--- a/BCCrypto/src/security/ParameterUtilities.cs
+++ /dev/null
@@ -1,325 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Kisa;
-using Org.BouncyCastle.Asn1.Misc;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Ntt;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Security
-{
- public sealed class ParameterUtilities
- {
- private ParameterUtilities()
- {
- }
-
- private static readonly IDictionary algorithms = Platform.CreateHashtable();
- private static readonly IDictionary basicIVSizes = Platform.CreateHashtable();
-
- static ParameterUtilities()
- {
- AddAlgorithm("AES",
- "AESWRAP");
- AddAlgorithm("AES128",
- "2.16.840.1.101.3.4.2",
- NistObjectIdentifiers.IdAes128Cbc,
- NistObjectIdentifiers.IdAes128Cfb,
- NistObjectIdentifiers.IdAes128Ecb,
- NistObjectIdentifiers.IdAes128Ofb,
- NistObjectIdentifiers.IdAes128Wrap);
- AddAlgorithm("AES192",
- "2.16.840.1.101.3.4.22",
- NistObjectIdentifiers.IdAes192Cbc,
- NistObjectIdentifiers.IdAes192Cfb,
- NistObjectIdentifiers.IdAes192Ecb,
- NistObjectIdentifiers.IdAes192Ofb,
- NistObjectIdentifiers.IdAes192Wrap);
- AddAlgorithm("AES256",
- "2.16.840.1.101.3.4.42",
- NistObjectIdentifiers.IdAes256Cbc,
- NistObjectIdentifiers.IdAes256Cfb,
- NistObjectIdentifiers.IdAes256Ecb,
- NistObjectIdentifiers.IdAes256Ofb,
- NistObjectIdentifiers.IdAes256Wrap);
- AddAlgorithm("BLOWFISH",
- "1.3.6.1.4.1.3029.1.2");
- AddAlgorithm("CAMELLIA",
- "CAMELLIAWRAP");
- AddAlgorithm("CAMELLIA128",
- NttObjectIdentifiers.IdCamellia128Cbc,
- NttObjectIdentifiers.IdCamellia128Wrap);
- AddAlgorithm("CAMELLIA192",
- NttObjectIdentifiers.IdCamellia192Cbc,
- NttObjectIdentifiers.IdCamellia192Wrap);
- AddAlgorithm("CAMELLIA256",
- NttObjectIdentifiers.IdCamellia256Cbc,
- NttObjectIdentifiers.IdCamellia256Wrap);
- AddAlgorithm("CAST5",
- "1.2.840.113533.7.66.10");
- AddAlgorithm("CAST6");
- AddAlgorithm("DES",
- OiwObjectIdentifiers.DesCbc,
- OiwObjectIdentifiers.DesCfb,
- OiwObjectIdentifiers.DesEcb,
- OiwObjectIdentifiers.DesOfb);
- AddAlgorithm("DESEDE",
- "DESEDEWRAP",
- "TDEA",
- OiwObjectIdentifiers.DesEde,
- PkcsObjectIdentifiers.IdAlgCms3DesWrap);
- AddAlgorithm("DESEDE3",
- PkcsObjectIdentifiers.DesEde3Cbc);
- AddAlgorithm("GOST28147",
- "GOST",
- "GOST-28147",
- CryptoProObjectIdentifiers.GostR28147Cbc);
- AddAlgorithm("HC128");
- AddAlgorithm("HC256");
- AddAlgorithm("IDEA",
- "1.3.6.1.4.1.188.7.1.1.2");
- AddAlgorithm("NOEKEON");
- AddAlgorithm("RC2",
- PkcsObjectIdentifiers.RC2Cbc,
- PkcsObjectIdentifiers.IdAlgCmsRC2Wrap);
- AddAlgorithm("RC4",
- "ARC4",
- "1.2.840.113549.3.4");
- AddAlgorithm("RC5",
- "RC5-32");
- AddAlgorithm("RC5-64");
- AddAlgorithm("RC6");
- AddAlgorithm("RIJNDAEL");
- AddAlgorithm("SALSA20");
- AddAlgorithm("SEED",
- KisaObjectIdentifiers.IdNpkiAppCmsSeedWrap,
- KisaObjectIdentifiers.IdSeedCbc);
- AddAlgorithm("SERPENT");
- AddAlgorithm("SKIPJACK");
- AddAlgorithm("TEA");
- AddAlgorithm("THREEFISH-256");
- AddAlgorithm("THREEFISH-512");
- AddAlgorithm("THREEFISH-1024");
- AddAlgorithm("TNEPRES");
- AddAlgorithm("TWOFISH");
- AddAlgorithm("VMPC");
- AddAlgorithm("VMPC-KSA3");
- AddAlgorithm("XTEA");
-
- AddBasicIVSizeEntries(8, "BLOWFISH", "DES", "DESEDE", "DESEDE3");
- AddBasicIVSizeEntries(16, "AES", "AES128", "AES192", "AES256",
- "CAMELLIA", "CAMELLIA128", "CAMELLIA192", "CAMELLIA256", "NOEKEON", "SEED");
-
- // TODO These algorithms support an IV
- // but JCE doesn't seem to provide an AlgorithmParametersGenerator for them
- // "RIJNDAEL", "SKIPJACK", "TWOFISH"
- }
-
- private static void AddAlgorithm(
- string canonicalName,
- params object[] aliases)
- {
- algorithms[canonicalName] = canonicalName;
-
- foreach (object alias in aliases)
- {
- algorithms[alias.ToString()] = canonicalName;
- }
- }
-
- private static void AddBasicIVSizeEntries(int size, params string[] algorithms)
- {
- foreach (string algorithm in algorithms)
- {
- basicIVSizes.Add(algorithm, size);
- }
- }
-
- public static string GetCanonicalAlgorithmName(
- string algorithm)
- {
- return (string) algorithms[Platform.ToUpperInvariant(algorithm)];
- }
-
- public static KeyParameter CreateKeyParameter(
- DerObjectIdentifier algOid,
- byte[] keyBytes)
- {
- return CreateKeyParameter(algOid.Id, keyBytes, 0, keyBytes.Length);
- }
-
- public static KeyParameter CreateKeyParameter(
- string algorithm,
- byte[] keyBytes)
- {
- return CreateKeyParameter(algorithm, keyBytes, 0, keyBytes.Length);
- }
-
- public static KeyParameter CreateKeyParameter(
- DerObjectIdentifier algOid,
- byte[] keyBytes,
- int offset,
- int length)
- {
- return CreateKeyParameter(algOid.Id, keyBytes, offset, length);
- }
-
- public static KeyParameter CreateKeyParameter(
- string algorithm,
- byte[] keyBytes,
- int offset,
- int length)
- {
- if (algorithm == null)
- throw new ArgumentNullException("algorithm");
-
- string canonical = GetCanonicalAlgorithmName(algorithm);
-
- if (canonical == null)
- throw new SecurityUtilityException("Algorithm " + algorithm + " not recognised.");
-
- if (canonical == "DES")
- return new DesParameters(keyBytes, offset, length);
-
- if (canonical == "DESEDE" || canonical =="DESEDE3")
- return new DesEdeParameters(keyBytes, offset, length);
-
- if (canonical == "RC2")
- return new RC2Parameters(keyBytes, offset, length);
-
- return new KeyParameter(keyBytes, offset, length);
- }
-
- public static ICipherParameters GetCipherParameters(
- DerObjectIdentifier algOid,
- ICipherParameters key,
- Asn1Object asn1Params)
- {
- return GetCipherParameters(algOid.Id, key, asn1Params);
- }
-
- public static ICipherParameters GetCipherParameters(
- string algorithm,
- ICipherParameters key,
- Asn1Object asn1Params)
- {
- if (algorithm == null)
- throw new ArgumentNullException("algorithm");
-
- string canonical = GetCanonicalAlgorithmName(algorithm);
-
- if (canonical == null)
- throw new SecurityUtilityException("Algorithm " + algorithm + " not recognised.");
-
- byte[] iv = null;
-
- try
- {
- // TODO These algorithms support an IV
- // but JCE doesn't seem to provide an AlgorithmParametersGenerator for them
- // "RIJNDAEL", "SKIPJACK", "TWOFISH"
-
- int basicIVKeySize = FindBasicIVSize(canonical);
- if (basicIVKeySize != -1
- || canonical == "RIJNDAEL" || canonical == "SKIPJACK" || canonical == "TWOFISH")
- {
- iv = ((Asn1OctetString) asn1Params).GetOctets();
- }
- else if (canonical == "CAST5")
- {
- iv = Cast5CbcParameters.GetInstance(asn1Params).GetIV();
- }
- else if (canonical == "IDEA")
- {
- iv = IdeaCbcPar.GetInstance(asn1Params).GetIV();
- }
- else if (canonical == "RC2")
- {
- iv = RC2CbcParameter.GetInstance(asn1Params).GetIV();
- }
- }
- catch (Exception e)
- {
- throw new ArgumentException("Could not process ASN.1 parameters", e);
- }
-
- if (iv != null)
- {
- return new ParametersWithIV(key, iv);
- }
-
- throw new SecurityUtilityException("Algorithm " + algorithm + " not recognised.");
- }
-
- public static Asn1Encodable GenerateParameters(
- DerObjectIdentifier algID,
- SecureRandom random)
- {
- return GenerateParameters(algID.Id, random);
- }
-
- public static Asn1Encodable GenerateParameters(
- string algorithm,
- SecureRandom random)
- {
- if (algorithm == null)
- throw new ArgumentNullException("algorithm");
-
- string canonical = GetCanonicalAlgorithmName(algorithm);
-
- if (canonical == null)
- throw new SecurityUtilityException("Algorithm " + algorithm + " not recognised.");
-
- // TODO These algorithms support an IV
- // but JCE doesn't seem to provide an AlgorithmParametersGenerator for them
- // "RIJNDAEL", "SKIPJACK", "TWOFISH"
-
- int basicIVKeySize = FindBasicIVSize(canonical);
- if (basicIVKeySize != -1)
- return CreateIVOctetString(random, basicIVKeySize);
-
- if (canonical == "CAST5")
- return new Cast5CbcParameters(CreateIV(random, 8), 128);
-
- if (canonical == "IDEA")
- return new IdeaCbcPar(CreateIV(random, 8));
-
- if (canonical == "RC2")
- return new RC2CbcParameter(CreateIV(random, 8));
-
- throw new SecurityUtilityException("Algorithm " + algorithm + " not recognised.");
- }
-
- private static Asn1OctetString CreateIVOctetString(
- SecureRandom random,
- int ivLength)
- {
- return new DerOctetString(CreateIV(random, ivLength));
- }
-
- private static byte[] CreateIV(
- SecureRandom random,
- int ivLength)
- {
- byte[] iv = new byte[ivLength];
- random.NextBytes(iv);
- return iv;
- }
-
- private static int FindBasicIVSize(
- string canonicalName)
- {
- if (!basicIVSizes.Contains(canonicalName))
- return -1;
-
- return (int)basicIVSizes[canonicalName];
- }
- }
-}
diff --git a/BCCrypto/src/security/PbeUtilities.cs b/BCCrypto/src/security/PbeUtilities.cs
deleted file mode 100644
index 33f31e5..0000000
--- a/BCCrypto/src/security/PbeUtilities.cs
+++ /dev/null
@@ -1,663 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.BC;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Macs;
-using Org.BouncyCastle.Crypto.Modes;
-using Org.BouncyCastle.Crypto.Paddings;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Security
-{
- ///
- ///
- ///
- public sealed class PbeUtilities
- {
- private PbeUtilities()
- {
- }
-
- const string Pkcs5S1 = "Pkcs5S1";
- const string Pkcs5S2 = "Pkcs5S2";
- const string Pkcs12 = "Pkcs12";
- const string OpenSsl = "OpenSsl";
-
- private static readonly IDictionary algorithms = Platform.CreateHashtable();
- private static readonly IDictionary algorithmType = Platform.CreateHashtable();
- private static readonly IDictionary oids = Platform.CreateHashtable();
-
- static PbeUtilities()
- {
- algorithms["PKCS5SCHEME1"] = "Pkcs5scheme1";
- algorithms["PKCS5SCHEME2"] = "Pkcs5scheme2";
- algorithms[PkcsObjectIdentifiers.IdPbeS2.Id] = "Pkcs5scheme2";
-// algorithms[PkcsObjectIdentifiers.IdPbkdf2.Id] = "Pkcs5scheme2";
-
- // FIXME Add support for these? (see Pkcs8Generator)
-// algorithms[PkcsObjectIdentifiers.DesEde3Cbc.Id] = "Pkcs5scheme2";
-// algorithms[NistObjectIdentifiers.IdAes128Cbc.Id] = "Pkcs5scheme2";
-// algorithms[NistObjectIdentifiers.IdAes192Cbc.Id] = "Pkcs5scheme2";
-// algorithms[NistObjectIdentifiers.IdAes256Cbc.Id] = "Pkcs5scheme2";
-
- algorithms["PBEWITHMD2ANDDES-CBC"] = "PBEwithMD2andDES-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithMD2AndDesCbc.Id] = "PBEwithMD2andDES-CBC";
- algorithms["PBEWITHMD2ANDRC2-CBC"] = "PBEwithMD2andRC2-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithMD2AndRC2Cbc.Id] = "PBEwithMD2andRC2-CBC";
- algorithms["PBEWITHMD5ANDDES-CBC"] = "PBEwithMD5andDES-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithMD5AndDesCbc.Id] = "PBEwithMD5andDES-CBC";
- algorithms["PBEWITHMD5ANDRC2-CBC"] = "PBEwithMD5andRC2-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithMD5AndRC2Cbc.Id] = "PBEwithMD5andRC2-CBC";
- algorithms["PBEWITHSHA1ANDDES"] = "PBEwithSHA-1andDES-CBC";
- algorithms["PBEWITHSHA-1ANDDES"] = "PBEwithSHA-1andDES-CBC";
- algorithms["PBEWITHSHA1ANDDES-CBC"] = "PBEwithSHA-1andDES-CBC";
- algorithms["PBEWITHSHA-1ANDDES-CBC"] = "PBEwithSHA-1andDES-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithSha1AndDesCbc.Id] = "PBEwithSHA-1andDES-CBC";
- algorithms["PBEWITHSHA1ANDRC2"] = "PBEwithSHA-1andRC2-CBC";
- algorithms["PBEWITHSHA-1ANDRC2"] = "PBEwithSHA-1andRC2-CBC";
- algorithms["PBEWITHSHA1ANDRC2-CBC"] = "PBEwithSHA-1andRC2-CBC";
- algorithms["PBEWITHSHA-1ANDRC2-CBC"] = "PBEwithSHA-1andRC2-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithSha1AndRC2Cbc.Id] = "PBEwithSHA-1andRC2-CBC";
- algorithms["PKCS12"] = "Pkcs12";
- algorithms[BCObjectIdentifiers.bc_pbe_sha1_pkcs12_aes128_cbc.Id] = "PBEwithSHA-1and128bitAES-CBC-BC";
- algorithms[BCObjectIdentifiers.bc_pbe_sha1_pkcs12_aes192_cbc.Id] = "PBEwithSHA-1and192bitAES-CBC-BC";
- algorithms[BCObjectIdentifiers.bc_pbe_sha1_pkcs12_aes256_cbc.Id] = "PBEwithSHA-1and256bitAES-CBC-BC";
- algorithms[BCObjectIdentifiers.bc_pbe_sha256_pkcs12_aes128_cbc.Id] = "PBEwithSHA-256and128bitAES-CBC-BC";
- algorithms[BCObjectIdentifiers.bc_pbe_sha256_pkcs12_aes192_cbc.Id] = "PBEwithSHA-256and192bitAES-CBC-BC";
- algorithms[BCObjectIdentifiers.bc_pbe_sha256_pkcs12_aes256_cbc.Id] = "PBEwithSHA-256and256bitAES-CBC-BC";
- algorithms["PBEWITHSHAAND128BITRC4"] = "PBEwithSHA-1and128bitRC4";
- algorithms["PBEWITHSHA1AND128BITRC4"] = "PBEwithSHA-1and128bitRC4";
- algorithms["PBEWITHSHA-1AND128BITRC4"] = "PBEwithSHA-1and128bitRC4";
- algorithms[PkcsObjectIdentifiers.PbeWithShaAnd128BitRC4.Id] = "PBEwithSHA-1and128bitRC4";
- algorithms["PBEWITHSHAAND40BITRC4"] = "PBEwithSHA-1and40bitRC4";
- algorithms["PBEWITHSHA1AND40BITRC4"] = "PBEwithSHA-1and40bitRC4";
- algorithms["PBEWITHSHA-1AND40BITRC4"] = "PBEwithSHA-1and40bitRC4";
- algorithms[PkcsObjectIdentifiers.PbeWithShaAnd40BitRC4.Id] = "PBEwithSHA-1and40bitRC4";
- algorithms["PBEWITHSHAAND3-KEYDESEDE-CBC"] = "PBEwithSHA-1and3-keyDESEDE-CBC";
- algorithms["PBEWITHSHAAND3-KEYTRIPLEDES-CBC"] = "PBEwithSHA-1and3-keyDESEDE-CBC";
- algorithms["PBEWITHSHA1AND3-KEYDESEDE-CBC"] = "PBEwithSHA-1and3-keyDESEDE-CBC";
- algorithms["PBEWITHSHA1AND3-KEYTRIPLEDES-CBC"] = "PBEwithSHA-1and3-keyDESEDE-CBC";
- algorithms["PBEWITHSHA-1AND3-KEYDESEDE-CBC"] = "PBEwithSHA-1and3-keyDESEDE-CBC";
- algorithms["PBEWITHSHA-1AND3-KEYTRIPLEDES-CBC"] = "PBEwithSHA-1and3-keyDESEDE-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithShaAnd3KeyTripleDesCbc.Id] = "PBEwithSHA-1and3-keyDESEDE-CBC";
- algorithms["PBEWITHSHAAND2-KEYDESEDE-CBC"] = "PBEwithSHA-1and2-keyDESEDE-CBC";
- algorithms["PBEWITHSHAAND2-KEYTRIPLEDES-CBC"] = "PBEwithSHA-1and2-keyDESEDE-CBC";
- algorithms["PBEWITHSHA1AND2-KEYDESEDE-CBC"] = "PBEwithSHA-1and2-keyDESEDE-CBC";
- algorithms["PBEWITHSHA1AND2-KEYTRIPLEDES-CBC"] = "PBEwithSHA-1and2-keyDESEDE-CBC";
- algorithms["PBEWITHSHA-1AND2-KEYDESEDE-CBC"] = "PBEwithSHA-1and2-keyDESEDE-CBC";
- algorithms["PBEWITHSHA-1AND2-KEYTRIPLEDES-CBC"] = "PBEwithSHA-1and2-keyDESEDE-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithShaAnd2KeyTripleDesCbc.Id] = "PBEwithSHA-1and2-keyDESEDE-CBC";
- algorithms["PBEWITHSHAAND128BITRC2-CBC"] = "PBEwithSHA-1and128bitRC2-CBC";
- algorithms["PBEWITHSHA1AND128BITRC2-CBC"] = "PBEwithSHA-1and128bitRC2-CBC";
- algorithms["PBEWITHSHA-1AND128BITRC2-CBC"] = "PBEwithSHA-1and128bitRC2-CBC";
- algorithms[PkcsObjectIdentifiers.PbeWithShaAnd128BitRC2Cbc.Id] = "PBEwithSHA-1and128bitRC2-CBC";
- algorithms["PBEWITHSHAAND40BITRC2-CBC"] = "PBEwithSHA-1and40bitRC2-CBC";
- algorithms["PBEWITHSHA1AND40BITRC2-CBC"] = "PBEwithSHA-1and40bitRC2-CBC";
- algorithms["PBEWITHSHA-1AND40BITRC2-CBC"] = "PBEwithSHA-1and40bitRC2-CBC";
- algorithms[PkcsObjectIdentifiers.PbewithShaAnd40BitRC2Cbc.Id] = "PBEwithSHA-1and40bitRC2-CBC";
- algorithms["PBEWITHSHAAND128BITAES-CBC-BC"] = "PBEwithSHA-1and128bitAES-CBC-BC";
- algorithms["PBEWITHSHA1AND128BITAES-CBC-BC"] = "PBEwithSHA-1and128bitAES-CBC-BC";
- algorithms["PBEWITHSHA-1AND128BITAES-CBC-BC"] = "PBEwithSHA-1and128bitAES-CBC-BC";
- algorithms["PBEWITHSHAAND192BITAES-CBC-BC"] = "PBEwithSHA-1and192bitAES-CBC-BC";
- algorithms["PBEWITHSHA1AND192BITAES-CBC-BC"] = "PBEwithSHA-1and192bitAES-CBC-BC";
- algorithms["PBEWITHSHA-1AND192BITAES-CBC-BC"] = "PBEwithSHA-1and192bitAES-CBC-BC";
- algorithms["PBEWITHSHAAND256BITAES-CBC-BC"] = "PBEwithSHA-1and256bitAES-CBC-BC";
- algorithms["PBEWITHSHA1AND256BITAES-CBC-BC"] = "PBEwithSHA-1and256bitAES-CBC-BC";
- algorithms["PBEWITHSHA-1AND256BITAES-CBC-BC"] = "PBEwithSHA-1and256bitAES-CBC-BC";
- algorithms["PBEWITHSHA256AND128BITAES-CBC-BC"] = "PBEwithSHA-256and128bitAES-CBC-BC";
- algorithms["PBEWITHSHA-256AND128BITAES-CBC-BC"] = "PBEwithSHA-256and128bitAES-CBC-BC";
- algorithms["PBEWITHSHA256AND192BITAES-CBC-BC"] = "PBEwithSHA-256and192bitAES-CBC-BC";
- algorithms["PBEWITHSHA-256AND192BITAES-CBC-BC"] = "PBEwithSHA-256and192bitAES-CBC-BC";
- algorithms["PBEWITHSHA256AND256BITAES-CBC-BC"] = "PBEwithSHA-256and256bitAES-CBC-BC";
- algorithms["PBEWITHSHA-256AND256BITAES-CBC-BC"] = "PBEwithSHA-256and256bitAES-CBC-BC";
- algorithms["PBEWITHSHAANDIDEA"] = "PBEwithSHA-1andIDEA-CBC";
- algorithms["PBEWITHSHAANDIDEA-CBC"] = "PBEwithSHA-1andIDEA-CBC";
- algorithms["PBEWITHSHAANDTWOFISH"] = "PBEwithSHA-1andTWOFISH-CBC";
- algorithms["PBEWITHSHAANDTWOFISH-CBC"] = "PBEwithSHA-1andTWOFISH-CBC";
- algorithms["PBEWITHHMACSHA1"] = "PBEwithHmacSHA-1";
- algorithms["PBEWITHHMACSHA-1"] = "PBEwithHmacSHA-1";
- algorithms[OiwObjectIdentifiers.IdSha1.Id] = "PBEwithHmacSHA-1";
- algorithms["PBEWITHHMACSHA224"] = "PBEwithHmacSHA-224";
- algorithms["PBEWITHHMACSHA-224"] = "PBEwithHmacSHA-224";
- algorithms[NistObjectIdentifiers.IdSha224.Id] = "PBEwithHmacSHA-224";
- algorithms["PBEWITHHMACSHA256"] = "PBEwithHmacSHA-256";
- algorithms["PBEWITHHMACSHA-256"] = "PBEwithHmacSHA-256";
- algorithms[NistObjectIdentifiers.IdSha256.Id] = "PBEwithHmacSHA-256";
- algorithms["PBEWITHHMACRIPEMD128"] = "PBEwithHmacRipeMD128";
- algorithms[TeleTrusTObjectIdentifiers.RipeMD128.Id] = "PBEwithHmacRipeMD128";
- algorithms["PBEWITHHMACRIPEMD160"] = "PBEwithHmacRipeMD160";
- algorithms[TeleTrusTObjectIdentifiers.RipeMD160.Id] = "PBEwithHmacRipeMD160";
- algorithms["PBEWITHHMACRIPEMD256"] = "PBEwithHmacRipeMD256";
- algorithms[TeleTrusTObjectIdentifiers.RipeMD256.Id] = "PBEwithHmacRipeMD256";
- algorithms["PBEWITHHMACTIGER"] = "PBEwithHmacTiger";
-
- algorithms["PBEWITHMD5AND128BITAES-CBC-OPENSSL"] = "PBEwithMD5and128bitAES-CBC-OpenSSL";
- algorithms["PBEWITHMD5AND192BITAES-CBC-OPENSSL"] = "PBEwithMD5and192bitAES-CBC-OpenSSL";
- algorithms["PBEWITHMD5AND256BITAES-CBC-OPENSSL"] = "PBEwithMD5and256bitAES-CBC-OpenSSL";
-
- algorithmType["Pkcs5scheme1"] = Pkcs5S1;
- algorithmType["Pkcs5scheme2"] = Pkcs5S2;
- algorithmType["PBEwithMD2andDES-CBC"] = Pkcs5S1;
- algorithmType["PBEwithMD2andRC2-CBC"] = Pkcs5S1;
- algorithmType["PBEwithMD5andDES-CBC"] = Pkcs5S1;
- algorithmType["PBEwithMD5andRC2-CBC"] = Pkcs5S1;
- algorithmType["PBEwithSHA-1andDES-CBC"] = Pkcs5S1;
- algorithmType["PBEwithSHA-1andRC2-CBC"] = Pkcs5S1;
- algorithmType["Pkcs12"] = Pkcs12;
- algorithmType["PBEwithSHA-1and128bitRC4"] = Pkcs12;
- algorithmType["PBEwithSHA-1and40bitRC4"] = Pkcs12;
- algorithmType["PBEwithSHA-1and3-keyDESEDE-CBC"] = Pkcs12;
- algorithmType["PBEwithSHA-1and2-keyDESEDE-CBC"] = Pkcs12;
- algorithmType["PBEwithSHA-1and128bitRC2-CBC"] = Pkcs12;
- algorithmType["PBEwithSHA-1and40bitRC2-CBC"] = Pkcs12;
- algorithmType["PBEwithSHA-1and128bitAES-CBC-BC"] = Pkcs12;
- algorithmType["PBEwithSHA-1and192bitAES-CBC-BC"] = Pkcs12;
- algorithmType["PBEwithSHA-1and256bitAES-CBC-BC"] = Pkcs12;
- algorithmType["PBEwithSHA-256and128bitAES-CBC-BC"] = Pkcs12;
- algorithmType["PBEwithSHA-256and192bitAES-CBC-BC"] = Pkcs12;
- algorithmType["PBEwithSHA-256and256bitAES-CBC-BC"] = Pkcs12;
- algorithmType["PBEwithSHA-1andIDEA-CBC"] = Pkcs12;
- algorithmType["PBEwithSHA-1andTWOFISH-CBC"] = Pkcs12;
- algorithmType["PBEwithHmacSHA-1"] = Pkcs12;
- algorithmType["PBEwithHmacSHA-224"] = Pkcs12;
- algorithmType["PBEwithHmacSHA-256"] = Pkcs12;
- algorithmType["PBEwithHmacRipeMD128"] = Pkcs12;
- algorithmType["PBEwithHmacRipeMD160"] = Pkcs12;
- algorithmType["PBEwithHmacRipeMD256"] = Pkcs12;
- algorithmType["PBEwithHmacTiger"] = Pkcs12;
-
- algorithmType["PBEwithMD5and128bitAES-CBC-OpenSSL"] = OpenSsl;
- algorithmType["PBEwithMD5and192bitAES-CBC-OpenSSL"] = OpenSsl;
- algorithmType["PBEwithMD5and256bitAES-CBC-OpenSSL"] = OpenSsl;
-
- oids["PBEwithMD2andDES-CBC"] = PkcsObjectIdentifiers.PbeWithMD2AndDesCbc;
- oids["PBEwithMD2andRC2-CBC"] = PkcsObjectIdentifiers.PbeWithMD2AndRC2Cbc;
- oids["PBEwithMD5andDES-CBC"] = PkcsObjectIdentifiers.PbeWithMD5AndDesCbc;
- oids["PBEwithMD5andRC2-CBC"] = PkcsObjectIdentifiers.PbeWithMD5AndRC2Cbc;
- oids["PBEwithSHA-1andDES-CBC"] = PkcsObjectIdentifiers.PbeWithSha1AndDesCbc;
- oids["PBEwithSHA-1andRC2-CBC"] = PkcsObjectIdentifiers.PbeWithSha1AndRC2Cbc;
- oids["PBEwithSHA-1and128bitRC4"] = PkcsObjectIdentifiers.PbeWithShaAnd128BitRC4;
- oids["PBEwithSHA-1and40bitRC4"] = PkcsObjectIdentifiers.PbeWithShaAnd40BitRC4;
- oids["PBEwithSHA-1and3-keyDESEDE-CBC"] = PkcsObjectIdentifiers.PbeWithShaAnd3KeyTripleDesCbc;
- oids["PBEwithSHA-1and2-keyDESEDE-CBC"] = PkcsObjectIdentifiers.PbeWithShaAnd2KeyTripleDesCbc;
- oids["PBEwithSHA-1and128bitRC2-CBC"] = PkcsObjectIdentifiers.PbeWithShaAnd128BitRC2Cbc;
- oids["PBEwithSHA-1and40bitRC2-CBC"] = PkcsObjectIdentifiers.PbewithShaAnd40BitRC2Cbc;
- oids["PBEwithHmacSHA-1"] = OiwObjectIdentifiers.IdSha1;
- oids["PBEwithHmacSHA-224"] = NistObjectIdentifiers.IdSha224;
- oids["PBEwithHmacSHA-256"] = NistObjectIdentifiers.IdSha256;
- oids["PBEwithHmacRipeMD128"] = TeleTrusTObjectIdentifiers.RipeMD128;
- oids["PBEwithHmacRipeMD160"] = TeleTrusTObjectIdentifiers.RipeMD160;
- oids["PBEwithHmacRipeMD256"] = TeleTrusTObjectIdentifiers.RipeMD256;
- oids["Pkcs5scheme2"] = PkcsObjectIdentifiers.IdPbeS2;
- }
-
- static PbeParametersGenerator MakePbeGenerator(
- string type,
- IDigest digest,
- byte[] key,
- byte[] salt,
- int iterationCount)
- {
- PbeParametersGenerator generator;
-
- if (type.Equals(Pkcs5S1))
- {
- generator = new Pkcs5S1ParametersGenerator(digest);
- }
- else if (type.Equals(Pkcs5S2))
- {
- generator = new Pkcs5S2ParametersGenerator();
- }
- else if (type.Equals(Pkcs12))
- {
- generator = new Pkcs12ParametersGenerator(digest);
- }
- else if (type.Equals(OpenSsl))
- {
- generator = new OpenSslPbeParametersGenerator();
- }
- else
- {
- throw new ArgumentException("Unknown PBE type: " + type, "type");
- }
-
- generator.Init(key, salt, iterationCount);
- return generator;
- }
-
- ///
- /// Returns a ObjectIdentifier for a give encoding.
- ///
- /// A string representation of the encoding.
- /// A DerObjectIdentifier, null if the Oid is not available.
- public static DerObjectIdentifier GetObjectIdentifier(
- string mechanism)
- {
- mechanism = (string) algorithms[Platform.ToUpperInvariant(mechanism)];
- if (mechanism != null)
- {
- return (DerObjectIdentifier)oids[mechanism];
- }
- return null;
- }
-
- public static ICollection Algorithms
- {
- get { return oids.Keys; }
- }
-
- public static bool IsPkcs12(
- string algorithm)
- {
- string mechanism = (string)algorithms[Platform.ToUpperInvariant(algorithm)];
-
- return mechanism != null && Pkcs12.Equals(algorithmType[mechanism]);
- }
-
- public static bool IsPkcs5Scheme1(
- string algorithm)
- {
- string mechanism = (string)algorithms[Platform.ToUpperInvariant(algorithm)];
-
- return mechanism != null && Pkcs5S1.Equals(algorithmType[mechanism]);
- }
-
- public static bool IsPkcs5Scheme2(
- string algorithm)
- {
- string mechanism = (string)algorithms[Platform.ToUpperInvariant(algorithm)];
-
- return mechanism != null && Pkcs5S2.Equals(algorithmType[mechanism]);
- }
-
- public static bool IsOpenSsl(
- string algorithm)
- {
- string mechanism = (string)algorithms[Platform.ToUpperInvariant(algorithm)];
-
- return mechanism != null && OpenSsl.Equals(algorithmType[mechanism]);
- }
-
- public static bool IsPbeAlgorithm(
- string algorithm)
- {
- string mechanism = (string)algorithms[Platform.ToUpperInvariant(algorithm)];
-
- return mechanism != null && algorithmType[mechanism] != null;
- }
-
- public static Asn1Encodable GenerateAlgorithmParameters(
- DerObjectIdentifier algorithmOid,
- byte[] salt,
- int iterationCount)
- {
- return GenerateAlgorithmParameters(algorithmOid.Id, salt, iterationCount);
- }
-
- public static Asn1Encodable GenerateAlgorithmParameters(
- string algorithm,
- byte[] salt,
- int iterationCount)
- {
- if (IsPkcs12(algorithm))
- {
- return new Pkcs12PbeParams(salt, iterationCount);
- }
- else if (IsPkcs5Scheme2(algorithm))
- {
- return new Pbkdf2Params(salt, iterationCount);
- }
- else
- {
- return new PbeParameter(salt, iterationCount);
- }
- }
-
- public static ICipherParameters GenerateCipherParameters(
- DerObjectIdentifier algorithmOid,
- char[] password,
- Asn1Encodable pbeParameters)
- {
- return GenerateCipherParameters(algorithmOid.Id, password, false, pbeParameters);
- }
-
- public static ICipherParameters GenerateCipherParameters(
- DerObjectIdentifier algorithmOid,
- char[] password,
- bool wrongPkcs12Zero,
- Asn1Encodable pbeParameters)
- {
- return GenerateCipherParameters(algorithmOid.Id, password, wrongPkcs12Zero, pbeParameters);
- }
-
- public static ICipherParameters GenerateCipherParameters(
- AlgorithmIdentifier algID,
- char[] password)
- {
- return GenerateCipherParameters(algID.Algorithm.Id, password, false, algID.Parameters);
- }
-
- public static ICipherParameters GenerateCipherParameters(
- AlgorithmIdentifier algID,
- char[] password,
- bool wrongPkcs12Zero)
- {
- return GenerateCipherParameters(algID.Algorithm.Id, password, wrongPkcs12Zero, algID.Parameters);
- }
-
- public static ICipherParameters GenerateCipherParameters(
- string algorithm,
- char[] password,
- Asn1Encodable pbeParameters)
- {
- return GenerateCipherParameters(algorithm, password, false, pbeParameters);
- }
-
- public static ICipherParameters GenerateCipherParameters(
- string algorithm,
- char[] password,
- bool wrongPkcs12Zero,
- Asn1Encodable pbeParameters)
- {
- string mechanism = (string)algorithms[Platform.ToUpperInvariant(algorithm)];
-
- byte[] keyBytes = null;
- byte[] salt = null;
- int iterationCount = 0;
-
- if (IsPkcs12(mechanism))
- {
- Pkcs12PbeParams pbeParams = Pkcs12PbeParams.GetInstance(pbeParameters);
- salt = pbeParams.GetIV();
- iterationCount = pbeParams.Iterations.IntValue;
- keyBytes = PbeParametersGenerator.Pkcs12PasswordToBytes(password, wrongPkcs12Zero);
- }
- else if (IsPkcs5Scheme2(mechanism))
- {
- // See below
- }
- else
- {
- PbeParameter pbeParams = PbeParameter.GetInstance(pbeParameters);
- salt = pbeParams.GetSalt();
- iterationCount = pbeParams.IterationCount.IntValue;
- keyBytes = PbeParametersGenerator.Pkcs5PasswordToBytes(password);
- }
-
- ICipherParameters parameters = null;
-
- if (IsPkcs5Scheme2(mechanism))
- {
- PbeS2Parameters s2p = PbeS2Parameters.GetInstance(pbeParameters.ToAsn1Object());
- AlgorithmIdentifier encScheme = s2p.EncryptionScheme;
- DerObjectIdentifier encOid = encScheme.Algorithm;
- Asn1Object encParams = encScheme.Parameters.ToAsn1Object();
-
- // TODO What about s2p.KeyDerivationFunc.Algorithm?
- Pbkdf2Params pbeParams = Pbkdf2Params.GetInstance(s2p.KeyDerivationFunc.Parameters.ToAsn1Object());
-
- byte[] iv;
- if (encOid.Equals(PkcsObjectIdentifiers.RC2Cbc)) // PKCS5.B.2.3
- {
- RC2CbcParameter rc2Params = RC2CbcParameter.GetInstance(encParams);
- iv = rc2Params.GetIV();
- }
- else
- {
- iv = Asn1OctetString.GetInstance(encParams).GetOctets();
- }
-
- salt = pbeParams.GetSalt();
- iterationCount = pbeParams.IterationCount.IntValue;
- keyBytes = PbeParametersGenerator.Pkcs5PasswordToBytes(password);
-
- int keyLength = pbeParams.KeyLength != null
- ? pbeParams.KeyLength.IntValue * 8
- : GeneratorUtilities.GetDefaultKeySize(encOid);
-
- PbeParametersGenerator gen = MakePbeGenerator(
- (string)algorithmType[mechanism], null, keyBytes, salt, iterationCount);
-
- parameters = gen.GenerateDerivedParameters(encOid.Id, keyLength);
-
- if (iv != null)
- {
- // FIXME? OpenSSL weirdness with IV of zeros (for ECB keys?)
- if (Arrays.AreEqual(iv, new byte[iv.Length]))
- {
- //Console.Error.Write("***** IV all 0 (length " + iv.Length + ") *****");
- }
- else
- {
- parameters = new ParametersWithIV(parameters, iv);
- }
- }
- }
- else if (Platform.StartsWith(mechanism, "PBEwithSHA-1"))
- {
- PbeParametersGenerator generator = MakePbeGenerator(
- (string) algorithmType[mechanism], new Sha1Digest(), keyBytes, salt, iterationCount);
-
- if (mechanism.Equals("PBEwithSHA-1and128bitAES-CBC-BC"))
- {
- parameters = generator.GenerateDerivedParameters("AES", 128, 128);
- }
- else if (mechanism.Equals("PBEwithSHA-1and192bitAES-CBC-BC"))
- {
- parameters = generator.GenerateDerivedParameters("AES", 192, 128);
- }
- else if (mechanism.Equals("PBEwithSHA-1and256bitAES-CBC-BC"))
- {
- parameters = generator.GenerateDerivedParameters("AES", 256, 128);
- }
- else if (mechanism.Equals("PBEwithSHA-1and128bitRC4"))
- {
- parameters = generator.GenerateDerivedParameters("RC4", 128);
- }
- else if (mechanism.Equals("PBEwithSHA-1and40bitRC4"))
- {
- parameters = generator.GenerateDerivedParameters("RC4", 40);
- }
- else if (mechanism.Equals("PBEwithSHA-1and3-keyDESEDE-CBC"))
- {
- parameters = generator.GenerateDerivedParameters("DESEDE", 192, 64);
- }
- else if (mechanism.Equals("PBEwithSHA-1and2-keyDESEDE-CBC"))
- {
- parameters = generator.GenerateDerivedParameters("DESEDE", 128, 64);
- }
- else if (mechanism.Equals("PBEwithSHA-1and128bitRC2-CBC"))
- {
- parameters = generator.GenerateDerivedParameters("RC2", 128, 64);
- }
- else if (mechanism.Equals("PBEwithSHA-1and40bitRC2-CBC"))
- {
- parameters = generator.GenerateDerivedParameters("RC2", 40, 64);
- }
- else if (mechanism.Equals("PBEwithSHA-1andDES-CBC"))
- {
- parameters = generator.GenerateDerivedParameters("DES", 64, 64);
- }
- else if (mechanism.Equals("PBEwithSHA-1andRC2-CBC"))
- {
- parameters = generator.GenerateDerivedParameters("RC2", 64, 64);
- }
- }
- else if (Platform.StartsWith(mechanism, "PBEwithSHA-256"))
- {
- PbeParametersGenerator generator = MakePbeGenerator(
- (string) algorithmType[mechanism], new Sha256Digest(), keyBytes, salt, iterationCount);
-
- if (mechanism.Equals("PBEwithSHA-256and128bitAES-CBC-BC"))
- {
- parameters = generator.GenerateDerivedParameters("AES", 128, 128);
- }
- else if (mechanism.Equals("PBEwithSHA-256and192bitAES-CBC-BC"))
- {
- parameters = generator.GenerateDerivedParameters("AES", 192, 128);
- }
- else if (mechanism.Equals("PBEwithSHA-256and256bitAES-CBC-BC"))
- {
- parameters = generator.GenerateDerivedParameters("AES", 256, 128);
- }
- }
- else if (Platform.StartsWith(mechanism, "PBEwithMD5"))
- {
- PbeParametersGenerator generator = MakePbeGenerator(
- (string)algorithmType[mechanism], new MD5Digest(), keyBytes, salt, iterationCount);
-
- if (mechanism.Equals("PBEwithMD5andDES-CBC"))
- {
- parameters = generator.GenerateDerivedParameters("DES", 64, 64);
- }
- else if (mechanism.Equals("PBEwithMD5andRC2-CBC"))
- {
- parameters = generator.GenerateDerivedParameters("RC2", 64, 64);
- }
- else if (mechanism.Equals("PBEwithMD5and128bitAES-CBC-OpenSSL"))
- {
- parameters = generator.GenerateDerivedParameters("AES", 128, 128);
- }
- else if (mechanism.Equals("PBEwithMD5and192bitAES-CBC-OpenSSL"))
- {
- parameters = generator.GenerateDerivedParameters("AES", 192, 128);
- }
- else if (mechanism.Equals("PBEwithMD5and256bitAES-CBC-OpenSSL"))
- {
- parameters = generator.GenerateDerivedParameters("AES", 256, 128);
- }
- }
- else if (Platform.StartsWith(mechanism, "PBEwithMD2"))
- {
- PbeParametersGenerator generator = MakePbeGenerator(
- (string)algorithmType[mechanism], new MD2Digest(), keyBytes, salt, iterationCount);
- if (mechanism.Equals("PBEwithMD2andDES-CBC"))
- {
- parameters = generator.GenerateDerivedParameters("DES", 64, 64);
- }
- else if (mechanism.Equals("PBEwithMD2andRC2-CBC"))
- {
- parameters = generator.GenerateDerivedParameters("RC2", 64, 64);
- }
- }
- else if (Platform.StartsWith(mechanism, "PBEwithHmac"))
- {
- string digestName = mechanism.Substring("PBEwithHmac".Length);
- IDigest digest = DigestUtilities.GetDigest(digestName);
-
- PbeParametersGenerator generator = MakePbeGenerator(
- (string) algorithmType[mechanism], digest, keyBytes, salt, iterationCount);
-
- int bitLen = digest.GetDigestSize() * 8;
- parameters = generator.GenerateDerivedMacParameters(bitLen);
- }
-
- Array.Clear(keyBytes, 0, keyBytes.Length);
-
- return FixDesParity(mechanism, parameters);
- }
-
- public static object CreateEngine(
- DerObjectIdentifier algorithmOid)
- {
- return CreateEngine(algorithmOid.Id);
- }
-
- public static object CreateEngine(
- AlgorithmIdentifier algID)
- {
- string algorithm = algID.Algorithm.Id;
-
- if (IsPkcs5Scheme2(algorithm))
- {
- PbeS2Parameters s2p = PbeS2Parameters.GetInstance(algID.Parameters.ToAsn1Object());
- AlgorithmIdentifier encScheme = s2p.EncryptionScheme;
- return CipherUtilities.GetCipher(encScheme.Algorithm);
- }
-
- return CreateEngine(algorithm);
- }
-
- public static object CreateEngine(
- string algorithm)
- {
- string mechanism = (string)algorithms[Platform.ToUpperInvariant(algorithm)];
-
- if (Platform.StartsWith(mechanism, "PBEwithHmac"))
- {
- string digestName = mechanism.Substring("PBEwithHmac".Length);
-
- return MacUtilities.GetMac("HMAC/" + digestName);
- }
-
- if (Platform.StartsWith(mechanism, "PBEwithMD2")
- || Platform.StartsWith(mechanism, "PBEwithMD5")
- || Platform.StartsWith(mechanism, "PBEwithSHA-1")
- || Platform.StartsWith(mechanism, "PBEwithSHA-256"))
- {
- if (Platform.EndsWith(mechanism, "AES-CBC-BC") || Platform.EndsWith(mechanism, "AES-CBC-OPENSSL"))
- {
- return CipherUtilities.GetCipher("AES/CBC");
- }
-
- if (Platform.EndsWith(mechanism, "DES-CBC"))
- {
- return CipherUtilities.GetCipher("DES/CBC");
- }
-
- if (Platform.EndsWith(mechanism, "DESEDE-CBC"))
- {
- return CipherUtilities.GetCipher("DESEDE/CBC");
- }
-
- if (Platform.EndsWith(mechanism, "RC2-CBC"))
- {
- return CipherUtilities.GetCipher("RC2/CBC");
- }
-
- if (Platform.EndsWith(mechanism, "RC4"))
- {
- return CipherUtilities.GetCipher("RC4");
- }
- }
-
- return null;
- }
-
- public static string GetEncodingName(
- DerObjectIdentifier oid)
- {
- return (string) algorithms[oid.Id];
- }
-
- private static ICipherParameters FixDesParity(string mechanism, ICipherParameters parameters)
- {
- if (!Platform.EndsWith(mechanism, "DES-CBC") && !Platform.EndsWith(mechanism, "DESEDE-CBC"))
- {
- return parameters;
- }
-
- if (parameters is ParametersWithIV)
- {
- ParametersWithIV ivParams = (ParametersWithIV)parameters;
- return new ParametersWithIV(FixDesParity(mechanism, ivParams.Parameters), ivParams.GetIV());
- }
-
- KeyParameter kParam = (KeyParameter)parameters;
- byte[] keyBytes = kParam.GetKey();
- DesParameters.SetOddParity(keyBytes);
- return new KeyParameter(keyBytes);
- }
- }
-}
diff --git a/BCCrypto/src/security/PrivateKeyFactory.cs b/BCCrypto/src/security/PrivateKeyFactory.cs
deleted file mode 100644
index 8c2ecfd..0000000
--- a/BCCrypto/src/security/PrivateKeyFactory.cs
+++ /dev/null
@@ -1,222 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.Sec;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Pkcs;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Security
-{
- public sealed class PrivateKeyFactory
- {
- private PrivateKeyFactory()
- {
- }
-
- public static AsymmetricKeyParameter CreateKey(
- byte[] privateKeyInfoData)
- {
- return CreateKey(
- PrivateKeyInfo.GetInstance(
- Asn1Object.FromByteArray(privateKeyInfoData)));
- }
-
- public static AsymmetricKeyParameter CreateKey(
- Stream inStr)
- {
- return CreateKey(
- PrivateKeyInfo.GetInstance(
- Asn1Object.FromStream(inStr)));
- }
-
- public static AsymmetricKeyParameter CreateKey(
- PrivateKeyInfo keyInfo)
- {
- AlgorithmIdentifier algID = keyInfo.PrivateKeyAlgorithm;
- DerObjectIdentifier algOid = algID.Algorithm;
-
- // TODO See RSAUtil.isRsaOid in Java build
- if (algOid.Equals(PkcsObjectIdentifiers.RsaEncryption)
- || algOid.Equals(X509ObjectIdentifiers.IdEARsa)
- || algOid.Equals(PkcsObjectIdentifiers.IdRsassaPss)
- || algOid.Equals(PkcsObjectIdentifiers.IdRsaesOaep))
- {
- RsaPrivateKeyStructure keyStructure = RsaPrivateKeyStructure.GetInstance(keyInfo.ParsePrivateKey());
-
- return new RsaPrivateCrtKeyParameters(
- keyStructure.Modulus,
- keyStructure.PublicExponent,
- keyStructure.PrivateExponent,
- keyStructure.Prime1,
- keyStructure.Prime2,
- keyStructure.Exponent1,
- keyStructure.Exponent2,
- keyStructure.Coefficient);
- }
- // TODO?
-// else if (algOid.Equals(X9ObjectIdentifiers.DHPublicNumber))
- else if (algOid.Equals(PkcsObjectIdentifiers.DhKeyAgreement))
- {
- DHParameter para = new DHParameter(
- Asn1Sequence.GetInstance(algID.Parameters.ToAsn1Object()));
- DerInteger derX = (DerInteger)keyInfo.ParsePrivateKey();
-
- BigInteger lVal = para.L;
- int l = lVal == null ? 0 : lVal.IntValue;
- DHParameters dhParams = new DHParameters(para.P, para.G, null, l);
-
- return new DHPrivateKeyParameters(derX.Value, dhParams, algOid);
- }
- else if (algOid.Equals(OiwObjectIdentifiers.ElGamalAlgorithm))
- {
- ElGamalParameter para = new ElGamalParameter(
- Asn1Sequence.GetInstance(algID.Parameters.ToAsn1Object()));
- DerInteger derX = (DerInteger)keyInfo.ParsePrivateKey();
-
- return new ElGamalPrivateKeyParameters(
- derX.Value,
- new ElGamalParameters(para.P, para.G));
- }
- else if (algOid.Equals(X9ObjectIdentifiers.IdDsa))
- {
- DerInteger derX = (DerInteger)keyInfo.ParsePrivateKey();
- Asn1Encodable ae = algID.Parameters;
-
- DsaParameters parameters = null;
- if (ae != null)
- {
- DsaParameter para = DsaParameter.GetInstance(ae.ToAsn1Object());
- parameters = new DsaParameters(para.P, para.Q, para.G);
- }
-
- return new DsaPrivateKeyParameters(derX.Value, parameters);
- }
- else if (algOid.Equals(X9ObjectIdentifiers.IdECPublicKey))
- {
- X962Parameters para = new X962Parameters(algID.Parameters.ToAsn1Object());
-
- X9ECParameters x9;
- if (para.IsNamedCurve)
- {
- x9 = ECKeyPairGenerator.FindECCurveByOid((DerObjectIdentifier)para.Parameters);
- }
- else
- {
- x9 = new X9ECParameters((Asn1Sequence)para.Parameters);
- }
-
- ECPrivateKeyStructure ec = ECPrivateKeyStructure.GetInstance(keyInfo.ParsePrivateKey());
- BigInteger d = ec.GetKey();
-
- if (para.IsNamedCurve)
- {
- return new ECPrivateKeyParameters("EC", d, (DerObjectIdentifier)para.Parameters);
- }
-
- ECDomainParameters dParams = new ECDomainParameters(x9.Curve, x9.G, x9.N, x9.H, x9.GetSeed());
- return new ECPrivateKeyParameters(d, dParams);
- }
- else if (algOid.Equals(CryptoProObjectIdentifiers.GostR3410x2001))
- {
- Gost3410PublicKeyAlgParameters gostParams = new Gost3410PublicKeyAlgParameters(
- Asn1Sequence.GetInstance(algID.Parameters.ToAsn1Object()));
-
- ECDomainParameters ecP = ECGost3410NamedCurves.GetByOid(gostParams.PublicKeyParamSet);
-
- if (ecP == null)
- throw new ArgumentException("Unrecognized curve OID for GostR3410x2001 private key");
-
- Asn1Object privKey = keyInfo.ParsePrivateKey();
- ECPrivateKeyStructure ec;
-
- if (privKey is DerInteger)
- {
- // TODO Do we need to pass any parameters here?
- ec = new ECPrivateKeyStructure(ecP.N.BitLength, ((DerInteger)privKey).Value);
- }
- else
- {
- ec = ECPrivateKeyStructure.GetInstance(privKey);
- }
-
- return new ECPrivateKeyParameters("ECGOST3410", ec.GetKey(), gostParams.PublicKeyParamSet);
- }
- else if (algOid.Equals(CryptoProObjectIdentifiers.GostR3410x94))
- {
- Gost3410PublicKeyAlgParameters gostParams = new Gost3410PublicKeyAlgParameters(
- Asn1Sequence.GetInstance(algID.Parameters.ToAsn1Object()));
-
- DerOctetString derX = (DerOctetString)keyInfo.ParsePrivateKey();
- BigInteger x = new BigInteger(1, Arrays.Reverse(derX.GetOctets()));
-
- return new Gost3410PrivateKeyParameters(x, gostParams.PublicKeyParamSet);
- }
- else
- {
- throw new SecurityUtilityException("algorithm identifier in key not recognised");
- }
- }
-
- public static AsymmetricKeyParameter DecryptKey(
- char[] passPhrase,
- EncryptedPrivateKeyInfo encInfo)
- {
- return CreateKey(PrivateKeyInfoFactory.CreatePrivateKeyInfo(passPhrase, encInfo));
- }
-
- public static AsymmetricKeyParameter DecryptKey(
- char[] passPhrase,
- byte[] encryptedPrivateKeyInfoData)
- {
- return DecryptKey(passPhrase, Asn1Object.FromByteArray(encryptedPrivateKeyInfoData));
- }
-
- public static AsymmetricKeyParameter DecryptKey(
- char[] passPhrase,
- Stream encryptedPrivateKeyInfoStream)
- {
- return DecryptKey(passPhrase, Asn1Object.FromStream(encryptedPrivateKeyInfoStream));
- }
-
- private static AsymmetricKeyParameter DecryptKey(
- char[] passPhrase,
- Asn1Object asn1Object)
- {
- return DecryptKey(passPhrase, EncryptedPrivateKeyInfo.GetInstance(asn1Object));
- }
-
- public static byte[] EncryptKey(
- DerObjectIdentifier algorithm,
- char[] passPhrase,
- byte[] salt,
- int iterationCount,
- AsymmetricKeyParameter key)
- {
- return EncryptedPrivateKeyInfoFactory.CreateEncryptedPrivateKeyInfo(
- algorithm, passPhrase, salt, iterationCount, key).GetEncoded();
- }
-
- public static byte[] EncryptKey(
- string algorithm,
- char[] passPhrase,
- byte[] salt,
- int iterationCount,
- AsymmetricKeyParameter key)
- {
- return EncryptedPrivateKeyInfoFactory.CreateEncryptedPrivateKeyInfo(
- algorithm, passPhrase, salt, iterationCount, key).GetEncoded();
- }
- }
-}
diff --git a/BCCrypto/src/security/PublicKeyFactory.cs b/BCCrypto/src/security/PublicKeyFactory.cs
deleted file mode 100644
index f1b28b7..0000000
--- a/BCCrypto/src/security/PublicKeyFactory.cs
+++ /dev/null
@@ -1,253 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.Sec;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-
-namespace Org.BouncyCastle.Security
-{
- public sealed class PublicKeyFactory
- {
- private PublicKeyFactory()
- {
- }
-
- public static AsymmetricKeyParameter CreateKey(
- byte[] keyInfoData)
- {
- return CreateKey(
- SubjectPublicKeyInfo.GetInstance(
- Asn1Object.FromByteArray(keyInfoData)));
- }
-
- public static AsymmetricKeyParameter CreateKey(
- Stream inStr)
- {
- return CreateKey(
- SubjectPublicKeyInfo.GetInstance(
- Asn1Object.FromStream(inStr)));
- }
-
- public static AsymmetricKeyParameter CreateKey(
- SubjectPublicKeyInfo keyInfo)
- {
- AlgorithmIdentifier algID = keyInfo.AlgorithmID;
- DerObjectIdentifier algOid = algID.Algorithm;
-
- // TODO See RSAUtil.isRsaOid in Java build
- if (algOid.Equals(PkcsObjectIdentifiers.RsaEncryption)
- || algOid.Equals(X509ObjectIdentifiers.IdEARsa)
- || algOid.Equals(PkcsObjectIdentifiers.IdRsassaPss)
- || algOid.Equals(PkcsObjectIdentifiers.IdRsaesOaep))
- {
- RsaPublicKeyStructure pubKey = RsaPublicKeyStructure.GetInstance(
- keyInfo.GetPublicKey());
-
- return new RsaKeyParameters(false, pubKey.Modulus, pubKey.PublicExponent);
- }
- else if (algOid.Equals(X9ObjectIdentifiers.DHPublicNumber))
- {
- Asn1Sequence seq = Asn1Sequence.GetInstance(algID.Parameters.ToAsn1Object());
-
- DHPublicKey dhPublicKey = DHPublicKey.GetInstance(keyInfo.GetPublicKey());
-
- BigInteger y = dhPublicKey.Y.Value;
-
- if (IsPkcsDHParam(seq))
- return ReadPkcsDHParam(algOid, y, seq);
-
- DHDomainParameters dhParams = DHDomainParameters.GetInstance(seq);
-
- BigInteger p = dhParams.P.Value;
- BigInteger g = dhParams.G.Value;
- BigInteger q = dhParams.Q.Value;
-
- BigInteger j = null;
- if (dhParams.J != null)
- {
- j = dhParams.J.Value;
- }
-
- DHValidationParameters validation = null;
- DHValidationParms dhValidationParms = dhParams.ValidationParms;
- if (dhValidationParms != null)
- {
- byte[] seed = dhValidationParms.Seed.GetBytes();
- BigInteger pgenCounter = dhValidationParms.PgenCounter.Value;
-
- // TODO Check pgenCounter size?
-
- validation = new DHValidationParameters(seed, pgenCounter.IntValue);
- }
-
- return new DHPublicKeyParameters(y, new DHParameters(p, g, q, j, validation));
- }
- else if (algOid.Equals(PkcsObjectIdentifiers.DhKeyAgreement))
- {
- Asn1Sequence seq = Asn1Sequence.GetInstance(algID.Parameters.ToAsn1Object());
-
- DerInteger derY = (DerInteger) keyInfo.GetPublicKey();
-
- return ReadPkcsDHParam(algOid, derY.Value, seq);
- }
- else if (algOid.Equals(OiwObjectIdentifiers.ElGamalAlgorithm))
- {
- ElGamalParameter para = new ElGamalParameter(
- Asn1Sequence.GetInstance(algID.Parameters.ToAsn1Object()));
- DerInteger derY = (DerInteger) keyInfo.GetPublicKey();
-
- return new ElGamalPublicKeyParameters(
- derY.Value,
- new ElGamalParameters(para.P, para.G));
- }
- else if (algOid.Equals(X9ObjectIdentifiers.IdDsa)
- || algOid.Equals(OiwObjectIdentifiers.DsaWithSha1))
- {
- DerInteger derY = (DerInteger) keyInfo.GetPublicKey();
- Asn1Encodable ae = algID.Parameters;
-
- DsaParameters parameters = null;
- if (ae != null)
- {
- DsaParameter para = DsaParameter.GetInstance(ae.ToAsn1Object());
- parameters = new DsaParameters(para.P, para.Q, para.G);
- }
-
- return new DsaPublicKeyParameters(derY.Value, parameters);
- }
- else if (algOid.Equals(X9ObjectIdentifiers.IdECPublicKey))
- {
- X962Parameters para = new X962Parameters(algID.Parameters.ToAsn1Object());
-
- X9ECParameters x9;
- if (para.IsNamedCurve)
- {
- x9 = ECKeyPairGenerator.FindECCurveByOid((DerObjectIdentifier)para.Parameters);
- }
- else
- {
- x9 = new X9ECParameters((Asn1Sequence)para.Parameters);
- }
-
- Asn1OctetString key = new DerOctetString(keyInfo.PublicKeyData.GetBytes());
- X9ECPoint derQ = new X9ECPoint(x9.Curve, key);
- ECPoint q = derQ.Point;
-
- if (para.IsNamedCurve)
- {
- return new ECPublicKeyParameters("EC", q, (DerObjectIdentifier)para.Parameters);
- }
-
- ECDomainParameters dParams = new ECDomainParameters(x9.Curve, x9.G, x9.N, x9.H, x9.GetSeed());
- return new ECPublicKeyParameters(q, dParams);
- }
- else if (algOid.Equals(CryptoProObjectIdentifiers.GostR3410x2001))
- {
- Gost3410PublicKeyAlgParameters gostParams = new Gost3410PublicKeyAlgParameters(
- (Asn1Sequence) algID.Parameters);
-
- Asn1OctetString key;
- try
- {
- key = (Asn1OctetString) keyInfo.GetPublicKey();
- }
- catch (IOException)
- {
- throw new ArgumentException("invalid info structure in GOST3410 public key");
- }
-
- byte[] keyEnc = key.GetOctets();
- byte[] x = new byte[32];
- byte[] y = new byte[32];
-
- for (int i = 0; i != y.Length; i++)
- {
- x[i] = keyEnc[32 - 1 - i];
- }
-
- for (int i = 0; i != x.Length; i++)
- {
- y[i] = keyEnc[64 - 1 - i];
- }
-
- ECDomainParameters ecP = ECGost3410NamedCurves.GetByOid(gostParams.PublicKeyParamSet);
-
- if (ecP == null)
- return null;
-
- ECPoint q = ecP.Curve.CreatePoint(new BigInteger(1, x), new BigInteger(1, y));
-
- return new ECPublicKeyParameters("ECGOST3410", q, gostParams.PublicKeyParamSet);
- }
- else if (algOid.Equals(CryptoProObjectIdentifiers.GostR3410x94))
- {
- Gost3410PublicKeyAlgParameters algParams = new Gost3410PublicKeyAlgParameters(
- (Asn1Sequence) algID.Parameters);
-
- DerOctetString derY;
- try
- {
- derY = (DerOctetString) keyInfo.GetPublicKey();
- }
- catch (IOException)
- {
- throw new ArgumentException("invalid info structure in GOST3410 public key");
- }
-
- byte[] keyEnc = derY.GetOctets();
- byte[] keyBytes = new byte[keyEnc.Length];
-
- for (int i = 0; i != keyEnc.Length; i++)
- {
- keyBytes[i] = keyEnc[keyEnc.Length - 1 - i]; // was little endian
- }
-
- BigInteger y = new BigInteger(1, keyBytes);
-
- return new Gost3410PublicKeyParameters(y, algParams.PublicKeyParamSet);
- }
- else
- {
- throw new SecurityUtilityException("algorithm identifier in key not recognised: " + algOid);
- }
- }
-
- private static bool IsPkcsDHParam(Asn1Sequence seq)
- {
- if (seq.Count == 2)
- return true;
-
- if (seq.Count > 3)
- return false;
-
- DerInteger l = DerInteger.GetInstance(seq[2]);
- DerInteger p = DerInteger.GetInstance(seq[0]);
-
- return l.Value.CompareTo(BigInteger.ValueOf(p.Value.BitLength)) <= 0;
- }
-
- private static DHPublicKeyParameters ReadPkcsDHParam(DerObjectIdentifier algOid,
- BigInteger y, Asn1Sequence seq)
- {
- DHParameter para = new DHParameter(seq);
-
- BigInteger lVal = para.L;
- int l = lVal == null ? 0 : lVal.IntValue;
- DHParameters dhParams = new DHParameters(para.P, para.G, null, l);
-
- return new DHPublicKeyParameters(y, dhParams, algOid);
- }
- }
-}
diff --git a/BCCrypto/src/security/SecureRandom.cs b/BCCrypto/src/security/SecureRandom.cs
deleted file mode 100644
index bd639a3..0000000
--- a/BCCrypto/src/security/SecureRandom.cs
+++ /dev/null
@@ -1,262 +0,0 @@
-using System;
-using System.Threading;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Prng;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Security
-{
- public class SecureRandom
- : Random
- {
- private static long counter = Times.NanoTime();
-
-#if NETCF_1_0 || PORTABLE
- private static object counterLock = new object();
- private static long NextCounterValue()
- {
- lock (counterLock)
- {
- return ++counter;
- }
- }
-
- private static readonly SecureRandom[] master = { null };
- private static SecureRandom Master
- {
- get
- {
- lock (master)
- {
- if (master[0] == null)
- {
- SecureRandom sr = master[0] = GetInstance("SHA256PRNG", false);
-
- // Even though Ticks has at most 8 or 14 bits of entropy, there's no harm in adding it.
- sr.SetSeed(DateTime.Now.Ticks);
-
- // 32 will be enough when ThreadedSeedGenerator is fixed. Until then, ThreadedSeedGenerator returns low
- // entropy, and this is not sufficient to be secure. http://www.bouncycastle.org/csharpdevmailarchive/msg00814.html
- sr.SetSeed(new ThreadedSeedGenerator().GenerateSeed(32, true));
- }
-
- return master[0];
- }
- }
- }
-#else
- private static long NextCounterValue()
- {
- return Interlocked.Increment(ref counter);
- }
-
- private static readonly SecureRandom master = new SecureRandom(new CryptoApiRandomGenerator());
- private static SecureRandom Master
- {
- get { return master; }
- }
-#endif
-
- private static DigestRandomGenerator CreatePrng(string digestName, bool autoSeed)
- {
- IDigest digest = DigestUtilities.GetDigest(digestName);
- if (digest == null)
- return null;
- DigestRandomGenerator prng = new DigestRandomGenerator(digest);
- if (autoSeed)
- {
- prng.AddSeedMaterial(NextCounterValue());
- prng.AddSeedMaterial(GetNextBytes(Master, digest.GetDigestSize()));
- }
- return prng;
- }
-
- public static byte[] GetNextBytes(SecureRandom secureRandom, int length)
- {
- byte[] result = new byte[length];
- secureRandom.NextBytes(result);
- return result;
- }
-
- ///
- /// Create and auto-seed an instance based on the given algorithm.
- ///
- /// Equivalent to GetInstance(algorithm, true)
- /// e.g. "SHA256PRNG"
- public static SecureRandom GetInstance(string algorithm)
- {
- return GetInstance(algorithm, true);
- }
-
- ///
- /// Create an instance based on the given algorithm, with optional auto-seeding
- ///
- /// e.g. "SHA256PRNG"
- /// If true, the instance will be auto-seeded.
- public static SecureRandom GetInstance(string algorithm, bool autoSeed)
- {
- string upper = Platform.ToUpperInvariant(algorithm);
- if (Platform.EndsWith(upper, "PRNG"))
- {
- string digestName = upper.Substring(0, upper.Length - "PRNG".Length);
- DigestRandomGenerator prng = CreatePrng(digestName, autoSeed);
- if (prng != null)
- {
- return new SecureRandom(prng);
- }
- }
-
- throw new ArgumentException("Unrecognised PRNG algorithm: " + algorithm, "algorithm");
- }
-
- [Obsolete("Call GenerateSeed() on a SecureRandom instance instead")]
- public static byte[] GetSeed(int length)
- {
- return GetNextBytes(Master, length);
- }
-
- protected readonly IRandomGenerator generator;
-
- public SecureRandom()
- : this(CreatePrng("SHA256", true))
- {
- }
-
- ///
- /// To replicate existing predictable output, replace with GetInstance("SHA1PRNG", false), followed by SetSeed(seed)
- ///
- [Obsolete("Use GetInstance/SetSeed instead")]
- public SecureRandom(byte[] seed)
- : this(CreatePrng("SHA1", false))
- {
- SetSeed(seed);
- }
-
- /// Use the specified instance of IRandomGenerator as random source.
- ///
- /// This constructor performs no seeding of either the IRandomGenerator or the
- /// constructed SecureRandom . It is the responsibility of the client to provide
- /// proper seed material as necessary/appropriate for the given IRandomGenerator
- /// implementation.
- ///
- /// The source to generate all random bytes from.
- public SecureRandom(IRandomGenerator generator)
- : base(0)
- {
- this.generator = generator;
- }
-
- public virtual byte[] GenerateSeed(int length)
- {
- return GetNextBytes(Master, length);
- }
-
- public virtual void SetSeed(byte[] seed)
- {
- generator.AddSeedMaterial(seed);
- }
-
- public virtual void SetSeed(long seed)
- {
- generator.AddSeedMaterial(seed);
- }
-
- public override int Next()
- {
- return NextInt() & int.MaxValue;
- }
-
- public override int Next(int maxValue)
- {
-
- if (maxValue < 2)
- {
- if (maxValue < 0)
- throw new ArgumentOutOfRangeException("maxValue", "cannot be negative");
-
- return 0;
- }
-
- int bits;
-
- // Test whether maxValue is a power of 2
- if ((maxValue & (maxValue - 1)) == 0)
- {
- bits = NextInt() & int.MaxValue;
- return (int)(((long)bits * maxValue) >> 31);
- }
-
- int result;
- do
- {
- bits = NextInt() & int.MaxValue;
- result = bits % maxValue;
- }
- while (bits - result + (maxValue - 1) < 0); // Ignore results near overflow
-
- return result;
- }
-
- public override int Next(int minValue, int maxValue)
- {
- if (maxValue <= minValue)
- {
- if (maxValue == minValue)
- return minValue;
-
- throw new ArgumentException("maxValue cannot be less than minValue");
- }
-
- int diff = maxValue - minValue;
- if (diff > 0)
- return minValue + Next(diff);
-
- for (;;)
- {
- int i = NextInt();
-
- if (i >= minValue && i < maxValue)
- return i;
- }
- }
-
- public override void NextBytes(byte[] buf)
- {
- generator.NextBytes(buf);
- }
-
- public virtual void NextBytes(byte[] buf, int off, int len)
- {
- generator.NextBytes(buf, off, len);
- }
-
- private static readonly double DoubleScale = System.Math.Pow(2.0, 64.0);
-
- public override double NextDouble()
- {
- return Convert.ToDouble((ulong) NextLong()) / DoubleScale;
- }
-
- public virtual int NextInt()
- {
- byte[] bytes = new byte[4];
- NextBytes(bytes);
-
- uint result = bytes[0];
- result <<= 8;
- result |= bytes[1];
- result <<= 8;
- result |= bytes[2];
- result <<= 8;
- result |= bytes[3];
- return (int)result;
- }
-
- public virtual long NextLong()
- {
- return ((long)(uint) NextInt() << 32) | (long)(uint) NextInt();
- }
- }
-}
diff --git a/BCCrypto/src/security/SecurityUtilityException.cs b/BCCrypto/src/security/SecurityUtilityException.cs
deleted file mode 100644
index 8a19530..0000000
--- a/BCCrypto/src/security/SecurityUtilityException.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class SecurityUtilityException
- : Exception
- {
- /**
- * base constructor.
- */
- public SecurityUtilityException()
- {
- }
-
- /**
- * create a SecurityUtilityException with the given message.
- *
- * @param message the message to be carried with the exception.
- */
- public SecurityUtilityException(
- string message)
- : base(message)
- {
- }
-
- public SecurityUtilityException(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/security/SignatureException.cs b/BCCrypto/src/security/SignatureException.cs
deleted file mode 100644
index 3ad617d..0000000
--- a/BCCrypto/src/security/SignatureException.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class SignatureException : GeneralSecurityException
- {
- public SignatureException() : base() { }
- public SignatureException(string message) : base(message) { }
- public SignatureException(string message, Exception exception) : base(message, exception) { }
- }
-}
diff --git a/BCCrypto/src/security/SignerUtilities.cs b/BCCrypto/src/security/SignerUtilities.cs
deleted file mode 100644
index 9a4915b..0000000
--- a/BCCrypto/src/security/SignerUtilities.cs
+++ /dev/null
@@ -1,566 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Crypto.Signers;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Security
-{
- ///
- /// Signer Utility class contains methods that can not be specifically grouped into other classes.
- ///
- public sealed class SignerUtilities
- {
- private SignerUtilities()
- {
- }
-
- internal static readonly IDictionary algorithms = Platform.CreateHashtable();
- internal static readonly IDictionary oids = Platform.CreateHashtable();
-
- static SignerUtilities()
- {
- algorithms["MD2WITHRSA"] = "MD2withRSA";
- algorithms["MD2WITHRSAENCRYPTION"] = "MD2withRSA";
- algorithms[PkcsObjectIdentifiers.MD2WithRsaEncryption.Id] = "MD2withRSA";
-
- algorithms["MD4WITHRSA"] = "MD4withRSA";
- algorithms["MD4WITHRSAENCRYPTION"] = "MD4withRSA";
- algorithms[PkcsObjectIdentifiers.MD4WithRsaEncryption.Id] = "MD4withRSA";
-
- algorithms["MD5WITHRSA"] = "MD5withRSA";
- algorithms["MD5WITHRSAENCRYPTION"] = "MD5withRSA";
- algorithms[PkcsObjectIdentifiers.MD5WithRsaEncryption.Id] = "MD5withRSA";
-
- algorithms["SHA1WITHRSA"] = "SHA-1withRSA";
- algorithms["SHA1WITHRSAENCRYPTION"] = "SHA-1withRSA";
- algorithms[PkcsObjectIdentifiers.Sha1WithRsaEncryption.Id] = "SHA-1withRSA";
- algorithms["SHA-1WITHRSA"] = "SHA-1withRSA";
-
- algorithms["SHA224WITHRSA"] = "SHA-224withRSA";
- algorithms["SHA224WITHRSAENCRYPTION"] = "SHA-224withRSA";
- algorithms[PkcsObjectIdentifiers.Sha224WithRsaEncryption.Id] = "SHA-224withRSA";
- algorithms["SHA-224WITHRSA"] = "SHA-224withRSA";
-
- algorithms["SHA256WITHRSA"] = "SHA-256withRSA";
- algorithms["SHA256WITHRSAENCRYPTION"] = "SHA-256withRSA";
- algorithms[PkcsObjectIdentifiers.Sha256WithRsaEncryption.Id] = "SHA-256withRSA";
- algorithms["SHA-256WITHRSA"] = "SHA-256withRSA";
-
- algorithms["SHA384WITHRSA"] = "SHA-384withRSA";
- algorithms["SHA384WITHRSAENCRYPTION"] = "SHA-384withRSA";
- algorithms[PkcsObjectIdentifiers.Sha384WithRsaEncryption.Id] = "SHA-384withRSA";
- algorithms["SHA-384WITHRSA"] = "SHA-384withRSA";
-
- algorithms["SHA512WITHRSA"] = "SHA-512withRSA";
- algorithms["SHA512WITHRSAENCRYPTION"] = "SHA-512withRSA";
- algorithms[PkcsObjectIdentifiers.Sha512WithRsaEncryption.Id] = "SHA-512withRSA";
- algorithms["SHA-512WITHRSA"] = "SHA-512withRSA";
-
- algorithms["PSSWITHRSA"] = "PSSwithRSA";
- algorithms["RSASSA-PSS"] = "PSSwithRSA";
- algorithms[PkcsObjectIdentifiers.IdRsassaPss.Id] = "PSSwithRSA";
- algorithms["RSAPSS"] = "PSSwithRSA";
-
- algorithms["SHA1WITHRSAANDMGF1"] = "SHA-1withRSAandMGF1";
- algorithms["SHA-1WITHRSAANDMGF1"] = "SHA-1withRSAandMGF1";
- algorithms["SHA1WITHRSA/PSS"] = "SHA-1withRSAandMGF1";
- algorithms["SHA-1WITHRSA/PSS"] = "SHA-1withRSAandMGF1";
-
- algorithms["SHA224WITHRSAANDMGF1"] = "SHA-224withRSAandMGF1";
- algorithms["SHA-224WITHRSAANDMGF1"] = "SHA-224withRSAandMGF1";
- algorithms["SHA224WITHRSA/PSS"] = "SHA-224withRSAandMGF1";
- algorithms["SHA-224WITHRSA/PSS"] = "SHA-224withRSAandMGF1";
-
- algorithms["SHA256WITHRSAANDMGF1"] = "SHA-256withRSAandMGF1";
- algorithms["SHA-256WITHRSAANDMGF1"] = "SHA-256withRSAandMGF1";
- algorithms["SHA256WITHRSA/PSS"] = "SHA-256withRSAandMGF1";
- algorithms["SHA-256WITHRSA/PSS"] = "SHA-256withRSAandMGF1";
-
- algorithms["SHA384WITHRSAANDMGF1"] = "SHA-384withRSAandMGF1";
- algorithms["SHA-384WITHRSAANDMGF1"] = "SHA-384withRSAandMGF1";
- algorithms["SHA384WITHRSA/PSS"] = "SHA-384withRSAandMGF1";
- algorithms["SHA-384WITHRSA/PSS"] = "SHA-384withRSAandMGF1";
-
- algorithms["SHA512WITHRSAANDMGF1"] = "SHA-512withRSAandMGF1";
- algorithms["SHA-512WITHRSAANDMGF1"] = "SHA-512withRSAandMGF1";
- algorithms["SHA512WITHRSA/PSS"] = "SHA-512withRSAandMGF1";
- algorithms["SHA-512WITHRSA/PSS"] = "SHA-512withRSAandMGF1";
-
- algorithms["RIPEMD128WITHRSA"] = "RIPEMD128withRSA";
- algorithms["RIPEMD128WITHRSAENCRYPTION"] = "RIPEMD128withRSA";
- algorithms[TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128.Id] = "RIPEMD128withRSA";
-
- algorithms["RIPEMD160WITHRSA"] = "RIPEMD160withRSA";
- algorithms["RIPEMD160WITHRSAENCRYPTION"] = "RIPEMD160withRSA";
- algorithms[TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160.Id] = "RIPEMD160withRSA";
-
- algorithms["RIPEMD256WITHRSA"] = "RIPEMD256withRSA";
- algorithms["RIPEMD256WITHRSAENCRYPTION"] = "RIPEMD256withRSA";
- algorithms[TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256.Id] = "RIPEMD256withRSA";
-
- algorithms["NONEWITHRSA"] = "RSA";
- algorithms["RSAWITHNONE"] = "RSA";
- algorithms["RAWRSA"] = "RSA";
-
- algorithms["RAWRSAPSS"] = "RAWRSASSA-PSS";
- algorithms["NONEWITHRSAPSS"] = "RAWRSASSA-PSS";
- algorithms["NONEWITHRSASSA-PSS"] = "RAWRSASSA-PSS";
-
- algorithms["NONEWITHDSA"] = "NONEwithDSA";
- algorithms["DSAWITHNONE"] = "NONEwithDSA";
- algorithms["RAWDSA"] = "NONEwithDSA";
-
- algorithms["DSA"] = "SHA-1withDSA";
- algorithms["DSAWITHSHA1"] = "SHA-1withDSA";
- algorithms["DSAWITHSHA-1"] = "SHA-1withDSA";
- algorithms["SHA/DSA"] = "SHA-1withDSA";
- algorithms["SHA1/DSA"] = "SHA-1withDSA";
- algorithms["SHA-1/DSA"] = "SHA-1withDSA";
- algorithms["SHA1WITHDSA"] = "SHA-1withDSA";
- algorithms["SHA-1WITHDSA"] = "SHA-1withDSA";
- algorithms[X9ObjectIdentifiers.IdDsaWithSha1.Id] = "SHA-1withDSA";
-
- algorithms["DSAWITHSHA224"] = "SHA-224withDSA";
- algorithms["DSAWITHSHA-224"] = "SHA-224withDSA";
- algorithms["SHA224/DSA"] = "SHA-224withDSA";
- algorithms["SHA-224/DSA"] = "SHA-224withDSA";
- algorithms["SHA224WITHDSA"] = "SHA-224withDSA";
- algorithms["SHA-224WITHDSA"] = "SHA-224withDSA";
- algorithms[NistObjectIdentifiers.DsaWithSha224.Id] = "SHA-224withDSA";
-
- algorithms["DSAWITHSHA256"] = "SHA-256withDSA";
- algorithms["DSAWITHSHA-256"] = "SHA-256withDSA";
- algorithms["SHA256/DSA"] = "SHA-256withDSA";
- algorithms["SHA-256/DSA"] = "SHA-256withDSA";
- algorithms["SHA256WITHDSA"] = "SHA-256withDSA";
- algorithms["SHA-256WITHDSA"] = "SHA-256withDSA";
- algorithms[NistObjectIdentifiers.DsaWithSha256.Id] = "SHA-256withDSA";
-
- algorithms["DSAWITHSHA384"] = "SHA-384withDSA";
- algorithms["DSAWITHSHA-384"] = "SHA-384withDSA";
- algorithms["SHA384/DSA"] = "SHA-384withDSA";
- algorithms["SHA-384/DSA"] = "SHA-384withDSA";
- algorithms["SHA384WITHDSA"] = "SHA-384withDSA";
- algorithms["SHA-384WITHDSA"] = "SHA-384withDSA";
- algorithms[NistObjectIdentifiers.DsaWithSha384.Id] = "SHA-384withDSA";
-
- algorithms["DSAWITHSHA512"] = "SHA-512withDSA";
- algorithms["DSAWITHSHA-512"] = "SHA-512withDSA";
- algorithms["SHA512/DSA"] = "SHA-512withDSA";
- algorithms["SHA-512/DSA"] = "SHA-512withDSA";
- algorithms["SHA512WITHDSA"] = "SHA-512withDSA";
- algorithms["SHA-512WITHDSA"] = "SHA-512withDSA";
- algorithms[NistObjectIdentifiers.DsaWithSha512.Id] = "SHA-512withDSA";
-
- algorithms["NONEWITHECDSA"] = "NONEwithECDSA";
- algorithms["ECDSAWITHNONE"] = "NONEwithECDSA";
-
- algorithms["ECDSA"] = "SHA-1withECDSA";
- algorithms["SHA1/ECDSA"] = "SHA-1withECDSA";
- algorithms["SHA-1/ECDSA"] = "SHA-1withECDSA";
- algorithms["ECDSAWITHSHA1"] = "SHA-1withECDSA";
- algorithms["ECDSAWITHSHA-1"] = "SHA-1withECDSA";
- algorithms["SHA1WITHECDSA"] = "SHA-1withECDSA";
- algorithms["SHA-1WITHECDSA"] = "SHA-1withECDSA";
- algorithms[X9ObjectIdentifiers.ECDsaWithSha1.Id] = "SHA-1withECDSA";
- algorithms[TeleTrusTObjectIdentifiers.ECSignWithSha1.Id] = "SHA-1withECDSA";
-
- algorithms["SHA224/ECDSA"] = "SHA-224withECDSA";
- algorithms["SHA-224/ECDSA"] = "SHA-224withECDSA";
- algorithms["ECDSAWITHSHA224"] = "SHA-224withECDSA";
- algorithms["ECDSAWITHSHA-224"] = "SHA-224withECDSA";
- algorithms["SHA224WITHECDSA"] = "SHA-224withECDSA";
- algorithms["SHA-224WITHECDSA"] = "SHA-224withECDSA";
- algorithms[X9ObjectIdentifiers.ECDsaWithSha224.Id] = "SHA-224withECDSA";
-
- algorithms["SHA256/ECDSA"] = "SHA-256withECDSA";
- algorithms["SHA-256/ECDSA"] = "SHA-256withECDSA";
- algorithms["ECDSAWITHSHA256"] = "SHA-256withECDSA";
- algorithms["ECDSAWITHSHA-256"] = "SHA-256withECDSA";
- algorithms["SHA256WITHECDSA"] = "SHA-256withECDSA";
- algorithms["SHA-256WITHECDSA"] = "SHA-256withECDSA";
- algorithms[X9ObjectIdentifiers.ECDsaWithSha256.Id] = "SHA-256withECDSA";
-
- algorithms["SHA384/ECDSA"] = "SHA-384withECDSA";
- algorithms["SHA-384/ECDSA"] = "SHA-384withECDSA";
- algorithms["ECDSAWITHSHA384"] = "SHA-384withECDSA";
- algorithms["ECDSAWITHSHA-384"] = "SHA-384withECDSA";
- algorithms["SHA384WITHECDSA"] = "SHA-384withECDSA";
- algorithms["SHA-384WITHECDSA"] = "SHA-384withECDSA";
- algorithms[X9ObjectIdentifiers.ECDsaWithSha384.Id] = "SHA-384withECDSA";
-
- algorithms["SHA512/ECDSA"] = "SHA-512withECDSA";
- algorithms["SHA-512/ECDSA"] = "SHA-512withECDSA";
- algorithms["ECDSAWITHSHA512"] = "SHA-512withECDSA";
- algorithms["ECDSAWITHSHA-512"] = "SHA-512withECDSA";
- algorithms["SHA512WITHECDSA"] = "SHA-512withECDSA";
- algorithms["SHA-512WITHECDSA"] = "SHA-512withECDSA";
- algorithms[X9ObjectIdentifiers.ECDsaWithSha512.Id] = "SHA-512withECDSA";
-
- algorithms["RIPEMD160/ECDSA"] = "RIPEMD160withECDSA";
- algorithms["ECDSAWITHRIPEMD160"] = "RIPEMD160withECDSA";
- algorithms["RIPEMD160WITHECDSA"] = "RIPEMD160withECDSA";
- algorithms[TeleTrusTObjectIdentifiers.ECSignWithRipeMD160.Id] = "RIPEMD160withECDSA";
-
- algorithms["GOST-3410"] = "GOST3410";
- algorithms["GOST-3410-94"] = "GOST3410";
- algorithms["GOST3411WITHGOST3410"] = "GOST3410";
- algorithms[CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94.Id] = "GOST3410";
-
- algorithms["ECGOST-3410"] = "ECGOST3410";
- algorithms["ECGOST-3410-2001"] = "ECGOST3410";
- algorithms["GOST3411WITHECGOST3410"] = "ECGOST3410";
- algorithms[CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001.Id] = "ECGOST3410";
-
-
-
- oids["MD2withRSA"] = PkcsObjectIdentifiers.MD2WithRsaEncryption;
- oids["MD4withRSA"] = PkcsObjectIdentifiers.MD4WithRsaEncryption;
- oids["MD5withRSA"] = PkcsObjectIdentifiers.MD5WithRsaEncryption;
-
- oids["SHA-1withRSA"] = PkcsObjectIdentifiers.Sha1WithRsaEncryption;
- oids["SHA-224withRSA"] = PkcsObjectIdentifiers.Sha224WithRsaEncryption;
- oids["SHA-256withRSA"] = PkcsObjectIdentifiers.Sha256WithRsaEncryption;
- oids["SHA-384withRSA"] = PkcsObjectIdentifiers.Sha384WithRsaEncryption;
- oids["SHA-512withRSA"] = PkcsObjectIdentifiers.Sha512WithRsaEncryption;
-
- oids["PSSwithRSA"] = PkcsObjectIdentifiers.IdRsassaPss;
- oids["SHA-1withRSAandMGF1"] = PkcsObjectIdentifiers.IdRsassaPss;
- oids["SHA-224withRSAandMGF1"] = PkcsObjectIdentifiers.IdRsassaPss;
- oids["SHA-256withRSAandMGF1"] = PkcsObjectIdentifiers.IdRsassaPss;
- oids["SHA-384withRSAandMGF1"] = PkcsObjectIdentifiers.IdRsassaPss;
- oids["SHA-512withRSAandMGF1"] = PkcsObjectIdentifiers.IdRsassaPss;
-
- oids["RIPEMD128withRSA"] = TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128;
- oids["RIPEMD160withRSA"] = TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160;
- oids["RIPEMD256withRSA"] = TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256;
-
- oids["SHA-1withDSA"] = X9ObjectIdentifiers.IdDsaWithSha1;
-
- oids["SHA-1withECDSA"] = X9ObjectIdentifiers.ECDsaWithSha1;
- oids["SHA-224withECDSA"] = X9ObjectIdentifiers.ECDsaWithSha224;
- oids["SHA-256withECDSA"] = X9ObjectIdentifiers.ECDsaWithSha256;
- oids["SHA-384withECDSA"] = X9ObjectIdentifiers.ECDsaWithSha384;
- oids["SHA-512withECDSA"] = X9ObjectIdentifiers.ECDsaWithSha512;
-
- oids["GOST3410"] = CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94;
- oids["ECGOST3410"] = CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001;
- }
-
- ///
- /// Returns an ObjectIdentifier for a given encoding.
- ///
- /// A string representation of the encoding.
- /// A DerObjectIdentifier, null if the OID is not available.
- // TODO Don't really want to support this
- public static DerObjectIdentifier GetObjectIdentifier(
- string mechanism)
- {
- if (mechanism == null)
- throw new ArgumentNullException("mechanism");
-
- mechanism = Platform.ToUpperInvariant(mechanism);
- string aliased = (string) algorithms[mechanism];
-
- if (aliased != null)
- mechanism = aliased;
-
- return (DerObjectIdentifier) oids[mechanism];
- }
-
- public static ICollection Algorithms
- {
- get { return oids.Keys; }
- }
-
- public static Asn1Encodable GetDefaultX509Parameters(
- DerObjectIdentifier id)
- {
- return GetDefaultX509Parameters(id.Id);
- }
-
- public static Asn1Encodable GetDefaultX509Parameters(
- string algorithm)
- {
- if (algorithm == null)
- throw new ArgumentNullException("algorithm");
-
- algorithm = Platform.ToUpperInvariant(algorithm);
-
- string mechanism = (string) algorithms[algorithm];
-
- if (mechanism == null)
- mechanism = algorithm;
-
- if (mechanism == "PSSwithRSA")
- {
- // TODO The Sha1Digest here is a default. In JCE version, the actual digest
- // to be used can be overridden by subsequent parameter settings.
- return GetPssX509Parameters("SHA-1");
- }
-
- if (Platform.EndsWith(mechanism, "withRSAandMGF1"))
- {
- string digestName = mechanism.Substring(0, mechanism.Length - "withRSAandMGF1".Length);
- return GetPssX509Parameters(digestName);
- }
-
- return DerNull.Instance;
- }
-
- private static Asn1Encodable GetPssX509Parameters(
- string digestName)
- {
- AlgorithmIdentifier hashAlgorithm = new AlgorithmIdentifier(
- DigestUtilities.GetObjectIdentifier(digestName), DerNull.Instance);
-
- // TODO Is it possible for the MGF hash alg to be different from the PSS one?
- AlgorithmIdentifier maskGenAlgorithm = new AlgorithmIdentifier(
- PkcsObjectIdentifiers.IdMgf1, hashAlgorithm);
-
- int saltLen = DigestUtilities.GetDigest(digestName).GetDigestSize();
- return new RsassaPssParameters(hashAlgorithm, maskGenAlgorithm,
- new DerInteger(saltLen), new DerInteger(1));
- }
-
- public static ISigner GetSigner(
- DerObjectIdentifier id)
- {
- return GetSigner(id.Id);
- }
-
- public static ISigner GetSigner(
- string algorithm)
- {
- if (algorithm == null)
- throw new ArgumentNullException("algorithm");
-
- algorithm = Platform.ToUpperInvariant(algorithm);
-
- string mechanism = (string) algorithms[algorithm];
-
- if (mechanism == null)
- mechanism = algorithm;
-
- if (mechanism.Equals("RSA"))
- {
- return (new RsaDigestSigner(new NullDigest(), (AlgorithmIdentifier)null));
- }
- if (mechanism.Equals("MD2withRSA"))
- {
- return (new RsaDigestSigner(new MD2Digest()));
- }
- if (mechanism.Equals("MD4withRSA"))
- {
- return (new RsaDigestSigner(new MD4Digest()));
- }
- if (mechanism.Equals("MD5withRSA"))
- {
- return (new RsaDigestSigner(new MD5Digest()));
- }
- if (mechanism.Equals("SHA-1withRSA"))
- {
- return (new RsaDigestSigner(new Sha1Digest()));
- }
- if (mechanism.Equals("SHA-224withRSA"))
- {
- return (new RsaDigestSigner(new Sha224Digest()));
- }
- if (mechanism.Equals("SHA-256withRSA"))
- {
- return (new RsaDigestSigner(new Sha256Digest()));
- }
- if (mechanism.Equals("SHA-384withRSA"))
- {
- return (new RsaDigestSigner(new Sha384Digest()));
- }
- if (mechanism.Equals("SHA-512withRSA"))
- {
- return (new RsaDigestSigner(new Sha512Digest()));
- }
- if (mechanism.Equals("RIPEMD128withRSA"))
- {
- return (new RsaDigestSigner(new RipeMD128Digest()));
- }
- if (mechanism.Equals("RIPEMD160withRSA"))
- {
- return (new RsaDigestSigner(new RipeMD160Digest()));
- }
- if (mechanism.Equals("RIPEMD256withRSA"))
- {
- return (new RsaDigestSigner(new RipeMD256Digest()));
- }
-
- if (mechanism.Equals("RAWRSASSA-PSS"))
- {
- // TODO Add support for other parameter settings
- return PssSigner.CreateRawSigner(new RsaBlindedEngine(), new Sha1Digest());
- }
- if (mechanism.Equals("PSSwithRSA"))
- {
- // TODO The Sha1Digest here is a default. In JCE version, the actual digest
- // to be used can be overridden by subsequent parameter settings.
- return (new PssSigner(new RsaBlindedEngine(), new Sha1Digest()));
- }
- if (mechanism.Equals("SHA-1withRSAandMGF1"))
- {
- return (new PssSigner(new RsaBlindedEngine(), new Sha1Digest()));
- }
- if (mechanism.Equals("SHA-224withRSAandMGF1"))
- {
- return (new PssSigner(new RsaBlindedEngine(), new Sha224Digest()));
- }
- if (mechanism.Equals("SHA-256withRSAandMGF1"))
- {
- return (new PssSigner(new RsaBlindedEngine(), new Sha256Digest()));
- }
- if (mechanism.Equals("SHA-384withRSAandMGF1"))
- {
- return (new PssSigner(new RsaBlindedEngine(), new Sha384Digest()));
- }
- if (mechanism.Equals("SHA-512withRSAandMGF1"))
- {
- return (new PssSigner(new RsaBlindedEngine(), new Sha512Digest()));
- }
-
- if (mechanism.Equals("NONEwithDSA"))
- {
- return (new DsaDigestSigner(new DsaSigner(), new NullDigest()));
- }
- if (mechanism.Equals("SHA-1withDSA"))
- {
- return (new DsaDigestSigner(new DsaSigner(), new Sha1Digest()));
- }
- if (mechanism.Equals("SHA-224withDSA"))
- {
- return (new DsaDigestSigner(new DsaSigner(), new Sha224Digest()));
- }
- if (mechanism.Equals("SHA-256withDSA"))
- {
- return (new DsaDigestSigner(new DsaSigner(), new Sha256Digest()));
- }
- if (mechanism.Equals("SHA-384withDSA"))
- {
- return (new DsaDigestSigner(new DsaSigner(), new Sha384Digest()));
- }
- if (mechanism.Equals("SHA-512withDSA"))
- {
- return (new DsaDigestSigner(new DsaSigner(), new Sha512Digest()));
- }
-
- if (mechanism.Equals("NONEwithECDSA"))
- {
- return (new DsaDigestSigner(new ECDsaSigner(), new NullDigest()));
- }
- if (mechanism.Equals("SHA-1withECDSA"))
- {
- return (new DsaDigestSigner(new ECDsaSigner(), new Sha1Digest()));
- }
- if (mechanism.Equals("SHA-224withECDSA"))
- {
- return (new DsaDigestSigner(new ECDsaSigner(), new Sha224Digest()));
- }
- if (mechanism.Equals("SHA-256withECDSA"))
- {
- return (new DsaDigestSigner(new ECDsaSigner(), new Sha256Digest()));
- }
- if (mechanism.Equals("SHA-384withECDSA"))
- {
- return (new DsaDigestSigner(new ECDsaSigner(), new Sha384Digest()));
- }
- if (mechanism.Equals("SHA-512withECDSA"))
- {
- return (new DsaDigestSigner(new ECDsaSigner(), new Sha512Digest()));
- }
-
- if (mechanism.Equals("RIPEMD160withECDSA"))
- {
- return (new DsaDigestSigner(new ECDsaSigner(), new RipeMD160Digest()));
- }
-
- if (mechanism.Equals("SHA1WITHECNR"))
- {
- return (new DsaDigestSigner(new ECNRSigner(), new Sha1Digest()));
- }
- if (mechanism.Equals("SHA224WITHECNR"))
- {
- return (new DsaDigestSigner(new ECNRSigner(), new Sha224Digest()));
- }
- if (mechanism.Equals("SHA256WITHECNR"))
- {
- return (new DsaDigestSigner(new ECNRSigner(), new Sha256Digest()));
- }
- if (mechanism.Equals("SHA384WITHECNR"))
- {
- return (new DsaDigestSigner(new ECNRSigner(), new Sha384Digest()));
- }
- if (mechanism.Equals("SHA512WITHECNR"))
- {
- return (new DsaDigestSigner(new ECNRSigner(), new Sha512Digest()));
- }
-
- if (mechanism.Equals("GOST3410"))
- {
- return new Gost3410DigestSigner(new Gost3410Signer(), new Gost3411Digest());
- }
- if (mechanism.Equals("ECGOST3410"))
- {
- return new Gost3410DigestSigner(new ECGost3410Signer(), new Gost3411Digest());
- }
-
- if (mechanism.Equals("SHA1WITHRSA/ISO9796-2"))
- {
- return new Iso9796d2Signer(new RsaBlindedEngine(), new Sha1Digest(), true);
- }
- if (mechanism.Equals("MD5WITHRSA/ISO9796-2"))
- {
- return new Iso9796d2Signer(new RsaBlindedEngine(), new MD5Digest(), true);
- }
- if (mechanism.Equals("RIPEMD160WITHRSA/ISO9796-2"))
- {
- return new Iso9796d2Signer(new RsaBlindedEngine(), new RipeMD160Digest(), true);
- }
-
- if (Platform.EndsWith(mechanism, "/X9.31"))
- {
- string x931 = mechanism.Substring(0, mechanism.Length - "/X9.31".Length);
- int withPos = Platform.IndexOf(x931, "WITH");
- if (withPos > 0)
- {
- int endPos = withPos + "WITH".Length;
-
- string digestName = x931.Substring(0, withPos);
- IDigest digest = DigestUtilities.GetDigest(digestName);
-
- string cipherName = x931.Substring(endPos, x931.Length - endPos);
- if (cipherName.Equals("RSA"))
- {
- IAsymmetricBlockCipher cipher = new RsaBlindedEngine();
- return new X931Signer(cipher, digest);
- }
- }
- }
-
- throw new SecurityUtilityException("Signer " + algorithm + " not recognised.");
- }
-
- public static string GetEncodingName(
- DerObjectIdentifier oid)
- {
- return (string) algorithms[oid.Id];
- }
- }
-}
diff --git a/BCCrypto/src/security/WrapperUtilities.cs b/BCCrypto/src/security/WrapperUtilities.cs
deleted file mode 100644
index c576320..0000000
--- a/BCCrypto/src/security/WrapperUtilities.cs
+++ /dev/null
@@ -1,153 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Kisa;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Ntt;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Engines;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Security
-{
- ///
- /// Utility class for creating IWrapper objects from their names/Oids
- ///
- public sealed class WrapperUtilities
- {
- private enum WrapAlgorithm { AESWRAP, CAMELLIAWRAP, DESEDEWRAP, RC2WRAP, SEEDWRAP,
- DESEDERFC3211WRAP, AESRFC3211WRAP, CAMELLIARFC3211WRAP };
-
- private WrapperUtilities()
- {
- }
-
- private static readonly IDictionary algorithms = Platform.CreateHashtable();
- //private static readonly IDictionary oids = Platform.CreateHashtable();
-
- static WrapperUtilities()
- {
- // Signal to obfuscation tools not to change enum constants
- ((WrapAlgorithm)Enums.GetArbitraryValue(typeof(WrapAlgorithm))).ToString();
-
- algorithms[NistObjectIdentifiers.IdAes128Wrap.Id] = "AESWRAP";
- algorithms[NistObjectIdentifiers.IdAes192Wrap.Id] = "AESWRAP";
- algorithms[NistObjectIdentifiers.IdAes256Wrap.Id] = "AESWRAP";
-
- algorithms[NttObjectIdentifiers.IdCamellia128Wrap.Id] = "CAMELLIAWRAP";
- algorithms[NttObjectIdentifiers.IdCamellia192Wrap.Id] = "CAMELLIAWRAP";
- algorithms[NttObjectIdentifiers.IdCamellia256Wrap.Id] = "CAMELLIAWRAP";
-
- algorithms[PkcsObjectIdentifiers.IdAlgCms3DesWrap.Id] = "DESEDEWRAP";
- algorithms["TDEAWRAP"] = "DESEDEWRAP";
-
- algorithms[PkcsObjectIdentifiers.IdAlgCmsRC2Wrap.Id] = "RC2WRAP";
-
- algorithms[KisaObjectIdentifiers.IdNpkiAppCmsSeedWrap.Id] = "SEEDWRAP";
- }
-
- public static IWrapper GetWrapper(
- DerObjectIdentifier oid)
- {
- return GetWrapper(oid.Id);
- }
-
- public static IWrapper GetWrapper(
- string algorithm)
- {
- string upper = Platform.ToUpperInvariant(algorithm);
- string mechanism = (string)algorithms[upper];
-
- if (mechanism == null)
- {
- mechanism = upper;
- }
-
- try
- {
- WrapAlgorithm wrapAlgorithm = (WrapAlgorithm)Enums.GetEnumValue(
- typeof(WrapAlgorithm), mechanism);
-
- switch (wrapAlgorithm)
- {
- case WrapAlgorithm.AESWRAP: return new AesWrapEngine();
- case WrapAlgorithm.CAMELLIAWRAP: return new CamelliaWrapEngine();
- case WrapAlgorithm.DESEDEWRAP: return new DesEdeWrapEngine();
- case WrapAlgorithm.RC2WRAP: return new RC2WrapEngine();
- case WrapAlgorithm.SEEDWRAP: return new SeedWrapEngine();
- case WrapAlgorithm.DESEDERFC3211WRAP: return new Rfc3211WrapEngine(new DesEdeEngine());
- case WrapAlgorithm.AESRFC3211WRAP: return new Rfc3211WrapEngine(new AesEngine());
- case WrapAlgorithm.CAMELLIARFC3211WRAP: return new Rfc3211WrapEngine(new CamelliaEngine());
- }
- }
- catch (ArgumentException)
- {
- }
-
- // Create an IBufferedCipher and use it as IWrapper (via BufferedCipherWrapper)
- IBufferedCipher blockCipher = CipherUtilities.GetCipher(algorithm);
-
- if (blockCipher != null)
- return new BufferedCipherWrapper(blockCipher);
-
- throw new SecurityUtilityException("Wrapper " + algorithm + " not recognised.");
- }
-
- public static string GetAlgorithmName(
- DerObjectIdentifier oid)
- {
- return (string) algorithms[oid.Id];
- }
-
- private class BufferedCipherWrapper
- : IWrapper
- {
- private readonly IBufferedCipher cipher;
- private bool forWrapping;
-
- public BufferedCipherWrapper(
- IBufferedCipher cipher)
- {
- this.cipher = cipher;
- }
-
- public string AlgorithmName
- {
- get { return cipher.AlgorithmName; }
- }
-
- public void Init(
- bool forWrapping,
- ICipherParameters parameters)
- {
- this.forWrapping = forWrapping;
-
- cipher.Init(forWrapping, parameters);
- }
-
- public byte[] Wrap(
- byte[] input,
- int inOff,
- int length)
- {
- if (!forWrapping)
- throw new InvalidOperationException("Not initialised for wrapping");
-
- return cipher.DoFinal(input, inOff, length);
- }
-
- public byte[] Unwrap(
- byte[] input,
- int inOff,
- int length)
- {
- if (forWrapping)
- throw new InvalidOperationException("Not initialised for unwrapping");
-
- return cipher.DoFinal(input, inOff, length);
- }
- }
- }
-}
diff --git a/BCCrypto/src/security/cert/CertificateEncodingException.cs b/BCCrypto/src/security/cert/CertificateEncodingException.cs
deleted file mode 100644
index ab9024f..0000000
--- a/BCCrypto/src/security/cert/CertificateEncodingException.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security.Certificates
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class CertificateEncodingException : CertificateException
- {
- public CertificateEncodingException() : base() { }
- public CertificateEncodingException(string msg) : base(msg) { }
- public CertificateEncodingException(string msg, Exception e) : base(msg, e) { }
- }
-}
diff --git a/BCCrypto/src/security/cert/CertificateException.cs b/BCCrypto/src/security/cert/CertificateException.cs
deleted file mode 100644
index 4bbaccf..0000000
--- a/BCCrypto/src/security/cert/CertificateException.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security.Certificates
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class CertificateException : GeneralSecurityException
- {
- public CertificateException() : base() { }
- public CertificateException(string message) : base(message) { }
- public CertificateException(string message, Exception exception) : base(message, exception) { }
- }
-}
diff --git a/BCCrypto/src/security/cert/CertificateExpiredException.cs b/BCCrypto/src/security/cert/CertificateExpiredException.cs
deleted file mode 100644
index 864fb85..0000000
--- a/BCCrypto/src/security/cert/CertificateExpiredException.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security.Certificates
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class CertificateExpiredException : CertificateException
- {
- public CertificateExpiredException() : base() { }
- public CertificateExpiredException(string message) : base(message) { }
- public CertificateExpiredException(string message, Exception exception) : base(message, exception) { }
- }
-}
diff --git a/BCCrypto/src/security/cert/CertificateNotYetValidException.cs b/BCCrypto/src/security/cert/CertificateNotYetValidException.cs
deleted file mode 100644
index 02112be..0000000
--- a/BCCrypto/src/security/cert/CertificateNotYetValidException.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security.Certificates
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class CertificateNotYetValidException : CertificateException
- {
- public CertificateNotYetValidException() : base() { }
- public CertificateNotYetValidException(string message) : base(message) { }
- public CertificateNotYetValidException(string message, Exception exception) : base(message, exception) { }
- }
-}
diff --git a/BCCrypto/src/security/cert/CertificateParsingException.cs b/BCCrypto/src/security/cert/CertificateParsingException.cs
deleted file mode 100644
index ae909ca..0000000
--- a/BCCrypto/src/security/cert/CertificateParsingException.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security.Certificates
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class CertificateParsingException : CertificateException
- {
- public CertificateParsingException() : base() { }
- public CertificateParsingException(string message) : base(message) { }
- public CertificateParsingException(string message, Exception exception) : base(message, exception) { }
- }
-}
diff --git a/BCCrypto/src/security/cert/CrlException.cs b/BCCrypto/src/security/cert/CrlException.cs
deleted file mode 100644
index fe9807e..0000000
--- a/BCCrypto/src/security/cert/CrlException.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Security.Certificates
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class CrlException : GeneralSecurityException
- {
- public CrlException() : base() { }
- public CrlException(string msg) : base(msg) {}
- public CrlException(string msg, Exception e) : base(msg, e) {}
- }
-}
diff --git a/BCCrypto/src/tsp/GenTimeAccuracy.cs b/BCCrypto/src/tsp/GenTimeAccuracy.cs
deleted file mode 100644
index 8a2f299..0000000
--- a/BCCrypto/src/tsp/GenTimeAccuracy.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Tsp;
-
-namespace Org.BouncyCastle.Tsp
-{
- public class GenTimeAccuracy
- {
- private Accuracy accuracy;
-
- public GenTimeAccuracy(
- Accuracy accuracy)
- {
- this.accuracy = accuracy;
- }
-
- public int Seconds { get { return GetTimeComponent(accuracy.Seconds); } }
-
- public int Millis { get { return GetTimeComponent(accuracy.Millis); } }
-
- public int Micros { get { return GetTimeComponent(accuracy.Micros); } }
-
- private int GetTimeComponent(
- DerInteger time)
- {
- return time == null ? 0 : time.Value.IntValue;
- }
-
- public override string ToString()
- {
- return Seconds + "." + Millis.ToString("000") + Micros.ToString("000");
- }
- }
-}
diff --git a/BCCrypto/src/tsp/TSPAlgorithms.cs b/BCCrypto/src/tsp/TSPAlgorithms.cs
deleted file mode 100644
index e3dfc79..0000000
--- a/BCCrypto/src/tsp/TSPAlgorithms.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-using System.Collections;
-
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Tsp
-{
- /**
- * Recognised hash algorithms for the time stamp protocol.
- */
- public abstract class TspAlgorithms
- {
- public static readonly string MD5 = PkcsObjectIdentifiers.MD5.Id;
-
- public static readonly string Sha1 = OiwObjectIdentifiers.IdSha1.Id;
-
- public static readonly string Sha224 = NistObjectIdentifiers.IdSha224.Id;
- public static readonly string Sha256 = NistObjectIdentifiers.IdSha256.Id;
- public static readonly string Sha384 = NistObjectIdentifiers.IdSha384.Id;
- public static readonly string Sha512 = NistObjectIdentifiers.IdSha512.Id;
-
- public static readonly string RipeMD128 = TeleTrusTObjectIdentifiers.RipeMD128.Id;
- public static readonly string RipeMD160 = TeleTrusTObjectIdentifiers.RipeMD160.Id;
- public static readonly string RipeMD256 = TeleTrusTObjectIdentifiers.RipeMD256.Id;
-
- public static readonly string Gost3411 = CryptoProObjectIdentifiers.GostR3411.Id;
-
- public static readonly IList Allowed;
-
- static TspAlgorithms()
- {
- string[] algs = new string[]
- {
- Gost3411, MD5, Sha1, Sha224, Sha256, Sha384, Sha512, RipeMD128, RipeMD160, RipeMD256
- };
-
- Allowed = Platform.CreateArrayList();
- foreach (string alg in algs)
- {
- Allowed.Add(alg);
- }
- }
- }
-}
diff --git a/BCCrypto/src/tsp/TSPException.cs b/BCCrypto/src/tsp/TSPException.cs
deleted file mode 100644
index 0f29b12..0000000
--- a/BCCrypto/src/tsp/TSPException.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Tsp
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class TspException
- : Exception
- {
- public TspException()
- {
- }
-
- public TspException(
- string message)
- : base(message)
- {
- }
-
- public TspException(
- string message,
- Exception e)
- : base(message, e)
- {
- }
- }
-}
diff --git a/BCCrypto/src/tsp/TSPUtil.cs b/BCCrypto/src/tsp/TSPUtil.cs
deleted file mode 100644
index 1026914..0000000
--- a/BCCrypto/src/tsp/TSPUtil.cs
+++ /dev/null
@@ -1,202 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Cms;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Tsp
-{
- public class TspUtil
- {
- private static ISet EmptySet = CollectionUtilities.ReadOnly(new HashSet());
- private static IList EmptyList = CollectionUtilities.ReadOnly(Platform.CreateArrayList());
-
- private static readonly IDictionary digestLengths = Platform.CreateHashtable();
- private static readonly IDictionary digestNames = Platform.CreateHashtable();
-
- static TspUtil()
- {
- digestLengths.Add(PkcsObjectIdentifiers.MD5.Id, 16);
- digestLengths.Add(OiwObjectIdentifiers.IdSha1.Id, 20);
- digestLengths.Add(NistObjectIdentifiers.IdSha224.Id, 28);
- digestLengths.Add(NistObjectIdentifiers.IdSha256.Id, 32);
- digestLengths.Add(NistObjectIdentifiers.IdSha384.Id, 48);
- digestLengths.Add(NistObjectIdentifiers.IdSha512.Id, 64);
- digestLengths.Add(TeleTrusTObjectIdentifiers.RipeMD128.Id, 16);
- digestLengths.Add(TeleTrusTObjectIdentifiers.RipeMD160.Id, 20);
- digestLengths.Add(TeleTrusTObjectIdentifiers.RipeMD256.Id, 32);
- digestLengths.Add(CryptoProObjectIdentifiers.GostR3411.Id, 32);
-
- digestNames.Add(PkcsObjectIdentifiers.MD5.Id, "MD5");
- digestNames.Add(OiwObjectIdentifiers.IdSha1.Id, "SHA1");
- digestNames.Add(NistObjectIdentifiers.IdSha224.Id, "SHA224");
- digestNames.Add(NistObjectIdentifiers.IdSha256.Id, "SHA256");
- digestNames.Add(NistObjectIdentifiers.IdSha384.Id, "SHA384");
- digestNames.Add(NistObjectIdentifiers.IdSha512.Id, "SHA512");
- digestNames.Add(PkcsObjectIdentifiers.Sha1WithRsaEncryption.Id, "SHA1");
- digestNames.Add(PkcsObjectIdentifiers.Sha224WithRsaEncryption.Id, "SHA224");
- digestNames.Add(PkcsObjectIdentifiers.Sha256WithRsaEncryption.Id, "SHA256");
- digestNames.Add(PkcsObjectIdentifiers.Sha384WithRsaEncryption.Id, "SHA384");
- digestNames.Add(PkcsObjectIdentifiers.Sha512WithRsaEncryption.Id, "SHA512");
- digestNames.Add(TeleTrusTObjectIdentifiers.RipeMD128.Id, "RIPEMD128");
- digestNames.Add(TeleTrusTObjectIdentifiers.RipeMD160.Id, "RIPEMD160");
- digestNames.Add(TeleTrusTObjectIdentifiers.RipeMD256.Id, "RIPEMD256");
- digestNames.Add(CryptoProObjectIdentifiers.GostR3411.Id, "GOST3411");
- }
-
-
- /**
- * Fetches the signature time-stamp attributes from a SignerInformation object.
- * Checks that the MessageImprint for each time-stamp matches the signature field.
- * (see RFC 3161 Appendix A).
- *
- * @param signerInfo a SignerInformation to search for time-stamps
- * @return a collection of TimeStampToken objects
- * @throws TSPValidationException
- */
- public static ICollection GetSignatureTimestamps(
- SignerInformation signerInfo)
- {
- IList timestamps = Platform.CreateArrayList();
-
- Asn1.Cms.AttributeTable unsignedAttrs = signerInfo.UnsignedAttributes;
- if (unsignedAttrs != null)
- {
- foreach (Asn1.Cms.Attribute tsAttr in unsignedAttrs.GetAll(
- PkcsObjectIdentifiers.IdAASignatureTimeStampToken))
- {
- foreach (Asn1Encodable asn1 in tsAttr.AttrValues)
- {
- try
- {
- Asn1.Cms.ContentInfo contentInfo = Asn1.Cms.ContentInfo.GetInstance(
- asn1.ToAsn1Object());
- TimeStampToken timeStampToken = new TimeStampToken(contentInfo);
- TimeStampTokenInfo tstInfo = timeStampToken.TimeStampInfo;
-
- byte[] expectedDigest = DigestUtilities.CalculateDigest(
- GetDigestAlgName(tstInfo.MessageImprintAlgOid),
- signerInfo.GetSignature());
-
- if (!Arrays.ConstantTimeAreEqual(expectedDigest, tstInfo.GetMessageImprintDigest()))
- throw new TspValidationException("Incorrect digest in message imprint");
-
- timestamps.Add(timeStampToken);
- }
- catch (SecurityUtilityException)
- {
- throw new TspValidationException("Unknown hash algorithm specified in timestamp");
- }
- catch (Exception)
- {
- throw new TspValidationException("Timestamp could not be parsed");
- }
- }
- }
- }
-
- return timestamps;
- }
-
- /**
- * Validate the passed in certificate as being of the correct type to be used
- * for time stamping. To be valid it must have an ExtendedKeyUsage extension
- * which has a key purpose identifier of id-kp-timeStamping.
- *
- * @param cert the certificate of interest.
- * @throws TspValidationException if the certicate fails on one of the check points.
- */
- public static void ValidateCertificate(
- X509Certificate cert)
- {
- if (cert.Version != 3)
- throw new ArgumentException("Certificate must have an ExtendedKeyUsage extension.");
-
- Asn1OctetString ext = cert.GetExtensionValue(X509Extensions.ExtendedKeyUsage);
- if (ext == null)
- throw new TspValidationException("Certificate must have an ExtendedKeyUsage extension.");
-
- if (!cert.GetCriticalExtensionOids().Contains(X509Extensions.ExtendedKeyUsage.Id))
- throw new TspValidationException("Certificate must have an ExtendedKeyUsage extension marked as critical.");
-
- try
- {
- ExtendedKeyUsage extKey = ExtendedKeyUsage.GetInstance(
- Asn1Object.FromByteArray(ext.GetOctets()));
-
- if (!extKey.HasKeyPurposeId(KeyPurposeID.IdKPTimeStamping) || extKey.Count != 1)
- throw new TspValidationException("ExtendedKeyUsage not solely time stamping.");
- }
- catch (IOException)
- {
- throw new TspValidationException("cannot process ExtendedKeyUsage extension");
- }
- }
-
- ///
- /// Return the digest algorithm using one of the standard JCA string
- /// representations rather than the algorithm identifier (if possible).
- ///
- internal static string GetDigestAlgName(
- string digestAlgOID)
- {
- string digestName = (string) digestNames[digestAlgOID];
-
- return digestName != null ? digestName : digestAlgOID;
- }
-
- internal static int GetDigestLength(
- string digestAlgOID)
- {
- if (!digestLengths.Contains(digestAlgOID))
- throw new TspException("digest algorithm cannot be found.");
-
- return (int)digestLengths[digestAlgOID];
- }
-
- internal static IDigest CreateDigestInstance(
- String digestAlgOID)
- {
- string digestName = GetDigestAlgName(digestAlgOID);
-
- return DigestUtilities.GetDigest(digestName);
- }
-
- internal static ISet GetCriticalExtensionOids(X509Extensions extensions)
- {
- if (extensions == null)
- return EmptySet;
-
- return CollectionUtilities.ReadOnly(new HashSet(extensions.GetCriticalExtensionOids()));
- }
-
- internal static ISet GetNonCriticalExtensionOids(X509Extensions extensions)
- {
- if (extensions == null)
- return EmptySet;
-
- // TODO: should probably produce a set that imposes correct ordering
- return CollectionUtilities.ReadOnly(new HashSet(extensions.GetNonCriticalExtensionOids()));
- }
-
- internal static IList GetExtensionOids(X509Extensions extensions)
- {
- if (extensions == null)
- return EmptyList;
-
- return CollectionUtilities.ReadOnly(Platform.CreateArrayList(extensions.GetExtensionOids()));
- }
- }
-}
diff --git a/BCCrypto/src/tsp/TSPValidationException.cs b/BCCrypto/src/tsp/TSPValidationException.cs
deleted file mode 100644
index 80f6420..0000000
--- a/BCCrypto/src/tsp/TSPValidationException.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Tsp
-{
- /**
- * Exception thrown if a TSP request or response fails to validate.
- *
- * If a failure code is associated with the exception it can be retrieved using
- * the getFailureCode() method.
- */
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class TspValidationException
- : TspException
- {
- private int failureCode;
-
- public TspValidationException(
- string message)
- : base(message)
- {
- this.failureCode = -1;
- }
-
- public TspValidationException(
- string message,
- int failureCode)
- : base(message)
- {
- this.failureCode = failureCode;
- }
-
- /**
- * Return the failure code associated with this exception - if one is set.
- *
- * @return the failure code if set, -1 otherwise.
- */
- public int FailureCode
- {
- get { return failureCode; }
- }
- }
-}
diff --git a/BCCrypto/src/tsp/TimeStampRequest.cs b/BCCrypto/src/tsp/TimeStampRequest.cs
deleted file mode 100644
index 0b41ade..0000000
--- a/BCCrypto/src/tsp/TimeStampRequest.cs
+++ /dev/null
@@ -1,186 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cmp;
-using Org.BouncyCastle.Asn1.Tsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.X509;
-
-namespace Org.BouncyCastle.Tsp
-{
- /**
- * Base class for an RFC 3161 Time Stamp Request.
- */
- public class TimeStampRequest
- : X509ExtensionBase
- {
- private TimeStampReq req;
- private X509Extensions extensions;
-
- public TimeStampRequest(
- TimeStampReq req)
- {
- this.req = req;
- this.extensions = req.Extensions;
- }
-
- /**
- * Create a TimeStampRequest from the past in byte array.
- *
- * @param req byte array containing the request.
- * @throws IOException if the request is malformed.
- */
- public TimeStampRequest(
- byte[] req)
- : this(new Asn1InputStream(req))
- {
- }
-
- /**
- * Create a TimeStampRequest from the past in input stream.
- *
- * @param in input stream containing the request.
- * @throws IOException if the request is malformed.
- */
- public TimeStampRequest(
- Stream input)
- : this(new Asn1InputStream(input))
- {
- }
-
- private TimeStampRequest(
- Asn1InputStream str)
- {
- try
- {
- this.req = TimeStampReq.GetInstance(str.ReadObject());
- }
- catch (InvalidCastException e)
- {
- throw new IOException("malformed request: " + e);
- }
- catch (ArgumentException e)
- {
- throw new IOException("malformed request: " + e);
- }
- }
-
- public int Version
- {
- get { return req.Version.Value.IntValue; }
- }
-
- public string MessageImprintAlgOid
- {
- get { return req.MessageImprint.HashAlgorithm.Algorithm.Id; }
- }
-
- public byte[] GetMessageImprintDigest()
- {
- return req.MessageImprint.GetHashedMessage();
- }
-
- public string ReqPolicy
- {
- get
- {
- return req.ReqPolicy == null
- ? null
- : req.ReqPolicy.Id;
- }
- }
-
- public BigInteger Nonce
- {
- get
- {
- return req.Nonce == null
- ? null
- : req.Nonce.Value;
- }
- }
-
- public bool CertReq
- {
- get
- {
- return req.CertReq == null
- ? false
- : req.CertReq.IsTrue;
- }
- }
-
- /**
- * Validate the timestamp request, checking the digest to see if it is of an
- * accepted type and whether it is of the correct length for the algorithm specified.
- *
- * @param algorithms a set of string OIDS giving accepted algorithms.
- * @param policies if non-null a set of policies we are willing to sign under.
- * @param extensions if non-null a set of extensions we are willing to accept.
- * @throws TspException if the request is invalid, or processing fails.
- */
- public void Validate(
- IList algorithms,
- IList policies,
- IList extensions)
- {
- if (!algorithms.Contains(this.MessageImprintAlgOid))
- throw new TspValidationException("request contains unknown algorithm", PkiFailureInfo.BadAlg);
-
- if (policies != null && this.ReqPolicy != null && !policies.Contains(this.ReqPolicy))
- throw new TspValidationException("request contains unknown policy", PkiFailureInfo.UnacceptedPolicy);
-
- if (this.Extensions != null && extensions != null)
- {
- foreach (DerObjectIdentifier oid in this.Extensions.ExtensionOids)
- {
- if (!extensions.Contains(oid.Id))
- throw new TspValidationException("request contains unknown extension", PkiFailureInfo.UnacceptedExtension);
- }
- }
-
- int digestLength = TspUtil.GetDigestLength(this.MessageImprintAlgOid);
-
- if (digestLength != this.GetMessageImprintDigest().Length)
- throw new TspValidationException("imprint digest the wrong length", PkiFailureInfo.BadDataFormat);
- }
-
- /**
- * return the ASN.1 encoded representation of this object.
- */
- public byte[] GetEncoded()
- {
- return req.GetEncoded();
- }
-
- internal X509Extensions Extensions
- {
- get { return req.Extensions; }
- }
-
- public virtual bool HasExtensions
- {
- get { return extensions != null; }
- }
-
- public virtual X509Extension GetExtension(DerObjectIdentifier oid)
- {
- return extensions == null ? null : extensions.GetExtension(oid);
- }
-
- public virtual IList GetExtensionOids()
- {
- return TspUtil.GetExtensionOids(extensions);
- }
-
- protected override X509Extensions GetX509Extensions()
- {
- return Extensions;
- }
- }
-}
diff --git a/BCCrypto/src/tsp/TimeStampRequestGenerator.cs b/BCCrypto/src/tsp/TimeStampRequestGenerator.cs
deleted file mode 100644
index 2c698e4..0000000
--- a/BCCrypto/src/tsp/TimeStampRequestGenerator.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Tsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Tsp
-{
- /**
- * Generator for RFC 3161 Time Stamp Request objects.
- */
- public class TimeStampRequestGenerator
- {
- private DerObjectIdentifier reqPolicy;
-
- private DerBoolean certReq;
-
- private IDictionary extensions = Platform.CreateHashtable();
- private IList extOrdering = Platform.CreateArrayList();
-
- public void SetReqPolicy(
- string reqPolicy)
- {
- this.reqPolicy = new DerObjectIdentifier(reqPolicy);
- }
-
- public void SetCertReq(
- bool certReq)
- {
- this.certReq = DerBoolean.GetInstance(certReq);
- }
-
- /**
- * add a given extension field for the standard extensions tag (tag 3)
- * @throws IOException
- */
- [Obsolete("Use method taking DerObjectIdentifier")]
- public void AddExtension(
- string oid,
- bool critical,
- Asn1Encodable value)
- {
- this.AddExtension(oid, critical, value.GetEncoded());
- }
-
- /**
- * add a given extension field for the standard extensions tag
- * The value parameter becomes the contents of the octet string associated
- * with the extension.
- */
- [Obsolete("Use method taking DerObjectIdentifier")]
- public void AddExtension(
- string oid,
- bool critical,
- byte[] value)
- {
- DerObjectIdentifier derOid = new DerObjectIdentifier(oid);
- extensions[derOid] = new X509Extension(critical, new DerOctetString(value));
- extOrdering.Add(derOid);
- }
-
- /**
- * add a given extension field for the standard extensions tag (tag 3)
- * @throws IOException
- */
- public virtual void AddExtension(
- DerObjectIdentifier oid,
- bool critical,
- Asn1Encodable extValue)
- {
- this.AddExtension(oid, critical, extValue.GetEncoded());
- }
-
- /**
- * add a given extension field for the standard extensions tag
- * The value parameter becomes the contents of the octet string associated
- * with the extension.
- */
- public virtual void AddExtension(
- DerObjectIdentifier oid,
- bool critical,
- byte[] extValue)
- {
- extensions.Add(oid, new X509Extension(critical, new DerOctetString(extValue)));
- extOrdering.Add(oid);
- }
-
- public TimeStampRequest Generate(
- string digestAlgorithm,
- byte[] digest)
- {
- return this.Generate(digestAlgorithm, digest, null);
- }
-
- public TimeStampRequest Generate(
- string digestAlgorithmOid,
- byte[] digest,
- BigInteger nonce)
- {
- if (digestAlgorithmOid == null)
- {
- throw new ArgumentException("No digest algorithm specified");
- }
-
- DerObjectIdentifier digestAlgOid = new DerObjectIdentifier(digestAlgorithmOid);
-
- AlgorithmIdentifier algID = new AlgorithmIdentifier(digestAlgOid, DerNull.Instance);
- MessageImprint messageImprint = new MessageImprint(algID, digest);
-
- X509Extensions ext = null;
-
- if (extOrdering.Count != 0)
- {
- ext = new X509Extensions(extOrdering, extensions);
- }
-
- DerInteger derNonce = nonce == null
- ? null
- : new DerInteger(nonce);
-
- return new TimeStampRequest(
- new TimeStampReq(messageImprint, reqPolicy, derNonce, certReq, ext));
- }
-
- public virtual TimeStampRequest Generate(DerObjectIdentifier digestAlgorithm, byte[] digest)
- {
- return Generate(digestAlgorithm.Id, digest);
- }
-
- public virtual TimeStampRequest Generate(DerObjectIdentifier digestAlgorithm, byte[] digest, BigInteger nonce)
- {
- return Generate(digestAlgorithm.Id, digest, nonce);
- }
- }
-}
diff --git a/BCCrypto/src/tsp/TimeStampResponse.cs b/BCCrypto/src/tsp/TimeStampResponse.cs
deleted file mode 100644
index 0695211..0000000
--- a/BCCrypto/src/tsp/TimeStampResponse.cs
+++ /dev/null
@@ -1,184 +0,0 @@
-using System;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cmp;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.Tsp;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.Tsp
-{
- /**
- * Base class for an RFC 3161 Time Stamp Response object.
- */
- public class TimeStampResponse
- {
- private TimeStampResp resp;
- private TimeStampToken timeStampToken;
-
- public TimeStampResponse(
- TimeStampResp resp)
- {
- this.resp = resp;
-
- if (resp.TimeStampToken != null)
- {
- timeStampToken = new TimeStampToken(resp.TimeStampToken);
- }
- }
-
- /**
- * Create a TimeStampResponse from a byte array containing an ASN.1 encoding.
- *
- * @param resp the byte array containing the encoded response.
- * @throws TspException if the response is malformed.
- * @throws IOException if the byte array doesn't represent an ASN.1 encoding.
- */
- public TimeStampResponse(
- byte[] resp)
- : this(readTimeStampResp(new Asn1InputStream(resp)))
- {
- }
-
- /**
- * Create a TimeStampResponse from an input stream containing an ASN.1 encoding.
- *
- * @param input the input stream containing the encoded response.
- * @throws TspException if the response is malformed.
- * @throws IOException if the stream doesn't represent an ASN.1 encoding.
- */
- public TimeStampResponse(
- Stream input)
- : this(readTimeStampResp(new Asn1InputStream(input)))
- {
- }
-
- private static TimeStampResp readTimeStampResp(
- Asn1InputStream input)
- {
- try
- {
- return TimeStampResp.GetInstance(input.ReadObject());
- }
- catch (ArgumentException e)
- {
- throw new TspException("malformed timestamp response: " + e, e);
- }
- catch (InvalidCastException e)
- {
- throw new TspException("malformed timestamp response: " + e, e);
- }
- }
-
- public int Status
- {
- get { return resp.Status.Status.IntValue; }
- }
-
- public string GetStatusString()
- {
- if (resp.Status.StatusString == null)
- {
- return null;
- }
-
- StringBuilder statusStringBuf = new StringBuilder();
- PkiFreeText text = resp.Status.StatusString;
- for (int i = 0; i != text.Count; i++)
- {
- statusStringBuf.Append(text[i].GetString());
- }
-
- return statusStringBuf.ToString();
- }
-
- public PkiFailureInfo GetFailInfo()
- {
- if (resp.Status.FailInfo == null)
- {
- return null;
- }
-
- return new PkiFailureInfo(resp.Status.FailInfo);
- }
-
- public TimeStampToken TimeStampToken
- {
- get { return timeStampToken; }
- }
-
- /**
- * Check this response against to see if it a well formed response for
- * the passed in request. Validation will include checking the time stamp
- * token if the response status is GRANTED or GRANTED_WITH_MODS.
- *
- * @param request the request to be checked against
- * @throws TspException if the request can not match this response.
- */
- public void Validate(
- TimeStampRequest request)
- {
- TimeStampToken tok = this.TimeStampToken;
-
- if (tok != null)
- {
- TimeStampTokenInfo tstInfo = tok.TimeStampInfo;
-
- if (request.Nonce != null && !request.Nonce.Equals(tstInfo.Nonce))
- {
- throw new TspValidationException("response contains wrong nonce value.");
- }
-
- if (this.Status != (int) PkiStatus.Granted && this.Status != (int) PkiStatus.GrantedWithMods)
- {
- throw new TspValidationException("time stamp token found in failed request.");
- }
-
- if (!Arrays.ConstantTimeAreEqual(request.GetMessageImprintDigest(), tstInfo.GetMessageImprintDigest()))
- {
- throw new TspValidationException("response for different message imprint digest.");
- }
-
- if (!tstInfo.MessageImprintAlgOid.Equals(request.MessageImprintAlgOid))
- {
- throw new TspValidationException("response for different message imprint algorithm.");
- }
-
- Asn1.Cms.Attribute scV1 = tok.SignedAttributes[PkcsObjectIdentifiers.IdAASigningCertificate];
- Asn1.Cms.Attribute scV2 = tok.SignedAttributes[PkcsObjectIdentifiers.IdAASigningCertificateV2];
-
- if (scV1 == null && scV2 == null)
- {
- throw new TspValidationException("no signing certificate attribute present.");
- }
-
- if (scV1 != null && scV2 != null)
- {
- /*
- * RFC 5035 5.4. If both attributes exist in a single message,
- * they are independently evaluated.
- */
- }
-
- if (request.ReqPolicy != null && !request.ReqPolicy.Equals(tstInfo.Policy))
- {
- throw new TspValidationException("TSA policy wrong for request.");
- }
- }
- else if (this.Status == (int) PkiStatus.Granted || this.Status == (int) PkiStatus.GrantedWithMods)
- {
- throw new TspValidationException("no time stamp token found and one expected.");
- }
- }
-
- /**
- * return the ASN.1 encoded representation of this object.
- */
- public byte[] GetEncoded()
- {
- return resp.GetEncoded();
- }
- }
-}
diff --git a/BCCrypto/src/tsp/TimeStampResponseGenerator.cs b/BCCrypto/src/tsp/TimeStampResponseGenerator.cs
deleted file mode 100644
index b596f8d..0000000
--- a/BCCrypto/src/tsp/TimeStampResponseGenerator.cs
+++ /dev/null
@@ -1,209 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Cmp;
-using Org.BouncyCastle.Asn1.Cms;
-using Org.BouncyCastle.Asn1.Tsp;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Tsp
-{
- /**
- * Generator for RFC 3161 Time Stamp Responses.
- */
- public class TimeStampResponseGenerator
- {
- private PkiStatus status;
-
- private Asn1EncodableVector statusStrings;
-
- private int failInfo;
- private TimeStampTokenGenerator tokenGenerator;
- private IList acceptedAlgorithms;
- private IList acceptedPolicies;
- private IList acceptedExtensions;
-
- public TimeStampResponseGenerator(
- TimeStampTokenGenerator tokenGenerator,
- IList acceptedAlgorithms)
- : this(tokenGenerator, acceptedAlgorithms, null, null)
- {
- }
-
- public TimeStampResponseGenerator(
- TimeStampTokenGenerator tokenGenerator,
- IList acceptedAlgorithms,
- IList acceptedPolicy)
- : this(tokenGenerator, acceptedAlgorithms, acceptedPolicy, null)
- {
- }
-
- public TimeStampResponseGenerator(
- TimeStampTokenGenerator tokenGenerator,
- IList acceptedAlgorithms,
- IList acceptedPolicies,
- IList acceptedExtensions)
- {
- this.tokenGenerator = tokenGenerator;
- this.acceptedAlgorithms = acceptedAlgorithms;
- this.acceptedPolicies = acceptedPolicies;
- this.acceptedExtensions = acceptedExtensions;
-
- statusStrings = new Asn1EncodableVector();
- }
-
- private void AddStatusString(string statusString)
- {
- statusStrings.Add(new DerUtf8String(statusString));
- }
-
- private void SetFailInfoField(int field)
- {
- failInfo |= field;
- }
-
- private PkiStatusInfo GetPkiStatusInfo()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(
- new DerInteger((int)status));
-
- if (statusStrings.Count > 0)
- {
- v.Add(new PkiFreeText(new DerSequence(statusStrings)));
- }
-
- if (failInfo != 0)
- {
- v.Add(new FailInfo(failInfo));
- }
-
- return new PkiStatusInfo(new DerSequence(v));
- }
-
- public TimeStampResponse Generate(
- TimeStampRequest request,
- BigInteger serialNumber,
- DateTime genTime)
- {
- return Generate(request, serialNumber, new DateTimeObject(genTime));
- }
-
- /**
- * Return an appropriate TimeStampResponse.
- *
- * If genTime is null a timeNotAvailable error response will be returned.
- *
- * @param request the request this response is for.
- * @param serialNumber serial number for the response token.
- * @param genTime generation time for the response token.
- * @param provider provider to use for signature calculation.
- * @return
- * @throws NoSuchAlgorithmException
- * @throws NoSuchProviderException
- * @throws TSPException
- *
- */
- public TimeStampResponse Generate(
- TimeStampRequest request,
- BigInteger serialNumber,
- DateTimeObject genTime)
- {
- TimeStampResp resp;
-
- try
- {
- if (genTime == null)
- throw new TspValidationException("The time source is not available.",
- PkiFailureInfo.TimeNotAvailable);
-
- request.Validate(acceptedAlgorithms, acceptedPolicies, acceptedExtensions);
-
- this.status = PkiStatus.Granted;
- this.AddStatusString("Operation Okay");
-
- PkiStatusInfo pkiStatusInfo = GetPkiStatusInfo();
-
- ContentInfo tstTokenContentInfo;
- try
- {
- TimeStampToken token = tokenGenerator.Generate(request, serialNumber, genTime.Value);
- byte[] encoded = token.ToCmsSignedData().GetEncoded();
-
- tstTokenContentInfo = ContentInfo.GetInstance(Asn1Object.FromByteArray(encoded));
- }
- catch (IOException e)
- {
- throw new TspException("Timestamp token received cannot be converted to ContentInfo", e);
- }
-
- resp = new TimeStampResp(pkiStatusInfo, tstTokenContentInfo);
- }
- catch (TspValidationException e)
- {
- status = PkiStatus.Rejection;
-
- this.SetFailInfoField(e.FailureCode);
- this.AddStatusString(e.Message);
-
- PkiStatusInfo pkiStatusInfo = GetPkiStatusInfo();
-
- resp = new TimeStampResp(pkiStatusInfo, null);
- }
-
- try
- {
- return new TimeStampResponse(resp);
- }
- catch (IOException e)
- {
- throw new TspException("created badly formatted response!", e);
- }
- }
-
- class FailInfo
- : DerBitString
- {
- internal FailInfo(int failInfoValue)
- : base(failInfoValue)
- {
- }
- }
-
- /**
- * Generate a TimeStampResponse with chosen status and FailInfoField.
- *
- * @param status the PKIStatus to set.
- * @param failInfoField the FailInfoField to set.
- * @param statusString an optional string describing the failure.
- * @return a TimeStampResponse with a failInfoField and optional statusString
- * @throws TSPException in case the response could not be created
- */
- public TimeStampResponse GenerateFailResponse(PkiStatus status, int failInfoField, string statusString)
- {
- this.status = status;
-
- this.SetFailInfoField(failInfoField);
-
- if (statusString != null)
- {
- this.AddStatusString(statusString);
- }
-
- PkiStatusInfo pkiStatusInfo = GetPkiStatusInfo();
-
- TimeStampResp resp = new TimeStampResp(pkiStatusInfo, null);
-
- try
- {
- return new TimeStampResponse(resp);
- }
- catch (IOException e)
- {
- throw new TspException("created badly formatted response!", e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/tsp/TimeStampToken.cs b/BCCrypto/src/tsp/TimeStampToken.cs
deleted file mode 100644
index 105208a..0000000
--- a/BCCrypto/src/tsp/TimeStampToken.cs
+++ /dev/null
@@ -1,305 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ess;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.Tsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Cms;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Tsp
-{
- public class TimeStampToken
- {
- private readonly CmsSignedData tsToken;
- private readonly SignerInformation tsaSignerInfo;
-// private readonly DateTime genTime;
- private readonly TimeStampTokenInfo tstInfo;
- private readonly CertID certID;
-
- public TimeStampToken(
- Asn1.Cms.ContentInfo contentInfo)
- : this(new CmsSignedData(contentInfo))
- {
- }
-
- public TimeStampToken(
- CmsSignedData signedData)
- {
- this.tsToken = signedData;
-
- if (!this.tsToken.SignedContentType.Equals(PkcsObjectIdentifiers.IdCTTstInfo))
- {
- throw new TspValidationException("ContentInfo object not for a time stamp.");
- }
-
- ICollection signers = tsToken.GetSignerInfos().GetSigners();
-
- if (signers.Count != 1)
- {
- throw new ArgumentException("Time-stamp token signed by "
- + signers.Count
- + " signers, but it must contain just the TSA signature.");
- }
-
-
- IEnumerator signerEnum = signers.GetEnumerator();
-
- signerEnum.MoveNext();
- tsaSignerInfo = (SignerInformation) signerEnum.Current;
-
- try
- {
- CmsProcessable content = tsToken.SignedContent;
- MemoryStream bOut = new MemoryStream();
-
- content.Write(bOut);
-
- this.tstInfo = new TimeStampTokenInfo(
- TstInfo.GetInstance(
- Asn1Object.FromByteArray(bOut.ToArray())));
-
- Asn1.Cms.Attribute attr = tsaSignerInfo.SignedAttributes[
- PkcsObjectIdentifiers.IdAASigningCertificate];
-
-// if (attr == null)
-// {
-// throw new TspValidationException(
-// "no signing certificate attribute found, time stamp invalid.");
-// }
-//
-// SigningCertificate signCert = SigningCertificate.GetInstance(
-// attr.AttrValues[0]);
-//
-// this.certID = EssCertID.GetInstance(signCert.GetCerts()[0]);
-
- if (attr != null)
- {
- SigningCertificate signCert = SigningCertificate.GetInstance(attr.AttrValues[0]);
-
- this.certID = new CertID(EssCertID.GetInstance(signCert.GetCerts()[0]));
- }
- else
- {
- attr = tsaSignerInfo.SignedAttributes[PkcsObjectIdentifiers.IdAASigningCertificateV2];
-
- if (attr == null)
- throw new TspValidationException("no signing certificate attribute found, time stamp invalid.");
-
- SigningCertificateV2 signCertV2 = SigningCertificateV2.GetInstance(attr.AttrValues[0]);
-
- this.certID = new CertID(EssCertIDv2.GetInstance(signCertV2.GetCerts()[0]));
- }
- }
- catch (CmsException e)
- {
- throw new TspException(e.Message, e.InnerException);
- }
- }
-
- public TimeStampTokenInfo TimeStampInfo
- {
- get { return tstInfo; }
- }
-
- public SignerID SignerID
- {
- get { return tsaSignerInfo.SignerID; }
- }
-
- public Asn1.Cms.AttributeTable SignedAttributes
- {
- get { return tsaSignerInfo.SignedAttributes; }
- }
-
- public Asn1.Cms.AttributeTable UnsignedAttributes
- {
- get { return tsaSignerInfo.UnsignedAttributes; }
- }
-
- public IX509Store GetCertificates(
- string type)
- {
- return tsToken.GetCertificates(type);
- }
-
- public IX509Store GetCrls(
- string type)
- {
- return tsToken.GetCrls(type);
- }
-
- public IX509Store GetAttributeCertificates(
- string type)
- {
- return tsToken.GetAttributeCertificates(type);
- }
-
- /**
- * Validate the time stamp token.
- *
- * To be valid the token must be signed by the passed in certificate and
- * the certificate must be the one referred to by the SigningCertificate
- * attribute included in the hashed attributes of the token. The
- * certificate must also have the ExtendedKeyUsageExtension with only
- * KeyPurposeID.IdKPTimeStamping and have been valid at the time the
- * timestamp was created.
- *
- *
- * A successful call to validate means all the above are true.
- *
- */
- public void Validate(
- X509Certificate cert)
- {
- try
- {
- byte[] hash = DigestUtilities.CalculateDigest(
- certID.GetHashAlgorithmName(), cert.GetEncoded());
-
- if (!Arrays.ConstantTimeAreEqual(certID.GetCertHash(), hash))
- {
- throw new TspValidationException("certificate hash does not match certID hash.");
- }
-
- if (certID.IssuerSerial != null)
- {
- if (!certID.IssuerSerial.Serial.Value.Equals(cert.SerialNumber))
- {
- throw new TspValidationException("certificate serial number does not match certID for signature.");
- }
-
- GeneralName[] names = certID.IssuerSerial.Issuer.GetNames();
- X509Name principal = PrincipalUtilities.GetIssuerX509Principal(cert);
- bool found = false;
-
- for (int i = 0; i != names.Length; i++)
- {
- if (names[i].TagNo == 4
- && X509Name.GetInstance(names[i].Name).Equivalent(principal))
- {
- found = true;
- break;
- }
- }
-
- if (!found)
- {
- throw new TspValidationException("certificate name does not match certID for signature. ");
- }
- }
-
- TspUtil.ValidateCertificate(cert);
-
- cert.CheckValidity(tstInfo.GenTime);
-
- if (!tsaSignerInfo.Verify(cert))
- {
- throw new TspValidationException("signature not created by certificate.");
- }
- }
- catch (CmsException e)
- {
- if (e.InnerException != null)
- {
- throw new TspException(e.Message, e.InnerException);
- }
-
- throw new TspException("CMS exception: " + e, e);
- }
- catch (CertificateEncodingException e)
- {
- throw new TspException("problem processing certificate: " + e, e);
- }
- catch (SecurityUtilityException e)
- {
- throw new TspException("cannot find algorithm: " + e.Message, e);
- }
- }
-
- /**
- * Return the underlying CmsSignedData object.
- *
- * @return the underlying CMS structure.
- */
- public CmsSignedData ToCmsSignedData()
- {
- return tsToken;
- }
-
- /**
- * Return a ASN.1 encoded byte stream representing the encoded object.
- *
- * @throws IOException if encoding fails.
- */
- public byte[] GetEncoded()
- {
- return tsToken.GetEncoded();
- }
-
-
- // perhaps this should be done using an interface on the ASN.1 classes...
- private class CertID
- {
- private EssCertID certID;
- private EssCertIDv2 certIDv2;
-
- internal CertID(EssCertID certID)
- {
- this.certID = certID;
- this.certIDv2 = null;
- }
-
- internal CertID(EssCertIDv2 certID)
- {
- this.certIDv2 = certID;
- this.certID = null;
- }
-
- public string GetHashAlgorithmName()
- {
- if (certID != null)
- return "SHA-1";
-
- if (NistObjectIdentifiers.IdSha256.Equals(certIDv2.HashAlgorithm.Algorithm))
- return "SHA-256";
-
- return certIDv2.HashAlgorithm.Algorithm.Id;
- }
-
- public AlgorithmIdentifier GetHashAlgorithm()
- {
- return (certID != null)
- ? new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1)
- : certIDv2.HashAlgorithm;
- }
-
- public byte[] GetCertHash()
- {
- return certID != null
- ? certID.GetCertHash()
- : certIDv2.GetCertHash();
- }
-
- public IssuerSerial IssuerSerial
- {
- get
- {
- return certID != null
- ? certID.IssuerSerial
- : certIDv2.IssuerSerial;
- }
- }
- }
- }
-}
diff --git a/BCCrypto/src/tsp/TimeStampTokenGenerator.cs b/BCCrypto/src/tsp/TimeStampTokenGenerator.cs
deleted file mode 100644
index 07eddd4..0000000
--- a/BCCrypto/src/tsp/TimeStampTokenGenerator.cs
+++ /dev/null
@@ -1,245 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Ess;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.Tsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Cms;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.Tsp
-{
- public class TimeStampTokenGenerator
- {
- private int accuracySeconds = -1;
- private int accuracyMillis = -1;
- private int accuracyMicros = -1;
- private bool ordering = false;
- private GeneralName tsa = null;
- private string tsaPolicyOID;
-
- private AsymmetricKeyParameter key;
- private X509Certificate cert;
- private string digestOID;
- private Asn1.Cms.AttributeTable signedAttr;
- private Asn1.Cms.AttributeTable unsignedAttr;
- private IX509Store x509Certs;
- private IX509Store x509Crls;
-
- /**
- * basic creation - only the default attributes will be included here.
- */
- public TimeStampTokenGenerator(
- AsymmetricKeyParameter key,
- X509Certificate cert,
- string digestOID,
- string tsaPolicyOID)
- : this(key, cert, digestOID, tsaPolicyOID, null, null)
- {
- }
-
- /**
- * create with a signer with extra signed/unsigned attributes.
- */
- public TimeStampTokenGenerator(
- AsymmetricKeyParameter key,
- X509Certificate cert,
- string digestOID,
- string tsaPolicyOID,
- Asn1.Cms.AttributeTable signedAttr,
- Asn1.Cms.AttributeTable unsignedAttr)
- {
- this.key = key;
- this.cert = cert;
- this.digestOID = digestOID;
- this.tsaPolicyOID = tsaPolicyOID;
- this.unsignedAttr = unsignedAttr;
-
- TspUtil.ValidateCertificate(cert);
-
- //
- // Add the ESSCertID attribute
- //
- IDictionary signedAttrs;
- if (signedAttr != null)
- {
- signedAttrs = signedAttr.ToDictionary();
- }
- else
- {
- signedAttrs = Platform.CreateHashtable();
- }
-
- try
- {
- byte[] hash = DigestUtilities.CalculateDigest("SHA-1", cert.GetEncoded());
-
- EssCertID essCertid = new EssCertID(hash);
-
- Asn1.Cms.Attribute attr = new Asn1.Cms.Attribute(
- PkcsObjectIdentifiers.IdAASigningCertificate,
- new DerSet(new SigningCertificate(essCertid)));
-
- signedAttrs[attr.AttrType] = attr;
- }
- catch (CertificateEncodingException e)
- {
- throw new TspException("Exception processing certificate.", e);
- }
- catch (SecurityUtilityException e)
- {
- throw new TspException("Can't find a SHA-1 implementation.", e);
- }
-
- this.signedAttr = new Asn1.Cms.AttributeTable(signedAttrs);
- }
-
- public void SetCertificates(
- IX509Store certificates)
- {
- this.x509Certs = certificates;
- }
-
- public void SetCrls(
- IX509Store crls)
- {
- this.x509Crls = crls;
- }
-
- public void SetAccuracySeconds(
- int accuracySeconds)
- {
- this.accuracySeconds = accuracySeconds;
- }
-
- public void SetAccuracyMillis(
- int accuracyMillis)
- {
- this.accuracyMillis = accuracyMillis;
- }
-
- public void SetAccuracyMicros(
- int accuracyMicros)
- {
- this.accuracyMicros = accuracyMicros;
- }
-
- public void SetOrdering(
- bool ordering)
- {
- this.ordering = ordering;
- }
-
- public void SetTsa(
- GeneralName tsa)
- {
- this.tsa = tsa;
- }
-
- //------------------------------------------------------------------------------
-
- public TimeStampToken Generate(
- TimeStampRequest request,
- BigInteger serialNumber,
- DateTime genTime)
- {
- DerObjectIdentifier digestAlgOID = new DerObjectIdentifier(request.MessageImprintAlgOid);
-
- AlgorithmIdentifier algID = new AlgorithmIdentifier(digestAlgOID, DerNull.Instance);
- MessageImprint messageImprint = new MessageImprint(algID, request.GetMessageImprintDigest());
-
- Accuracy accuracy = null;
- if (accuracySeconds > 0 || accuracyMillis > 0 || accuracyMicros > 0)
- {
- DerInteger seconds = null;
- if (accuracySeconds > 0)
- {
- seconds = new DerInteger(accuracySeconds);
- }
-
- DerInteger millis = null;
- if (accuracyMillis > 0)
- {
- millis = new DerInteger(accuracyMillis);
- }
-
- DerInteger micros = null;
- if (accuracyMicros > 0)
- {
- micros = new DerInteger(accuracyMicros);
- }
-
- accuracy = new Accuracy(seconds, millis, micros);
- }
-
- DerBoolean derOrdering = null;
- if (ordering)
- {
- derOrdering = DerBoolean.GetInstance(ordering);
- }
-
- DerInteger nonce = null;
- if (request.Nonce != null)
- {
- nonce = new DerInteger(request.Nonce);
- }
-
- DerObjectIdentifier tsaPolicy = new DerObjectIdentifier(tsaPolicyOID);
- if (request.ReqPolicy != null)
- {
- tsaPolicy = new DerObjectIdentifier(request.ReqPolicy);
- }
-
- TstInfo tstInfo = new TstInfo(tsaPolicy, messageImprint,
- new DerInteger(serialNumber), new DerGeneralizedTime(genTime), accuracy,
- derOrdering, nonce, tsa, request.Extensions);
-
- try
- {
- CmsSignedDataGenerator signedDataGenerator = new CmsSignedDataGenerator();
-
- byte[] derEncodedTstInfo = tstInfo.GetDerEncoded();
-
- if (request.CertReq)
- {
- signedDataGenerator.AddCertificates(x509Certs);
- }
-
- signedDataGenerator.AddCrls(x509Crls);
- signedDataGenerator.AddSigner(key, cert, digestOID, signedAttr, unsignedAttr);
-
- CmsSignedData signedData = signedDataGenerator.Generate(
- PkcsObjectIdentifiers.IdCTTstInfo.Id,
- new CmsProcessableByteArray(derEncodedTstInfo),
- true);
-
- return new TimeStampToken(signedData);
- }
- catch (CmsException cmsEx)
- {
- throw new TspException("Error generating time-stamp token", cmsEx);
- }
- catch (IOException e)
- {
- throw new TspException("Exception encoding info", e);
- }
- catch (X509StoreException e)
- {
- throw new TspException("Exception handling CertStore", e);
- }
-// catch (InvalidAlgorithmParameterException e)
-// {
-// throw new TspException("Exception handling CertStore CRLs", e);
-// }
- }
- }
-}
diff --git a/BCCrypto/src/tsp/TimeStampTokenInfo.cs b/BCCrypto/src/tsp/TimeStampTokenInfo.cs
deleted file mode 100644
index cdef826..0000000
--- a/BCCrypto/src/tsp/TimeStampTokenInfo.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1.Tsp;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Tsp
-{
- public class TimeStampTokenInfo
- {
- private TstInfo tstInfo;
- private DateTime genTime;
-
- public TimeStampTokenInfo(
- TstInfo tstInfo)
- {
- this.tstInfo = tstInfo;
-
- try
- {
- this.genTime = tstInfo.GenTime.ToDateTime();
- }
- catch (Exception e)
- {
- throw new TspException("unable to parse genTime field: " + e.Message);
- }
- }
-
- public bool IsOrdered
- {
- get { return tstInfo.Ordering.IsTrue; }
- }
-
- public Accuracy Accuracy
- {
- get { return tstInfo.Accuracy; }
- }
-
- public DateTime GenTime
- {
- get { return genTime; }
- }
-
- public GenTimeAccuracy GenTimeAccuracy
- {
- get
- {
- return this.Accuracy == null
- ? null
- : new GenTimeAccuracy(this.Accuracy);
- }
- }
-
- public string Policy
- {
- get { return tstInfo.Policy.Id; }
- }
-
- public BigInteger SerialNumber
- {
- get { return tstInfo.SerialNumber.Value; }
- }
-
- public GeneralName Tsa
- {
- get { return tstInfo.Tsa; }
- }
-
- /**
- * @return the nonce value, null if there isn't one.
- */
- public BigInteger Nonce
- {
- get
- {
- return tstInfo.Nonce == null
- ? null
- : tstInfo.Nonce.Value;
- }
- }
-
- public AlgorithmIdentifier HashAlgorithm
- {
- get { return tstInfo.MessageImprint.HashAlgorithm; }
- }
-
- public string MessageImprintAlgOid
- {
- get { return tstInfo.MessageImprint.HashAlgorithm.Algorithm.Id; }
- }
-
- public byte[] GetMessageImprintDigest()
- {
- return tstInfo.MessageImprint.GetHashedMessage();
- }
-
- public byte[] GetEncoded()
- {
- return tstInfo.GetEncoded();
- }
-
- public TstInfo TstInfo
- {
- get { return tstInfo; }
- }
- }
-}
diff --git a/BCCrypto/src/util/Arrays.cs b/BCCrypto/src/util/Arrays.cs
deleted file mode 100644
index df9b4e7..0000000
--- a/BCCrypto/src/util/Arrays.cs
+++ /dev/null
@@ -1,704 +0,0 @@
-using System;
-using System.Text;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Utilities
-{
- /// General array utilities.
- public abstract class Arrays
- {
- public static bool AreEqual(
- bool[] a,
- bool[] b)
- {
- if (a == b)
- return true;
-
- if (a == null || b == null)
- return false;
-
- return HaveSameContents(a, b);
- }
-
- public static bool AreEqual(
- char[] a,
- char[] b)
- {
- if (a == b)
- return true;
-
- if (a == null || b == null)
- return false;
-
- return HaveSameContents(a, b);
- }
-
- ///
- /// Are two arrays equal.
- ///
- /// Left side.
- /// Right side.
- /// True if equal.
- public static bool AreEqual(
- byte[] a,
- byte[] b)
- {
- if (a == b)
- return true;
-
- if (a == null || b == null)
- return false;
-
- return HaveSameContents(a, b);
- }
-
- [Obsolete("Use 'AreEqual' method instead")]
- public static bool AreSame(
- byte[] a,
- byte[] b)
- {
- return AreEqual(a, b);
- }
-
- ///
- /// A constant time equals comparison - does not terminate early if
- /// test will fail.
- ///
- /// first array
- /// second array
- /// true if arrays equal, false otherwise.
- public static bool ConstantTimeAreEqual(
- byte[] a,
- byte[] b)
- {
- int i = a.Length;
- if (i != b.Length)
- return false;
- int cmp = 0;
- while (i != 0)
- {
- --i;
- cmp |= (a[i] ^ b[i]);
- }
- return cmp == 0;
- }
-
- public static bool AreEqual(
- int[] a,
- int[] b)
- {
- if (a == b)
- return true;
-
- if (a == null || b == null)
- return false;
-
- return HaveSameContents(a, b);
- }
-
- [CLSCompliantAttribute(false)]
- public static bool AreEqual(uint[] a, uint[] b)
- {
- if (a == b)
- return true;
-
- if (a == null || b == null)
- return false;
-
- return HaveSameContents(a, b);
- }
-
- private static bool HaveSameContents(
- bool[] a,
- bool[] b)
- {
- int i = a.Length;
- if (i != b.Length)
- return false;
- while (i != 0)
- {
- --i;
- if (a[i] != b[i])
- return false;
- }
- return true;
- }
-
- private static bool HaveSameContents(
- char[] a,
- char[] b)
- {
- int i = a.Length;
- if (i != b.Length)
- return false;
- while (i != 0)
- {
- --i;
- if (a[i] != b[i])
- return false;
- }
- return true;
- }
-
- private static bool HaveSameContents(
- byte[] a,
- byte[] b)
- {
- int i = a.Length;
- if (i != b.Length)
- return false;
- while (i != 0)
- {
- --i;
- if (a[i] != b[i])
- return false;
- }
- return true;
- }
-
- private static bool HaveSameContents(
- int[] a,
- int[] b)
- {
- int i = a.Length;
- if (i != b.Length)
- return false;
- while (i != 0)
- {
- --i;
- if (a[i] != b[i])
- return false;
- }
- return true;
- }
-
- private static bool HaveSameContents(uint[] a, uint[] b)
- {
- int i = a.Length;
- if (i != b.Length)
- return false;
- while (i != 0)
- {
- --i;
- if (a[i] != b[i])
- return false;
- }
- return true;
- }
-
- public static string ToString(
- object[] a)
- {
- StringBuilder sb = new StringBuilder('[');
- if (a.Length > 0)
- {
- sb.Append(a[0]);
- for (int index = 1; index < a.Length; ++index)
- {
- sb.Append(", ").Append(a[index]);
- }
- }
- sb.Append(']');
- return sb.ToString();
- }
-
- public static int GetHashCode(byte[] data)
- {
- if (data == null)
- {
- return 0;
- }
-
- int i = data.Length;
- int hc = i + 1;
-
- while (--i >= 0)
- {
- hc *= 257;
- hc ^= data[i];
- }
-
- return hc;
- }
-
- public static int GetHashCode(byte[] data, int off, int len)
- {
- if (data == null)
- {
- return 0;
- }
-
- int i = len;
- int hc = i + 1;
-
- while (--i >= 0)
- {
- hc *= 257;
- hc ^= data[off + i];
- }
-
- return hc;
- }
-
- public static int GetHashCode(int[] data)
- {
- if (data == null)
- return 0;
-
- int i = data.Length;
- int hc = i + 1;
-
- while (--i >= 0)
- {
- hc *= 257;
- hc ^= data[i];
- }
-
- return hc;
- }
-
- public static int GetHashCode(int[] data, int off, int len)
- {
- if (data == null)
- return 0;
-
- int i = len;
- int hc = i + 1;
-
- while (--i >= 0)
- {
- hc *= 257;
- hc ^= data[off + i];
- }
-
- return hc;
- }
-
- [CLSCompliantAttribute(false)]
- public static int GetHashCode(uint[] data)
- {
- if (data == null)
- return 0;
-
- int i = data.Length;
- int hc = i + 1;
-
- while (--i >= 0)
- {
- hc *= 257;
- hc ^= (int)data[i];
- }
-
- return hc;
- }
-
- [CLSCompliantAttribute(false)]
- public static int GetHashCode(uint[] data, int off, int len)
- {
- if (data == null)
- return 0;
-
- int i = len;
- int hc = i + 1;
-
- while (--i >= 0)
- {
- hc *= 257;
- hc ^= (int)data[off + i];
- }
-
- return hc;
- }
-
- [CLSCompliantAttribute(false)]
- public static int GetHashCode(ulong[] data)
- {
- if (data == null)
- return 0;
-
- int i = data.Length;
- int hc = i + 1;
-
- while (--i >= 0)
- {
- ulong di = data[i];
- hc *= 257;
- hc ^= (int)di;
- hc *= 257;
- hc ^= (int)(di >> 32);
- }
-
- return hc;
- }
-
- [CLSCompliantAttribute(false)]
- public static int GetHashCode(ulong[] data, int off, int len)
- {
- if (data == null)
- return 0;
-
- int i = len;
- int hc = i + 1;
-
- while (--i >= 0)
- {
- ulong di = data[off + i];
- hc *= 257;
- hc ^= (int)di;
- hc *= 257;
- hc ^= (int)(di >> 32);
- }
-
- return hc;
- }
-
- public static byte[] Clone(
- byte[] data)
- {
- return data == null ? null : (byte[])data.Clone();
- }
-
- public static byte[] Clone(
- byte[] data,
- byte[] existing)
- {
- if (data == null)
- {
- return null;
- }
- if ((existing == null) || (existing.Length != data.Length))
- {
- return Clone(data);
- }
- Array.Copy(data, 0, existing, 0, existing.Length);
- return existing;
- }
-
- public static int[] Clone(
- int[] data)
- {
- return data == null ? null : (int[])data.Clone();
- }
-
- internal static uint[] Clone(uint[] data)
- {
- return data == null ? null : (uint[])data.Clone();
- }
-
- public static long[] Clone(long[] data)
- {
- return data == null ? null : (long[])data.Clone();
- }
-
- [CLSCompliantAttribute(false)]
- public static ulong[] Clone(
- ulong[] data)
- {
- return data == null ? null : (ulong[]) data.Clone();
- }
-
- [CLSCompliantAttribute(false)]
- public static ulong[] Clone(
- ulong[] data,
- ulong[] existing)
- {
- if (data == null)
- {
- return null;
- }
- if ((existing == null) || (existing.Length != data.Length))
- {
- return Clone(data);
- }
- Array.Copy(data, 0, existing, 0, existing.Length);
- return existing;
- }
-
- public static bool Contains(byte[] a, byte n)
- {
- for (int i = 0; i < a.Length; ++i)
- {
- if (a[i] == n)
- return true;
- }
- return false;
- }
-
- public static bool Contains(short[] a, short n)
- {
- for (int i = 0; i < a.Length; ++i)
- {
- if (a[i] == n)
- return true;
- }
- return false;
- }
-
- public static bool Contains(int[] a, int n)
- {
- for (int i = 0; i < a.Length; ++i)
- {
- if (a[i] == n)
- return true;
- }
- return false;
- }
-
- public static void Fill(
- byte[] buf,
- byte b)
- {
- int i = buf.Length;
- while (i > 0)
- {
- buf[--i] = b;
- }
- }
-
- public static byte[] CopyOf(byte[] data, int newLength)
- {
- byte[] tmp = new byte[newLength];
- Array.Copy(data, 0, tmp, 0, System.Math.Min(newLength, data.Length));
- return tmp;
- }
-
- public static char[] CopyOf(char[] data, int newLength)
- {
- char[] tmp = new char[newLength];
- Array.Copy(data, 0, tmp, 0, System.Math.Min(newLength, data.Length));
- return tmp;
- }
-
- public static int[] CopyOf(int[] data, int newLength)
- {
- int[] tmp = new int[newLength];
- Array.Copy(data, 0, tmp, 0, System.Math.Min(newLength, data.Length));
- return tmp;
- }
-
- public static long[] CopyOf(long[] data, int newLength)
- {
- long[] tmp = new long[newLength];
- Array.Copy(data, 0, tmp, 0, System.Math.Min(newLength, data.Length));
- return tmp;
- }
-
- public static BigInteger[] CopyOf(BigInteger[] data, int newLength)
- {
- BigInteger[] tmp = new BigInteger[newLength];
- Array.Copy(data, 0, tmp, 0, System.Math.Min(newLength, data.Length));
- return tmp;
- }
-
- /**
- * Make a copy of a range of bytes from the passed in data array. The range can
- * extend beyond the end of the input array, in which case the return array will
- * be padded with zeroes.
- *
- * @param data the array from which the data is to be copied.
- * @param from the start index at which the copying should take place.
- * @param to the final index of the range (exclusive).
- *
- * @return a new byte array containing the range given.
- */
- public static byte[] CopyOfRange(byte[] data, int from, int to)
- {
- int newLength = GetLength(from, to);
- byte[] tmp = new byte[newLength];
- Array.Copy(data, from, tmp, 0, System.Math.Min(newLength, data.Length - from));
- return tmp;
- }
-
- public static int[] CopyOfRange(int[] data, int from, int to)
- {
- int newLength = GetLength(from, to);
- int[] tmp = new int[newLength];
- Array.Copy(data, from, tmp, 0, System.Math.Min(newLength, data.Length - from));
- return tmp;
- }
-
- public static long[] CopyOfRange(long[] data, int from, int to)
- {
- int newLength = GetLength(from, to);
- long[] tmp = new long[newLength];
- Array.Copy(data, from, tmp, 0, System.Math.Min(newLength, data.Length - from));
- return tmp;
- }
-
- public static BigInteger[] CopyOfRange(BigInteger[] data, int from, int to)
- {
- int newLength = GetLength(from, to);
- BigInteger[] tmp = new BigInteger[newLength];
- Array.Copy(data, from, tmp, 0, System.Math.Min(newLength, data.Length - from));
- return tmp;
- }
-
- private static int GetLength(int from, int to)
- {
- int newLength = to - from;
- if (newLength < 0)
- throw new ArgumentException(from + " > " + to);
- return newLength;
- }
-
- public static byte[] Append(byte[] a, byte b)
- {
- if (a == null)
- return new byte[] { b };
-
- int length = a.Length;
- byte[] result = new byte[length + 1];
- Array.Copy(a, 0, result, 0, length);
- result[length] = b;
- return result;
- }
-
- public static short[] Append(short[] a, short b)
- {
- if (a == null)
- return new short[] { b };
-
- int length = a.Length;
- short[] result = new short[length + 1];
- Array.Copy(a, 0, result, 0, length);
- result[length] = b;
- return result;
- }
-
- public static int[] Append(int[] a, int b)
- {
- if (a == null)
- return new int[] { b };
-
- int length = a.Length;
- int[] result = new int[length + 1];
- Array.Copy(a, 0, result, 0, length);
- result[length] = b;
- return result;
- }
-
- public static byte[] Concatenate(byte[] a, byte[] b)
- {
- if (a == null)
- return Clone(b);
- if (b == null)
- return Clone(a);
-
- byte[] rv = new byte[a.Length + b.Length];
- Array.Copy(a, 0, rv, 0, a.Length);
- Array.Copy(b, 0, rv, a.Length, b.Length);
- return rv;
- }
-
- public static byte[] ConcatenateAll(params byte[][] vs)
- {
- byte[][] nonNull = new byte[vs.Length][];
- int count = 0;
- int totalLength = 0;
-
- for (int i = 0; i < vs.Length; ++i)
- {
- byte[] v = vs[i];
- if (v != null)
- {
- nonNull[count++] = v;
- totalLength += v.Length;
- }
- }
-
- byte[] result = new byte[totalLength];
- int pos = 0;
-
- for (int j = 0; j < count; ++j)
- {
- byte[] v = nonNull[j];
- Array.Copy(v, 0, result, pos, v.Length);
- pos += v.Length;
- }
-
- return result;
- }
-
- public static int[] Concatenate(int[] a, int[] b)
- {
- if (a == null)
- return Clone(b);
- if (b == null)
- return Clone(a);
-
- int[] rv = new int[a.Length + b.Length];
- Array.Copy(a, 0, rv, 0, a.Length);
- Array.Copy(b, 0, rv, a.Length, b.Length);
- return rv;
- }
-
- public static byte[] Prepend(byte[] a, byte b)
- {
- if (a == null)
- return new byte[] { b };
-
- int length = a.Length;
- byte[] result = new byte[length + 1];
- Array.Copy(a, 0, result, 1, length);
- result[0] = b;
- return result;
- }
-
- public static short[] Prepend(short[] a, short b)
- {
- if (a == null)
- return new short[] { b };
-
- int length = a.Length;
- short[] result = new short[length + 1];
- Array.Copy(a, 0, result, 1, length);
- result[0] = b;
- return result;
- }
-
- public static int[] Prepend(int[] a, int b)
- {
- if (a == null)
- return new int[] { b };
-
- int length = a.Length;
- int[] result = new int[length + 1];
- Array.Copy(a, 0, result, 1, length);
- result[0] = b;
- return result;
- }
-
- public static byte[] Reverse(byte[] a)
- {
- if (a == null)
- return null;
-
- int p1 = 0, p2 = a.Length;
- byte[] result = new byte[p2];
-
- while (--p2 >= 0)
- {
- result[p2] = a[p1++];
- }
-
- return result;
- }
-
- public static int[] Reverse(int[] a)
- {
- if (a == null)
- return null;
-
- int p1 = 0, p2 = a.Length;
- int[] result = new int[p2];
-
- while (--p2 >= 0)
- {
- result[p2] = a[p1++];
- }
-
- return result;
- }
- }
-}
diff --git a/BCCrypto/src/util/BigIntegers.cs b/BCCrypto/src/util/BigIntegers.cs
deleted file mode 100644
index f2d0425..0000000
--- a/BCCrypto/src/util/BigIntegers.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-
-namespace Org.BouncyCastle.Utilities
-{
- /**
- * BigInteger utilities.
- */
- public abstract class BigIntegers
- {
- private const int MaxIterations = 1000;
-
- /**
- * Return the passed in value as an unsigned byte array.
- *
- * @param value value to be converted.
- * @return a byte array without a leading zero byte if present in the signed encoding.
- */
- public static byte[] AsUnsignedByteArray(
- BigInteger n)
- {
- return n.ToByteArrayUnsigned();
- }
-
- /**
- * Return the passed in value as an unsigned byte array of specified length, zero-extended as necessary.
- *
- * @param length desired length of result array.
- * @param n value to be converted.
- * @return a byte array of specified length, with leading zeroes as necessary given the size of n.
- */
- public static byte[] AsUnsignedByteArray(int length, BigInteger n)
- {
- byte[] bytes = n.ToByteArrayUnsigned();
-
- if (bytes.Length > length)
- throw new ArgumentException("standard length exceeded", "n");
-
- if (bytes.Length == length)
- return bytes;
-
- byte[] tmp = new byte[length];
- Array.Copy(bytes, 0, tmp, tmp.Length - bytes.Length, bytes.Length);
- return tmp;
- }
-
- /**
- * Return a random BigInteger not less than 'min' and not greater than 'max'
- *
- * @param min the least value that may be generated
- * @param max the greatest value that may be generated
- * @param random the source of randomness
- * @return a random BigInteger value in the range [min,max]
- */
- public static BigInteger CreateRandomInRange(
- BigInteger min,
- BigInteger max,
- // TODO Should have been just Random class
- SecureRandom random)
- {
- int cmp = min.CompareTo(max);
- if (cmp >= 0)
- {
- if (cmp > 0)
- throw new ArgumentException("'min' may not be greater than 'max'");
-
- return min;
- }
-
- if (min.BitLength > max.BitLength / 2)
- {
- return CreateRandomInRange(BigInteger.Zero, max.Subtract(min), random).Add(min);
- }
-
- for (int i = 0; i < MaxIterations; ++i)
- {
- BigInteger x = new BigInteger(max.BitLength, random);
- if (x.CompareTo(min) >= 0 && x.CompareTo(max) <= 0)
- {
- return x;
- }
- }
-
- // fall back to a faster (restricted) method
- return new BigInteger(max.Subtract(min).BitLength - 1, random).Add(min);
- }
- }
-}
diff --git a/BCCrypto/src/util/Enums.cs b/BCCrypto/src/util/Enums.cs
deleted file mode 100644
index 9e908c4..0000000
--- a/BCCrypto/src/util/Enums.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-using System.Text;
-
-#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE
-using System.Collections;
-using System.Reflection;
-#endif
-
-using Org.BouncyCastle.Utilities.Date;
-
-namespace Org.BouncyCastle.Utilities
-{
- internal abstract class Enums
- {
- internal static Enum GetEnumValue(System.Type enumType, string s)
- {
- if (!IsEnumType(enumType))
- throw new ArgumentException("Not an enumeration type", "enumType");
-
- // We only want to parse single named constants
- if (s.Length > 0 && char.IsLetter(s[0]) && s.IndexOf(',') < 0)
- {
- s = s.Replace('-', '_');
- s = s.Replace('/', '_');
-
-#if NETCF_1_0
- FieldInfo field = enumType.GetField(s, BindingFlags.Static | BindingFlags.Public);
- if (field != null)
- {
- return (Enum)field.GetValue(null);
- }
-#else
- return (Enum)Enum.Parse(enumType, s, false);
-#endif
- }
-
- throw new ArgumentException();
- }
-
- internal static Array GetEnumValues(System.Type enumType)
- {
- if (!IsEnumType(enumType))
- throw new ArgumentException("Not an enumeration type", "enumType");
-
-#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT
- IList result = Platform.CreateArrayList();
- FieldInfo[] fields = enumType.GetFields(BindingFlags.Static | BindingFlags.Public);
- foreach (FieldInfo field in fields)
- {
- // Note: Argument to GetValue() ignored since the fields are static,
- // but Silverlight for Windows Phone throws exception if we pass null
- result.Add(field.GetValue(enumType));
- }
- object[] arr = new object[result.Count];
- result.CopyTo(arr, 0);
- return arr;
-#else
- return Enum.GetValues(enumType);
-#endif
- }
-
- internal static Enum GetArbitraryValue(System.Type enumType)
- {
- Array values = GetEnumValues(enumType);
- int pos = (int)(DateTimeUtilities.CurrentUnixMs() & int.MaxValue) % values.Length;
- return (Enum)values.GetValue(pos);
- }
-
- internal static bool IsEnumType(System.Type t)
- {
-#if NEW_REFLECTION
- return t.GetTypeInfo().IsEnum;
-#else
- return t.IsEnum;
-#endif
- }
- }
-}
diff --git a/BCCrypto/src/util/IMemoable.cs b/BCCrypto/src/util/IMemoable.cs
deleted file mode 100644
index cc8a2e5..0000000
--- a/BCCrypto/src/util/IMemoable.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities
-{
- public interface IMemoable
- {
- ///
- /// Produce a copy of this object with its configuration and in its current state.
- ///
- ///
- /// The returned object may be used simply to store the state, or may be used as a similar object
- /// starting from the copied state.
- ///
- IMemoable Copy();
-
- ///
- /// Restore a copied object state into this object.
- ///
- ///
- /// Implementations of this method should try to avoid or minimise memory allocation to perform the reset.
- ///
- /// an object originally {@link #copy() copied} from an object of the same type as this instance.
- /// if the provided object is not of the correct type.
- /// if the other parameter is in some other way invalid.
- void Reset(IMemoable other);
- }
-
-}
-
diff --git a/BCCrypto/src/util/Integers.cs b/BCCrypto/src/util/Integers.cs
deleted file mode 100644
index ccbf872..0000000
--- a/BCCrypto/src/util/Integers.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities
-{
- public abstract class Integers
- {
- public static int RotateLeft(int i, int distance)
- {
- return (i << distance) ^ (int)((uint)i >> -distance);
- }
-
- public static int RotateRight(int i, int distance)
- {
- return (int)((uint)i >> distance) ^ (i << -distance);
- }
- }
-}
diff --git a/BCCrypto/src/util/MemoableResetException.cs b/BCCrypto/src/util/MemoableResetException.cs
deleted file mode 100644
index 99554f6..0000000
--- a/BCCrypto/src/util/MemoableResetException.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities
-{
- /**
- * Exception to be thrown on a failure to reset an object implementing Memoable.
- *
- * The exception extends InvalidCastException to enable users to have a single handling case,
- * only introducing specific handling of this one if required.
- *
- */
- public class MemoableResetException
- : InvalidCastException
- {
- /**
- * Basic Constructor.
- *
- * @param msg message to be associated with this exception.
- */
- public MemoableResetException(string msg)
- : base(msg)
- {
- }
- }
-
-}
-
diff --git a/BCCrypto/src/util/Platform.cs b/BCCrypto/src/util/Platform.cs
deleted file mode 100644
index 8648485..0000000
--- a/BCCrypto/src/util/Platform.cs
+++ /dev/null
@@ -1,229 +0,0 @@
-using System;
-using System.Globalization;
-using System.IO;
-using System.Text;
-
-#if SILVERLIGHT || PORTABLE
-using System.Collections.Generic;
-#else
-using System.Collections;
-#endif
-
-namespace Org.BouncyCastle.Utilities
-{
- internal abstract class Platform
- {
- private static readonly CompareInfo InvariantCompareInfo = CultureInfo.InvariantCulture.CompareInfo;
-
-#if NETCF_1_0 || NETCF_2_0
- private static string GetNewLine()
- {
- MemoryStream buf = new MemoryStream();
- StreamWriter w = new StreamWriter(buf, Encoding.UTF8);
- w.WriteLine();
- Dispose(w);
- byte[] bs = buf.ToArray();
- return Encoding.UTF8.GetString(bs, 0, bs.Length);
- }
-#else
- private static string GetNewLine()
- {
- return Environment.NewLine;
- }
-#endif
-
- internal static bool EqualsIgnoreCase(string a, string b)
- {
-#if PORTABLE
- return String.Equals(a, b, StringComparison.OrdinalIgnoreCase);
-#else
- return ToUpperInvariant(a) == ToUpperInvariant(b);
-#endif
- }
-
-#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE
- internal static string GetEnvironmentVariable(
- string variable)
- {
- return null;
- }
-#else
- internal static string GetEnvironmentVariable(
- string variable)
- {
- try
- {
- return Environment.GetEnvironmentVariable(variable);
- }
- catch (System.Security.SecurityException)
- {
- // We don't have the required permission to read this environment variable,
- // which is fine, just act as if it's not set
- return null;
- }
- }
-#endif
-
-#if NETCF_1_0
- internal static Exception CreateNotImplementedException(
- string message)
- {
- return new Exception("Not implemented: " + message);
- }
-
- internal static bool Equals(
- object a,
- object b)
- {
- return a == b || (a != null && b != null && a.Equals(b));
- }
-#else
- internal static Exception CreateNotImplementedException(
- string message)
- {
- return new NotImplementedException(message);
- }
-#endif
-
-#if SILVERLIGHT || PORTABLE
- internal static System.Collections.IList CreateArrayList()
- {
- return new List();
- }
- internal static System.Collections.IList CreateArrayList(int capacity)
- {
- return new List(capacity);
- }
- internal static System.Collections.IList CreateArrayList(System.Collections.ICollection collection)
- {
- System.Collections.IList result = new List(collection.Count);
- foreach (object o in collection)
- {
- result.Add(o);
- }
- return result;
- }
- internal static System.Collections.IList CreateArrayList(System.Collections.IEnumerable collection)
- {
- System.Collections.IList result = new List();
- foreach (object o in collection)
- {
- result.Add(o);
- }
- return result;
- }
- internal static System.Collections.IDictionary CreateHashtable()
- {
- return new Dictionary();
- }
- internal static System.Collections.IDictionary CreateHashtable(int capacity)
- {
- return new Dictionary(capacity);
- }
- internal static System.Collections.IDictionary CreateHashtable(System.Collections.IDictionary dictionary)
- {
- System.Collections.IDictionary result = new Dictionary(dictionary.Count);
- foreach (System.Collections.DictionaryEntry entry in dictionary)
- {
- result.Add(entry.Key, entry.Value);
- }
- return result;
- }
-#else
- internal static System.Collections.IList CreateArrayList()
- {
- return new ArrayList();
- }
- internal static System.Collections.IList CreateArrayList(int capacity)
- {
- return new ArrayList(capacity);
- }
- internal static System.Collections.IList CreateArrayList(System.Collections.ICollection collection)
- {
- return new ArrayList(collection);
- }
- internal static System.Collections.IList CreateArrayList(System.Collections.IEnumerable collection)
- {
- ArrayList result = new ArrayList();
- foreach (object o in collection)
- {
- result.Add(o);
- }
- return result;
- }
- internal static System.Collections.IDictionary CreateHashtable()
- {
- return new Hashtable();
- }
- internal static System.Collections.IDictionary CreateHashtable(int capacity)
- {
- return new Hashtable(capacity);
- }
- internal static System.Collections.IDictionary CreateHashtable(System.Collections.IDictionary dictionary)
- {
- return new Hashtable(dictionary);
- }
-#endif
-
- internal static string ToLowerInvariant(string s)
- {
-#if PORTABLE
- return s.ToLowerInvariant();
-#else
- return s.ToLower(CultureInfo.InvariantCulture);
-#endif
- }
-
- internal static string ToUpperInvariant(string s)
- {
-#if PORTABLE
- return s.ToUpperInvariant();
-#else
- return s.ToUpper(CultureInfo.InvariantCulture);
-#endif
- }
-
- internal static readonly string NewLine = GetNewLine();
-
-#if PORTABLE
- internal static void Dispose(IDisposable d)
- {
- d.Dispose();
- }
-#else
- internal static void Dispose(Stream s)
- {
- s.Close();
- }
- internal static void Dispose(TextWriter t)
- {
- t.Close();
- }
-#endif
-
- internal static int IndexOf(string source, string value)
- {
- return InvariantCompareInfo.IndexOf(source, value, CompareOptions.Ordinal);
- }
-
- internal static int LastIndexOf(string source, string value)
- {
- return InvariantCompareInfo.LastIndexOf(source, value, CompareOptions.Ordinal);
- }
-
- internal static bool StartsWith(string source, string prefix)
- {
- return InvariantCompareInfo.IsPrefix(source, prefix, CompareOptions.Ordinal);
- }
-
- internal static bool EndsWith(string source, string suffix)
- {
- return InvariantCompareInfo.IsSuffix(source, suffix, CompareOptions.Ordinal);
- }
-
- internal static string GetTypeName(object obj)
- {
- return obj.GetType().FullName;
- }
- }
-}
diff --git a/BCCrypto/src/util/Strings.cs b/BCCrypto/src/util/Strings.cs
deleted file mode 100644
index 3937a08..0000000
--- a/BCCrypto/src/util/Strings.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-using System;
-using System.Text;
-
-namespace Org.BouncyCastle.Utilities
-{
- /// General string utilities.
- public abstract class Strings
- {
- internal static bool IsOneOf(string s, params string[] candidates)
- {
- foreach (string candidate in candidates)
- {
- if (s == candidate)
- return true;
- }
- return false;
- }
-
- public static string FromByteArray(
- byte[] bs)
- {
- char[] cs = new char[bs.Length];
- for (int i = 0; i < cs.Length; ++i)
- {
- cs[i] = Convert.ToChar(bs[i]);
- }
- return new string(cs);
- }
-
- public static byte[] ToByteArray(
- char[] cs)
- {
- byte[] bs = new byte[cs.Length];
- for (int i = 0; i < bs.Length; ++i)
- {
- bs[i] = Convert.ToByte(cs[i]);
- }
- return bs;
- }
-
- public static byte[] ToByteArray(
- string s)
- {
- byte[] bs = new byte[s.Length];
- for (int i = 0; i < bs.Length; ++i)
- {
- bs[i] = Convert.ToByte(s[i]);
- }
- return bs;
- }
-
- public static string FromAsciiByteArray(
- byte[] bytes)
- {
-#if SILVERLIGHT || PORTABLE
- // TODO Check for non-ASCII bytes in input?
- return Encoding.UTF8.GetString(bytes, 0, bytes.Length);
-#else
- return Encoding.ASCII.GetString(bytes, 0, bytes.Length);
-#endif
- }
-
- public static byte[] ToAsciiByteArray(
- char[] cs)
- {
-#if SILVERLIGHT || PORTABLE
- // TODO Check for non-ASCII characters in input?
- return Encoding.UTF8.GetBytes(cs);
-#else
- return Encoding.ASCII.GetBytes(cs);
-#endif
- }
-
- public static byte[] ToAsciiByteArray(
- string s)
- {
-#if SILVERLIGHT || PORTABLE
- // TODO Check for non-ASCII characters in input?
- return Encoding.UTF8.GetBytes(s);
-#else
- return Encoding.ASCII.GetBytes(s);
-#endif
- }
-
- public static string FromUtf8ByteArray(
- byte[] bytes)
- {
- return Encoding.UTF8.GetString(bytes, 0, bytes.Length);
- }
-
- public static byte[] ToUtf8ByteArray(
- char[] cs)
- {
- return Encoding.UTF8.GetBytes(cs);
- }
-
- public static byte[] ToUtf8ByteArray(
- string s)
- {
- return Encoding.UTF8.GetBytes(s);
- }
- }
-}
diff --git a/BCCrypto/src/util/Times.cs b/BCCrypto/src/util/Times.cs
deleted file mode 100644
index 99a78d2..0000000
--- a/BCCrypto/src/util/Times.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities
-{
- public sealed class Times
- {
- private static long NanosecondsPerTick = 100L;
-
- public static long NanoTime()
- {
- return DateTime.UtcNow.Ticks * NanosecondsPerTick;
- }
- }
-}
diff --git a/BCCrypto/src/util/TypeExtensions.cs b/BCCrypto/src/util/TypeExtensions.cs
deleted file mode 100644
index e2aeae4..0000000
--- a/BCCrypto/src/util/TypeExtensions.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-#if NEW_REFLECTION
-
-using System;
-using System.Reflection;
-
-namespace Org.BouncyCastle
-{
- internal static class TypeExtensions
- {
- public static bool IsInstanceOfType(this Type type, object instance)
- {
- return instance != null && type.GetTypeInfo().IsAssignableFrom(instance.GetType().GetTypeInfo());
- }
- }
-}
-
-#endif
diff --git a/BCCrypto/src/util/collections/CollectionUtilities.cs b/BCCrypto/src/util/collections/CollectionUtilities.cs
deleted file mode 100644
index 18fcb67..0000000
--- a/BCCrypto/src/util/collections/CollectionUtilities.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-using System.Collections;
-using System.Text;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
- public abstract class CollectionUtilities
- {
- public static void AddRange(IList to, IEnumerable range)
- {
- foreach (object o in range)
- {
- to.Add(o);
- }
- }
-
- public static bool CheckElementsAreOfType(IEnumerable e, Type t)
- {
- foreach (object o in e)
- {
- if (!t.IsInstanceOfType(o))
- return false;
- }
- return true;
- }
-
- public static IDictionary ReadOnly(IDictionary d)
- {
- return new UnmodifiableDictionaryProxy(d);
- }
-
- public static IList ReadOnly(IList l)
- {
- return new UnmodifiableListProxy(l);
- }
-
- public static ISet ReadOnly(ISet s)
- {
- return new UnmodifiableSetProxy(s);
- }
-
- public static string ToString(IEnumerable c)
- {
- StringBuilder sb = new StringBuilder("[");
-
- IEnumerator e = c.GetEnumerator();
-
- if (e.MoveNext())
- {
- sb.Append(e.Current.ToString());
-
- while (e.MoveNext())
- {
- sb.Append(", ");
- sb.Append(e.Current.ToString());
- }
- }
-
- sb.Append(']');
-
- return sb.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/util/collections/EmptyEnumerable.cs b/BCCrypto/src/util/collections/EmptyEnumerable.cs
deleted file mode 100644
index a61a078..0000000
--- a/BCCrypto/src/util/collections/EmptyEnumerable.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
- public sealed class EmptyEnumerable
- : IEnumerable
- {
- public static readonly IEnumerable Instance = new EmptyEnumerable();
-
- private EmptyEnumerable()
- {
- }
-
- public IEnumerator GetEnumerator()
- {
- return EmptyEnumerator.Instance;
- }
- }
-
- public sealed class EmptyEnumerator
- : IEnumerator
- {
- public static readonly IEnumerator Instance = new EmptyEnumerator();
-
- private EmptyEnumerator()
- {
- }
-
- public bool MoveNext()
- {
- return false;
- }
-
- public void Reset()
- {
- }
-
- public object Current
- {
- get { throw new InvalidOperationException("No elements"); }
- }
- }
-}
diff --git a/BCCrypto/src/util/collections/EnumerableProxy.cs b/BCCrypto/src/util/collections/EnumerableProxy.cs
deleted file mode 100644
index 9eec4af..0000000
--- a/BCCrypto/src/util/collections/EnumerableProxy.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
- public sealed class EnumerableProxy
- : IEnumerable
- {
- private readonly IEnumerable inner;
-
- public EnumerableProxy(
- IEnumerable inner)
- {
- if (inner == null)
- throw new ArgumentNullException("inner");
-
- this.inner = inner;
- }
-
- public IEnumerator GetEnumerator()
- {
- return inner.GetEnumerator();
- }
- }
-}
diff --git a/BCCrypto/src/util/collections/HashSet.cs b/BCCrypto/src/util/collections/HashSet.cs
deleted file mode 100644
index 1facb58..0000000
--- a/BCCrypto/src/util/collections/HashSet.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
- public class HashSet
- : ISet
- {
- private readonly IDictionary impl = Platform.CreateHashtable();
-
- public HashSet()
- {
- }
-
- public HashSet(IEnumerable s)
- {
- foreach (object o in s)
- {
- Add(o);
- }
- }
-
- public virtual void Add(object o)
- {
- impl[o] = null;
- }
-
- public virtual void AddAll(IEnumerable e)
- {
- foreach (object o in e)
- {
- Add(o);
- }
- }
-
- public virtual void Clear()
- {
- impl.Clear();
- }
-
- public virtual bool Contains(object o)
- {
- return impl.Contains(o);
- }
-
- public virtual void CopyTo(Array array, int index)
- {
- impl.Keys.CopyTo(array, index);
- }
-
- public virtual int Count
- {
- get { return impl.Count; }
- }
-
- public virtual IEnumerator GetEnumerator()
- {
- return impl.Keys.GetEnumerator();
- }
-
- public virtual bool IsEmpty
- {
- get { return impl.Count == 0; }
- }
-
- public virtual bool IsFixedSize
- {
- get { return impl.IsFixedSize; }
- }
-
- public virtual bool IsReadOnly
- {
- get { return impl.IsReadOnly; }
- }
-
- public virtual bool IsSynchronized
- {
- get { return impl.IsSynchronized; }
- }
-
- public virtual void Remove(object o)
- {
- impl.Remove(o);
- }
-
- public virtual void RemoveAll(IEnumerable e)
- {
- foreach (object o in e)
- {
- Remove(o);
- }
- }
-
- public virtual object SyncRoot
- {
- get { return impl.SyncRoot; }
- }
- }
-}
diff --git a/BCCrypto/src/util/collections/ISet.cs b/BCCrypto/src/util/collections/ISet.cs
deleted file mode 100644
index 1f8edba..0000000
--- a/BCCrypto/src/util/collections/ISet.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
- public interface ISet
- : ICollection
- {
- void Add(object o);
- void AddAll(IEnumerable e);
- void Clear();
- bool Contains(object o);
- bool IsEmpty { get; }
- bool IsFixedSize { get; }
- bool IsReadOnly { get; }
- void Remove(object o);
- void RemoveAll(IEnumerable e);
- }
-}
diff --git a/BCCrypto/src/util/collections/LinkedDictionary.cs b/BCCrypto/src/util/collections/LinkedDictionary.cs
deleted file mode 100644
index 933d38d..0000000
--- a/BCCrypto/src/util/collections/LinkedDictionary.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
- public class LinkedDictionary
- : IDictionary
- {
- internal readonly IDictionary hash = Platform.CreateHashtable();
- internal readonly IList keys = Platform.CreateArrayList();
-
- public LinkedDictionary()
- {
- }
-
- public virtual void Add(object k, object v)
- {
- hash.Add(k, v);
- keys.Add(k);
- }
-
- public virtual void Clear()
- {
- hash.Clear();
- keys.Clear();
- }
-
- public virtual bool Contains(object k)
- {
- return hash.Contains(k);
- }
-
- public virtual void CopyTo(Array array, int index)
- {
- foreach (object k in keys)
- {
- array.SetValue(hash[k], index++);
- }
- }
-
- public virtual int Count
- {
- get { return hash.Count; }
- }
-
- IEnumerator IEnumerable.GetEnumerator()
- {
- return GetEnumerator();
- }
-
- public virtual IDictionaryEnumerator GetEnumerator()
- {
- return new LinkedDictionaryEnumerator(this);
- }
-
- public virtual void Remove(object k)
- {
- hash.Remove(k);
- keys.Remove(k);
- }
-
- public virtual bool IsFixedSize
- {
- get { return false; }
- }
-
- public virtual bool IsReadOnly
- {
- get { return false; }
- }
-
- public virtual bool IsSynchronized
- {
- get { return false; }
- }
-
- public virtual object SyncRoot
- {
- get { return false; }
- }
-
- public virtual ICollection Keys
- {
- get { return Platform.CreateArrayList(keys); }
- }
-
- public virtual ICollection Values
- {
- // NB: Order has to be the same as for Keys property
- get
- {
- IList values = Platform.CreateArrayList(keys.Count);
- foreach (object k in keys)
- {
- values.Add(hash[k]);
- }
- return values;
- }
- }
-
- public virtual object this[object k]
- {
- get
- {
- return hash[k];
- }
- set
- {
- if (!hash.Contains(k))
- keys.Add(k);
- hash[k] = value;
- }
- }
- }
-
- internal class LinkedDictionaryEnumerator : IDictionaryEnumerator
- {
- private readonly LinkedDictionary parent;
- private int pos = -1;
-
- internal LinkedDictionaryEnumerator(LinkedDictionary parent)
- {
- this.parent = parent;
- }
-
- public virtual object Current
- {
- get { return Entry; }
- }
-
- public virtual DictionaryEntry Entry
- {
- get
- {
- object k = CurrentKey;
- return new DictionaryEntry(k, parent.hash[k]);
- }
- }
-
- public virtual object Key
- {
- get
- {
- return CurrentKey;
- }
- }
-
- public virtual bool MoveNext()
- {
- if (pos >= parent.keys.Count)
- return false;
- return ++pos < parent.keys.Count;
- }
-
- public virtual void Reset()
- {
- this.pos = -1;
- }
-
- public virtual object Value
- {
- get
- {
- return parent.hash[CurrentKey];
- }
- }
-
- private object CurrentKey
- {
- get
- {
- if (pos < 0 || pos >= parent.keys.Count)
- throw new InvalidOperationException();
- return parent.keys[pos];
- }
- }
- }
-}
diff --git a/BCCrypto/src/util/collections/UnmodifiableDictionary.cs b/BCCrypto/src/util/collections/UnmodifiableDictionary.cs
deleted file mode 100644
index 0bdf70a..0000000
--- a/BCCrypto/src/util/collections/UnmodifiableDictionary.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
- public abstract class UnmodifiableDictionary
- : IDictionary
- {
- protected UnmodifiableDictionary()
- {
- }
-
- public virtual void Add(object k, object v)
- {
- throw new NotSupportedException();
- }
-
- public virtual void Clear()
- {
- throw new NotSupportedException();
- }
-
- public abstract bool Contains(object k);
-
- public abstract void CopyTo(Array array, int index);
-
- public abstract int Count { get; }
-
- IEnumerator IEnumerable.GetEnumerator()
- {
- return GetEnumerator();
- }
-
- public abstract IDictionaryEnumerator GetEnumerator();
-
- public virtual void Remove(object k)
- {
- throw new NotSupportedException();
- }
-
- public abstract bool IsFixedSize { get; }
-
- public virtual bool IsReadOnly
- {
- get { return true; }
- }
-
- public abstract bool IsSynchronized { get; }
-
- public abstract object SyncRoot { get; }
-
- public abstract ICollection Keys { get; }
-
- public abstract ICollection Values { get; }
-
- public virtual object this[object k]
- {
- get { return GetValue(k); }
- set { throw new NotSupportedException(); }
- }
-
- protected abstract object GetValue(object k);
- }
-}
diff --git a/BCCrypto/src/util/collections/UnmodifiableDictionaryProxy.cs b/BCCrypto/src/util/collections/UnmodifiableDictionaryProxy.cs
deleted file mode 100644
index 0fca909..0000000
--- a/BCCrypto/src/util/collections/UnmodifiableDictionaryProxy.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
- public class UnmodifiableDictionaryProxy
- : UnmodifiableDictionary
- {
- private readonly IDictionary d;
-
- public UnmodifiableDictionaryProxy(IDictionary d)
- {
- this.d = d;
- }
-
- public override bool Contains(object k)
- {
- return d.Contains(k);
- }
-
- public override void CopyTo(Array array, int index)
- {
- d.CopyTo(array, index);
- }
-
- public override int Count
- {
- get { return d.Count; }
- }
-
- public override IDictionaryEnumerator GetEnumerator()
- {
- return d.GetEnumerator();
- }
-
- public override bool IsFixedSize
- {
- get { return d.IsFixedSize; }
- }
-
- public override bool IsSynchronized
- {
- get { return d.IsSynchronized; }
- }
-
- public override object SyncRoot
- {
- get { return d.SyncRoot; }
- }
-
- public override ICollection Keys
- {
- get { return d.Keys; }
- }
-
- public override ICollection Values
- {
- get { return d.Values; }
- }
-
- protected override object GetValue(object k)
- {
- return d[k];
- }
- }
-}
diff --git a/BCCrypto/src/util/collections/UnmodifiableList.cs b/BCCrypto/src/util/collections/UnmodifiableList.cs
deleted file mode 100644
index 28e49ea..0000000
--- a/BCCrypto/src/util/collections/UnmodifiableList.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
- public abstract class UnmodifiableList
- : IList
- {
- protected UnmodifiableList()
- {
- }
-
- public virtual int Add(object o)
- {
- throw new NotSupportedException();
- }
-
- public virtual void Clear()
- {
- throw new NotSupportedException();
- }
-
- public abstract bool Contains(object o);
-
- public abstract void CopyTo(Array array, int index);
-
- public abstract int Count { get; }
-
- public abstract IEnumerator GetEnumerator();
-
- public abstract int IndexOf(object o);
-
- public virtual void Insert(int i, object o)
- {
- throw new NotSupportedException();
- }
-
- public abstract bool IsFixedSize { get; }
-
- public virtual bool IsReadOnly
- {
- get { return true; }
- }
-
- public abstract bool IsSynchronized { get; }
-
- public virtual void Remove(object o)
- {
- throw new NotSupportedException();
- }
-
- public virtual void RemoveAt(int i)
- {
- throw new NotSupportedException();
- }
-
- public abstract object SyncRoot { get; }
-
- public virtual object this[int i]
- {
- get { return GetValue(i); }
- set { throw new NotSupportedException(); }
- }
-
- protected abstract object GetValue(int i);
- }
-}
diff --git a/BCCrypto/src/util/collections/UnmodifiableListProxy.cs b/BCCrypto/src/util/collections/UnmodifiableListProxy.cs
deleted file mode 100644
index 9d00737..0000000
--- a/BCCrypto/src/util/collections/UnmodifiableListProxy.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
- public class UnmodifiableListProxy
- : UnmodifiableList
- {
- private readonly IList l;
-
- public UnmodifiableListProxy(IList l)
- {
- this.l = l;
- }
-
- public override bool Contains(object o)
- {
- return l.Contains(o);
- }
-
- public override void CopyTo(Array array, int index)
- {
- l.CopyTo(array, index);
- }
-
- public override int Count
- {
- get { return l.Count; }
- }
-
- public override IEnumerator GetEnumerator()
- {
- return l.GetEnumerator();
- }
-
- public override int IndexOf(object o)
- {
- return l.IndexOf(o);
- }
-
- public override bool IsFixedSize
- {
- get { return l.IsFixedSize; }
- }
-
- public override bool IsSynchronized
- {
- get { return l.IsSynchronized; }
- }
-
- public override object SyncRoot
- {
- get { return l.SyncRoot; }
- }
-
- protected override object GetValue(int i)
- {
- return l[i];
- }
- }
-}
diff --git a/BCCrypto/src/util/collections/UnmodifiableSet.cs b/BCCrypto/src/util/collections/UnmodifiableSet.cs
deleted file mode 100644
index 8792815..0000000
--- a/BCCrypto/src/util/collections/UnmodifiableSet.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
- public abstract class UnmodifiableSet
- : ISet
- {
- protected UnmodifiableSet()
- {
- }
-
- public virtual void Add(object o)
- {
- throw new NotSupportedException();
- }
-
- public virtual void AddAll(IEnumerable e)
- {
- throw new NotSupportedException();
- }
-
- public virtual void Clear()
- {
- throw new NotSupportedException();
- }
-
- public abstract bool Contains(object o);
-
- public abstract void CopyTo(Array array, int index);
-
- public abstract int Count { get; }
-
- public abstract IEnumerator GetEnumerator();
-
- public abstract bool IsEmpty { get; }
-
- public abstract bool IsFixedSize { get; }
-
- public virtual bool IsReadOnly
- {
- get { return true; }
- }
-
- public abstract bool IsSynchronized { get; }
-
- public abstract object SyncRoot { get; }
-
- public virtual void Remove(object o)
- {
- throw new NotSupportedException();
- }
-
- public virtual void RemoveAll(IEnumerable e)
- {
- throw new NotSupportedException();
- }
- }
-}
diff --git a/BCCrypto/src/util/collections/UnmodifiableSetProxy.cs b/BCCrypto/src/util/collections/UnmodifiableSetProxy.cs
deleted file mode 100644
index e119e29..0000000
--- a/BCCrypto/src/util/collections/UnmodifiableSetProxy.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
- public class UnmodifiableSetProxy
- : UnmodifiableSet
- {
- private readonly ISet s;
-
- public UnmodifiableSetProxy (ISet s)
- {
- this.s = s;
- }
-
- public override bool Contains(object o)
- {
- return s.Contains(o);
- }
-
- public override void CopyTo(Array array, int index)
- {
- s.CopyTo(array, index);
- }
-
- public override int Count
- {
- get { return s.Count; }
- }
-
- public override IEnumerator GetEnumerator()
- {
- return s.GetEnumerator();
- }
-
- public override bool IsEmpty
- {
- get { return s.IsEmpty; }
- }
-
- public override bool IsFixedSize
- {
- get { return s.IsFixedSize; }
- }
-
- public override bool IsSynchronized
- {
- get { return s.IsSynchronized; }
- }
-
- public override object SyncRoot
- {
- get { return s.SyncRoot; }
- }
- }
-}
diff --git a/BCCrypto/src/util/date/DateTimeObject.cs b/BCCrypto/src/util/date/DateTimeObject.cs
deleted file mode 100644
index 793376b..0000000
--- a/BCCrypto/src/util/date/DateTimeObject.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities.Date
-{
- public sealed class DateTimeObject
- {
- private readonly DateTime dt;
-
- public DateTimeObject(
- DateTime dt)
- {
- this.dt = dt;
- }
-
- public DateTime Value
- {
- get { return dt; }
- }
-
- public override string ToString()
- {
- return dt.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/util/date/DateTimeUtilities.cs b/BCCrypto/src/util/date/DateTimeUtilities.cs
deleted file mode 100644
index 311ad5d..0000000
--- a/BCCrypto/src/util/date/DateTimeUtilities.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities.Date
-{
- public class DateTimeUtilities
- {
- public static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1);
-
- private DateTimeUtilities()
- {
- }
-
- ///
- /// Return the number of milliseconds since the Unix epoch (1 Jan., 1970 UTC) for a given DateTime value.
- ///
- /// A UTC DateTime value not before epoch.
- /// Number of whole milliseconds after epoch.
- /// 'dateTime' is before epoch.
- public static long DateTimeToUnixMs(
- DateTime dateTime)
- {
- if (dateTime.CompareTo(UnixEpoch) < 0)
- throw new ArgumentException("DateTime value may not be before the epoch", "dateTime");
-
- return (dateTime.Ticks - UnixEpoch.Ticks) / TimeSpan.TicksPerMillisecond;
- }
-
- ///
- /// Create a DateTime value from the number of milliseconds since the Unix epoch (1 Jan., 1970 UTC).
- ///
- /// Number of milliseconds since the epoch.
- /// A UTC DateTime value
- public static DateTime UnixMsToDateTime(
- long unixMs)
- {
- return new DateTime(unixMs * TimeSpan.TicksPerMillisecond + UnixEpoch.Ticks);
- }
-
- ///
- /// Return the current number of milliseconds since the Unix epoch (1 Jan., 1970 UTC).
- ///
- public static long CurrentUnixMs()
- {
- return DateTimeToUnixMs(DateTime.UtcNow);
- }
- }
-}
diff --git a/BCCrypto/src/util/encoders/Base64.cs b/BCCrypto/src/util/encoders/Base64.cs
deleted file mode 100644
index ccecd8d..0000000
--- a/BCCrypto/src/util/encoders/Base64.cs
+++ /dev/null
@@ -1,120 +0,0 @@
-using System;
-using System.IO;
-using System.Text;
-
-namespace Org.BouncyCastle.Utilities.Encoders
-{
- public sealed class Base64
- {
- private Base64()
- {
- }
-
- public static string ToBase64String(
- byte[] data)
- {
- return Convert.ToBase64String(data, 0, data.Length);
- }
-
- public static string ToBase64String(
- byte[] data,
- int off,
- int length)
- {
- return Convert.ToBase64String(data, off, length);
- }
-
- /**
- * encode the input data producing a base 64 encoded byte array.
- *
- * @return a byte array containing the base 64 encoded data.
- */
- public static byte[] Encode(
- byte[] data)
- {
- return Encode(data, 0, data.Length);
- }
-
- /**
- * encode the input data producing a base 64 encoded byte array.
- *
- * @return a byte array containing the base 64 encoded data.
- */
- public static byte[] Encode(
- byte[] data,
- int off,
- int length)
- {
- string s = Convert.ToBase64String(data, off, length);
- return Strings.ToAsciiByteArray(s);
- }
-
- /**
- * Encode the byte data to base 64 writing it to the given output stream.
- *
- * @return the number of bytes produced.
- */
- public static int Encode(
- byte[] data,
- Stream outStream)
- {
- byte[] encoded = Encode(data);
- outStream.Write(encoded, 0, encoded.Length);
- return encoded.Length;
- }
-
- /**
- * Encode the byte data to base 64 writing it to the given output stream.
- *
- * @return the number of bytes produced.
- */
- public static int Encode(
- byte[] data,
- int off,
- int length,
- Stream outStream)
- {
- byte[] encoded = Encode(data, off, length);
- outStream.Write(encoded, 0, encoded.Length);
- return encoded.Length;
- }
-
- /**
- * decode the base 64 encoded input data. It is assumed the input data is valid.
- *
- * @return a byte array representing the decoded data.
- */
- public static byte[] Decode(
- byte[] data)
- {
- string s = Strings.FromAsciiByteArray(data);
- return Convert.FromBase64String(s);
- }
-
- /**
- * decode the base 64 encoded string data - whitespace will be ignored.
- *
- * @return a byte array representing the decoded data.
- */
- public static byte[] Decode(
- string data)
- {
- return Convert.FromBase64String(data);
- }
-
- /**
- * decode the base 64 encoded string data writing it to the given output stream,
- * whitespace characters will be ignored.
- *
- * @return the number of bytes produced.
- */
- public static int Decode(
- string data,
- Stream outStream)
- {
- byte[] decoded = Decode(data);
- outStream.Write(decoded, 0, decoded.Length);
- return decoded.Length;
- }
- }
-}
diff --git a/BCCrypto/src/util/encoders/Base64Encoder.cs b/BCCrypto/src/util/encoders/Base64Encoder.cs
deleted file mode 100644
index 7b53df2..0000000
--- a/BCCrypto/src/util/encoders/Base64Encoder.cs
+++ /dev/null
@@ -1,324 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.Encoders
-{
- public class Base64Encoder
- : IEncoder
- {
- protected readonly byte[] encodingTable =
- {
- (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G',
- (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N',
- (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U',
- (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z',
- (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g',
- (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n',
- (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u',
- (byte)'v',
- (byte)'w', (byte)'x', (byte)'y', (byte)'z',
- (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6',
- (byte)'7', (byte)'8', (byte)'9',
- (byte)'+', (byte)'/'
- };
-
- protected byte padding = (byte)'=';
-
- /*
- * set up the decoding table.
- */
- protected readonly byte[] decodingTable = new byte[128];
-
- protected void InitialiseDecodingTable()
- {
- Arrays.Fill(decodingTable, (byte)0xff);
-
- for (int i = 0; i < encodingTable.Length; i++)
- {
- decodingTable[encodingTable[i]] = (byte)i;
- }
- }
-
- public Base64Encoder()
- {
- InitialiseDecodingTable();
- }
-
- /**
- * encode the input data producing a base 64 output stream.
- *
- * @return the number of bytes produced.
- */
- public int Encode(
- byte[] data,
- int off,
- int length,
- Stream outStream)
- {
- int modulus = length % 3;
- int dataLength = (length - modulus);
- int a1, a2, a3;
-
- for (int i = off; i < off + dataLength; i += 3)
- {
- a1 = data[i] & 0xff;
- a2 = data[i + 1] & 0xff;
- a3 = data[i + 2] & 0xff;
-
- outStream.WriteByte(encodingTable[(int) ((uint) a1 >> 2) & 0x3f]);
- outStream.WriteByte(encodingTable[((a1 << 4) | (int) ((uint) a2 >> 4)) & 0x3f]);
- outStream.WriteByte(encodingTable[((a2 << 2) | (int) ((uint) a3 >> 6)) & 0x3f]);
- outStream.WriteByte(encodingTable[a3 & 0x3f]);
- }
-
- /*
- * process the tail end.
- */
- int b1, b2, b3;
- int d1, d2;
-
- switch (modulus)
- {
- case 0: /* nothing left to do */
- break;
- case 1:
- d1 = data[off + dataLength] & 0xff;
- b1 = (d1 >> 2) & 0x3f;
- b2 = (d1 << 4) & 0x3f;
-
- outStream.WriteByte(encodingTable[b1]);
- outStream.WriteByte(encodingTable[b2]);
- outStream.WriteByte(padding);
- outStream.WriteByte(padding);
- break;
- case 2:
- d1 = data[off + dataLength] & 0xff;
- d2 = data[off + dataLength + 1] & 0xff;
-
- b1 = (d1 >> 2) & 0x3f;
- b2 = ((d1 << 4) | (d2 >> 4)) & 0x3f;
- b3 = (d2 << 2) & 0x3f;
-
- outStream.WriteByte(encodingTable[b1]);
- outStream.WriteByte(encodingTable[b2]);
- outStream.WriteByte(encodingTable[b3]);
- outStream.WriteByte(padding);
- break;
- }
-
- return (dataLength / 3) * 4 + ((modulus == 0) ? 0 : 4);
- }
-
- private bool ignore(
- char c)
- {
- return (c == '\n' || c =='\r' || c == '\t' || c == ' ');
- }
-
- /**
- * decode the base 64 encoded byte data writing it to the given output stream,
- * whitespace characters will be ignored.
- *
- * @return the number of bytes produced.
- */
- public int Decode(
- byte[] data,
- int off,
- int length,
- Stream outStream)
- {
- byte b1, b2, b3, b4;
- int outLen = 0;
-
- int end = off + length;
-
- while (end > off)
- {
- if (!ignore((char)data[end - 1]))
- {
- break;
- }
-
- end--;
- }
-
- int i = off;
- int finish = end - 4;
-
- i = nextI(data, i, finish);
-
- while (i < finish)
- {
- b1 = decodingTable[data[i++]];
-
- i = nextI(data, i, finish);
-
- b2 = decodingTable[data[i++]];
-
- i = nextI(data, i, finish);
-
- b3 = decodingTable[data[i++]];
-
- i = nextI(data, i, finish);
-
- b4 = decodingTable[data[i++]];
-
- if ((b1 | b2 | b3 | b4) >= 0x80)
- throw new IOException("invalid characters encountered in base64 data");
-
- outStream.WriteByte((byte)((b1 << 2) | (b2 >> 4)));
- outStream.WriteByte((byte)((b2 << 4) | (b3 >> 2)));
- outStream.WriteByte((byte)((b3 << 6) | b4));
-
- outLen += 3;
-
- i = nextI(data, i, finish);
- }
-
- outLen += decodeLastBlock(outStream, (char)data[end - 4], (char)data[end - 3], (char)data[end - 2], (char)data[end - 1]);
-
- return outLen;
- }
-
- private int nextI(
- byte[] data,
- int i,
- int finish)
- {
- while ((i < finish) && ignore((char)data[i]))
- {
- i++;
- }
- return i;
- }
-
- /**
- * decode the base 64 encoded string data writing it to the given output stream,
- * whitespace characters will be ignored.
- *
- * @return the number of bytes produced.
- */
- public int DecodeString(
- string data,
- Stream outStream)
- {
- // Platform Implementation
-// byte[] bytes = Convert.FromBase64String(data);
-// outStream.Write(bytes, 0, bytes.Length);
-// return bytes.Length;
-
- byte b1, b2, b3, b4;
- int length = 0;
-
- int end = data.Length;
-
- while (end > 0)
- {
- if (!ignore(data[end - 1]))
- {
- break;
- }
-
- end--;
- }
-
- int i = 0;
- int finish = end - 4;
-
- i = nextI(data, i, finish);
-
- while (i < finish)
- {
- b1 = decodingTable[data[i++]];
-
- i = nextI(data, i, finish);
-
- b2 = decodingTable[data[i++]];
-
- i = nextI(data, i, finish);
-
- b3 = decodingTable[data[i++]];
-
- i = nextI(data, i, finish);
-
- b4 = decodingTable[data[i++]];
-
- if ((b1 | b2 | b3 | b4) >= 0x80)
- throw new IOException("invalid characters encountered in base64 data");
-
- outStream.WriteByte((byte)((b1 << 2) | (b2 >> 4)));
- outStream.WriteByte((byte)((b2 << 4) | (b3 >> 2)));
- outStream.WriteByte((byte)((b3 << 6) | b4));
-
- length += 3;
-
- i = nextI(data, i, finish);
- }
-
- length += decodeLastBlock(outStream, data[end - 4], data[end - 3], data[end - 2], data[end - 1]);
-
- return length;
- }
-
- private int decodeLastBlock(
- Stream outStream,
- char c1,
- char c2,
- char c3,
- char c4)
- {
- if (c3 == padding)
- {
- byte b1 = decodingTable[c1];
- byte b2 = decodingTable[c2];
-
- if ((b1 | b2) >= 0x80)
- throw new IOException("invalid characters encountered at end of base64 data");
-
- outStream.WriteByte((byte)((b1 << 2) | (b2 >> 4)));
-
- return 1;
- }
-
- if (c4 == padding)
- {
- byte b1 = decodingTable[c1];
- byte b2 = decodingTable[c2];
- byte b3 = decodingTable[c3];
-
- if ((b1 | b2 | b3) >= 0x80)
- throw new IOException("invalid characters encountered at end of base64 data");
-
- outStream.WriteByte((byte)((b1 << 2) | (b2 >> 4)));
- outStream.WriteByte((byte)((b2 << 4) | (b3 >> 2)));
-
- return 2;
- }
-
- {
- byte b1 = decodingTable[c1];
- byte b2 = decodingTable[c2];
- byte b3 = decodingTable[c3];
- byte b4 = decodingTable[c4];
-
- if ((b1 | b2 | b3 | b4) >= 0x80)
- throw new IOException("invalid characters encountered at end of base64 data");
-
- outStream.WriteByte((byte)((b1 << 2) | (b2 >> 4)));
- outStream.WriteByte((byte)((b2 << 4) | (b3 >> 2)));
- outStream.WriteByte((byte)((b3 << 6) | b4));
-
- return 3;
- }
- }
-
- private int nextI(string data, int i, int finish)
- {
- while ((i < finish) && ignore(data[i]))
- {
- i++;
- }
- return i;
- }
- }
-}
diff --git a/BCCrypto/src/util/encoders/BufferedDecoder.cs b/BCCrypto/src/util/encoders/BufferedDecoder.cs
deleted file mode 100644
index 633cf1e..0000000
--- a/BCCrypto/src/util/encoders/BufferedDecoder.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities.Encoders
-{
- ///
- /// A buffering class to allow translation from one format to another to
- /// be done in discrete chunks.
- ///
- public class BufferedDecoder
- {
- internal byte[] buffer;
- internal int bufOff;
-
- internal ITranslator translator;
-
- ///
- /// Create a buffered Decoder.
- ///
- /// The translater to use.
- /// The size of the buffer.
- public BufferedDecoder(
- ITranslator translator,
- int bufferSize)
- {
- this.translator = translator;
-
- if ((bufferSize % translator.GetEncodedBlockSize()) != 0)
- {
- throw new ArgumentException("buffer size not multiple of input block size");
- }
-
- buffer = new byte[bufferSize];
-// bufOff = 0;
- }
-
- ///
- /// Process one byte of data.
- ///
- /// Data in.
- /// Byte array for the output.
- /// The offset in the output byte array to start writing from.
- /// The amount of output bytes.
- public int ProcessByte(
- byte input,
- byte[] output,
- int outOff)
- {
- int resultLen = 0;
-
- buffer[bufOff++] = input;
-
- if (bufOff == buffer.Length)
- {
- resultLen = translator.Decode(buffer, 0, buffer.Length, output, outOff);
- bufOff = 0;
- }
-
- return resultLen;
- }
-
-
- ///
- /// Process data from a byte array.
- ///
- /// The input data.
- /// Start position within input data array.
- /// Amount of data to process from input data array.
- /// Array to store output.
- /// Position in output array to start writing from.
- /// The amount of output bytes.
- public int ProcessBytes(
- byte[] input,
- int inOff,
- int len,
- byte[] outBytes,
- int outOff)
- {
- if (len < 0)
- {
- throw new ArgumentException("Can't have a negative input length!");
- }
-
- int resultLen = 0;
- int gapLen = buffer.Length - bufOff;
-
- if (len > gapLen)
- {
- Array.Copy(input, inOff, buffer, bufOff, gapLen);
-
- resultLen += translator.Decode(buffer, 0, buffer.Length, outBytes, outOff);
-
- bufOff = 0;
-
- len -= gapLen;
- inOff += gapLen;
- outOff += resultLen;
-
- int chunkSize = len - (len % buffer.Length);
-
- resultLen += translator.Decode(input, inOff, chunkSize, outBytes, outOff);
-
- len -= chunkSize;
- inOff += chunkSize;
- }
-
- if (len != 0)
- {
- Array.Copy(input, inOff, buffer, bufOff, len);
-
- bufOff += len;
- }
-
- return resultLen;
- }
- }
-
-}
diff --git a/BCCrypto/src/util/encoders/BufferedEncoder.cs b/BCCrypto/src/util/encoders/BufferedEncoder.cs
deleted file mode 100644
index 5c3b1ab..0000000
--- a/BCCrypto/src/util/encoders/BufferedEncoder.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities.Encoders
-{
- ///
- /// A class that allows encoding of data using a specific encoder to be processed in chunks.
- ///
- public class BufferedEncoder
- {
- internal byte[] Buffer;
- internal int bufOff;
-
- internal ITranslator translator;
-
-
- ///
- /// Create.
- ///
- /// The translator to use.
- /// Size of the chunks.
- public BufferedEncoder(
- ITranslator translator,
- int bufferSize)
- {
- this.translator = translator;
-
- if ((bufferSize % translator.GetEncodedBlockSize()) != 0)
- {
- throw new ArgumentException("buffer size not multiple of input block size");
- }
-
- Buffer = new byte[bufferSize];
-// bufOff = 0;
- }
-
-
- ///
- /// Process one byte of data.
- ///
- /// The byte.
- /// An array to store output in.
- /// Offset within output array to start writing from.
- ///
- public int ProcessByte(
- byte input,
- byte[] outBytes,
- int outOff)
- {
- int resultLen = 0;
-
- Buffer[bufOff++] = input;
-
- if (bufOff == Buffer.Length)
- {
- resultLen = translator.Encode(Buffer, 0, Buffer.Length, outBytes, outOff);
- bufOff = 0;
- }
-
- return resultLen;
- }
-
- ///
- /// Process data from a byte array.
- ///
- /// Input data Byte array containing data to be processed.
- /// Start position within input data array.
- /// Amount of input data to be processed.
- /// Output data array.
- /// Offset within output data array to start writing to.
- /// The amount of data written.
- public int ProcessBytes(
- byte[] input,
- int inOff,
- int len,
- byte[] outBytes,
- int outOff)
- {
- if (len < 0)
- {
- throw new ArgumentException("Can't have a negative input length!");
- }
-
- int resultLen = 0;
- int gapLen = Buffer.Length - bufOff;
-
- if (len > gapLen)
- {
- Array.Copy(input, inOff, Buffer, bufOff, gapLen);
-
- resultLen += translator.Encode(Buffer, 0, Buffer.Length, outBytes, outOff);
-
- bufOff = 0;
-
- len -= gapLen;
- inOff += gapLen;
- outOff += resultLen;
-
- int chunkSize = len - (len % Buffer.Length);
-
- resultLen += translator.Encode(input, inOff, chunkSize, outBytes, outOff);
-
- len -= chunkSize;
- inOff += chunkSize;
- }
-
- if (len != 0)
- {
- Array.Copy(input, inOff, Buffer, bufOff, len);
-
- bufOff += len;
- }
-
- return resultLen;
- }
- }
-
-}
diff --git a/BCCrypto/src/util/encoders/Hex.cs b/BCCrypto/src/util/encoders/Hex.cs
deleted file mode 100644
index 3540a9d..0000000
--- a/BCCrypto/src/util/encoders/Hex.cs
+++ /dev/null
@@ -1,130 +0,0 @@
-using System;
-using System.IO;
-using System.Text;
-
-namespace Org.BouncyCastle.Utilities.Encoders
-{
- ///
- /// Class to decode and encode Hex.
- ///
- public sealed class Hex
- {
- private static readonly IEncoder encoder = new HexEncoder();
-
- private Hex()
- {
- }
-
- public static string ToHexString(
- byte[] data)
- {
- return ToHexString(data, 0, data.Length);
- }
-
- public static string ToHexString(
- byte[] data,
- int off,
- int length)
- {
- byte[] hex = Encode(data, off, length);
- return Strings.FromAsciiByteArray(hex);
- }
-
- /**
- * encode the input data producing a Hex encoded byte array.
- *
- * @return a byte array containing the Hex encoded data.
- */
- public static byte[] Encode(
- byte[] data)
- {
- return Encode(data, 0, data.Length);
- }
-
- /**
- * encode the input data producing a Hex encoded byte array.
- *
- * @return a byte array containing the Hex encoded data.
- */
- public static byte[] Encode(
- byte[] data,
- int off,
- int length)
- {
- MemoryStream bOut = new MemoryStream(length * 2);
-
- encoder.Encode(data, off, length, bOut);
-
- return bOut.ToArray();
- }
-
- /**
- * Hex encode the byte data writing it to the given output stream.
- *
- * @return the number of bytes produced.
- */
- public static int Encode(
- byte[] data,
- Stream outStream)
- {
- return encoder.Encode(data, 0, data.Length, outStream);
- }
-
- /**
- * Hex encode the byte data writing it to the given output stream.
- *
- * @return the number of bytes produced.
- */
- public static int Encode(
- byte[] data,
- int off,
- int length,
- Stream outStream)
- {
- return encoder.Encode(data, off, length, outStream);
- }
-
- /**
- * decode the Hex encoded input data. It is assumed the input data is valid.
- *
- * @return a byte array representing the decoded data.
- */
- public static byte[] Decode(
- byte[] data)
- {
- MemoryStream bOut = new MemoryStream((data.Length + 1) / 2);
-
- encoder.Decode(data, 0, data.Length, bOut);
-
- return bOut.ToArray();
- }
-
- /**
- * decode the Hex encoded string data - whitespace will be ignored.
- *
- * @return a byte array representing the decoded data.
- */
- public static byte[] Decode(
- string data)
- {
- MemoryStream bOut = new MemoryStream((data.Length + 1) / 2);
-
- encoder.DecodeString(data, bOut);
-
- return bOut.ToArray();
- }
-
- /**
- * decode the Hex encoded string data writing it to the given output stream,
- * whitespace characters will be ignored.
- *
- * @return the number of bytes produced.
- */
- public static int Decode(
- string data,
- Stream outStream)
- {
- return encoder.DecodeString(data, outStream);
- }
- }
-}
diff --git a/BCCrypto/src/util/encoders/HexEncoder.cs b/BCCrypto/src/util/encoders/HexEncoder.cs
deleted file mode 100644
index af526e0..0000000
--- a/BCCrypto/src/util/encoders/HexEncoder.cs
+++ /dev/null
@@ -1,176 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.Encoders
-{
- public class HexEncoder
- : IEncoder
- {
- protected readonly byte[] encodingTable =
- {
- (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7',
- (byte)'8', (byte)'9', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f'
- };
-
- /*
- * set up the decoding table.
- */
- protected readonly byte[] decodingTable = new byte[128];
-
- protected void InitialiseDecodingTable()
- {
- Arrays.Fill(decodingTable, (byte)0xff);
-
- for (int i = 0; i < encodingTable.Length; i++)
- {
- decodingTable[encodingTable[i]] = (byte)i;
- }
-
- decodingTable['A'] = decodingTable['a'];
- decodingTable['B'] = decodingTable['b'];
- decodingTable['C'] = decodingTable['c'];
- decodingTable['D'] = decodingTable['d'];
- decodingTable['E'] = decodingTable['e'];
- decodingTable['F'] = decodingTable['f'];
- }
-
- public HexEncoder()
- {
- InitialiseDecodingTable();
- }
-
- /**
- * encode the input data producing a Hex output stream.
- *
- * @return the number of bytes produced.
- */
- public int Encode(
- byte[] data,
- int off,
- int length,
- Stream outStream)
- {
- for (int i = off; i < (off + length); i++)
- {
- int v = data[i];
-
- outStream.WriteByte(encodingTable[v >> 4]);
- outStream.WriteByte(encodingTable[v & 0xf]);
- }
-
- return length * 2;
- }
-
- private static bool Ignore(char c)
- {
- return c == '\n' || c =='\r' || c == '\t' || c == ' ';
- }
-
- /**
- * decode the Hex encoded byte data writing it to the given output stream,
- * whitespace characters will be ignored.
- *
- * @return the number of bytes produced.
- */
- public int Decode(
- byte[] data,
- int off,
- int length,
- Stream outStream)
- {
- byte b1, b2;
- int outLen = 0;
- int end = off + length;
-
- while (end > off)
- {
- if (!Ignore((char)data[end - 1]))
- {
- break;
- }
-
- end--;
- }
-
- int i = off;
- while (i < end)
- {
- while (i < end && Ignore((char)data[i]))
- {
- i++;
- }
-
- b1 = decodingTable[data[i++]];
-
- while (i < end && Ignore((char)data[i]))
- {
- i++;
- }
-
- b2 = decodingTable[data[i++]];
-
- if ((b1 | b2) >= 0x80)
- throw new IOException("invalid characters encountered in Hex data");
-
- outStream.WriteByte((byte)((b1 << 4) | b2));
-
- outLen++;
- }
-
- return outLen;
- }
-
- /**
- * decode the Hex encoded string data writing it to the given output stream,
- * whitespace characters will be ignored.
- *
- * @return the number of bytes produced.
- */
- public int DecodeString(
- string data,
- Stream outStream)
- {
- byte b1, b2;
- int length = 0;
-
- int end = data.Length;
-
- while (end > 0)
- {
- if (!Ignore(data[end - 1]))
- {
- break;
- }
-
- end--;
- }
-
- int i = 0;
- while (i < end)
- {
- while (i < end && Ignore(data[i]))
- {
- i++;
- }
-
- b1 = decodingTable[data[i++]];
-
- while (i < end && Ignore(data[i]))
- {
- i++;
- }
-
- b2 = decodingTable[data[i++]];
-
- if ((b1 | b2) >= 0x80)
- throw new IOException("invalid characters encountered in Hex data");
-
- outStream.WriteByte((byte)((b1 << 4) | b2));
-
- length++;
- }
-
- return length;
- }
- }
-}
diff --git a/BCCrypto/src/util/encoders/HexTranslator.cs b/BCCrypto/src/util/encoders/HexTranslator.cs
deleted file mode 100644
index 9775b69..0000000
--- a/BCCrypto/src/util/encoders/HexTranslator.cs
+++ /dev/null
@@ -1,108 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities.Encoders
-{
- ///
- /// A hex translator.
- ///
- public class HexTranslator : ITranslator
- {
- private static readonly byte[] hexTable =
- {
- (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7',
- (byte)'8', (byte)'9', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f'
- };
-
- ///
- /// Return encoded block size.
- ///
- /// 2
- public int GetEncodedBlockSize()
- {
- return 2;
- }
-
- ///
- /// Encode some data.
- ///
- /// Input data array.
- /// Start position within input data array.
- /// The amount of data to process.
- /// The output data array.
- /// The offset within the output data array to start writing from.
- /// Amount of data encoded.
- public int Encode(
- byte[] input,
- int inOff,
- int length,
- byte[] outBytes,
- int outOff)
- {
- for (int i = 0, j = 0; i < length; i++, j += 2)
- {
- outBytes[outOff + j] = hexTable[(input[inOff] >> 4) & 0x0f];
- outBytes[outOff + j + 1] = hexTable[input[inOff] & 0x0f];
-
- inOff++;
- }
-
- return length * 2;
- }
-
- ///
- /// Returns the decoded block size.
- ///
- /// 1
- public int GetDecodedBlockSize()
- {
- return 1;
- }
-
- ///
- /// Decode data from a byte array.
- ///
- /// The input data array.
- /// Start position within input data array.
- /// The amounty of data to process.
- /// The output data array.
- /// The position within the output data array to start writing from.
- /// The amount of data written.
- public int Decode(
- byte[] input,
- int inOff,
- int length,
- byte[] outBytes,
- int outOff)
- {
- int halfLength = length / 2;
- byte left, right;
- for (int i = 0; i < halfLength; i++)
- {
- left = input[inOff + i * 2];
- right = input[inOff + i * 2 + 1];
-
- if (left < (byte)'a')
- {
- outBytes[outOff] = (byte)((left - '0') << 4);
- }
- else
- {
- outBytes[outOff] = (byte)((left - 'a' + 10) << 4);
- }
- if (right < (byte)'a')
- {
- outBytes[outOff] += (byte)(right - '0');
- }
- else
- {
- outBytes[outOff] += (byte)(right - 'a' + 10);
- }
-
- outOff++;
- }
-
- return halfLength;
- }
- }
-
-}
diff --git a/BCCrypto/src/util/encoders/IEncoder.cs b/BCCrypto/src/util/encoders/IEncoder.cs
deleted file mode 100644
index 5887d5d..0000000
--- a/BCCrypto/src/util/encoders/IEncoder.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.Encoders
-{
- /**
- * Encode and decode byte arrays (typically from binary to 7-bit ASCII
- * encodings).
- */
- public interface IEncoder
- {
- int Encode(byte[] data, int off, int length, Stream outStream);
-
- int Decode(byte[] data, int off, int length, Stream outStream);
-
- int DecodeString(string data, Stream outStream);
- }
-}
diff --git a/BCCrypto/src/util/encoders/Translator.cs b/BCCrypto/src/util/encoders/Translator.cs
deleted file mode 100644
index 10bd24b..0000000
--- a/BCCrypto/src/util/encoders/Translator.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities.Encoders
-{
- ///
- /// Translator interface.
- ///
- public interface ITranslator
- {
- int GetEncodedBlockSize();
-
- int Encode(byte[] input, int inOff, int length, byte[] outBytes, int outOff);
-
- int GetDecodedBlockSize();
-
- int Decode(byte[] input, int inOff, int length, byte[] outBytes, int outOff);
- }
-
-}
diff --git a/BCCrypto/src/util/encoders/UrlBase64.cs b/BCCrypto/src/util/encoders/UrlBase64.cs
deleted file mode 100644
index 94195ef..0000000
--- a/BCCrypto/src/util/encoders/UrlBase64.cs
+++ /dev/null
@@ -1,127 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.Encoders
-{
- /**
- * Convert binary data to and from UrlBase64 encoding. This is identical to
- * Base64 encoding, except that the padding character is "." and the other
- * non-alphanumeric characters are "-" and "_" instead of "+" and "/".
- *
- * The purpose of UrlBase64 encoding is to provide a compact encoding of binary
- * data that is safe for use as an URL parameter. Base64 encoding does not
- * produce encoded values that are safe for use in URLs, since "/" can be
- * interpreted as a path delimiter; "+" is the encoded form of a space; and
- * "=" is used to separate a name from the corresponding value in an URL
- * parameter.
- *
- */
- public class UrlBase64
- {
- private static readonly IEncoder encoder = new UrlBase64Encoder();
-
- /**
- * Encode the input data producing a URL safe base 64 encoded byte array.
- *
- * @return a byte array containing the URL safe base 64 encoded data.
- */
- public static byte[] Encode(
- byte[] data)
- {
- MemoryStream bOut = new MemoryStream();
-
- try
- {
- encoder.Encode(data, 0, data.Length, bOut);
- }
- catch (IOException e)
- {
- throw new Exception("exception encoding URL safe base64 string: " + e.Message, e);
- }
-
- return bOut.ToArray();
- }
-
- /**
- * Encode the byte data writing it to the given output stream.
- *
- * @return the number of bytes produced.
- */
- public static int Encode(
- byte[] data,
- Stream outStr)
- {
- return encoder.Encode(data, 0, data.Length, outStr);
- }
-
- /**
- * Decode the URL safe base 64 encoded input data - white space will be ignored.
- *
- * @return a byte array representing the decoded data.
- */
- public static byte[] Decode(
- byte[] data)
- {
- MemoryStream bOut = new MemoryStream();
-
- try
- {
- encoder.Decode(data, 0, data.Length, bOut);
- }
- catch (IOException e)
- {
- throw new Exception("exception decoding URL safe base64 string: " + e.Message, e);
- }
-
- return bOut.ToArray();
- }
-
- /**
- * decode the URL safe base 64 encoded byte data writing it to the given output stream,
- * whitespace characters will be ignored.
- *
- * @return the number of bytes produced.
- */
- public static int Decode(
- byte[] data,
- Stream outStr)
- {
- return encoder.Decode(data, 0, data.Length, outStr);
- }
-
- /**
- * decode the URL safe base 64 encoded string data - whitespace will be ignored.
- *
- * @return a byte array representing the decoded data.
- */
- public static byte[] Decode(
- string data)
- {
- MemoryStream bOut = new MemoryStream();
-
- try
- {
- encoder.DecodeString(data, bOut);
- }
- catch (IOException e)
- {
- throw new Exception("exception decoding URL safe base64 string: " + e.Message, e);
- }
-
- return bOut.ToArray();
- }
-
- /**
- * Decode the URL safe base 64 encoded string data writing it to the given output stream,
- * whitespace characters will be ignored.
- *
- * @return the number of bytes produced.
- */
- public static int Decode(
- string data,
- Stream outStr)
- {
- return encoder.DecodeString(data, outStr);
- }
- }
-}
diff --git a/BCCrypto/src/util/encoders/UrlBase64Encoder.cs b/BCCrypto/src/util/encoders/UrlBase64Encoder.cs
deleted file mode 100644
index 5611a83..0000000
--- a/BCCrypto/src/util/encoders/UrlBase64Encoder.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.Encoders
-{
- /**
- * Convert binary data to and from UrlBase64 encoding. This is identical to
- * Base64 encoding, except that the padding character is "." and the other
- * non-alphanumeric characters are "-" and "_" instead of "+" and "/".
- *
- * The purpose of UrlBase64 encoding is to provide a compact encoding of binary
- * data that is safe for use as an URL parameter. Base64 encoding does not
- * produce encoded values that are safe for use in URLs, since "/" can be
- * interpreted as a path delimiter; "+" is the encoded form of a space; and
- * "=" is used to separate a name from the corresponding value in an URL
- * parameter.
- *
- */
- public class UrlBase64Encoder
- : Base64Encoder
- {
- public UrlBase64Encoder()
- {
- encodingTable[encodingTable.Length - 2] = (byte) '-';
- encodingTable[encodingTable.Length - 1] = (byte) '_';
- padding = (byte) '.';
- // we must re-create the decoding table with the new encoded values.
- InitialiseDecodingTable();
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/util/io/BaseInputStream.cs b/BCCrypto/src/util/io/BaseInputStream.cs
deleted file mode 100644
index a5613d8..0000000
--- a/BCCrypto/src/util/io/BaseInputStream.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.IO
-{
- public abstract class BaseInputStream : Stream
- {
- private bool closed;
-
- public sealed override bool CanRead { get { return !closed; } }
- public sealed override bool CanSeek { get { return false; } }
- public sealed override bool CanWrite { get { return false; } }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- closed = true;
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- closed = true;
- base.Close();
- }
-#endif
-
- public sealed override void Flush() {}
- public sealed override long Length { get { throw new NotSupportedException(); } }
- public sealed override long Position
- {
- get { throw new NotSupportedException(); }
- set { throw new NotSupportedException(); }
- }
-
- public override int Read(byte[] buffer, int offset, int count)
- {
- int pos = offset;
- try
- {
- int end = offset + count;
- while (pos < end)
- {
- int b = ReadByte();
- if (b == -1) break;
- buffer[pos++] = (byte) b;
- }
- }
- catch (IOException)
- {
- if (pos == offset) throw;
- }
- return pos - offset;
- }
-
- public sealed override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); }
- public sealed override void SetLength(long value) { throw new NotSupportedException(); }
- public sealed override void Write(byte[] buffer, int offset, int count) { throw new NotSupportedException(); }
- }
-}
diff --git a/BCCrypto/src/util/io/BaseOutputStream.cs b/BCCrypto/src/util/io/BaseOutputStream.cs
deleted file mode 100644
index 0dbe821..0000000
--- a/BCCrypto/src/util/io/BaseOutputStream.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.IO
-{
- public abstract class BaseOutputStream : Stream
- {
- private bool closed;
-
- public sealed override bool CanRead { get { return false; } }
- public sealed override bool CanSeek { get { return false; } }
- public sealed override bool CanWrite { get { return !closed; } }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- closed = true;
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- closed = true;
- base.Close();
- }
-#endif
-
- public override void Flush() { }
- public sealed override long Length { get { throw new NotSupportedException(); } }
- public sealed override long Position
- {
- get { throw new NotSupportedException(); }
- set { throw new NotSupportedException(); }
- }
- public sealed override int Read(byte[] buffer, int offset, int count) { throw new NotSupportedException(); }
- public sealed override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); }
- public sealed override void SetLength(long value) { throw new NotSupportedException(); }
-
- public override void Write(byte[] buffer, int offset, int count)
- {
- Debug.Assert(buffer != null);
- Debug.Assert(0 <= offset && offset <= buffer.Length);
- Debug.Assert(count >= 0);
-
- int end = offset + count;
-
- Debug.Assert(0 <= end && end <= buffer.Length);
-
- for (int i = offset; i < end; ++i)
- {
- this.WriteByte(buffer[i]);
- }
- }
-
- public virtual void Write(params byte[] buffer)
- {
- Write(buffer, 0, buffer.Length);
- }
-
- public override void WriteByte(byte b)
- {
- Write(new byte[]{ b }, 0, 1);
- }
- }
-}
diff --git a/BCCrypto/src/util/io/FilterStream.cs b/BCCrypto/src/util/io/FilterStream.cs
deleted file mode 100644
index a92dee3..0000000
--- a/BCCrypto/src/util/io/FilterStream.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.IO
-{
- public class FilterStream : Stream
- {
- public FilterStream(Stream s)
- {
- this.s = s;
- }
- public override bool CanRead
- {
- get { return s.CanRead; }
- }
- public override bool CanSeek
- {
- get { return s.CanSeek; }
- }
- public override bool CanWrite
- {
- get { return s.CanWrite; }
- }
- public override long Length
- {
- get { return s.Length; }
- }
- public override long Position
- {
- get { return s.Position; }
- set { s.Position = value; }
- }
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Platform.Dispose(s);
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Platform.Dispose(s);
- base.Close();
- }
-#endif
- public override void Flush()
- {
- s.Flush();
- }
- public override long Seek(long offset, SeekOrigin origin)
- {
- return s.Seek(offset, origin);
- }
- public override void SetLength(long value)
- {
- s.SetLength(value);
- }
- public override int Read(byte[] buffer, int offset, int count)
- {
- return s.Read(buffer, offset, count);
- }
- public override int ReadByte()
- {
- return s.ReadByte();
- }
- public override void Write(byte[] buffer, int offset, int count)
- {
- s.Write(buffer, offset, count);
- }
- public override void WriteByte(byte value)
- {
- s.WriteByte(value);
- }
- protected readonly Stream s;
- }
-}
diff --git a/BCCrypto/src/util/io/NullOutputStream.cs b/BCCrypto/src/util/io/NullOutputStream.cs
deleted file mode 100644
index 13877fa..0000000
--- a/BCCrypto/src/util/io/NullOutputStream.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities.IO
-{
- internal class NullOutputStream
- : BaseOutputStream
- {
- public override void WriteByte(byte b)
- {
- // do nothing
- }
-
- public override void Write(byte[] buffer, int offset, int count)
- {
- // do nothing
- }
- }
-}
diff --git a/BCCrypto/src/util/io/PushbackStream.cs b/BCCrypto/src/util/io/PushbackStream.cs
deleted file mode 100644
index 9546942..0000000
--- a/BCCrypto/src/util/io/PushbackStream.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1.Utilities;
-
-namespace Org.BouncyCastle.Utilities.IO
-{
- public class PushbackStream
- : FilterStream
- {
- private int buf = -1;
-
- public PushbackStream(
- Stream s)
- : base(s)
- {
- }
-
- public override int ReadByte()
- {
- if (buf != -1)
- {
- int tmp = buf;
- buf = -1;
- return tmp;
- }
-
- return base.ReadByte();
- }
-
- public override int Read(byte[] buffer, int offset, int count)
- {
- if (buf != -1 && count > 0)
- {
- // TODO Can this case be made more efficient?
- buffer[offset] = (byte) buf;
- buf = -1;
- return 1;
- }
-
- return base.Read(buffer, offset, count);
- }
-
- public virtual void Unread(int b)
- {
- if (buf != -1)
- throw new InvalidOperationException("Can only push back one byte");
-
- buf = b & 0xFF;
- }
- }
-}
diff --git a/BCCrypto/src/util/io/StreamOverflowException.cs b/BCCrypto/src/util/io/StreamOverflowException.cs
deleted file mode 100644
index 36d21e2..0000000
--- a/BCCrypto/src/util/io/StreamOverflowException.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.IO
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class StreamOverflowException
- : IOException
- {
- public StreamOverflowException()
- : base()
- {
- }
-
- public StreamOverflowException(
- string message)
- : base(message)
- {
- }
-
- public StreamOverflowException(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/util/io/Streams.cs b/BCCrypto/src/util/io/Streams.cs
deleted file mode 100644
index cc7fa92..0000000
--- a/BCCrypto/src/util/io/Streams.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.IO
-{
- public sealed class Streams
- {
- private const int BufferSize = 512;
-
- private Streams()
- {
- }
-
- public static void Drain(Stream inStr)
- {
- byte[] bs = new byte[BufferSize];
- while (inStr.Read(bs, 0, bs.Length) > 0)
- {
- }
- }
-
- public static byte[] ReadAll(Stream inStr)
- {
- MemoryStream buf = new MemoryStream();
- PipeAll(inStr, buf);
- return buf.ToArray();
- }
-
- public static byte[] ReadAllLimited(Stream inStr, int limit)
- {
- MemoryStream buf = new MemoryStream();
- PipeAllLimited(inStr, limit, buf);
- return buf.ToArray();
- }
-
- public static int ReadFully(Stream inStr, byte[] buf)
- {
- return ReadFully(inStr, buf, 0, buf.Length);
- }
-
- public static int ReadFully(Stream inStr, byte[] buf, int off, int len)
- {
- int totalRead = 0;
- while (totalRead < len)
- {
- int numRead = inStr.Read(buf, off + totalRead, len - totalRead);
- if (numRead < 1)
- break;
- totalRead += numRead;
- }
- return totalRead;
- }
-
- public static void PipeAll(Stream inStr, Stream outStr)
- {
- byte[] bs = new byte[BufferSize];
- int numRead;
- while ((numRead = inStr.Read(bs, 0, bs.Length)) > 0)
- {
- outStr.Write(bs, 0, numRead);
- }
- }
-
- ///
- /// Pipe all bytes from inStr to outStr , throwing StreamFlowException if greater
- /// than limit bytes in inStr .
- ///
- ///
- /// A
- ///
- ///
- /// A
- ///
- ///
- /// A
- ///
- /// The number of bytes actually transferred, if not greater than limit
- ///
- public static long PipeAllLimited(Stream inStr, long limit, Stream outStr)
- {
- byte[] bs = new byte[BufferSize];
- long total = 0;
- int numRead;
- while ((numRead = inStr.Read(bs, 0, bs.Length)) > 0)
- {
- if ((limit - total) < numRead)
- throw new StreamOverflowException("Data Overflow");
- total += numRead;
- outStr.Write(bs, 0, numRead);
- }
- return total;
- }
-
- ///
- public static void WriteBufTo(MemoryStream buf, Stream output)
- {
- buf.WriteTo(output);
- }
- }
-}
diff --git a/BCCrypto/src/util/io/TeeInputStream.cs b/BCCrypto/src/util/io/TeeInputStream.cs
deleted file mode 100644
index 6996f3f..0000000
--- a/BCCrypto/src/util/io/TeeInputStream.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.IO
-{
- public class TeeInputStream
- : BaseInputStream
- {
- private readonly Stream input, tee;
-
- public TeeInputStream(Stream input, Stream tee)
- {
- Debug.Assert(input.CanRead);
- Debug.Assert(tee.CanWrite);
-
- this.input = input;
- this.tee = tee;
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Platform.Dispose(input);
- Platform.Dispose(tee);
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Platform.Dispose(input);
- Platform.Dispose(tee);
- base.Close();
- }
-#endif
-
- public override int Read(byte[] buf, int off, int len)
- {
- int i = input.Read(buf, off, len);
-
- if (i > 0)
- {
- tee.Write(buf, off, i);
- }
-
- return i;
- }
-
- public override int ReadByte()
- {
- int i = input.ReadByte();
-
- if (i >= 0)
- {
- tee.WriteByte((byte)i);
- }
-
- return i;
- }
- }
-}
diff --git a/BCCrypto/src/util/io/TeeOutputStream.cs b/BCCrypto/src/util/io/TeeOutputStream.cs
deleted file mode 100644
index a6c7fd5..0000000
--- a/BCCrypto/src/util/io/TeeOutputStream.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.IO
-{
- public class TeeOutputStream
- : BaseOutputStream
- {
- private readonly Stream output, tee;
-
- public TeeOutputStream(Stream output, Stream tee)
- {
- Debug.Assert(output.CanWrite);
- Debug.Assert(tee.CanWrite);
-
- this.output = output;
- this.tee = tee;
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Platform.Dispose(output);
- Platform.Dispose(tee);
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close()
- {
- Platform.Dispose(output);
- Platform.Dispose(tee);
- base.Close();
- }
-#endif
-
- public override void Write(byte[] buffer, int offset, int count)
- {
- output.Write(buffer, offset, count);
- tee.Write(buffer, offset, count);
- }
-
- public override void WriteByte(byte b)
- {
- output.WriteByte(b);
- tee.WriteByte(b);
- }
- }
-}
diff --git a/BCCrypto/src/util/io/pem/PemGenerationException.cs b/BCCrypto/src/util/io/pem/PemGenerationException.cs
deleted file mode 100644
index 6b39585..0000000
--- a/BCCrypto/src/util/io/pem/PemGenerationException.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities.IO.Pem
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class PemGenerationException
- : Exception
- {
- public PemGenerationException()
- : base()
- {
- }
-
- public PemGenerationException(
- string message)
- : base(message)
- {
- }
-
- public PemGenerationException(
- string message,
- Exception exception)
- : base(message, exception)
- {
- }
- }
-}
diff --git a/BCCrypto/src/util/io/pem/PemHeader.cs b/BCCrypto/src/util/io/pem/PemHeader.cs
deleted file mode 100644
index 72da8a4..0000000
--- a/BCCrypto/src/util/io/pem/PemHeader.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities.IO.Pem
-{
- public class PemHeader
- {
- private string name;
- private string val;
-
- public PemHeader(string name, string val)
- {
- this.name = name;
- this.val = val;
- }
-
- public virtual string Name
- {
- get { return name; }
- }
-
- public virtual string Value
- {
- get { return val; }
- }
-
- public override int GetHashCode()
- {
- return GetHashCode(this.name) + 31 * GetHashCode(this.val);
- }
-
- public override bool Equals(object obj)
- {
- if (obj == this)
- return true;
-
- if (!(obj is PemHeader))
- return false;
-
- PemHeader other = (PemHeader)obj;
-
- return Platform.Equals(this.name, other.name)
- && Platform.Equals(this.val, other.val);
- }
-
- private int GetHashCode(string s)
- {
- if (s == null)
- {
- return 1;
- }
-
- return s.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/util/io/pem/PemObject.cs b/BCCrypto/src/util/io/pem/PemObject.cs
deleted file mode 100644
index 41212f9..0000000
--- a/BCCrypto/src/util/io/pem/PemObject.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.Utilities.IO.Pem
-{
- public class PemObject
- : PemObjectGenerator
- {
- private string type;
- private IList headers;
- private byte[] content;
-
- public PemObject(string type, byte[] content)
- : this(type, Platform.CreateArrayList(), content)
- {
- }
-
- public PemObject(String type, IList headers, byte[] content)
- {
- this.type = type;
- this.headers = Platform.CreateArrayList(headers);
- this.content = content;
- }
-
- public string Type
- {
- get { return type; }
- }
-
- public IList Headers
- {
- get { return headers; }
- }
-
- public byte[] Content
- {
- get { return content; }
- }
-
- public PemObject Generate()
- {
- return this;
- }
- }
-}
diff --git a/BCCrypto/src/util/io/pem/PemObjectGenerator.cs b/BCCrypto/src/util/io/pem/PemObjectGenerator.cs
deleted file mode 100644
index 6f9bfc1..0000000
--- a/BCCrypto/src/util/io/pem/PemObjectGenerator.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.Utilities.IO.Pem
-{
- public interface PemObjectGenerator
- {
- ///
- /// A
- ///
- ///
- PemObject Generate();
- }
-}
diff --git a/BCCrypto/src/util/io/pem/PemObjectParser.cs b/BCCrypto/src/util/io/pem/PemObjectParser.cs
deleted file mode 100644
index 91d26dc..0000000
--- a/BCCrypto/src/util/io/pem/PemObjectParser.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.IO.Pem
-{
- public interface PemObjectParser
- {
- ///
- /// A
- ///
- ///
- /// A
- ///
- ///
- object ParseObject(PemObject obj);
- }
-}
diff --git a/BCCrypto/src/util/io/pem/PemReader.cs b/BCCrypto/src/util/io/pem/PemReader.cs
deleted file mode 100644
index bf712b6..0000000
--- a/BCCrypto/src/util/io/pem/PemReader.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Utilities.IO.Pem
-{
- public class PemReader
- {
- private const string BeginString = "-----BEGIN ";
- private const string EndString = "-----END ";
-
- private readonly TextReader reader;
-
- public PemReader(TextReader reader)
- {
- if (reader == null)
- throw new ArgumentNullException("reader");
-
- this.reader = reader;
- }
-
- public TextReader Reader
- {
- get { return reader; }
- }
-
- ///
- /// A
- ///
- ///
- public PemObject ReadPemObject()
- {
- string line = reader.ReadLine();
-
- if (line != null && Platform.StartsWith(line, BeginString))
- {
- line = line.Substring(BeginString.Length);
- int index = line.IndexOf('-');
- string type = line.Substring(0, index);
-
- if (index > 0)
- return LoadObject(type);
- }
-
- return null;
- }
-
- private PemObject LoadObject(string type)
- {
- string endMarker = EndString + type;
- IList headers = Platform.CreateArrayList();
- StringBuilder buf = new StringBuilder();
-
- string line;
- while ((line = reader.ReadLine()) != null
- && Platform.IndexOf(line, endMarker) == -1)
- {
- int colonPos = line.IndexOf(':');
-
- if (colonPos == -1)
- {
- buf.Append(line.Trim());
- }
- else
- {
- // Process field
- string fieldName = line.Substring(0, colonPos).Trim();
-
- if (Platform.StartsWith(fieldName, "X-"))
- {
- fieldName = fieldName.Substring(2);
- }
-
- string fieldValue = line.Substring(colonPos + 1).Trim();
-
- headers.Add(new PemHeader(fieldName, fieldValue));
- }
- }
-
- if (line == null)
- {
- throw new IOException(endMarker + " not found");
- }
-
- if (buf.Length % 4 != 0)
- {
- throw new IOException("base64 data appears to be truncated");
- }
-
- return new PemObject(type, headers, Base64.Decode(buf.ToString()));
- }
- }
-}
diff --git a/BCCrypto/src/util/io/pem/PemWriter.cs b/BCCrypto/src/util/io/pem/PemWriter.cs
deleted file mode 100644
index e85b315..0000000
--- a/BCCrypto/src/util/io/pem/PemWriter.cs
+++ /dev/null
@@ -1,120 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.Utilities.IO.Pem
-{
- /**
- * A generic PEM writer, based on RFC 1421
- */
- public class PemWriter
- {
- private const int LineLength = 64;
-
- private readonly TextWriter writer;
- private readonly int nlLength;
- private char[] buf = new char[LineLength];
-
- /**
- * Base constructor.
- *
- * @param out output stream to use.
- */
- public PemWriter(TextWriter writer)
- {
- if (writer == null)
- throw new ArgumentNullException("writer");
-
- this.writer = writer;
- this.nlLength = Platform.NewLine.Length;
- }
-
- public TextWriter Writer
- {
- get { return writer; }
- }
-
- /**
- * Return the number of bytes or characters required to contain the
- * passed in object if it is PEM encoded.
- *
- * @param obj pem object to be output
- * @return an estimate of the number of bytes
- */
- public int GetOutputSize(PemObject obj)
- {
- // BEGIN and END boundaries.
- int size = (2 * (obj.Type.Length + 10 + nlLength)) + 6 + 4;
-
- if (obj.Headers.Count > 0)
- {
- foreach (PemHeader header in obj.Headers)
- {
- size += header.Name.Length + ": ".Length + header.Value.Length + nlLength;
- }
-
- size += nlLength;
- }
-
- // base64 encoding
- int dataLen = ((obj.Content.Length + 2) / 3) * 4;
-
- size += dataLen + (((dataLen + LineLength - 1) / LineLength) * nlLength);
-
- return size;
- }
-
- public void WriteObject(PemObjectGenerator objGen)
- {
- PemObject obj = objGen.Generate();
-
- WritePreEncapsulationBoundary(obj.Type);
-
- if (obj.Headers.Count > 0)
- {
- foreach (PemHeader header in obj.Headers)
- {
- writer.Write(header.Name);
- writer.Write(": ");
- writer.WriteLine(header.Value);
- }
-
- writer.WriteLine();
- }
-
- WriteEncoded(obj.Content);
- WritePostEncapsulationBoundary(obj.Type);
- }
-
- private void WriteEncoded(byte[] bytes)
- {
- bytes = Base64.Encode(bytes);
-
- for (int i = 0; i < bytes.Length; i += buf.Length)
- {
- int index = 0;
- while (index != buf.Length)
- {
- if ((i + index) >= bytes.Length)
- break;
-
- buf[index] = (char)bytes[i + index];
- index++;
- }
- writer.WriteLine(buf, 0, index);
- }
- }
-
- private void WritePreEncapsulationBoundary(string type)
- {
- writer.WriteLine("-----BEGIN " + type + "-----");
- }
-
- private void WritePostEncapsulationBoundary(string type)
- {
- writer.WriteLine("-----END " + type + "-----");
- }
- }
-}
diff --git a/BCCrypto/src/util/net/IPAddress.cs b/BCCrypto/src/util/net/IPAddress.cs
deleted file mode 100644
index 38c1245..0000000
--- a/BCCrypto/src/util/net/IPAddress.cs
+++ /dev/null
@@ -1,197 +0,0 @@
-using System;
-using System.Globalization;
-
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.Utilities.Net
-{
- public class IPAddress
- {
- /**
- * Validate the given IPv4 or IPv6 address.
- *
- * @param address the IP address as a string.
- *
- * @return true if a valid address, false otherwise
- */
- public static bool IsValid(
- string address)
- {
- return IsValidIPv4(address) || IsValidIPv6(address);
- }
-
- /**
- * Validate the given IPv4 or IPv6 address and netmask.
- *
- * @param address the IP address as a string.
- *
- * @return true if a valid address with netmask, false otherwise
- */
- public static bool IsValidWithNetMask(
- string address)
- {
- return IsValidIPv4WithNetmask(address) || IsValidIPv6WithNetmask(address);
- }
-
- /**
- * Validate the given IPv4 address.
- *
- * @param address the IP address as a string.
- *
- * @return true if a valid IPv4 address, false otherwise
- */
- public static bool IsValidIPv4(
- string address)
- {
- try
- {
- return unsafeIsValidIPv4(address);
- }
- catch (FormatException) {}
- catch (OverflowException) {}
- return false;
- }
-
- private static bool unsafeIsValidIPv4(
- string address)
- {
- if (address.Length == 0)
- return false;
-
- int octets = 0;
- string temp = address + ".";
-
- int pos;
- int start = 0;
- while (start < temp.Length
- && (pos = temp.IndexOf('.', start)) > start)
- {
- if (octets == 4)
- return false;
-
- string octetStr = temp.Substring(start, pos - start);
- int octet = Int32.Parse(octetStr);
-
- if (octet < 0 || octet > 255)
- return false;
-
- start = pos + 1;
- octets++;
- }
-
- return octets == 4;
- }
-
- public static bool IsValidIPv4WithNetmask(
- string address)
- {
- int index = address.IndexOf('/');
- string mask = address.Substring(index + 1);
-
- return (index > 0) && IsValidIPv4(address.Substring(0, index))
- && (IsValidIPv4(mask) || IsMaskValue(mask, 32));
- }
-
- public static bool IsValidIPv6WithNetmask(
- string address)
- {
- int index = address.IndexOf('/');
- string mask = address.Substring(index + 1);
-
- return (index > 0) && (IsValidIPv6(address.Substring(0, index))
- && (IsValidIPv6(mask) || IsMaskValue(mask, 128)));
- }
-
- private static bool IsMaskValue(
- string component,
- int size)
- {
- int val = Int32.Parse(component);
- try
- {
- return val >= 0 && val <= size;
- }
- catch (FormatException) {}
- catch (OverflowException) {}
- return false;
- }
-
- /**
- * Validate the given IPv6 address.
- *
- * @param address the IP address as a string.
- *
- * @return true if a valid IPv4 address, false otherwise
- */
- public static bool IsValidIPv6(
- string address)
- {
- try
- {
- return unsafeIsValidIPv6(address);
- }
- catch (FormatException) {}
- catch (OverflowException) {}
- return false;
- }
-
- private static bool unsafeIsValidIPv6(
- string address)
- {
- if (address.Length == 0)
- {
- return false;
- }
-
- int octets = 0;
-
- string temp = address + ":";
- bool doubleColonFound = false;
- int pos;
- int start = 0;
- while (start < temp.Length
- && (pos = temp.IndexOf(':', start)) >= start)
- {
- if (octets == 8)
- {
- return false;
- }
-
- if (start != pos)
- {
- string value = temp.Substring(start, pos - start);
-
- if (pos == (temp.Length - 1) && value.IndexOf('.') > 0)
- {
- if (!IsValidIPv4(value))
- {
- return false;
- }
-
- octets++; // add an extra one as address covers 2 words.
- }
- else
- {
- string octetStr = temp.Substring(start, pos - start);
- int octet = Int32.Parse(octetStr, NumberStyles.AllowHexSpecifier);
-
- if (octet < 0 || octet > 0xffff)
- return false;
- }
- }
- else
- {
- if (pos != 1 && pos != temp.Length - 1 && doubleColonFound)
- {
- return false;
- }
- doubleColonFound = true;
- }
- start = pos + 1;
- octets++;
- }
-
- return octets == 8 || doubleColonFound;
- }
- }
-}
diff --git a/BCCrypto/src/util/zlib/Adler32.cs b/BCCrypto/src/util/zlib/Adler32.cs
deleted file mode 100644
index c38258f..0000000
--- a/BCCrypto/src/util/zlib/Adler32.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-using System;
-/*
- * $Id: Adler32.cs,v 1.1 2006-07-31 13:59:25 bouncy Exp $
- *
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the distribution.
-
- 3. The names of the authors may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
-INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/*
- * This program is based on zlib-1.1.3, so all credit should go authors
- * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
- * and contributors of zlib.
- */
-
-namespace Org.BouncyCastle.Utilities.Zlib {
-
- internal sealed class Adler32{
-
- // largest prime smaller than 65536
- private const int BASE=65521;
- // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1
- private const int NMAX=5552;
-
- internal long adler32(long adler, byte[] buf, int index, int len){
- if(buf == null){ return 1L; }
-
- long s1=adler&0xffff;
- long s2=(adler>>16)&0xffff;
- int k;
-
- while(len > 0) {
- k=len=16){
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- s1+=buf[index++]&0xff; s2+=s1;
- k-=16;
- }
- if(k!=0){
- do{
- s1+=buf[index++]&0xff; s2+=s1;
- }
- while(--k!=0);
- }
- s1%=BASE;
- s2%=BASE;
- }
- return (s2<<16)|s1;
- }
-
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/util/zlib/Deflate.cs b/BCCrypto/src/util/zlib/Deflate.cs
deleted file mode 100644
index ca04309..0000000
--- a/BCCrypto/src/util/zlib/Deflate.cs
+++ /dev/null
@@ -1,1640 +0,0 @@
-using System;
-/*
- * $Id: Deflate.cs,v 1.2 2008-05-10 09:35:40 bouncy Exp $
- *
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the distribution.
-
- 3. The names of the authors may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
-INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/*
- * This program is based on zlib-1.1.3, so all credit should go authors
- * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
- * and contributors of zlib.
- */
-
-namespace Org.BouncyCastle.Utilities.Zlib {
-
- public sealed class Deflate{
-
- private const int MAX_MEM_LEVEL=9;
-
- private const int Z_DEFAULT_COMPRESSION=-1;
-
- private const int MAX_WBITS=15; // 32K LZ77 window
- private const int DEF_MEM_LEVEL=8;
-
- internal class Config{
- internal int good_length; // reduce lazy search above this match length
- internal int max_lazy; // do not perform lazy search above this match length
- internal int nice_length; // quit search above this match length
- internal int max_chain;
- internal int func;
- internal Config(int good_length, int max_lazy,
- int nice_length, int max_chain, int func){
- this.good_length=good_length;
- this.max_lazy=max_lazy;
- this.nice_length=nice_length;
- this.max_chain=max_chain;
- this.func=func;
- }
- }
-
- private const int STORED=0;
- private const int FAST=1;
- private const int SLOW=2;
- private static readonly Config[] config_table;
-
- static Deflate(){
- config_table=new Config[10];
- // good lazy nice chain
- config_table[0]=new Config(0, 0, 0, 0, STORED);
- config_table[1]=new Config(4, 4, 8, 4, FAST);
- config_table[2]=new Config(4, 5, 16, 8, FAST);
- config_table[3]=new Config(4, 6, 32, 32, FAST);
-
- config_table[4]=new Config(4, 4, 16, 16, SLOW);
- config_table[5]=new Config(8, 16, 32, 32, SLOW);
- config_table[6]=new Config(8, 16, 128, 128, SLOW);
- config_table[7]=new Config(8, 32, 128, 256, SLOW);
- config_table[8]=new Config(32, 128, 258, 1024, SLOW);
- config_table[9]=new Config(32, 258, 258, 4096, SLOW);
- }
-
- private static readonly String[] z_errmsg = {
- "need dictionary", // Z_NEED_DICT 2
- "stream end", // Z_STREAM_END 1
- "", // Z_OK 0
- "file error", // Z_ERRNO (-1)
- "stream error", // Z_STREAM_ERROR (-2)
- "data error", // Z_DATA_ERROR (-3)
- "insufficient memory", // Z_MEM_ERROR (-4)
- "buffer error", // Z_BUF_ERROR (-5)
- "incompatible version",// Z_VERSION_ERROR (-6)
- ""
- };
-
- // block not completed, need more input or more output
- private const int NeedMore=0;
-
- // block flush performed
- private const int BlockDone=1;
-
- // finish started, need only more output at next deflate
- private const int FinishStarted=2;
-
- // finish done, accept no more input or output
- private const int FinishDone=3;
-
- // preset dictionary flag in zlib header
- private const int PRESET_DICT=0x20;
-
- private const int Z_FILTERED=1;
- private const int Z_HUFFMAN_ONLY=2;
- private const int Z_DEFAULT_STRATEGY=0;
-
- private const int Z_NO_FLUSH=0;
- private const int Z_PARTIAL_FLUSH=1;
- private const int Z_SYNC_FLUSH=2;
- private const int Z_FULL_FLUSH=3;
- private const int Z_FINISH=4;
-
- private const int Z_OK=0;
- private const int Z_STREAM_END=1;
- private const int Z_NEED_DICT=2;
- private const int Z_ERRNO=-1;
- private const int Z_STREAM_ERROR=-2;
- private const int Z_DATA_ERROR=-3;
- private const int Z_MEM_ERROR=-4;
- private const int Z_BUF_ERROR=-5;
- private const int Z_VERSION_ERROR=-6;
-
- private const int INIT_STATE=42;
- private const int BUSY_STATE=113;
- private const int FINISH_STATE=666;
-
- // The deflate compression method
- private const int Z_DEFLATED=8;
-
- private const int STORED_BLOCK=0;
- private const int STATIC_TREES=1;
- private const int DYN_TREES=2;
-
- // The three kinds of block type
- private const int Z_BINARY=0;
- private const int Z_ASCII=1;
- private const int Z_UNKNOWN=2;
-
- private const int Buf_size=8*2;
-
- // repeat previous bit length 3-6 times (2 bits of repeat count)
- private const int REP_3_6=16;
-
- // repeat a zero length 3-10 times (3 bits of repeat count)
- private const int REPZ_3_10=17;
-
- // repeat a zero length 11-138 times (7 bits of repeat count)
- private const int REPZ_11_138=18;
-
- private const int MIN_MATCH=3;
- private const int MAX_MATCH=258;
- private const int MIN_LOOKAHEAD=(MAX_MATCH+MIN_MATCH+1);
-
- private const int MAX_BITS=15;
- private const int D_CODES=30;
- private const int BL_CODES=19;
- private const int LENGTH_CODES=29;
- private const int LITERALS=256;
- private const int L_CODES=(LITERALS+1+LENGTH_CODES);
- private const int HEAP_SIZE=(2*L_CODES+1);
-
- private const int END_BLOCK=256;
-
- internal ZStream strm; // pointer back to this zlib stream
- internal int status; // as the name implies
- internal byte[] pending_buf; // output still pending
- internal int pending_buf_size; // size of pending_buf
- internal int pending_out; // next pending byte to output to the stream
- internal int pending; // nb of bytes in the pending buffer
- internal int noheader; // suppress zlib header and adler32
- internal byte data_type; // UNKNOWN, BINARY or ASCII
- internal byte method; // STORED (for zip only) or DEFLATED
- internal int last_flush; // value of flush param for previous deflate call
-
- internal int w_size; // LZ77 window size (32K by default)
- internal int w_bits; // log2(w_size) (8..16)
- internal int w_mask; // w_size - 1
-
- internal byte[] window;
- // Sliding window. Input bytes are read into the second half of the window,
- // and move to the first half later to keep a dictionary of at least wSize
- // bytes. With this organization, matches are limited to a distance of
- // wSize-MAX_MATCH bytes, but this ensures that IO is always
- // performed with a length multiple of the block size. Also, it limits
- // the window size to 64K, which is quite useful on MSDOS.
- // To do: use the user input buffer as sliding window.
-
- internal int window_size;
- // Actual size of window: 2*wSize, except when the user input buffer
- // is directly used as sliding window.
-
- internal short[] prev;
- // Link to older string with same hash index. To limit the size of this
- // array to 64K, this link is maintained only for the last 32K strings.
- // An index in this array is thus a window index modulo 32K.
-
- internal short[] head; // Heads of the hash chains or NIL.
-
- internal int ins_h; // hash index of string to be inserted
- internal int hash_size; // number of elements in hash table
- internal int hash_bits; // log2(hash_size)
- internal int hash_mask; // hash_size-1
-
- // Number of bits by which ins_h must be shifted at each input
- // step. It must be such that after MIN_MATCH steps, the oldest
- // byte no longer takes part in the hash key, that is:
- // hash_shift * MIN_MATCH >= hash_bits
- internal int hash_shift;
-
- // Window position at the beginning of the current output block. Gets
- // negative when the window is moved backwards.
-
- internal int block_start;
-
- internal int match_length; // length of best match
- internal int prev_match; // previous match
- internal int match_available; // set if previous match exists
- internal int strstart; // start of string to insert
- internal int match_start; // start of matching string
- internal int lookahead; // number of valid bytes ahead in window
-
- // Length of the best match at previous step. Matches not greater than this
- // are discarded. This is used in the lazy match evaluation.
- internal int prev_length;
-
- // To speed up deflation, hash chains are never searched beyond this
- // length. A higher limit improves compression ratio but degrades the speed.
- internal int max_chain_length;
-
- // Attempt to find a better match only when the current match is strictly
- // smaller than this value. This mechanism is used only for compression
- // levels >= 4.
- internal int max_lazy_match;
-
- // Insert new strings in the hash table only if the match length is not
- // greater than this length. This saves time but degrades compression.
- // max_insert_length is used only for compression levels <= 3.
-
- internal int level; // compression level (1..9)
- internal int strategy; // favor or force Huffman coding
-
- // Use a faster search when the previous match is longer than this
- internal int good_match;
-
- // Stop searching when current match exceeds this
- internal int nice_match;
-
- internal short[] dyn_ltree; // literal and length tree
- internal short[] dyn_dtree; // distance tree
- internal short[] bl_tree; // Huffman tree for bit lengths
-
- internal Tree l_desc=new Tree(); // desc for literal tree
- internal Tree d_desc=new Tree(); // desc for distance tree
- internal Tree bl_desc=new Tree(); // desc for bit length tree
-
- // number of codes at each bit length for an optimal tree
- internal short[] bl_count=new short[MAX_BITS+1];
-
- // heap used to build the Huffman trees
- internal int[] heap=new int[2*L_CODES+1];
-
- internal int heap_len; // number of elements in the heap
- internal int heap_max; // element of largest frequency
- // The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
- // The same heap array is used to build all trees.
-
- // Depth of each subtree used as tie breaker for trees of equal frequency
- internal byte[] depth=new byte[2*L_CODES+1];
-
- internal int l_buf; // index for literals or lengths */
-
- // Size of match buffer for literals/lengths. There are 4 reasons for
- // limiting lit_bufsize to 64K:
- // - frequencies can be kept in 16 bit counters
- // - if compression is not successful for the first block, all input
- // data is still in the window so we can still emit a stored block even
- // when input comes from standard input. (This can also be done for
- // all blocks if lit_bufsize is not greater than 32K.)
- // - if compression is not successful for a file smaller than 64K, we can
- // even emit a stored file instead of a stored block (saving 5 bytes).
- // This is applicable only for zip (not gzip or zlib).
- // - creating new Huffman trees less frequently may not provide fast
- // adaptation to changes in the input data statistics. (Take for
- // example a binary file with poorly compressible code followed by
- // a highly compressible string table.) Smaller buffer sizes give
- // fast adaptation but have of course the overhead of transmitting
- // trees more frequently.
- // - I can't count above 4
- internal int lit_bufsize;
-
- internal int last_lit; // running index in l_buf
-
- // Buffer for distances. To simplify the code, d_buf and l_buf have
- // the same number of elements. To use different lengths, an extra flag
- // array would be necessary.
-
- internal int d_buf; // index of pendig_buf
-
- internal int opt_len; // bit length of current block with optimal trees
- internal int static_len; // bit length of current block with static trees
- internal int matches; // number of string matches in current block
- internal int last_eob_len; // bit length of EOB code for last block
-
- // Output buffer. bits are inserted starting at the bottom (least
- // significant bits).
- internal uint bi_buf;
-
- // Number of valid bits in bi_buf. All bits above the last valid bit
- // are always zero.
- internal int bi_valid;
-
- internal Deflate(){
- dyn_ltree=new short[HEAP_SIZE*2];
- dyn_dtree=new short[(2*D_CODES+1)*2]; // distance tree
- bl_tree=new short[(2*BL_CODES+1)*2]; // Huffman tree for bit lengths
- }
-
- internal void lm_init() {
- window_size=2*w_size;
-
- head[hash_size-1]=0;
- for(int i=0; i= 3; max_blindex--) {
- if (bl_tree[Tree.bl_order[max_blindex]*2+1] != 0) break;
- }
- // Update opt_len to include the bit length tree and counts
- opt_len += 3*(max_blindex+1) + 5+5+4;
-
- return max_blindex;
- }
-
-
- // Send the header for a block using dynamic Huffman trees: the counts, the
- // lengths of the bit length codes, the literal tree and the distance tree.
- // IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
- internal void send_all_trees(int lcodes, int dcodes, int blcodes){
- int rank; // index in bl_order
-
- send_bits(lcodes-257, 5); // not +255 as stated in appnote.txt
- send_bits(dcodes-1, 5);
- send_bits(blcodes-4, 4); // not -3 as stated in appnote.txt
- for (rank = 0; rank < blcodes; rank++) {
- send_bits(bl_tree[Tree.bl_order[rank]*2+1], 3);
- }
- send_tree(dyn_ltree, lcodes-1); // literal tree
- send_tree(dyn_dtree, dcodes-1); // distance tree
- }
-
- // Send a literal or distance tree in compressed form, using the codes in
- // bl_tree.
- internal void send_tree (short[] tree,// the tree to be sent
- int max_code // and its largest code of non zero frequency
- ){
- int n; // iterates over all tree elements
- int prevlen = -1; // last emitted length
- int curlen; // length of current code
- int nextlen = tree[0*2+1]; // length of next code
- int count = 0; // repeat count of the current code
- int max_count = 7; // max repeat count
- int min_count = 4; // min repeat count
-
- if (nextlen == 0){ max_count = 138; min_count = 3; }
-
- for (n = 0; n <= max_code; n++) {
- curlen = nextlen; nextlen = tree[(n+1)*2+1];
- if(++count < max_count && curlen == nextlen) {
- continue;
- }
- else if(count < min_count) {
- do { send_code(curlen, bl_tree); } while (--count != 0);
- }
- else if(curlen != 0){
- if(curlen != prevlen){
- send_code(curlen, bl_tree); count--;
- }
- send_code(REP_3_6, bl_tree);
- send_bits(count-3, 2);
- }
- else if(count <= 10){
- send_code(REPZ_3_10, bl_tree);
- send_bits(count-3, 3);
- }
- else{
- send_code(REPZ_11_138, bl_tree);
- send_bits(count-11, 7);
- }
- count = 0; prevlen = curlen;
- if(nextlen == 0){
- max_count = 138; min_count = 3;
- }
- else if(curlen == nextlen){
- max_count = 6; min_count = 3;
- }
- else{
- max_count = 7; min_count = 4;
- }
- }
- }
-
- // Output a byte on the stream.
- // IN assertion: there is enough room in pending_buf.
- internal void put_byte(byte[] p, int start, int len){
- System.Array.Copy(p, start, pending_buf, pending, len);
- pending+=len;
- }
-
- internal void put_byte(byte c){
- pending_buf[pending++]=c;
- }
- internal void put_short(int w) {
- pending_buf[pending++]=(byte)(w/*&0xff*/);
- pending_buf[pending++]=(byte)(w>>8);
- }
- internal void putShortMSB(int b){
- pending_buf[pending++]=(byte)(b>>8);
- pending_buf[pending++]=(byte)(b/*&0xff*/);
- }
-
- internal void send_code(int c, short[] tree){
- int c2=c*2;
- send_bits((tree[c2]&0xffff), (tree[c2+1]&0xffff));
- }
-
- internal void send_bits(int val, int length){
- if (bi_valid > Buf_size - length) {
- bi_buf |= (uint)(val << bi_valid);
- pending_buf[pending++]=(byte)(bi_buf/*&0xff*/);
- pending_buf[pending++]=(byte)(bi_buf>>8);
- bi_buf = ((uint)val) >> (Buf_size - bi_valid);
- bi_valid += length - Buf_size;
- } else {
- bi_buf |= (uint)(val << bi_valid);
- bi_valid += length;
- }
-// int len = length;
-// if (bi_valid > (int)Buf_size - len) {
-// int val = value;
-// // bi_buf |= (val << bi_valid);
-// bi_buf = (short)((ushort)bi_buf | (ushort)((val << bi_valid)&0xffff));
-// put_short(bi_buf);
-// bi_buf = (short)(((uint)val) >> (Buf_size - bi_valid));
-// bi_valid += len - Buf_size;
-// } else {
-// // bi_buf |= (value) << bi_valid;
-// bi_buf = (short)((ushort)bi_buf | (ushort)(((value) << bi_valid)&0xffff));
-// bi_valid += len;
-// }
- }
-
- // Send one empty static block to give enough lookahead for inflate.
- // This takes 10 bits, of which 7 may remain in the bit buffer.
- // The current inflate code requires 9 bits of lookahead. If the
- // last two codes for the previous block (real code plus EOB) were coded
- // on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
- // the last real code. In this case we send two empty static blocks instead
- // of one. (There are no problems if the previous block is stored or fixed.)
- // To simplify the code, we assume the worst case of last real code encoded
- // on one bit only.
- internal void _tr_align(){
- send_bits(STATIC_TREES<<1, 3);
- send_code(END_BLOCK, StaticTree.static_ltree);
-
- bi_flush();
-
- // Of the 10 bits for the empty block, we have already sent
- // (10 - bi_valid) bits. The lookahead for the last real code (before
- // the EOB of the previous block) was thus at least one plus the length
- // of the EOB plus what we have just sent of the empty static block.
- if (1 + last_eob_len + 10 - bi_valid < 9) {
- send_bits(STATIC_TREES<<1, 3);
- send_code(END_BLOCK, StaticTree.static_ltree);
- bi_flush();
- }
- last_eob_len = 7;
- }
-
-
- // Save the match info and tally the frequency counts. Return true if
- // the current block must be flushed.
- internal bool _tr_tally (int dist, // distance of matched string
- int lc // match length-MIN_MATCH or unmatched char (if dist==0)
- ){
-
- pending_buf[d_buf+last_lit*2] = (byte)(dist>>8);
- pending_buf[d_buf+last_lit*2+1] = (byte)dist;
-
- pending_buf[l_buf+last_lit] = (byte)lc; last_lit++;
-
- if (dist == 0) {
- // lc is the unmatched char
- dyn_ltree[lc*2]++;
- }
- else {
- matches++;
- // Here, lc is the match length - MIN_MATCH
- dist--; // dist = match distance - 1
- dyn_ltree[(Tree._length_code[lc]+LITERALS+1)*2]++;
- dyn_dtree[Tree.d_code(dist)*2]++;
- }
-
- if ((last_lit & 0x1fff) == 0 && level > 2) {
- // Compute an upper bound for the compressed length
- int out_length = last_lit*8;
- int in_length = strstart - block_start;
- int dcode;
- for (dcode = 0; dcode < D_CODES; dcode++) {
- out_length += (int)((int)dyn_dtree[dcode*2] *
- (5L+Tree.extra_dbits[dcode]));
- }
- out_length >>= 3;
- if ((matches < (last_lit/2)) && out_length < in_length/2) return true;
- }
-
- return (last_lit == lit_bufsize-1);
- // We avoid equality with lit_bufsize because of wraparound at 64K
- // on 16 bit machines and because stored blocks are restricted to
- // 64K-1 bytes.
- }
-
- // Send the block data compressed using the given Huffman trees
- internal void compress_block(short[] ltree, short[] dtree){
- int dist; // distance of matched string
- int lc; // match length or unmatched char (if dist == 0)
- int lx = 0; // running index in l_buf
- int code; // the code to send
- int extra; // number of extra bits to send
-
- if (last_lit != 0){
- do{
- dist=((pending_buf[d_buf+lx*2]<<8)&0xff00)|
- (pending_buf[d_buf+lx*2+1]&0xff);
- lc=(pending_buf[l_buf+lx])&0xff; lx++;
-
- if(dist == 0){
- send_code(lc, ltree); // send a literal byte
- }
- else{
- // Here, lc is the match length - MIN_MATCH
- code = Tree._length_code[lc];
-
- send_code(code+LITERALS+1, ltree); // send the length code
- extra = Tree.extra_lbits[code];
- if(extra != 0){
- lc -= Tree.base_length[code];
- send_bits(lc, extra); // send the extra length bits
- }
- dist--; // dist is now the match distance - 1
- code = Tree.d_code(dist);
-
- send_code(code, dtree); // send the distance code
- extra = Tree.extra_dbits[code];
- if (extra != 0) {
- dist -= Tree.base_dist[code];
- send_bits(dist, extra); // send the extra distance bits
- }
- } // literal or match pair ?
-
- // Check that the overlay between pending_buf and d_buf+l_buf is ok:
- }
- while (lx < last_lit);
- }
-
- send_code(END_BLOCK, ltree);
- last_eob_len = ltree[END_BLOCK*2+1];
- }
-
- // Set the data type to ASCII or BINARY, using a crude approximation:
- // binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise.
- // IN assertion: the fields freq of dyn_ltree are set and the total of all
- // frequencies does not exceed 64K (to fit in an int on 16 bit machines).
- internal void set_data_type(){
- int n = 0;
- int ascii_freq = 0;
- int bin_freq = 0;
- while(n<7){ bin_freq += dyn_ltree[n*2]; n++;}
- while(n<128){ ascii_freq += dyn_ltree[n*2]; n++;}
- while(n (ascii_freq >> 2) ? Z_BINARY : Z_ASCII);
- }
-
- // Flush the bit buffer, keeping at most 7 bits in it.
- internal void bi_flush(){
- if (bi_valid == 16) {
- pending_buf[pending++]=(byte)(bi_buf/*&0xff*/);
- pending_buf[pending++]=(byte)(bi_buf>>8);
- bi_buf=0;
- bi_valid=0;
- }
- else if (bi_valid >= 8) {
- pending_buf[pending++]=(byte)(bi_buf);
- bi_buf>>=8;
- bi_buf &= 0x00ff;
- bi_valid-=8;
- }
- }
-
- // Flush the bit buffer and align the output on a byte boundary
- internal void bi_windup(){
- if (bi_valid > 8) {
- pending_buf[pending++]=(byte)(bi_buf);
- pending_buf[pending++]=(byte)(bi_buf>>8);
- } else if (bi_valid > 0) {
- pending_buf[pending++]=(byte)(bi_buf);
- }
- bi_buf = 0;
- bi_valid = 0;
- }
-
- // Copy a stored block, storing first the length and its
- // one's complement if requested.
- internal void copy_block(int buf, // the input data
- int len, // its length
- bool header // true if block header must be written
- ){
- //int index=0;
- bi_windup(); // align on byte boundary
- last_eob_len = 8; // enough lookahead for inflate
-
- if (header) {
- put_short((short)len);
- put_short((short)~len);
- }
-
- // while(len--!=0) {
- // put_byte(window[buf+index]);
- // index++;
- // }
- put_byte(window, buf, len);
- }
-
- internal void flush_block_only(bool eof){
- _tr_flush_block(block_start>=0 ? block_start : -1,
- strstart-block_start,
- eof);
- block_start=strstart;
- strm.flush_pending();
- }
-
- // Copy without compression as much as possible from the input stream, return
- // the current block state.
- // This function does not insert new strings in the dictionary since
- // uncompressible data is probably not useful. This function is used
- // only for the level=0 compression option.
- // NOTE: this function should be optimized to avoid extra copying from
- // window to pending_buf.
- internal int deflate_stored(int flush){
- // Stored blocks are limited to 0xffff bytes, pending_buf is limited
- // to pending_buf_size, and each stored block has a 5 byte header:
-
- int max_block_size = 0xffff;
- int max_start;
-
- if(max_block_size > pending_buf_size - 5) {
- max_block_size = pending_buf_size - 5;
- }
-
- // Copy as much as possible from input to output:
- while(true){
- // Fill the window as much as possible:
- if(lookahead<=1){
- fill_window();
- if(lookahead==0 && flush==Z_NO_FLUSH) return NeedMore;
- if(lookahead==0) break; // flush the current block
- }
-
- strstart+=lookahead;
- lookahead=0;
-
- // Emit a stored block if pending_buf will be full:
- max_start=block_start+max_block_size;
- if(strstart==0|| strstart>=max_start) {
- // strstart == 0 is possible when wraparound on 16-bit machine
- lookahead = (int)(strstart-max_start);
- strstart = (int)max_start;
-
- flush_block_only(false);
- if(strm.avail_out==0) return NeedMore;
-
- }
-
- // Flush if we may have to slide, otherwise block_start may become
- // negative and the data will be gone:
- if(strstart-block_start >= w_size-MIN_LOOKAHEAD) {
- flush_block_only(false);
- if(strm.avail_out==0) return NeedMore;
- }
- }
-
- flush_block_only(flush == Z_FINISH);
- if(strm.avail_out==0)
- return (flush == Z_FINISH) ? FinishStarted : NeedMore;
-
- return flush == Z_FINISH ? FinishDone : BlockDone;
- }
-
- // Send a stored block
- internal void _tr_stored_block(int buf, // input block
- int stored_len, // length of input block
- bool eof // true if this is the last block for a file
- ){
- send_bits((STORED_BLOCK<<1)+(eof?1:0), 3); // send block type
- copy_block(buf, stored_len, true); // with header
- }
-
- // Determine the best encoding for the current block: dynamic trees, static
- // trees or store, and output the encoded block to the zip file.
- internal void _tr_flush_block(int buf, // input block, or NULL if too old
- int stored_len, // length of input block
- bool eof // true if this is the last block for a file
- ) {
- int opt_lenb, static_lenb;// opt_len and static_len in bytes
- int max_blindex = 0; // index of last bit length code of non zero freq
-
- // Build the Huffman trees unless a stored block is forced
- if(level > 0) {
- // Check if the file is ascii or binary
- if(data_type == Z_UNKNOWN) set_data_type();
-
- // Construct the literal and distance trees
- l_desc.build_tree(this);
-
- d_desc.build_tree(this);
-
- // At this point, opt_len and static_len are the total bit lengths of
- // the compressed block data, excluding the tree representations.
-
- // Build the bit length tree for the above two trees, and get the index
- // in bl_order of the last bit length code to send.
- max_blindex=build_bl_tree();
-
- // Determine the best encoding. Compute first the block length in bytes
- opt_lenb=(opt_len+3+7)>>3;
- static_lenb=(static_len+3+7)>>3;
-
- if(static_lenb<=opt_lenb) opt_lenb=static_lenb;
- }
- else {
- opt_lenb=static_lenb=stored_len+5; // force a stored block
- }
-
- if(stored_len+4<=opt_lenb && buf != -1){
- // 4: two words for the lengths
- // The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
- // Otherwise we can't have processed more than WSIZE input bytes since
- // the last block flush, because compression would have been
- // successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
- // transform a block into a stored block.
- _tr_stored_block(buf, stored_len, eof);
- }
- else if(static_lenb == opt_lenb){
- send_bits((STATIC_TREES<<1)+(eof?1:0), 3);
- compress_block(StaticTree.static_ltree, StaticTree.static_dtree);
- }
- else{
- send_bits((DYN_TREES<<1)+(eof?1:0), 3);
- send_all_trees(l_desc.max_code+1, d_desc.max_code+1, max_blindex+1);
- compress_block(dyn_ltree, dyn_dtree);
- }
-
- // The above check is made mod 2^32, for files larger than 512 MB
- // and uLong implemented on 32 bits.
-
- init_block();
-
- if(eof){
- bi_windup();
- }
- }
-
- // Fill the window when the lookahead becomes insufficient.
- // Updates strstart and lookahead.
- //
- // IN assertion: lookahead < MIN_LOOKAHEAD
- // OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
- // At least one byte has been read, or avail_in == 0; reads are
- // performed for at least two bytes (required for the zip translate_eol
- // option -- not supported here).
- internal void fill_window(){
- int n, m;
- int p;
- int more; // Amount of free space at the end of the window.
-
- do{
- more = (window_size-lookahead-strstart);
-
- // Deal with !@#$% 64K limit:
- if(more==0 && strstart==0 && lookahead==0){
- more = w_size;
- }
- else if(more==-1) {
- // Very unlikely, but possible on 16 bit machine if strstart == 0
- // and lookahead == 1 (input done one byte at time)
- more--;
-
- // If the window is almost full and there is insufficient lookahead,
- // move the upper half to the lower one to make room in the upper half.
- }
- else if(strstart >= w_size+ w_size-MIN_LOOKAHEAD) {
- System.Array.Copy(window, w_size, window, 0, w_size);
- match_start-=w_size;
- strstart-=w_size; // we now have strstart >= MAX_DIST
- block_start-=w_size;
-
- // Slide the hash table (could be avoided with 32 bit values
- // at the expense of memory usage). We slide even when level == 0
- // to keep the hash table consistent if we switch back to level > 0
- // later. (Using level 0 permanently is not an optimal usage of
- // zlib, so we don't care about this pathological case.)
-
- n = hash_size;
- p=n;
- do {
- m = (head[--p]&0xffff);
- head[p]=(short)(m>=w_size ? (m-w_size) : 0);
- }
- while (--n != 0);
-
- n = w_size;
- p = n;
- do {
- m = (prev[--p]&0xffff);
- prev[p] = (short)(m >= w_size ? (m-w_size) : 0);
- // If n is not on any hash chain, prev[n] is garbage but
- // its value will never be used.
- }
- while (--n!=0);
- more += w_size;
- }
-
- if (strm.avail_in == 0) return;
-
- // If there was no sliding:
- // strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
- // more == window_size - lookahead - strstart
- // => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
- // => more >= window_size - 2*WSIZE + 2
- // In the BIG_MEM or MMAP case (not yet supported),
- // window_size == input_size + MIN_LOOKAHEAD &&
- // strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
- // Otherwise, window_size == 2*WSIZE so more >= 2.
- // If there was sliding, more >= WSIZE. So in all cases, more >= 2.
-
- n = strm.read_buf(window, strstart + lookahead, more);
- lookahead += n;
-
- // Initialize the hash value now that we have some input:
- if(lookahead >= MIN_MATCH) {
- ins_h = window[strstart]&0xff;
- ins_h=(((ins_h)<= MIN_MATCH){
- ins_h=(((ins_h)<=MIN_MATCH){
- // check_match(strstart, match_start, match_length);
-
- bflush=_tr_tally(strstart-match_start, match_length-MIN_MATCH);
-
- lookahead -= match_length;
-
- // Insert new strings in the hash table only if the match length
- // is not too large. This saves time but degrades compression.
- if(match_length <= max_lazy_match &&
- lookahead >= MIN_MATCH) {
- match_length--; // string at strstart already in hash table
- do{
- strstart++;
-
- ins_h=((ins_h<= MIN_MATCH) {
- ins_h=(((ins_h)< 4096))) {
-
- // If prev_match is also MIN_MATCH, match_start is garbage
- // but we will ignore the current match anyway.
- match_length = MIN_MATCH-1;
- }
- }
-
- // If there was a match at the previous step and the current
- // match is not better, output the previous match:
- if(prev_length >= MIN_MATCH && match_length <= prev_length) {
- int max_insert = strstart + lookahead - MIN_MATCH;
- // Do not insert strings in hash table beyond this.
-
- // check_match(strstart-1, prev_match, prev_length);
-
- bflush=_tr_tally(strstart-1-prev_match, prev_length - MIN_MATCH);
-
- // Insert in hash table all strings up to the end of the match.
- // strstart-1 and strstart are already inserted. If there is not
- // enough lookahead, the last two strings are not inserted in
- // the hash table.
- lookahead -= prev_length-1;
- prev_length -= 2;
- do{
- if(++strstart <= max_insert) {
- ins_h=(((ins_h)<(w_size-MIN_LOOKAHEAD) ?
- strstart-(w_size-MIN_LOOKAHEAD) : 0;
- int nice_match=this.nice_match;
-
- // Stop when cur_match becomes <= limit. To simplify the code,
- // we prevent matches with the string of window index 0.
-
- int wmask = w_mask;
-
- int strend = strstart + MAX_MATCH;
- byte scan_end1 = window[scan+best_len-1];
- byte scan_end = window[scan+best_len];
-
- // The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
- // It is easy to get rid of this optimization if necessary.
-
- // Do not waste too much time if we already have a good match:
- if (prev_length >= good_match) {
- chain_length >>= 2;
- }
-
- // Do not look for matches beyond the end of the input. This is necessary
- // to make deflate deterministic.
- if (nice_match > lookahead) nice_match = lookahead;
-
- do {
- match = cur_match;
-
- // Skip to next match if the match length cannot increase
- // or if the match length is less than 2:
- if (window[match+best_len] != scan_end ||
- window[match+best_len-1] != scan_end1 ||
- window[match] != window[scan] ||
- window[++match] != window[scan+1]) continue;
-
- // The check at best_len-1 can be removed because it will be made
- // again later. (This heuristic is not always a win.)
- // It is not necessary to compare scan[2] and match[2] since they
- // are always equal when the other bytes match, given that
- // the hash keys are equal and that HASH_BITS >= 8.
- scan += 2; match++;
-
- // We check for insufficient lookahead only every 8th comparison;
- // the 256th check will be made at strstart+258.
- do {
- } while (window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- scan < strend);
-
- len = MAX_MATCH - (int)(strend - scan);
- scan = strend - MAX_MATCH;
-
- if(len>best_len) {
- match_start = cur_match;
- best_len = len;
- if (len >= nice_match) break;
- scan_end1 = window[scan+best_len-1];
- scan_end = window[scan+best_len];
- }
-
- } while ((cur_match = (prev[cur_match & wmask]&0xffff)) > limit
- && --chain_length != 0);
-
- if (best_len <= lookahead) return best_len;
- return lookahead;
- }
-
- internal int deflateInit(ZStream strm, int level, int bits){
- return deflateInit2(strm, level, Z_DEFLATED, bits, DEF_MEM_LEVEL,
- Z_DEFAULT_STRATEGY);
- }
- internal int deflateInit(ZStream strm, int level){
- return deflateInit(strm, level, MAX_WBITS);
- }
- internal int deflateInit2(ZStream strm, int level, int method, int windowBits,
- int memLevel, int strategy){
- int noheader = 0;
- // byte[] my_version=ZLIB_VERSION;
-
- //
- // if (version == null || version[0] != my_version[0]
- // || stream_size != sizeof(z_stream)) {
- // return Z_VERSION_ERROR;
- // }
-
- strm.msg = null;
-
- if (level == Z_DEFAULT_COMPRESSION) level = 6;
-
- if (windowBits < 0) { // undocumented feature: suppress zlib header
- noheader = 1;
- windowBits = -windowBits;
- }
-
- if (memLevel < 1 || memLevel > MAX_MEM_LEVEL ||
- method != Z_DEFLATED ||
- windowBits < 9 || windowBits > 15 || level < 0 || level > 9 ||
- strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
- return Z_STREAM_ERROR;
- }
-
- strm.dstate = (Deflate)this;
-
- this.noheader = noheader;
- w_bits = windowBits;
- w_size = 1 << w_bits;
- w_mask = w_size - 1;
-
- hash_bits = memLevel + 7;
- hash_size = 1 << hash_bits;
- hash_mask = hash_size - 1;
- hash_shift = ((hash_bits+MIN_MATCH-1)/MIN_MATCH);
-
- window = new byte[w_size*2];
- prev = new short[w_size];
- head = new short[hash_size];
-
- lit_bufsize = 1 << (memLevel + 6); // 16K elements by default
-
- // We overlay pending_buf and d_buf+l_buf. This works since the average
- // output size for (length,distance) codes is <= 24 bits.
- pending_buf = new byte[lit_bufsize*4];
- pending_buf_size = lit_bufsize*4;
-
- d_buf = lit_bufsize/2;
- l_buf = (1+2)*lit_bufsize;
-
- this.level = level;
-
- //System.out.println("level="+level);
-
- this.strategy = strategy;
- this.method = (byte)method;
-
- return deflateReset(strm);
- }
-
- internal int deflateReset(ZStream strm){
- strm.total_in = strm.total_out = 0;
- strm.msg = null; //
- strm.data_type = Z_UNKNOWN;
-
- pending = 0;
- pending_out = 0;
-
- if(noheader < 0) {
- noheader = 0; // was set to -1 by deflate(..., Z_FINISH);
- }
- status = (noheader!=0) ? BUSY_STATE : INIT_STATE;
- strm.adler=strm._adler.adler32(0, null, 0, 0);
-
- last_flush = Z_NO_FLUSH;
-
- tr_init();
- lm_init();
- return Z_OK;
- }
-
- internal int deflateEnd(){
- if(status!=INIT_STATE && status!=BUSY_STATE && status!=FINISH_STATE){
- return Z_STREAM_ERROR;
- }
- // Deallocate in reverse order of allocations:
- pending_buf=null;
- head=null;
- prev=null;
- window=null;
- // free
- // dstate=null;
- return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
- }
-
- internal int deflateParams(ZStream strm, int _level, int _strategy){
- int err=Z_OK;
-
- if(_level == Z_DEFAULT_COMPRESSION){
- _level = 6;
- }
- if(_level < 0 || _level > 9 ||
- _strategy < 0 || _strategy > Z_HUFFMAN_ONLY) {
- return Z_STREAM_ERROR;
- }
-
- if(config_table[level].func!=config_table[_level].func &&
- strm.total_in != 0) {
- // Flush the last buffer:
- err = strm.deflate(Z_PARTIAL_FLUSH);
- }
-
- if(level != _level) {
- level = _level;
- max_lazy_match = config_table[level].max_lazy;
- good_match = config_table[level].good_length;
- nice_match = config_table[level].nice_length;
- max_chain_length = config_table[level].max_chain;
- }
- strategy = _strategy;
- return err;
- }
-
- internal int deflateSetDictionary (ZStream strm, byte[] dictionary, int dictLength){
- int length = dictLength;
- int index=0;
-
- if(dictionary == null || status != INIT_STATE)
- return Z_STREAM_ERROR;
-
- strm.adler=strm._adler.adler32(strm.adler, dictionary, 0, dictLength);
-
- if(length < MIN_MATCH) return Z_OK;
- if(length > w_size-MIN_LOOKAHEAD){
- length = w_size-MIN_LOOKAHEAD;
- index=dictLength-length; // use the tail of the dictionary
- }
- System.Array.Copy(dictionary, index, window, 0, length);
- strstart = length;
- block_start = length;
-
- // Insert all strings in the hash table (except for the last two bytes).
- // s->lookahead stays null, so s->ins_h will be recomputed at the next
- // call of fill_window.
-
- ins_h = window[0]&0xff;
- ins_h=(((ins_h)<Z_FINISH || flush<0){
- return Z_STREAM_ERROR;
- }
-
- if(strm.next_out == null ||
- (strm.next_in == null && strm.avail_in != 0) ||
- (status == FINISH_STATE && flush != Z_FINISH)) {
- strm.msg=z_errmsg[Z_NEED_DICT-(Z_STREAM_ERROR)];
- return Z_STREAM_ERROR;
- }
- if(strm.avail_out == 0){
- strm.msg=z_errmsg[Z_NEED_DICT-(Z_BUF_ERROR)];
- return Z_BUF_ERROR;
- }
-
- this.strm = strm; // just in case
- old_flush = last_flush;
- last_flush = flush;
-
- // Write the zlib header
- if(status == INIT_STATE) {
- int header = (Z_DEFLATED+((w_bits-8)<<4))<<8;
- int level_flags=((level-1)&0xff)>>1;
-
- if(level_flags>3) level_flags=3;
- header |= (level_flags<<6);
- if(strstart!=0) header |= PRESET_DICT;
- header+=31-(header % 31);
-
- status=BUSY_STATE;
- putShortMSB(header);
-
-
- // Save the adler32 of the preset dictionary:
- if(strstart!=0){
- putShortMSB((int)(strm.adler>>16));
- putShortMSB((int)(strm.adler&0xffff));
- }
- strm.adler=strm._adler.adler32(0, null, 0, 0);
- }
-
- // Flush as much pending output as possible
- if(pending != 0) {
- strm.flush_pending();
- if(strm.avail_out == 0) {
- //System.out.println(" avail_out==0");
- // Since avail_out is 0, deflate will be called again with
- // more output space, but possibly with both pending and
- // avail_in equal to zero. There won't be anything to do,
- // but this is not an error situation so make sure we
- // return OK instead of BUF_ERROR at next call of deflate:
- last_flush = -1;
- return Z_OK;
- }
-
- // Make sure there is something to do and avoid duplicate consecutive
- // flushes. For repeated and useless calls with Z_FINISH, we keep
- // returning Z_STREAM_END instead of Z_BUFF_ERROR.
- }
- else if(strm.avail_in==0 && flush <= old_flush &&
- flush != Z_FINISH) {
- strm.msg=z_errmsg[Z_NEED_DICT-(Z_BUF_ERROR)];
- return Z_BUF_ERROR;
- }
-
- // User must not provide more input after the first FINISH:
- if(status == FINISH_STATE && strm.avail_in != 0) {
- strm.msg=z_errmsg[Z_NEED_DICT-(Z_BUF_ERROR)];
- return Z_BUF_ERROR;
- }
-
- // Start a new block or continue the current one.
- if(strm.avail_in!=0 || lookahead!=0 ||
- (flush != Z_NO_FLUSH && status != FINISH_STATE)) {
- int bstate=-1;
- switch(config_table[level].func){
- case STORED:
- bstate = deflate_stored(flush);
- break;
- case FAST:
- bstate = deflate_fast(flush);
- break;
- case SLOW:
- bstate = deflate_slow(flush);
- break;
- default:
- break;
- }
-
- if (bstate==FinishStarted || bstate==FinishDone) {
- status = FINISH_STATE;
- }
- if (bstate==NeedMore || bstate==FinishStarted) {
- if(strm.avail_out == 0) {
- last_flush = -1; // avoid BUF_ERROR next call, see above
- }
- return Z_OK;
- // If flush != Z_NO_FLUSH && avail_out == 0, the next call
- // of deflate should use the same flush parameter to make sure
- // that the flush is complete. So we don't have to output an
- // empty block here, this will be done at next call. This also
- // ensures that for a very small output buffer, we emit at most
- // one empty block.
- }
-
- if (bstate==BlockDone) {
- if(flush == Z_PARTIAL_FLUSH) {
- _tr_align();
- }
- else { // FULL_FLUSH or SYNC_FLUSH
- _tr_stored_block(0, 0, false);
- // For a full flush, this empty block will be recognized
- // as a special marker by inflate_sync().
- if(flush == Z_FULL_FLUSH) {
- //state.head[s.hash_size-1]=0;
- for(int i=0; i>16));
- putShortMSB((int)(strm.adler&0xffff));
- strm.flush_pending();
-
- // If avail_out is zero, the application will call deflate again
- // to flush the rest.
- noheader = -1; // write the trailer only once!
- return pending != 0 ? Z_OK : Z_STREAM_END;
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/util/zlib/InfBlocks.cs b/BCCrypto/src/util/zlib/InfBlocks.cs
deleted file mode 100644
index 479d9b5..0000000
--- a/BCCrypto/src/util/zlib/InfBlocks.cs
+++ /dev/null
@@ -1,618 +0,0 @@
-using System;
-/*
- * $Id: InfBlocks.cs,v 1.2 2008-05-10 09:35:40 bouncy Exp $
- *
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the distribution.
-
- 3. The names of the authors may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
-INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/*
- * This program is based on zlib-1.1.3, so all credit should go authors
- * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
- * and contributors of zlib.
- */
-
-namespace Org.BouncyCastle.Utilities.Zlib {
-
- internal sealed class InfBlocks{
- private const int MANY=1440;
-
- // And'ing with mask[n] masks the lower n bits
- private static readonly int[] inflate_mask = {
- 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f,
- 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff,
- 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff,
- 0x00007fff, 0x0000ffff
- };
-
- // Table for deflate from PKZIP's appnote.txt.
- static readonly int[] border = { // Order of the bit length code lengths
- 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
- };
-
- private const int Z_OK=0;
- private const int Z_STREAM_END=1;
- private const int Z_NEED_DICT=2;
- private const int Z_ERRNO=-1;
- private const int Z_STREAM_ERROR=-2;
- private const int Z_DATA_ERROR=-3;
- private const int Z_MEM_ERROR=-4;
- private const int Z_BUF_ERROR=-5;
- private const int Z_VERSION_ERROR=-6;
-
- private const int TYPE=0; // get type bits (3, including end bit)
- private const int LENS=1; // get lengths for stored
- private const int STORED=2;// processing stored block
- private const int TABLE=3; // get table lengths
- private const int BTREE=4; // get bit lengths tree for a dynamic block
- private const int DTREE=5; // get length, distance trees for a dynamic block
- private const int CODES=6; // processing fixed or dynamic block
- private const int DRY=7; // output remaining window bytes
- private const int DONE=8; // finished last block, done
- private const int BAD=9; // ot a data error--stuck here
-
- internal int mode; // current inflate_block mode
-
- internal int left; // if STORED, bytes left to copy
-
- internal int table; // table lengths (14 bits)
- internal int index; // index into blens (or border)
- internal int[] blens; // bit lengths of codes
- internal int[] bb=new int[1]; // bit length tree depth
- internal int[] tb=new int[1]; // bit length decoding tree
-
- internal InfCodes codes=new InfCodes(); // if CODES, current state
-
- int last; // true if this block is the last block
-
- // mode independent information
- internal int bitk; // bits in bit buffer
- internal int bitb; // bit buffer
- internal int[] hufts; // single malloc for tree space
- internal byte[] window; // sliding window
- internal int end; // one byte after sliding window
- internal int read; // window read pointer
- internal int write; // window write pointer
- internal Object checkfn; // check function
- internal long check; // check on output
-
- internal InfTree inftree=new InfTree();
-
- internal InfBlocks(ZStream z, Object checkfn, int w){
- hufts=new int[MANY*3];
- window=new byte[w];
- end=w;
- this.checkfn = checkfn;
- mode = TYPE;
- reset(z, null);
- }
-
- internal void reset(ZStream z, long[] c){
- if(c!=null) c[0]=check;
- if(mode==BTREE || mode==DTREE){
- }
- if(mode==CODES){
- codes.free(z);
- }
- mode=TYPE;
- bitk=0;
- bitb=0;
- read=write=0;
-
- if(checkfn != null)
- z.adler=check=z._adler.adler32(0L, null, 0, 0);
- }
-
- internal int proc(ZStream z, int r){
- int t; // temporary storage
- int b; // bit buffer
- int k; // bits in bit buffer
- int p; // input data pointer
- int n; // bytes available there
- int q; // output window write pointer
- int m; { // bytes to end of window or read pointer
-
- // copy input/output information to locals (UPDATE macro restores)
- p=z.next_in_index;n=z.avail_in;b=bitb;k=bitk;} {
- q=write;m=(int)(q> 1){
- case 0: { // stored
- b>>=(3);k-=(3);}
- t = k & 7; { // go to byte boundary
-
- b>>=(t);k-=(t);}
- mode = LENS; // get length of stored block
- break;
- case 1: { // fixed
- int[] bl=new int[1];
- int[] bd=new int[1];
- int[][] tl=new int[1][];
- int[][] td=new int[1][];
-
- InfTree.inflate_trees_fixed(bl, bd, tl, td, z);
- codes.init(bl[0], bd[0], tl[0], 0, td[0], 0, z);
- } {
-
- b>>=(3);k-=(3);}
-
- mode = CODES;
- break;
- case 2: { // dynamic
-
- b>>=(3);k-=(3);}
-
- mode = TABLE;
- break;
- case 3: { // illegal
-
- b>>=(3);k-=(3);}
- mode = BAD;
- z.msg = "invalid block type";
- r = Z_DATA_ERROR;
-
- bitb=b; bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
- return inflate_flush(z,r);
- }
- break;
- case LENS:
-
- while(k<(32)){
- if(n!=0){
- r=Z_OK;
- }
- else{
- bitb=b; bitk=k;
- z.avail_in=n;
- z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
- return inflate_flush(z,r);
- };
- n--;
- b|=(z.next_in[p++]&0xff)<> 16) & 0xffff) != (b & 0xffff)){
- mode = BAD;
- z.msg = "invalid stored block lengths";
- r = Z_DATA_ERROR;
-
- bitb=b; bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
- return inflate_flush(z,r);
- }
- left = (b & 0xffff);
- b = k = 0; // dump bits
- mode = left!=0 ? STORED : (last!=0 ? DRY : TYPE);
- break;
- case STORED:
- if (n == 0){
- bitb=b; bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
- return inflate_flush(z,r);
- }
-
- if(m==0){
- if(q==end&&read!=0){
- q=0; m=(int)(qn) t = n;
- if(t>m) t = m;
- System.Array.Copy(z.next_in, p, window, q, t);
- p += t; n -= t;
- q += t; m -= t;
- if ((left -= t) != 0)
- break;
- mode = last!=0 ? DRY : TYPE;
- break;
- case TABLE:
-
- while(k<(14)){
- if(n!=0){
- r=Z_OK;
- }
- else{
- bitb=b; bitk=k;
- z.avail_in=n;
- z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
- return inflate_flush(z,r);
- };
- n--;
- b|=(z.next_in[p++]&0xff)< 29 || ((t >> 5) & 0x1f) > 29) {
- mode = BAD;
- z.msg = "too many length or distance symbols";
- r = Z_DATA_ERROR;
-
- bitb=b; bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
- return inflate_flush(z,r);
- }
- t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
- if(blens==null || blens.Length>=(14);k-=(14);}
-
- index = 0;
- mode = BTREE;
- goto case BTREE;
- case BTREE:
- while (index < 4 + (table >> 10)){
- while(k<(3)){
- if(n!=0){
- r=Z_OK;
- }
- else{
- bitb=b; bitk=k;
- z.avail_in=n;
- z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
- return inflate_flush(z,r);
- };
- n--;
- b|=(z.next_in[p++]&0xff)<>=(3);k-=(3);}
- }
-
- while(index < 19){
- blens[border[index++]] = 0;
- }
-
- bb[0] = 7;
- t = inftree.inflate_trees_bits(blens, bb, tb, hufts, z);
- if (t != Z_OK){
- r = t;
- if (r == Z_DATA_ERROR){
- blens=null;
- mode = BAD;
- }
-
- bitb=b; bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
- return inflate_flush(z,r);
- }
-
- index = 0;
- mode = DTREE;
- goto case DTREE;
- case DTREE:
- while (true){
- t = table;
- if(!(index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))){
- break;
- }
-
- int i, j, c;
-
- t = bb[0];
-
- while(k<(t)){
- if(n!=0){
- r=Z_OK;
- }
- else{
- bitb=b; bitk=k;
- z.avail_in=n;
- z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
- return inflate_flush(z,r);
- };
- n--;
- b|=(z.next_in[p++]&0xff)<>=(t);k-=(t);
- blens[index++] = c;
- }
- else { // c == 16..18
- i = c == 18 ? 7 : c - 14;
- j = c == 18 ? 11 : 3;
-
- while(k<(t+i)){
- if(n!=0){
- r=Z_OK;
- }
- else{
- bitb=b; bitk=k;
- z.avail_in=n;
- z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
- return inflate_flush(z,r);
- };
- n--;
- b|=(z.next_in[p++]&0xff)<>=(t);k-=(t);
-
- j += (b & inflate_mask[i]);
-
- b>>=(i);k-=(i);
-
- i = index;
- t = table;
- if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
- (c == 16 && i < 1)){
- blens=null;
- mode = BAD;
- z.msg = "invalid bit length repeat";
- r = Z_DATA_ERROR;
-
- bitb=b; bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
- return inflate_flush(z,r);
- }
-
- c = c == 16 ? blens[i-1] : 0;
- do{
- blens[i++] = c;
- }
- while (--j!=0);
- index = i;
- }
- }
-
- tb[0]=-1; {
- int[] bl=new int[1];
- int[] bd=new int[1];
- int[] tl=new int[1];
- int[] td=new int[1];
- bl[0] = 9; // must be <= 9 for lookahead assumptions
- bd[0] = 6; // must be <= 9 for lookahead assumptions
-
- t = table;
- t = inftree.inflate_trees_dynamic(257 + (t & 0x1f),
- 1 + ((t >> 5) & 0x1f),
- blens, bl, bd, tl, td, hufts, z);
-
- if (t != Z_OK){
- if (t == Z_DATA_ERROR){
- blens=null;
- mode = BAD;
- }
- r = t;
-
- bitb=b; bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
- return inflate_flush(z,r);
- }
- codes.init(bl[0], bd[0], hufts, tl[0], hufts, td[0], z);
- }
- mode = CODES;
- goto case CODES;
- case CODES:
- bitb=b; bitk=k;
- z.avail_in=n; z.total_in+=p-z.next_in_index;z.next_in_index=p;
- write=q;
-
- if ((r = codes.proc(this, z, r)) != Z_STREAM_END){
- return inflate_flush(z, r);
- }
- r = Z_OK;
- codes.free(z);
-
- p=z.next_in_index; n=z.avail_in;b=bitb;k=bitk;
- q=write;m=(int)(q z.avail_out) n = z.avail_out;
- if (n!=0 && r == Z_BUF_ERROR) r = Z_OK;
-
- // update counters
- z.avail_out -= n;
- z.total_out += n;
-
- // update check information
- if(checkfn != null)
- z.adler=check=z._adler.adler32(check, window, q, n);
-
- // copy as far as end of window
- System.Array.Copy(window, q, z.next_out, p, n);
- p += n;
- q += n;
-
- // see if more to copy at beginning of window
- if (q == end){
- // wrap pointers
- q = 0;
- if (write == end)
- write = 0;
-
- // compute bytes to copy
- n = write - q;
- if (n > z.avail_out) n = z.avail_out;
- if (n!=0 && r == Z_BUF_ERROR) r = Z_OK;
-
- // update counters
- z.avail_out -= n;
- z.total_out += n;
-
- // update check information
- if(checkfn != null)
- z.adler=check=z._adler.adler32(check, window, q, n);
-
- // copy
- System.Array.Copy(window, q, z.next_out, p, n);
- p += n;
- q += n;
- }
-
- // update pointers
- z.next_out_index = p;
- read = q;
-
- // done
- return r;
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/util/zlib/InfCodes.cs b/BCCrypto/src/util/zlib/InfCodes.cs
deleted file mode 100644
index 6fcafe4..0000000
--- a/BCCrypto/src/util/zlib/InfCodes.cs
+++ /dev/null
@@ -1,611 +0,0 @@
-using System;
-/*
- * $Id: InfCodes.cs,v 1.2 2008-05-10 09:35:40 bouncy Exp $
- *
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the distribution.
-
- 3. The names of the authors may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
-INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/*
- * This program is based on zlib-1.1.3, so all credit should go authors
- * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
- * and contributors of zlib.
- */
-
-namespace Org.BouncyCastle.Utilities.Zlib {
-
- internal sealed class InfCodes{
-
- private static readonly int[] inflate_mask = {
- 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f,
- 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff,
- 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff,
- 0x00007fff, 0x0000ffff
- };
-
- private const int Z_OK=0;
- private const int Z_STREAM_END=1;
- private const int Z_NEED_DICT=2;
- private const int Z_ERRNO=-1;
- private const int Z_STREAM_ERROR=-2;
- private const int Z_DATA_ERROR=-3;
- private const int Z_MEM_ERROR=-4;
- private const int Z_BUF_ERROR=-5;
- private const int Z_VERSION_ERROR=-6;
-
- // waiting for "i:"=input,
- // "o:"=output,
- // "x:"=nothing
- private const int START=0; // x: set up for LEN
- private const int LEN=1; // i: get length/literal/eob next
- private const int LENEXT=2; // i: getting length extra (have base)
- private const int DIST=3; // i: get distance next
- private const int DISTEXT=4;// i: getting distance extra
- private const int COPY=5; // o: copying bytes in window, waiting for space
- private const int LIT=6; // o: got literal, waiting for output space
- private const int WASH=7; // o: got eob, possibly still output waiting
- private const int END=8; // x: got eob and all data flushed
- private const int BADCODE=9;// x: got error
-
- int mode; // current inflate_codes mode
-
- // mode dependent information
- int len;
-
- int[] tree; // pointer into tree
- int tree_index=0;
- int need; // bits needed
-
- int lit;
-
- // if EXT or COPY, where and how much
- int get; // bits to get for extra
- int dist; // distance back to copy from
-
- byte lbits; // ltree bits decoded per branch
- byte dbits; // dtree bits decoder per branch
- int[] ltree; // literal/length/eob tree
- int ltree_index; // literal/length/eob tree
- int[] dtree; // distance tree
- int dtree_index; // distance tree
-
- internal InfCodes(){
- }
- internal void init(int bl, int bd,
- int[] tl, int tl_index,
- int[] td, int td_index, ZStream z){
- mode=START;
- lbits=(byte)bl;
- dbits=(byte)bd;
- ltree=tl;
- ltree_index=tl_index;
- dtree = td;
- dtree_index=td_index;
- tree=null;
- }
-
- internal int proc(InfBlocks s, ZStream z, int r){
- int j; // temporary storage
- int tindex; // temporary pointer
- int e; // extra bits or operation
- int b=0; // bit buffer
- int k=0; // bits in bit buffer
- int p=0; // input data pointer
- int n; // bytes available there
- int q; // output window write pointer
- int m; // bytes to end of window or read pointer
- int f; // pointer to copy strings from
-
- // copy input/output information to locals (UPDATE macro restores)
- p=z.next_in_index;n=z.avail_in;b=s.bitb;k=s.bitk;
- q=s.write;m=q= 258 && n >= 10){
-
- s.bitb=b;s.bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- s.write=q;
- r = inflate_fast(lbits, dbits,
- ltree, ltree_index,
- dtree, dtree_index,
- s, z);
-
- p=z.next_in_index;n=z.avail_in;b=s.bitb;k=s.bitk;
- q=s.write;m=q>=(tree[tindex+1]);
- k-=(tree[tindex+1]);
-
- e=tree[tindex];
-
- if(e == 0){ // literal
- lit = tree[tindex+2];
- mode = LIT;
- break;
- }
- if((e & 16)!=0 ){ // length
- get = e & 15;
- len = tree[tindex+2];
- mode = LENEXT;
- break;
- }
- if ((e & 64) == 0){ // next table
- need = e;
- tree_index = tindex/3+tree[tindex+2];
- break;
- }
- if ((e & 32)!=0){ // end of block
- mode = WASH;
- break;
- }
- mode = BADCODE; // invalid code
- z.msg = "invalid literal/length code";
- r = Z_DATA_ERROR;
-
- s.bitb=b;s.bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- s.write=q;
- return s.inflate_flush(z,r);
-
- case LENEXT: // i: getting length extra (have base)
- j = get;
-
- while(k<(j)){
- if(n!=0)r=Z_OK;
- else{
-
- s.bitb=b;s.bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- s.write=q;
- return s.inflate_flush(z,r);
- }
- n--; b|=(z.next_in[p++]&0xff)<>=j;
- k-=j;
-
- need = dbits;
- tree = dtree;
- tree_index=dtree_index;
- mode = DIST;
- goto case DIST;
- case DIST: // i: get distance next
- j = need;
-
- while(k<(j)){
- if(n!=0)r=Z_OK;
- else{
-
- s.bitb=b;s.bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- s.write=q;
- return s.inflate_flush(z,r);
- }
- n--; b|=(z.next_in[p++]&0xff)<>=tree[tindex+1];
- k-=tree[tindex+1];
-
- e = (tree[tindex]);
- if((e & 16)!=0){ // distance
- get = e & 15;
- dist = tree[tindex+2];
- mode = DISTEXT;
- break;
- }
- if ((e & 64) == 0){ // next table
- need = e;
- tree_index = tindex/3 + tree[tindex+2];
- break;
- }
- mode = BADCODE; // invalid code
- z.msg = "invalid distance code";
- r = Z_DATA_ERROR;
-
- s.bitb=b;s.bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- s.write=q;
- return s.inflate_flush(z,r);
-
- case DISTEXT: // i: getting distance extra
- j = get;
-
- while(k<(j)){
- if(n!=0)r=Z_OK;
- else{
-
- s.bitb=b;s.bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- s.write=q;
- return s.inflate_flush(z,r);
- }
- n--; b|=(z.next_in[p++]&0xff)<>=j;
- k-=j;
-
- mode = COPY;
- goto case COPY;
- case COPY: // o: copying bytes in window, waiting for space
- f = q - dist;
- while(f < 0){ // modulo window size-"while" instead
- f += s.end; // of "if" handles invalid distances
- }
- while (len!=0){
-
- if(m==0){
- if(q==s.end&&s.read!=0){q=0;m=q 7){ // return unused byte, if any
- k -= 8;
- n++;
- p--; // can always return one
- }
-
- s.write=q; r=s.inflate_flush(z,r);
- q=s.write;m=q= 258 && n >= 10
- // get literal/length code
- while(k<(20)){ // max bits for literal/length code
- n--;
- b|=(z.next_in[p++]&0xff)<>=(tp[tp_index_t_3+1]); k-=(tp[tp_index_t_3+1]);
-
- s.window[q++] = (byte)tp[tp_index_t_3+2];
- m--;
- continue;
- }
- do {
-
- b>>=(tp[tp_index_t_3+1]); k-=(tp[tp_index_t_3+1]);
-
- if((e&16)!=0){
- e &= 15;
- c = tp[tp_index_t_3+2] + ((int)b & inflate_mask[e]);
-
- b>>=e; k-=e;
-
- // decode distance base of block to copy
- while(k<(15)){ // max bits for distance code
- n--;
- b|=(z.next_in[p++]&0xff)<>=(tp[tp_index_t_3+1]); k-=(tp[tp_index_t_3+1]);
-
- if((e&16)!=0){
- // get extra bits to add to distance base
- e &= 15;
- while(k<(e)){ // get extra bits (up to 13)
- n--;
- b|=(z.next_in[p++]&0xff)<>=(e); k-=(e);
-
- // do the copy
- m -= c;
- if (q >= d){ // offset before dest
- // just copy
- r=q-d;
- if(q-r>0 && 2>(q-r)){
- s.window[q++]=s.window[r++]; // minimum count is three,
- s.window[q++]=s.window[r++]; // so unroll loop a little
- c-=2;
- }
- else{
- System.Array.Copy(s.window, r, s.window, q, 2);
- q+=2; r+=2; c-=2;
- }
- }
- else{ // else offset after destination
- r=q-d;
- do{
- r+=s.end; // force pointer in window
- }while(r<0); // covers invalid distances
- e=s.end-r;
- if(c>e){ // if source crosses,
- c-=e; // wrapped copy
- if(q-r>0 && e>(q-r)){
- do{s.window[q++] = s.window[r++];}
- while(--e!=0);
- }
- else{
- System.Array.Copy(s.window, r, s.window, q, e);
- q+=e; r+=e; e=0;
- }
- r = 0; // copy rest from start of window
- }
-
- }
-
- // copy all or what's left
- if(q-r>0 && c>(q-r)){
- do{s.window[q++] = s.window[r++];}
- while(--c!=0);
- }
- else{
- System.Array.Copy(s.window, r, s.window, q, c);
- q+=c; r+=c; c=0;
- }
- break;
- }
- else if((e&64)==0){
- t+=tp[tp_index_t_3+2];
- t+=(b&inflate_mask[e]);
- tp_index_t_3=(tp_index+t)*3;
- e=tp[tp_index_t_3];
- }
- else{
- z.msg = "invalid distance code";
-
- c=z.avail_in-n;c=(k>>3)>3:c;n+=c;p-=c;k-=c<<3;
-
- s.bitb=b;s.bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- s.write=q;
-
- return Z_DATA_ERROR;
- }
- }
- while(true);
- break;
- }
-
- if((e&64)==0){
- t+=tp[tp_index_t_3+2];
- t+=(b&inflate_mask[e]);
- tp_index_t_3=(tp_index+t)*3;
- if((e=tp[tp_index_t_3])==0){
-
- b>>=(tp[tp_index_t_3+1]); k-=(tp[tp_index_t_3+1]);
-
- s.window[q++]=(byte)tp[tp_index_t_3+2];
- m--;
- break;
- }
- }
- else if((e&32)!=0){
-
- c=z.avail_in-n;c=(k>>3)>3:c;n+=c;p-=c;k-=c<<3;
-
- s.bitb=b;s.bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- s.write=q;
-
- return Z_STREAM_END;
- }
- else{
- z.msg="invalid literal/length code";
-
- c=z.avail_in-n;c=(k>>3)>3:c;n+=c;p-=c;k-=c<<3;
-
- s.bitb=b;s.bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- s.write=q;
-
- return Z_DATA_ERROR;
- }
- }
- while(true);
- }
- while(m>=258 && n>= 10);
-
- // not enough input or output--restore pointers and return
- c=z.avail_in-n;c=(k>>3)>3:c;n+=c;p-=c;k-=c<<3;
-
- s.bitb=b;s.bitk=k;
- z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p;
- s.write=q;
-
- return Z_OK;
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/util/zlib/InfTree.cs b/BCCrypto/src/util/zlib/InfTree.cs
deleted file mode 100644
index 6ed7d19..0000000
--- a/BCCrypto/src/util/zlib/InfTree.cs
+++ /dev/null
@@ -1,523 +0,0 @@
-using System;
-/*
- * $Id: InfTree.cs,v 1.2 2008-05-10 09:35:40 bouncy Exp $
- *
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the distribution.
-
- 3. The names of the authors may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
-INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/*
- * This program is based on zlib-1.1.3, so all credit should go authors
- * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
- * and contributors of zlib.
- */
-
-namespace Org.BouncyCastle.Utilities.Zlib {
-
- internal sealed class InfTree{
-
- private const int MANY=1440;
-
- private const int Z_OK=0;
- private const int Z_STREAM_END=1;
- private const int Z_NEED_DICT=2;
- private const int Z_ERRNO=-1;
- private const int Z_STREAM_ERROR=-2;
- private const int Z_DATA_ERROR=-3;
- private const int Z_MEM_ERROR=-4;
- private const int Z_BUF_ERROR=-5;
- private const int Z_VERSION_ERROR=-6;
-
- private const int fixed_bl = 9;
- private const int fixed_bd = 5;
-
- static readonly int[] fixed_tl = {
- 96,7,256, 0,8,80, 0,8,16, 84,8,115,
- 82,7,31, 0,8,112, 0,8,48, 0,9,192,
- 80,7,10, 0,8,96, 0,8,32, 0,9,160,
- 0,8,0, 0,8,128, 0,8,64, 0,9,224,
- 80,7,6, 0,8,88, 0,8,24, 0,9,144,
- 83,7,59, 0,8,120, 0,8,56, 0,9,208,
- 81,7,17, 0,8,104, 0,8,40, 0,9,176,
- 0,8,8, 0,8,136, 0,8,72, 0,9,240,
- 80,7,4, 0,8,84, 0,8,20, 85,8,227,
- 83,7,43, 0,8,116, 0,8,52, 0,9,200,
- 81,7,13, 0,8,100, 0,8,36, 0,9,168,
- 0,8,4, 0,8,132, 0,8,68, 0,9,232,
- 80,7,8, 0,8,92, 0,8,28, 0,9,152,
- 84,7,83, 0,8,124, 0,8,60, 0,9,216,
- 82,7,23, 0,8,108, 0,8,44, 0,9,184,
- 0,8,12, 0,8,140, 0,8,76, 0,9,248,
- 80,7,3, 0,8,82, 0,8,18, 85,8,163,
- 83,7,35, 0,8,114, 0,8,50, 0,9,196,
- 81,7,11, 0,8,98, 0,8,34, 0,9,164,
- 0,8,2, 0,8,130, 0,8,66, 0,9,228,
- 80,7,7, 0,8,90, 0,8,26, 0,9,148,
- 84,7,67, 0,8,122, 0,8,58, 0,9,212,
- 82,7,19, 0,8,106, 0,8,42, 0,9,180,
- 0,8,10, 0,8,138, 0,8,74, 0,9,244,
- 80,7,5, 0,8,86, 0,8,22, 192,8,0,
- 83,7,51, 0,8,118, 0,8,54, 0,9,204,
- 81,7,15, 0,8,102, 0,8,38, 0,9,172,
- 0,8,6, 0,8,134, 0,8,70, 0,9,236,
- 80,7,9, 0,8,94, 0,8,30, 0,9,156,
- 84,7,99, 0,8,126, 0,8,62, 0,9,220,
- 82,7,27, 0,8,110, 0,8,46, 0,9,188,
- 0,8,14, 0,8,142, 0,8,78, 0,9,252,
- 96,7,256, 0,8,81, 0,8,17, 85,8,131,
- 82,7,31, 0,8,113, 0,8,49, 0,9,194,
- 80,7,10, 0,8,97, 0,8,33, 0,9,162,
- 0,8,1, 0,8,129, 0,8,65, 0,9,226,
- 80,7,6, 0,8,89, 0,8,25, 0,9,146,
- 83,7,59, 0,8,121, 0,8,57, 0,9,210,
- 81,7,17, 0,8,105, 0,8,41, 0,9,178,
- 0,8,9, 0,8,137, 0,8,73, 0,9,242,
- 80,7,4, 0,8,85, 0,8,21, 80,8,258,
- 83,7,43, 0,8,117, 0,8,53, 0,9,202,
- 81,7,13, 0,8,101, 0,8,37, 0,9,170,
- 0,8,5, 0,8,133, 0,8,69, 0,9,234,
- 80,7,8, 0,8,93, 0,8,29, 0,9,154,
- 84,7,83, 0,8,125, 0,8,61, 0,9,218,
- 82,7,23, 0,8,109, 0,8,45, 0,9,186,
- 0,8,13, 0,8,141, 0,8,77, 0,9,250,
- 80,7,3, 0,8,83, 0,8,19, 85,8,195,
- 83,7,35, 0,8,115, 0,8,51, 0,9,198,
- 81,7,11, 0,8,99, 0,8,35, 0,9,166,
- 0,8,3, 0,8,131, 0,8,67, 0,9,230,
- 80,7,7, 0,8,91, 0,8,27, 0,9,150,
- 84,7,67, 0,8,123, 0,8,59, 0,9,214,
- 82,7,19, 0,8,107, 0,8,43, 0,9,182,
- 0,8,11, 0,8,139, 0,8,75, 0,9,246,
- 80,7,5, 0,8,87, 0,8,23, 192,8,0,
- 83,7,51, 0,8,119, 0,8,55, 0,9,206,
- 81,7,15, 0,8,103, 0,8,39, 0,9,174,
- 0,8,7, 0,8,135, 0,8,71, 0,9,238,
- 80,7,9, 0,8,95, 0,8,31, 0,9,158,
- 84,7,99, 0,8,127, 0,8,63, 0,9,222,
- 82,7,27, 0,8,111, 0,8,47, 0,9,190,
- 0,8,15, 0,8,143, 0,8,79, 0,9,254,
- 96,7,256, 0,8,80, 0,8,16, 84,8,115,
- 82,7,31, 0,8,112, 0,8,48, 0,9,193,
-
- 80,7,10, 0,8,96, 0,8,32, 0,9,161,
- 0,8,0, 0,8,128, 0,8,64, 0,9,225,
- 80,7,6, 0,8,88, 0,8,24, 0,9,145,
- 83,7,59, 0,8,120, 0,8,56, 0,9,209,
- 81,7,17, 0,8,104, 0,8,40, 0,9,177,
- 0,8,8, 0,8,136, 0,8,72, 0,9,241,
- 80,7,4, 0,8,84, 0,8,20, 85,8,227,
- 83,7,43, 0,8,116, 0,8,52, 0,9,201,
- 81,7,13, 0,8,100, 0,8,36, 0,9,169,
- 0,8,4, 0,8,132, 0,8,68, 0,9,233,
- 80,7,8, 0,8,92, 0,8,28, 0,9,153,
- 84,7,83, 0,8,124, 0,8,60, 0,9,217,
- 82,7,23, 0,8,108, 0,8,44, 0,9,185,
- 0,8,12, 0,8,140, 0,8,76, 0,9,249,
- 80,7,3, 0,8,82, 0,8,18, 85,8,163,
- 83,7,35, 0,8,114, 0,8,50, 0,9,197,
- 81,7,11, 0,8,98, 0,8,34, 0,9,165,
- 0,8,2, 0,8,130, 0,8,66, 0,9,229,
- 80,7,7, 0,8,90, 0,8,26, 0,9,149,
- 84,7,67, 0,8,122, 0,8,58, 0,9,213,
- 82,7,19, 0,8,106, 0,8,42, 0,9,181,
- 0,8,10, 0,8,138, 0,8,74, 0,9,245,
- 80,7,5, 0,8,86, 0,8,22, 192,8,0,
- 83,7,51, 0,8,118, 0,8,54, 0,9,205,
- 81,7,15, 0,8,102, 0,8,38, 0,9,173,
- 0,8,6, 0,8,134, 0,8,70, 0,9,237,
- 80,7,9, 0,8,94, 0,8,30, 0,9,157,
- 84,7,99, 0,8,126, 0,8,62, 0,9,221,
- 82,7,27, 0,8,110, 0,8,46, 0,9,189,
- 0,8,14, 0,8,142, 0,8,78, 0,9,253,
- 96,7,256, 0,8,81, 0,8,17, 85,8,131,
- 82,7,31, 0,8,113, 0,8,49, 0,9,195,
- 80,7,10, 0,8,97, 0,8,33, 0,9,163,
- 0,8,1, 0,8,129, 0,8,65, 0,9,227,
- 80,7,6, 0,8,89, 0,8,25, 0,9,147,
- 83,7,59, 0,8,121, 0,8,57, 0,9,211,
- 81,7,17, 0,8,105, 0,8,41, 0,9,179,
- 0,8,9, 0,8,137, 0,8,73, 0,9,243,
- 80,7,4, 0,8,85, 0,8,21, 80,8,258,
- 83,7,43, 0,8,117, 0,8,53, 0,9,203,
- 81,7,13, 0,8,101, 0,8,37, 0,9,171,
- 0,8,5, 0,8,133, 0,8,69, 0,9,235,
- 80,7,8, 0,8,93, 0,8,29, 0,9,155,
- 84,7,83, 0,8,125, 0,8,61, 0,9,219,
- 82,7,23, 0,8,109, 0,8,45, 0,9,187,
- 0,8,13, 0,8,141, 0,8,77, 0,9,251,
- 80,7,3, 0,8,83, 0,8,19, 85,8,195,
- 83,7,35, 0,8,115, 0,8,51, 0,9,199,
- 81,7,11, 0,8,99, 0,8,35, 0,9,167,
- 0,8,3, 0,8,131, 0,8,67, 0,9,231,
- 80,7,7, 0,8,91, 0,8,27, 0,9,151,
- 84,7,67, 0,8,123, 0,8,59, 0,9,215,
- 82,7,19, 0,8,107, 0,8,43, 0,9,183,
- 0,8,11, 0,8,139, 0,8,75, 0,9,247,
- 80,7,5, 0,8,87, 0,8,23, 192,8,0,
- 83,7,51, 0,8,119, 0,8,55, 0,9,207,
- 81,7,15, 0,8,103, 0,8,39, 0,9,175,
- 0,8,7, 0,8,135, 0,8,71, 0,9,239,
- 80,7,9, 0,8,95, 0,8,31, 0,9,159,
- 84,7,99, 0,8,127, 0,8,63, 0,9,223,
- 82,7,27, 0,8,111, 0,8,47, 0,9,191,
- 0,8,15, 0,8,143, 0,8,79, 0,9,255
- };
- static readonly int[] fixed_td = {
- 80,5,1, 87,5,257, 83,5,17, 91,5,4097,
- 81,5,5, 89,5,1025, 85,5,65, 93,5,16385,
- 80,5,3, 88,5,513, 84,5,33, 92,5,8193,
- 82,5,9, 90,5,2049, 86,5,129, 192,5,24577,
- 80,5,2, 87,5,385, 83,5,25, 91,5,6145,
- 81,5,7, 89,5,1537, 85,5,97, 93,5,24577,
- 80,5,4, 88,5,769, 84,5,49, 92,5,12289,
- 82,5,13, 90,5,3073, 86,5,193, 192,5,24577
- };
-
- // Tables for deflate from PKZIP's appnote.txt.
- static readonly int[] cplens = { // Copy lengths for literal codes 257..285
- 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
- 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
- };
-
- // see note #13 above about 258
- static readonly int[] cplext = { // Extra bits for literal codes 257..285
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
- 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112 // 112==invalid
- };
-
- static readonly int[] cpdist = { // Copy offsets for distance codes 0..29
- 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
- 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
- 8193, 12289, 16385, 24577
- };
-
- static readonly int[] cpdext = { // Extra bits for distance codes
- 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
- 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
- 12, 12, 13, 13};
-
- // If BMAX needs to be larger than 16, then h and x[] should be uLong.
- const int BMAX=15; // maximum bit length of any code
-
- int[] hn = null; // hufts used in space
- int[] v = null; // work area for huft_build
- int[] c = null; // bit length count table
- int[] r = null; // table entry for structure assignment
- int[] u = null; // table stack
- int[] x = null; // bit offsets, then code stack
-
- private int huft_build(int[] b, // code lengths in bits (all assumed <= BMAX)
- int bindex,
- int n, // number of codes (assumed <= 288)
- int s, // number of simple-valued codes (0..s-1)
- int[] d, // list of base values for non-simple codes
- int[] e, // list of extra bits for non-simple codes
- int[] t, // result: starting table
- int[] m, // maximum lookup bits, returns actual
- int[] hp,// space for trees
- int[] hn,// hufts used in space
- int[] v // working area: values in order of bit length
- ){
- // Given a list of code lengths and a maximum table size, make a set of
- // tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR
- // if the given code set is incomplete (the tables are still built in this
- // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of
- // lengths), or Z_MEM_ERROR if not enough memory.
-
- int a; // counter for codes of length k
- int f; // i repeats in table every f entries
- int g; // maximum code length
- int h; // table level
- int i; // counter, current code
- int j; // counter
- int k; // number of bits in current code
- int l; // bits per table (returned in m)
- int mask; // (1 << w) - 1, to avoid cc -O bug on HP
- int p; // pointer into c[], b[], or v[]
- int q; // points to current table
- int w; // bits before this table == (l * h)
- int xp; // pointer into x
- int y; // number of dummy codes added
- int z; // number of entries in current table
-
- // Generate counts for each bit length
-
- p = 0; i = n;
- do {
- c[b[bindex+p]]++; p++; i--; // assume all entries <= BMAX
- }while(i!=0);
-
- if(c[0] == n){ // null input--all zero length codes
- t[0] = -1;
- m[0] = 0;
- return Z_OK;
- }
-
- // Find minimum and maximum length, bound *m by those
- l = m[0];
- for (j = 1; j <= BMAX; j++)
- if(c[j]!=0) break;
- k = j; // minimum code length
- if(l < j){
- l = j;
- }
- for (i = BMAX; i!=0; i--){
- if(c[i]!=0) break;
- }
- g = i; // maximum code length
- if(l > i){
- l = i;
- }
- m[0] = l;
-
- // Adjust last length count to fill out codes, if needed
- for (y = 1 << j; j < i; j++, y <<= 1){
- if ((y -= c[j]) < 0){
- return Z_DATA_ERROR;
- }
- }
- if ((y -= c[i]) < 0){
- return Z_DATA_ERROR;
- }
- c[i] += y;
-
- // Generate starting offsets into the value table for each length
- x[1] = j = 0;
- p = 1; xp = 2;
- while (--i!=0) { // note that i == g from above
- x[xp] = (j += c[p]);
- xp++;
- p++;
- }
-
- // Make a table of values in order of bit lengths
- i = 0; p = 0;
- do {
- if ((j = b[bindex+p]) != 0){
- v[x[j]++] = i;
- }
- p++;
- }
- while (++i < n);
- n = x[g]; // set n to length of v
-
- // Generate the Huffman codes and for each, make the table entries
- x[0] = i = 0; // first Huffman code is zero
- p = 0; // grab values in bit order
- h = -1; // no tables yet--level -1
- w = -l; // bits decoded == (l * h)
- u[0] = 0; // just to keep compilers happy
- q = 0; // ditto
- z = 0; // ditto
-
- // go through the bit lengths (k already is bits in shortest code)
- for (; k <= g; k++){
- a = c[k];
- while (a--!=0){
- // here i is the Huffman code of length k bits for value *p
- // make tables up to required level
- while (k > w + l){
- h++;
- w += l; // previous table always l bits
- // compute minimum size table less than or equal to l bits
- z = g - w;
- z = (z > l) ? l : z; // table size upper limit
- if((f=1<<(j=k-w))>a+1){ // try a k-w bit table
- // too few codes for k-w bit table
- f -= a + 1; // deduct codes from patterns left
- xp = k;
- if(j < z){
- while (++j < z){ // try smaller tables up to z bits
- if((f <<= 1) <= c[++xp])
- break; // enough codes to use up j bits
- f -= c[xp]; // else deduct codes from patterns
- }
- }
- }
- z = 1 << j; // table entries for j-bit table
-
- // allocate new table
- if (hn[0] + z > MANY){ // (note: doesn't matter for fixed)
- return Z_DATA_ERROR; // overflow of MANY
- }
- u[h] = q = /*hp+*/ hn[0]; // DEBUG
- hn[0] += z;
-
- // connect to last table, if there is one
- if(h!=0){
- x[h]=i; // save pattern for backing up
- r[0]=(byte)j; // bits in this table
- r[1]=(byte)l; // bits to dump before this table
- j=i>>(w - l);
- r[2] = (int)(q - u[h-1] - j); // offset to this table
- System.Array.Copy(r, 0, hp, (u[h-1]+j)*3, 3); // connect to last table
- }
- else{
- t[0] = q; // first table is returned result
- }
- }
-
- // set up table entry in r
- r[1] = (byte)(k - w);
- if (p >= n){
- r[0] = 128 + 64; // out of values--invalid code
- }
- else if (v[p] < s){
- r[0] = (byte)(v[p] < 256 ? 0 : 32 + 64); // 256 is end-of-block
- r[2] = v[p++]; // simple code is just the value
- }
- else{
- r[0]=(byte)(e[v[p]-s]+16+64); // non-simple--look up in lists
- r[2]=d[v[p++] - s];
- }
-
- // fill code-like entries with r
- f=1<<(k-w);
- for (j=i>>w;j>= 1){
- i ^= j;
- }
- i ^= j;
-
- // backup over finished tables
- mask = (1 << w) - 1; // needed on HP, cc -O bug
- while ((i & mask) != x[h]){
- h--; // don't need to update q
- w -= l;
- mask = (1 << w) - 1;
- }
- }
- }
- // Return Z_BUF_ERROR if we were given an incomplete table
- return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;
- }
-
- internal int inflate_trees_bits(int[] c, // 19 code lengths
- int[] bb, // bits tree desired/actual depth
- int[] tb, // bits tree result
- int[] hp, // space for trees
- ZStream z // for messages
- ){
- int result;
- initWorkArea(19);
- hn[0]=0;
- result = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v);
-
- if(result == Z_DATA_ERROR){
- z.msg = "oversubscribed dynamic bit lengths tree";
- }
- else if(result == Z_BUF_ERROR || bb[0] == 0){
- z.msg = "incomplete dynamic bit lengths tree";
- result = Z_DATA_ERROR;
- }
- return result;
- }
-
- internal int inflate_trees_dynamic(int nl, // number of literal/length codes
- int nd, // number of distance codes
- int[] c, // that many (total) code lengths
- int[] bl, // literal desired/actual bit depth
- int[] bd, // distance desired/actual bit depth
- int[] tl, // literal/length tree result
- int[] td, // distance tree result
- int[] hp, // space for trees
- ZStream z // for messages
- ){
- int result;
-
- // build literal/length tree
- initWorkArea(288);
- hn[0]=0;
- result = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v);
- if (result != Z_OK || bl[0] == 0){
- if(result == Z_DATA_ERROR){
- z.msg = "oversubscribed literal/length tree";
- }
- else if (result != Z_MEM_ERROR){
- z.msg = "incomplete literal/length tree";
- result = Z_DATA_ERROR;
- }
- return result;
- }
-
- // build distance tree
- initWorkArea(288);
- result = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v);
-
- if (result != Z_OK || (bd[0] == 0 && nl > 257)){
- if (result == Z_DATA_ERROR){
- z.msg = "oversubscribed distance tree";
- }
- else if (result == Z_BUF_ERROR) {
- z.msg = "incomplete distance tree";
- result = Z_DATA_ERROR;
- }
- else if (result != Z_MEM_ERROR){
- z.msg = "empty distance tree with lengths";
- result = Z_DATA_ERROR;
- }
- return result;
- }
-
- return Z_OK;
- }
-
- internal static int inflate_trees_fixed(int[] bl, //literal desired/actual bit depth
- int[] bd, //distance desired/actual bit depth
- int[][] tl,//literal/length tree result
- int[][] td,//distance tree result
- ZStream z //for memory allocation
- ){
- bl[0]=fixed_bl;
- bd[0]=fixed_bd;
- tl[0]=fixed_tl;
- td[0]=fixed_td;
- return Z_OK;
- }
-
- private void initWorkArea(int vsize){
- if(hn==null){
- hn=new int[1];
- v=new int[vsize];
- c=new int[BMAX+1];
- r=new int[3];
- u=new int[BMAX];
- x=new int[BMAX+1];
- }
- if(v.Lengthstate);
- return Z_OK;
- }
-
- internal int inflateInit(ZStream z, int w){
- z.msg = null;
- blocks = null;
-
- // handle undocumented nowrap option (no zlib header or check)
- nowrap = 0;
- if(w < 0){
- w = - w;
- nowrap = 1;
- }
-
- // set window size
- if(w<8 ||w>15){
- inflateEnd(z);
- return Z_STREAM_ERROR;
- }
- wbits=w;
-
- z.istate.blocks=new InfBlocks(z,
- z.istate.nowrap!=0 ? null : this,
- 1<>4)+8>z.istate.wbits){
- z.istate.mode = BAD;
- z.msg="invalid window size";
- z.istate.marker = 5; // can't try inflateSync
- break;
- }
- z.istate.mode=FLAG;
- goto case FLAG;
- case FLAG:
-
- if(z.avail_in==0)return r;r=f;
-
- z.avail_in--; z.total_in++;
- b = (z.next_in[z.next_in_index++])&0xff;
-
- if((((z.istate.method << 8)+b) % 31)!=0){
- z.istate.mode = BAD;
- z.msg = "incorrect header check";
- z.istate.marker = 5; // can't try inflateSync
- break;
- }
-
- if((b&PRESET_DICT)==0){
- z.istate.mode = BLOCKS;
- break;
- }
- z.istate.mode = DICT4;
- goto case DICT4;
- case DICT4:
-
- if(z.avail_in==0)return r;r=f;
-
- z.avail_in--; z.total_in++;
- z.istate.need=((z.next_in[z.next_in_index++]&0xff)<<24)&0xff000000L;
- z.istate.mode=DICT3;
- goto case DICT3;
- case DICT3:
-
- if(z.avail_in==0)return r;r=f;
-
- z.avail_in--; z.total_in++;
- z.istate.need+=((z.next_in[z.next_in_index++]&0xff)<<16)&0xff0000L;
- z.istate.mode=DICT2;
- goto case DICT2;
- case DICT2:
-
- if(z.avail_in==0)return r;r=f;
-
- z.avail_in--; z.total_in++;
- z.istate.need+=((z.next_in[z.next_in_index++]&0xff)<<8)&0xff00L;
- z.istate.mode=DICT1;
- goto case DICT1;
- case DICT1:
-
- if(z.avail_in==0)return r;r=f;
-
- z.avail_in--; z.total_in++;
- z.istate.need += (z.next_in[z.next_in_index++]&0xffL);
- z.adler = z.istate.need;
- z.istate.mode = DICT0;
- return Z_NEED_DICT;
- case DICT0:
- z.istate.mode = BAD;
- z.msg = "need dictionary";
- z.istate.marker = 0; // can try inflateSync
- return Z_STREAM_ERROR;
- case BLOCKS:
-
- r = z.istate.blocks.proc(z, r);
- if(r == Z_DATA_ERROR){
- z.istate.mode = BAD;
- z.istate.marker = 0; // can try inflateSync
- break;
- }
- if(r == Z_OK){
- r = f;
- }
- if(r != Z_STREAM_END){
- return r;
- }
- r = f;
- z.istate.blocks.reset(z, z.istate.was);
- if(z.istate.nowrap!=0){
- z.istate.mode=DONE;
- break;
- }
- z.istate.mode=CHECK4;
- goto case CHECK4;
- case CHECK4:
-
- if(z.avail_in==0)return r;r=f;
-
- z.avail_in--; z.total_in++;
- z.istate.need=((z.next_in[z.next_in_index++]&0xff)<<24)&0xff000000L;
- z.istate.mode=CHECK3;
- goto case CHECK3;
- case CHECK3:
-
- if(z.avail_in==0)return r;r=f;
-
- z.avail_in--; z.total_in++;
- z.istate.need+=((z.next_in[z.next_in_index++]&0xff)<<16)&0xff0000L;
- z.istate.mode = CHECK2;
- goto case CHECK2;
- case CHECK2:
-
- if(z.avail_in==0)return r;r=f;
-
- z.avail_in--; z.total_in++;
- z.istate.need+=((z.next_in[z.next_in_index++]&0xff)<<8)&0xff00L;
- z.istate.mode = CHECK1;
- goto case CHECK1;
- case CHECK1:
-
- if(z.avail_in==0)return r;r=f;
-
- z.avail_in--; z.total_in++;
- z.istate.need+=(z.next_in[z.next_in_index++]&0xffL);
-
- if(((int)(z.istate.was[0])) != ((int)(z.istate.need))){
- z.istate.mode = BAD;
- z.msg = "incorrect data check";
- z.istate.marker = 5; // can't try inflateSync
- break;
- }
-
- z.istate.mode = DONE;
- goto case DONE;
- case DONE:
- return Z_STREAM_END;
- case BAD:
- return Z_DATA_ERROR;
- default:
- return Z_STREAM_ERROR;
- }
- }
- }
-
-
- internal int inflateSetDictionary(ZStream z, byte[] dictionary, int dictLength){
- int index=0;
- int length = dictLength;
- if(z==null || z.istate == null|| z.istate.mode != DICT0)
- return Z_STREAM_ERROR;
-
- if(z._adler.adler32(1L, dictionary, 0, dictLength)!=z.adler){
- return Z_DATA_ERROR;
- }
-
- z.adler = z._adler.adler32(0, null, 0, 0);
-
- if(length >= (1<>7)]);
- }
-
- internal short[] dyn_tree; // the dynamic tree
- internal int max_code; // largest code with non zero frequency
- internal StaticTree stat_desc; // the corresponding static tree
-
- // Compute the optimal bit lengths for a tree and update the total bit length
- // for the current block.
- // IN assertion: the fields freq and dad are set, heap[heap_max] and
- // above are the tree nodes sorted by increasing frequency.
- // OUT assertions: the field len is set to the optimal bit length, the
- // array bl_count contains the frequencies for each bit length.
- // The length opt_len is updated; static_len is also updated if stree is
- // not null.
- internal void gen_bitlen(Deflate s){
- short[] tree = dyn_tree;
- short[] stree = stat_desc.static_tree;
- int[] extra = stat_desc.extra_bits;
- int based = stat_desc.extra_base;
- int max_length = stat_desc.max_length;
- int h; // heap index
- int n, m; // iterate over the tree elements
- int bits; // bit length
- int xbits; // extra bits
- short f; // frequency
- int overflow = 0; // number of elements with bit length too large
-
- for (bits = 0; bits <= MAX_BITS; bits++) s.bl_count[bits] = 0;
-
- // In a first pass, compute the optimal bit lengths (which may
- // overflow in the case of the bit length tree).
- tree[s.heap[s.heap_max]*2+1] = 0; // root of the heap
-
- for(h=s.heap_max+1; h max_length){ bits = max_length; overflow++; }
- tree[n*2+1] = (short)bits;
- // We overwrite tree[n*2+1] which is no longer needed
-
- if (n > max_code) continue; // not a leaf node
-
- s.bl_count[bits]++;
- xbits = 0;
- if (n >= based) xbits = extra[n-based];
- f = tree[n*2];
- s.opt_len += f * (bits + xbits);
- if (stree!=null) s.static_len += f * (stree[n*2+1] + xbits);
- }
- if (overflow == 0) return;
-
- // This happens for example on obj2 and pic of the Calgary corpus
- // Find the first bit length which could increase:
- do {
- bits = max_length-1;
- while(s.bl_count[bits]==0) bits--;
- s.bl_count[bits]--; // move one leaf down the tree
- s.bl_count[bits+1]+=2; // move one overflow item as its brother
- s.bl_count[max_length]--;
- // The brother of the overflow item also moves one step up,
- // but this does not affect bl_count[max_length]
- overflow -= 2;
- }
- while (overflow > 0);
-
- for (bits = max_length; bits != 0; bits--) {
- n = s.bl_count[bits];
- while (n != 0) {
- m = s.heap[--h];
- if (m > max_code) continue;
- if (tree[m*2+1] != bits) {
- s.opt_len += (int)(((long)bits - (long)tree[m*2+1])*(long)tree[m*2]);
- tree[m*2+1] = (short)bits;
- }
- n--;
- }
- }
- }
-
- // Construct one Huffman tree and assigns the code bit strings and lengths.
- // Update the total bit length for the current block.
- // IN assertion: the field freq is set for all tree elements.
- // OUT assertions: the fields len and code are set to the optimal bit length
- // and corresponding code. The length opt_len is updated; static_len is
- // also updated if stree is not null. The field max_code is set.
- internal void build_tree(Deflate s){
- short[] tree=dyn_tree;
- short[] stree=stat_desc.static_tree;
- int elems=stat_desc.elems;
- int n, m; // iterate over heap elements
- int max_code=-1; // largest code with non zero frequency
- int node; // new node being created
-
- // Construct the initial heap, with least frequent element in
- // heap[1]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
- // heap[0] is not used.
- s.heap_len = 0;
- s.heap_max = HEAP_SIZE;
-
- for(n=0; n=1; n--)
- s.pqdownheap(tree, n);
-
- // Construct the Huffman tree by repeatedly combining the least two
- // frequent nodes.
-
- node=elems; // next internal node of the tree
- do{
- // n = node of least frequency
- n=s.heap[1];
- s.heap[1]=s.heap[s.heap_len--];
- s.pqdownheap(tree, 1);
- m=s.heap[1]; // m = node of next least frequency
-
- s.heap[--s.heap_max] = n; // keep the nodes sorted by frequency
- s.heap[--s.heap_max] = m;
-
- // Create a new node father of n and m
- tree[node*2] = (short)(tree[n*2] + tree[m*2]);
- s.depth[node] = (byte)(System.Math.Max(s.depth[n],s.depth[m])+1);
- tree[n*2+1] = tree[m*2+1] = (short)node;
-
- // and insert the new node in the heap
- s.heap[1] = node++;
- s.pqdownheap(tree, 1);
- }
- while(s.heap_len>=2);
-
- s.heap[--s.heap_max] = s.heap[1];
-
- // At this point, the fields freq and dad are set. We can now
- // generate the bit lengths.
-
- gen_bitlen(s);
-
- // The field len is now set, we can generate the bit codes
- gen_codes(tree, max_code, s.bl_count);
- }
-
- // Generate the codes for a given tree and bit counts (which need not be
- // optimal).
- // IN assertion: the array bl_count contains the bit length statistics for
- // the given tree and the field len is set for all tree elements.
- // OUT assertion: the field code is set for all tree elements of non
- // zero code length.
- internal static void gen_codes(short[] tree, // the tree to decorate
- int max_code, // largest code with non zero frequency
- short[] bl_count // number of codes at each bit length
- ){
- short[] next_code=new short[MAX_BITS+1]; // next code value for each bit length
- short code = 0; // running code value
- int bits; // bit index
- int n; // code index
-
- // The distribution counts are first used to generate the code values
- // without bit reversal.
- for (bits = 1; bits <= MAX_BITS; bits++) {
- next_code[bits] = code = (short)((code + bl_count[bits-1]) << 1);
- }
-
- // Check that the bit counts in bl_count are consistent. The last code
- // must be all ones.
- //Assert (code + bl_count[MAX_BITS]-1 == (1<>=1;
- res<<=1;
- }
- while(--len>0);
- return res>>1;
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/util/zlib/ZDeflaterOutputStream.cs b/BCCrypto/src/util/zlib/ZDeflaterOutputStream.cs
deleted file mode 100644
index d0f0bcb..0000000
--- a/BCCrypto/src/util/zlib/ZDeflaterOutputStream.cs
+++ /dev/null
@@ -1,171 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.Zlib {
- ///
- /// Summary description for DeflaterOutputStream.
- ///
- [Obsolete("Use 'ZOutputStream' instead")]
- public class ZDeflaterOutputStream : Stream {
- protected ZStream z=new ZStream();
- protected int flushLevel=JZlib.Z_NO_FLUSH;
- private const int BUFSIZE = 4192;
- protected byte[] buf=new byte[BUFSIZE];
- private byte[] buf1=new byte[1];
-
- protected Stream outp;
-
- public ZDeflaterOutputStream(Stream outp) : this(outp, 6, false) {
- }
-
- public ZDeflaterOutputStream(Stream outp, int level) : this(outp, level, false) {
- }
-
- public ZDeflaterOutputStream(Stream outp, int level, bool nowrap) {
- this.outp=outp;
- z.deflateInit(level, nowrap);
- }
-
-
- public override bool CanRead {
- get {
- // TODO: Add DeflaterOutputStream.CanRead getter implementation
- return false;
- }
- }
-
- public override bool CanSeek {
- get {
- // TODO: Add DeflaterOutputStream.CanSeek getter implementation
- return false;
- }
- }
-
- public override bool CanWrite {
- get {
- // TODO: Add DeflaterOutputStream.CanWrite getter implementation
- return true;
- }
- }
-
- public override long Length {
- get {
- // TODO: Add DeflaterOutputStream.Length getter implementation
- return 0;
- }
- }
-
- public override long Position {
- get {
- // TODO: Add DeflaterOutputStream.Position getter implementation
- return 0;
- }
- set {
- // TODO: Add DeflaterOutputStream.Position setter implementation
- }
- }
-
- public override void Write(byte[] b, int off, int len) {
- if(len==0)
- return;
- int err;
- z.next_in=b;
- z.next_in_index=off;
- z.avail_in=len;
- do{
- z.next_out=buf;
- z.next_out_index=0;
- z.avail_out=BUFSIZE;
- err=z.deflate(flushLevel);
- if(err!=JZlib.Z_OK)
- throw new IOException("deflating: "+z.msg);
- if (z.avail_out < BUFSIZE)
- {
- outp.Write(buf, 0, BUFSIZE-z.avail_out);
- }
- }
- while(z.avail_in>0 || z.avail_out==0);
- }
-
- public override long Seek(long offset, SeekOrigin origin) {
- // TODO: Add DeflaterOutputStream.Seek implementation
- return 0;
- }
-
- public override void SetLength(long value) {
- // TODO: Add DeflaterOutputStream.SetLength implementation
-
- }
-
- public override int Read(byte[] buffer, int offset, int count) {
- // TODO: Add DeflaterOutputStream.Read implementation
- return 0;
- }
-
- public override void Flush() {
- outp.Flush();
- }
-
- public override void WriteByte(byte b) {
- buf1[0]=(byte)b;
- Write(buf1, 0, 1);
- }
-
- public void Finish() {
- int err;
- do{
- z.next_out=buf;
- z.next_out_index=0;
- z.avail_out=BUFSIZE;
- err=z.deflate(JZlib.Z_FINISH);
- if(err!=JZlib.Z_STREAM_END && err != JZlib.Z_OK)
- throw new IOException("deflating: "+z.msg);
- if(BUFSIZE-z.avail_out>0){
- outp.Write(buf, 0, BUFSIZE-z.avail_out);
- }
- }
- while(z.avail_in>0 || z.avail_out==0);
- Flush();
- }
-
- public void End() {
- if(z==null)
- return;
- z.deflateEnd();
- z.free();
- z=null;
- }
-
-#if PORTABLE
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- try{
- try{Finish();}
- catch (IOException) {}
- }
- finally{
- End();
- Platform.Dispose(outp);
- outp=null;
- }
- }
- base.Dispose(disposing);
- }
-#else
- public override void Close() {
- try{
- try{Finish();}
- catch (IOException) {}
- }
- finally{
- End();
- Platform.Dispose(outp);
- outp=null;
- }
- base.Close();
- }
-#endif
- }
-}
diff --git a/BCCrypto/src/util/zlib/ZInflaterInputStream.cs b/BCCrypto/src/util/zlib/ZInflaterInputStream.cs
deleted file mode 100644
index ef742bb..0000000
--- a/BCCrypto/src/util/zlib/ZInflaterInputStream.cs
+++ /dev/null
@@ -1,140 +0,0 @@
-using System;
-using System.IO;
-
-namespace Org.BouncyCastle.Utilities.Zlib {
- ///
- /// Summary description for DeflaterOutputStream.
- ///
- [Obsolete("Use 'ZInputStream' instead")]
- public class ZInflaterInputStream : Stream {
- protected ZStream z=new ZStream();
- protected int flushLevel=JZlib.Z_NO_FLUSH;
- private const int BUFSIZE = 4192;
- protected byte[] buf=new byte[BUFSIZE];
- private byte[] buf1=new byte[1];
-
- protected Stream inp=null;
- private bool nomoreinput=false;
-
- public ZInflaterInputStream(Stream inp) : this(inp, false) {
- }
-
- public ZInflaterInputStream(Stream inp, bool nowrap) {
- this.inp=inp;
- z.inflateInit(nowrap);
- z.next_in=buf;
- z.next_in_index=0;
- z.avail_in=0;
- }
-
- public override bool CanRead {
- get {
- // TODO: Add DeflaterOutputStream.CanRead getter implementation
- return true;
- }
- }
-
- public override bool CanSeek {
- get {
- // TODO: Add DeflaterOutputStream.CanSeek getter implementation
- return false;
- }
- }
-
- public override bool CanWrite {
- get {
- // TODO: Add DeflaterOutputStream.CanWrite getter implementation
- return false;
- }
- }
-
- public override long Length {
- get {
- // TODO: Add DeflaterOutputStream.Length getter implementation
- return 0;
- }
- }
-
- public override long Position {
- get {
- // TODO: Add DeflaterOutputStream.Position getter implementation
- return 0;
- }
- set {
- // TODO: Add DeflaterOutputStream.Position setter implementation
- }
- }
-
- public override void Write(byte[] b, int off, int len) {
- }
-
- public override long Seek(long offset, SeekOrigin origin) {
- // TODO: Add DeflaterOutputStream.Seek implementation
- return 0;
- }
-
- public override void SetLength(long value) {
- // TODO: Add DeflaterOutputStream.SetLength implementation
-
- }
-
- public override int Read(byte[] b, int off, int len) {
- if(len==0)
- return(0);
- int err;
- z.next_out=b;
- z.next_out_index=off;
- z.avail_out=len;
- do {
- if((z.avail_in==0)&&(!nomoreinput)) { // if buffer is empty and more input is avaiable, refill it
- z.next_in_index=0;
- z.avail_in=inp.Read(buf, 0, BUFSIZE);//(BUFSIZE 0)
- {
- output.Write(buf, 0, count);
- }
- }
- while (z.avail_in > 0 || z.avail_out == 0);
-
- Flush();
- }
-
- public override void Flush()
- {
- output.Flush();
- }
-
- public virtual int FlushMode
- {
- get { return flushLevel; }
- set { this.flushLevel = value; }
- }
-
- public sealed override long Length { get { throw new NotSupportedException(); } }
- public sealed override long Position
- {
- get { throw new NotSupportedException(); }
- set { throw new NotSupportedException(); }
- }
- public sealed override int Read(byte[] buffer, int offset, int count) { throw new NotSupportedException(); }
- public sealed override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); }
- public sealed override void SetLength(long value) { throw new NotSupportedException(); }
-
- public virtual long TotalIn
- {
- get { return z.total_in; }
- }
-
- public virtual long TotalOut
- {
- get { return z.total_out; }
- }
-
- public override void Write(byte[] b, int off, int len)
- {
- if (len == 0)
- return;
-
- z.next_in = b;
- z.next_in_index = off;
- z.avail_in = len;
-
- do
- {
- z.next_out = buf;
- z.next_out_index = 0;
- z.avail_out = buf.Length;
-
- int err = compress
- ? z.deflate(flushLevel)
- : z.inflate(flushLevel);
-
- if (err != JZlib.Z_OK)
- // TODO
-// throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg);
- throw new IOException((compress ? "de" : "in") + "flating: " + z.msg);
-
- output.Write(buf, 0, buf.Length - z.avail_out);
- }
- while (z.avail_in > 0 || z.avail_out == 0);
- }
-
- public override void WriteByte(byte b)
- {
- buf1[0] = b;
- Write(buf1, 0, 1);
- }
- }
-}
diff --git a/BCCrypto/src/util/zlib/ZStream.cs b/BCCrypto/src/util/zlib/ZStream.cs
deleted file mode 100644
index 7ff9614..0000000
--- a/BCCrypto/src/util/zlib/ZStream.cs
+++ /dev/null
@@ -1,214 +0,0 @@
-using System;
-/*
- * $Id: ZStream.cs,v 1.1 2006-07-31 13:59:26 bouncy Exp $
- *
-Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the distribution.
-
- 3. The names of the authors may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
-INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/*
- * This program is based on zlib-1.1.3, so all credit should go authors
- * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
- * and contributors of zlib.
- */
-
-namespace Org.BouncyCastle.Utilities.Zlib {
-
- public sealed class ZStream{
-
- private const int MAX_WBITS=15; // 32K LZ77 window
- private const int DEF_WBITS=MAX_WBITS;
-
- private const int Z_NO_FLUSH=0;
- private const int Z_PARTIAL_FLUSH=1;
- private const int Z_SYNC_FLUSH=2;
- private const int Z_FULL_FLUSH=3;
- private const int Z_FINISH=4;
-
- private const int MAX_MEM_LEVEL=9;
-
- private const int Z_OK=0;
- private const int Z_STREAM_END=1;
- private const int Z_NEED_DICT=2;
- private const int Z_ERRNO=-1;
- private const int Z_STREAM_ERROR=-2;
- private const int Z_DATA_ERROR=-3;
- private const int Z_MEM_ERROR=-4;
- private const int Z_BUF_ERROR=-5;
- private const int Z_VERSION_ERROR=-6;
-
- public byte[] next_in; // next input byte
- public int next_in_index;
- public int avail_in; // number of bytes available at next_in
- public long total_in; // total nb of input bytes read so far
-
- public byte[] next_out; // next output byte should be put there
- public int next_out_index;
- public int avail_out; // remaining free space at next_out
- public long total_out; // total nb of bytes output so far
-
- public String msg;
-
- internal Deflate dstate;
- internal Inflate istate;
-
- internal int data_type; // best guess about the data type: ascii or binary
-
- public long adler;
- internal Adler32 _adler=new Adler32();
-
- public int inflateInit(){
- return inflateInit(DEF_WBITS);
- }
- public int inflateInit(bool nowrap){
- return inflateInit(DEF_WBITS, nowrap);
- }
- public int inflateInit(int w){
- return inflateInit(w, false);
- }
-
- public int inflateInit(int w, bool nowrap){
- istate=new Inflate();
- return istate.inflateInit(this, nowrap?-w:w);
- }
-
- public int inflate(int f){
- if(istate==null) return Z_STREAM_ERROR;
- return istate.inflate(this, f);
- }
- public int inflateEnd(){
- if(istate==null) return Z_STREAM_ERROR;
- int ret=istate.inflateEnd(this);
- istate = null;
- return ret;
- }
- public int inflateSync(){
- if(istate == null)
- return Z_STREAM_ERROR;
- return istate.inflateSync(this);
- }
- public int inflateSetDictionary(byte[] dictionary, int dictLength){
- if(istate == null)
- return Z_STREAM_ERROR;
- return istate.inflateSetDictionary(this, dictionary, dictLength);
- }
-
- public int deflateInit(int level){
- return deflateInit(level, MAX_WBITS);
- }
- public int deflateInit(int level, bool nowrap){
- return deflateInit(level, MAX_WBITS, nowrap);
- }
- public int deflateInit(int level, int bits){
- return deflateInit(level, bits, false);
- }
- public int deflateInit(int level, int bits, bool nowrap){
- dstate=new Deflate();
- return dstate.deflateInit(this, level, nowrap?-bits:bits);
- }
- public int deflate(int flush){
- if(dstate==null){
- return Z_STREAM_ERROR;
- }
- return dstate.deflate(this, flush);
- }
- public int deflateEnd(){
- if(dstate==null) return Z_STREAM_ERROR;
- int ret=dstate.deflateEnd();
- dstate=null;
- return ret;
- }
- public int deflateParams(int level, int strategy){
- if(dstate==null) return Z_STREAM_ERROR;
- return dstate.deflateParams(this, level, strategy);
- }
- public int deflateSetDictionary (byte[] dictionary, int dictLength){
- if(dstate == null)
- return Z_STREAM_ERROR;
- return dstate.deflateSetDictionary(this, dictionary, dictLength);
- }
-
- // Flush as much pending output as possible. All deflate() output goes
- // through this function so some applications may wish to modify it
- // to avoid allocating a large strm->next_out buffer and copying into it.
- // (See also read_buf()).
- internal void flush_pending(){
- int len=dstate.pending;
-
- if(len>avail_out) len=avail_out;
- if(len==0) return;
-
- if(dstate.pending_buf.Length<=dstate.pending_out ||
- next_out.Length<=next_out_index ||
- dstate.pending_buf.Length<(dstate.pending_out+len) ||
- next_out.Length<(next_out_index+len)){
- // System.out.println(dstate.pending_buf.length+", "+dstate.pending_out+
- // ", "+next_out.length+", "+next_out_index+", "+len);
- // System.out.println("avail_out="+avail_out);
- }
-
- System.Array.Copy(dstate.pending_buf, dstate.pending_out,
- next_out, next_out_index, len);
-
- next_out_index+=len;
- dstate.pending_out+=len;
- total_out+=len;
- avail_out-=len;
- dstate.pending-=len;
- if(dstate.pending==0){
- dstate.pending_out=0;
- }
- }
-
- // Read a new buffer from the current input stream, update the adler32
- // and total number of bytes read. All deflate() input goes through
- // this function so some applications may wish to modify it to avoid
- // allocating a large strm->next_in buffer and copying from it.
- // (See also flush_pending()).
- internal int read_buf(byte[] buf, int start, int size) {
- int len=avail_in;
-
- if(len>size) len=size;
- if(len==0) return 0;
-
- avail_in-=len;
-
- if(dstate.noheader==0) {
- adler=_adler.adler32(adler, next_in, next_in_index, len);
- }
- System.Array.Copy(next_in, next_in_index, buf, start, len);
- next_in_index += len;
- total_in += len;
- return len;
- }
-
- public void free(){
- next_in=null;
- next_out=null;
- msg=null;
- _adler=null;
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/x509/AttributeCertificateHolder.cs b/BCCrypto/src/x509/AttributeCertificateHolder.cs
deleted file mode 100644
index 04460cd..0000000
--- a/BCCrypto/src/x509/AttributeCertificateHolder.cs
+++ /dev/null
@@ -1,442 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.X509
-{
- ///
- /// The Holder object.
- ///
- /// Holder ::= SEQUENCE {
- /// baseCertificateID [0] IssuerSerial OPTIONAL,
- /// -- the issuer and serial number of
- /// -- the holder's Public Key Certificate
- /// entityName [1] GeneralNames OPTIONAL,
- /// -- the name of the claimant or role
- /// objectDigestInfo [2] ObjectDigestInfo OPTIONAL
- /// -- used to directly authenticate the holder,
- /// -- for example, an executable
- /// }
- ///
- ///
- public class AttributeCertificateHolder
- //: CertSelector, Selector
- : IX509Selector
- {
- internal readonly Holder holder;
-
- internal AttributeCertificateHolder(
- Asn1Sequence seq)
- {
- holder = Holder.GetInstance(seq);
- }
-
- public AttributeCertificateHolder(
- X509Name issuerName,
- BigInteger serialNumber)
- {
- holder = new Holder(
- new IssuerSerial(
- GenerateGeneralNames(issuerName),
- new DerInteger(serialNumber)));
- }
-
- public AttributeCertificateHolder(
- X509Certificate cert)
- {
- X509Name name;
- try
- {
- name = PrincipalUtilities.GetIssuerX509Principal(cert);
- }
- catch (Exception e)
- {
- throw new CertificateParsingException(e.Message);
- }
-
- holder = new Holder(new IssuerSerial(GenerateGeneralNames(name), new DerInteger(cert.SerialNumber)));
- }
-
- public AttributeCertificateHolder(
- X509Name principal)
- {
- holder = new Holder(GenerateGeneralNames(principal));
- }
-
- /**
- * Constructs a holder for v2 attribute certificates with a hash value for
- * some type of object.
- *
- * digestedObjectType can be one of the following:
- *
- * 0 - publicKey - A hash of the public key of the holder must be
- * passed.
- * 1 - publicKeyCert - A hash of the public key certificate of the
- * holder must be passed.
- * 2 - otherObjectDigest - A hash of some other object type must be
- * passed. otherObjectTypeID must not be empty.
- *
- *
- * This cannot be used if a v1 attribute certificate is used.
- *
- * @param digestedObjectType The digest object type.
- * @param digestAlgorithm The algorithm identifier for the hash.
- * @param otherObjectTypeID The object type ID if
- * digestedObjectType is
- * otherObjectDigest.
- * @param objectDigest The hash value.
- */
- public AttributeCertificateHolder(
- int digestedObjectType,
- string digestAlgorithm,
- string otherObjectTypeID,
- byte[] objectDigest)
- {
- // TODO Allow 'objectDigest' to be null?
-
- holder = new Holder(new ObjectDigestInfo(digestedObjectType, otherObjectTypeID,
- new AlgorithmIdentifier(new DerObjectIdentifier(digestAlgorithm)), Arrays.Clone(objectDigest)));
- }
-
- /**
- * Returns the digest object type if an object digest info is used.
- *
- *
- * 0 - publicKey - A hash of the public key of the holder must be
- * passed.
- * 1 - publicKeyCert - A hash of the public key certificate of the
- * holder must be passed.
- * 2 - otherObjectDigest - A hash of some other object type must be
- * passed. otherObjectTypeID must not be empty.
- *
- *
- *
- * @return The digest object type or -1 if no object digest info is set.
- */
- public int DigestedObjectType
- {
- get
- {
- ObjectDigestInfo odi = holder.ObjectDigestInfo;
-
- return odi == null
- ? -1
- : odi.DigestedObjectType.Value.IntValue;
- }
- }
-
- /**
- * Returns the other object type ID if an object digest info is used.
- *
- * @return The other object type ID or null if no object
- * digest info is set.
- */
- public string DigestAlgorithm
- {
- get
- {
- ObjectDigestInfo odi = holder.ObjectDigestInfo;
-
- return odi == null
- ? null
- : odi.DigestAlgorithm.Algorithm.Id;
- }
- }
-
- /**
- * Returns the hash if an object digest info is used.
- *
- * @return The hash or null if no object digest info is set.
- */
- public byte[] GetObjectDigest()
- {
- ObjectDigestInfo odi = holder.ObjectDigestInfo;
-
- return odi == null
- ? null
- : odi.ObjectDigest.GetBytes();
- }
-
- /**
- * Returns the digest algorithm ID if an object digest info is used.
- *
- * @return The digest algorithm ID or null if no object
- * digest info is set.
- */
- public string OtherObjectTypeID
- {
- get
- {
- ObjectDigestInfo odi = holder.ObjectDigestInfo;
-
- return odi == null
- ? null
- : odi.OtherObjectTypeID.Id;
- }
- }
-
- private GeneralNames GenerateGeneralNames(
- X509Name principal)
- {
-// return GeneralNames.GetInstance(new DerSequence(new GeneralName(principal)));
- return new GeneralNames(new GeneralName(principal));
- }
-
- private bool MatchesDN(
- X509Name subject,
- GeneralNames targets)
- {
- GeneralName[] names = targets.GetNames();
-
- for (int i = 0; i != names.Length; i++)
- {
- GeneralName gn = names[i];
-
- if (gn.TagNo == GeneralName.DirectoryName)
- {
- try
- {
- if (X509Name.GetInstance(gn.Name).Equivalent(subject))
- {
- return true;
- }
- }
- catch (Exception)
- {
- }
- }
- }
-
- return false;
- }
-
- private object[] GetNames(
- GeneralName[] names)
- {
- int count = 0;
- for (int i = 0; i != names.Length; i++)
- {
- if (names[i].TagNo == GeneralName.DirectoryName)
- {
- ++count;
- }
- }
-
- object[] result = new object[count];
-
- int pos = 0;
- for (int i = 0; i != names.Length; i++)
- {
- if (names[i].TagNo == GeneralName.DirectoryName)
- {
- result[pos++] = X509Name.GetInstance(names[i].Name);
- }
- }
-
- return result;
- }
-
- private X509Name[] GetPrincipals(
- GeneralNames names)
- {
- object[] p = this.GetNames(names.GetNames());
-
- int count = 0;
-
- for (int i = 0; i != p.Length; i++)
- {
- if (p[i] is X509Name)
- {
- ++count;
- }
- }
-
- X509Name[] result = new X509Name[count];
-
- int pos = 0;
- for (int i = 0; i != p.Length; i++)
- {
- if (p[i] is X509Name)
- {
- result[pos++] = (X509Name)p[i];
- }
- }
-
- return result;
- }
-
- /**
- * Return any principal objects inside the attribute certificate holder entity names field.
- *
- * @return an array of IPrincipal objects (usually X509Name), null if no entity names field is set.
- */
- public X509Name[] GetEntityNames()
- {
- if (holder.EntityName != null)
- {
- return GetPrincipals(holder.EntityName);
- }
-
- return null;
- }
-
- /**
- * Return the principals associated with the issuer attached to this holder
- *
- * @return an array of principals, null if no BaseCertificateID is set.
- */
- public X509Name[] GetIssuer()
- {
- if (holder.BaseCertificateID != null)
- {
- return GetPrincipals(holder.BaseCertificateID.Issuer);
- }
-
- return null;
- }
-
- /**
- * Return the serial number associated with the issuer attached to this holder.
- *
- * @return the certificate serial number, null if no BaseCertificateID is set.
- */
- public BigInteger SerialNumber
- {
- get
- {
- if (holder.BaseCertificateID != null)
- {
- return holder.BaseCertificateID.Serial.Value;
- }
-
- return null;
- }
- }
-
- public object Clone()
- {
- return new AttributeCertificateHolder((Asn1Sequence)holder.ToAsn1Object());
- }
-
- public bool Match(
-// Certificate cert)
- X509Certificate x509Cert)
- {
-// if (!(cert is X509Certificate))
-// {
-// return false;
-// }
-//
-// X509Certificate x509Cert = (X509Certificate)cert;
-
- try
- {
- if (holder.BaseCertificateID != null)
- {
- return holder.BaseCertificateID.Serial.Value.Equals(x509Cert.SerialNumber)
- && MatchesDN(PrincipalUtilities.GetIssuerX509Principal(x509Cert), holder.BaseCertificateID.Issuer);
- }
-
- if (holder.EntityName != null)
- {
- if (MatchesDN(PrincipalUtilities.GetSubjectX509Principal(x509Cert), holder.EntityName))
- {
- return true;
- }
- }
-
- if (holder.ObjectDigestInfo != null)
- {
- IDigest md = null;
- try
- {
- md = DigestUtilities.GetDigest(DigestAlgorithm);
- }
- catch (Exception)
- {
- return false;
- }
-
- switch (DigestedObjectType)
- {
- case ObjectDigestInfo.PublicKey:
- {
- // TODO: DSA Dss-parms
-
- //byte[] b = x509Cert.GetPublicKey().getEncoded();
- // TODO Is this the right way to encode?
- byte[] b = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(
- x509Cert.GetPublicKey()).GetEncoded();
- md.BlockUpdate(b, 0, b.Length);
- break;
- }
-
- case ObjectDigestInfo.PublicKeyCert:
- {
- byte[] b = x509Cert.GetEncoded();
- md.BlockUpdate(b, 0, b.Length);
- break;
- }
-
- // TODO Default handler?
- }
-
- // TODO Shouldn't this be the other way around?
- if (!Arrays.AreEqual(DigestUtilities.DoFinal(md), GetObjectDigest()))
- {
- return false;
- }
- }
- }
- catch (CertificateEncodingException)
- {
- return false;
- }
-
- return false;
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- {
- return true;
- }
-
- if (!(obj is AttributeCertificateHolder))
- {
- return false;
- }
-
- AttributeCertificateHolder other = (AttributeCertificateHolder)obj;
-
- return this.holder.Equals(other.holder);
- }
-
- public override int GetHashCode()
- {
- return this.holder.GetHashCode();
- }
-
- public bool Match(
- object obj)
- {
- if (!(obj is X509Certificate))
- {
- return false;
- }
-
-// return Match((Certificate)obj);
- return Match((X509Certificate)obj);
- }
- }
-}
diff --git a/BCCrypto/src/x509/AttributeCertificateIssuer.cs b/BCCrypto/src/x509/AttributeCertificateIssuer.cs
deleted file mode 100644
index 7df1416..0000000
--- a/BCCrypto/src/x509/AttributeCertificateIssuer.cs
+++ /dev/null
@@ -1,199 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509.Store;
-
-namespace Org.BouncyCastle.X509
-{
- /**
- * Carrying class for an attribute certificate issuer.
- */
- public class AttributeCertificateIssuer
- //: CertSelector, Selector
- : IX509Selector
- {
- internal readonly Asn1Encodable form;
-
- /**
- * Set the issuer directly with the ASN.1 structure.
- *
- * @param issuer The issuer
- */
- public AttributeCertificateIssuer(
- AttCertIssuer issuer)
- {
- form = issuer.Issuer;
- }
-
- public AttributeCertificateIssuer(
- X509Name principal)
- {
-// form = new V2Form(GeneralNames.GetInstance(new DerSequence(new GeneralName(principal))));
- form = new V2Form(new GeneralNames(new GeneralName(principal)));
- }
-
- private object[] GetNames()
- {
- GeneralNames name;
- if (form is V2Form)
- {
- name = ((V2Form)form).IssuerName;
- }
- else
- {
- name = (GeneralNames)form;
- }
-
- GeneralName[] names = name.GetNames();
-
- int count = 0;
- for (int i = 0; i != names.Length; i++)
- {
- if (names[i].TagNo == GeneralName.DirectoryName)
- {
- ++count;
- }
- }
-
- object[] result = new object[count];
-
- int pos = 0;
- for (int i = 0; i != names.Length; i++)
- {
- if (names[i].TagNo == GeneralName.DirectoryName)
- {
- result[pos++] = X509Name.GetInstance(names[i].Name);
- }
- }
-
- return result;
- }
-
- /// Return any principal objects inside the attribute certificate issuer object.
- /// An array of IPrincipal objects (usually X509Principal).
- public X509Name[] GetPrincipals()
- {
- object[] p = this.GetNames();
-
- int count = 0;
- for (int i = 0; i != p.Length; i++)
- {
- if (p[i] is X509Name)
- {
- ++count;
- }
- }
-
- X509Name[] result = new X509Name[count];
-
- int pos = 0;
- for (int i = 0; i != p.Length; i++)
- {
- if (p[i] is X509Name)
- {
- result[pos++] = (X509Name)p[i];
- }
- }
-
- return result;
- }
-
- private bool MatchesDN(
- X509Name subject,
- GeneralNames targets)
- {
- GeneralName[] names = targets.GetNames();
-
- for (int i = 0; i != names.Length; i++)
- {
- GeneralName gn = names[i];
-
- if (gn.TagNo == GeneralName.DirectoryName)
- {
- try
- {
- if (X509Name.GetInstance(gn.Name).Equivalent(subject))
- {
- return true;
- }
- }
- catch (Exception)
- {
- }
- }
- }
-
- return false;
- }
-
- public object Clone()
- {
- return new AttributeCertificateIssuer(AttCertIssuer.GetInstance(form));
- }
-
- public bool Match(
-// Certificate cert)
- X509Certificate x509Cert)
- {
-// if (!(cert is X509Certificate))
-// {
-// return false;
-// }
-//
-// X509Certificate x509Cert = (X509Certificate)cert;
-
- if (form is V2Form)
- {
- V2Form issuer = (V2Form) form;
- if (issuer.BaseCertificateID != null)
- {
- return issuer.BaseCertificateID.Serial.Value.Equals(x509Cert.SerialNumber)
- && MatchesDN(x509Cert.IssuerDN, issuer.BaseCertificateID.Issuer);
- }
-
- return MatchesDN(x509Cert.SubjectDN, issuer.IssuerName);
- }
-
- return MatchesDN(x509Cert.SubjectDN, (GeneralNames) form);
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- {
- return true;
- }
-
- if (!(obj is AttributeCertificateIssuer))
- {
- return false;
- }
-
- AttributeCertificateIssuer other = (AttributeCertificateIssuer)obj;
-
- return this.form.Equals(other.form);
- }
-
- public override int GetHashCode()
- {
- return this.form.GetHashCode();
- }
-
- public bool Match(
- object obj)
- {
- if (!(obj is X509Certificate))
- {
- return false;
- }
-
- //return Match((Certificate)obj);
- return Match((X509Certificate)obj);
- }
- }
-}
diff --git a/BCCrypto/src/x509/IX509AttributeCertificate.cs b/BCCrypto/src/x509/IX509AttributeCertificate.cs
deleted file mode 100644
index 9a3004e..0000000
--- a/BCCrypto/src/x509/IX509AttributeCertificate.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-
-namespace Org.BouncyCastle.X509
-{
- /// Interface for an X.509 Attribute Certificate.
- public interface IX509AttributeCertificate
- : IX509Extension
- {
- /// The version number for the certificate.
- int Version { get; }
-
- /// The serial number for the certificate.
- BigInteger SerialNumber { get; }
-
- /// The UTC DateTime before which the certificate is not valid.
- DateTime NotBefore { get; }
-
- /// The UTC DateTime after which the certificate is not valid.
- DateTime NotAfter { get; }
-
- /// The holder of the certificate.
- AttributeCertificateHolder Holder { get; }
-
- /// The issuer details for the certificate.
- AttributeCertificateIssuer Issuer { get; }
-
- /// Return the attributes contained in the attribute block in the certificate.
- /// An array of attributes.
- X509Attribute[] GetAttributes();
-
- /// Return the attributes with the same type as the passed in oid.
- /// The object identifier we wish to match.
- /// An array of matched attributes, null if there is no match.
- X509Attribute[] GetAttributes(string oid);
-
- bool[] GetIssuerUniqueID();
-
- bool IsValidNow { get; }
- bool IsValid(DateTime date);
-
- void CheckValidity();
- void CheckValidity(DateTime date);
-
- byte[] GetSignature();
-
- void Verify(AsymmetricKeyParameter publicKey);
-
- /// Return an ASN.1 encoded byte array representing the attribute certificate.
- /// An ASN.1 encoded byte array.
- /// If the certificate cannot be encoded.
- byte[] GetEncoded();
- }
-}
diff --git a/BCCrypto/src/x509/IX509Extension.cs b/BCCrypto/src/x509/IX509Extension.cs
deleted file mode 100644
index e861e87..0000000
--- a/BCCrypto/src/x509/IX509Extension.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.X509
-{
- public interface IX509Extension
- {
- ///
- /// Get all critical extension values, by oid
- ///
- /// IDictionary with string (OID) keys and Asn1OctetString values
- ISet GetCriticalExtensionOids();
-
- ///
- /// Get all non-critical extension values, by oid
- ///
- /// IDictionary with string (OID) keys and Asn1OctetString values
- ISet GetNonCriticalExtensionOids();
-
- [Obsolete("Use version taking a DerObjectIdentifier instead")]
- Asn1OctetString GetExtensionValue(string oid);
-
- Asn1OctetString GetExtensionValue(DerObjectIdentifier oid);
- }
-}
diff --git a/BCCrypto/src/x509/PEMParser.cs b/BCCrypto/src/x509/PEMParser.cs
deleted file mode 100644
index 28f28ee..0000000
--- a/BCCrypto/src/x509/PEMParser.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using System;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-
-namespace Org.BouncyCastle.X509
-{
- class PemParser
- {
- private readonly string _header1;
- private readonly string _header2;
- private readonly string _footer1;
- private readonly string _footer2;
-
- internal PemParser(
- string type)
- {
- _header1 = "-----BEGIN " + type + "-----";
- _header2 = "-----BEGIN X509 " + type + "-----";
- _footer1 = "-----END " + type + "-----";
- _footer2 = "-----END X509 " + type + "-----";
- }
-
- private string ReadLine(
- Stream inStream)
- {
- int c;
- StringBuilder l = new StringBuilder();
-
- do
- {
- while (((c = inStream.ReadByte()) != '\r') && c != '\n' && (c >= 0))
- {
- if (c == '\r')
- {
- continue;
- }
-
- l.Append((char)c);
- }
- }
- while (c >= 0 && l.Length == 0);
-
- if (c < 0)
- {
- return null;
- }
-
- return l.ToString();
- }
-
- internal Asn1Sequence ReadPemObject(
- Stream inStream)
- {
- string line;
- StringBuilder pemBuf = new StringBuilder();
-
- while ((line = ReadLine(inStream)) != null)
- {
- if (Platform.StartsWith(line, _header1) || Platform.StartsWith(line, _header2))
- {
- break;
- }
- }
-
- while ((line = ReadLine(inStream)) != null)
- {
- if (Platform.StartsWith(line, _footer1) || Platform.StartsWith(line, _footer2))
- {
- break;
- }
-
- pemBuf.Append(line);
- }
-
- if (pemBuf.Length != 0)
- {
- Asn1Object o = Asn1Object.FromByteArray(Base64.Decode(pemBuf.ToString()));
-
- if (!(o is Asn1Sequence))
- {
- throw new IOException("malformed PEM data encountered");
- }
-
- return (Asn1Sequence) o;
- }
-
- return null;
- }
- }
-}
-
diff --git a/BCCrypto/src/x509/PrincipalUtil.cs b/BCCrypto/src/x509/PrincipalUtil.cs
deleted file mode 100644
index 0edc4a3..0000000
--- a/BCCrypto/src/x509/PrincipalUtil.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using System;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Security.Certificates;
-
-namespace Org.BouncyCastle.X509
-{
- ///
- /// A utility class that will extract X509Principal objects from X.509 certificates.
- ///
- /// Use this in preference to trying to recreate a principal from a string, not all
- /// DNs are what they should be, so it's best to leave them encoded where they
- /// can be.
- ///
- public class PrincipalUtilities
- {
- /// Return the issuer of the given cert as an X509Principal.
- public static X509Name GetIssuerX509Principal(
- X509Certificate cert)
- {
- try
- {
- TbsCertificateStructure tbsCert = TbsCertificateStructure.GetInstance(
- Asn1Object.FromByteArray(cert.GetTbsCertificate()));
-
- return tbsCert.Issuer;
- }
- catch (Exception e)
- {
- throw new CertificateEncodingException("Could not extract issuer", e);
- }
- }
-
- /// Return the subject of the given cert as an X509Principal.
- public static X509Name GetSubjectX509Principal(
- X509Certificate cert)
- {
- try
- {
- TbsCertificateStructure tbsCert = TbsCertificateStructure.GetInstance(
- Asn1Object.FromByteArray(cert.GetTbsCertificate()));
-
- return tbsCert.Subject;
- }
- catch (Exception e)
- {
- throw new CertificateEncodingException("Could not extract subject", e);
- }
- }
-
- /// Return the issuer of the given CRL as an X509Principal.
- public static X509Name GetIssuerX509Principal(
- X509Crl crl)
- {
- try
- {
- TbsCertificateList tbsCertList = TbsCertificateList.GetInstance(
- Asn1Object.FromByteArray(crl.GetTbsCertList()));
-
- return tbsCertList.Issuer;
- }
- catch (Exception e)
- {
- throw new CrlException("Could not extract issuer", e);
- }
- }
- }
-}
diff --git a/BCCrypto/src/x509/SubjectPublicKeyInfoFactory.cs b/BCCrypto/src/x509/SubjectPublicKeyInfoFactory.cs
deleted file mode 100644
index 7614321..0000000
--- a/BCCrypto/src/x509/SubjectPublicKeyInfoFactory.cs
+++ /dev/null
@@ -1,184 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.X509
-{
- ///
- /// A factory to produce Public Key Info Objects.
- ///
- public sealed class SubjectPublicKeyInfoFactory
- {
- private SubjectPublicKeyInfoFactory()
- {
- }
-
- ///
- /// Create a Subject Public Key Info object for a given public key.
- ///
- /// One of ElGammalPublicKeyParameters, DSAPublicKeyParameter, DHPublicKeyParameters, RsaKeyParameters or ECPublicKeyParameters
- /// A subject public key info object.
- /// Throw exception if object provided is not one of the above.
- public static SubjectPublicKeyInfo CreateSubjectPublicKeyInfo(
- AsymmetricKeyParameter key)
- {
- if (key == null)
- throw new ArgumentNullException("key");
- if (key.IsPrivate)
- throw new ArgumentException("Private key passed - public key expected.", "key");
-
- if (key is ElGamalPublicKeyParameters)
- {
- ElGamalPublicKeyParameters _key = (ElGamalPublicKeyParameters)key;
- ElGamalParameters kp = _key.Parameters;
-
- SubjectPublicKeyInfo info = new SubjectPublicKeyInfo(
- new AlgorithmIdentifier(
- OiwObjectIdentifiers.ElGamalAlgorithm,
- new ElGamalParameter(kp.P, kp.G).ToAsn1Object()),
- new DerInteger(_key.Y));
-
- return info;
- }
-
- if (key is DsaPublicKeyParameters)
- {
- DsaPublicKeyParameters _key = (DsaPublicKeyParameters) key;
- DsaParameters kp = _key.Parameters;
- Asn1Encodable ae = kp == null
- ? null
- : new DsaParameter(kp.P, kp.Q, kp.G).ToAsn1Object();
-
- return new SubjectPublicKeyInfo(
- new AlgorithmIdentifier(X9ObjectIdentifiers.IdDsa, ae),
- new DerInteger(_key.Y));
- }
-
- if (key is DHPublicKeyParameters)
- {
- DHPublicKeyParameters _key = (DHPublicKeyParameters) key;
- DHParameters kp = _key.Parameters;
-
- SubjectPublicKeyInfo info = new SubjectPublicKeyInfo(
- new AlgorithmIdentifier(
- _key.AlgorithmOid,
- new DHParameter(kp.P, kp.G, kp.L).ToAsn1Object()),
- new DerInteger(_key.Y));
-
- return info;
- } // End of DH
-
- if (key is RsaKeyParameters)
- {
- RsaKeyParameters _key = (RsaKeyParameters) key;
-
- SubjectPublicKeyInfo info = new SubjectPublicKeyInfo(
- new AlgorithmIdentifier(PkcsObjectIdentifiers.RsaEncryption, DerNull.Instance),
- new RsaPublicKeyStructure(_key.Modulus, _key.Exponent).ToAsn1Object());
-
- return info;
- } // End of RSA.
-
- if (key is ECPublicKeyParameters)
- {
- ECPublicKeyParameters _key = (ECPublicKeyParameters) key;
-
- if (_key.AlgorithmName == "ECGOST3410")
- {
- if (_key.PublicKeyParamSet == null)
- throw Platform.CreateNotImplementedException("Not a CryptoPro parameter set");
-
- ECPoint q = _key.Q.Normalize();
- BigInteger bX = q.AffineXCoord.ToBigInteger();
- BigInteger bY = q.AffineYCoord.ToBigInteger();
-
- byte[] encKey = new byte[64];
- ExtractBytes(encKey, 0, bX);
- ExtractBytes(encKey, 32, bY);
-
- Gost3410PublicKeyAlgParameters gostParams = new Gost3410PublicKeyAlgParameters(
- _key.PublicKeyParamSet, CryptoProObjectIdentifiers.GostR3411x94CryptoProParamSet);
-
- AlgorithmIdentifier algID = new AlgorithmIdentifier(
- CryptoProObjectIdentifiers.GostR3410x2001,
- gostParams.ToAsn1Object());
-
- return new SubjectPublicKeyInfo(algID, new DerOctetString(encKey));
- }
- else
- {
- X962Parameters x962;
- if (_key.PublicKeyParamSet == null)
- {
- ECDomainParameters kp = _key.Parameters;
- X9ECParameters ecP = new X9ECParameters(kp.Curve, kp.G, kp.N, kp.H, kp.GetSeed());
-
- x962 = new X962Parameters(ecP);
- }
- else
- {
- x962 = new X962Parameters(_key.PublicKeyParamSet);
- }
-
- Asn1OctetString p = (Asn1OctetString)(new X9ECPoint(_key.Q).ToAsn1Object());
-
- AlgorithmIdentifier algID = new AlgorithmIdentifier(
- X9ObjectIdentifiers.IdECPublicKey, x962.ToAsn1Object());
-
- return new SubjectPublicKeyInfo(algID, p.GetOctets());
- }
- } // End of EC
-
- if (key is Gost3410PublicKeyParameters)
- {
- Gost3410PublicKeyParameters _key = (Gost3410PublicKeyParameters) key;
-
- if (_key.PublicKeyParamSet == null)
- throw Platform.CreateNotImplementedException("Not a CryptoPro parameter set");
-
- byte[] keyEnc = _key.Y.ToByteArrayUnsigned();
- byte[] keyBytes = new byte[keyEnc.Length];
-
- for (int i = 0; i != keyBytes.Length; i++)
- {
- keyBytes[i] = keyEnc[keyEnc.Length - 1 - i]; // must be little endian
- }
-
- Gost3410PublicKeyAlgParameters algParams = new Gost3410PublicKeyAlgParameters(
- _key.PublicKeyParamSet, CryptoProObjectIdentifiers.GostR3411x94CryptoProParamSet);
-
- AlgorithmIdentifier algID = new AlgorithmIdentifier(
- CryptoProObjectIdentifiers.GostR3410x94,
- algParams.ToAsn1Object());
-
- return new SubjectPublicKeyInfo(algID, new DerOctetString(keyBytes));
- }
-
- throw new ArgumentException("Class provided no convertible: " + Platform.GetTypeName(key));
- }
-
- private static void ExtractBytes(
- byte[] encKey,
- int offset,
- BigInteger bI)
- {
- byte[] val = bI.ToByteArray();
- int n = (bI.BitLength + 7) / 8;
-
- for (int i = 0; i < n; ++i)
- {
- encKey[offset + i] = val[val.Length - 1 - i];
- }
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509AttrCertParser.cs b/BCCrypto/src/x509/X509AttrCertParser.cs
deleted file mode 100644
index a5c0736..0000000
--- a/BCCrypto/src/x509/X509AttrCertParser.cs
+++ /dev/null
@@ -1,173 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.X509
-{
- public class X509AttrCertParser
- {
- private static readonly PemParser PemAttrCertParser = new PemParser("ATTRIBUTE CERTIFICATE");
-
- private Asn1Set sData;
- private int sDataObjectCount;
- private Stream currentStream;
-
- private IX509AttributeCertificate ReadDerCertificate(
- Asn1InputStream dIn)
- {
- Asn1Sequence seq = (Asn1Sequence)dIn.ReadObject();
-
- if (seq.Count > 1 && seq[0] is DerObjectIdentifier)
- {
- if (seq[0].Equals(PkcsObjectIdentifiers.SignedData))
- {
- sData = SignedData.GetInstance(
- Asn1Sequence.GetInstance((Asn1TaggedObject) seq[1], true)).Certificates;
-
- return GetCertificate();
- }
- }
-
-// return new X509V2AttributeCertificate(seq.getEncoded());
- return new X509V2AttributeCertificate(AttributeCertificate.GetInstance(seq));
- }
-
- private IX509AttributeCertificate GetCertificate()
- {
- if (sData != null)
- {
- while (sDataObjectCount < sData.Count)
- {
- object obj = sData[sDataObjectCount++];
-
- if (obj is Asn1TaggedObject && ((Asn1TaggedObject)obj).TagNo == 2)
- {
- //return new X509V2AttributeCertificate(
- // Asn1Sequence.GetInstance((Asn1TaggedObject)obj, false).GetEncoded());
- return new X509V2AttributeCertificate(
- AttributeCertificate.GetInstance(
- Asn1Sequence.GetInstance((Asn1TaggedObject)obj, false)));
- }
- }
- }
-
- return null;
- }
-
- private IX509AttributeCertificate ReadPemCertificate(
- Stream inStream)
- {
- Asn1Sequence seq = PemAttrCertParser.ReadPemObject(inStream);
-
- return seq == null
- ? null
- //: new X509V2AttributeCertificate(seq.getEncoded());
- : new X509V2AttributeCertificate(AttributeCertificate.GetInstance(seq));
- }
-
- ///
- /// Create loading data from byte array.
- ///
- ///
- public IX509AttributeCertificate ReadAttrCert(
- byte[] input)
- {
- return ReadAttrCert(new MemoryStream(input, false));
- }
-
- ///
- /// Create loading data from byte array.
- ///
- ///
- public ICollection ReadAttrCerts(
- byte[] input)
- {
- return ReadAttrCerts(new MemoryStream(input, false));
- }
-
- /**
- * Generates a certificate object and initializes it with the data
- * read from the input stream inStream.
- */
- public IX509AttributeCertificate ReadAttrCert(
- Stream inStream)
- {
- if (inStream == null)
- throw new ArgumentNullException("inStream");
- if (!inStream.CanRead)
- throw new ArgumentException("inStream must be read-able", "inStream");
-
- if (currentStream == null)
- {
- currentStream = inStream;
- sData = null;
- sDataObjectCount = 0;
- }
- else if (currentStream != inStream) // reset if input stream has changed
- {
- currentStream = inStream;
- sData = null;
- sDataObjectCount = 0;
- }
-
- try
- {
- if (sData != null)
- {
- if (sDataObjectCount != sData.Count)
- {
- return GetCertificate();
- }
-
- sData = null;
- sDataObjectCount = 0;
- return null;
- }
-
- PushbackStream pis = new PushbackStream(inStream);
- int tag = pis.ReadByte();
-
- if (tag < 0)
- return null;
-
- pis.Unread(tag);
-
- if (tag != 0x30) // assume ascii PEM encoded.
- {
- return ReadPemCertificate(pis);
- }
-
- return ReadDerCertificate(new Asn1InputStream(pis));
- }
- catch (Exception e)
- {
- throw new CertificateException(e.ToString());
- }
- }
-
- /**
- * Returns a (possibly empty) collection view of the certificates
- * read from the given input stream inStream.
- */
- public ICollection ReadAttrCerts(
- Stream inStream)
- {
- IX509AttributeCertificate attrCert;
- IList attrCerts = Platform.CreateArrayList();
-
- while ((attrCert = ReadAttrCert(inStream)) != null)
- {
- attrCerts.Add(attrCert);
- }
-
- return attrCerts;
- }
- }
-}
\ No newline at end of file
diff --git a/BCCrypto/src/x509/X509Attribute.cs b/BCCrypto/src/x509/X509Attribute.cs
deleted file mode 100644
index 248d66c..0000000
--- a/BCCrypto/src/x509/X509Attribute.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.X509
-{
- /**
- * Class for carrying the values in an X.509 Attribute.
- */
- public class X509Attribute
- : Asn1Encodable
- {
- private readonly AttributeX509 attr;
-
- /**
- * @param at an object representing an attribute.
- */
- internal X509Attribute(
- Asn1Encodable at)
- {
- this.attr = AttributeX509.GetInstance(at);
- }
-
- /**
- * Create an X.509 Attribute with the type given by the passed in oid and
- * the value represented by an ASN.1 Set containing value.
- *
- * @param oid type of the attribute
- * @param value value object to go into the atribute's value set.
- */
- public X509Attribute(
- string oid,
- Asn1Encodable value)
- {
- this.attr = new AttributeX509(new DerObjectIdentifier(oid), new DerSet(value));
- }
-
- /**
- * Create an X.59 Attribute with the type given by the passed in oid and the
- * value represented by an ASN.1 Set containing the objects in value.
- *
- * @param oid type of the attribute
- * @param value vector of values to go in the attribute's value set.
- */
- public X509Attribute(
- string oid,
- Asn1EncodableVector value)
- {
- this.attr = new AttributeX509(new DerObjectIdentifier(oid), new DerSet(value));
- }
-
- public string Oid
- {
- get { return attr.AttrType.Id; }
- }
-
- public Asn1Encodable[] GetValues()
- {
- Asn1Set s = attr.AttrValues;
- Asn1Encodable[] values = new Asn1Encodable[s.Count];
-
- for (int i = 0; i != s.Count; i++)
- {
- values[i] = (Asn1Encodable)s[i];
- }
-
- return values;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return attr.ToAsn1Object();
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509CertPairParser.cs b/BCCrypto/src/x509/X509CertPairParser.cs
deleted file mode 100644
index 8261259..0000000
--- a/BCCrypto/src/x509/X509CertPairParser.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.X509
-{
- public class X509CertPairParser
- {
- private Stream currentStream;
-
- private X509CertificatePair ReadDerCrossCertificatePair(
- Stream inStream)
- {
- Asn1InputStream dIn = new Asn1InputStream(inStream);//, ProviderUtil.getReadLimit(in));
- Asn1Sequence seq = (Asn1Sequence)dIn.ReadObject();
- CertificatePair pair = CertificatePair.GetInstance(seq);
- return new X509CertificatePair(pair);
- }
-
- ///
- /// Create loading data from byte array.
- ///
- ///
- public X509CertificatePair ReadCertPair(
- byte[] input)
- {
- return ReadCertPair(new MemoryStream(input, false));
- }
-
- ///
- /// Create loading data from byte array.
- ///
- ///
- public ICollection ReadCertPairs(
- byte[] input)
- {
- return ReadCertPairs(new MemoryStream(input, false));
- }
-
- public X509CertificatePair ReadCertPair(
- Stream inStream)
- {
- if (inStream == null)
- throw new ArgumentNullException("inStream");
- if (!inStream.CanRead)
- throw new ArgumentException("inStream must be read-able", "inStream");
-
- if (currentStream == null)
- {
- currentStream = inStream;
- }
- else if (currentStream != inStream) // reset if input stream has changed
- {
- currentStream = inStream;
- }
-
- try
- {
- PushbackStream pis = new PushbackStream(inStream);
- int tag = pis.ReadByte();
-
- if (tag < 0)
- return null;
-
- pis.Unread(tag);
-
- return ReadDerCrossCertificatePair(pis);
- }
- catch (Exception e)
- {
- throw new CertificateException(e.ToString());
- }
- }
-
- public ICollection ReadCertPairs(
- Stream inStream)
- {
- X509CertificatePair certPair;
- IList certPairs = Platform.CreateArrayList();
-
- while ((certPair = ReadCertPair(inStream)) != null)
- {
- certPairs.Add(certPair);
- }
-
- return certPairs;
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509Certificate.cs b/BCCrypto/src/x509/X509Certificate.cs
deleted file mode 100644
index 6d7bd7a..0000000
--- a/BCCrypto/src/x509/X509Certificate.cs
+++ /dev/null
@@ -1,604 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Misc;
-using Org.BouncyCastle.Asn1.Utilities;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-using Org.BouncyCastle.X509.Extension;
-using Org.BouncyCastle.Crypto.Operators;
-
-namespace Org.BouncyCastle.X509
-{
- ///
- /// An Object representing an X509 Certificate.
- /// Has static methods for loading Certificates encoded in many forms that return X509Certificate Objects.
- ///
- public class X509Certificate
- : X509ExtensionBase
-// , PKCS12BagAttributeCarrier
- {
- private readonly X509CertificateStructure c;
-// private Hashtable pkcs12Attributes = new Hashtable();
-// private ArrayList pkcs12Ordering = new ArrayList();
- private readonly BasicConstraints basicConstraints;
- private readonly bool[] keyUsage;
-
- private bool hashValueSet;
- private int hashValue;
-
- protected X509Certificate()
- {
- }
-
- public X509Certificate(
- X509CertificateStructure c)
- {
- this.c = c;
-
- try
- {
- Asn1OctetString str = this.GetExtensionValue(new DerObjectIdentifier("2.5.29.19"));
-
- if (str != null)
- {
- basicConstraints = BasicConstraints.GetInstance(
- X509ExtensionUtilities.FromExtensionValue(str));
- }
- }
- catch (Exception e)
- {
- throw new CertificateParsingException("cannot construct BasicConstraints: " + e);
- }
-
- try
- {
- Asn1OctetString str = this.GetExtensionValue(new DerObjectIdentifier("2.5.29.15"));
-
- if (str != null)
- {
- DerBitString bits = DerBitString.GetInstance(
- X509ExtensionUtilities.FromExtensionValue(str));
-
- byte[] bytes = bits.GetBytes();
- int length = (bytes.Length * 8) - bits.PadBits;
-
- keyUsage = new bool[(length < 9) ? 9 : length];
-
- for (int i = 0; i != length; i++)
- {
-// keyUsage[i] = (bytes[i / 8] & (0x80 >>> (i % 8))) != 0;
- keyUsage[i] = (bytes[i / 8] & (0x80 >> (i % 8))) != 0;
- }
- }
- else
- {
- keyUsage = null;
- }
- }
- catch (Exception e)
- {
- throw new CertificateParsingException("cannot construct KeyUsage: " + e);
- }
- }
-
-// internal X509Certificate(
-// Asn1Sequence seq)
-// {
-// this.c = X509CertificateStructure.GetInstance(seq);
-// }
-
-// ///
-// /// Load certificate from byte array.
-// ///
-// /// Byte array containing encoded X509Certificate.
-// public X509Certificate(
-// byte[] encoded)
-// : this((Asn1Sequence) new Asn1InputStream(encoded).ReadObject())
-// {
-// }
-//
-// ///
-// /// Load certificate from Stream.
-// /// Must be positioned at start of certificate.
-// ///
-// ///
-// public X509Certificate(
-// Stream input)
-// : this((Asn1Sequence) new Asn1InputStream(input).ReadObject())
-// {
-// }
-
- public virtual X509CertificateStructure CertificateStructure
- {
- get { return c; }
- }
-
- ///
- /// Return true if the current time is within the start and end times nominated on the certificate.
- ///
- /// true id certificate is valid for the current time.
- public virtual bool IsValidNow
- {
- get { return IsValid(DateTime.UtcNow); }
- }
-
- ///
- /// Return true if the nominated time is within the start and end times nominated on the certificate.
- ///
- /// The time to test validity against.
- /// True if certificate is valid for nominated time.
- public virtual bool IsValid(
- DateTime time)
- {
- return time.CompareTo(NotBefore) >= 0 && time.CompareTo(NotAfter) <= 0;
- }
-
- ///
- /// Checks if the current date is within certificate's validity period.
- ///
- public virtual void CheckValidity()
- {
- this.CheckValidity(DateTime.UtcNow);
- }
-
- ///
- /// Checks if the given date is within certificate's validity period.
- ///
- /// if the certificate is expired by given date
- /// if the certificate is not yet valid on given date
- public virtual void CheckValidity(
- DateTime time)
- {
- if (time.CompareTo(NotAfter) > 0)
- throw new CertificateExpiredException("certificate expired on " + c.EndDate.GetTime());
- if (time.CompareTo(NotBefore) < 0)
- throw new CertificateNotYetValidException("certificate not valid until " + c.StartDate.GetTime());
- }
-
- ///
- /// Return the certificate's version.
- ///
- /// An integer whose value Equals the version of the cerficate.
- public virtual int Version
- {
- get { return c.Version; }
- }
-
- ///
- /// Return a BigInteger containing the serial number.
- ///
- /// The Serial number.
- public virtual BigInteger SerialNumber
- {
- get { return c.SerialNumber.Value; }
- }
-
- ///
- /// Get the Issuer Distinguished Name. (Who signed the certificate.)
- ///
- /// And X509Object containing name and value pairs.
-// public IPrincipal IssuerDN
- public virtual X509Name IssuerDN
- {
- get { return c.Issuer; }
- }
-
- ///
- /// Get the subject of this certificate.
- ///
- /// An X509Name object containing name and value pairs.
-// public IPrincipal SubjectDN
- public virtual X509Name SubjectDN
- {
- get { return c.Subject; }
- }
-
- ///
- /// The time that this certificate is valid from.
- ///
- /// A DateTime object representing that time in the local time zone.
- public virtual DateTime NotBefore
- {
- get { return c.StartDate.ToDateTime(); }
- }
-
- ///
- /// The time that this certificate is valid up to.
- ///
- /// A DateTime object representing that time in the local time zone.
- public virtual DateTime NotAfter
- {
- get { return c.EndDate.ToDateTime(); }
- }
-
- ///
- /// Return the Der encoded TbsCertificate data.
- /// This is the certificate component less the signature.
- /// To Get the whole certificate call the GetEncoded() member.
- ///
- /// A byte array containing the Der encoded Certificate component.
- public virtual byte[] GetTbsCertificate()
- {
- return c.TbsCertificate.GetDerEncoded();
- }
-
- ///
- /// The signature.
- ///
- /// A byte array containg the signature of the certificate.
- public virtual byte[] GetSignature()
- {
- return c.GetSignatureOctets();
- }
-
- ///
- /// A meaningful version of the Signature Algorithm. (EG SHA1WITHRSA)
- ///
- /// A sting representing the signature algorithm.
- public virtual string SigAlgName
- {
- get { return SignerUtilities.GetEncodingName(c.SignatureAlgorithm.Algorithm); }
- }
-
- ///
- /// Get the Signature Algorithms Object ID.
- ///
- /// A string containg a '.' separated object id.
- public virtual string SigAlgOid
- {
- get { return c.SignatureAlgorithm.Algorithm.Id; }
- }
-
- ///
- /// Get the signature algorithms parameters. (EG DSA Parameters)
- ///
- /// A byte array containing the Der encoded version of the parameters or null if there are none.
- public virtual byte[] GetSigAlgParams()
- {
- if (c.SignatureAlgorithm.Parameters != null)
- {
- return c.SignatureAlgorithm.Parameters.GetDerEncoded();
- }
-
- return null;
- }
-
- ///
- /// Get the issuers UID.
- ///
- /// A DerBitString.
- public virtual DerBitString IssuerUniqueID
- {
- get { return c.TbsCertificate.IssuerUniqueID; }
- }
-
- ///
- /// Get the subjects UID.
- ///
- /// A DerBitString.
- public virtual DerBitString SubjectUniqueID
- {
- get { return c.TbsCertificate.SubjectUniqueID; }
- }
-
- ///
- /// Get a key usage guidlines.
- ///
- public virtual bool[] GetKeyUsage()
- {
- return keyUsage == null ? null : (bool[]) keyUsage.Clone();
- }
-
- // TODO Replace with something that returns a list of DerObjectIdentifier
- public virtual IList GetExtendedKeyUsage()
- {
- Asn1OctetString str = this.GetExtensionValue(new DerObjectIdentifier("2.5.29.37"));
-
- if (str == null)
- return null;
-
- try
- {
- Asn1Sequence seq = Asn1Sequence.GetInstance(
- X509ExtensionUtilities.FromExtensionValue(str));
-
- IList list = Platform.CreateArrayList();
-
- foreach (DerObjectIdentifier oid in seq)
- {
- list.Add(oid.Id);
- }
-
- return list;
- }
- catch (Exception e)
- {
- throw new CertificateParsingException("error processing extended key usage extension", e);
- }
- }
-
- public virtual int GetBasicConstraints()
- {
- if (basicConstraints != null && basicConstraints.IsCA())
- {
- if (basicConstraints.PathLenConstraint == null)
- {
- return int.MaxValue;
- }
-
- return basicConstraints.PathLenConstraint.IntValue;
- }
-
- return -1;
- }
-
- public virtual ICollection GetSubjectAlternativeNames()
- {
- return GetAlternativeNames("2.5.29.17");
- }
-
- public virtual ICollection GetIssuerAlternativeNames()
- {
- return GetAlternativeNames("2.5.29.18");
- }
-
- protected virtual ICollection GetAlternativeNames(
- string oid)
- {
- Asn1OctetString altNames = GetExtensionValue(new DerObjectIdentifier(oid));
-
- if (altNames == null)
- return null;
-
- Asn1Object asn1Object = X509ExtensionUtilities.FromExtensionValue(altNames);
-
- GeneralNames gns = GeneralNames.GetInstance(asn1Object);
-
- IList result = Platform.CreateArrayList();
- foreach (GeneralName gn in gns.GetNames())
- {
- IList entry = Platform.CreateArrayList();
- entry.Add(gn.TagNo);
- entry.Add(gn.Name.ToString());
- result.Add(entry);
- }
- return result;
- }
-
- protected override X509Extensions GetX509Extensions()
- {
- return c.Version >= 3
- ? c.TbsCertificate.Extensions
- : null;
- }
-
- ///
- /// Get the public key of the subject of the certificate.
- ///
- /// The public key parameters.
- public virtual AsymmetricKeyParameter GetPublicKey()
- {
- return PublicKeyFactory.CreateKey(c.SubjectPublicKeyInfo);
- }
-
- ///
- /// Return a Der encoded version of this certificate.
- ///
- /// A byte array.
- public virtual byte[] GetEncoded()
- {
- return c.GetDerEncoded();
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- X509Certificate other = obj as X509Certificate;
-
- if (other == null)
- return false;
-
- return c.Equals(other.c);
-
- // NB: May prefer this implementation of Equals if more than one certificate implementation in play
-// return Arrays.AreEqual(this.GetEncoded(), other.GetEncoded());
- }
-
- public override int GetHashCode()
- {
- lock (this)
- {
- if (!hashValueSet)
- {
- hashValue = c.GetHashCode();
- hashValueSet = true;
- }
- }
-
- return hashValue;
- }
-
-// public void setBagAttribute(
-// DERObjectIdentifier oid,
-// DEREncodable attribute)
-// {
-// pkcs12Attributes.put(oid, attribute);
-// pkcs12Ordering.addElement(oid);
-// }
-//
-// public DEREncodable getBagAttribute(
-// DERObjectIdentifier oid)
-// {
-// return (DEREncodable)pkcs12Attributes.get(oid);
-// }
-//
-// public Enumeration getBagAttributeKeys()
-// {
-// return pkcs12Ordering.elements();
-// }
-
- public override string ToString()
- {
- StringBuilder buf = new StringBuilder();
- string nl = Platform.NewLine;
-
- buf.Append(" [0] Version: ").Append(this.Version).Append(nl);
- buf.Append(" SerialNumber: ").Append(this.SerialNumber).Append(nl);
- buf.Append(" IssuerDN: ").Append(this.IssuerDN).Append(nl);
- buf.Append(" Start Date: ").Append(this.NotBefore).Append(nl);
- buf.Append(" Final Date: ").Append(this.NotAfter).Append(nl);
- buf.Append(" SubjectDN: ").Append(this.SubjectDN).Append(nl);
- buf.Append(" Public Key: ").Append(this.GetPublicKey()).Append(nl);
- buf.Append(" Signature Algorithm: ").Append(this.SigAlgName).Append(nl);
-
- byte[] sig = this.GetSignature();
- buf.Append(" Signature: ").Append(Hex.ToHexString(sig, 0, 20)).Append(nl);
-
- for (int i = 20; i < sig.Length; i += 20)
- {
- int len = System.Math.Min(20, sig.Length - i);
- buf.Append(" ").Append(Hex.ToHexString(sig, i, len)).Append(nl);
- }
-
- X509Extensions extensions = c.TbsCertificate.Extensions;
-
- if (extensions != null)
- {
- IEnumerator e = extensions.ExtensionOids.GetEnumerator();
-
- if (e.MoveNext())
- {
- buf.Append(" Extensions: \n");
- }
-
- do
- {
- DerObjectIdentifier oid = (DerObjectIdentifier)e.Current;
- X509Extension ext = extensions.GetExtension(oid);
-
- if (ext.Value != null)
- {
- byte[] octs = ext.Value.GetOctets();
- Asn1Object obj = Asn1Object.FromByteArray(octs);
- buf.Append(" critical(").Append(ext.IsCritical).Append(") ");
- try
- {
- if (oid.Equals(X509Extensions.BasicConstraints))
- {
- buf.Append(BasicConstraints.GetInstance(obj));
- }
- else if (oid.Equals(X509Extensions.KeyUsage))
- {
- buf.Append(KeyUsage.GetInstance(obj));
- }
- else if (oid.Equals(MiscObjectIdentifiers.NetscapeCertType))
- {
- buf.Append(new NetscapeCertType((DerBitString) obj));
- }
- else if (oid.Equals(MiscObjectIdentifiers.NetscapeRevocationUrl))
- {
- buf.Append(new NetscapeRevocationUrl((DerIA5String) obj));
- }
- else if (oid.Equals(MiscObjectIdentifiers.VerisignCzagExtension))
- {
- buf.Append(new VerisignCzagExtension((DerIA5String) obj));
- }
- else
- {
- buf.Append(oid.Id);
- buf.Append(" value = ").Append(Asn1Dump.DumpAsString(obj));
- //buf.Append(" value = ").Append("*****").Append(nl);
- }
- }
- catch (Exception)
- {
- buf.Append(oid.Id);
- //buf.Append(" value = ").Append(new string(Hex.encode(ext.getValue().getOctets()))).Append(nl);
- buf.Append(" value = ").Append("*****");
- }
- }
-
- buf.Append(nl);
- }
- while (e.MoveNext());
- }
-
- return buf.ToString();
- }
-
- ///
- /// Verify the certificate's signature using the nominated public key.
- ///
- /// An appropriate public key parameter object, RsaPublicKeyParameters, DsaPublicKeyParameters or ECDsaPublicKeyParameters
- /// True if the signature is valid.
- /// If key submitted is not of the above nominated types.
- public virtual void Verify(
- AsymmetricKeyParameter key)
- {
- CheckSignature(new Asn1VerifierFactory(c.SignatureAlgorithm, key));
- }
-
- ///
- /// Verify the certificate's signature using a verifier created using the passed in verifier provider.
- ///
- /// An appropriate provider for verifying the certificate's signature.
- /// True if the signature is valid.
- /// If verifier provider is not appropriate or the certificate algorithm is invalid.
- public virtual void Verify(
- IVerifierFactoryProvider verifierProvider)
- {
- CheckSignature(verifierProvider.CreateVerifierFactory (c.SignatureAlgorithm));
- }
-
- protected virtual void CheckSignature(
- IVerifierFactory verifier)
- {
- if (!IsAlgIDEqual(c.SignatureAlgorithm, c.TbsCertificate.Signature))
- throw new CertificateException("signature algorithm in TBS cert not same as outer cert");
-
- Asn1Encodable parameters = c.SignatureAlgorithm.Parameters;
-
- IStreamCalculator streamCalculator = verifier.CreateCalculator();
-
- byte[] b = this.GetTbsCertificate();
-
- streamCalculator.Stream.Write(b, 0, b.Length);
-
- Platform.Dispose(streamCalculator.Stream);
-
- if (!((IVerifier)streamCalculator.GetResult()).IsVerified(this.GetSignature()))
- {
- throw new InvalidKeyException("Public key presented not for certificate signature");
- }
- }
-
- private static bool IsAlgIDEqual(AlgorithmIdentifier id1, AlgorithmIdentifier id2)
- {
- if (!id1.Algorithm.Equals(id2.Algorithm))
- return false;
-
- Asn1Encodable p1 = id1.Parameters;
- Asn1Encodable p2 = id2.Parameters;
-
- if ((p1 == null) == (p2 == null))
- return Platform.Equals(p1, p2);
-
- // Exactly one of p1, p2 is null at this point
- return p1 == null
- ? p2.ToAsn1Object() is Asn1Null
- : p1.ToAsn1Object() is Asn1Null;
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509CertificatePair.cs b/BCCrypto/src/x509/X509CertificatePair.cs
deleted file mode 100644
index fbeba4d..0000000
--- a/BCCrypto/src/x509/X509CertificatePair.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.X509
-{
- ///
- /// This class contains a cross certificate pair. Cross certificates pairs may
- /// contain two cross signed certificates from two CAs. A certificate from the
- /// other CA to this CA is contained in the forward certificate, the certificate
- /// from this CA to the other CA is contained in the reverse certificate.
- ///
- public class X509CertificatePair
- {
- private readonly X509Certificate forward;
- private readonly X509Certificate reverse;
-
- /// Constructor
- /// Certificate from the other CA to this CA.
- /// Certificate from this CA to the other CA.
- public X509CertificatePair(
- X509Certificate forward,
- X509Certificate reverse)
- {
- this.forward = forward;
- this.reverse = reverse;
- }
-
- /// Constructor from a ASN.1 CertificatePair structure.
- /// The CertificatePair ASN.1 object.
- public X509CertificatePair(
- CertificatePair pair)
- {
- if (pair.Forward != null)
- {
- this.forward = new X509Certificate(pair.Forward);
- }
- if (pair.Reverse != null)
- {
- this.reverse = new X509Certificate(pair.Reverse);
- }
- }
-
- public byte[] GetEncoded()
- {
- try
- {
- X509CertificateStructure f = null, r = null;
-
- if (forward != null)
- {
- f = X509CertificateStructure.GetInstance(
- Asn1Object.FromByteArray(forward.GetEncoded()));
-
- if (f == null)
- throw new CertificateEncodingException("unable to get encoding for forward");
- }
-
- if (reverse != null)
- {
- r = X509CertificateStructure.GetInstance(
- Asn1Object.FromByteArray(reverse.GetEncoded()));
-
- if (r == null)
- throw new CertificateEncodingException("unable to get encoding for reverse");
- }
-
- return new CertificatePair(f, r).GetDerEncoded();
- }
- catch (Exception e)
- {
- // TODO
-// throw new ExtCertificateEncodingException(e.toString(), e);
- throw new CertificateEncodingException(e.Message, e);
- }
- }
-
- /// Returns the certificate from the other CA to this CA.
- public X509Certificate Forward
- {
- get { return forward; }
- }
-
- /// Returns the certificate from this CA to the other CA.
- public X509Certificate Reverse
- {
- get { return reverse; }
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- X509CertificatePair other = obj as X509CertificatePair;
-
- if (other == null)
- return false;
-
- return Platform.Equals(this.forward, other.forward)
- && Platform.Equals(this.reverse, other.reverse);
- }
-
- public override int GetHashCode()
- {
- int hash = -1;
- if (forward != null)
- {
- hash ^= forward.GetHashCode();
- }
- if (reverse != null)
- {
- hash *= 17;
- hash ^= reverse.GetHashCode();
- }
- return hash;
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509CertificateParser.cs b/BCCrypto/src/x509/X509CertificateParser.cs
deleted file mode 100644
index 8f0e740..0000000
--- a/BCCrypto/src/x509/X509CertificateParser.cs
+++ /dev/null
@@ -1,183 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.X509
-{
- /**
- * class for dealing with X509 certificates.
- *
- * At the moment this will deal with "-----BEGIN CERTIFICATE-----" to "-----END CERTIFICATE-----"
- * base 64 encoded certs, as well as the BER binaries of certificates and some classes of PKCS#7
- * objects.
- */
- public class X509CertificateParser
- {
- private static readonly PemParser PemCertParser = new PemParser("CERTIFICATE");
-
- private Asn1Set sData;
- private int sDataObjectCount;
- private Stream currentStream;
-
- private X509Certificate ReadDerCertificate(
- Asn1InputStream dIn)
- {
- Asn1Sequence seq = (Asn1Sequence)dIn.ReadObject();
-
- if (seq.Count > 1 && seq[0] is DerObjectIdentifier)
- {
- if (seq[0].Equals(PkcsObjectIdentifiers.SignedData))
- {
- sData = SignedData.GetInstance(
- Asn1Sequence.GetInstance((Asn1TaggedObject) seq[1], true)).Certificates;
-
- return GetCertificate();
- }
- }
-
- return CreateX509Certificate(X509CertificateStructure.GetInstance(seq));
- }
-
- private X509Certificate GetCertificate()
- {
- if (sData != null)
- {
- while (sDataObjectCount < sData.Count)
- {
- object obj = sData[sDataObjectCount++];
-
- if (obj is Asn1Sequence)
- {
- return CreateX509Certificate(
- X509CertificateStructure.GetInstance(obj));
- }
- }
- }
-
- return null;
- }
-
- private X509Certificate ReadPemCertificate(
- Stream inStream)
- {
- Asn1Sequence seq = PemCertParser.ReadPemObject(inStream);
-
- return seq == null
- ? null
- : CreateX509Certificate(X509CertificateStructure.GetInstance(seq));
- }
-
- protected virtual X509Certificate CreateX509Certificate(
- X509CertificateStructure c)
- {
- return new X509Certificate(c);
- }
-
- ///
- /// Create loading data from byte array.
- ///
- ///
- public X509Certificate ReadCertificate(
- byte[] input)
- {
- return ReadCertificate(new MemoryStream(input, false));
- }
-
- ///
- /// Create loading data from byte array.
- ///
- ///
- public ICollection ReadCertificates(
- byte[] input)
- {
- return ReadCertificates(new MemoryStream(input, false));
- }
-
- /**
- * Generates a certificate object and initializes it with the data
- * read from the input stream inStream.
- */
- public X509Certificate ReadCertificate(
- Stream inStream)
- {
- if (inStream == null)
- throw new ArgumentNullException("inStream");
- if (!inStream.CanRead)
- throw new ArgumentException("inStream must be read-able", "inStream");
-
- if (currentStream == null)
- {
- currentStream = inStream;
- sData = null;
- sDataObjectCount = 0;
- }
- else if (currentStream != inStream) // reset if input stream has changed
- {
- currentStream = inStream;
- sData = null;
- sDataObjectCount = 0;
- }
-
- try
- {
- if (sData != null)
- {
- if (sDataObjectCount != sData.Count)
- {
- return GetCertificate();
- }
-
- sData = null;
- sDataObjectCount = 0;
- return null;
- }
-
- PushbackStream pis = new PushbackStream(inStream);
- int tag = pis.ReadByte();
-
- if (tag < 0)
- return null;
-
- pis.Unread(tag);
-
- if (tag != 0x30) // assume ascii PEM encoded.
- {
- return ReadPemCertificate(pis);
- }
-
- return ReadDerCertificate(new Asn1InputStream(pis));
- }
- catch (Exception e)
- {
- throw new CertificateException("Failed to read certificate", e);
- }
- }
-
- /**
- * Returns a (possibly empty) collection view of the certificates
- * read from the given input stream inStream.
- */
- public ICollection ReadCertificates(
- Stream inStream)
- {
- X509Certificate cert;
- IList certs = Platform.CreateArrayList();
-
- while ((cert = ReadCertificate(inStream)) != null)
- {
- certs.Add(cert);
- }
-
- return certs;
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509Crl.cs b/BCCrypto/src/x509/X509Crl.cs
deleted file mode 100644
index ecfb141..0000000
--- a/BCCrypto/src/x509/X509Crl.cs
+++ /dev/null
@@ -1,426 +0,0 @@
-using System;
-using System.Collections;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Utilities;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Date;
-using Org.BouncyCastle.Utilities.Encoders;
-using Org.BouncyCastle.X509.Extension;
-using Org.BouncyCastle.Crypto.Operators;
-
-namespace Org.BouncyCastle.X509
-{
- /**
- * The following extensions are listed in RFC 2459 as relevant to CRLs
- *
- * Authority Key Identifier
- * Issuer Alternative Name
- * CRL Number
- * Delta CRL Indicator (critical)
- * Issuing Distribution Point (critical)
- */
- public class X509Crl
- : X509ExtensionBase
- // TODO Add interface Crl?
- {
- private readonly CertificateList c;
- private readonly string sigAlgName;
- private readonly byte[] sigAlgParams;
- private readonly bool isIndirect;
-
- public X509Crl(
- CertificateList c)
- {
- this.c = c;
-
- try
- {
- this.sigAlgName = X509SignatureUtilities.GetSignatureName(c.SignatureAlgorithm);
-
- if (c.SignatureAlgorithm.Parameters != null)
- {
- this.sigAlgParams = ((Asn1Encodable)c.SignatureAlgorithm.Parameters).GetDerEncoded();
- }
- else
- {
- this.sigAlgParams = null;
- }
-
- this.isIndirect = IsIndirectCrl;
- }
- catch (Exception e)
- {
- throw new CrlException("CRL contents invalid: " + e);
- }
- }
-
- protected override X509Extensions GetX509Extensions()
- {
- return c.Version >= 2
- ? c.TbsCertList.Extensions
- : null;
- }
-
- public virtual byte[] GetEncoded()
- {
- try
- {
- return c.GetDerEncoded();
- }
- catch (Exception e)
- {
- throw new CrlException(e.ToString());
- }
- }
-
- public virtual void Verify(
- AsymmetricKeyParameter publicKey)
- {
- Verify(new Asn1VerifierFactoryProvider(publicKey));
- }
-
- ///
- /// Verify the CRL's signature using a verifier created using the passed in verifier provider.
- ///
- /// An appropriate provider for verifying the CRL's signature.
- /// True if the signature is valid.
- /// If verifier provider is not appropriate or the CRL algorithm is invalid.
- public virtual void Verify(
- IVerifierFactoryProvider verifierProvider)
- {
- CheckSignature(verifierProvider.CreateVerifierFactory(c.SignatureAlgorithm));
- }
-
- protected virtual void CheckSignature(
- IVerifierFactory verifier)
- {
- if (!c.SignatureAlgorithm.Equals(c.TbsCertList.Signature))
- {
- throw new CrlException("Signature algorithm on CertificateList does not match TbsCertList.");
- }
-
- Asn1Encodable parameters = c.SignatureAlgorithm.Parameters;
-
- IStreamCalculator streamCalculator = verifier.CreateCalculator();
-
- byte[] b = this.GetTbsCertList();
-
- streamCalculator.Stream.Write(b, 0, b.Length);
-
- Platform.Dispose(streamCalculator.Stream);
-
- if (!((IVerifier)streamCalculator.GetResult()).IsVerified(this.GetSignature()))
- {
- throw new InvalidKeyException("CRL does not verify with supplied public key.");
- }
- }
-
- public virtual int Version
- {
- get { return c.Version; }
- }
-
- public virtual X509Name IssuerDN
- {
- get { return c.Issuer; }
- }
-
- public virtual DateTime ThisUpdate
- {
- get { return c.ThisUpdate.ToDateTime(); }
- }
-
- public virtual DateTimeObject NextUpdate
- {
- get
- {
- return c.NextUpdate == null
- ? null
- : new DateTimeObject(c.NextUpdate.ToDateTime());
- }
- }
-
- private ISet LoadCrlEntries()
- {
- ISet entrySet = new HashSet();
- IEnumerable certs = c.GetRevokedCertificateEnumeration();
-
- X509Name previousCertificateIssuer = IssuerDN;
- foreach (CrlEntry entry in certs)
- {
- X509CrlEntry crlEntry = new X509CrlEntry(entry, isIndirect, previousCertificateIssuer);
- entrySet.Add(crlEntry);
- previousCertificateIssuer = crlEntry.GetCertificateIssuer();
- }
-
- return entrySet;
- }
-
- public virtual X509CrlEntry GetRevokedCertificate(
- BigInteger serialNumber)
- {
- IEnumerable certs = c.GetRevokedCertificateEnumeration();
-
- X509Name previousCertificateIssuer = IssuerDN;
- foreach (CrlEntry entry in certs)
- {
- X509CrlEntry crlEntry = new X509CrlEntry(entry, isIndirect, previousCertificateIssuer);
-
- if (serialNumber.Equals(entry.UserCertificate.Value))
- {
- return crlEntry;
- }
-
- previousCertificateIssuer = crlEntry.GetCertificateIssuer();
- }
-
- return null;
- }
-
- public virtual ISet GetRevokedCertificates()
- {
- ISet entrySet = LoadCrlEntries();
-
- if (entrySet.Count > 0)
- {
- return entrySet; // TODO? Collections.unmodifiableSet(entrySet);
- }
-
- return null;
- }
-
- public virtual byte[] GetTbsCertList()
- {
- try
- {
- return c.TbsCertList.GetDerEncoded();
- }
- catch (Exception e)
- {
- throw new CrlException(e.ToString());
- }
- }
-
- public virtual byte[] GetSignature()
- {
- return c.GetSignatureOctets();
- }
-
- public virtual string SigAlgName
- {
- get { return sigAlgName; }
- }
-
- public virtual string SigAlgOid
- {
- get { return c.SignatureAlgorithm.Algorithm.Id; }
- }
-
- public virtual byte[] GetSigAlgParams()
- {
- return Arrays.Clone(sigAlgParams);
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- X509Crl other = obj as X509Crl;
-
- if (other == null)
- return false;
-
- return c.Equals(other.c);
-
- // NB: May prefer this implementation of Equals if more than one certificate implementation in play
- //return Arrays.AreEqual(this.GetEncoded(), other.GetEncoded());
- }
-
- public override int GetHashCode()
- {
- return c.GetHashCode();
- }
-
- /**
- * Returns a string representation of this CRL.
- *
- * @return a string representation of this CRL.
- */
- public override string ToString()
- {
- StringBuilder buf = new StringBuilder();
- string nl = Platform.NewLine;
-
- buf.Append(" Version: ").Append(this.Version).Append(nl);
- buf.Append(" IssuerDN: ").Append(this.IssuerDN).Append(nl);
- buf.Append(" This update: ").Append(this.ThisUpdate).Append(nl);
- buf.Append(" Next update: ").Append(this.NextUpdate).Append(nl);
- buf.Append(" Signature Algorithm: ").Append(this.SigAlgName).Append(nl);
-
- byte[] sig = this.GetSignature();
-
- buf.Append(" Signature: ");
- buf.Append(Hex.ToHexString(sig, 0, 20)).Append(nl);
-
- for (int i = 20; i < sig.Length; i += 20)
- {
- int count = System.Math.Min(20, sig.Length - i);
- buf.Append(" ");
- buf.Append(Hex.ToHexString(sig, i, count)).Append(nl);
- }
-
- X509Extensions extensions = c.TbsCertList.Extensions;
-
- if (extensions != null)
- {
- IEnumerator e = extensions.ExtensionOids.GetEnumerator();
-
- if (e.MoveNext())
- {
- buf.Append(" Extensions: ").Append(nl);
- }
-
- do
- {
- DerObjectIdentifier oid = (DerObjectIdentifier) e.Current;
- X509Extension ext = extensions.GetExtension(oid);
-
- if (ext.Value != null)
- {
- Asn1Object asn1Value = X509ExtensionUtilities.FromExtensionValue(ext.Value);
-
- buf.Append(" critical(").Append(ext.IsCritical).Append(") ");
- try
- {
- if (oid.Equals(X509Extensions.CrlNumber))
- {
- buf.Append(new CrlNumber(DerInteger.GetInstance(asn1Value).PositiveValue)).Append(nl);
- }
- else if (oid.Equals(X509Extensions.DeltaCrlIndicator))
- {
- buf.Append(
- "Base CRL: "
- + new CrlNumber(DerInteger.GetInstance(
- asn1Value).PositiveValue))
- .Append(nl);
- }
- else if (oid.Equals(X509Extensions.IssuingDistributionPoint))
- {
- buf.Append(IssuingDistributionPoint.GetInstance((Asn1Sequence) asn1Value)).Append(nl);
- }
- else if (oid.Equals(X509Extensions.CrlDistributionPoints))
- {
- buf.Append(CrlDistPoint.GetInstance((Asn1Sequence) asn1Value)).Append(nl);
- }
- else if (oid.Equals(X509Extensions.FreshestCrl))
- {
- buf.Append(CrlDistPoint.GetInstance((Asn1Sequence) asn1Value)).Append(nl);
- }
- else
- {
- buf.Append(oid.Id);
- buf.Append(" value = ").Append(
- Asn1Dump.DumpAsString(asn1Value))
- .Append(nl);
- }
- }
- catch (Exception)
- {
- buf.Append(oid.Id);
- buf.Append(" value = ").Append("*****").Append(nl);
- }
- }
- else
- {
- buf.Append(nl);
- }
- }
- while (e.MoveNext());
- }
-
- ISet certSet = GetRevokedCertificates();
- if (certSet != null)
- {
- foreach (X509CrlEntry entry in certSet)
- {
- buf.Append(entry);
- buf.Append(nl);
- }
- }
-
- return buf.ToString();
- }
-
- /**
- * Checks whether the given certificate is on this CRL.
- *
- * @param cert the certificate to check for.
- * @return true if the given certificate is on this CRL,
- * false otherwise.
- */
-// public bool IsRevoked(
-// Certificate cert)
-// {
-// if (!cert.getType().Equals("X.509"))
-// {
-// throw new RuntimeException("X.509 CRL used with non X.509 Cert");
-// }
- public virtual bool IsRevoked(
- X509Certificate cert)
- {
- CrlEntry[] certs = c.GetRevokedCertificates();
-
- if (certs != null)
- {
-// BigInteger serial = ((X509Certificate)cert).SerialNumber;
- BigInteger serial = cert.SerialNumber;
-
- for (int i = 0; i < certs.Length; i++)
- {
- if (certs[i].UserCertificate.Value.Equals(serial))
- {
- return true;
- }
- }
- }
-
- return false;
- }
-
- protected virtual bool IsIndirectCrl
- {
- get
- {
- Asn1OctetString idp = GetExtensionValue(X509Extensions.IssuingDistributionPoint);
- bool isIndirect = false;
-
- try
- {
- if (idp != null)
- {
- isIndirect = IssuingDistributionPoint.GetInstance(
- X509ExtensionUtilities.FromExtensionValue(idp)).IsIndirectCrl;
- }
- }
- catch (Exception e)
- {
- // TODO
-// throw new ExtCrlException("Exception reading IssuingDistributionPoint", e);
- throw new CrlException("Exception reading IssuingDistributionPoint" + e);
- }
-
- return isIndirect;
- }
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509CrlEntry.cs b/BCCrypto/src/x509/X509CrlEntry.cs
deleted file mode 100644
index caca294..0000000
--- a/BCCrypto/src/x509/X509CrlEntry.cs
+++ /dev/null
@@ -1,201 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Utilities;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509.Extension;
-
-namespace Org.BouncyCastle.X509
-{
- /**
- * The following extensions are listed in RFC 2459 as relevant to CRL Entries
- *
- * ReasonCode Hode Instruction Code Invalidity Date Certificate Issuer
- * (critical)
- */
- public class X509CrlEntry
- : X509ExtensionBase
- {
- private CrlEntry c;
- private bool isIndirect;
- private X509Name previousCertificateIssuer;
- private X509Name certificateIssuer;
-
- public X509CrlEntry(
- CrlEntry c)
- {
- this.c = c;
- this.certificateIssuer = loadCertificateIssuer();
- }
-
- /**
- * Constructor for CRLEntries of indirect CRLs. If isIndirect
- * is false {@link #getCertificateIssuer()} will always
- * return null, previousCertificateIssuer is
- * ignored. If this isIndirect is specified and this CrlEntry
- * has no certificate issuer CRL entry extension
- * previousCertificateIssuer is returned by
- * {@link #getCertificateIssuer()}.
- *
- * @param c
- * TbsCertificateList.CrlEntry object.
- * @param isIndirect
- * true if the corresponding CRL is a indirect
- * CRL.
- * @param previousCertificateIssuer
- * Certificate issuer of the previous CrlEntry.
- */
- public X509CrlEntry(
- CrlEntry c,
- bool isIndirect,
- X509Name previousCertificateIssuer)
- {
- this.c = c;
- this.isIndirect = isIndirect;
- this.previousCertificateIssuer = previousCertificateIssuer;
- this.certificateIssuer = loadCertificateIssuer();
- }
-
- private X509Name loadCertificateIssuer()
- {
- if (!isIndirect)
- {
- return null;
- }
-
- Asn1OctetString ext = GetExtensionValue(X509Extensions.CertificateIssuer);
- if (ext == null)
- {
- return previousCertificateIssuer;
- }
-
- try
- {
- GeneralName[] names = GeneralNames.GetInstance(
- X509ExtensionUtilities.FromExtensionValue(ext)).GetNames();
-
- for (int i = 0; i < names.Length; i++)
- {
- if (names[i].TagNo == GeneralName.DirectoryName)
- {
- return X509Name.GetInstance(names[i].Name);
- }
- }
- }
- catch (Exception)
- {
- }
-
- return null;
- }
-
- public X509Name GetCertificateIssuer()
- {
- return certificateIssuer;
- }
-
- protected override X509Extensions GetX509Extensions()
- {
- return c.Extensions;
- }
-
- public byte[] GetEncoded()
- {
- try
- {
- return c.GetDerEncoded();
- }
- catch (Exception e)
- {
- throw new CrlException(e.ToString());
- }
- }
-
- public BigInteger SerialNumber
- {
- get { return c.UserCertificate.Value; }
- }
-
- public DateTime RevocationDate
- {
- get { return c.RevocationDate.ToDateTime(); }
- }
-
- public bool HasExtensions
- {
- get { return c.Extensions != null; }
- }
-
- public override string ToString()
- {
- StringBuilder buf = new StringBuilder();
- string nl = Platform.NewLine;
-
- buf.Append(" userCertificate: ").Append(this.SerialNumber).Append(nl);
- buf.Append(" revocationDate: ").Append(this.RevocationDate).Append(nl);
- buf.Append(" certificateIssuer: ").Append(this.GetCertificateIssuer()).Append(nl);
-
- X509Extensions extensions = c.Extensions;
-
- if (extensions != null)
- {
- IEnumerator e = extensions.ExtensionOids.GetEnumerator();
- if (e.MoveNext())
- {
- buf.Append(" crlEntryExtensions:").Append(nl);
-
- do
- {
- DerObjectIdentifier oid = (DerObjectIdentifier)e.Current;
- X509Extension ext = extensions.GetExtension(oid);
-
- if (ext.Value != null)
- {
- Asn1Object obj = Asn1Object.FromByteArray(ext.Value.GetOctets());
-
- buf.Append(" critical(")
- .Append(ext.IsCritical)
- .Append(") ");
- try
- {
- if (oid.Equals(X509Extensions.ReasonCode))
- {
- buf.Append(new CrlReason(DerEnumerated.GetInstance(obj)));
- }
- else if (oid.Equals(X509Extensions.CertificateIssuer))
- {
- buf.Append("Certificate issuer: ").Append(
- GeneralNames.GetInstance((Asn1Sequence)obj));
- }
- else
- {
- buf.Append(oid.Id);
- buf.Append(" value = ").Append(Asn1Dump.DumpAsString(obj));
- }
- buf.Append(nl);
- }
- catch (Exception)
- {
- buf.Append(oid.Id);
- buf.Append(" value = ").Append("*****").Append(nl);
- }
- }
- else
- {
- buf.Append(nl);
- }
- }
- while (e.MoveNext());
- }
- }
-
- return buf.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509CrlParser.cs b/BCCrypto/src/x509/X509CrlParser.cs
deleted file mode 100644
index d830bb9..0000000
--- a/BCCrypto/src/x509/X509CrlParser.cs
+++ /dev/null
@@ -1,195 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Encoders;
-using Org.BouncyCastle.Utilities.IO;
-
-namespace Org.BouncyCastle.X509
-{
- public class X509CrlParser
- {
- private static readonly PemParser PemCrlParser = new PemParser("CRL");
-
- private readonly bool lazyAsn1;
-
- private Asn1Set sCrlData;
- private int sCrlDataObjectCount;
- private Stream currentCrlStream;
-
- public X509CrlParser()
- : this(false)
- {
- }
-
- public X509CrlParser(
- bool lazyAsn1)
- {
- this.lazyAsn1 = lazyAsn1;
- }
-
- private X509Crl ReadPemCrl(
- Stream inStream)
- {
- Asn1Sequence seq = PemCrlParser.ReadPemObject(inStream);
-
- return seq == null
- ? null
- : CreateX509Crl(CertificateList.GetInstance(seq));
- }
-
- private X509Crl ReadDerCrl(
- Asn1InputStream dIn)
- {
- Asn1Sequence seq = (Asn1Sequence)dIn.ReadObject();
-
- if (seq.Count > 1 && seq[0] is DerObjectIdentifier)
- {
- if (seq[0].Equals(PkcsObjectIdentifiers.SignedData))
- {
- sCrlData = SignedData.GetInstance(
- Asn1Sequence.GetInstance((Asn1TaggedObject) seq[1], true)).Crls;
-
- return GetCrl();
- }
- }
-
- return CreateX509Crl(CertificateList.GetInstance(seq));
- }
-
- private X509Crl GetCrl()
- {
- if (sCrlData == null || sCrlDataObjectCount >= sCrlData.Count)
- {
- return null;
- }
-
- return CreateX509Crl(
- CertificateList.GetInstance(
- sCrlData[sCrlDataObjectCount++]));
- }
-
- protected virtual X509Crl CreateX509Crl(
- CertificateList c)
- {
- return new X509Crl(c);
- }
-
- ///
- /// Create loading data from byte array.
- ///
- ///
- public X509Crl ReadCrl(
- byte[] input)
- {
- return ReadCrl(new MemoryStream(input, false));
- }
-
- ///
- /// Create loading data from byte array.
- ///
- ///
- public ICollection ReadCrls(
- byte[] input)
- {
- return ReadCrls(new MemoryStream(input, false));
- }
-
- /**
- * Generates a certificate revocation list (CRL) object and initializes
- * it with the data read from the input stream inStream.
- */
- public X509Crl ReadCrl(
- Stream inStream)
- {
- if (inStream == null)
- throw new ArgumentNullException("inStream");
- if (!inStream.CanRead)
- throw new ArgumentException("inStream must be read-able", "inStream");
-
- if (currentCrlStream == null)
- {
- currentCrlStream = inStream;
- sCrlData = null;
- sCrlDataObjectCount = 0;
- }
- else if (currentCrlStream != inStream) // reset if input stream has changed
- {
- currentCrlStream = inStream;
- sCrlData = null;
- sCrlDataObjectCount = 0;
- }
-
- try
- {
- if (sCrlData != null)
- {
- if (sCrlDataObjectCount != sCrlData.Count)
- {
- return GetCrl();
- }
-
- sCrlData = null;
- sCrlDataObjectCount = 0;
- return null;
- }
-
- PushbackStream pis = new PushbackStream(inStream);
- int tag = pis.ReadByte();
-
- if (tag < 0)
- return null;
-
- pis.Unread(tag);
-
- if (tag != 0x30) // assume ascii PEM encoded.
- {
- return ReadPemCrl(pis);
- }
-
- Asn1InputStream asn1 = lazyAsn1
- ? new LazyAsn1InputStream(pis)
- : new Asn1InputStream(pis);
-
- return ReadDerCrl(asn1);
- }
- catch (CrlException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new CrlException(e.ToString());
- }
- }
-
- /**
- * Returns a (possibly empty) collection view of the CRLs read from
- * the given input stream inStream.
- *
- * The inStream may contain a sequence of DER-encoded CRLs, or
- * a PKCS#7 CRL set. This is a PKCS#7 SignedData object, with the
- * only significant field being crls. In particular the signature
- * and the contents are ignored.
- */
- public ICollection ReadCrls(
- Stream inStream)
- {
- X509Crl crl;
- IList crls = Platform.CreateArrayList();
-
- while ((crl = ReadCrl(inStream)) != null)
- {
- crls.Add(crl);
- }
-
- return crls;
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509ExtensionBase.cs b/BCCrypto/src/x509/X509ExtensionBase.cs
deleted file mode 100644
index aaf6695..0000000
--- a/BCCrypto/src/x509/X509ExtensionBase.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.X509
-{
- public abstract class X509ExtensionBase
- : IX509Extension
- {
- protected abstract X509Extensions GetX509Extensions();
-
- protected virtual ISet GetExtensionOids(
- bool critical)
- {
- X509Extensions extensions = GetX509Extensions();
- if (extensions != null)
- {
- HashSet set = new HashSet();
- foreach (DerObjectIdentifier oid in extensions.ExtensionOids)
- {
- X509Extension ext = extensions.GetExtension(oid);
- if (ext.IsCritical == critical)
- {
- set.Add(oid.Id);
- }
- }
-
- return set;
- }
-
- return null;
- }
-
- ///
- /// Get non critical extensions.
- ///
- /// A set of non critical extension oids.
- public virtual ISet GetNonCriticalExtensionOids()
- {
- return GetExtensionOids(false);
- }
-
- ///
- /// Get any critical extensions.
- ///
- /// A sorted list of critical entension.
- public virtual ISet GetCriticalExtensionOids()
- {
- return GetExtensionOids(true);
- }
-
- ///
- /// Get the value of a given extension.
- ///
- /// The object ID of the extension.
- /// An Asn1OctetString object if that extension is found or null if not.
- [Obsolete("Use version taking a DerObjectIdentifier instead")]
- public Asn1OctetString GetExtensionValue(
- string oid)
- {
- return GetExtensionValue(new DerObjectIdentifier(oid));
- }
-
- public virtual Asn1OctetString GetExtensionValue(
- DerObjectIdentifier oid)
- {
- X509Extensions exts = GetX509Extensions();
- if (exts != null)
- {
- X509Extension ext = exts.GetExtension(oid);
- if (ext != null)
- {
- return ext.Value;
- }
- }
-
- return null;
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509KeyUsage.cs b/BCCrypto/src/x509/X509KeyUsage.cs
deleted file mode 100644
index e0a7b49..0000000
--- a/BCCrypto/src/x509/X509KeyUsage.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-
-namespace Org.BouncyCastle.X509
-{
- /**
- * A holding class for constructing an X509 Key Usage extension.
- *
- *
- * id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 }
- *
- * KeyUsage ::= BIT STRING {
- * digitalSignature (0),
- * nonRepudiation (1),
- * keyEncipherment (2),
- * dataEncipherment (3),
- * keyAgreement (4),
- * keyCertSign (5),
- * cRLSign (6),
- * encipherOnly (7),
- * decipherOnly (8) }
- *
- */
- public class X509KeyUsage
- : Asn1Encodable
- {
- public const int DigitalSignature = 1 << 7;
- public const int NonRepudiation = 1 << 6;
- public const int KeyEncipherment = 1 << 5;
- public const int DataEncipherment = 1 << 4;
- public const int KeyAgreement = 1 << 3;
- public const int KeyCertSign = 1 << 2;
- public const int CrlSign = 1 << 1;
- public const int EncipherOnly = 1 << 0;
- public const int DecipherOnly = 1 << 15;
-
- private readonly int usage;
-
- /**
- * Basic constructor.
- *
- * @param usage - the bitwise OR of the Key Usage flags giving the
- * allowed uses for the key.
- * e.g. (X509KeyUsage.keyEncipherment | X509KeyUsage.dataEncipherment)
- */
- public X509KeyUsage(
- int usage)
- {
- this.usage = usage;
- }
-
- public override Asn1Object ToAsn1Object()
- {
- return new KeyUsage(usage);
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509SignatureUtil.cs b/BCCrypto/src/x509/X509SignatureUtil.cs
deleted file mode 100644
index 83863ae..0000000
--- a/BCCrypto/src/x509/X509SignatureUtil.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-
-namespace Org.BouncyCastle.X509
-{
- internal class X509SignatureUtilities
- {
- private static readonly Asn1Null derNull = DerNull.Instance;
-
- internal static void SetSignatureParameters(
- ISigner signature,
- Asn1Encodable parameters)
- {
- if (parameters != null && !derNull.Equals(parameters))
- {
- // TODO Put back in
-// AlgorithmParameters sigParams = AlgorithmParameters.GetInstance(signature.getAlgorithm());
-//
-// try
-// {
-// sigParams.Init(parameters.ToAsn1Object().GetDerEncoded());
-// }
-// catch (IOException e)
-// {
-// throw new SignatureException("IOException decoding parameters: " + e.Message);
-// }
-//
-// if (Platform.EndsWith(signature.getAlgorithm(), "MGF1"))
-// {
-// try
-// {
-// signature.setParameter(sigParams.getParameterSpec(PSSParameterSpec.class));
-// }
-// catch (GeneralSecurityException e)
-// {
-// throw new SignatureException("Exception extracting parameters: " + e.Message);
-// }
-// }
- }
- }
-
- internal static string GetSignatureName(
- AlgorithmIdentifier sigAlgId)
- {
- Asn1Encodable parameters = sigAlgId.Parameters;
-
- if (parameters != null && !derNull.Equals(parameters))
- {
- if (sigAlgId.Algorithm.Equals(PkcsObjectIdentifiers.IdRsassaPss))
- {
- RsassaPssParameters rsaParams = RsassaPssParameters.GetInstance(parameters);
-
- return GetDigestAlgName(rsaParams.HashAlgorithm.Algorithm) + "withRSAandMGF1";
- }
- if (sigAlgId.Algorithm.Equals(X9ObjectIdentifiers.ECDsaWithSha2))
- {
- Asn1Sequence ecDsaParams = Asn1Sequence.GetInstance(parameters);
-
- return GetDigestAlgName((DerObjectIdentifier)ecDsaParams[0]) + "withECDSA";
- }
- }
-
- return sigAlgId.Algorithm.Id;
- }
-
- /**
- * Return the digest algorithm using one of the standard JCA string
- * representations rather than the algorithm identifier (if possible).
- */
- private static string GetDigestAlgName(
- DerObjectIdentifier digestAlgOID)
- {
- if (PkcsObjectIdentifiers.MD5.Equals(digestAlgOID))
- {
- return "MD5";
- }
- else if (OiwObjectIdentifiers.IdSha1.Equals(digestAlgOID))
- {
- return "SHA1";
- }
- else if (NistObjectIdentifiers.IdSha224.Equals(digestAlgOID))
- {
- return "SHA224";
- }
- else if (NistObjectIdentifiers.IdSha256.Equals(digestAlgOID))
- {
- return "SHA256";
- }
- else if (NistObjectIdentifiers.IdSha384.Equals(digestAlgOID))
- {
- return "SHA384";
- }
- else if (NistObjectIdentifiers.IdSha512.Equals(digestAlgOID))
- {
- return "SHA512";
- }
- else if (TeleTrusTObjectIdentifiers.RipeMD128.Equals(digestAlgOID))
- {
- return "RIPEMD128";
- }
- else if (TeleTrusTObjectIdentifiers.RipeMD160.Equals(digestAlgOID))
- {
- return "RIPEMD160";
- }
- else if (TeleTrusTObjectIdentifiers.RipeMD256.Equals(digestAlgOID))
- {
- return "RIPEMD256";
- }
- else if (CryptoProObjectIdentifiers.GostR3411.Equals(digestAlgOID))
- {
- return "GOST3411";
- }
- else
- {
- return digestAlgOID.Id;
- }
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509Utilities.cs b/BCCrypto/src/x509/X509Utilities.cs
deleted file mode 100644
index 52a122c..0000000
--- a/BCCrypto/src/x509/X509Utilities.cs
+++ /dev/null
@@ -1,187 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.CryptoPro;
-using Org.BouncyCastle.Asn1.Nist;
-using Org.BouncyCastle.Asn1.Oiw;
-using Org.BouncyCastle.Asn1.Pkcs;
-using Org.BouncyCastle.Asn1.TeleTrust;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Asn1.X9;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.X509
-{
- internal class X509Utilities
- {
- private static readonly IDictionary algorithms = Platform.CreateHashtable();
- private static readonly IDictionary exParams = Platform.CreateHashtable();
- private static readonly ISet noParams = new HashSet();
-
- static X509Utilities()
- {
- algorithms.Add("MD2WITHRSAENCRYPTION", PkcsObjectIdentifiers.MD2WithRsaEncryption);
- algorithms.Add("MD2WITHRSA", PkcsObjectIdentifiers.MD2WithRsaEncryption);
- algorithms.Add("MD5WITHRSAENCRYPTION", PkcsObjectIdentifiers.MD5WithRsaEncryption);
- algorithms.Add("MD5WITHRSA", PkcsObjectIdentifiers.MD5WithRsaEncryption);
- 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("RIPEMD160WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
- algorithms.Add("RIPEMD160WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
- algorithms.Add("RIPEMD128WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
- algorithms.Add("RIPEMD128WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
- algorithms.Add("RIPEMD256WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
- algorithms.Add("RIPEMD256WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
- 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);
- algorithms.Add("GOST3411WITHGOST3410", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
- algorithms.Add("GOST3411WITHGOST3410-94", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
- algorithms.Add("GOST3411WITHECGOST3410", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
- algorithms.Add("GOST3411WITHECGOST3410-2001", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
- algorithms.Add("GOST3411WITHGOST3410-2001", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
-
- //
- // 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);
-
- //
- // RFC 4491
- //
- noParams.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
- noParams.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
-
- //
- // explicit params
- //
- AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1, DerNull.Instance);
- exParams.Add("SHA1WITHRSAANDMGF1", CreatePssParams(sha1AlgId, 20));
-
- AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha224, DerNull.Instance);
- exParams.Add("SHA224WITHRSAANDMGF1", CreatePssParams(sha224AlgId, 28));
-
- AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha256, DerNull.Instance);
- exParams.Add("SHA256WITHRSAANDMGF1", CreatePssParams(sha256AlgId, 32));
-
- AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha384, DerNull.Instance);
- exParams.Add("SHA384WITHRSAANDMGF1", CreatePssParams(sha384AlgId, 48));
-
- AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha512, DerNull.Instance);
- exParams.Add("SHA512WITHRSAANDMGF1", CreatePssParams(sha512AlgId, 64));
- }
-
- private static RsassaPssParameters CreatePssParams(
- AlgorithmIdentifier hashAlgId,
- int saltSize)
- {
- return new RsassaPssParameters(
- hashAlgId,
- new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, hashAlgId),
- new DerInteger(saltSize),
- new DerInteger(1));
- }
-
- internal static DerObjectIdentifier GetAlgorithmOid(
- string algorithmName)
- {
- algorithmName = Platform.ToUpperInvariant(algorithmName);
-
- if (algorithms.Contains(algorithmName))
- {
- return (DerObjectIdentifier) algorithms[algorithmName];
- }
-
- return new DerObjectIdentifier(algorithmName);
- }
-
- internal static AlgorithmIdentifier GetSigAlgID(
- DerObjectIdentifier sigOid,
- string algorithmName)
- {
- if (noParams.Contains(sigOid))
- {
- return new AlgorithmIdentifier(sigOid);
- }
-
- algorithmName = Platform.ToUpperInvariant(algorithmName);
-
- if (exParams.Contains(algorithmName))
- {
- return new AlgorithmIdentifier(sigOid, (Asn1Encodable) exParams[algorithmName]);
- }
-
- return new AlgorithmIdentifier(sigOid, DerNull.Instance);
- }
-
- internal static IEnumerable GetAlgNames()
- {
- return new EnumerableProxy(algorithms.Keys);
- }
-
- internal static byte[] GetSignatureForObject(
- DerObjectIdentifier sigOid, // TODO Redundant now?
- string sigName,
- AsymmetricKeyParameter privateKey,
- SecureRandom random,
- Asn1Encodable ae)
- {
- if (sigOid == null)
- throw new ArgumentNullException("sigOid");
-
- ISigner sig = SignerUtilities.GetSigner(sigName);
-
- if (random != null)
- {
- sig.Init(true, new ParametersWithRandom(privateKey, random));
- }
- else
- {
- sig.Init(true, privateKey);
- }
-
- byte[] encoded = ae.GetDerEncoded();
- sig.BlockUpdate(encoded, 0, encoded.Length);
-
- return sig.GenerateSignature();
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509V1CertificateGenerator.cs b/BCCrypto/src/x509/X509V1CertificateGenerator.cs
deleted file mode 100644
index 9adebcb..0000000
--- a/BCCrypto/src/x509/X509V1CertificateGenerator.cs
+++ /dev/null
@@ -1,210 +0,0 @@
-using System;
-using System.IO;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Crypto.Operators;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.X509
-{
- ///
- /// Class to Generate X509V1 Certificates.
- ///
- public class X509V1CertificateGenerator
- {
- private V1TbsCertificateGenerator tbsGen;
- private DerObjectIdentifier sigOID;
- private AlgorithmIdentifier sigAlgId;
- private string signatureAlgorithm;
-
- ///
- /// Default Constructor.
- ///
- public X509V1CertificateGenerator()
- {
- tbsGen = new V1TbsCertificateGenerator();
- }
-
- ///
- /// Reset the generator.
- ///
- public void Reset()
- {
- tbsGen = new V1TbsCertificateGenerator();
- }
-
- ///
- /// Set the certificate's serial number.
- ///
- /// Make serial numbers long, if you have no serial number policy make sure the number is at least 16 bytes of secure random data.
- /// You will be surprised how ugly a serial number collision can get.
- /// The serial number.
- public void SetSerialNumber(
- BigInteger serialNumber)
- {
- if (serialNumber.SignValue <= 0)
- {
- throw new ArgumentException("serial number must be a positive integer", "serialNumber");
- }
-
- tbsGen.SetSerialNumber(new DerInteger(serialNumber));
- }
-
- ///
- /// Set the issuer distinguished name.
- /// The issuer is the entity whose private key is used to sign the certificate.
- ///
- /// The issuers DN.
- public void SetIssuerDN(
- X509Name issuer)
- {
- tbsGen.SetIssuer(issuer);
- }
-
- ///
- /// Set the date that this certificate is to be valid from.
- ///
- ///
- public void SetNotBefore(
- DateTime date)
- {
- tbsGen.SetStartDate(new Time(date));
- }
-
- ///
- /// Set the date after which this certificate will no longer be valid.
- ///
- ///
- public void SetNotAfter(
- DateTime date)
- {
- tbsGen.SetEndDate(new Time(date));
- }
-
- ///
- /// Set the subject distinguished name.
- /// The subject describes the entity associated with the public key.
- ///
- ///
- public void SetSubjectDN(
- X509Name subject)
- {
- tbsGen.SetSubject(subject);
- }
-
- ///
- /// Set the public key that this certificate identifies.
- ///
- ///
- public void SetPublicKey(
- AsymmetricKeyParameter publicKey)
- {
- try
- {
- tbsGen.SetSubjectPublicKeyInfo(
- SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey));
- }
- catch (Exception e)
- {
- throw new ArgumentException("unable to process key - " + e.ToString());
- }
- }
-
- ///
- /// Set the signature algorithm that will be used to sign this certificate.
- /// This can be either a name or an OID, names are treated as case insensitive.
- ///
- /// string representation of the algorithm name
- [Obsolete("Not needed if Generate used with an ISignatureFactory")]
- public void SetSignatureAlgorithm(
- string signatureAlgorithm)
- {
- this.signatureAlgorithm = signatureAlgorithm;
-
- try
- {
- sigOID = X509Utilities.GetAlgorithmOid(signatureAlgorithm);
- }
- catch (Exception)
- {
- throw new ArgumentException("Unknown signature type requested", "signatureAlgorithm");
- }
-
- sigAlgId = X509Utilities.GetSigAlgID(sigOID, signatureAlgorithm);
-
- tbsGen.SetSignature(sigAlgId);
- }
-
- ///
- /// Generate a new X509Certificate.
- ///
- /// The private key of the issuer used to sign this certificate.
- /// An X509Certificate.
- [Obsolete("Use Generate with an ISignatureFactory")]
- public X509Certificate Generate(
- AsymmetricKeyParameter privateKey)
- {
- return Generate(privateKey, null);
- }
-
- ///
- /// Generate a new X509Certificate specifying a SecureRandom instance that you would like to use.
- ///
- /// The private key of the issuer used to sign this certificate.
- /// The Secure Random you want to use.
- /// An X509Certificate.
- [Obsolete("Use Generate with an ISignatureFactory")]
- public X509Certificate Generate(
- AsymmetricKeyParameter privateKey,
- SecureRandom random)
- {
- return Generate(new Asn1SignatureFactory(signatureAlgorithm, privateKey, random));
- }
-
- ///
- /// Generate a new X509Certificate using the passed in SignatureCalculator.
- ///
- /// A signature calculator factory with the necessary algorithm details.
- /// An X509Certificate.
- public X509Certificate Generate(ISignatureFactory signatureCalculatorFactory)
- {
- tbsGen.SetSignature ((AlgorithmIdentifier)signatureCalculatorFactory.AlgorithmDetails);
-
- TbsCertificateStructure tbsCert = tbsGen.GenerateTbsCertificate();
-
- IStreamCalculator streamCalculator = signatureCalculatorFactory.CreateCalculator();
-
- byte[] encoded = tbsCert.GetDerEncoded();
-
- streamCalculator.Stream.Write(encoded, 0, encoded.Length);
-
- Platform.Dispose(streamCalculator.Stream);
-
- return GenerateJcaObject(tbsCert, (AlgorithmIdentifier)signatureCalculatorFactory.AlgorithmDetails, ((IBlockResult)streamCalculator.GetResult()).Collect());
- }
-
- private X509Certificate GenerateJcaObject(
- TbsCertificateStructure tbsCert,
- AlgorithmIdentifier sigAlg,
- byte[] signature)
- {
- return new X509Certificate(
- new X509CertificateStructure(tbsCert, sigAlg, new DerBitString(signature)));
- }
-
- ///
- /// Allows enumeration of the signature names supported by the generator.
- ///
- public IEnumerable SignatureAlgNames
- {
- get { return X509Utilities.GetAlgNames(); }
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509V2AttributeCertificate.cs b/BCCrypto/src/x509/X509V2AttributeCertificate.cs
deleted file mode 100644
index c41b312..0000000
--- a/BCCrypto/src/x509/X509V2AttributeCertificate.cs
+++ /dev/null
@@ -1,280 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Operators;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.X509
-{
- /// An implementation of a version 2 X.509 Attribute Certificate.
- public class X509V2AttributeCertificate
- : X509ExtensionBase, IX509AttributeCertificate
- {
- private readonly AttributeCertificate cert;
- private readonly DateTime notBefore;
- private readonly DateTime notAfter;
-
- private static AttributeCertificate GetObject(Stream input)
- {
- try
- {
- return AttributeCertificate.GetInstance(Asn1Object.FromStream(input));
- }
- catch (IOException e)
- {
- throw e;
- }
- catch (Exception e)
- {
- throw new IOException("exception decoding certificate structure", e);
- }
- }
-
- public X509V2AttributeCertificate(
- Stream encIn)
- : this(GetObject(encIn))
- {
- }
-
- public X509V2AttributeCertificate(
- byte[] encoded)
- : this(new MemoryStream(encoded, false))
- {
- }
-
- internal X509V2AttributeCertificate(
- AttributeCertificate cert)
- {
- this.cert = cert;
-
- try
- {
- this.notAfter = cert.ACInfo.AttrCertValidityPeriod.NotAfterTime.ToDateTime();
- this.notBefore = cert.ACInfo.AttrCertValidityPeriod.NotBeforeTime.ToDateTime();
- }
- catch (Exception e)
- {
- throw new IOException("invalid data structure in certificate!", e);
- }
- }
-
- public virtual int Version
- {
- get { return cert.ACInfo.Version.Value.IntValue + 1; }
- }
-
- public virtual BigInteger SerialNumber
- {
- get { return cert.ACInfo.SerialNumber.Value; }
- }
-
- public virtual AttributeCertificateHolder Holder
- {
- get
- {
- return new AttributeCertificateHolder((Asn1Sequence)cert.ACInfo.Holder.ToAsn1Object());
- }
- }
-
- public virtual AttributeCertificateIssuer Issuer
- {
- get
- {
- return new AttributeCertificateIssuer(cert.ACInfo.Issuer);
- }
- }
-
- public virtual DateTime NotBefore
- {
- get { return notBefore; }
- }
-
- public virtual DateTime NotAfter
- {
- get { return notAfter; }
- }
-
- public virtual bool[] GetIssuerUniqueID()
- {
- DerBitString id = cert.ACInfo.IssuerUniqueID;
-
- if (id != null)
- {
- byte[] bytes = id.GetBytes();
- bool[] boolId = new bool[bytes.Length * 8 - id.PadBits];
-
- for (int i = 0; i != boolId.Length; i++)
- {
- //boolId[i] = (bytes[i / 8] & (0x80 >>> (i % 8))) != 0;
- boolId[i] = (bytes[i / 8] & (0x80 >> (i % 8))) != 0;
- }
-
- return boolId;
- }
-
- return null;
- }
-
- public virtual bool IsValidNow
- {
- get { return IsValid(DateTime.UtcNow); }
- }
-
- public virtual bool IsValid(
- DateTime date)
- {
- return date.CompareTo(NotBefore) >= 0 && date.CompareTo(NotAfter) <= 0;
- }
-
- public virtual void CheckValidity()
- {
- this.CheckValidity(DateTime.UtcNow);
- }
-
- public virtual void CheckValidity(
- DateTime date)
- {
- if (date.CompareTo(NotAfter) > 0)
- throw new CertificateExpiredException("certificate expired on " + NotAfter);
- if (date.CompareTo(NotBefore) < 0)
- throw new CertificateNotYetValidException("certificate not valid until " + NotBefore);
- }
-
- public virtual AlgorithmIdentifier SignatureAlgorithm
- {
- get { return cert.SignatureAlgorithm; }
- }
-
- public virtual byte[] GetSignature()
- {
- return cert.GetSignatureOctets();
- }
-
- public virtual void Verify(
- AsymmetricKeyParameter key)
- {
- CheckSignature(new Asn1VerifierFactory(cert.SignatureAlgorithm, key));
- }
-
- ///
- /// Verify the certificate's signature using a verifier created using the passed in verifier provider.
- ///
- /// An appropriate provider for verifying the certificate's signature.
- /// True if the signature is valid.
- /// If verifier provider is not appropriate or the certificate algorithm is invalid.
- public virtual void Verify(
- IVerifierFactoryProvider verifierProvider)
- {
- CheckSignature(verifierProvider.CreateVerifierFactory(cert.SignatureAlgorithm));
- }
-
- protected virtual void CheckSignature(
- IVerifierFactory verifier)
- {
- if (!cert.SignatureAlgorithm.Equals(cert.ACInfo.Signature))
- {
- throw new CertificateException("Signature algorithm in certificate info not same as outer certificate");
- }
-
- IStreamCalculator streamCalculator = verifier.CreateCalculator();
-
- try
- {
- byte[] b = this.cert.ACInfo.GetEncoded();
-
- streamCalculator.Stream.Write(b, 0, b.Length);
-
- Platform.Dispose(streamCalculator.Stream);
- }
- catch (IOException e)
- {
- throw new SignatureException("Exception encoding certificate info object", e);
- }
-
- if (!((IVerifier)streamCalculator.GetResult()).IsVerified(this.GetSignature()))
- {
- throw new InvalidKeyException("Public key presented not for certificate signature");
- }
- }
-
- public virtual byte[] GetEncoded()
- {
- return cert.GetEncoded();
- }
-
- protected override X509Extensions GetX509Extensions()
- {
- return cert.ACInfo.Extensions;
- }
-
- public virtual X509Attribute[] GetAttributes()
- {
- Asn1Sequence seq = cert.ACInfo.Attributes;
- X509Attribute[] attrs = new X509Attribute[seq.Count];
-
- for (int i = 0; i != seq.Count; i++)
- {
- attrs[i] = new X509Attribute((Asn1Encodable)seq[i]);
- }
-
- return attrs;
- }
-
- public virtual X509Attribute[] GetAttributes(
- string oid)
- {
- Asn1Sequence seq = cert.ACInfo.Attributes;
- IList list = Platform.CreateArrayList();
-
- for (int i = 0; i != seq.Count; i++)
- {
- X509Attribute attr = new X509Attribute((Asn1Encodable)seq[i]);
- if (attr.Oid.Equals(oid))
- {
- list.Add(attr);
- }
- }
-
- if (list.Count < 1)
- {
- return null;
- }
-
- X509Attribute[] result = new X509Attribute[list.Count];
- for (int i = 0; i < list.Count; ++i)
- {
- result[i] = (X509Attribute)list[i];
- }
- return result;
- }
-
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
-
- X509V2AttributeCertificate other = obj as X509V2AttributeCertificate;
-
- if (other == null)
- return false;
-
- return cert.Equals(other.cert);
-
- // NB: May prefer this implementation of Equals if more than one certificate implementation in play
- //return Arrays.AreEqual(this.GetEncoded(), other.GetEncoded());
- }
-
- public override int GetHashCode()
- {
- return cert.GetHashCode();
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509V2AttributeCertificateGenerator.cs b/BCCrypto/src/x509/X509V2AttributeCertificateGenerator.cs
deleted file mode 100644
index bf046cd..0000000
--- a/BCCrypto/src/x509/X509V2AttributeCertificateGenerator.cs
+++ /dev/null
@@ -1,203 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Operators;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.X509
-{
- /// Class to produce an X.509 Version 2 AttributeCertificate.
- public class X509V2AttributeCertificateGenerator
- {
- private readonly X509ExtensionsGenerator extGenerator = new X509ExtensionsGenerator();
-
- private V2AttributeCertificateInfoGenerator acInfoGen;
- private DerObjectIdentifier sigOID;
- private AlgorithmIdentifier sigAlgId;
- private string signatureAlgorithm;
-
- public X509V2AttributeCertificateGenerator()
- {
- acInfoGen = new V2AttributeCertificateInfoGenerator();
- }
-
- /// Reset the generator
- public void Reset()
- {
- acInfoGen = new V2AttributeCertificateInfoGenerator();
- extGenerator.Reset();
- }
-
- /// Set the Holder of this Attribute Certificate.
- public void SetHolder(
- AttributeCertificateHolder holder)
- {
- acInfoGen.SetHolder(holder.holder);
- }
-
- /// Set the issuer.
- public void SetIssuer(
- AttributeCertificateIssuer issuer)
- {
- acInfoGen.SetIssuer(AttCertIssuer.GetInstance(issuer.form));
- }
-
- /// Set the serial number for the certificate.
- public void SetSerialNumber(
- BigInteger serialNumber)
- {
- acInfoGen.SetSerialNumber(new DerInteger(serialNumber));
- }
-
- public void SetNotBefore(
- DateTime date)
- {
- acInfoGen.SetStartDate(new DerGeneralizedTime(date));
- }
-
- public void SetNotAfter(
- DateTime date)
- {
- acInfoGen.SetEndDate(new DerGeneralizedTime(date));
- }
-
- ///
- /// Set the signature algorithm. This can be either a name or an OID, names
- /// are treated as case insensitive.
- ///
- /// The algorithm name.
- [Obsolete("Not needed if Generate used with an ISignatureFactory")]
- public void SetSignatureAlgorithm(
- string signatureAlgorithm)
- {
- this.signatureAlgorithm = signatureAlgorithm;
-
- try
- {
- sigOID = X509Utilities.GetAlgorithmOid(signatureAlgorithm);
- }
- catch (Exception)
- {
- throw new ArgumentException("Unknown signature type requested");
- }
-
- sigAlgId = X509Utilities.GetSigAlgID(sigOID, signatureAlgorithm);
-
- acInfoGen.SetSignature(sigAlgId);
- }
-
- /// Add an attribute.
- public void AddAttribute(
- X509Attribute attribute)
- {
- acInfoGen.AddAttribute(AttributeX509.GetInstance(attribute.ToAsn1Object()));
- }
-
- public void SetIssuerUniqueId(
- bool[] iui)
- {
- // TODO convert bool array to bit string
- //acInfoGen.SetIssuerUniqueID(iui);
- throw Platform.CreateNotImplementedException("SetIssuerUniqueId()");
- }
-
- /// Add a given extension field for the standard extensions tag.
- public void AddExtension(
- string oid,
- bool critical,
- Asn1Encodable extensionValue)
- {
- extGenerator.AddExtension(new DerObjectIdentifier(oid), critical, extensionValue);
- }
-
- ///
- /// Add a given extension field for the standard extensions tag.
- /// The value parameter becomes the contents of the octet string associated
- /// with the extension.
- ///
- public void AddExtension(
- string oid,
- bool critical,
- byte[] extensionValue)
- {
- extGenerator.AddExtension(new DerObjectIdentifier(oid), critical, extensionValue);
- }
-
- ///
- /// Generate an X509 certificate, based on the current issuer and subject.
- ///
- [Obsolete("Use Generate with an ISignatureFactory")]
- public IX509AttributeCertificate Generate(
- AsymmetricKeyParameter privateKey)
- {
- return Generate(privateKey, null);
- }
-
- ///
- /// Generate an X509 certificate, based on the current issuer and subject,
- /// using the supplied source of randomness, if required.
- ///
- [Obsolete("Use Generate with an ISignatureFactory")]
- public IX509AttributeCertificate Generate(
- AsymmetricKeyParameter privateKey,
- SecureRandom random)
- {
- return Generate(new Asn1SignatureFactory(signatureAlgorithm, privateKey, random));
- }
-
- ///
- /// Generate a new X.509 Attribute Certificate using the passed in SignatureCalculator.
- ///
- /// A signature calculator factory with the necessary algorithm details.
- /// An IX509AttributeCertificate.
- public IX509AttributeCertificate Generate(ISignatureFactory signatureCalculatorFactory)
- {
- if (!extGenerator.IsEmpty)
- {
- acInfoGen.SetExtensions(extGenerator.Generate());
- }
-
- AttributeCertificateInfo acInfo = acInfoGen.GenerateAttributeCertificateInfo();
-
- byte[] encoded = acInfo.GetDerEncoded();
-
- IStreamCalculator streamCalculator = signatureCalculatorFactory.CreateCalculator();
-
- streamCalculator.Stream.Write(encoded, 0, encoded.Length);
-
- Platform.Dispose(streamCalculator.Stream);
-
- Asn1EncodableVector v = new Asn1EncodableVector();
-
- v.Add(acInfo, (AlgorithmIdentifier)signatureCalculatorFactory.AlgorithmDetails);
-
- try
- {
- v.Add(new DerBitString(((IBlockResult)streamCalculator.GetResult()).Collect()));
-
- return new X509V2AttributeCertificate(AttributeCertificate.GetInstance(new DerSequence(v)));
- }
- catch (Exception e)
- {
- // TODO
-// throw new ExtCertificateEncodingException("constructed invalid certificate", e);
- throw new CertificateEncodingException("constructed invalid certificate", e);
- }
- }
-
- ///
- /// Allows enumeration of the signature names supported by the generator.
- ///
- public IEnumerable SignatureAlgNames
- {
- get { return X509Utilities.GetAlgNames(); }
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509V2CRLGenerator.cs b/BCCrypto/src/x509/X509V2CRLGenerator.cs
deleted file mode 100644
index 566d502..0000000
--- a/BCCrypto/src/x509/X509V2CRLGenerator.cs
+++ /dev/null
@@ -1,278 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Operators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-
-namespace Org.BouncyCastle.X509
-{
- /**
- * class to produce an X.509 Version 2 CRL.
- */
- public class X509V2CrlGenerator
- {
- private readonly X509ExtensionsGenerator extGenerator = new X509ExtensionsGenerator();
-
- private V2TbsCertListGenerator tbsGen;
- private DerObjectIdentifier sigOID;
- private AlgorithmIdentifier sigAlgId;
- private string signatureAlgorithm;
-
- public X509V2CrlGenerator()
- {
- tbsGen = new V2TbsCertListGenerator();
- }
-
- /**
- * reset the generator
- */
- public void Reset()
- {
- tbsGen = new V2TbsCertListGenerator();
- extGenerator.Reset();
- }
-
- /**
- * Set the issuer distinguished name - the issuer is the entity whose private key is used to sign the
- * certificate.
- */
- public void SetIssuerDN(
- X509Name issuer)
- {
- tbsGen.SetIssuer(issuer);
- }
-
- public void SetThisUpdate(
- DateTime date)
- {
- tbsGen.SetThisUpdate(new Time(date));
- }
-
- public void SetNextUpdate(
- DateTime date)
- {
- tbsGen.SetNextUpdate(new Time(date));
- }
-
- /**
- * Reason being as indicated by CrlReason, i.e. CrlReason.KeyCompromise
- * or 0 if CrlReason is not to be used
- **/
- public void AddCrlEntry(
- BigInteger userCertificate,
- DateTime revocationDate,
- int reason)
- {
- tbsGen.AddCrlEntry(new DerInteger(userCertificate), new Time(revocationDate), reason);
- }
-
- /**
- * Add a CRL entry with an Invalidity Date extension as well as a CrlReason extension.
- * Reason being as indicated by CrlReason, i.e. CrlReason.KeyCompromise
- * or 0 if CrlReason is not to be used
- **/
- public void AddCrlEntry(
- BigInteger userCertificate,
- DateTime revocationDate,
- int reason,
- DateTime invalidityDate)
- {
- tbsGen.AddCrlEntry(new DerInteger(userCertificate), new Time(revocationDate), reason, new DerGeneralizedTime(invalidityDate));
- }
-
- /**
- * Add a CRL entry with extensions.
- **/
- public void AddCrlEntry(
- BigInteger userCertificate,
- DateTime revocationDate,
- X509Extensions extensions)
- {
- tbsGen.AddCrlEntry(new DerInteger(userCertificate), new Time(revocationDate), extensions);
- }
-
- /**
- * Add the CRLEntry objects contained in a previous CRL.
- *
- * @param other the X509Crl to source the other entries from.
- */
- public void AddCrl(
- X509Crl other)
- {
- if (other == null)
- throw new ArgumentNullException("other");
-
- ISet revocations = other.GetRevokedCertificates();
-
- if (revocations != null)
- {
- foreach (X509CrlEntry entry in revocations)
- {
- try
- {
- tbsGen.AddCrlEntry(
- Asn1Sequence.GetInstance(
- Asn1Object.FromByteArray(entry.GetEncoded())));
- }
- catch (IOException e)
- {
- throw new CrlException("exception processing encoding of CRL", e);
- }
- }
- }
- }
-
- ///
- /// Set the signature algorithm that will be used to sign this CRL.
- ///
- ///
- [Obsolete("Not needed if Generate used with an ISignatureFactory")]
- public void SetSignatureAlgorithm(
- string signatureAlgorithm)
- {
- this.signatureAlgorithm = signatureAlgorithm;
-
- try
- {
- sigOID = X509Utilities.GetAlgorithmOid(signatureAlgorithm);
- }
- catch (Exception e)
- {
- throw new ArgumentException("Unknown signature type requested", e);
- }
-
- sigAlgId = X509Utilities.GetSigAlgID(sigOID, signatureAlgorithm);
-
- tbsGen.SetSignature(sigAlgId);
- }
-
- /**
- * add a given extension field for the standard extensions tag (tag 0)
- */
- public void AddExtension(
- string oid,
- bool critical,
- Asn1Encodable extensionValue)
- {
- extGenerator.AddExtension(new DerObjectIdentifier(oid), critical, extensionValue);
- }
-
- /**
- * add a given extension field for the standard extensions tag (tag 0)
- */
- public void AddExtension(
- DerObjectIdentifier oid,
- bool critical,
- Asn1Encodable extensionValue)
- {
- extGenerator.AddExtension(oid, critical, extensionValue);
- }
-
- /**
- * add a given extension field for the standard extensions tag (tag 0)
- */
- public void AddExtension(
- string oid,
- bool critical,
- byte[] extensionValue)
- {
- extGenerator.AddExtension(new DerObjectIdentifier(oid), critical, new DerOctetString(extensionValue));
- }
-
- /**
- * add a given extension field for the standard extensions tag (tag 0)
- */
- public void AddExtension(
- DerObjectIdentifier oid,
- bool critical,
- byte[] extensionValue)
- {
- extGenerator.AddExtension(oid, critical, new DerOctetString(extensionValue));
- }
-
- ///
- /// Generate an X.509 CRL, based on the current issuer and subject.
- ///
- /// The private key of the issuer that is signing this certificate.
- /// An X509Crl.
- [Obsolete("Use Generate with an ISignatureFactory")]
- public X509Crl Generate(
- AsymmetricKeyParameter privateKey)
- {
- return Generate(privateKey, null);
- }
-
- ///
- /// Generate an X.509 CRL, based on the current issuer and subject using the specified secure random.
- ///
- /// The private key of the issuer that is signing this certificate.
- /// Your Secure Random instance.
- /// An X509Crl.
- [Obsolete("Use Generate with an ISignatureFactory")]
- public X509Crl Generate(
- AsymmetricKeyParameter privateKey,
- SecureRandom random)
- {
- return Generate(new Asn1SignatureFactory(signatureAlgorithm, privateKey, random));
- }
-
- ///
- /// Generate a new X509Crl using the passed in SignatureCalculator.
- ///
- /// A signature calculator factory with the necessary algorithm details.
- /// An X509Crl.
- public X509Crl Generate(ISignatureFactory signatureCalculatorFactory)
- {
- tbsGen.SetSignature((AlgorithmIdentifier)signatureCalculatorFactory.AlgorithmDetails);
-
- TbsCertificateList tbsCertList = GenerateCertList();
-
- IStreamCalculator streamCalculator = signatureCalculatorFactory.CreateCalculator();
-
- byte[] encoded = tbsCertList.GetDerEncoded();
-
- streamCalculator.Stream.Write(encoded, 0, encoded.Length);
-
- Platform.Dispose(streamCalculator.Stream);
-
- return GenerateJcaObject(tbsCertList, (AlgorithmIdentifier)signatureCalculatorFactory.AlgorithmDetails, ((IBlockResult)streamCalculator.GetResult()).Collect());
- }
-
- private TbsCertificateList GenerateCertList()
- {
- if (!extGenerator.IsEmpty)
- {
- tbsGen.SetExtensions(extGenerator.Generate());
- }
-
- return tbsGen.GenerateTbsCertList();
- }
-
- private X509Crl GenerateJcaObject(
- TbsCertificateList tbsCrl,
- AlgorithmIdentifier algId,
- byte[] signature)
- {
- return new X509Crl(
- CertificateList.GetInstance(
- new DerSequence(tbsCrl, algId, new DerBitString(signature))));
- }
-
- ///
- /// Allows enumeration of the signature names supported by the generator.
- ///
- public IEnumerable SignatureAlgNames
- {
- get { return X509Utilities.GetAlgNames(); }
- }
- }
-}
diff --git a/BCCrypto/src/x509/X509V3CertificateGenerator.cs b/BCCrypto/src/x509/X509V3CertificateGenerator.cs
deleted file mode 100644
index bc619c3..0000000
--- a/BCCrypto/src/x509/X509V3CertificateGenerator.cs
+++ /dev/null
@@ -1,344 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Operators;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.X509.Extension;
-
-namespace Org.BouncyCastle.X509
-{
- ///
- /// A class to Generate Version 3 X509Certificates.
- ///
- public class X509V3CertificateGenerator
- {
- private readonly X509ExtensionsGenerator extGenerator = new X509ExtensionsGenerator();
-
- private V3TbsCertificateGenerator tbsGen;
- private DerObjectIdentifier sigOid;
- private AlgorithmIdentifier sigAlgId;
- private string signatureAlgorithm;
-
- public X509V3CertificateGenerator()
- {
- tbsGen = new V3TbsCertificateGenerator();
- }
-
- ///
- /// Reset the Generator.
- ///
- public void Reset()
- {
- tbsGen = new V3TbsCertificateGenerator();
- extGenerator.Reset();
- }
-
- ///
- /// Set the certificate's serial number.
- ///
- /// Make serial numbers long, if you have no serial number policy make sure the number is at least 16 bytes of secure random data.
- /// You will be surprised how ugly a serial number collision can Get.
- /// The serial number.
- public void SetSerialNumber(
- BigInteger serialNumber)
- {
- if (serialNumber.SignValue <= 0)
- {
- throw new ArgumentException("serial number must be a positive integer", "serialNumber");
- }
-
- tbsGen.SetSerialNumber(new DerInteger(serialNumber));
- }
-
- ///
- /// Set the distinguished name of the issuer.
- /// The issuer is the entity which is signing the certificate.
- ///
- /// The issuer's DN.
- public void SetIssuerDN(
- X509Name issuer)
- {
- tbsGen.SetIssuer(issuer);
- }
-
- ///
- /// Set the date that this certificate is to be valid from.
- ///
- ///
- public void SetNotBefore(
- DateTime date)
- {
- tbsGen.SetStartDate(new Time(date));
- }
-
- ///
- /// Set the date after which this certificate will no longer be valid.
- ///
- ///
- public void SetNotAfter(
- DateTime date)
- {
- tbsGen.SetEndDate(new Time(date));
- }
-
- ///
- /// Set the DN of the entity that this certificate is about.
- ///
- ///
- public void SetSubjectDN(
- X509Name subject)
- {
- tbsGen.SetSubject(subject);
- }
-
- ///
- /// Set the public key that this certificate identifies.
- ///
- ///
- public void SetPublicKey(
- AsymmetricKeyParameter publicKey)
- {
- tbsGen.SetSubjectPublicKeyInfo(SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey));
- }
-
- ///
- /// Set the signature algorithm that will be used to sign this certificate.
- ///
- ///
- [Obsolete("Not needed if Generate used with an ISignatureFactory")]
- public void SetSignatureAlgorithm(
- string signatureAlgorithm)
- {
- this.signatureAlgorithm = signatureAlgorithm;
-
- try
- {
- sigOid = X509Utilities.GetAlgorithmOid(signatureAlgorithm);
- }
- catch (Exception)
- {
- throw new ArgumentException("Unknown signature type requested: " + signatureAlgorithm);
- }
-
- sigAlgId = X509Utilities.GetSigAlgID(sigOid, signatureAlgorithm);
-
- tbsGen.SetSignature(sigAlgId);
- }
-
- ///
- /// Set the subject unique ID - note: it is very rare that it is correct to do this.
- ///
- ///
- public void SetSubjectUniqueID(
- bool[] uniqueID)
- {
- tbsGen.SetSubjectUniqueID(booleanToBitString(uniqueID));
- }
-
- ///
- /// Set the issuer unique ID - note: it is very rare that it is correct to do this.
- ///
- ///
- public void SetIssuerUniqueID(
- bool[] uniqueID)
- {
- tbsGen.SetIssuerUniqueID(booleanToBitString(uniqueID));
- }
-
- private DerBitString booleanToBitString(
- bool[] id)
- {
- byte[] bytes = new byte[(id.Length + 7) / 8];
-
- for (int i = 0; i != id.Length; i++)
- {
- if (id[i])
- {
- bytes[i / 8] |= (byte)(1 << ((7 - (i % 8))));
- }
- }
-
- int pad = id.Length % 8;
-
- if (pad == 0)
- {
- return new DerBitString(bytes);
- }
-
- return new DerBitString(bytes, 8 - pad);
- }
-
- ///
- /// Add a given extension field for the standard extensions tag (tag 3).
- ///
- /// string containing a dotted decimal Object Identifier.
- /// Is it critical.
- /// The value.
- public void AddExtension(
- string oid,
- bool critical,
- Asn1Encodable extensionValue)
- {
- extGenerator.AddExtension(new DerObjectIdentifier(oid), critical, extensionValue);
- }
-
- ///
- /// Add an extension to this certificate.
- ///
- /// Its Object Identifier.
- /// Is it critical.
- /// The value.
- public void AddExtension(
- DerObjectIdentifier oid,
- bool critical,
- Asn1Encodable extensionValue)
- {
- extGenerator.AddExtension(oid, critical, extensionValue);
- }
-
- ///
- /// Add an extension using a string with a dotted decimal OID.
- ///
- /// string containing a dotted decimal Object Identifier.
- /// Is it critical.
- /// byte[] containing the value of this extension.
- public void AddExtension(
- string oid,
- bool critical,
- byte[] extensionValue)
- {
- extGenerator.AddExtension(new DerObjectIdentifier(oid), critical, new DerOctetString(extensionValue));
- }
-
- ///
- /// Add an extension to this certificate.
- ///
- /// Its Object Identifier.
- /// Is it critical.
- /// byte[] containing the value of this extension.
- public void AddExtension(
- DerObjectIdentifier oid,
- bool critical,
- byte[] extensionValue)
- {
- extGenerator.AddExtension(oid, critical, new DerOctetString(extensionValue));
- }
-
- ///
- /// Add a given extension field for the standard extensions tag (tag 3),
- /// copying the extension value from another certificate.
- ///
- public void CopyAndAddExtension(
- string oid,
- bool critical,
- X509Certificate cert)
- {
- CopyAndAddExtension(new DerObjectIdentifier(oid), critical, cert);
- }
-
- /**
- * add a given extension field for the standard extensions tag (tag 3)
- * copying the extension value from another certificate.
- * @throws CertificateParsingException if the extension cannot be extracted.
- */
- public void CopyAndAddExtension(
- DerObjectIdentifier oid,
- bool critical,
- X509Certificate cert)
- {
- Asn1OctetString extValue = cert.GetExtensionValue(oid);
-
- if (extValue == null)
- {
- throw new CertificateParsingException("extension " + oid + " not present");
- }
-
- try
- {
- Asn1Encodable value = X509ExtensionUtilities.FromExtensionValue(extValue);
-
- this.AddExtension(oid, critical, value);
- }
- catch (Exception e)
- {
- throw new CertificateParsingException(e.Message, e);
- }
- }
-
- ///
- /// Generate an X509Certificate.
- ///
- /// The private key of the issuer that is signing this certificate.
- /// An X509Certificate.
- [Obsolete("Use Generate with an ISignatureFactory")]
- public X509Certificate Generate(
- AsymmetricKeyParameter privateKey)
- {
- return Generate(privateKey, null);
- }
-
- ///
- /// Generate an X509Certificate using your own SecureRandom.
- ///
- /// The private key of the issuer that is signing this certificate.
- /// You Secure Random instance.
- /// An X509Certificate.
- [Obsolete("Use Generate with an ISignatureFactory")]
- public X509Certificate Generate(
- AsymmetricKeyParameter privateKey,
- SecureRandom random)
- {
- return Generate(new Asn1SignatureFactory(signatureAlgorithm, privateKey, random));
- }
-
- ///
- /// Generate a new X509Certificate using the passed in SignatureCalculator.
- ///
- /// A signature calculator factory with the necessary algorithm details.
- /// An X509Certificate.
- public X509Certificate Generate(ISignatureFactory signatureCalculatorFactory)
- {
- tbsGen.SetSignature ((AlgorithmIdentifier)signatureCalculatorFactory.AlgorithmDetails);
-
- if (!extGenerator.IsEmpty)
- {
- tbsGen.SetExtensions(extGenerator.Generate());
- }
-
- TbsCertificateStructure tbsCert = tbsGen.GenerateTbsCertificate();
-
- IStreamCalculator streamCalculator = signatureCalculatorFactory.CreateCalculator();
-
- byte[] encoded = tbsCert.GetDerEncoded();
-
- streamCalculator.Stream.Write(encoded, 0, encoded.Length);
-
- Platform.Dispose(streamCalculator.Stream);
-
- return GenerateJcaObject(tbsCert, (AlgorithmIdentifier)signatureCalculatorFactory.AlgorithmDetails, ((IBlockResult)streamCalculator.GetResult()).Collect());
- }
-
- private X509Certificate GenerateJcaObject(
- TbsCertificateStructure tbsCert,
- AlgorithmIdentifier sigAlg,
- byte[] signature)
- {
- return new X509Certificate(
- new X509CertificateStructure(tbsCert, sigAlg, new DerBitString(signature)));
- }
-
- ///
- /// Allows enumeration of the signature names supported by the generator.
- ///
- public IEnumerable SignatureAlgNames
- {
- get { return X509Utilities.GetAlgNames(); }
- }
- }
-}
diff --git a/BCCrypto/src/x509/extension/AuthorityKeyIdentifierStructure.cs b/BCCrypto/src/x509/extension/AuthorityKeyIdentifierStructure.cs
deleted file mode 100644
index 006dc00..0000000
--- a/BCCrypto/src/x509/extension/AuthorityKeyIdentifierStructure.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Security.Certificates;
-
-namespace Org.BouncyCastle.X509.Extension
-{
- /// A high level authority key identifier.
- public class AuthorityKeyIdentifierStructure
- : AuthorityKeyIdentifier
- {
- /**
- * Constructor which will take the byte[] returned from getExtensionValue()
- *
- * @param encodedValue a DER octet encoded string with the extension structure in it.
- * @throws IOException on parsing errors.
- */
- // TODO Add a functional constructor from byte[]?
- public AuthorityKeyIdentifierStructure(
- Asn1OctetString encodedValue)
- : base((Asn1Sequence) X509ExtensionUtilities.FromExtensionValue(encodedValue))
- {
- }
-
- private static Asn1Sequence FromCertificate(
- X509Certificate certificate)
- {
- try
- {
- GeneralName genName = new GeneralName(
- PrincipalUtilities.GetIssuerX509Principal(certificate));
-
- if (certificate.Version == 3)
- {
- Asn1OctetString ext = certificate.GetExtensionValue(X509Extensions.SubjectKeyIdentifier);
-
- if (ext != null)
- {
- Asn1OctetString str = (Asn1OctetString) X509ExtensionUtilities.FromExtensionValue(ext);
-
- return (Asn1Sequence) new AuthorityKeyIdentifier(
- str.GetOctets(), new GeneralNames(genName), certificate.SerialNumber).ToAsn1Object();
- }
- }
-
- SubjectPublicKeyInfo info = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(
- certificate.GetPublicKey());
-
- return (Asn1Sequence) new AuthorityKeyIdentifier(
- info, new GeneralNames(genName), certificate.SerialNumber).ToAsn1Object();
- }
- catch (Exception e)
- {
- throw new CertificateParsingException("Exception extracting certificate details", e);
- }
- }
-
- private static Asn1Sequence FromKey(
- AsymmetricKeyParameter pubKey)
- {
- try
- {
- SubjectPublicKeyInfo info = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pubKey);
-
- return (Asn1Sequence) new AuthorityKeyIdentifier(info).ToAsn1Object();
- }
- catch (Exception e)
- {
- throw new InvalidKeyException("can't process key: " + e);
- }
- }
-
- /**
- * Create an AuthorityKeyIdentifier using the passed in certificate's public
- * key, issuer and serial number.
- *
- * @param certificate the certificate providing the information.
- * @throws CertificateParsingException if there is a problem processing the certificate
- */
- public AuthorityKeyIdentifierStructure(
- X509Certificate certificate)
- : base(FromCertificate(certificate))
- {
- }
-
- /**
- * Create an AuthorityKeyIdentifier using just the hash of the
- * public key.
- *
- * @param pubKey the key to generate the hash from.
- * @throws InvalidKeyException if there is a problem using the key.
- */
- public AuthorityKeyIdentifierStructure(
- AsymmetricKeyParameter pubKey)
- : base(FromKey(pubKey))
- {
- }
- }
-}
diff --git a/BCCrypto/src/x509/extension/SubjectKeyIdentifierStructure.cs b/BCCrypto/src/x509/extension/SubjectKeyIdentifierStructure.cs
deleted file mode 100644
index 4c7b79a..0000000
--- a/BCCrypto/src/x509/extension/SubjectKeyIdentifierStructure.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using System;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Security.Certificates;
-
-namespace Org.BouncyCastle.X509.Extension
-{
- /**
- * A high level subject key identifier.
- */
- public class SubjectKeyIdentifierStructure
- : SubjectKeyIdentifier
- {
- /**
- * Constructor which will take the byte[] returned from getExtensionValue()
- *
- * @param encodedValue a DER octet encoded string with the extension structure in it.
- * @throws IOException on parsing errors.
- */
- public SubjectKeyIdentifierStructure(
- Asn1OctetString encodedValue)
- : base((Asn1OctetString) X509ExtensionUtilities.FromExtensionValue(encodedValue))
- {
- }
-
- private static Asn1OctetString FromPublicKey(
- AsymmetricKeyParameter pubKey)
- {
- try
- {
- SubjectPublicKeyInfo info = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pubKey);
-
- return (Asn1OctetString) new SubjectKeyIdentifier(info).ToAsn1Object();
- }
- catch (Exception e)
- {
- throw new CertificateParsingException("Exception extracting certificate details: " + e.ToString());
- }
- }
-
- public SubjectKeyIdentifierStructure(
- AsymmetricKeyParameter pubKey)
- : base(FromPublicKey(pubKey))
- {
- }
- }
-}
diff --git a/BCCrypto/src/x509/extension/X509ExtensionUtil.cs b/BCCrypto/src/x509/extension/X509ExtensionUtil.cs
deleted file mode 100644
index 5f65ebf..0000000
--- a/BCCrypto/src/x509/extension/X509ExtensionUtil.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Security.Certificates;
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.X509.Extension
-{
- public class X509ExtensionUtilities
- {
- public static Asn1Object FromExtensionValue(
- Asn1OctetString extensionValue)
- {
- return Asn1Object.FromByteArray(extensionValue.GetOctets());
- }
-
- public static ICollection GetIssuerAlternativeNames(
- X509Certificate cert)
- {
- Asn1OctetString extVal = cert.GetExtensionValue(X509Extensions.IssuerAlternativeName);
-
- return GetAlternativeName(extVal);
- }
-
- public static ICollection GetSubjectAlternativeNames(
- X509Certificate cert)
- {
- Asn1OctetString extVal = cert.GetExtensionValue(X509Extensions.SubjectAlternativeName);
-
- return GetAlternativeName(extVal);
- }
-
- private static ICollection GetAlternativeName(
- Asn1OctetString extVal)
- {
- IList temp = Platform.CreateArrayList();
-
- if (extVal != null)
- {
- try
- {
- Asn1Sequence seq = DerSequence.GetInstance(FromExtensionValue(extVal));
-
- foreach (Asn1Encodable primName in seq)
- {
- IList list = Platform.CreateArrayList();
- GeneralName genName = GeneralName.GetInstance(primName);
-
- list.Add(genName.TagNo);
-
- switch (genName.TagNo)
- {
- case GeneralName.EdiPartyName:
- case GeneralName.X400Address:
- case GeneralName.OtherName:
- list.Add(genName.Name.ToAsn1Object());
- break;
- case GeneralName.DirectoryName:
- list.Add(X509Name.GetInstance(genName.Name).ToString());
- break;
- case GeneralName.DnsName:
- case GeneralName.Rfc822Name:
- case GeneralName.UniformResourceIdentifier:
- list.Add(((IAsn1String)genName.Name).GetString());
- break;
- case GeneralName.RegisteredID:
- list.Add(DerObjectIdentifier.GetInstance(genName.Name).Id);
- break;
- case GeneralName.IPAddress:
- list.Add(DerOctetString.GetInstance(genName.Name).GetOctets());
- break;
- default:
- throw new IOException("Bad tag number: " + genName.TagNo);
- }
-
- temp.Add(list);
- }
- }
- catch (Exception e)
- {
- throw new CertificateParsingException(e.Message);
- }
- }
-
- return temp;
- }
- }
-}
diff --git a/BCCrypto/src/x509/store/IX509Selector.cs b/BCCrypto/src/x509/store/IX509Selector.cs
deleted file mode 100644
index 75358cb..0000000
--- a/BCCrypto/src/x509/store/IX509Selector.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.X509.Store
-{
- public interface IX509Selector
-#if !(SILVERLIGHT || PORTABLE)
- : ICloneable
-#endif
- {
-#if SILVERLIGHT || PORTABLE
- object Clone();
-#endif
- bool Match(object obj);
- }
-}
diff --git a/BCCrypto/src/x509/store/IX509Store.cs b/BCCrypto/src/x509/store/IX509Store.cs
deleted file mode 100644
index e5c3a46..0000000
--- a/BCCrypto/src/x509/store/IX509Store.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.X509.Store
-{
- public interface IX509Store
- {
-// void Init(IX509StoreParameters parameters);
- ICollection GetMatches(IX509Selector selector);
- }
-}
diff --git a/BCCrypto/src/x509/store/IX509StoreParameters.cs b/BCCrypto/src/x509/store/IX509StoreParameters.cs
deleted file mode 100644
index aee3036..0000000
--- a/BCCrypto/src/x509/store/IX509StoreParameters.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.X509.Store
-{
- public interface IX509StoreParameters
- {
- }
-}
diff --git a/BCCrypto/src/x509/store/NoSuchStoreException.cs b/BCCrypto/src/x509/store/NoSuchStoreException.cs
deleted file mode 100644
index 28b1889..0000000
--- a/BCCrypto/src/x509/store/NoSuchStoreException.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.X509.Store
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class NoSuchStoreException
- : X509StoreException
- {
- public NoSuchStoreException()
- {
- }
-
- public NoSuchStoreException(
- string message)
- : base(message)
- {
- }
-
- public NoSuchStoreException(
- string message,
- Exception e)
- : base(message, e)
- {
- }
- }
-}
diff --git a/BCCrypto/src/x509/store/X509AttrCertStoreSelector.cs b/BCCrypto/src/x509/store/X509AttrCertStoreSelector.cs
deleted file mode 100644
index 9f1dc20..0000000
--- a/BCCrypto/src/x509/store/X509AttrCertStoreSelector.cs
+++ /dev/null
@@ -1,376 +0,0 @@
-using System;
-using System.Collections;
-using System.IO;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Date;
-using Org.BouncyCastle.X509.Extension;
-
-namespace Org.BouncyCastle.X509.Store
-{
- /**
- * This class is an Selector like implementation to select
- * attribute certificates from a given set of criteria.
- *
- * @see org.bouncycastle.x509.X509AttributeCertificate
- * @see org.bouncycastle.x509.X509Store
- */
- public class X509AttrCertStoreSelector
- : IX509Selector
- {
- // TODO: name constraints???
-
- private IX509AttributeCertificate attributeCert;
- private DateTimeObject attributeCertificateValid;
- private AttributeCertificateHolder holder;
- private AttributeCertificateIssuer issuer;
- private BigInteger serialNumber;
- private ISet targetNames = new HashSet();
- private ISet targetGroups = new HashSet();
-
- public X509AttrCertStoreSelector()
- {
- }
-
- private X509AttrCertStoreSelector(
- X509AttrCertStoreSelector o)
- {
- this.attributeCert = o.attributeCert;
- this.attributeCertificateValid = o.attributeCertificateValid;
- this.holder = o.holder;
- this.issuer = o.issuer;
- this.serialNumber = o.serialNumber;
- this.targetGroups = new HashSet(o.targetGroups);
- this.targetNames = new HashSet(o.targetNames);
- }
-
- ///
- /// Decides if the given attribute certificate should be selected.
- ///
- /// The attribute certificate to be checked.
- /// true if the object matches this selector.
- public bool Match(
- object obj)
- {
- if (obj == null)
- throw new ArgumentNullException("obj");
-
- IX509AttributeCertificate attrCert = obj as IX509AttributeCertificate;
-
- if (attrCert == null)
- return false;
-
- if (this.attributeCert != null && !this.attributeCert.Equals(attrCert))
- return false;
-
- if (serialNumber != null && !attrCert.SerialNumber.Equals(serialNumber))
- return false;
-
- if (holder != null && !attrCert.Holder.Equals(holder))
- return false;
-
- if (issuer != null && !attrCert.Issuer.Equals(issuer))
- return false;
-
- if (attributeCertificateValid != null && !attrCert.IsValid(attributeCertificateValid.Value))
- return false;
-
- if (targetNames.Count > 0 || targetGroups.Count > 0)
- {
- Asn1OctetString targetInfoExt = attrCert.GetExtensionValue(
- X509Extensions.TargetInformation);
-
- if (targetInfoExt != null)
- {
- TargetInformation targetinfo;
- try
- {
- targetinfo = TargetInformation.GetInstance(
- X509ExtensionUtilities.FromExtensionValue(targetInfoExt));
- }
- catch (Exception)
- {
- return false;
- }
-
- Targets[] targetss = targetinfo.GetTargetsObjects();
-
- if (targetNames.Count > 0)
- {
- bool found = false;
-
- for (int i = 0; i < targetss.Length && !found; i++)
- {
- Target[] targets = targetss[i].GetTargets();
-
- for (int j = 0; j < targets.Length; j++)
- {
- GeneralName targetName = targets[j].TargetName;
-
- if (targetName != null && targetNames.Contains(targetName))
- {
- found = true;
- break;
- }
- }
- }
- if (!found)
- {
- return false;
- }
- }
-
- if (targetGroups.Count > 0)
- {
- bool found = false;
-
- for (int i = 0; i < targetss.Length && !found; i++)
- {
- Target[] targets = targetss[i].GetTargets();
-
- for (int j = 0; j < targets.Length; j++)
- {
- GeneralName targetGroup = targets[j].TargetGroup;
-
- if (targetGroup != null && targetGroups.Contains(targetGroup))
- {
- found = true;
- break;
- }
- }
- }
-
- if (!found)
- {
- return false;
- }
- }
- }
- }
-
- return true;
- }
-
- public object Clone()
- {
- return new X509AttrCertStoreSelector(this);
- }
-
- /// The attribute certificate which must be matched.
- /// If null is given, any will do.
- public IX509AttributeCertificate AttributeCert
- {
- get { return attributeCert; }
- set { this.attributeCert = value; }
- }
-
- [Obsolete("Use AttributeCertificateValid instead")]
- public DateTimeObject AttribueCertificateValid
- {
- get { return attributeCertificateValid; }
- set { this.attributeCertificateValid = value; }
- }
-
- /// The criteria for validity
- /// If null is given any will do.
- public DateTimeObject AttributeCertificateValid
- {
- get { return attributeCertificateValid; }
- set { this.attributeCertificateValid = value; }
- }
-
- /// The holder.
- /// If null is given any will do.
- public AttributeCertificateHolder Holder
- {
- get { return holder; }
- set { this.holder = value; }
- }
-
- /// The issuer.
- /// If null is given any will do.
- public AttributeCertificateIssuer Issuer
- {
- get { return issuer; }
- set { this.issuer = value; }
- }
-
- /// The serial number.
- /// If null is given any will do.
- public BigInteger SerialNumber
- {
- get { return serialNumber; }
- set { this.serialNumber = value; }
- }
-
- /**
- * Adds a target name criterion for the attribute certificate to the target
- * information extension criteria. The X509AttributeCertificate
- * must contain at least one of the specified target names.
- *
- * Each attribute certificate may contain a target information extension
- * limiting the servers where this attribute certificate can be used. If
- * this extension is not present, the attribute certificate is not targeted
- * and may be accepted by any server.
- *
- *
- * @param name The name as a GeneralName (not null)
- */
- public void AddTargetName(
- GeneralName name)
- {
- targetNames.Add(name);
- }
-
- /**
- * Adds a target name criterion for the attribute certificate to the target
- * information extension criteria. The X509AttributeCertificate
- * must contain at least one of the specified target names.
- *
- * Each attribute certificate may contain a target information extension
- * limiting the servers where this attribute certificate can be used. If
- * this extension is not present, the attribute certificate is not targeted
- * and may be accepted by any server.
- *
- *
- * @param name a byte array containing the name in ASN.1 DER encoded form of a GeneralName
- * @throws IOException if a parsing error occurs.
- */
- public void AddTargetName(
- byte[] name)
- {
- AddTargetName(GeneralName.GetInstance(Asn1Object.FromByteArray(name)));
- }
-
- /**
- * Adds a collection with target names criteria. If null is
- * given any will do.
- *
- * The collection consists of either GeneralName objects or byte[] arrays representing
- * DER encoded GeneralName structures.
- *
- *
- * @param names A collection of target names.
- * @throws IOException if a parsing error occurs.
- * @see #AddTargetName(byte[])
- * @see #AddTargetName(GeneralName)
- */
- public void SetTargetNames(
- IEnumerable names)
- {
- targetNames = ExtractGeneralNames(names);
- }
-
- /**
- * Gets the target names. The collection consists of Lists
- * made up of an Integer in the first entry and a DER encoded
- * byte array or a String in the second entry.
- * The returned collection is immutable.
- *
- * @return The collection of target names
- * @see #setTargetNames(Collection)
- */
- public IEnumerable GetTargetNames()
- {
- return new EnumerableProxy(targetNames);
- }
-
- /**
- * Adds a target group criterion for the attribute certificate to the target
- * information extension criteria. The X509AttributeCertificate
- * must contain at least one of the specified target groups.
- *
- * Each attribute certificate may contain a target information extension
- * limiting the servers where this attribute certificate can be used. If
- * this extension is not present, the attribute certificate is not targeted
- * and may be accepted by any server.
- *
- *
- * @param group The group as GeneralName form (not null)
- */
- public void AddTargetGroup(
- GeneralName group)
- {
- targetGroups.Add(group);
- }
-
- /**
- * Adds a target group criterion for the attribute certificate to the target
- * information extension criteria. The X509AttributeCertificate
- * must contain at least one of the specified target groups.
- *
- * Each attribute certificate may contain a target information extension
- * limiting the servers where this attribute certificate can be used. If
- * this extension is not present, the attribute certificate is not targeted
- * and may be accepted by any server.
- *
- *
- * @param name a byte array containing the group in ASN.1 DER encoded form of a GeneralName
- * @throws IOException if a parsing error occurs.
- */
- public void AddTargetGroup(
- byte[] name)
- {
- AddTargetGroup(GeneralName.GetInstance(Asn1Object.FromByteArray(name)));
- }
-
- /**
- * Adds a collection with target groups criteria. If null is
- * given any will do.
- *
- * The collection consists of GeneralName objects or byte[]
- * representing DER encoded GeneralNames.
- *
- *
- * @param names A collection of target groups.
- * @throws IOException if a parsing error occurs.
- * @see #AddTargetGroup(byte[])
- * @see #AddTargetGroup(GeneralName)
- */
- public void SetTargetGroups(
- IEnumerable names)
- {
- targetGroups = ExtractGeneralNames(names);
- }
-
- /**
- * Gets the target groups. The collection consists of Lists
- * made up of an Integer in the first entry and a DER encoded
- * byte array or a String in the second entry.
- * The returned collection is immutable.
- *
- * @return The collection of target groups.
- * @see #setTargetGroups(Collection)
- */
- public IEnumerable GetTargetGroups()
- {
- return new EnumerableProxy(targetGroups);
- }
-
- private ISet ExtractGeneralNames(
- IEnumerable names)
- {
- ISet result = new HashSet();
-
- if (names != null)
- {
- foreach (object o in names)
- {
- if (o is GeneralName)
- {
- result.Add(o);
- }
- else
- {
- result.Add(GeneralName.GetInstance(Asn1Object.FromByteArray((byte[]) o)));
- }
- }
- }
-
- return result;
- }
- }
-}
diff --git a/BCCrypto/src/x509/store/X509CertPairStoreSelector.cs b/BCCrypto/src/x509/store/X509CertPairStoreSelector.cs
deleted file mode 100644
index 2796971..0000000
--- a/BCCrypto/src/x509/store/X509CertPairStoreSelector.cs
+++ /dev/null
@@ -1,92 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.X509.Store
-{
- ///
- /// This class is an IX509Selector implementation to select
- /// certificate pairs, which are e.g. used for cross certificates. The set of
- /// criteria is given from two X509CertStoreSelector objects,
- /// each of which, if present, must match the respective component of a pair.
- ///
- public class X509CertPairStoreSelector
- : IX509Selector
- {
- private static X509CertStoreSelector CloneSelector(
- X509CertStoreSelector s)
- {
- return s == null ? null : (X509CertStoreSelector) s.Clone();
- }
-
- private X509CertificatePair certPair;
- private X509CertStoreSelector forwardSelector;
- private X509CertStoreSelector reverseSelector;
-
- public X509CertPairStoreSelector()
- {
- }
-
- private X509CertPairStoreSelector(
- X509CertPairStoreSelector o)
- {
- this.certPair = o.CertPair;
- this.forwardSelector = o.ForwardSelector;
- this.reverseSelector = o.ReverseSelector;
- }
-
- /// The certificate pair which is used for testing on equality.
- public X509CertificatePair CertPair
- {
- get { return certPair; }
- set { this.certPair = value; }
- }
-
- /// The certificate selector for the forward part.
- public X509CertStoreSelector ForwardSelector
- {
- get { return CloneSelector(forwardSelector); }
- set { this.forwardSelector = CloneSelector(value); }
- }
-
- /// The certificate selector for the reverse part.
- public X509CertStoreSelector ReverseSelector
- {
- get { return CloneSelector(reverseSelector); }
- set { this.reverseSelector = CloneSelector(value); }
- }
-
- ///
- /// Decides if the given certificate pair should be selected. If
- /// obj is not a X509CertificatePair, this method
- /// returns false.
- ///
- /// The X509CertificatePair to be tested.
- /// true if the object matches this selector.
- public bool Match(
- object obj)
- {
- if (obj == null)
- throw new ArgumentNullException("obj");
-
- X509CertificatePair pair = obj as X509CertificatePair;
-
- if (pair == null)
- return false;
-
- if (certPair != null && !certPair.Equals(pair))
- return false;
-
- if (forwardSelector != null && !forwardSelector.Match(pair.Forward))
- return false;
-
- if (reverseSelector != null && !reverseSelector.Match(pair.Reverse))
- return false;
-
- return true;
- }
-
- public object Clone()
- {
- return new X509CertPairStoreSelector(this);
- }
- }
-}
diff --git a/BCCrypto/src/x509/store/X509CertStoreSelector.cs b/BCCrypto/src/x509/store/X509CertStoreSelector.cs
deleted file mode 100644
index 3874edf..0000000
--- a/BCCrypto/src/x509/store/X509CertStoreSelector.cs
+++ /dev/null
@@ -1,337 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Collections;
-using Org.BouncyCastle.Utilities.Date;
-using Org.BouncyCastle.X509.Extension;
-
-namespace Org.BouncyCastle.X509.Store
-{
- public class X509CertStoreSelector
- : IX509Selector
- {
- // TODO Missing criteria?
-
- private byte[] authorityKeyIdentifier;
- private int basicConstraints = -1;
- private X509Certificate certificate;
- private DateTimeObject certificateValid;
- private ISet extendedKeyUsage;
- private X509Name issuer;
- private bool[] keyUsage;
- private ISet policy;
- private DateTimeObject privateKeyValid;
- private BigInteger serialNumber;
- private X509Name subject;
- private byte[] subjectKeyIdentifier;
- private SubjectPublicKeyInfo subjectPublicKey;
- private DerObjectIdentifier subjectPublicKeyAlgID;
-
- public X509CertStoreSelector()
- {
- }
-
- public X509CertStoreSelector(
- X509CertStoreSelector o)
- {
- this.authorityKeyIdentifier = o.AuthorityKeyIdentifier;
- this.basicConstraints = o.BasicConstraints;
- this.certificate = o.Certificate;
- this.certificateValid = o.CertificateValid;
- this.extendedKeyUsage = o.ExtendedKeyUsage;
- this.issuer = o.Issuer;
- this.keyUsage = o.KeyUsage;
- this.policy = o.Policy;
- this.privateKeyValid = o.PrivateKeyValid;
- this.serialNumber = o.SerialNumber;
- this.subject = o.Subject;
- this.subjectKeyIdentifier = o.SubjectKeyIdentifier;
- this.subjectPublicKey = o.SubjectPublicKey;
- this.subjectPublicKeyAlgID = o.SubjectPublicKeyAlgID;
- }
-
- public virtual object Clone()
- {
- return new X509CertStoreSelector(this);
- }
-
- public byte[] AuthorityKeyIdentifier
- {
- get { return Arrays.Clone(authorityKeyIdentifier); }
- set { authorityKeyIdentifier = Arrays.Clone(value); }
- }
-
- public int BasicConstraints
- {
- get { return basicConstraints; }
- set
- {
- if (value < -2)
- throw new ArgumentException("value can't be less than -2", "value");
-
- basicConstraints = value;
- }
- }
-
- public X509Certificate Certificate
- {
- get { return certificate; }
- set { this.certificate = value; }
- }
-
- public DateTimeObject CertificateValid
- {
- get { return certificateValid; }
- set { certificateValid = value; }
- }
-
- public ISet ExtendedKeyUsage
- {
- get { return CopySet(extendedKeyUsage); }
- set { extendedKeyUsage = CopySet(value); }
- }
-
- public X509Name Issuer
- {
- get { return issuer; }
- set { issuer = value; }
- }
-
- [Obsolete("Avoid working with X509Name objects in string form")]
- public string IssuerAsString
- {
- get { return issuer != null ? issuer.ToString() : null; }
- }
-
- public bool[] KeyUsage
- {
- get { return CopyBoolArray(keyUsage); }
- set { keyUsage = CopyBoolArray(value); }
- }
-
- ///
- /// An ISet of DerObjectIdentifier objects.
- ///
- public ISet Policy
- {
- get { return CopySet(policy); }
- set { policy = CopySet(value); }
- }
-
- public DateTimeObject PrivateKeyValid
- {
- get { return privateKeyValid; }
- set { privateKeyValid = value; }
- }
-
- public BigInteger SerialNumber
- {
- get { return serialNumber; }
- set { serialNumber = value; }
- }
-
- public X509Name Subject
- {
- get { return subject; }
- set { subject = value; }
- }
-
- public string SubjectAsString
- {
- get { return subject != null ? subject.ToString() : null; }
- }
-
- public byte[] SubjectKeyIdentifier
- {
- get { return Arrays.Clone(subjectKeyIdentifier); }
- set { subjectKeyIdentifier = Arrays.Clone(value); }
- }
-
- public SubjectPublicKeyInfo SubjectPublicKey
- {
- get { return subjectPublicKey; }
- set { subjectPublicKey = value; }
- }
-
- public DerObjectIdentifier SubjectPublicKeyAlgID
- {
- get { return subjectPublicKeyAlgID; }
- set { subjectPublicKeyAlgID = value; }
- }
-
- public virtual bool Match(
- object obj)
- {
- X509Certificate c = obj as X509Certificate;
-
- if (c == null)
- return false;
-
- if (!MatchExtension(authorityKeyIdentifier, c, X509Extensions.AuthorityKeyIdentifier))
- return false;
-
- if (basicConstraints != -1)
- {
- int bc = c.GetBasicConstraints();
-
- if (basicConstraints == -2)
- {
- if (bc != -1)
- return false;
- }
- else
- {
- if (bc < basicConstraints)
- return false;
- }
- }
-
- if (certificate != null && !certificate.Equals(c))
- return false;
-
- if (certificateValid != null && !c.IsValid(certificateValid.Value))
- return false;
-
- if (extendedKeyUsage != null)
- {
- IList eku = c.GetExtendedKeyUsage();
-
- // Note: if no extended key usage set, all key purposes are implicitly allowed
-
- if (eku != null)
- {
- foreach (DerObjectIdentifier oid in extendedKeyUsage)
- {
- if (!eku.Contains(oid.Id))
- return false;
- }
- }
- }
-
- if (issuer != null && !issuer.Equivalent(c.IssuerDN, true))
- return false;
-
- if (keyUsage != null)
- {
- bool[] ku = c.GetKeyUsage();
-
- // Note: if no key usage set, all key purposes are implicitly allowed
-
- if (ku != null)
- {
- for (int i = 0; i < 9; ++i)
- {
- if (keyUsage[i] && !ku[i])
- return false;
- }
- }
- }
-
- if (policy != null)
- {
- Asn1OctetString extVal = c.GetExtensionValue(X509Extensions.CertificatePolicies);
- if (extVal == null)
- return false;
-
- Asn1Sequence certPolicies = Asn1Sequence.GetInstance(
- X509ExtensionUtilities.FromExtensionValue(extVal));
-
- if (policy.Count < 1 && certPolicies.Count < 1)
- return false;
-
- bool found = false;
- foreach (PolicyInformation pi in certPolicies)
- {
- if (policy.Contains(pi.PolicyIdentifier))
- {
- found = true;
- break;
- }
- }
-
- if (!found)
- return false;
- }
-
- if (privateKeyValid != null)
- {
- Asn1OctetString extVal = c.GetExtensionValue(X509Extensions.PrivateKeyUsagePeriod);
- if (extVal == null)
- return false;
-
- PrivateKeyUsagePeriod pkup = PrivateKeyUsagePeriod.GetInstance(
- X509ExtensionUtilities.FromExtensionValue(extVal));
-
- DateTime dt = privateKeyValid.Value;
- DateTime notAfter = pkup.NotAfter.ToDateTime();
- DateTime notBefore = pkup.NotBefore.ToDateTime();
-
- if (dt.CompareTo(notAfter) > 0 || dt.CompareTo(notBefore) < 0)
- return false;
- }
-
- if (serialNumber != null && !serialNumber.Equals(c.SerialNumber))
- return false;
-
- if (subject != null && !subject.Equivalent(c.SubjectDN, true))
- return false;
-
- if (!MatchExtension(subjectKeyIdentifier, c, X509Extensions.SubjectKeyIdentifier))
- return false;
-
- if (subjectPublicKey != null && !subjectPublicKey.Equals(GetSubjectPublicKey(c)))
- return false;
-
- if (subjectPublicKeyAlgID != null
- && !subjectPublicKeyAlgID.Equals(GetSubjectPublicKey(c).AlgorithmID))
- return false;
-
- return true;
- }
-
- internal static bool IssuersMatch(
- X509Name a,
- X509Name b)
- {
- return a == null ? b == null : a.Equivalent(b, true);
- }
-
- private static bool[] CopyBoolArray(
- bool[] b)
- {
- return b == null ? null : (bool[]) b.Clone();
- }
-
- private static ISet CopySet(
- ISet s)
- {
- return s == null ? null : new HashSet(s);
- }
-
- private static SubjectPublicKeyInfo GetSubjectPublicKey(
- X509Certificate c)
- {
- return SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(c.GetPublicKey());
- }
-
- private static bool MatchExtension(
- byte[] b,
- X509Certificate c,
- DerObjectIdentifier oid)
- {
- if (b == null)
- return true;
-
- Asn1OctetString extVal = c.GetExtensionValue(oid);
-
- if (extVal == null)
- return false;
-
- return Arrays.AreEqual(b, extVal.GetOctets());
- }
- }
-}
diff --git a/BCCrypto/src/x509/store/X509CollectionStore.cs b/BCCrypto/src/x509/store/X509CollectionStore.cs
deleted file mode 100644
index 9217314..0000000
--- a/BCCrypto/src/x509/store/X509CollectionStore.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.X509.Store
-{
- /**
- * A simple collection backed store.
- */
- internal class X509CollectionStore
- : IX509Store
- {
- private ICollection _local;
-
- /**
- * Basic constructor.
- *
- * @param collection - initial contents for the store, this is copied.
- */
- internal X509CollectionStore(
- ICollection collection)
- {
- _local = Platform.CreateArrayList(collection);
- }
-
- /**
- * Return the matches in the collection for the passed in selector.
- *
- * @param selector the selector to match against.
- * @return a possibly empty collection of matching objects.
- */
- public ICollection GetMatches(
- IX509Selector selector)
- {
- if (selector == null)
- {
- return Platform.CreateArrayList(_local);
- }
-
- IList result = Platform.CreateArrayList();
- foreach (object obj in _local)
- {
- if (selector.Match(obj))
- result.Add(obj);
- }
-
- return result;
- }
- }
-}
diff --git a/BCCrypto/src/x509/store/X509CollectionStoreParameters.cs b/BCCrypto/src/x509/store/X509CollectionStoreParameters.cs
deleted file mode 100644
index 7fd047a..0000000
--- a/BCCrypto/src/x509/store/X509CollectionStoreParameters.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-using System.Collections;
-using System.Text;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.X509.Store
-{
- /// This class contains a collection for collection based X509Stores.
- public class X509CollectionStoreParameters
- : IX509StoreParameters
- {
- private readonly IList collection;
-
- ///
- /// Constructor.
- ///
- /// The collection is copied.
- ///
- ///
- /// The collection containing X.509 object types.
- /// If collection is null.
- public X509CollectionStoreParameters(
- ICollection collection)
- {
- if (collection == null)
- throw new ArgumentNullException("collection");
-
- this.collection = Platform.CreateArrayList(collection);
- }
-
- // TODO Do we need to be able to Clone() these, and should it really be shallow?
-// /**
-// * Returns a shallow clone. The returned contents are not copied, so adding
-// * or removing objects will effect this.
-// *
-// * @return a shallow clone.
-// */
-// public object Clone()
-// {
-// return new X509CollectionStoreParameters(collection);
-// }
-
- /// Returns a copy of the ICollection.
- public ICollection GetCollection()
- {
- return Platform.CreateArrayList(collection);
- }
-
- /// Returns a formatted string describing the parameters.
- public override string ToString()
- {
- StringBuilder sb = new StringBuilder();
- sb.Append("X509CollectionStoreParameters: [\n");
- sb.Append(" collection: " + collection + "\n");
- sb.Append("]");
- return sb.ToString();
- }
- }
-}
diff --git a/BCCrypto/src/x509/store/X509CrlStoreSelector.cs b/BCCrypto/src/x509/store/X509CrlStoreSelector.cs
deleted file mode 100644
index c4b0062..0000000
--- a/BCCrypto/src/x509/store/X509CrlStoreSelector.cs
+++ /dev/null
@@ -1,283 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Asn1;
-using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Utilities;
-using Org.BouncyCastle.Utilities.Date;
-using Org.BouncyCastle.X509;
-using Org.BouncyCastle.X509.Extension;
-
-namespace Org.BouncyCastle.X509.Store
-{
- public class X509CrlStoreSelector
- : IX509Selector
- {
- // TODO Missing criteria?
-
- private X509Certificate certificateChecking;
- private DateTimeObject dateAndTime;
- private ICollection issuers;
- private BigInteger maxCrlNumber;
- private BigInteger minCrlNumber;
-
- private IX509AttributeCertificate attrCertChecking;
- private bool completeCrlEnabled;
- private bool deltaCrlIndicatorEnabled;
- private byte[] issuingDistributionPoint;
- private bool issuingDistributionPointEnabled;
- private BigInteger maxBaseCrlNumber;
-
- public X509CrlStoreSelector()
- {
- }
-
- public X509CrlStoreSelector(
- X509CrlStoreSelector o)
- {
- this.certificateChecking = o.CertificateChecking;
- this.dateAndTime = o.DateAndTime;
- this.issuers = o.Issuers;
- this.maxCrlNumber = o.MaxCrlNumber;
- this.minCrlNumber = o.MinCrlNumber;
-
- this.deltaCrlIndicatorEnabled = o.DeltaCrlIndicatorEnabled;
- this.completeCrlEnabled = o.CompleteCrlEnabled;
- this.maxBaseCrlNumber = o.MaxBaseCrlNumber;
- this.attrCertChecking = o.AttrCertChecking;
- this.issuingDistributionPointEnabled = o.IssuingDistributionPointEnabled;
- this.issuingDistributionPoint = o.IssuingDistributionPoint;
- }
-
- public virtual object Clone()
- {
- return new X509CrlStoreSelector(this);
- }
-
- public X509Certificate CertificateChecking
- {
- get { return certificateChecking; }
- set { certificateChecking = value; }
- }
-
- public DateTimeObject DateAndTime
- {
- get { return dateAndTime; }
- set { dateAndTime = value; }
- }
-
- ///
- /// An ICollection of X509Name objects
- ///
- public ICollection Issuers
- {
- get { return Platform.CreateArrayList(issuers); }
- set { issuers = Platform.CreateArrayList(value); }
- }
-
- public BigInteger MaxCrlNumber
- {
- get { return maxCrlNumber; }
- set { maxCrlNumber = value; }
- }
-
- public BigInteger MinCrlNumber
- {
- get { return minCrlNumber; }
- set { minCrlNumber = value; }
- }
-
- /**
- * The attribute certificate being checked. This is not a criterion.
- * Rather, it is optional information that may help a {@link X509Store} find
- * CRLs that would be relevant when checking revocation for the specified
- * attribute certificate. If null is specified, then no such
- * optional information is provided.
- *
- * @param attrCert the IX509AttributeCertificate being checked (or
- * null)
- * @see #getAttrCertificateChecking()
- */
- public IX509AttributeCertificate AttrCertChecking
- {
- get { return attrCertChecking; }
- set { this.attrCertChecking = value; }
- }
-
- /**
- * If true only complete CRLs are returned. Defaults to
- * false.
- *
- * @return true if only complete CRLs are returned.
- */
- public bool CompleteCrlEnabled
- {
- get { return completeCrlEnabled; }
- set { this.completeCrlEnabled = value; }
- }
-
- /**
- * Returns if this selector must match CRLs with the delta CRL indicator
- * extension set. Defaults to false.
- *
- * @return Returns true if only CRLs with the delta CRL
- * indicator extension are selected.
- */
- public bool DeltaCrlIndicatorEnabled
- {
- get { return deltaCrlIndicatorEnabled; }
- set { this.deltaCrlIndicatorEnabled = value; }
- }
-
- /**
- * The issuing distribution point.
- *
- * The issuing distribution point extension is a CRL extension which
- * identifies the scope and the distribution point of a CRL. The scope
- * contains among others information about revocation reasons contained in
- * the CRL. Delta CRLs and complete CRLs must have matching issuing
- * distribution points.
- *
- * The byte array is cloned to protect against subsequent modifications.
- *
- * You must also enable or disable this criteria with
- * {@link #setIssuingDistributionPointEnabled(bool)}.
- *
- * @param issuingDistributionPoint The issuing distribution point to set.
- * This is the DER encoded OCTET STRING extension value.
- * @see #getIssuingDistributionPoint()
- */
- public byte[] IssuingDistributionPoint
- {
- get { return Arrays.Clone(issuingDistributionPoint); }
- set { this.issuingDistributionPoint = Arrays.Clone(value); }
- }
-
- /**
- * Whether the issuing distribution point criteria should be applied.
- * Defaults to false.
- *
- * You may also set the issuing distribution point criteria if not a missing
- * issuing distribution point should be assumed.
- *
- * @return Returns if the issuing distribution point check is enabled.
- */
- public bool IssuingDistributionPointEnabled
- {
- get { return issuingDistributionPointEnabled; }
- set { this.issuingDistributionPointEnabled = value; }
- }
-
- /**
- * The maximum base CRL number. Defaults to null.
- *
- * @return Returns the maximum base CRL number.
- * @see #setMaxBaseCRLNumber(BigInteger)
- */
- public BigInteger MaxBaseCrlNumber
- {
- get { return maxBaseCrlNumber; }
- set { this.maxBaseCrlNumber = value; }
- }
-
- public virtual bool Match(
- object obj)
- {
- X509Crl c = obj as X509Crl;
-
- if (c == null)
- return false;
-
- if (dateAndTime != null)
- {
- DateTime dt = dateAndTime.Value;
- DateTime tu = c.ThisUpdate;
- DateTimeObject nu = c.NextUpdate;
-
- if (dt.CompareTo(tu) < 0 || nu == null || dt.CompareTo(nu.Value) >= 0)
- return false;
- }
-
- if (issuers != null)
- {
- X509Name i = c.IssuerDN;
-
- bool found = false;
-
- foreach (X509Name issuer in issuers)
- {
- if (issuer.Equivalent(i, true))
- {
- found = true;
- break;
- }
- }
-
- if (!found)
- return false;
- }
-
- if (maxCrlNumber != null || minCrlNumber != null)
- {
- Asn1OctetString extVal = c.GetExtensionValue(X509Extensions.CrlNumber);
- if (extVal == null)
- return false;
-
- BigInteger cn = CrlNumber.GetInstance(
- X509ExtensionUtilities.FromExtensionValue(extVal)).PositiveValue;
-
- if (maxCrlNumber != null && cn.CompareTo(maxCrlNumber) > 0)
- return false;
-
- if (minCrlNumber != null && cn.CompareTo(minCrlNumber) < 0)
- return false;
- }
-
- DerInteger dci = null;
- try
- {
- Asn1OctetString bytes = c.GetExtensionValue(X509Extensions.DeltaCrlIndicator);
- if (bytes != null)
- {
- dci = DerInteger.GetInstance(X509ExtensionUtilities.FromExtensionValue(bytes));
- }
- }
- catch (Exception)
- {
- return false;
- }
-
- if (dci == null)
- {
- if (DeltaCrlIndicatorEnabled)
- return false;
- }
- else
- {
- if (CompleteCrlEnabled)
- return false;
-
- if (maxBaseCrlNumber != null && dci.PositiveValue.CompareTo(maxBaseCrlNumber) > 0)
- return false;
- }
-
- if (issuingDistributionPointEnabled)
- {
- Asn1OctetString idp = c.GetExtensionValue(X509Extensions.IssuingDistributionPoint);
- if (issuingDistributionPoint == null)
- {
- if (idp != null)
- return false;
- }
- else
- {
- if (!Arrays.AreEqual(idp.GetOctets(), issuingDistributionPoint))
- return false;
- }
- }
-
- return true;
- }
- }
-}
diff --git a/BCCrypto/src/x509/store/X509StoreException.cs b/BCCrypto/src/x509/store/X509StoreException.cs
deleted file mode 100644
index ea7e51e..0000000
--- a/BCCrypto/src/x509/store/X509StoreException.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-namespace Org.BouncyCastle.X509.Store
-{
-#if !(NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE)
- [Serializable]
-#endif
- public class X509StoreException
- : Exception
- {
- public X509StoreException()
- {
- }
-
- public X509StoreException(
- string message)
- : base(message)
- {
- }
-
- public X509StoreException(
- string message,
- Exception e)
- : base(message, e)
- {
- }
- }
-}
diff --git a/BCCrypto/src/x509/store/X509StoreFactory.cs b/BCCrypto/src/x509/store/X509StoreFactory.cs
deleted file mode 100644
index 96f22be..0000000
--- a/BCCrypto/src/x509/store/X509StoreFactory.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
-
-namespace Org.BouncyCastle.X509.Store
-{
- public sealed class X509StoreFactory
- {
- private X509StoreFactory()
- {
- }
-
- public static IX509Store Create(
- string type,
- IX509StoreParameters parameters)
- {
- if (type == null)
- throw new ArgumentNullException("type");
-
- string[] parts = Platform.ToUpperInvariant(type).Split('/');
-
- if (parts.Length < 2)
- throw new ArgumentException("type");
-
- if (parts[1] != "COLLECTION")
- throw new NoSuchStoreException("X.509 store type '" + type + "' not available.");
-
- X509CollectionStoreParameters p = (X509CollectionStoreParameters) parameters;
- ICollection coll = p.GetCollection();
-
- switch (parts[0])
- {
- case "ATTRIBUTECERTIFICATE":
- checkCorrectType(coll, typeof(IX509AttributeCertificate));
- break;
- case "CERTIFICATE":
- checkCorrectType(coll, typeof(X509Certificate));
- break;
- case "CERTIFICATEPAIR":
- checkCorrectType(coll, typeof(X509CertificatePair));
- break;
- case "CRL":
- checkCorrectType(coll, typeof(X509Crl));
- break;
- default:
- throw new NoSuchStoreException("X.509 store type '" + type + "' not available.");
- }
-
- return new X509CollectionStore(coll);
- }
-
- private static void checkCorrectType(ICollection coll, Type t)
- {
- foreach (object o in coll)
- {
- if (!t.IsInstanceOfType(o))
- throw new InvalidCastException("Can't cast object to type: " + t.FullName);
- }
- }
- }
-}
diff --git a/Netcode.IO.NET/Core/NetcodePacket.cs b/Netcode.IO.NET/Core/NetcodePacket.cs
index dbf54ef..be6d82e 100644
--- a/Netcode.IO.NET/Core/NetcodePacket.cs
+++ b/Netcode.IO.NET/Core/NetcodePacket.cs
@@ -428,7 +428,7 @@ public bool Read(ByteArrayReaderWriter stream, int length, byte[] key, ulong pro
{
packetLen = PacketIO.ReadPacketData(Header, stream, length, protocolID, key, packetBuffer);
}
- catch(System.Exception e)
+ catch
{
BufferPool.ReturnBuffer(packetBuffer);
return false;
diff --git a/Netcode.IO.NET/Core/PacketIO.cs b/Netcode.IO.NET/Core/PacketIO.cs
index 168c25c..680c59f 100644
--- a/Netcode.IO.NET/Core/PacketIO.cs
+++ b/Netcode.IO.NET/Core/PacketIO.cs
@@ -3,8 +3,6 @@
using NetcodeIO.NET.Utils;
using NetcodeIO.NET.Utils.IO;
-using Org.BouncyCastle.Crypto.TlsExt;
-
namespace NetcodeIO.NET.Internal
{
///
@@ -58,7 +56,7 @@ public static int EncryptPacketData(NetcodePacketHeader header, ulong protocolID
int ret;
try
{
- ret = AEAD_Chacha20_Poly1305.Encrypt(packetData, 0, packetDataLen, additionalData, nonce, key, outBuffer);
+ ret = CryptoUtils.Encrypt(packetData, 0, packetDataLen, additionalData, key, nonce, outBuffer);
}
catch (Exception e)
{
@@ -96,7 +94,7 @@ public static int DecryptPacketData(NetcodePacketHeader header, ulong protocolID
int ret;
try
{
- ret = AEAD_Chacha20_Poly1305.Decrypt(packetData, 0, packetDataLen, additionalData, nonce, key, outBuffer);
+ ret = CryptoUtils.Decrypt(packetData, 0, packetDataLen, additionalData, key, nonce, outBuffer);
}
catch(Exception e)
{
@@ -128,7 +126,7 @@ public static int EncryptChallengeToken(ulong sequenceNum, byte[] packetData, by
int ret;
try
{
- ret = AEAD_Chacha20_Poly1305.Encrypt(packetData, 0, 300 - Defines.MAC_SIZE, additionalData, nonce, key, outBuffer);
+ ret = CryptoUtils.Encrypt(packetData, 0, 300 - Defines.MAC_SIZE, additionalData, key, nonce, outBuffer);
}
catch (Exception e)
{
@@ -160,7 +158,7 @@ public static int DecryptChallengeToken(ulong sequenceNum, byte[] packetData, by
int ret;
try
{
- ret = AEAD_Chacha20_Poly1305.Decrypt(packetData, 0, 300, additionalData, nonce, key, outBuffer);
+ ret = CryptoUtils.Decrypt(packetData, 0, 300, additionalData, key, nonce, outBuffer);
}
catch (Exception e)
{
@@ -195,7 +193,7 @@ public static int EncryptPrivateConnectToken(byte[] privateConnectToken, ulong p
writer.Write(sequence);
}
- var ret = AEAD_Chacha20_Poly1305.Encrypt(privateConnectToken, 0, len - Defines.MAC_SIZE, additionalData, nonce, key, outBuffer);
+ var ret = CryptoUtils.Encrypt(privateConnectToken, 0, len - Defines.MAC_SIZE, additionalData, key, nonce, outBuffer);
BufferPool.ReturnBuffer(additionalData);
BufferPool.ReturnBuffer(nonce);
@@ -223,7 +221,7 @@ public static int DecryptPrivateConnectToken(byte[] encryptedConnectToken, ulong
writer.Write(sequence);
}
- var ret = AEAD_Chacha20_Poly1305.Decrypt(encryptedConnectToken, 0, len, additionalData, nonce, key, outBuffer);
+ var ret = CryptoUtils.Decrypt(encryptedConnectToken, 0, len, additionalData, key, nonce, outBuffer);
BufferPool.ReturnBuffer(additionalData);
BufferPool.ReturnBuffer(nonce);
diff --git a/Netcode.IO.NET/Netcode.IO.NET.csproj b/Netcode.IO.NET/Netcode.IO.NET.csproj
index 3d33812..5bcca0b 100644
--- a/Netcode.IO.NET/Netcode.IO.NET.csproj
+++ b/Netcode.IO.NET/Netcode.IO.NET.csproj
@@ -1,83 +1,14 @@
-
-
-
-
- Debug
- AnyCPU
- {74122CF9-7E4C-4EA7-9AEC-FC1501BC712A}
- Library
- Properties
- Netcode.IO.NET
- Netcode.IO.NET
- v3.5
- 512
-
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
- true
-
-
- pdbonly
- true
- bin\Release\
- TRACE;UNSAFE
- prompt
- 4
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {d7022bc7-e21d-4a79-bde7-30f01ed961df}
- BCCrypto
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+ netstandard2.0
+
+
+
+ Netcode.IO.NET
+ Netcode.IO.NET
+ Copyright © 2017
+ 1.0.0.0
+
+
+
diff --git a/Netcode.IO.NET/Properties/AssemblyInfo.cs b/Netcode.IO.NET/Properties/AssemblyInfo.cs
deleted file mode 100644
index 9adfa13..0000000
--- a/Netcode.IO.NET/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Netcode.IO.NET")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Netcode.IO.NET")]
-[assembly: AssemblyCopyright("Copyright © 2017")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("74122cf9-7e4c-4ea7-9aec-fc1501bc712a")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Netcode.IO.NET/Public/Client.cs b/Netcode.IO.NET/Public/Client.cs
index 85b62a1..28937ef 100644
--- a/Netcode.IO.NET/Public/Client.cs
+++ b/Netcode.IO.NET/Public/Client.cs
@@ -238,7 +238,7 @@ public void Connect(byte[] connectToken)
Connect(connectToken, true);
}
- internal void Connect(byte[] connectToken, bool autoTick)
+ public void Connect(byte[] connectToken, bool autoTick)
{
if (state != ClientState.Disconnected)
throw new InvalidOperationException();
@@ -343,7 +343,7 @@ private void disconnect(ClientState disconnectState)
serverToClientKey = null;
}
- internal void Tick(double time)
+ public void Tick(double time)
{
if (this.socket == null) return;
diff --git a/Netcode.IO.NET/Public/Server.cs b/Netcode.IO.NET/Public/Server.cs
index cff833b..8552fdb 100644
--- a/Netcode.IO.NET/Public/Server.cs
+++ b/Netcode.IO.NET/Public/Server.cs
@@ -7,8 +7,6 @@
using System.Linq;
using System.Collections.Generic;
-using Org.BouncyCastle.Crypto.TlsExt;
-
using NetcodeIO.NET.Utils;
using NetcodeIO.NET.Utils.IO;
using NetcodeIO.NET.Internal;
@@ -261,7 +259,7 @@ public void Start()
Start(true);
}
- internal void Start(bool autoTick)
+ public void Start(bool autoTick)
{
if (disposed) throw new InvalidOperationException("Can't restart disposed server, please create a new server");
@@ -328,7 +326,7 @@ public void Disconnect(RemoteClient client)
#region Core
double keepAlive = 0.0;
- internal void Tick(double time)
+ public void Tick(double time)
{
this.listenSocket.Pump();
diff --git a/Netcode.IO.NET/Utils/CryptoUtils.cs b/Netcode.IO.NET/Utils/CryptoUtils.cs
new file mode 100644
index 0000000..f644c42
--- /dev/null
+++ b/Netcode.IO.NET/Utils/CryptoUtils.cs
@@ -0,0 +1,479 @@
+using System;
+using System.Text;
+using NetcodeIO.NET.Utils;
+
+namespace NetcodeIO.NET.Utils
+{
+ /// Encrypt/Decrypt with AEAD_XChaCha_Poly1205 algorithm (RFC 7539)
+ public static class CryptoUtils
+ {
+ private static XChaCha cipher = new XChaCha();
+ private static Poly1305 mac = new Poly1305();
+
+ public static int Encrypt(byte[] bytes, int bytesOffset, int bytesCount, byte[] adata, byte[] key, byte[] nonce, byte[] output)
+ {
+ var macCalculated = BufferPool.GetBuffer(16);
+ var macKey = BufferPool.GetBuffer(32);
+ var buf64 = BufferPool.GetBuffer(64);
+
+ // Fill buf32 with mac key
+ cipher.Reset(key, nonce);
+ cipher.Process(buf64, 0, buf64.Length, buf64, 0);
+ Array.Copy(buf64, macKey, 32);
+
+ // Encrypt bytes
+ cipher.Process(bytes, bytesOffset, bytesCount, output, 0);
+
+ // Calculate mac
+ GetMAC(macKey, output, 0, bytesCount, adata, 0, adata.Length, macCalculated);
+
+ // Add mac to output
+ Array.Copy(macCalculated, 0, output, bytesCount, macCalculated.Length);
+
+ // Release
+ BufferPool.ReturnBuffer(macCalculated);
+ BufferPool.ReturnBuffer(macKey);
+ BufferPool.ReturnBuffer(buf64);
+
+ return bytesCount + Poly1305.BLOCK_SIZE;
+ }
+
+ public static int Decrypt(byte[] bytes, int bytesOffset, int bytesCount, byte[] adata, byte[] key, byte[] nonce, byte[] output)
+ {
+ var macCalculated = BufferPool.GetBuffer(16);
+ var macRecived = BufferPool.GetBuffer(16);
+ var macKey = BufferPool.GetBuffer(32);
+ var buf64 = BufferPool.GetBuffer(64);
+
+ var outputCount = bytesCount - Poly1305.BLOCK_SIZE;
+
+ // Fill buf32 with mac key
+ cipher.Reset(key, nonce);
+ cipher.Process(buf64, 0, buf64.Length, buf64, 0);
+ Array.Copy(buf64, macKey, 32);
+
+ // Calculated mac
+ GetMAC(macKey, bytes, 0, outputCount, adata, 0, adata.Length, macCalculated);
+
+ // Recived mac
+ Array.Copy(bytes, bytesOffset + outputCount, macRecived, 0, macRecived.Length);
+
+ try
+ {
+ if (IsEqual(macCalculated, macRecived))
+ cipher.Process(bytes, bytesOffset, bytesCount, output, 0);
+ else
+ throw new Exception();
+
+ return outputCount;
+ }
+ finally
+ {
+ BufferPool.ReturnBuffer(macCalculated);
+ BufferPool.ReturnBuffer(macRecived);
+ BufferPool.ReturnBuffer(macKey);
+ BufferPool.ReturnBuffer(buf64);
+ }
+ }
+
+ private static void GetMAC(byte[] key, byte[] bytes, int byteOffset, int bytesCount, byte[] adata, int adataOffset, int adataCount, byte[] output)
+ {
+ var buf8 = BufferPool.GetBuffer(8);
+
+ var zeroBytes = BufferPool.GetBuffer(16);
+ var zeroCount = 0;
+
+ mac.Reset(key);
+
+ // Addition data
+ mac.Process(adata, 0, adataCount);
+ zeroCount = adataCount % Poly1305.BLOCK_SIZE;
+ if (zeroCount != 0) mac.Process(zeroBytes, 0, Poly1305.BLOCK_SIZE - zeroCount);
+
+ // Encrypted data
+ mac.Process(bytes, byteOffset, bytesCount);
+ zeroCount = bytesCount % Poly1305.BLOCK_SIZE;
+ if (zeroCount != 0) mac.Process(zeroBytes, 0, Poly1305.BLOCK_SIZE - zeroCount);
+
+ // Addition data length
+ Lend.Unpack64((ulong)adataCount, buf8);
+ mac.Process(buf8, 0, 8);
+
+ // Encrypted data length
+ Lend.Unpack64((ulong)bytesCount, buf8);
+ mac.Process(buf8, 0, 8);
+
+ mac.Build(output, 0);
+
+ BufferPool.ReturnBuffer(buf8);
+ BufferPool.ReturnBuffer(zeroBytes);
+ }
+
+ private static bool IsEqual(byte[] a, byte[] b)
+ {
+ int i = a.Length;
+ if (i != b.Length) return false;
+
+ int cmp = 0;
+ while (i != 0)
+ {
+ --i;
+ cmp |= (a[i] ^ b[i]);
+ }
+ return cmp == 0;
+ }
+ }
+
+ public class XChaCha
+ {
+ private static uint[] SIGMA = Lend.Pack32(Encoding.ASCII.GetBytes("expand 32-byte k"), 0, 4);
+ private static int SIZE = 16;
+
+ private int stateIndex = 0;
+ private uint[] state = new uint[SIZE];
+ private uint[] buffer = new uint[SIZE];
+ private byte[] gamma = new byte[SIZE * 4];
+
+ public void Reset(byte[] key, byte[] nonce)
+ {
+ if (key == null || key.Length != 32) throw new ArgumentException();
+ if (nonce == null || nonce.Length != 12) throw new ArgumentException();
+
+ StateInit(state, key, nonce);
+ stateIndex = 0;
+ }
+
+ public void Process(byte[] bytes, int bytesOffset, int bytesCount, byte[] output, int outputOffset)
+ {
+ for (int i = 0; i < bytesCount; i++)
+ {
+ if (stateIndex == 0)
+ {
+ StateGamma(state, buffer, gamma);
+ StateInc(state);
+ }
+
+ output[outputOffset + i] = (byte)(bytes[i + bytesOffset] ^ gamma[stateIndex]);
+ stateIndex = (stateIndex + 1) & 63;
+ }
+ }
+
+ private static void StateInit(uint[] state, byte[] key, byte[] nonce)
+ {
+ Array.Clear(state, 0, SIZE);
+
+ state[0] = SIGMA[0];
+ state[1] = SIGMA[1];
+ state[2] = SIGMA[2];
+ state[3] = SIGMA[3];
+
+ Lend.Pack32(key, 0, state, 4, 8);
+ Lend.Pack32(nonce, 0, state, 13, 3);
+ }
+
+ private static void StateInc(uint[] state)
+ {
+ state[12]++;
+ }
+
+ private static void StateGamma(uint[] state, uint[] buffer, byte[] gamma)
+ {
+ RotateChaCha(state, buffer, 20);
+ Lend.Unpack32(buffer, gamma, 0);
+ }
+
+ private static void RotateChaCha(uint[] y, uint[] x, int rounds)
+ {
+ if (rounds % 2 != 0) throw new ArgumentException("Number of rounds must be even");
+
+ uint x00 = y[ 0];
+ uint x01 = y[ 1];
+ uint x02 = y[ 2];
+ uint x03 = y[ 3];
+ uint x04 = y[ 4];
+ uint x05 = y[ 5];
+ uint x06 = y[ 6];
+ uint x07 = y[ 7];
+ uint x08 = y[ 8];
+ uint x09 = y[ 9];
+ uint x10 = y[10];
+ uint x11 = y[11];
+ uint x12 = y[12];
+ uint x13 = y[13];
+ uint x14 = y[14];
+ uint x15 = y[15];
+
+ for (int i = rounds; i > 0; i -= 2)
+ {
+ x00 += x04; x12 = RotateLeft(x12 ^ x00, 16);
+ x08 += x12; x04 = RotateLeft(x04 ^ x08, 12);
+ x00 += x04; x12 = RotateLeft(x12 ^ x00, 8);
+ x08 += x12; x04 = RotateLeft(x04 ^ x08, 7);
+ x01 += x05; x13 = RotateLeft(x13 ^ x01, 16);
+ x09 += x13; x05 = RotateLeft(x05 ^ x09, 12);
+ x01 += x05; x13 = RotateLeft(x13 ^ x01, 8);
+ x09 += x13; x05 = RotateLeft(x05 ^ x09, 7);
+ x02 += x06; x14 = RotateLeft(x14 ^ x02, 16);
+ x10 += x14; x06 = RotateLeft(x06 ^ x10, 12);
+ x02 += x06; x14 = RotateLeft(x14 ^ x02, 8);
+ x10 += x14; x06 = RotateLeft(x06 ^ x10, 7);
+ x03 += x07; x15 = RotateLeft(x15 ^ x03, 16);
+ x11 += x15; x07 = RotateLeft(x07 ^ x11, 12);
+ x03 += x07; x15 = RotateLeft(x15 ^ x03, 8);
+ x11 += x15; x07 = RotateLeft(x07 ^ x11, 7);
+ x00 += x05; x15 = RotateLeft(x15 ^ x00, 16);
+ x10 += x15; x05 = RotateLeft(x05 ^ x10, 12);
+ x00 += x05; x15 = RotateLeft(x15 ^ x00, 8);
+ x10 += x15; x05 = RotateLeft(x05 ^ x10, 7);
+ x01 += x06; x12 = RotateLeft(x12 ^ x01, 16);
+ x11 += x12; x06 = RotateLeft(x06 ^ x11, 12);
+ x01 += x06; x12 = RotateLeft(x12 ^ x01, 8);
+ x11 += x12; x06 = RotateLeft(x06 ^ x11, 7);
+ x02 += x07; x13 = RotateLeft(x13 ^ x02, 16);
+ x08 += x13; x07 = RotateLeft(x07 ^ x08, 12);
+ x02 += x07; x13 = RotateLeft(x13 ^ x02, 8);
+ x08 += x13; x07 = RotateLeft(x07 ^ x08, 7);
+ x03 += x04; x14 = RotateLeft(x14 ^ x03, 16);
+ x09 += x14; x04 = RotateLeft(x04 ^ x09, 12);
+ x03 += x04; x14 = RotateLeft(x14 ^ x03, 8);
+ x09 += x14; x04 = RotateLeft(x04 ^ x09, 7);
+ }
+
+ x[ 0] = x00 + y[ 0];
+ x[ 1] = x01 + y[ 1];
+ x[ 2] = x02 + y[ 2];
+ x[ 3] = x03 + y[ 3];
+ x[ 4] = x04 + y[ 4];
+ x[ 5] = x05 + y[ 5];
+ x[ 6] = x06 + y[ 6];
+ x[ 7] = x07 + y[ 7];
+ x[ 8] = x08 + y[ 8];
+ x[ 9] = x09 + y[ 9];
+ x[10] = x10 + y[10];
+ x[11] = x11 + y[11];
+ x[12] = x12 + y[12];
+ x[13] = x13 + y[13];
+ x[14] = x14 + y[14];
+ x[15] = x15 + y[15];
+ }
+
+ private static uint RotateLeft(uint value, int numBits)
+ {
+ return (value << numBits) | (value >> (32 - numBits));
+ }
+ }
+
+ public class Poly1305
+ {
+ public const int BLOCK_SIZE = 16;
+
+ // Initialised state
+
+ /** Polynomial key */
+ private uint r0, r1, r2, r3, r4;
+ /** Precomputed 5 * r[1..4] */
+ private uint s1, s2, s3, s4;
+ /** Encrypted key */
+ private uint k0, k1, k2, k3;
+
+ // Accumulating state
+
+ /** Current block of buffered input */
+ private byte[] buffer = new byte[BLOCK_SIZE];
+ /** Current offset in input buffer */
+ private int bufferLength = 0;
+ /** Polynomial accumulator */
+ private uint h0, h1, h2, h3, h4;
+
+ public void Reset(byte[] key)
+ {
+ if (key.Length != 32) throw new ArgumentException("Poly1305 key must be 256 bits.");
+
+ bufferLength = 0;
+
+ h0 = h1 = h2 = h3 = h4 = 0;
+
+ // Extract r portion of key (and "clamp" the values)
+ uint t0 = Lend.Pack32(key, 0);
+ uint t1 = Lend.Pack32(key, 4);
+ uint t2 = Lend.Pack32(key, 8);
+ uint t3 = Lend.Pack32(key, 12);
+
+ // NOTE: The masks perform the key "clamping" implicitly
+ r0 = t0 & 0x03FFFFFFU;
+ r1 = ((t0 >> 26) | (t1 << 6)) & 0x03FFFF03U;
+ r2 = ((t1 >> 20) | (t2 << 12)) & 0x03FFC0FFU;
+ r3 = ((t2 >> 14) | (t3 << 18)) & 0x03F03FFFU;
+ r4 = (t3 >> 8) & 0x000FFFFFU;
+
+ // Precompute multipliers
+ s1 = r1 * 5;
+ s2 = r2 * 5;
+ s3 = r3 * 5;
+ s4 = r4 * 5;
+
+ k0 = Lend.Pack32(key, BLOCK_SIZE + 0);
+ k1 = Lend.Pack32(key, BLOCK_SIZE + 4);
+ k2 = Lend.Pack32(key, BLOCK_SIZE + 8);
+ k3 = Lend.Pack32(key, BLOCK_SIZE + 12);
+ }
+
+ public void Process(byte[] bytes, int bytesOffset, int bytesCount)
+ {
+ int bytesProcessed = 0;
+
+ while (bytesCount > bytesProcessed)
+ {
+ if (bufferLength == BLOCK_SIZE)
+ ProcessBuffer();
+
+ int count = Math.Min(bytesCount - bytesProcessed, BLOCK_SIZE - bufferLength);
+ Array.Copy(bytes, bytesOffset + bytesProcessed, buffer, bufferLength, count);
+ bufferLength += count;
+ bytesProcessed += count;
+ }
+ }
+
+ private void ProcessBuffer()
+ {
+ if (bufferLength == 0) return;
+ if (bufferLength < BLOCK_SIZE)
+ {
+ buffer[bufferLength] = 1;
+ Array.Clear(buffer, bufferLength + 1, BLOCK_SIZE - bufferLength - 1);
+ }
+
+ ulong t0 = Lend.Pack32(buffer, 0);
+ ulong t1 = Lend.Pack32(buffer, 4);
+ ulong t2 = Lend.Pack32(buffer, 8);
+ ulong t3 = Lend.Pack32(buffer, 12);
+
+ h0 += (uint)(t0 & 0x3ffffffU);
+ h1 += (uint)((((t1 << 32) | t0) >> 26) & 0x3ffffff);
+ h2 += (uint)((((t2 << 32) | t1) >> 20) & 0x3ffffff);
+ h3 += (uint)((((t3 << 32) | t2) >> 14) & 0x3ffffff);
+ h4 += (uint)(t3 >> 8);
+
+ if (bufferLength == BLOCK_SIZE)
+ {
+ h4 += (1 << 24);
+ }
+
+ ulong tp0 = mul32x32_64(h0,r0) + mul32x32_64(h1,s4) + mul32x32_64(h2,s3) + mul32x32_64(h3,s2) + mul32x32_64(h4,s1);
+ ulong tp1 = mul32x32_64(h0,r1) + mul32x32_64(h1,r0) + mul32x32_64(h2,s4) + mul32x32_64(h3,s3) + mul32x32_64(h4,s2);
+ ulong tp2 = mul32x32_64(h0,r2) + mul32x32_64(h1,r1) + mul32x32_64(h2,r0) + mul32x32_64(h3,s4) + mul32x32_64(h4,s3);
+ ulong tp3 = mul32x32_64(h0,r3) + mul32x32_64(h1,r2) + mul32x32_64(h2,r1) + mul32x32_64(h3,r0) + mul32x32_64(h4,s4);
+ ulong tp4 = mul32x32_64(h0,r4) + mul32x32_64(h1,r3) + mul32x32_64(h2,r2) + mul32x32_64(h3,r1) + mul32x32_64(h4,r0);
+
+ h0 = (uint)tp0 & 0x3ffffff; tp1 += (tp0 >> 26);
+ h1 = (uint)tp1 & 0x3ffffff; tp2 += (tp1 >> 26);
+ h2 = (uint)tp2 & 0x3ffffff; tp3 += (tp2 >> 26);
+ h3 = (uint)tp3 & 0x3ffffff; tp4 += (tp3 >> 26);
+ h4 = (uint)tp4 & 0x3ffffff;
+ h0 += (uint)(tp4 >> 26) * 5;
+ h1 += (h0 >> 26); h0 &= 0x3ffffff;
+
+ bufferLength = 0;
+ }
+
+ public int Build(byte[] output, int outputOffset)
+ {
+ if (bufferLength > 0)
+ ProcessBuffer();
+
+ h1 += (h0 >> 26); h0 &= 0x3ffffff;
+ h2 += (h1 >> 26); h1 &= 0x3ffffff;
+ h3 += (h2 >> 26); h2 &= 0x3ffffff;
+ h4 += (h3 >> 26); h3 &= 0x3ffffff;
+ h0 += (h4 >> 26) * 5; h4 &= 0x3ffffff;
+ h1 += (h0 >> 26); h0 &= 0x3ffffff;
+
+ uint g0, g1, g2, g3, g4, b;
+ g0 = h0 + 5; b = g0 >> 26; g0 &= 0x3ffffff;
+ g1 = h1 + b; b = g1 >> 26; g1 &= 0x3ffffff;
+ g2 = h2 + b; b = g2 >> 26; g2 &= 0x3ffffff;
+ g3 = h3 + b; b = g3 >> 26; g3 &= 0x3ffffff;
+ g4 = h4 + b - (1 << 26);
+
+ b = (g4 >> 31) - 1;
+ uint nb = ~b;
+ h0 = (h0 & nb) | (g0 & b);
+ h1 = (h1 & nb) | (g1 & b);
+ h2 = (h2 & nb) | (g2 & b);
+ h3 = (h3 & nb) | (g3 & b);
+ h4 = (h4 & nb) | (g4 & b);
+
+ ulong f0, f1, f2, f3;
+ f0 = ((h0 ) | (h1 << 26)) + (ulong)k0;
+ f1 = ((h1 >> 6 ) | (h2 << 20)) + (ulong)k1;
+ f2 = ((h2 >> 12) | (h3 << 14)) + (ulong)k2;
+ f3 = ((h3 >> 18) | (h4 << 8 )) + (ulong)k3;
+
+ Lend.Unpack32((uint)f0, output, outputOffset);
+ f1 += (f0 >> 32);
+ Lend.Unpack32((uint)f1, output, outputOffset + 4);
+ f2 += (f1 >> 32);
+ Lend.Unpack32((uint)f2, output, outputOffset + 8);
+ f3 += (f2 >> 32);
+ Lend.Unpack32((uint)f3, output, outputOffset + 12);
+
+ return BLOCK_SIZE;
+ }
+
+ private static ulong mul32x32_64(uint i1, uint i2)
+ {
+ return ((ulong)i1) * i2;
+ }
+ }
+
+ /// Little-Endian packer/unpacker
+ public static class Lend
+ {
+ public static void Unpack64(ulong value, byte[] output)
+ {
+ Unpack32((uint)(value), output);
+ Unpack32((uint)(value >> 32), output, 4);
+ }
+
+ public static void Unpack32(uint value, byte[] output, int outputOffset = 0)
+ {
+ output[outputOffset] = (byte)(value);
+ output[outputOffset + 1] = (byte)(value >> 8);
+ output[outputOffset + 2] = (byte)(value >> 16);
+ output[outputOffset + 3] = (byte)(value >> 24);
+ }
+
+ public static void Unpack32(uint[] values, byte[] output, int outputOffset)
+ {
+ for (int i = 0; i < values.Length; ++i)
+ {
+ Unpack32(values[i], output, outputOffset);
+ outputOffset += 4;
+ }
+ }
+
+ public static uint[] Pack32(byte[] bytes, int bytesOffset, int numIntegers)
+ {
+ var result = new uint[numIntegers];
+ Pack32(bytes, bytesOffset, result, 0, numIntegers);
+ return result;
+ }
+
+ public static void Pack32(byte[] bytes, int bytesOffset, uint[] output, int outputOffset, int numIntegers)
+ {
+ for (int i = 0; i < numIntegers; ++i)
+ {
+ output[outputOffset + i] = Pack32(bytes, bytesOffset);
+ bytesOffset += 4;
+ }
+ }
+
+ public static uint Pack32(byte[] bytes, int bytesOffset)
+ {
+ return (uint)bytes[bytesOffset]
+ | (uint)bytes[bytesOffset + 1] << 8
+ | (uint)bytes[bytesOffset + 2] << 16
+ | (uint)bytes[bytesOffset + 3] << 24;
+ }
+ }
+}
diff --git a/Netcode.IO.NET/Utils/MiscUtils.cs b/Netcode.IO.NET/Utils/MiscUtils.cs
index 3b12130..46483ee 100644
--- a/Netcode.IO.NET/Utils/MiscUtils.cs
+++ b/Netcode.IO.NET/Utils/MiscUtils.cs
@@ -17,6 +17,8 @@ public static bool CompareAddress(this IPEndPoint lhs, IPEndPoint rhs)
public static bool CompareEndpoint(this IPEndPoint lhs, IPEndPoint rhs, int port)
{
+ if (lhs.Address.Equals(IPAddress.Any)) return lhs.Port == port;
+ if (rhs.Address.Equals(IPAddress.Any)) return rhs.Port == port;
return lhs.Address.Equals(rhs.Address) && lhs.Port == port;
}