Exemple #1
0
        /// <summary>
        /// Todo :Need to be enhanced to return the correct public key but not used for now
        /// </summary>
        /// <param name="pem"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static Ed25519PublicKeyParameters GetPublicKeyFromPrivateKey(Ed25519PrivateKeyParameters privateKey)
        {
            // get the public key from the private key
            Ed25519PublicKeyParameters publicKey = privateKey.GeneratePublicKey();

            return(publicKey);
        }
Exemple #2
0
        /// <summary>
        /// Hashes the Public key with X509
        /// </summary>
        /// <param name="publicKey"></param>
        /// <returns></returns>
        public static byte[] EncodePublicKeyX509(Ed25519PublicKeyParameters publicKey)
        {
            var publicKeyInfo         = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey);
            var serializedPublicBytes = publicKeyInfo.GetEncoded();

            return(serializedPublicBytes);
        }
Exemple #3
0
        public void CanValidateSignature()
        {
            Ed25519KeyPairGenerator kpg = new Ed25519KeyPairGenerator();

            kpg.Init(new Ed25519KeyGenerationParameters(Random));

            AsymmetricCipherKeyPair     kp         = kpg.GenerateKeyPair();
            Ed25519PrivateKeyParameters privateKey = (Ed25519PrivateKeyParameters)kp.Private;
            Ed25519PublicKeyParameters  publicKey  = (Ed25519PublicKeyParameters)kp.Public;
            var pubKeyBase64 = Convert.ToBase64String(publicKey.GetEncoded());

            // create signature for item
            byte[] msg = new byte[Random.NextInt() & 255];
            Random.NextBytes(msg);
            var signer = new Ed25519Signer();

            signer.Init(true, privateKey);
            signer.BlockUpdate(msg, 0, msg.Length);
            byte[] signature           = signer.GenerateSignature();
            var    signatureForAppCast = Convert.ToBase64String(signature);

            // verify signature
            var checker = new Ed25519Checker(NetSparkleUpdater.Enums.SecurityMode.Strict, pubKeyBase64);

            Assert.True(checker.VerifySignature(signatureForAppCast, msg) == NetSparkleUpdater.Enums.ValidationResult.Valid);
        }
Exemple #4
0
        /// <summary>
        ///     Gets the IPFS encoded public key for the specified key.
        /// </summary>
        /// <param name="name">
        ///     The local name of the key.
        /// </param>
        /// <param name="cancel">
        ///     Is used to stop the task.  When cancelled, the <see cref="TaskCanceledException" /> is raised.
        /// </param>
        /// <returns>
        ///     A task that represents the asynchronous operation. The task's result is
        ///     the IPFS encoded public key.
        /// </returns>
        /// <remarks>
        ///     The IPFS public key is the base-64 encoding of a protobuf encoding containing
        ///     a type and the DER encoding of the PKCS Subject Public Key Info.
        /// </remarks>
        /// <seealso href="https://tools.ietf.org/html/rfc5280#section-4.1.2.7" />
        public async Task <string> GetPublicKeyAsync(string name, CancellationToken cancel = default)
        {
            // TODO: Rename to GetIpfsPublicKeyAsync
            string result = null;
            var    ekey   = await Store.TryGetAsync(name, cancel).ConfigureAwait(false);

            if (ekey != null)
            {
                UseEncryptedKey(ekey, key =>
                {
                    var kp   = GetKeyPairFromPrivateKey(key);
                    var spki = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(kp.Public).GetDerEncoded();

                    // Add protobuf cruft.
                    var publicKey = new PublicKey
                    {
                        Data = spki,
                        Type = kp.Public switch
                        {
                            RsaKeyParameters _ => KeyType.Rsa,
                            Ed25519PublicKeyParameters _ => KeyType.Ed25519,
                            ECPublicKeyParameters _ => KeyType.Secp256K1,
                            _ => throw new NotSupportedException(
                                $"The key type {kp.Public.GetType().Name} is not supported.")
                        }
                    };

                    using var ms = new MemoryStream();
                    Serializer.Serialize(ms, publicKey);
                    result = Convert.ToBase64String(ms.ToArray());
                });
        /// <summary>
        /// Generates the specified force.
        /// </summary>
        /// <param name="force">if set to <c>true</c> [force].</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public bool Generate(bool force = false)
        {
            if (KeysExist() && !force)
            {
                Console.WriteLine("Keys already exist, use --force to force regeneration");
                return(false);
            }

            // start key generation
            Console.WriteLine("Generating key pair...");

            var Random = new SecureRandom();

            Ed25519KeyPairGenerator kpg = new Ed25519KeyPairGenerator();

            kpg.Init(new Ed25519KeyGenerationParameters(Random));

            AsymmetricCipherKeyPair     kp         = kpg.GenerateKeyPair();
            Ed25519PrivateKeyParameters privateKey = (Ed25519PrivateKeyParameters)kp.Private;
            Ed25519PublicKeyParameters  publicKey  = (Ed25519PublicKeyParameters)kp.Public;

            var privKeyBase64 = Convert.ToBase64String(privateKey.GetEncoded());
            var pubKeyBase64  = Convert.ToBase64String(publicKey.GetEncoded());

            File.WriteAllText(_privateKeyFilePath, privKeyBase64);
            File.WriteAllText(_publicKeyFilePath, pubKeyBase64);

            Console.WriteLine("Storing public/private keys to " + _storagePath);
            return(true);
        }
Exemple #6
0
        private void ECDH_GenerateEphemeral(EncryptMessage msg)
        {
            CBORObject epk = CBORObject.NewMap();

            if (_mKey.AsString("kty") == "EC")
            {
                X9ECParameters     p          = NistNamedCurves.GetByName(_mKey.AsString("crv"));
                ECDomainParameters parameters = new ECDomainParameters(p.Curve, p.G, p.N, p.H);

                ECKeyPairGenerator        pGen     = new ECKeyPairGenerator();
                ECKeyGenerationParameters genParam = new ECKeyGenerationParameters(parameters, Message.s_PRNG);
                pGen.Init(genParam);

                AsymmetricCipherKeyPair p1 = pGen.GenerateKeyPair();

                epk.Add("kty", "EC");
                epk.Add("crv", _mKey.AsString("crv"));
                ECPublicKeyParameters priv = (ECPublicKeyParameters)p1.Public;
                epk.Add("x", priv.Q.Normalize().XCoord.ToBigInteger().ToByteArrayUnsigned());
                epk.Add("y", priv.Q.Normalize().YCoord.ToBigInteger().ToByteArrayUnsigned());
            }
            else if (_mKey.AsString("kty") == "OKP")
            {
                switch (_mKey.AsString("crv"))
                {
                case "X25519":
                    Ed25519KeyPairGenerator        pGen     = new Ed25519KeyPairGenerator();
                    Ed25519KeyGenerationParameters genParam = new Ed25519KeyGenerationParameters(Message.s_PRNG);
                    pGen.Init(genParam);

                    AsymmetricCipherKeyPair    p1  = pGen.GenerateKeyPair();
                    Ed25519PublicKeyParameters pub = (Ed25519PublicKeyParameters)p1.Public;

                    epk.Add("kty", "OKP");
                    epk.Add("crv", "X25519");
                    epk.Add("x", pub.GetEncoded());
                    break;

                default:
                    throw new JoseException("Unknown OPK curve");
                }
            }
            else
            {
                throw new JoseException("Internal Error");
            }

            if (msg.FindAttribute(CBORObject.FromObject("epk"), PROTECTED) != null)
            {
                msg.AddAttribute(CBORObject.FromObject("epk"), epk, PROTECTED);
            }
            else if (msg.FindAttribute(CBORObject.FromObject("epk"), PROTECTED) != null)
            {
                msg.AddAttribute(CBORObject.FromObject("epk"), epk, PROTECTED);
            }
            else
            {
                AddAttribute("epk", epk, UNPROTECTED);
            }
        }
Exemple #7
0
        public virtual AsymmetricCipherKeyPair GenerateKeyPair()
        {
            Ed25519PrivateKeyParameters privateKey = new Ed25519PrivateKeyParameters(random);
            Ed25519PublicKeyParameters  publicKey  = privateKey.GeneratePublicKey();

            return(new AsymmetricCipherKeyPair(publicKey, privateKey));
        }
Exemple #8
0
        private void DoTestConsistency(Ed25519.Algorithm algorithm, byte[] context)
        {
            Ed25519KeyPairGenerator kpg = new Ed25519KeyPairGenerator();

            kpg.Init(new Ed25519KeyGenerationParameters(Random));

            AsymmetricCipherKeyPair     kp         = kpg.GenerateKeyPair();
            Ed25519PrivateKeyParameters privateKey = (Ed25519PrivateKeyParameters)kp.Private;
            Ed25519PublicKeyParameters  publicKey  = (Ed25519PublicKeyParameters)kp.Public;

            byte[] msg = new byte[Random.NextInt() & 255];
            Random.NextBytes(msg);

            ISigner signer = CreateSigner(algorithm, context);

            signer.Init(true, privateKey);
            signer.BlockUpdate(msg, 0, msg.Length);
            byte[] signature = signer.GenerateSignature();

            ISigner verifier = CreateSigner(algorithm, context);

            {
                verifier.Init(false, publicKey);
                verifier.BlockUpdate(msg, 0, msg.Length);
                bool shouldVerify = verifier.VerifySignature(signature);

                if (!shouldVerify)
                {
                    Fail("Ed25519(" + algorithm + ") signature failed to verify");
                }
            }

            {
                byte[] wrongLengthSignature = Arrays.Append(signature, 0x00);

                verifier.Init(false, publicKey);
                verifier.BlockUpdate(msg, 0, msg.Length);
                bool shouldNotVerify = verifier.VerifySignature(wrongLengthSignature);

                if (shouldNotVerify)
                {
                    Fail("Ed25519(" + algorithm + ") wrong length signature incorrectly verified");
                }
            }

            {
                byte[] badSignature = Arrays.Clone(signature);
                badSignature[Random.Next() % badSignature.Length] ^= (byte)(1 << (Random.NextInt() & 7));

                verifier.Init(false, publicKey);
                verifier.BlockUpdate(msg, 0, msg.Length);
                bool shouldNotVerify = verifier.VerifySignature(badSignature);

                if (shouldNotVerify)
                {
                    Fail("Ed25519(" + algorithm + ") bad signature incorrectly verified");
                }
            }
        }
Exemple #9
0
        /// <summary>
        /// Encodes public key to PEM formatted string
        /// </summary>
        /// <param name="publicKey"></param>
        /// <returns></returns>
        public static string EncodePublicKey(Ed25519PublicKeyParameters publicKey)
        {
            // convert it to X509
            string base64 = Convert.ToBase64String(EncodePublicKeyX509(publicKey));

            base64 = string.Format("-----BEGIN ED25519 PUBLIC KEY-----\n{0}\n-----END ED25519 PUBLIC KEY-----\n", base64);
            return(base64);
        }
Exemple #10
0
        public RawKeyPair(string privateKey)
        {
            string privateKey32 = privateKey.Length == 128 ? privateKey.Substring(0, 64) : privateKey;
            Ed25519PrivateKeyParameters privateKeyParams = new Ed25519PrivateKeyParameters(Hex.Decode(privateKey32), 0);
            Ed25519PublicKeyParameters  publicKeyParams  = privateKeyParams.GeneratePublicKey();

            PublicKey  = publicKeyParams.GetEncoded();
            PrivateKey = privateKeyParams.GetEncoded();
        }
Exemple #11
0
        public AsymmetricKeyPair Generate()
        {
            Ed25519PrivateKeyParameters secretKeyParams = new Ed25519PrivateKeyParameters(_secureRandom);
            Ed25519PublicKeyParameters  publicKeyParams = secretKeyParams.GeneratePublicKey();

            byte[] asn1SecretKey = SecretKeyAsn1Header.Concat(secretKeyParams.GetEncoded()).ToArray();
            byte[] asn1PublicKey = PublicKeyAsn1Header.Concat(publicKeyParams.GetEncoded()).ToArray();

            return(new AsymmetricKeyPair(new SecretKey(asn1SecretKey, KeyAlgorithm.Ed25519), new PublicKey(asn1PublicKey, KeyAlgorithm.Ed25519)));
        }
Exemple #12
0
        /// <summary>
        /// Verify the singature usign the public key and the raw message
        /// </summary>
        /// <param name="key"></param>
        /// <param name="message"></param>
        /// <param name="encodedSig"></param>
        /// <returns></returns>
        public static bool Verify(Ed25519PublicKeyParameters key, byte[] message, string encodedSig)
        {
            byte[] sig = CryptoUtils.DecodeSignature(encodedSig);

            ISigner signer = SignerUtilities.GetSigner(Ed25519_ALGO);

            signer.Init(false, key);
            signer.BlockUpdate(message, 0, message.Length);
            return(signer.VerifySignature(sig));
        }
Exemple #13
0
        /// <summary>
        /// Get the private key object from the raw key
        /// </summary>
        /// <param name="pem"></param>
        /// <returns></returns>
        public static Ed25519PublicKeyParameters DecodeEd25519PublicKey(string pem)
        {
            TextReader textReader    = new StringReader(pem);
            PemReader  pemReader     = new PemReader(textReader);
            var        pemObject     = pemReader.ReadPemObject();
            var        keyParameters = new Ed25519PublicKeyParameters(pemObject.Content, 0);
            var        publicKey     = DecodeEd25519PublicKey(pemObject.Content);

            return(publicKey);
        }
Exemple #14
0
        /// <summary>
        /// Perform signature verification against the sender address
        /// </summary>
        /// <param name="address">Address to verify</param>
        /// <returns>bool</returns>
        public bool Verify(Address address)
        {
            if (this.logic == null)
            {
                return(false);
            }
            else if (this.sig != null && this.msig != null)
            {
                return(false);
            }
            else
            {
                try
                {
                    Logic.CheckProgram(this.logic, this.args);
                }
                catch (Exception)
                {
                    return(false);
                }

                if (this.sig == null && this.msig == null)
                {
                    try
                    {
                        return(address.Equals(this.ToAddress()));
                    }
                    catch (Exception)
                    {
                        return(false);
                    }
                }

                if (this.sig != null)
                {
                    try
                    {
                        var pk     = new Ed25519PublicKeyParameters(address.Bytes, 0);
                        var signer = new Ed25519Signer();
                        signer.Init(false, pk); //false代表用于VerifySignature
                        signer.BlockUpdate(this.BytesToSign(), 0, this.BytesToSign().Length);
                        return(signer.VerifySignature(this.sig.Bytes));
                    }
                    catch (Exception err)
                    {
                        Console.WriteLine("Message = " + err.Message);
                        return(false);
                    }
                }
                else
                {
                    return(this.msig.Verify(this.BytesToSign()));
                }
            }
        }
Exemple #15
0
        public bool Verify(byte[] msg, byte[] sig, byte[] pubKey)
        {
            var keyedHash = Blake2b.GetDigest(msg);
            var publicKey = new Ed25519PublicKeyParameters(pubKey, 0);
            var verifier  = new Ed25519Signer();

            verifier.Init(false, publicKey);
            verifier.BlockUpdate(keyedHash, 0, keyedHash.Length);

            return(verifier.VerifySignature(sig));
        }
Exemple #16
0
        public BaseKeyPair(string privateKey)
        {
            string privateKey32 = privateKey.Length == 128 ? privateKey.Substring(0, 64) : privateKey;
            Ed25519PrivateKeyParameters privateKeyParams = new Ed25519PrivateKeyParameters(Hex.Decode(privateKey32), 0);
            Ed25519PublicKeyParameters  publicKeyParams  = privateKeyParams.GeneratePublicKey();

            byte[] publicBinary  = publicKeyParams.GetEncoded();
            byte[] privateBinary = privateKeyParams.GetEncoded();
            PublicKey  = Encoding.EncodeCheck(publicBinary, Constants.ApiIdentifiers.ACCOUNT_PUBKEY);
            PrivateKey = Hex.ToHexString(privateBinary) + Hex.ToHexString(publicBinary);
        }
Exemple #17
0
        public bool VerifyStamp(TimestampDao timestamp)
        {
            var fileHash  = timestamp.FileHash.ToUpper().FromBase32();
            var signature = timestamp.Signature.ToUpper().FromBase32();
            var publicKey = new Ed25519PublicKeyParameters(timestamp.PublicKey.ToUpper().FromBase32(), 0);

            var verifier = new Ed25519Signer();

            verifier.Init(false, publicKey);
            verifier.BlockUpdate(fileHash, 0, fileHash.Length);
            return(verifier.VerifySignature(signature));
        }
Exemple #18
0
        public MultisigSubsig(Ed25519PublicKeyParameters key, Signature sig = null)
        {
            this.key = JavaHelper <Ed25519PublicKeyParameters> .RequireNotNull(key, "public key cannot be null");

            if (sig is null)
            {
                this.sig = new Signature();
            }
            else
            {
                this.sig = sig;
            }
        }
Exemple #19
0
        public static RawKeyPair Generate()
        {
            Ed25519KeyPairGenerator keyPairGenerator = new Ed25519KeyPairGenerator();

            keyPairGenerator.Init(new Ed25519KeyGenerationParameters(new SecureRandom()));
            AsymmetricCipherKeyPair     asymmetricCipherKeyPair = keyPairGenerator.GenerateKeyPair();
            Ed25519PublicKeyParameters  publicKeyParams         = (Ed25519PublicKeyParameters)asymmetricCipherKeyPair.Public;
            Ed25519PrivateKeyParameters privateKeyParams        = (Ed25519PrivateKeyParameters)asymmetricCipherKeyPair.Private;

            byte[] publicKey  = publicKeyParams.GetEncoded();
            byte[] privateKey = privateKeyParams.GetEncoded();
            return(new RawKeyPair(publicKey, privateKey));
        }
Exemple #20
0
            internal bool VerifySignature(Ed25519PublicKeyParameters publicKey, byte[] signature)
            {
#if PORTABLE
                byte[] buf   = ToArray();
                int    count = buf.Length;
#else
                byte[] buf   = GetBuffer();
                int    count = (int)Position;
#endif
                byte[] pk     = publicKey.GetEncoded();
                bool   result = Ed25519.Verify(signature, 0, pk, 0, buf, 0, count);
                Reset();
                return(result);
            }
        // **** Code to be reviewed - it compiles, but he has little if any relationship with the Dart code...
        // ****
        public String getEncoded()
        {
            byte[] seedBytes = HexEncDec.StringToByteArray(Seed);
            Ed25519KeyPairGenerator        wkGen  = new Ed25519KeyPairGenerator();
            SecureRandom                   rnd    = new SecureRandom(seedBytes);
            Ed25519KeyGenerationParameters genPar = new Ed25519KeyGenerationParameters(rnd);

            wkGen.Init(genPar);
            AsymmetricCipherKeyPair    keys = wkGen.GenerateKeyPair();
            Ed25519PublicKeyParameters key  = (Ed25519PublicKeyParameters)keys.Public;

            byte[] output = key.GetEncoded();
            return(Convert.ToBase64String(output));
        }
Exemple #22
0
 public void TestGetPublicKeyFromPrivateKey()
 {
     try
     {
         Ed25519PrivateKeyParameters pri = CryptoUtils.DecodeEd25519PrivateKey(privateKey);
         Ed25519PublicKeyParameters  pub = CryptoUtils.GetPublicKeyFromPrivateKey(pri);
         string publicPEM = CryptoUtils.EncodePublicKey(pub);
         Assert.AreEqual(publicPEM, publicKey, "Extract public key from private key failed");
     }
     catch (Exception e)
     {
         System.Diagnostics.Debug.WriteLine(e.ToString());
         throw e;
     }
 }
Exemple #23
0
        public void Init(bool forSigning, ICipherParameters parameters)
        {
            if (forSigning)
            {
                privateKey = (Ed25519PrivateKeyParameters)parameters;
                publicKey  = privateKey.GeneratePublicKey();
            }
            else
            {
                publicKey  = (Ed25519PublicKeyParameters)parameters;
                privateKey = null;
            }

            Reset();
        }
Exemple #24
0
        public void TestSignVerify()
        {
            try
            {
                Ed25519PrivateKeyParameters pri = CryptoUtils.DecodeEd25519PrivateKey(privateKey);
                Ed25519PublicKeyParameters  pub = CryptoUtils.GetPublicKeyFromPrivateKey(pri);

                String encodedSig = CryptoUtils.Sign(pri, msg);
                Assert.IsTrue(CryptoUtils.Verify(pub, msg, encodedSig), "Message Verification failed");
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine(e.ToString());
                throw e;
            }
        }
        /// <summary>
        /// verifyBytes verifies that the signature for the message is valid for the public key.
        /// The message should have been prepended with "MX" when signing.
        /// </summary>
        /// <param name="message">the message that was signed</param>
        /// <param name="signature">signature</param>
        /// <returns>true if the signature is valid</returns>
        public bool VerifyBytes(byte[] message, Signature signature)
        {
            var pk = new Ed25519PublicKeyParameters(this.Bytes, 0);
            // prepend the message prefix
            List <byte> prefixBytes = new List <byte>(BYTES_SIGN_PREFIX);

            prefixBytes.AddRange(message);

            // verify signature
            // Generate new signature
            var signer = new Ed25519Signer();

            signer.Init(false, pk);
            signer.BlockUpdate(prefixBytes.ToArray(), 0, prefixBytes.ToArray().Length);
            return(signer.VerifySignature(signature.Bytes));
        }
        public virtual void Init(bool forSigning, ICipherParameters parameters)
        {
            this.forSigning = forSigning;

            if (forSigning)
            {
                this.privateKey = (Ed25519PrivateKeyParameters)parameters;
                this.publicKey  = null;
            }
            else
            {
                this.privateKey = null;
                this.publicKey  = (Ed25519PublicKeyParameters)parameters;
            }

            Reset();
        }
Exemple #27
0
        public static KeyPair generateEd25519KeyPair()
        {
            Org.BouncyCastle.Crypto.Generators.Ed25519KeyPairGenerator kpg = new Org.BouncyCastle.Crypto.Generators.Ed25519KeyPairGenerator();
            kpg.Init(new Ed25519KeyGenerationParameters(secureRandom));
            Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair kp = kpg.GenerateKeyPair();
            KeyPair nkp = new KeyPair();
            Ed25519PrivateKeyParameters privateKey = (Ed25519PrivateKeyParameters)kp.Private;
            Ed25519PublicKeyParameters  publicKey  = (Ed25519PublicKeyParameters)kp.Public;

            nkp.publicKey  = new PublicKey(publicKey.GetEncoded());
            nkp.privateKey = new PrivateKey(privateKey.GetEncoded());
            if (nkp.privateKey.isValid())
            {
                return(nkp);
            }
            return(generateEd25519KeyPair());
        }
Exemple #28
0
        public virtual void Init(bool forSigning, ICipherParameters parameters)
        {
            this.forSigning = forSigning;

            if (forSigning)
            {
                // TODO Allow AsymmetricCipherKeyPair to be a CipherParameters?

                this.privateKey = (Ed25519PrivateKeyParameters)parameters;
                this.publicKey  = privateKey.GeneratePublicKey();
            }
            else
            {
                this.privateKey = null;
                this.publicKey  = (Ed25519PublicKeyParameters)parameters;
            }

            Reset();
        }
Exemple #29
0
        private void BasicSigTest()
        {
            Ed25519PrivateKeyParameters privateKey = new Ed25519PrivateKeyParameters(
                Hex.DecodeStrict("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60"), 0);
            Ed25519PublicKeyParameters publicKey = new Ed25519PublicKeyParameters(
                Hex.DecodeStrict("d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"), 0);

            byte[] sig = Hex.Decode("e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b");

            ISigner signer = new Ed25519Signer();

            signer.Init(true, privateKey);

            IsTrue(AreEqual(sig, signer.GenerateSignature()));

            signer.Init(false, publicKey);

            IsTrue(signer.VerifySignature(sig));
        }
Exemple #30
0
        public MultisigSubsig([JsonProperty("pk")] byte[] key = null, [JsonProperty("s")] byte[] sig = null)
        {
            if (key != null)
            {
                this.key = new Ed25519PublicKeyParameters(key, 0);
            }
            else
            {
                this.key = new Ed25519PublicKeyParameters(new byte[0], 0);
            }

            if (sig != null)
            {
                this.sig = new Signature(sig);
            }
            else
            {
                this.sig = new Signature();
            }
        }