コード例 #1
0
        string ITestCase.Generate()
        {
            Ed25519PrivateKeyParameters privateKey = CryptoUtils.DecodeEd25519PrivateKey(privateKeyString);
            Link link = new LinkBuilder("test_process", "test_map")
                        .WithAction("ʙᴀᴛᴍᴀɴ").Build();

            link.Sign(privateKey.GetEncoded(), "");
            link.Sign(privateKey.GetEncoded(), "[version,meta.mapId]");
            //      link.sign(rsaKey.getEncoded(), "[version,meta.mapId]");

            Segment segment = link.Segmentify();

            return(Convert.ToBase64String(segment.Serialize()));
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <summary>
        /// Creates a new Link from the given builder, signs it and executes the GraphQL
        /// mutation.
        /// </summary>
        /// <typeparam name="TLinkData"></typeparam>
        /// <param name="linkBuilder">The linkBuilder<see cref="TraceLinkBuilder{TLinkData}"/></param>
        /// <returns>The <see cref="Task{TraceState{TState, TLinkData}}"/></returns>
        private async Task <TraceState <TState, TLinkData> > CreateLinkAsync <TLinkData>(TraceLinkBuilder <TLinkData> linkBuilder)
        {
            // extract signing key from config
            SdkConfig sdkConfig = await GetConfigAsync();

            Ed25519PrivateKeyParameters signingPrivateKey = sdkConfig.SigningPrivateKey;

            // build the link
            TraceLink <TLinkData> link = linkBuilder.Build();

            // sign the link
            link.Sign(signingPrivateKey.GetEncoded(), "[version,data,meta]");



            string linkObjJson = JsonHelper.ToJson(link.ALink);

            Dictionary <string, object> linkObj = JsonHelper.ObjectToMap(link.GetLink());


            Dictionary <string, object> dataObj = JsonHelper.ObjectToMap(((TraceLink <TLinkData>)link).FormData());

            Dictionary <string, object> variables = new Dictionary <string, object>
            {
                ["link"] = linkObj,
                ["data"] = dataObj
            };
            // Debug.WriteLine("Request : " + JsonHelper.ToJson(dataObj));
            // execute graphql query
            GraphQLResponse jsonResponse = await this.client.GraphqlAsync(GraphQL.MUTATION_CREATELINK, variables, null, null);

            var trace = jsonResponse.Data.createLink.trace;

            return(this.MakeTraceState <TLinkData>(trace));
        }
コード例 #4
0
        /// <summary>
        /// Encodes private key to PEM formatted string
        /// </summary>
        /// <param name="publicKey"></param>
        /// <returns></returns>
        public static string EncodePrivateKey(Ed25519PrivateKeyParameters privateKey)
        {
            var serializedPublicBytes = privateKey.GetEncoded();
            var base64 = Convert.ToBase64String(serializedPublicBytes);

            base64 = string.Format("-----BEGIN ED25519 PRIVATE KEY-----\n{0}\n-----END ED25519 PRIVATE KEY-----\n", base64);
            return(base64);
        }
コード例 #5
0
ファイル: RawKeyPair.cs プロジェクト: block-m3/aepp-sdk-net
        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();
        }
コード例 #6
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)));
        }
コード例 #7
0
ファイル: BaseKeyPair.cs プロジェクト: block-m3/aepp-sdk-net
        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);
        }
コード例 #8
0
ファイル: RawKeyPair.cs プロジェクト: block-m3/aepp-sdk-net
        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));
        }
コード例 #9
0
        /// <summary>
        /// Creates a new Link from the given builder, signs it and executes the GraphQL
        /// mutation.
        /// </summary>
        /// <typeparam name="TLinkData"></typeparam>
        /// <param name="linkBuilder">The linkBuilder<see cref="TraceLinkBuilder{TLinkData}"/></param>
        /// <param name="firstTry">if this is not the first try, do not retry</param>
        /// <returns>The <see cref="Task{TraceState{TState, TLinkData}}"/></returns>
        private async Task <TraceState <TState, TLinkData> > CreateLinkAsync <TLinkData>(TraceLinkBuilder <TLinkData> linkBuilder, bool firstTry = true)
        {
            // extract signing key from config
            SdkConfig sdkConfig = await GetConfigAsync();

            Ed25519PrivateKeyParameters signingPrivateKey = sdkConfig.SigningPrivateKey;

            // build the link
            TraceLink <TLinkData> link = linkBuilder.Build();

            // sign the link
            link.Sign(signingPrivateKey.GetEncoded(), "[version,data,meta]");



            string linkObjJson = JsonHelper.ToJson(link.ALink);

            Dictionary <string, object> linkObj = JsonHelper.ObjectToMap(link.GetLink());


            Dictionary <string, object> dataObj = JsonHelper.ObjectToMap(((TraceLink <TLinkData>)link).FormData());

            Dictionary <string, object> variables = new Dictionary <string, object>
            {
                ["link"] = linkObj,
                ["data"] = dataObj
            };

            try
            {
                // execute graphql query
                GraphQLResponse <dynamic> jsonResponse = await this.client.GraphqlAsync(GraphQL.MUTATION_CREATELINK, variables, null, null);

                var trace = jsonResponse.Data.createLink.trace;

                return(this.MakeTraceState <TLinkData>(trace));
            }
            catch (TraceSdkException e)
            {
                if (firstTry && e.Message == ERROR_CONFIG_DEPRECATED)
                {
                    var cfg = await this.GetConfigAsync(true);

                    linkBuilder.WithConfigId(cfg.ConfigId);
                    link.GetLink().Signatures.Clear();
                    return(await this.CreateLinkAsync(linkBuilder, false));
                }

                throw e;
            }
        }
コード例 #10
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());
        }
コード例 #11
0
        public void CanGetAndVerifySignatureFromEnvironment()
        {
            // create tmp file
            var tempData = RandomString(1024);
            var path     = Path.GetTempFileName();

            File.WriteAllText(path, tempData);
            Assert.True(File.Exists(path));
            Assert.Equal(tempData, File.ReadAllText(path));

            // create keys
            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());

            var manager = GetSignatureManager();

            Environment.SetEnvironmentVariable(SignatureManager.PrivateKeyEnvironmentVariable, privKeyBase64);
            Environment.SetEnvironmentVariable(SignatureManager.PublicKeyEnvironmentVariable, pubKeyBase64);

            // get signature of file
            var signature = manager.GetSignatureForFile(path);

            manager.Generate(true); // force regeneration of keys to "prove" that we are using environment
            // verify signature
            Assert.True(manager.VerifySignature(path, signature));
            // get rid of temp file
            File.Delete(path);
        }
コード例 #12
0
        /**
         * Create a PrivateKeyInfo representation of a private key with attributes.
         *
         * @param privateKey the key to be encoded into the info object.
         * @param attributes the set of attributes to be included.
         * @return the appropriate PrivateKeyInfo
         * @throws java.io.IOException on an error encoding the key
         */
        public static PrivateKeyInfo CreatePrivateKeyInfo(AsymmetricKeyParameter privateKey, Asn1Set attributes)
        {
            if (privateKey == null)
            {
                throw new ArgumentNullException("privateKey");
            }
            if (!privateKey.IsPrivate)
            {
                throw new ArgumentException("Public key passed - private key expected", "privateKey");
            }

            if (privateKey is ElGamalPrivateKeyParameters)
            {
                ElGamalPrivateKeyParameters _key = (ElGamalPrivateKeyParameters)privateKey;
                ElGamalParameters           egp  = _key.Parameters;
                return(new PrivateKeyInfo(
                           new AlgorithmIdentifier(OiwObjectIdentifiers.ElGamalAlgorithm, new ElGamalParameter(egp.P, egp.G).ToAsn1Object()),
                           new DerInteger(_key.X),
                           attributes));
            }

            if (privateKey is DsaPrivateKeyParameters)
            {
                DsaPrivateKeyParameters _key = (DsaPrivateKeyParameters)privateKey;
                DsaParameters           dp   = _key.Parameters;
                return(new PrivateKeyInfo(
                           new AlgorithmIdentifier(X9ObjectIdentifiers.IdDsa, new DsaParameter(dp.P, dp.Q, dp.G).ToAsn1Object()),
                           new DerInteger(_key.X),
                           attributes));
            }

            if (privateKey is DHPrivateKeyParameters)
            {
                DHPrivateKeyParameters _key = (DHPrivateKeyParameters)privateKey;

                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),
                           attributes));
            }

            if (privateKey is RsaKeyParameters)
            {
                AlgorithmIdentifier algID = new AlgorithmIdentifier(
                    PkcsObjectIdentifiers.RsaEncryption, DerNull.Instance);

                RsaPrivateKeyStructure keyStruct;
                if (privateKey is RsaPrivateCrtKeyParameters)
                {
                    RsaPrivateCrtKeyParameters _key = (RsaPrivateCrtKeyParameters)privateKey;

                    keyStruct = new RsaPrivateKeyStructure(
                        _key.Modulus,
                        _key.PublicExponent,
                        _key.Exponent,
                        _key.P,
                        _key.Q,
                        _key.DP,
                        _key.DQ,
                        _key.QInv);
                }
                else
                {
                    RsaKeyParameters _key = (RsaKeyParameters)privateKey;

                    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(), attributes));
            }

            if (privateKey is ECPrivateKeyParameters)
            {
                ECPrivateKeyParameters priv      = (ECPrivateKeyParameters)privateKey;
                DerBitString           publicKey = new DerBitString(ECKeyPairGenerator.GetCorrespondingPublicKey(priv).Q.GetEncoded(false));

                ECDomainParameters dp = priv.Parameters;
                int orderBitLength    = dp.N.BitLength;

                AlgorithmIdentifier   algID;
                ECPrivateKeyStructure ec;

                if (priv.AlgorithmName == "ECGOST3410")
                {
                    if (priv.PublicKeyParamSet == null)
                    {
                        throw BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.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, publicKey, null);
                }
                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);
                    }

                    ec = new ECPrivateKeyStructure(orderBitLength, priv.D, publicKey, x962);

                    algID = new AlgorithmIdentifier(X9ObjectIdentifiers.IdECPublicKey, x962);
                }

                return(new PrivateKeyInfo(algID, ec, attributes));
            }

            if (privateKey is Gost3410PrivateKeyParameters)
            {
                Gost3410PrivateKeyParameters _key = (Gost3410PrivateKeyParameters)privateKey;

                if (_key.PublicKeyParamSet == null)
                {
                    throw BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.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), attributes));
            }

            if (privateKey is X448PrivateKeyParameters)
            {
                X448PrivateKeyParameters key = (X448PrivateKeyParameters)privateKey;

                return(new PrivateKeyInfo(new AlgorithmIdentifier(EdECObjectIdentifiers.id_X448),
                                          new DerOctetString(key.GetEncoded()), attributes, key.GeneratePublicKey().GetEncoded()));
            }

            if (privateKey is X25519PrivateKeyParameters)
            {
                X25519PrivateKeyParameters key = (X25519PrivateKeyParameters)privateKey;

                return(new PrivateKeyInfo(new AlgorithmIdentifier(EdECObjectIdentifiers.id_X25519),
                                          new DerOctetString(key.GetEncoded()), attributes, key.GeneratePublicKey().GetEncoded()));
            }

            if (privateKey is Ed448PrivateKeyParameters)
            {
                Ed448PrivateKeyParameters key = (Ed448PrivateKeyParameters)privateKey;

                return(new PrivateKeyInfo(new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed448),
                                          new DerOctetString(key.GetEncoded()), attributes, key.GeneratePublicKey().GetEncoded()));
            }

            if (privateKey is Ed25519PrivateKeyParameters)
            {
                Ed25519PrivateKeyParameters key = (Ed25519PrivateKeyParameters)privateKey;

                return(new PrivateKeyInfo(new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed25519),
                                          new DerOctetString(key.GetEncoded()), attributes, key.GeneratePublicKey().GetEncoded()));
            }

            throw new ArgumentException("Class provided is not convertible: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.GetTypeName(privateKey));
        }