public object From(AgentReader reader)
        {
            _ = reader.ReadUInt32(); // msglen
            var answer = (AgentMessageType)reader.ReadByte();

            if (answer != AgentMessageType.SSH2_AGENT_IDENTITIES_ANSWER)
            {
                throw new Exception($"Wrong Answer {answer}");
            }

            var keys    = new List <PrivateKeyAgent>();
            var numKeys = reader.ReadUInt32();
            var i       = 0;

            while (i < numKeys)
            {
                var keyData = reader.ReadStringAsBytes();
                using var keyStream = new MemoryStream(keyData);
                using var keyReader = new AgentReader(keyStream);

                var keyType = keyReader.ReadString();
                Key key;
                switch (keyType)
                {
                case "ssh-rsa":
                    var exponent = keyReader.ReadBignum();
                    var modulus  = keyReader.ReadBignum();
                    key = new RsaAgentKey(modulus, exponent, _agent, keyData);
                    break;

                case "ecdsa-sha2-nistp256":
                // Fallthrough
                case "ecdsa-sha2-nistp384":
                // Fallthrough
                case "ecdsa-sha2-nistp521":
                    var curve = keyReader.ReadString();
                    var q     = keyReader.ReadBignum2();
                    key = new EcdsaAgentKey(curve, q, _agent, keyData);
                    break;

                case "ssh-ed25519":
                    var pK = keyReader.ReadBignum2();
                    key = new ED25519AgentKey(pK, _agent, keyData);
                    break;

                default:
                    throw new Exception($"Unsupported KeyType {keyType}");
                }
                key.Comment = reader.ReadString();
                keys.Add(new PrivateKeyAgent(key));
                i++;
            }

            return(keys.ToArray());
        }
Example #2
0
        public object From(AgentReader reader)
        {
            _ = reader.ReadUInt32(); // msglen
            var answer = (AgentMessageType)reader.ReadByte();

            if (answer != AgentMessageType.SSH2_AGENT_SIGN_RESPONSE)
            {
                throw new Exception($"Wrong Answer {answer}");
            }

            var signatureData = reader.ReadStringAsBytes();

            using var signatureStream = new MemoryStream(signatureData);
            using var signatureReader = new AgentReader(signatureStream);

            // identifier
            _ = signatureReader.ReadString();
            return(signatureReader.ReadStringAsBytes());
        }