summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2023-03-04 17:34:24 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2023-03-04 17:34:24 +0700
commit189b49dc3f2087de852757832435c4dc11aa4e25 (patch)
tree0e2053889c16934ab52b483d5b437f90f00efabe
parentBIKE refactoring (diff)
downloadBouncyCastle.NET-ed25519-189b49dc3f2087de852757832435c4dc11aa4e25.tar.xz
Length property and internal Span accessors
-rw-r--r--crypto/src/crypto/engines/AesEngine_X86.cs14
-rw-r--r--crypto/src/crypto/engines/AsconEngine.cs17
-rw-r--r--crypto/src/crypto/parameters/KeyParameter.cs6
-rw-r--r--crypto/src/crypto/parameters/ParametersWithIV.cs6
4 files changed, 36 insertions, 7 deletions
diff --git a/crypto/src/crypto/engines/AesEngine_X86.cs b/crypto/src/crypto/engines/AesEngine_X86.cs
index 51080ec52..ba1d77ec7 100644
--- a/crypto/src/crypto/engines/AesEngine_X86.cs
+++ b/crypto/src/crypto/engines/AesEngine_X86.cs
@@ -18,7 +18,7 @@ namespace Org.BouncyCastle.Crypto.Engines
     {
         public static bool IsSupported => Aes.IsSupported;
 
-        private static Vector128<byte>[] CreateRoundKeys(byte[] key, bool forEncryption)
+        private static Vector128<byte>[] CreateRoundKeys(ReadOnlySpan<byte> key, bool forEncryption)
         {
             Vector128<byte>[] K;
 
@@ -30,7 +30,7 @@ namespace Org.BouncyCastle.Crypto.Engines
 
                 K = new Vector128<byte>[11];
 
-                var s = Load128(key.AsSpan(0, 16));
+                var s = Load128(key[..16]);
                 K[0] = s;
 
                 for (int round = 0; round < 10;)
@@ -49,8 +49,8 @@ namespace Org.BouncyCastle.Crypto.Engines
             {
                 K = new Vector128<byte>[13];
 
-                var s1 = Load128(key.AsSpan(0, 16));
-                var s2 = Load64(key.AsSpan(16, 8)).ToVector128();
+                var s1 = Load128(key[..16]);
+                var s2 = Load64(key[16..24]).ToVector128();
                 K[0] = s1;
 
                 byte rcon = 0x01;
@@ -95,8 +95,8 @@ namespace Org.BouncyCastle.Crypto.Engines
             {
                 K = new Vector128<byte>[15];
 
-                var s1 = Load128(key.AsSpan(0, 16));
-                var s2 = Load128(key.AsSpan(16, 16));
+                var s1 = Load128(key[..16]);
+                var s2 = Load128(key[16..32]);
                 K[0] = s1;
                 K[1] = s2;
 
@@ -163,7 +163,7 @@ namespace Org.BouncyCastle.Crypto.Engines
                 throw new ArgumentException("invalid type: " + Platform.GetTypeName(parameters), nameof(parameters));
             }
 
-            m_roundKeys = CreateRoundKeys(keyParameter.GetKey(), forEncryption);
+            m_roundKeys = CreateRoundKeys(keyParameter.Key, forEncryption);
 
             if (m_roundKeys.Length == 11)
             {
diff --git a/crypto/src/crypto/engines/AsconEngine.cs b/crypto/src/crypto/engines/AsconEngine.cs
index 870d0e57f..3ca5ede60 100644
--- a/crypto/src/crypto/engines/AsconEngine.cs
+++ b/crypto/src/crypto/engines/AsconEngine.cs
@@ -142,22 +142,39 @@ namespace Org.BouncyCastle.Crypto.Engines
             if (npub == null || npub.Length != CRYPTO_ABYTES)
                 throw new ArgumentException(asconParameters + " requires exactly " + CRYPTO_ABYTES + " bytes of IV");
 
+#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER
+            var k = key.Key;
+#else
             byte[] k = key.GetKey();
+#endif
+
             if (k.Length != CRYPTO_KEYBYTES)
                 throw new ArgumentException(asconParameters + " key must be " + CRYPTO_KEYBYTES + " bytes long");
 
             N0 = Pack.BE_To_UInt64(npub, 0);
             N1 = Pack.BE_To_UInt64(npub, 8);
+
             if (CRYPTO_KEYBYTES == 16)
             {
+#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER
+                K1 = Pack.BE_To_UInt64(k);
+                K2 = Pack.BE_To_UInt64(k[8..]);
+#else
                 K1 = Pack.BE_To_UInt64(k, 0);
                 K2 = Pack.BE_To_UInt64(k, 8);
+#endif
             }
             else if (CRYPTO_KEYBYTES == 20)
             {
+#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER
+                K0 = Pack.BE_To_UInt32(k);
+                K1 = Pack.BE_To_UInt64(k[4..]);
+                K2 = Pack.BE_To_UInt64(k[12..]);
+#else
                 K0 = Pack.BE_To_UInt32(k, 0);
                 K1 = Pack.BE_To_UInt64(k, 4);
                 K2 = Pack.BE_To_UInt64(k, 12);
+#endif
             }
             else
             {
diff --git a/crypto/src/crypto/parameters/KeyParameter.cs b/crypto/src/crypto/parameters/KeyParameter.cs
index 8d35a19f1..7ee47de9a 100644
--- a/crypto/src/crypto/parameters/KeyParameter.cs
+++ b/crypto/src/crypto/parameters/KeyParameter.cs
@@ -39,5 +39,11 @@ namespace Org.BouncyCastle.Crypto.Parameters
         {
 			return (byte[])m_key.Clone();
         }
+
+        public int KeyLength => m_key.Length;
+
+#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER
+        internal ReadOnlySpan<byte> Key => m_key;
+#endif
     }
 }
diff --git a/crypto/src/crypto/parameters/ParametersWithIV.cs b/crypto/src/crypto/parameters/ParametersWithIV.cs
index ea1773d54..e642e828a 100644
--- a/crypto/src/crypto/parameters/ParametersWithIV.cs
+++ b/crypto/src/crypto/parameters/ParametersWithIV.cs
@@ -49,6 +49,12 @@ namespace Org.BouncyCastle.Crypto.Parameters
             return (byte[])m_iv.Clone();
         }
 
+        public int IVLength => m_iv.Length;
+
         public ICipherParameters Parameters => m_parameters;
+
+#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER
+        internal ReadOnlySpan<byte> IV => m_iv;
+#endif
     }
 }