Пример #1
0
        /// <inheritdoc />
        public (SecureBigNumber, ECPoint) GenerateRandomElement(RandomNumberGenerator randomNumberGenerator)
        {
            using (var keyHandle = ECKeyHandle.Create())
            {
                ECKeyHandle.SetGroup(keyHandle, Handle);

                // note(lumip): OpenSSL up to version 1.1.1 does not generate private keys for EC
                //  as secure BIGNUM. Workaround by setting an empty secure private key BIGNUM before
                //  generation. (cf. https://github.com/openssl/openssl/issues/13892)
                using (var privKeyTemplateHandle = BigNumberHandle.CreateSecure())
                {
                    ECKeyHandle.SetPrivateKey(keyHandle, privKeyTemplateHandle);
                }
                ECKeyHandle.GenerateKey(keyHandle);

                // note(lumip): ensure the workaround worked
                var privKeyHandle = ECKeyHandle.GetPrivateKey(keyHandle);
                Debug.Assert(!privKeyHandle.IsInvalid);
                Debug.Assert(BigNumberHandle.GetFlags(privKeyHandle).HasFlag(BigNumberFlags.Secure));

                var pubKeyHandle = ECKeyHandle.GetPublicKey(keyHandle);
                Debug.Assert(!pubKeyHandle.IsInvalid);
                var point = new ECPoint(Handle, pubKeyHandle);

                var index = SecureBigNumber.FromRawHandle(privKeyHandle);
                return(index, point);
            }
        }
Пример #2
0
        public void TestConstructor()
        {
            var number = new SecureBigNumber();

            Assert.That(BigNumberHandle.GetFlags(
                            number.Handle, BigNumberFlags.Secure).HasFlag(BigNumberFlags.Secure)
                        );
            Assert.That(BigNumberHandle.GetFlags(
                            number.Handle, BigNumberFlags.ConstantTime).HasFlag(BigNumberFlags.ConstantTime)
                        );
            Assert.That(!number.Handle.IsInvalid);
            Assert.That(!number.Handle.IsClosed);
        }
Пример #3
0
 public void TestFromRawHandle()
 {
     using (var handle = BigNumberHandle.Create())
     {
         BigNumberHandle.SetWord(handle, 3);
         var number = SecureBigNumber.FromRawHandle(handle);
         Assert.That(BigNumberHandle.Compare(number.Handle, handle) == 0);
         Assert.That(BigNumberHandle.GetFlags(
                         number.Handle, BigNumberFlags.Secure).HasFlag(BigNumberFlags.Secure)
                     );
         Assert.That(BigNumberHandle.GetFlags(
                         number.Handle, BigNumberFlags.ConstantTime).HasFlag(BigNumberFlags.ConstantTime)
                     );
     }
 }
Пример #4
0
        /// <summary>
        /// Creates a <see cref="BigNumber" /> instance from a valid <see cref="BigNumberHandle" />
        /// to an OpenSSL <c>BIGNUM</c> structure. A copy of the pointed to <c>BIGNUM</c> structure
        /// is made for the created instance.
        /// </summary>
        /// <param name="bigNumberHandle">
        /// A handle to a raw OpenSSL <c>BIGNUM</c> structure with which to initialize the new <see cref="BigNumber" />.
        /// </param>
        /// <returns>
        /// A new <see cref="BigNumber" /> instance with the same value as
        /// referred to by <paramref name="bigNumberHandle"/>.
        /// </returns>
        internal static BigNumber FromRawHandle(BigNumberHandle bigNumberHandle)
        {
            if (bigNumberHandle.IsInvalid)
            {
                throw new ArgumentException("The provided handle is invalid.", nameof(bigNumberHandle));
            }
            if (BigNumberHandle.GetFlags(bigNumberHandle).HasFlag(BigNumberFlags.Secure))
            {
                throw new ArgumentException(
                          "The provided handle is that of a secure big number. Converting secure into regular big numbers is not supported.",
                          nameof(bigNumberHandle)
                          );
            }
            var bn = new BigNumber();

            BigNumberHandle.Copy(bn.Handle, bigNumberHandle);
            return(bn);
        }
Пример #5
0
        public void TestRandom()
        {
            var NumTests = 100;
            var range    = new BigNumber(0x869375a76);

            for (var k = 0; k < NumTests; k++)
            {
                using (var number = SecureBigNumber.Random(range))
                {
                    Assert.That(BigNumberHandle.GetFlags(
                                    number.Handle, BigNumberFlags.Secure).HasFlag(BigNumberFlags.Secure)
                                );
                    Assert.That(BigNumberHandle.GetFlags(
                                    number.Handle, BigNumberFlags.ConstantTime).HasFlag(BigNumberFlags.ConstantTime)
                                );
                    Assert.That(BigNumberHandle.Compare(number.Handle, range.Handle) < 0);
                }
            }
        }