summary refs log tree commit diff
path: root/crypto/src/asn1/gm
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2017-06-03 20:44:45 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2017-06-03 20:44:45 +0700
commit9b3549d18ecc3e4f66488568594a626e7d6d8543 (patch)
tree9504d9265461ab4118bb0708fcd7f0c11ca9d9b6 /crypto/src/asn1/gm
parentFix reductions for custom secp128r1 field (diff)
downloadBouncyCastle.NET-ed25519-9b3549d18ecc3e4f66488568594a626e7d6d8543.tar.xz
Initial implementation of SM2 elliptic curve
- includes custom curve code
- add lots of OIDs from GM standard
Diffstat (limited to 'crypto/src/asn1/gm')
-rw-r--r--crypto/src/asn1/gm/GMNamedCurves.cs157
-rw-r--r--crypto/src/asn1/gm/GMObjectIdentifiers.cs85
2 files changed, 242 insertions, 0 deletions
diff --git a/crypto/src/asn1/gm/GMNamedCurves.cs b/crypto/src/asn1/gm/GMNamedCurves.cs
new file mode 100644
index 000000000..e2ec6d854
--- /dev/null
+++ b/crypto/src/asn1/gm/GMNamedCurves.cs
@@ -0,0 +1,157 @@
+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/crypto/src/asn1/gm/GMObjectIdentifiers.cs b/crypto/src/asn1/gm/GMObjectIdentifiers.cs
new file mode 100644
index 000000000..edb3a41c5
--- /dev/null
+++ b/crypto/src/asn1/gm/GMObjectIdentifiers.cs
@@ -0,0 +1,85 @@
+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