This commit is contained in:
Ben Toews 2019-01-22 11:26:04 -07:00
Родитель 461996cc62
Коммит d970afb4d8
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: E9C423BE17EFEE70
35 изменённых файлов: 865 добавлений и 584 удалений

Просмотреть файл

@ -1,20 +1,6 @@
require "ssh_data/error"
require "ssh_data/encoding"
class SSHData
TYPE_USER = 1
TYPE_HOST = 2
RSA_CERT_TYPE = "ssh-rsa-cert-v01@openssh.com"
DSA_CERT_TYPE = "ssh-dss-cert-v01@openssh.com"
ECDSA_SHA2_NISTP256_CERT_TYPE = "ecdsa-sha2-nistp256-cert-v01@openssh.com"
ECDSA_SHA2_NISTP384_CERT_TYPE = "ecdsa-sha2-nistp384-cert-v01@openssh.com"
ECDSA_SHA2_NISTP521_CERT_TYPE = "ecdsa-sha2-nistp521-cert-v01@openssh.com"
ED25519_CERT_TYPE = "ssh-ed25519-cert-v01@openssh.com"
ECDSA_CERT_TYPES = [
ECDSA_SHA2_NISTP256_CERT_TYPE,
ECDSA_SHA2_NISTP384_CERT_TYPE,
ECDSA_SHA2_NISTP521_CERT_TYPE
]
module SSHData
end
require "ssh_data/error"
require "ssh_data/certificate"
require "ssh_data/encoding"

Просмотреть файл

@ -0,0 +1,77 @@
class SSHData::Certificate
# Integer certificate types (denotes host vs. user)
TYPE_USER = 1
TYPE_HOST = 2
# String certificate types (denotes key type).
RSA_CERT_TYPE = "ssh-rsa-cert-v01@openssh.com"
DSA_CERT_TYPE = "ssh-dss-cert-v01@openssh.com"
ECDSA_SHA2_NISTP256_CERT_TYPE = "ecdsa-sha2-nistp256-cert-v01@openssh.com"
ECDSA_SHA2_NISTP384_CERT_TYPE = "ecdsa-sha2-nistp384-cert-v01@openssh.com"
ECDSA_SHA2_NISTP521_CERT_TYPE = "ecdsa-sha2-nistp521-cert-v01@openssh.com"
ED25519_CERT_TYPE = "ssh-ed25519-cert-v01@openssh.com"
attr_reader :type_string, :nonce, :key_data, :serial, :type, :key_id,
:valid_principals, :valid_after, :valid_before, :critical_options,
:extensions, :reserved, :signature_key, :signature, :signed_data
# Parse an SSH certificate.
#
# cert - An SSH formatted certificate, including key type, encoded key and
# optional user/host names.
#
# Returns a Certificate instance.
def self.parse(cert)
data = SSHData::Encoding.parse_certificate(cert)
data[:valid_after] = Time.at(data[:valid_after])
data[:valid_before] = Time.at(data[:valid_before])
# TODO: parse more fields, where possible
new(**data)
end
# Intialize a new Certificate instance.
#
# type_string: - The certificate's String type (one of RSA_CERT_TYPE,
# DSA_CERT_TYPE, ECDSA_SHA2_NISTP256_CERT_TYPE,
# ECDSA_SHA2_NISTP384_CERT_TYPE,
# ECDSA_SHA2_NISTP521_CERT_TYPE, or ED25519_CERT_TYPE)
# nonce: - The certificate's String nonce field.
# key_data: - Hash of key-type-speciric data for public key.
# serial: - The certificate's Integer serial field.
# type: - The certificate's Integer type field (one of TYPE_USER
# or TYPE_HOST).
# key_id: - The certificate's String key_id field.
# valid_principals: - The certificate's String valid_principals field.
# valid_after: - The certificate's Time valid_after field.
# valid_before: - The certificate's Time valid_before field.
# critical_options: - The certificate's String critical_options field.
# extensions: - The certificate's String extensions field.
# reserved: - The certificate's String reserved field.
# signature_key: - The certificate's String signature_key field.
# signature: - The certificate's String signature field.
# signed_data: - The String data over which the signature was calculated.
# This isn't an actual field in the certificate, but is
# calculated during parsing.
#
# Returns nothing.
def initialize(type_string:, nonce:, key_data:, serial:, type:, key_id:, valid_principals:, valid_after:, valid_before:, critical_options:, extensions:, reserved:, signature_key:, signature:, signed_data:)
@type_string = type_string
@nonce = nonce
@key_data = key_data
@serial = serial
@type = type
@key_id = key_id
@valid_principals = valid_principals
@valid_after = valid_after
@valid_before = valid_before
@critical_options = critical_options
@extensions = extensions
@reserved = reserved
@signature_key = signature_key
@signature = signature
@signed_data = signed_data
end
end

Просмотреть файл

@ -1,234 +1,227 @@
require "openssl"
require "base64"
class SSHData
module Encoding
# Decode a certificate.
#
# cert - An SSH formatted certificate.
#
# Returns a Hash representing the decoded fields from the certificate.
def decode_cert(cert)
_, cert_b64, _ = cert.split(" ")
if cert_b64.nil?
raise DecodeError
end
module SSHData::Encoding
# Certificate fields that come before the public key.
CERT_HEADER_FIELDS = [
[:type_string, :string],
[:nonce, :string],
]
cert_raw = Base64.decode64(cert_b64)
type, _ = read_string(cert_raw)
# Certificate fields that come after the public key.
CERT_TRAILER_FIELDS = [
[:serial, :uint64],
[:type, :uint32],
[:key_id, :string],
[:valid_principals, :string],
[:valid_after, :uint64],
[:valid_before, :uint64],
[:critical_options, :string],
[:extensions, :string],
[:reserved, :string],
[:signature_key, :string],
]
hash, total_read = case type
when SSHData::RSA_CERT_TYPE
decode_all(cert_raw, [
[:key_type, :string],
[:nonce, :string],
[:e, :mpint],
[:n, :mpint],
[:serial, :uint64],
[:type, :uint32],
[:key_id, :string],
[:valid_principals, :string],
[:valid_after, :uint64],
[:valid_before, :uint64],
[:critical_options, :string],
[:extensions, :string],
[:reserved, :string],
[:signature_key, :string],
])
when SSHData::DSA_CERT_TYPE
decode_all(cert_raw, [
[:key_type, :string],
[:nonce, :string],
[:p, :mpint],
[:q, :mpint],
[:g, :mpint],
[:y, :mpint],
[:serial, :uint64],
[:type, :uint32],
[:key_id, :string],
[:valid_principals, :string],
[:valid_after, :uint64],
[:valid_before, :uint64],
[:critical_options, :string],
[:extensions, :string],
[:reserved, :string],
[:signature_key, :string],
])
when *SSHData::ECDSA_CERT_TYPES
decode_all(cert_raw, [
[:key_type, :string],
[:nonce, :string],
[:curve, :string],
[:public_key, :string],
[:serial, :uint64],
[:type, :uint32],
[:key_id, :string],
[:valid_principals, :string],
[:valid_after, :uint64],
[:valid_before, :uint64],
[:critical_options, :string],
[:extensions, :string],
[:reserved, :string],
[:signature_key, :string],
])
when SSHData::ED25519_CERT_TYPE
decode_all(cert_raw, [
[:key_type, :string],
[:nonce, :string],
[:pk, :string],
[:serial, :uint64],
[:type, :uint32],
[:key_id, :string],
[:valid_principals, :string],
[:valid_after, :uint64],
[:valid_before, :uint64],
[:critical_options, :string],
[:extensions, :string],
[:reserved, :string],
[:signature_key, :string],
])
else
raise DecodeError, "unknown cert type: #{type}"
end
# The fields describing the public key for each type of certificate.
KEY_FIELDS_BY_CERT_TYPE = {
SSHData::Certificate::RSA_CERT_TYPE => [
[:e, :mpint],
[:n, :mpint]
],
SSHData::Certificate::DSA_CERT_TYPE => [
[:p, :mpint],
[:q, :mpint],
[:g, :mpint],
[:y, :mpint]
],
SSHData::Certificate::ECDSA_SHA2_NISTP256_CERT_TYPE => [
[:curve, :string],
[:public_key, :string]
],
SSHData::Certificate::ECDSA_SHA2_NISTP384_CERT_TYPE => [
[:curve, :string],
[:public_key, :string]
],
SSHData::Certificate::ECDSA_SHA2_NISTP521_CERT_TYPE => [
[:curve, :string],
[:public_key, :string]
],
SSHData::Certificate::ED25519_CERT_TYPE => [
[:pk, :string]
]
}
# the signature is over all data up to the signature field.
hash[:signed_data] = cert_raw.byteslice(0, total_read)
hash[:signature], read = read_string(cert_raw, total_read)
total_read += read
if cert_raw.bytesize != total_read
raise DecodeError, "bad data length"
end
hash
# Decode the fields in a certificate.
#
# cert - An SSH formatted certificate, including key type, encoded key and
# optional user/host names.
#
# Returns a Hash of the certificate's fields.
def self.parse_certificate(cert)
type, cert_b64, _ = cert.split(" ")
if cert_b64.nil?
raise SSHData::DecodeError
elsif !KEY_FIELDS_BY_CERT_TYPE.key?(type)
raise SSHData::DecodeError, "unknown certificate type: #{type.inspect}"
end
# Decode all of the given fields from data.
#
# data - A binary String.
# fields - An Array of Arrays, each containing a symbol describing the field
# and a Symbol describing the type of the field (:mpint, :string,
# :uint64, or :uint32).
# offset - The offset into data at which to read (default 0).
#
# Returns an Array containing a Hash mapping the provided field keys to the
# decoded values and the Integer number of bytes read.
def decode_all(data, fields, offset=0)
hash = {}
total_read = 0
cert_raw = Base64.decode64(cert_b64)
offset = 0
data = {}
fields.each do |key, type|
value, read = case type
when :string
read_string(data, offset + total_read)
when :mpint
read_mpint(data, offset + total_read)
when :uint64
read_uint64(data, offset + total_read)
when :uint32
read_uint32(data, offset + total_read)
else
raise SSHData::DecodeError
end
header_data, read = decode_all(cert_raw, CERT_HEADER_FIELDS, 0)
offset += read
data.merge!(header_data)
hash[key] = value
total_read += read
end
[hash, total_read]
if type != data[:type_string]
raise SSHData::DecodeError, "type mismatch: #{type.inspect}!=#{data[:type_string].inspect}"
end
# Read a string out of the provided data.
#
# data - A binary String.
# offset - The offset into data at which to read (default 0).
#
# Returns an Array including the decoded String and the Integer number of
# bytes read.
def read_string(data, offset=0)
if data.bytesize < offset + 4
raise SSHData::DecodeError, "data too short"
end
key_fields = KEY_FIELDS_BY_CERT_TYPE[type]
data[:key_data], read = decode_all(cert_raw, key_fields, offset)
offset += read
size_s = data.byteslice(offset, 4)
trailer_data, read = decode_all(cert_raw, CERT_TRAILER_FIELDS, offset)
offset += read
data.merge!(trailer_data)
size = size_s.unpack("L>").first
# The signature is over all data up to the signature field. This isn't its
# own field, but we parse it out here so we don't have to do it later.
data[:signed_data] = cert_raw.byteslice(0, read)
data[:signature], read = read_string(cert_raw, offset)
offset += read
if data.bytesize < offset + 4 + size
raise SSHData::DecodeError, "data too short"
end
string = data.byteslice(offset + 4, size)
[string, 4 + size]
if cert_raw.bytesize != offset
raise SSHData::DecodeError, "bad data length"
end
# Read a multi-precision integer from the provided data.
#
# data - A binary String.
# offset - The offset into data at which to read (default 0).
#
# Returns an Array including the decoded mpint as an OpenSSL::BN and the
# Integer number of bytes read.
def read_mpint(data, offset=0)
if data.bytesize < offset + 4
raise SSHData::DecodeError, "data too short"
end
str_size_s = data.byteslice(offset, 4)
str_size = str_size_s.unpack("L>").first
mpi_size = str_size + 4
if data.bytesize < offset + mpi_size
raise SSHData::DecodeError, "data too short"
end
mpi_s = data.slice(offset, mpi_size)
# This calls OpenSSL's BN_mpi2bn() function. As far as I can tell, this
# matches up with with MPI type defined in RFC4251 Section 5 with the
# exception that OpenSSL doesn't enforce minimal length. We could enforce
# this ourselves, but it doesn't seem worth the added complexity.
mpi = OpenSSL::BN.new(mpi_s, 0)
[mpi, mpi_size]
end
# Read a uint64 from the provided data.
#
# data - A binary String.
# offset - The offset into data at which to read (default 0).
#
# Returns an Array including the decoded uint64 as an Integer and the
# Integer number of bytes read.
def read_uint64(data, offset=0)
if data.bytesize < offset + 8
raise SSHData::DecodeError, "data too short"
end
uint64 = data.byteslice(offset, 8).unpack("Q>").first
[uint64, 8]
end
# Read a uint32 from the provided data.
#
# data - A binary String.
# offset - The offset into data at which to read (default 0).
#
# Returns an Array including the decoded uint32 as an Integer and the
# Integer number of bytes read.
def read_uint32(data, offset=0)
if data.bytesize < offset + 4
raise SSHData::DecodeError, "data too short"
end
uint32 = data.byteslice(offset, 4).unpack("L>").first
[uint32, 4]
end
extend self
data
end
# Decode all of the given fields from data.
#
# data - A binary String.
# fields - An Array of Arrays, each containing a symbol describing the field
# and a Symbol describing the type of the field (:mpint, :string,
# :uint64, or :uint32).
# offset - The offset into data at which to read (default 0).
#
# Returns an Array containing a Hash mapping the provided field keys to the
# decoded values and the Integer number of bytes read.
def decode_all(data, fields, offset=0)
hash = {}
total_read = 0
fields.each do |key, type|
value, read = case type
when :string
read_string(data, offset + total_read)
when :mpint
read_mpint(data, offset + total_read)
when :uint64
read_uint64(data, offset + total_read)
when :uint32
read_uint32(data, offset + total_read)
else
raise SSHData::DecodeError
end
hash[key] = value
total_read += read
end
[hash, total_read]
end
# Read a string out of the provided data.
#
# data - A binary String.
# offset - The offset into data at which to read (default 0).
#
# Returns an Array including the decoded String and the Integer number of
# bytes read.
def read_string(data, offset=0)
if data.bytesize < offset + 4
raise SSHData::DecodeError, "data too short"
end
size_s = data.byteslice(offset, 4)
size = size_s.unpack("L>").first
if data.bytesize < offset + 4 + size
raise SSHData::DecodeError, "data too short"
end
string = data.byteslice(offset + 4, size)
[string, 4 + size]
end
# Read a multi-precision integer from the provided data.
#
# data - A binary String.
# offset - The offset into data at which to read (default 0).
#
# Returns an Array including the decoded mpint as an OpenSSL::BN and the
# Integer number of bytes read.
def read_mpint(data, offset=0)
if data.bytesize < offset + 4
raise SSHData::DecodeError, "data too short"
end
str_size_s = data.byteslice(offset, 4)
str_size = str_size_s.unpack("L>").first
mpi_size = str_size + 4
if data.bytesize < offset + mpi_size
raise SSHData::DecodeError, "data too short"
end
mpi_s = data.slice(offset, mpi_size)
# This calls OpenSSL's BN_mpi2bn() function. As far as I can tell, this
# matches up with with MPI type defined in RFC4251 Section 5 with the
# exception that OpenSSL doesn't enforce minimal length. We could enforce
# this ourselves, but it doesn't seem worth the added complexity.
mpi = OpenSSL::BN.new(mpi_s, 0)
[mpi, mpi_size]
end
# Read a uint64 from the provided data.
#
# data - A binary String.
# offset - The offset into data at which to read (default 0).
#
# Returns an Array including the decoded uint64 as an Integer and the
# Integer number of bytes read.
def read_uint64(data, offset=0)
if data.bytesize < offset + 8
raise SSHData::DecodeError, "data too short"
end
uint64 = data.byteslice(offset, 8).unpack("Q>").first
[uint64, 8]
end
# Read a uint32 from the provided data.
#
# data - A binary String.
# offset - The offset into data at which to read (default 0).
#
# Returns an Array including the decoded uint32 as an Integer and the
# Integer number of bytes read.
def read_uint32(data, offset=0)
if data.bytesize < offset + 4
raise SSHData::DecodeError, "data too short"
end
uint32 = data.byteslice(offset, 4).unpack("L>").first
[uint32, 4]
end
extend self
end

Просмотреть файл

@ -1,4 +1,4 @@
class SSHData
module SSHData
Error = Class.new(StandardError)
DecodeError = Class.new(Error)
end

160
spec/certificate_spec.rb Normal file
Просмотреть файл

@ -0,0 +1,160 @@
require_relative "./spec_helper"
describe SSHData::Certificate do
let(:rsa_cert) { described_class.parse(fixture("rsa_leaf_for_rsa_ca-cert.pub")) }
let(:dsa_cert) { described_class.parse(fixture("dsa_leaf_for_rsa_ca-cert.pub")) }
let(:ecdsa_cert) { described_class.parse(fixture("ecdsa_leaf_for_rsa_ca-cert.pub")) }
let(:ed25519_cert) { described_class.parse(fixture("ed25519_leaf_for_rsa_ca-cert.pub")) }
let(:rsa_ca_cert) { described_class.parse(fixture("rsa_leaf_for_rsa_ca-cert.pub")) }
let(:dsa_ca_cert) { described_class.parse(fixture("rsa_leaf_for_dsa_ca-cert.pub")) }
let(:ecdsa_ca_cert) { described_class.parse(fixture("rsa_leaf_for_ecdsa_ca-cert.pub")) }
let(:ed25519_ca_cert) { described_class.parse(fixture("rsa_leaf_for_ed25519_ca-cert.pub")) }
let(:min_time) { Time.at(0) }
let(:max_time) { Time.at((2**64)-1) }
it "parses RSA certs" do
expect(rsa_cert.type_string).to eq(SSHData::Certificate::RSA_CERT_TYPE)
expect(rsa_cert.nonce).to be_a(String)
expect(rsa_cert.key_data).to be_a(Hash)
expect(rsa_cert.serial).to eq(123)
expect(rsa_cert.type).to eq(SSHData::Certificate::TYPE_USER)
expect(rsa_cert.key_id).to eq("my-ident")
expect(rsa_cert.valid_principals).to eq("\x00\x00\x00\x0Cmy-principal")
expect(rsa_cert.valid_after).to eq(min_time)
expect(rsa_cert.valid_before).to eq(max_time)
expect(rsa_cert.critical_options).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(rsa_cert.extensions).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(rsa_cert.reserved).to eq("")
expect(rsa_cert.signature_key).to be_a(String)
expect(rsa_cert.signature).to be_a(String)
expect(rsa_cert.signed_data).to be_a(String)
end
it "parses DSA certs" do
expect(dsa_cert.type_string).to eq(SSHData::Certificate::DSA_CERT_TYPE)
expect(dsa_cert.nonce).to be_a(String)
expect(dsa_cert.key_data).to be_a(Hash)
expect(dsa_cert.serial).to eq(123)
expect(dsa_cert.type).to eq(SSHData::Certificate::TYPE_USER)
expect(dsa_cert.key_id).to eq("my-ident")
expect(dsa_cert.valid_principals).to eq("\x00\x00\x00\x0Cmy-principal")
expect(dsa_cert.valid_after).to eq(min_time)
expect(dsa_cert.valid_before).to eq(max_time)
expect(dsa_cert.critical_options).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(dsa_cert.extensions).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(dsa_cert.reserved).to eq("")
expect(dsa_cert.signature_key).to be_a(String)
expect(dsa_cert.signature).to be_a(String)
expect(dsa_cert.signed_data).to be_a(String)
end
it "parses ECDSA certs" do
expect(ecdsa_cert.type_string).to eq(SSHData::Certificate::ECDSA_SHA2_NISTP256_CERT_TYPE)
expect(ecdsa_cert.nonce).to be_a(String)
expect(ecdsa_cert.key_data).to be_a(Hash)
expect(ecdsa_cert.serial).to eq(123)
expect(ecdsa_cert.type).to eq(SSHData::Certificate::TYPE_USER)
expect(ecdsa_cert.key_id).to eq("my-ident")
expect(ecdsa_cert.valid_principals).to eq("\x00\x00\x00\x0Cmy-principal")
expect(ecdsa_cert.valid_after).to eq(min_time)
expect(ecdsa_cert.valid_before).to eq(max_time)
expect(ecdsa_cert.critical_options).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(ecdsa_cert.extensions).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(ecdsa_cert.reserved).to eq("")
expect(ecdsa_cert.signature_key).to be_a(String)
expect(ecdsa_cert.signature).to be_a(String)
expect(ecdsa_cert.signed_data).to be_a(String)
end
it "parses ED25519 certs" do
expect(ed25519_cert.type_string).to eq(SSHData::Certificate::ED25519_CERT_TYPE)
expect(ed25519_cert.nonce).to be_a(String)
expect(ed25519_cert.key_data).to be_a(Hash)
expect(ed25519_cert.serial).to eq(123)
expect(ed25519_cert.type).to eq(SSHData::Certificate::TYPE_USER)
expect(ed25519_cert.key_id).to eq("my-ident")
expect(ed25519_cert.valid_principals).to eq("\x00\x00\x00\x0Cmy-principal")
expect(ed25519_cert.valid_after).to eq(min_time)
expect(ed25519_cert.valid_before).to eq(max_time)
expect(ed25519_cert.critical_options).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(ed25519_cert.extensions).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(ed25519_cert.reserved).to eq("")
expect(ed25519_cert.signature_key).to be_a(String)
expect(ed25519_cert.signature).to be_a(String)
expect(ed25519_cert.signed_data).to be_a(String)
end
it "parses certs issued by RSA CAs" do
expect(rsa_ca_cert.type_string).to eq(SSHData::Certificate::RSA_CERT_TYPE)
expect(rsa_ca_cert.nonce).to be_a(String)
expect(rsa_ca_cert.key_data).to be_a(Hash)
expect(rsa_ca_cert.serial).to eq(123)
expect(rsa_ca_cert.type).to eq(SSHData::Certificate::TYPE_USER)
expect(rsa_ca_cert.key_id).to eq("my-ident")
expect(rsa_ca_cert.valid_principals).to eq("\x00\x00\x00\x0Cmy-principal")
expect(rsa_ca_cert.valid_after).to eq(min_time)
expect(rsa_ca_cert.valid_before).to eq(max_time)
expect(rsa_ca_cert.critical_options).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(rsa_ca_cert.extensions).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(rsa_ca_cert.reserved).to eq("")
expect(rsa_ca_cert.signature_key).to be_a(String)
expect(rsa_ca_cert.signature).to be_a(String)
expect(rsa_ca_cert.signed_data).to be_a(String)
end
it "parses certs issued by DSA CAs" do
expect(dsa_ca_cert.type_string).to eq(SSHData::Certificate::RSA_CERT_TYPE)
expect(dsa_ca_cert.nonce).to be_a(String)
expect(dsa_ca_cert.key_data).to be_a(Hash)
expect(dsa_ca_cert.serial).to eq(123)
expect(dsa_ca_cert.type).to eq(SSHData::Certificate::TYPE_USER)
expect(dsa_ca_cert.key_id).to eq("my-ident")
expect(dsa_ca_cert.valid_principals).to eq("\x00\x00\x00\x0Cmy-principal")
expect(dsa_ca_cert.valid_after).to eq(min_time)
expect(dsa_ca_cert.valid_before).to eq(max_time)
expect(dsa_ca_cert.critical_options).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(dsa_ca_cert.extensions).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(dsa_ca_cert.reserved).to eq("")
expect(dsa_ca_cert.signature_key).to be_a(String)
expect(dsa_ca_cert.signature).to be_a(String)
expect(dsa_ca_cert.signed_data).to be_a(String)
end
it "parses certs issued by ECDSA CAs" do
expect(ecdsa_ca_cert.type_string).to eq(SSHData::Certificate::RSA_CERT_TYPE)
expect(ecdsa_ca_cert.nonce).to be_a(String)
expect(ecdsa_ca_cert.key_data).to be_a(Hash)
expect(ecdsa_ca_cert.serial).to eq(123)
expect(ecdsa_ca_cert.type).to eq(SSHData::Certificate::TYPE_USER)
expect(ecdsa_ca_cert.key_id).to eq("my-ident")
expect(ecdsa_ca_cert.valid_principals).to eq("\x00\x00\x00\x0Cmy-principal")
expect(ecdsa_ca_cert.valid_after).to eq(min_time)
expect(ecdsa_ca_cert.valid_before).to eq(max_time)
expect(ecdsa_ca_cert.critical_options).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(ecdsa_ca_cert.extensions).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(ecdsa_ca_cert.reserved).to eq("")
expect(ecdsa_ca_cert.signature_key).to be_a(String)
expect(ecdsa_ca_cert.signature).to be_a(String)
expect(ecdsa_ca_cert.signed_data).to be_a(String)
end
it "parses certs issued by ED25519 CAs" do
expect(ed25519_ca_cert.type_string).to eq(SSHData::Certificate::RSA_CERT_TYPE)
expect(ed25519_ca_cert.nonce).to be_a(String)
expect(ed25519_ca_cert.key_data).to be_a(Hash)
expect(ed25519_ca_cert.serial).to eq(123)
expect(ed25519_ca_cert.type).to eq(SSHData::Certificate::TYPE_USER)
expect(ed25519_ca_cert.key_id).to eq("my-ident")
expect(ed25519_ca_cert.valid_principals).to eq("\x00\x00\x00\x0Cmy-principal")
expect(ed25519_ca_cert.valid_after).to eq(min_time)
expect(ed25519_ca_cert.valid_before).to eq(max_time)
expect(ed25519_ca_cert.critical_options).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(ed25519_ca_cert.extensions).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(ed25519_ca_cert.reserved).to eq("")
expect(ed25519_ca_cert.signature_key).to be_a(String)
expect(ed25519_ca_cert.signature).to be_a(String)
expect(ed25519_ca_cert.signed_data).to be_a(String)
end
end

Просмотреть файл

@ -1,208 +1,273 @@
require_relative "./spec_helper"
describe SSHData::Encoding do
let(:rsa_cert) { described_class.decode_cert(fixture("rsa_leaf_for_rsa_ca-cert.pub")) }
let(:dsa_cert) { described_class.decode_cert(fixture("dsa_leaf_for_rsa_ca-cert.pub")) }
let(:ecdsa_cert) { described_class.decode_cert(fixture("ecdsa_leaf_for_rsa_ca-cert.pub")) }
let(:ed25519_cert) { described_class.decode_cert(fixture("ed25519_leaf_for_rsa_ca-cert.pub")) }
let(:rsa_data) { described_class.parse_certificate(fixture("rsa_leaf_for_rsa_ca-cert.pub")) }
let(:dsa_data) { described_class.parse_certificate(fixture("dsa_leaf_for_rsa_ca-cert.pub")) }
let(:ecdsa_data) { described_class.parse_certificate(fixture("ecdsa_leaf_for_rsa_ca-cert.pub")) }
let(:ed25519_data) { described_class.parse_certificate(fixture("ed25519_leaf_for_rsa_ca-cert.pub")) }
let(:rsa_ca_cert) { described_class.decode_cert(fixture("rsa_leaf_for_rsa_ca-cert.pub")) }
let(:dsa_ca_cert) { described_class.decode_cert(fixture("rsa_leaf_for_dsa_ca-cert.pub")) }
let(:ecdsa_ca_cert) { described_class.decode_cert(fixture("rsa_leaf_for_ecdsa_ca-cert.pub")) }
let(:ed25519_ca_cert) { described_class.decode_cert(fixture("rsa_leaf_for_ed25519_ca-cert.pub")) }
let(:rsa_ca_data) { described_class.parse_certificate(fixture("rsa_leaf_for_rsa_ca-cert.pub")) }
let(:dsa_ca_data) { described_class.parse_certificate(fixture("rsa_leaf_for_dsa_ca-cert.pub")) }
let(:ecdsa_ca_data) { described_class.parse_certificate(fixture("rsa_leaf_for_ecdsa_ca-cert.pub")) }
let(:ed25519_ca_data) { described_class.parse_certificate(fixture("rsa_leaf_for_ed25519_ca-cert.pub")) }
it "raises on type mismatch" do
_, cert, host = fixture("rsa_leaf_for_rsa_ca-cert.pub").split(" ", 3)
bad_type_cert = [SSHData::Certificate::ED25519_CERT_TYPE, cert, host].join(" ")
expect {
described_class.parse_certificate(bad_type_cert)
}.to raise_error(SSHData::DecodeError)
end
it "doesn't require the user/host names" do
type, cert, _ = fixture("rsa_leaf_for_rsa_ca-cert.pub").split(" ", 3)
no_host_cert = [type, cert].join(" ")
expect {
described_class.parse_certificate(no_host_cert)
}.not_to raise_error
end
it "can decode RSA certificates" do
expect(rsa_cert[:key_type]).to be_a(String)
expect(rsa_cert[:key_type]).to eq(SSHData::RSA_CERT_TYPE)
expect(rsa_data[:type_string]).to eq(SSHData::Certificate::RSA_CERT_TYPE)
expect(rsa_cert[:nonce]).to be_a(String)
expect(rsa_cert[:nonce].length).to eq(32)
expect(rsa_data[:nonce]).to be_a(String)
expect(rsa_data[:nonce].length).to eq(32)
expect(rsa_cert[:e]).to be_a(OpenSSL::BN)
expect(rsa_cert[:e]).not_to eq(OpenSSL::BN.new(0))
expect(rsa_data[:key_data][:e]).to be_a(OpenSSL::BN)
expect(rsa_data[:key_data][:e]).not_to eq(OpenSSL::BN.new(0))
expect(rsa_cert[:n]).to be_a(OpenSSL::BN)
expect(rsa_cert[:n]).not_to eq(OpenSSL::BN.new(0))
expect(rsa_data[:key_data][:n]).to be_a(OpenSSL::BN)
expect(rsa_data[:key_data][:n]).not_to eq(OpenSSL::BN.new(0))
expect(rsa_cert[:serial]).to be_a(Integer)
expect(rsa_cert[:serial]).to eq(123)
expect(rsa_data[:serial]).to eq(123)
expect(rsa_data[:type]).to eq(SSHData::Certificate::TYPE_USER)
expect(rsa_data[:key_id]).to eq("my-ident")
expect(rsa_data[:valid_principals]).to eq("\x00\x00\x00\x0Cmy-principal")
expect(rsa_data[:valid_after]).to eq(0)
expect(rsa_data[:valid_before]).to eq((2**64)-1)
expect(rsa_data[:critical_options]).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(rsa_data[:extensions]).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(rsa_data[:reserved]).to eq("")
expect(rsa_cert[:type]).to be_a(Integer)
expect(rsa_cert[:type]).to eq(SSHData::TYPE_USER)
expect(rsa_data[:signature_key]).to be_a(String)
expect(rsa_data[:signature_key].bytesize).to eq(279)
expect(rsa_cert[:key_id]).to be_a(String)
expect(rsa_cert[:key_id]).to eq("my-ident")
expect(rsa_data[:signed_data]).to be_a(String)
expect(rsa_data[:signed_data].bytesize).to eq(392)
expect(rsa_cert[:valid_principals]).to be_a(String)
expect(rsa_cert[:valid_principals]).to eq("\x00\x00\x00\x0Cmy-principal")
expect(rsa_cert[:valid_after]).to be_a(Integer)
expect(rsa_cert[:valid_after]).to eq(0)
expect(rsa_cert[:valid_before]).to be_a(Integer)
expect(rsa_cert[:valid_before]).to eq((2**64)-1)
expect(rsa_cert[:critical_options]).to be_a(String)
expect(rsa_cert[:critical_options]).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(rsa_cert[:extensions]).to be_a(String)
expect(rsa_cert[:extensions]).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(rsa_cert[:reserved]).to be_a(String)
expect(rsa_cert[:reserved]).to eq("")
expect(rsa_cert[:signature_key]).to be_a(String)
expect(rsa_cert[:signed_data]).to be_a(String)
expect(rsa_cert[:signed_data].bytesize).to eq(728)
expect(rsa_cert[:signature]).to be_a(String)
expect(rsa_data[:signature]).to be_a(String)
expect(rsa_data[:signature].bytesize).to eq(271)
end
it "can decode DSA certificates" do
expect(dsa_cert[:key_type]).to be_a(String)
expect(dsa_cert[:key_type]).to eq(SSHData::DSA_CERT_TYPE)
expect(dsa_data[:type_string]).to eq(SSHData::Certificate::DSA_CERT_TYPE)
expect(dsa_cert[:nonce]).to be_a(String)
expect(dsa_cert[:nonce].length).to eq(32)
expect(dsa_data[:nonce]).to be_a(String)
expect(dsa_data[:nonce].length).to eq(32)
expect(dsa_cert[:p]).to be_a(OpenSSL::BN)
expect(dsa_cert[:p]).not_to eq(OpenSSL::BN.new(0))
expect(dsa_data[:key_data][:p]).to be_a(OpenSSL::BN)
expect(dsa_data[:key_data][:p]).not_to eq(OpenSSL::BN.new(0))
expect(dsa_cert[:q]).to be_a(OpenSSL::BN)
expect(dsa_cert[:q]).not_to eq(OpenSSL::BN.new(0))
expect(dsa_data[:key_data][:q]).to be_a(OpenSSL::BN)
expect(dsa_data[:key_data][:q]).not_to eq(OpenSSL::BN.new(0))
expect(dsa_cert[:g]).to be_a(OpenSSL::BN)
expect(dsa_cert[:g]).not_to eq(OpenSSL::BN.new(0))
expect(dsa_data[:key_data][:g]).to be_a(OpenSSL::BN)
expect(dsa_data[:key_data][:g]).not_to eq(OpenSSL::BN.new(0))
expect(dsa_cert[:y]).to be_a(OpenSSL::BN)
expect(dsa_cert[:y]).not_to eq(OpenSSL::BN.new(0))
expect(dsa_data[:key_data][:y]).to be_a(OpenSSL::BN)
expect(dsa_data[:key_data][:y]).not_to eq(OpenSSL::BN.new(0))
expect(dsa_cert[:serial]).to be_a(Integer)
expect(dsa_cert[:serial]).to eq(123)
expect(dsa_data[:serial]).to eq(123)
expect(dsa_data[:type]).to eq(SSHData::Certificate::TYPE_USER)
expect(dsa_data[:key_id]).to eq("my-ident")
expect(dsa_data[:valid_principals]).to eq("\x00\x00\x00\x0Cmy-principal")
expect(dsa_data[:valid_after]).to eq(0)
expect(dsa_data[:valid_before]).to eq((2**64)-1)
expect(dsa_data[:critical_options]).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(dsa_data[:extensions]).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(dsa_data[:reserved]).to eq("")
expect(dsa_cert[:type]).to be_a(Integer)
expect(dsa_cert[:type]).to eq(SSHData::TYPE_USER)
expect(dsa_data[:signature_key]).to be_a(String)
expect(dsa_data[:signature_key].bytesize).to eq(279)
expect(dsa_cert[:key_id]).to be_a(String)
expect(dsa_cert[:key_id]).to eq("my-ident")
expect(dsa_data[:signed_data]).to be_a(String)
expect(dsa_data[:signed_data].bytesize).to eq(392)
expect(dsa_cert[:valid_principals]).to be_a(String)
expect(dsa_cert[:valid_principals]).to eq("\x00\x00\x00\x0Cmy-principal")
expect(dsa_cert[:valid_after]).to be_a(Integer)
expect(dsa_cert[:valid_after]).to eq(0)
expect(dsa_cert[:valid_before]).to be_a(Integer)
expect(dsa_cert[:valid_before]).to eq((2**64)-1)
expect(dsa_cert[:critical_options]).to be_a(String)
expect(dsa_cert[:critical_options]).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(dsa_cert[:extensions]).to be_a(String)
expect(dsa_cert[:extensions]).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(dsa_cert[:reserved]).to be_a(String)
expect(dsa_cert[:reserved]).to eq("")
expect(dsa_cert[:signature_key]).to be_a(String)
expect(dsa_cert[:signed_data]).to be_a(String)
expect(dsa_cert[:signed_data].bytesize).to eq(883)
expect(dsa_cert[:signature]).to be_a(String)
expect(dsa_data[:signature]).to be_a(String)
expect(dsa_data[:signature].bytesize).to eq(271)
end
it "can decode ECDSA certificates" do
expect(ecdsa_cert[:key_type]).to be_a(String)
expect(ecdsa_cert[:key_type]).to eq(SSHData::ECDSA_SHA2_NISTP256_CERT_TYPE)
expect(ecdsa_data[:type_string]).to eq(SSHData::Certificate::ECDSA_SHA2_NISTP256_CERT_TYPE)
expect(ecdsa_cert[:nonce]).to be_a(String)
expect(ecdsa_cert[:nonce].length).to eq(32)
expect(ecdsa_data[:nonce]).to be_a(String)
expect(ecdsa_data[:nonce].length).to eq(32)
expect(ecdsa_cert[:curve]).to be_a(String)
expect(ecdsa_cert[:curve]).to eq("nistp256")
expect(ecdsa_data[:key_data][:curve]).to be_a(String)
expect(ecdsa_data[:key_data][:curve]).to eq("nistp256")
expect(ecdsa_cert[:public_key]).to be_a(String)
expect(ecdsa_cert[:public_key].length).to eq(65)
expect(ecdsa_data[:key_data][:public_key]).to be_a(String)
expect(ecdsa_data[:key_data][:public_key].length).to eq(65)
expect(ecdsa_cert[:serial]).to be_a(Integer)
expect(ecdsa_cert[:serial]).to eq(123)
expect(ecdsa_data[:serial]).to eq(123)
expect(ecdsa_data[:type]).to eq(SSHData::Certificate::TYPE_USER)
expect(ecdsa_data[:key_id]).to eq("my-ident")
expect(ecdsa_data[:valid_principals]).to eq("\x00\x00\x00\x0Cmy-principal")
expect(ecdsa_data[:valid_after]).to eq(0)
expect(ecdsa_data[:valid_before]).to eq((2**64)-1)
expect(ecdsa_data[:critical_options]).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(ecdsa_data[:extensions]).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(ecdsa_data[:reserved]).to eq("")
expect(ecdsa_cert[:type]).to be_a(Integer)
expect(ecdsa_cert[:type]).to eq(SSHData::TYPE_USER)
expect(ecdsa_data[:signature_key]).to be_a(String)
expect(ecdsa_data[:signature_key].bytesize).to eq(279)
expect(ecdsa_cert[:key_id]).to be_a(String)
expect(ecdsa_cert[:key_id]).to eq("my-ident")
expect(ecdsa_data[:signed_data]).to be_a(String)
expect(ecdsa_data[:signed_data].bytesize).to eq(392)
expect(ecdsa_cert[:valid_principals]).to be_a(String)
expect(ecdsa_cert[:valid_principals]).to eq("\x00\x00\x00\x0Cmy-principal")
expect(ecdsa_cert[:valid_after]).to be_a(Integer)
expect(ecdsa_cert[:valid_after]).to eq(0)
expect(ecdsa_cert[:valid_before]).to be_a(Integer)
expect(ecdsa_cert[:valid_before]).to eq((2**64)-1)
expect(ecdsa_cert[:critical_options]).to be_a(String)
expect(ecdsa_cert[:critical_options]).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(ecdsa_cert[:extensions]).to be_a(String)
expect(ecdsa_cert[:extensions]).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(ecdsa_cert[:reserved]).to be_a(String)
expect(ecdsa_cert[:reserved]).to eq("")
expect(ecdsa_cert[:signature_key]).to be_a(String)
expect(ecdsa_cert[:signed_data]).to be_a(String)
expect(ecdsa_cert[:signed_data].bytesize).to eq(553)
expect(ecdsa_cert[:signature]).to be_a(String)
expect(ecdsa_data[:signature]).to be_a(String)
expect(ecdsa_data[:signature].bytesize).to eq(271)
end
it "can decode ED25519 certificates" do
expect(ed25519_cert[:key_type]).to be_a(String)
expect(ed25519_cert[:key_type]).to eq(SSHData::ED25519_CERT_TYPE)
expect(ed25519_data[:type_string]).to eq(SSHData::Certificate::ED25519_CERT_TYPE)
expect(ed25519_cert[:nonce]).to be_a(String)
expect(ed25519_cert[:nonce].length).to eq(32)
expect(ed25519_data[:nonce]).to be_a(String)
expect(ed25519_data[:nonce].length).to eq(32)
expect(ed25519_cert[:pk]).to be_a(String)
expect(ed25519_cert[:pk].length).to eq(32)
expect(ed25519_data[:key_data][:pk]).to be_a(String)
expect(ed25519_data[:key_data][:pk].length).to eq(32)
expect(ed25519_cert[:serial]).to be_a(Integer)
expect(ed25519_cert[:serial]).to eq(123)
expect(ed25519_data[:serial]).to eq(123)
expect(ed25519_data[:type]).to eq(SSHData::Certificate::TYPE_USER)
expect(ed25519_data[:key_id]).to eq("my-ident")
expect(ed25519_data[:valid_principals]).to eq("\x00\x00\x00\x0Cmy-principal")
expect(ed25519_data[:valid_after]).to eq(0)
expect(ed25519_data[:valid_before]).to eq((2**64)-1)
expect(ed25519_data[:critical_options]).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(ed25519_data[:extensions]).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(ed25519_data[:reserved]).to eq("")
expect(ed25519_cert[:type]).to be_a(Integer)
expect(ed25519_cert[:type]).to eq(SSHData::TYPE_USER)
expect(ed25519_data[:signature_key]).to be_a(String)
expect(ed25519_data[:signature_key].bytesize).to eq(279)
expect(ed25519_cert[:key_id]).to be_a(String)
expect(ed25519_cert[:key_id]).to eq("my-ident")
expect(ed25519_data[:signed_data]).to be_a(String)
expect(ed25519_data[:signed_data].bytesize).to eq(392)
expect(ed25519_cert[:valid_principals]).to be_a(String)
expect(ed25519_cert[:valid_principals]).to eq("\x00\x00\x00\x0Cmy-principal")
expect(ed25519_data[:signature]).to be_a(String)
expect(ed25519_data[:signature].bytesize).to eq(271)
end
expect(ed25519_cert[:valid_after]).to be_a(Integer)
expect(ed25519_cert[:valid_after]).to eq(0)
it "can decode certs from RSA CAs" do
expect(rsa_ca_data[:type_string]).to eq(SSHData::Certificate::RSA_CERT_TYPE)
expect(ed25519_cert[:valid_before]).to be_a(Integer)
expect(ed25519_cert[:valid_before]).to eq((2**64)-1)
expect(rsa_ca_data[:nonce]).to be_a(String)
expect(rsa_ca_data[:nonce].length).to eq(32)
expect(ed25519_cert[:critical_options]).to be_a(String)
expect(ed25519_cert[:critical_options]).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(rsa_ca_data[:key_data][:e]).to be_a(OpenSSL::BN)
expect(rsa_ca_data[:key_data][:e]).not_to eq(OpenSSL::BN.new(0))
expect(ed25519_cert[:extensions]).to be_a(String)
expect(ed25519_cert[:extensions]).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(rsa_ca_data[:key_data][:n]).to be_a(OpenSSL::BN)
expect(rsa_ca_data[:key_data][:n]).not_to eq(OpenSSL::BN.new(0))
expect(ed25519_cert[:reserved]).to be_a(String)
expect(ed25519_cert[:reserved]).to eq("")
expect(rsa_ca_data[:serial]).to eq(123)
expect(rsa_ca_data[:type]).to eq(SSHData::Certificate::TYPE_USER)
expect(rsa_ca_data[:key_id]).to eq("my-ident")
expect(rsa_ca_data[:valid_principals]).to eq("\x00\x00\x00\x0Cmy-principal")
expect(rsa_ca_data[:valid_after]).to eq(0)
expect(rsa_ca_data[:valid_before]).to eq((2**64)-1)
expect(rsa_ca_data[:critical_options]).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(rsa_ca_data[:extensions]).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(rsa_ca_data[:reserved]).to eq("")
expect(ed25519_cert[:signature_key]).to be_a(String)
expect(rsa_ca_data[:signature_key]).to be_a(String)
expect(rsa_ca_data[:signature_key].bytesize).to eq(279)
expect(ed25519_cert[:signed_data]).to be_a(String)
expect(ed25519_cert[:signed_data].bytesize).to eq(500)
expect(rsa_ca_data[:signed_data]).to be_a(String)
expect(rsa_ca_data[:signed_data].bytesize).to eq(392)
expect(ed25519_cert[:signature]).to be_a(String)
expect(rsa_ca_data[:signature]).to be_a(String)
expect(rsa_ca_data[:signature].bytesize).to eq(271)
end
it "can decode certs from DSA CAs" do
expect(dsa_ca_data[:type_string]).to eq(SSHData::Certificate::RSA_CERT_TYPE)
expect(dsa_ca_data[:nonce]).to be_a(String)
expect(dsa_ca_data[:nonce].length).to eq(32)
expect(dsa_ca_data[:key_data][:e]).to be_a(OpenSSL::BN)
expect(dsa_ca_data[:key_data][:e]).not_to eq(OpenSSL::BN.new(0))
expect(dsa_ca_data[:key_data][:n]).to be_a(OpenSSL::BN)
expect(dsa_ca_data[:key_data][:n]).not_to eq(OpenSSL::BN.new(0))
expect(dsa_ca_data[:serial]).to eq(123)
expect(dsa_ca_data[:type]).to eq(SSHData::Certificate::TYPE_USER)
expect(dsa_ca_data[:key_id]).to eq("my-ident")
expect(dsa_ca_data[:valid_principals]).to eq("\x00\x00\x00\x0Cmy-principal")
expect(dsa_ca_data[:valid_after]).to eq(0)
expect(dsa_ca_data[:valid_before]).to eq((2**64)-1)
expect(dsa_ca_data[:critical_options]).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(dsa_ca_data[:extensions]).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(dsa_ca_data[:reserved]).to eq("")
expect(dsa_ca_data[:signature_key]).to be_a(String)
expect(dsa_ca_data[:signed_data]).to be_a(String)
expect(dsa_ca_data[:signature]).to be_a(String)
end
it "can decode certs from ECDSA CAs" do
expect(ecdsa_ca_data[:type_string]).to eq(SSHData::Certificate::RSA_CERT_TYPE)
expect(ecdsa_ca_data[:nonce]).to be_a(String)
expect(ecdsa_ca_data[:nonce].length).to eq(32)
expect(ecdsa_ca_data[:key_data][:e]).to be_a(OpenSSL::BN)
expect(ecdsa_ca_data[:key_data][:e]).not_to eq(OpenSSL::BN.new(0))
expect(ecdsa_ca_data[:key_data][:n]).to be_a(OpenSSL::BN)
expect(ecdsa_ca_data[:key_data][:n]).not_to eq(OpenSSL::BN.new(0))
expect(ecdsa_ca_data[:serial]).to eq(123)
expect(ecdsa_ca_data[:type]).to eq(SSHData::Certificate::TYPE_USER)
expect(ecdsa_ca_data[:key_id]).to eq("my-ident")
expect(ecdsa_ca_data[:valid_principals]).to eq("\x00\x00\x00\x0Cmy-principal")
expect(ecdsa_ca_data[:valid_after]).to eq(0)
expect(ecdsa_ca_data[:valid_before]).to eq((2**64)-1)
expect(ecdsa_ca_data[:critical_options]).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(ecdsa_ca_data[:extensions]).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(ecdsa_ca_data[:reserved]).to eq("")
expect(ecdsa_ca_data[:signature_key]).to be_a(String)
expect(ecdsa_ca_data[:signed_data]).to be_a(String)
expect(ecdsa_ca_data[:signature]).to be_a(String)
end
it "can decode certs from ED25519 CAs" do
expect(ed25519_ca_data[:type_string]).to eq(SSHData::Certificate::RSA_CERT_TYPE)
expect(ed25519_ca_data[:nonce]).to be_a(String)
expect(ed25519_ca_data[:nonce].length).to eq(32)
expect(ed25519_ca_data[:key_data][:e]).to be_a(OpenSSL::BN)
expect(ed25519_ca_data[:key_data][:e]).not_to eq(OpenSSL::BN.new(0))
expect(ed25519_ca_data[:key_data][:n]).to be_a(OpenSSL::BN)
expect(ed25519_ca_data[:key_data][:n]).not_to eq(OpenSSL::BN.new(0))
expect(ed25519_ca_data[:serial]).to eq(123)
expect(ed25519_ca_data[:type]).to eq(SSHData::Certificate::TYPE_USER)
expect(ed25519_ca_data[:key_id]).to eq("my-ident")
expect(ed25519_ca_data[:valid_principals]).to eq("\x00\x00\x00\x0Cmy-principal")
expect(ed25519_ca_data[:valid_after]).to eq(0)
expect(ed25519_ca_data[:valid_before]).to eq((2**64)-1)
expect(ed25519_ca_data[:critical_options]).to eq("\x00\x00\x00\x03foo\x00\x00\x00\x07\x00\x00\x00\x03bar")
expect(ed25519_ca_data[:extensions]).to eq("\x00\x00\x00\x03baz\x00\x00\x00\x08\x00\x00\x00\x04qwer")
expect(ed25519_ca_data[:reserved]).to eq("")
expect(ed25519_ca_data[:signature_key]).to be_a(String)
expect(ed25519_ca_data[:signed_data]).to be_a(String)
expect(ed25519_ca_data[:signature]).to be_a(String)
end
end

34
spec/fixtures/dsa_ca поставляемый
Просмотреть файл

@ -1,21 +1,21 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

2
spec/fixtures/dsa_ca.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ssh-dss AAAAB3NzaC1kc3MAAACBAONijOZbJwFvNKNyXnvYxuV3yvYWHP8z3dyntmipL194NRX2LrgCHGAZ1VfVVZ24MlXhx/QZkkO7iV3xz4Dc/8pFNJdYa1/KqlcxLtcGUAyY+ekIAZG94nsFJ7HcFqfwcpPl7Q+ahP/72TUeDhnpKo02nN7AH6jTq1jjVW6AuUsPAAAAFQCD0XhOeJ/7lZLwFFZeN1RhjHYj/wAAAIBbXHdHn+pBOWtlkrba8LAL/WEqZ3/aXtVhx5dzyKZzUiLBJd1wCkWHjUCecSRLp0wEDFvQSEmw7ClF3+WXK6A4j4uN1vkpJ498RwD14Y8XLNdnPa5m1TX8x5JvGfsrieUGOc71WKU8dBTJAScUb+qxMBNemlocuq3OiDobk3nT0QAAAIAW6g45vOmiBbZYBwGahK+J4Kf90UUVSbp6tGh5aeQy8vzZ8JTf/y4csa4BQgn2PJFDrT6XA1VcipeP2Cs+kb9+wKoCMocaYqqWvjv82NrlBApEk4A9hJ+aMmLJQZNQ1TPuDx4p0FzK+TUU6Bo4iaPM9+jShFuwoLfvWNMFUXZZpA== mastahyeti@Benjamins-MacBook-Pro.local
ssh-dss AAAAB3NzaC1kc3MAAACBANVX4S7anFoqd2P2NTKz+eJ83sbpvfbda0K2WkuWHfJ6cjwmxjjaj63NQ1sJg+LrSyMaZDTCjwFA24Kuu0HU7/4Q6rKw9FpinAfdDGDcFS9cpl4ExeVO6VWN6YDQY6w9v43O+I+7l3Li40PCW5vLSgXyx4nDxnOiR8uWXDOnP9p5AAAAFQDqNn6dFfhZdENuWkihuSilHf8uxQAAAIANYJyMBWVVDvZLGrgiXZY8R3kh0MciO/l/vp0pZ3tf8Mkb2ntyCqyvDQncc7NebLSk2zazxl1JJcH60JEkbiUC+caY8+Sh+mshsfWZjFpxp8hsbpZ88y29lptrx0uo8t8ikgUfuowSysYHugV++oSCwEdMVqVql8nl+mHC0TJYgQAAAIAc/O65ZJ/eS654eOdsc+Z0wztiG5GlcDENQhyZsfGSPudvj1GNwrjcGaAqsjYd07bj6fFDRCONoXcF2jQaqzotVFAPlTSSgoxb9RAgWuihSypGa3OIkkKTSJmJ3O4N9QkTUpIN9vZoY0hhmTd4nAjZNdVVdM3GGbX3plw6LaBdZg== mastahyeti@Benjamins-MacBook-Pro.local

36
spec/fixtures/dsa_leaf_for_rsa_ca поставляемый
Просмотреть файл

@ -1,21 +1,21 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

2
spec/fixtures/dsa_leaf_for_rsa_ca-cert.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ssh-dss-cert-v01@openssh.com AAAAHHNzaC1kc3MtY2VydC12MDFAb3BlbnNzaC5jb20AAAAg5CSt21eTTC9sOUBzkCouOr9H7TLNPV26SeOCJaehPtUAAACBAJdDo8NR4glY6pFOkgpZsGev9SgnEiIaD7KF3r8M8iylRCu3FGcxqO0tCHLwceNBb2Ci98ADFOlOaUH1k8MFFVZ7xTvaeuDaFFZ7GPv/tDUMxEdHV1VDXPJ1QmiGff/p+w0DPhtxowllYp/AyipnVU8yWourjMHDaGIFeyHozpUrAAAAFQCw6fMFoR6/IBXs26bpdPm+ivTigQAAAIBJcDUrwC63U1auMFuxcXyj31X7jdkEfT9wMBpNPQaAABxiircxObGRpV0Qxp531NY6IvFQ7LM+4WyKk4BRjo0Pbm+SVuT1bxRtdV45bvoi2tKXkIXHDQhha5K0MM8JREMItus8Oi1RHEmGcNqLC6ScRxbk8adIQQaUBi//7H5LxgAAAIEAlwzrco9GImSc9+ipx2QGkvX3L9ePLjcS+Ju57DJlEhZc/IP/RNXWLlrJi9zHNNQLiSOW5uGPSTu1OgoE3DcYcu0HPIB5zwKfZviPP2YG8P7ZguhH0k6vObzugW+HFnsB29J/1L+TtTHaY2gYRGNsGR/l+Lm6GK6N2A2MMwRRdsUAAAAAAAAAewAAAAEAAAAIbXktaWRlbnQAAAAQAAAADG15LXByaW5jaXBhbAAAAAAAAAAA//////////8AAAASAAAAA2ZvbwAAAAcAAAADYmFyAAAAEwAAAANiYXoAAAAIAAAABHF3ZXIAAAAAAAABFwAAAAdzc2gtcnNhAAAAAwEAAQAAAQEApF9jy84H7nHS1c264l3VFKH09zdoH8GLGTQvcMfWCNwxCmI75lepHbzanskfRjB+chiQra36WGG3+rnIWFtZ9ZjUuVWdiAQgrExf3tEZ0N7c+kMypHiMna1p3ObYCMFtvefwExh/1HOxkSewgOV6ccgmVUj5G0MSGPGI998ynkRNy2p1YgHGqAQTgrm4IbF4Lac/VjYoT9HMpd84dNECkAtXDYXDUsLxwHZegZhTQu6+bv73tv216w6v16vNcc7H+ZKoKyqgjaU1T9A/ywqMdEJk+f7r4Cvx0+blaqHglA4LNpIFpMEV1/jkB2031xMGom4kVbVf60vAIoXullqjSQAAAQ8AAAAHc3NoLXJzYQAAAQBN6G81ZxdG5VpmOaQ67iiJM16tL8haIG8bU854i5XpEhDlrS/JeM8NLKqCnYS8duMQr/eSR2+e2lHEptr4uTPF8i4eN7pTt3BjR+2aEj4OpcWlzhJzwNDDRZjpWD9fs/Fcr8GzD9phwJyIPuflpNXjrBoGSZRCLYzLoW5ZZBDCC/tvNLxIjln1+4nioli+tzn6WcdEX8xJ+AoXf1InJxJVj+0RVdCQ0mcjU/i4QspIUxLF0khGfWjfK5tBDK8VzZev3r77KDmbDyaGNg6LIstzauCTTFvh78Q5X8BjyhTil3hWqotRpAtiENX6tC6USJ6/eUn5W9OhOJZcAnQGAG6h mastahyeti@Benjamins-MacBook-Pro.local
ssh-dss-cert-v01@openssh.com AAAAHHNzaC1kc3MtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgxe0htDFrfYtCFmmOWtNYyDoFKrubawypZkZK2WKLfbsAAACBAMNivKSNU0W1GmNuRu6eAKUsEBITCXTdHcRoVW3+rIifciHcacjjzCeVRUcDGjkK28w2i4MNVWLCTGruTP5Snl+6MUysIVZ9HwzUwhUv7YnMLxgNJrbKYANq3vP0knzsD0d3R/0N4BezQh+NlZ9te2OFJqeYtGt6mHsrSH7nHFl9AAAAFQDoH0iIZ0ybaI53R/r/+3nRdxrAGQAAAIBZeEU8dOLOgGDthburSWaU3U5za95yD0KssffNanoh8qBRZyhNXajeJPh1R5ffWqUz0yCaHMG2fsMedrg30Mu03MEHF6/fhGDurgzEkWb7lKObU9mgW8yKyDLeibZJIUYdj/6RxTgm7rLcme4Fx6dBohZoj2lOVqW4tdUnAz/aagAAAIEAiKc2xilAK7E980BufXieA8sbJ1SvXr/NMVOZmc4hc306sEct8jvwCqpMqvzGIIIb1Z9WNxAx1/Y7LvCLh/Qot3sULYCW7LUv7U2PgBIyndpjkN+Nm3Orlmv4bW6GKf+dVkMsY8anMJaSS5Xj/wJALS93e4+5t7QTh2qWcJSR3FEAAAAAAAAAewAAAAEAAAAIbXktaWRlbnQAAAAQAAAADG15LXByaW5jaXBhbAAAAAAAAAAA//////////8AAAASAAAAA2ZvbwAAAAcAAAADYmFyAAAAEwAAAANiYXoAAAAIAAAABHF3ZXIAAAAAAAABFwAAAAdzc2gtcnNhAAAAAwEAAQAAAQEAtHZtQYLHXEwfslYvhIqJfps4EoK2iJMwRY82KTFVtrv7cZa6oJcTlWwI0Q7SpNt2e7hFqguebKpJtQKag2sOYQrq6zuX/nz4VwWaIm1+cZwb6DgTbX2k67iJ2rwRlDzvZW0HluboFpHMWWHVdr1WvsU+x5+odzCkqP9EYXoCwFOFH6q8NCI53xTF8jDpijiXCshXp45agkdq99H53bBH2+fs95eDtWHO/0uAWd+8RpT7puTtPzZGtbN1s9MR0dKAXpGOaqeBtyuiTt7GnqxOPpjUa8D9deB3T5HibPkTywjfbL4EkQ2g5YHEPUbQPRaFwyhaI6Nhfy18he2aC/RgwwAAAQ8AAAAHc3NoLXJzYQAAAQBZ+LidPUZof19RKd6Rx1WeHi6Zu0AV600FtZ7GyiQQ7uk2gcC2i34JvlJamSREfqgNxn45PeqkzPccEWzZS2BOEoHYLItsN1tkBFuyFW+3Vgn1cWCGfYT2qtQRSD2D46ltJxRY9MYUjcUJC6HxwgPdW/JzzXiRilloQKuvTXLdF5aaIdO2vNeRQgckeSBJiH9wk5o+3E7Zc/r11XwIxZlPnGwiEOs2Igwh4r3og+1YqASq6OPWaAJuRbdz4TODyUhGXhX3NyMZTQfI1TY7kOV559UJOUs3o4OS/JOC1MowJbaEOkRf+r8Oz4tV/XnlJRw4EOcmb3gP4XZIxDkIYshR mastahyeti@Benjamins-MacBook-Pro.local

2
spec/fixtures/dsa_leaf_for_rsa_ca.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ssh-dss AAAAB3NzaC1kc3MAAACBAJdDo8NR4glY6pFOkgpZsGev9SgnEiIaD7KF3r8M8iylRCu3FGcxqO0tCHLwceNBb2Ci98ADFOlOaUH1k8MFFVZ7xTvaeuDaFFZ7GPv/tDUMxEdHV1VDXPJ1QmiGff/p+w0DPhtxowllYp/AyipnVU8yWourjMHDaGIFeyHozpUrAAAAFQCw6fMFoR6/IBXs26bpdPm+ivTigQAAAIBJcDUrwC63U1auMFuxcXyj31X7jdkEfT9wMBpNPQaAABxiircxObGRpV0Qxp531NY6IvFQ7LM+4WyKk4BRjo0Pbm+SVuT1bxRtdV45bvoi2tKXkIXHDQhha5K0MM8JREMItus8Oi1RHEmGcNqLC6ScRxbk8adIQQaUBi//7H5LxgAAAIEAlwzrco9GImSc9+ipx2QGkvX3L9ePLjcS+Ju57DJlEhZc/IP/RNXWLlrJi9zHNNQLiSOW5uGPSTu1OgoE3DcYcu0HPIB5zwKfZviPP2YG8P7ZguhH0k6vObzugW+HFnsB29J/1L+TtTHaY2gYRGNsGR/l+Lm6GK6N2A2MMwRRdsU= mastahyeti@Benjamins-MacBook-Pro.local
ssh-dss AAAAB3NzaC1kc3MAAACBAMNivKSNU0W1GmNuRu6eAKUsEBITCXTdHcRoVW3+rIifciHcacjjzCeVRUcDGjkK28w2i4MNVWLCTGruTP5Snl+6MUysIVZ9HwzUwhUv7YnMLxgNJrbKYANq3vP0knzsD0d3R/0N4BezQh+NlZ9te2OFJqeYtGt6mHsrSH7nHFl9AAAAFQDoH0iIZ0ybaI53R/r/+3nRdxrAGQAAAIBZeEU8dOLOgGDthburSWaU3U5za95yD0KssffNanoh8qBRZyhNXajeJPh1R5ffWqUz0yCaHMG2fsMedrg30Mu03MEHF6/fhGDurgzEkWb7lKObU9mgW8yKyDLeibZJIUYdj/6RxTgm7rLcme4Fx6dBohZoj2lOVqW4tdUnAz/aagAAAIEAiKc2xilAK7E980BufXieA8sbJ1SvXr/NMVOZmc4hc306sEct8jvwCqpMqvzGIIIb1Z9WNxAx1/Y7LvCLh/Qot3sULYCW7LUv7U2PgBIyndpjkN+Nm3Orlmv4bW6GKf+dVkMsY8anMJaSS5Xj/wJALS93e4+5t7QTh2qWcJSR3FE= mastahyeti@Benjamins-MacBook-Pro.local

12
spec/fixtures/ecdsa_ca поставляемый
Просмотреть файл

@ -1,9 +1,9 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNlY2RzYS
1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQQ8Suh3SSfmEc39JJhqoHt6CXorHNfX
KATz2kHTnb+w0oBN/O8ie1dSe1CT6PsEYjIAIrlR9P8/EaiGw6P9G7XGAAAAwJmD9X6Zg/
V+AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDxK6HdJJ+YRzf0k
mGqge3oJeisc19coBPPaQdOdv7DSgE387yJ7V1J7UJPo+wRiMgAiuVH0/z8RqIbDo/0btc
YAAAAhAIASVZ/Pehc2tILHtz8WaVsuM2rxlKV4UPJ/F245/IyKAAAAJm1hc3RhaHlldGlA
QmVuamFtaW5zLU1hY0Jvb2stUHJvLmxvY2FsAQ==
1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQRD8dcmELT2+1bQTea+eTtuqLn1bcD7
f9w/IceBLLeOwTM0mTR+Fhrh7rVak3nwqAv4shYBtHT3X9MUxq4qkJJpAAAAwB20sHMdtL
BzAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEPx1yYQtPb7VtBN
5r55O26oufVtwPt/3D8hx4Est47BMzSZNH4WGuHutVqTefCoC/iyFgG0dPdf0xTGriqQkm
kAAAAgCmgttXqP5jdB9O3qaU0+A6/yvLGdZVvVxCDPdpt4rgkAAAAmbWFzdGFoeWV0aUBC
ZW5qYW1pbnMtTWFjQm9vay1Qcm8ubG9jYWwBAg==
-----END OPENSSH PRIVATE KEY-----

2
spec/fixtures/ecdsa_ca.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDxK6HdJJ+YRzf0kmGqge3oJeisc19coBPPaQdOdv7DSgE387yJ7V1J7UJPo+wRiMgAiuVH0/z8RqIbDo/0btcY= mastahyeti@Benjamins-MacBook-Pro.local
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEPx1yYQtPb7VtBN5r55O26oufVtwPt/3D8hx4Est47BMzSZNH4WGuHutVqTefCoC/iyFgG0dPdf0xTGriqQkmk= mastahyeti@Benjamins-MacBook-Pro.local

12
spec/fixtures/ecdsa_leaf_for_rsa_ca поставляемый
Просмотреть файл

@ -1,9 +1,9 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNlY2RzYS
1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQS9BpgXyhMIy5OmuE3x7+mAoX2BWs32
u1trfsANJCrRZA3iHiZhyvmwpKhRov5bz72nrfPrH3MxCTWNWfw0eclSAAAAwAOltQQDpb
UEAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL0GmBfKEwjLk6a4
TfHv6YChfYFazfa7W2t+wA0kKtFkDeIeJmHK+bCkqFGi/lvPvaet8+sfczEJNY1Z/DR5yV
IAAAAhANZRIPQid9qc0Z23u9ML+G9maYHFBuZIOoTsvrJidTpzAAAAJm1hc3RhaHlldGlA
QmVuamFtaW5zLU1hY0Jvb2stUHJvLmxvY2FsAQ==
1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQTWoA1ZllfrOHhDiTHAl/lFSn0yma1T
Gbx1jshqeR6L3jVd9UwxsQ93BJyiKRvOnjHr0SNsJNofHdBM+5rT3IZvAAAAwM9VX7XPVV
+1AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNagDVmWV+s4eEOJ
McCX+UVKfTKZrVMZvHWOyGp5HoveNV31TDGxD3cEnKIpG86eMevRI2wk2h8d0Ez7mtPchm
8AAAAgLGiUcxwnqdhSik0sN15gFXYgPlG590GgSpU1TqMepOwAAAAmbWFzdGFoeWV0aUBC
ZW5qYW1pbnMtTWFjQm9vay1Qcm8ubG9jYWwBAg==
-----END OPENSSH PRIVATE KEY-----

Просмотреть файл

@ -1 +1 @@
ecdsa-sha2-nistp256-cert-v01@openssh.com AAAAKGVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgfeCU2XpctfRLIv11EbgO4by6Lwr9M/ta8hK3omlU59gAAAAIbmlzdHAyNTYAAABBBL0GmBfKEwjLk6a4TfHv6YChfYFazfa7W2t+wA0kKtFkDeIeJmHK+bCkqFGi/lvPvaet8+sfczEJNY1Z/DR5yVIAAAAAAAAAewAAAAEAAAAIbXktaWRlbnQAAAAQAAAADG15LXByaW5jaXBhbAAAAAAAAAAA//////////8AAAASAAAAA2ZvbwAAAAcAAAADYmFyAAAAEwAAAANiYXoAAAAIAAAABHF3ZXIAAAAAAAABFwAAAAdzc2gtcnNhAAAAAwEAAQAAAQEApF9jy84H7nHS1c264l3VFKH09zdoH8GLGTQvcMfWCNwxCmI75lepHbzanskfRjB+chiQra36WGG3+rnIWFtZ9ZjUuVWdiAQgrExf3tEZ0N7c+kMypHiMna1p3ObYCMFtvefwExh/1HOxkSewgOV6ccgmVUj5G0MSGPGI998ynkRNy2p1YgHGqAQTgrm4IbF4Lac/VjYoT9HMpd84dNECkAtXDYXDUsLxwHZegZhTQu6+bv73tv216w6v16vNcc7H+ZKoKyqgjaU1T9A/ywqMdEJk+f7r4Cvx0+blaqHglA4LNpIFpMEV1/jkB2031xMGom4kVbVf60vAIoXullqjSQAAAQ8AAAAHc3NoLXJzYQAAAQBIC6P/PblT4dWzjmsta+QOyLnyCUVW+1y/sdUX2Ed063bS8xFQwe6UVfcS73wmlfC82336QRflOCrA/v4nmJefmjb1oSfWPyDyCioe3xSHBSix9bpK+8iFXhbIEkJD9WkCJ+Vkp70FUeB5edS+e1sIk5rzA3hmSTQAeJlBf029Cnf0UipDqiY7vDn0GRvG2QAWX9QdqiWj4t1lSVIhGGkj5ymmrttpJWLwAkcJz+oV3WNpHdDSXKx6fVtfhFn4tZrDvsM9FcAEM+Ly+C4OsYRfMFAH3/7Xk0rEUGs3/XJZtcmtkBp07ED4MMwE3uz0GpgVruGeRRtm7ojpkgMfb7pV mastahyeti@Benjamins-MacBook-Pro.local
ecdsa-sha2-nistp256-cert-v01@openssh.com AAAAKGVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgbURxE8HSQXrsS1XGI2Rag/tAfwdh2qcLVBsupEj7KSEAAAAIbmlzdHAyNTYAAABBBNagDVmWV+s4eEOJMcCX+UVKfTKZrVMZvHWOyGp5HoveNV31TDGxD3cEnKIpG86eMevRI2wk2h8d0Ez7mtPchm8AAAAAAAAAewAAAAEAAAAIbXktaWRlbnQAAAAQAAAADG15LXByaW5jaXBhbAAAAAAAAAAA//////////8AAAASAAAAA2ZvbwAAAAcAAAADYmFyAAAAEwAAAANiYXoAAAAIAAAABHF3ZXIAAAAAAAABFwAAAAdzc2gtcnNhAAAAAwEAAQAAAQEAtHZtQYLHXEwfslYvhIqJfps4EoK2iJMwRY82KTFVtrv7cZa6oJcTlWwI0Q7SpNt2e7hFqguebKpJtQKag2sOYQrq6zuX/nz4VwWaIm1+cZwb6DgTbX2k67iJ2rwRlDzvZW0HluboFpHMWWHVdr1WvsU+x5+odzCkqP9EYXoCwFOFH6q8NCI53xTF8jDpijiXCshXp45agkdq99H53bBH2+fs95eDtWHO/0uAWd+8RpT7puTtPzZGtbN1s9MR0dKAXpGOaqeBtyuiTt7GnqxOPpjUa8D9deB3T5HibPkTywjfbL4EkQ2g5YHEPUbQPRaFwyhaI6Nhfy18he2aC/RgwwAAAQ8AAAAHc3NoLXJzYQAAAQBpoFuRqVO4GKK9JejdXkdZJA8ZSwgR+dhWxy+/aeuu7aEDCnk3GtQcc6Y11q+cCr2Q+sWRb3nrX7lcWKAhB4tCi+jdLDANghNNMWx4LNkCSaFsjhvtBwXlEHfaGrJMPvD1sZFYlR0vYQdAoduzaDsq9Qy1wn8SqKlY3aXEZNxQgR5/1K6xcm6k5/l7sMLTzW6De71CnzHugmL/VTzlEyK0rUuGHWqO2yl+hH8OFVndkzynF/qY+XbyJeua8CQRCBG8P0u9EHZi9uI+XksJcy0v395k1OFG/42rbUVK3T81UtyeAgGB4XqBJyF9TpSjOxGwDO7qdxOQQdZS3gHi2CuI mastahyeti@Benjamins-MacBook-Pro.local

2
spec/fixtures/ecdsa_leaf_for_rsa_ca.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL0GmBfKEwjLk6a4TfHv6YChfYFazfa7W2t+wA0kKtFkDeIeJmHK+bCkqFGi/lvPvaet8+sfczEJNY1Z/DR5yVI= mastahyeti@Benjamins-MacBook-Pro.local
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNagDVmWV+s4eEOJMcCX+UVKfTKZrVMZvHWOyGp5HoveNV31TDGxD3cEnKIpG86eMevRI2wk2h8d0Ez7mtPchm8= mastahyeti@Benjamins-MacBook-Pro.local

8
spec/fixtures/ed25519_ca поставляемый
Просмотреть файл

@ -1,8 +1,8 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACDSELmuEvpf1YHywTiMd/9Ttz/R9P890wBhN2RaD0wPlwAAALA12n8ZNdp/
GQAAAAtzc2gtZWQyNTUxOQAAACDSELmuEvpf1YHywTiMd/9Ttz/R9P890wBhN2RaD0wPlw
AAAED+vdXA/v+8zZnAFpCjvqT3QLrtPJjKDwf+STGR1x2CYdIQua4S+l/VgfLBOIx3/1O3
P9H0/z3TAGE3ZFoPTA+XAAAAJm1hc3RhaHlldGlAQmVuamFtaW5zLU1hY0Jvb2stUHJvLm
QyNTUxOQAAACB4Dh2Fw19uRylj9Od+MOgiXmO4Z1pRyQ81wOJOqidyzAAAALD8XSTe/F0k
3gAAAAtzc2gtZWQyNTUxOQAAACB4Dh2Fw19uRylj9Od+MOgiXmO4Z1pRyQ81wOJOqidyzA
AAAEA2jr0qsPHuG8JoLSbZkhGATkWPZOVT5HwxuwNNMxtBXHgOHYXDX25HKWP0534w6CJe
Y7hnWlHJDzXA4k6qJ3LMAAAAJm1hc3RhaHlldGlAQmVuamFtaW5zLU1hY0Jvb2stUHJvLm
xvY2FsAQIDBAUGBw==
-----END OPENSSH PRIVATE KEY-----

2
spec/fixtures/ed25519_ca.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINIQua4S+l/VgfLBOIx3/1O3P9H0/z3TAGE3ZFoPTA+X mastahyeti@Benjamins-MacBook-Pro.local
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHgOHYXDX25HKWP0534w6CJeY7hnWlHJDzXA4k6qJ3LM mastahyeti@Benjamins-MacBook-Pro.local

8
spec/fixtures/ed25519_leaf_for_rsa_ca поставляемый
Просмотреть файл

@ -1,8 +1,8 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACBWglLjhqQxqtmNRVFZI9DikQ2d1FnJUWvgIliWxdu2FgAAALBJGl3NSRpd
zQAAAAtzc2gtZWQyNTUxOQAAACBWglLjhqQxqtmNRVFZI9DikQ2d1FnJUWvgIliWxdu2Fg
AAAECTWyIYD8OCgxqHQntDGBKNRbhbIEqjbz85TTjCd0MiUFaCUuOGpDGq2Y1FUVkj0OKR
DZ3UWclRa+AiWJbF27YWAAAAJm1hc3RhaHlldGlAQmVuamFtaW5zLU1hY0Jvb2stUHJvLm
QyNTUxOQAAACBLwmSgwULN11BZae2a/ZvZg7xJjznV9HziF2cwDosPwwAAALDgeHoe4Hh6
HgAAAAtzc2gtZWQyNTUxOQAAACBLwmSgwULN11BZae2a/ZvZg7xJjznV9HziF2cwDosPww
AAAED7vhc8wKkLScwX2D4EgXLuaVHkpGER962jUfLDv9caBkvCZKDBQs3XUFlp7Zr9m9mD
vEmPOdX0fOIXZzAOiw/DAAAAJm1hc3RhaHlldGlAQmVuamFtaW5zLU1hY0Jvb2stUHJvLm
xvY2FsAQIDBAUGBw==
-----END OPENSSH PRIVATE KEY-----

Просмотреть файл

@ -1 +1 @@
ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIFThfJGCW97ezsB2tUi+/1J0RiBnpT1SBFFzYXjMlfyoAAAAIFaCUuOGpDGq2Y1FUVkj0OKRDZ3UWclRa+AiWJbF27YWAAAAAAAAAHsAAAABAAAACG15LWlkZW50AAAAEAAAAAxteS1wcmluY2lwYWwAAAAAAAAAAP//////////AAAAEgAAAANmb28AAAAHAAAAA2JhcgAAABMAAAADYmF6AAAACAAAAARxd2VyAAAAAAAAARcAAAAHc3NoLXJzYQAAAAMBAAEAAAEBAKRfY8vOB+5x0tXNuuJd1RSh9Pc3aB/Bixk0L3DH1gjcMQpiO+ZXqR282p7JH0YwfnIYkK2t+lhht/q5yFhbWfWY1LlVnYgEIKxMX97RGdDe3PpDMqR4jJ2tadzm2AjBbb3n8BMYf9RzsZEnsIDlenHIJlVI+RtDEhjxiPffMp5ETctqdWIBxqgEE4K5uCGxeC2nP1Y2KE/RzKXfOHTRApALVw2Fw1LC8cB2XoGYU0Luvm7+97b9tesOr9erzXHOx/mSqCsqoI2lNU/QP8sKjHRCZPn+6+Ar8dPm5Wqh4JQOCzaSBaTBFdf45AdtN9cTBqJuJFW1X+tLwCKF7pZao0kAAAEPAAAAB3NzaC1yc2EAAAEAP+qTxNA230Z2ltCymrNniaGe+xfVcrrbBA4Ar1zHhv4ALPGQguNYVnYFcbduHMgRRlzjZrdDgU7D1lZsehzUL7I+kEUzpUe5zNl+wewllw5scC1XL8yYh4Wn5+oGf776PiJh7JvSbvG15TPSGFPg/GvbACTIn3m9zJnvZM44etF2/0RHH9TZMZ+JSsd4daLbjZWQie6C8L6nmzI/MNVfHOTHmxLT29aAhGORBdB8GDq8TVHFoFdjTrNVI/I2bq/qOypIagsVQQFodLr5RNs8vp+gL3RNA98J1lqLNjleAyql1uuDm631D+dn0ycpKqz/5fI4AUdKqHa7tSSkCq7vvg== mastahyeti@Benjamins-MacBook-Pro.local
ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAICVbMi+Sh7ymmZkhlPLpcLpHkDyxybNZyafHHz+FmfTOAAAAIEvCZKDBQs3XUFlp7Zr9m9mDvEmPOdX0fOIXZzAOiw/DAAAAAAAAAHsAAAABAAAACG15LWlkZW50AAAAEAAAAAxteS1wcmluY2lwYWwAAAAAAAAAAP//////////AAAAEgAAAANmb28AAAAHAAAAA2JhcgAAABMAAAADYmF6AAAACAAAAARxd2VyAAAAAAAAARcAAAAHc3NoLXJzYQAAAAMBAAEAAAEBALR2bUGCx1xMH7JWL4SKiX6bOBKCtoiTMEWPNikxVba7+3GWuqCXE5VsCNEO0qTbdnu4RaoLnmyqSbUCmoNrDmEK6us7l/58+FcFmiJtfnGcG+g4E219pOu4idq8EZQ872VtB5bm6BaRzFlh1Xa9Vr7FPsefqHcwpKj/RGF6AsBThR+qvDQiOd8UxfIw6Yo4lwrIV6eOWoJHavfR+d2wR9vn7PeXg7Vhzv9LgFnfvEaU+6bk7T82RrWzdbPTEdHSgF6Rjmqngbcrok7exp6sTj6Y1GvA/XXgd0+R4mz5E8sI32y+BJENoOWBxD1G0D0WhcMoWiOjYX8tfIXtmgv0YMMAAAEPAAAAB3NzaC1yc2EAAAEAo9wjb5y/RBQwrj5XMZENd6xOzgOHWpcyCA1wRfcwL0vcfPqdX4viTQ8JsW+Sm0PdE5xTl44SBwJyHxBb6CLrj7txEL7dqiv3l8RSk/VA2l36cE44hss+mVeqmtYrghpssEXl+faLUEtz7udVD98QC7dV+VORUof3JOGQ0zZnE5oc/OWsWNBE7PUgYCICz7dgh31f1cOKg+wgrMUWcYTwhC2MbHsR4dUzOC2GtCOFiVr+jUVSoNHYpjlrDNQNHJs+KeITZ0ShSJr4LK2A01NIDwsCZhR8+Lohq7MJxv5uTGir4+95r6wFAffXZ8ncT2+iwAPah6ba/NIE24dlUC2Kzw== mastahyeti@Benjamins-MacBook-Pro.local

2
spec/fixtures/ed25519_leaf_for_rsa_ca.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFaCUuOGpDGq2Y1FUVkj0OKRDZ3UWclRa+AiWJbF27YW mastahyeti@Benjamins-MacBook-Pro.local
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEvCZKDBQs3XUFlp7Zr9m9mDvEmPOdX0fOIXZzAOiw/D mastahyeti@Benjamins-MacBook-Pro.local

50
spec/fixtures/rsa_ca поставляемый
Просмотреть файл

@ -1,28 +1,28 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAQEApF9jy84H7nHS1c264l3VFKH09zdoH8GLGTQvcMfWCNwxCmI75lep
HbzanskfRjB+chiQra36WGG3+rnIWFtZ9ZjUuVWdiAQgrExf3tEZ0N7c+kMypHiMna1p3O
bYCMFtvefwExh/1HOxkSewgOV6ccgmVUj5G0MSGPGI998ynkRNy2p1YgHGqAQTgrm4IbF4
Lac/VjYoT9HMpd84dNECkAtXDYXDUsLxwHZegZhTQu6+bv73tv216w6v16vNcc7H+ZKoKy
qgjaU1T9A/ywqMdEJk+f7r4Cvx0+blaqHglA4LNpIFpMEV1/jkB2031xMGom4kVbVf60vA
IoXullqjSQAAA+B+ogT/fqIE/wAAAAdzc2gtcnNhAAABAQCkX2PLzgfucdLVzbriXdUUof
T3N2gfwYsZNC9wx9YI3DEKYjvmV6kdvNqeyR9GMH5yGJCtrfpYYbf6uchYW1n1mNS5VZ2I
BCCsTF/e0RnQ3tz6QzKkeIydrWnc5tgIwW295/ATGH/Uc7GRJ7CA5XpxyCZVSPkbQxIY8Y
j33zKeRE3LanViAcaoBBOCubghsXgtpz9WNihP0cyl3zh00QKQC1cNhcNSwvHAdl6BmFNC
7r5u/ve2/bXrDq/Xq81xzsf5kqgrKqCNpTVP0D/LCox0QmT5/uvgK/HT5uVqoeCUDgs2kg
WkwRXX+OQHbTfXEwaibiRVtV/rS8Aihe6WWqNJAAAAAwEAAQAAAQEAi9LNLMBNhOt0YwWH
tSoGqW9/15BdVa4pKj53IKQNkSnl2aRoue/V34MYIbyKiwWTenElGWkGrYoqm/DP2UGUS9
Q/GI0Y3WxNcuPhJcSQBlqedZEWEkytqS+r/wqruP754HLdiRDtJIdqBEVT4sHSn9mXqjLS
HPu3+Fn2noxSHcg1MZXGTuIn3EwH0Xl7ZIj0T+VFXPOQro9d6Gc4QPFi52JEAKnMWjTZxP
u03N3tlxzVutQVyXqD0srXSZ42ynl9znSWAvOUOEWybS4bvn/7ere5LyVR4PStPevGOJYf
q5CfWwcPPOj+gDeZ+4lRMaxyZgY3tDAz0UDStDLQ58KJlQAAAIAxBmvkgD0y0jEGuAFGV/
jGN6QVxuMs+jCbZTnYE4BXuugAlRlGKtY15q+c64q2JM+WUnsZMdFWng+75XwtRvubFZwu
1R6JtHr1ryWQdknstAsqjdgPJiYdJYJi5E7fSNXfIpQCYZqZZIsi9kjHnBcHNPLYnc0FVy
S0rsX4gi8nXwAAAIEA2McifOuwP48SKn7mpKm2QEIIfgMv5WeC2Y5AHqTvG8DxSe6rp5od
/mJ0cg+BUXTYHjZCF909OL7vstuk1C1SCZzsJ+4g2gsDuZXshkvUlfGzFlTlAsJ8HXPkX3
qgRRMiHxez0FBPZcB2r8iSKf6Er9Pxsy1wwJvpQKOY8AtzCDMAAACBAMIc6a7sNiyedUqs
7bN9sTNVatm5qStRVi4KfN1Hh2coIFTTOPTJHEBOn0F7g32/cBtEH0rKlUbY8o9mDMRWO+
5AkrKyk8FgiRZbqeN5arwCWGfT/0Iq5T9e6F78hvCb19sKN0AzBI1gEQYdEiVK8wE7eFVa
+48NYqw3oLh06VqTAAAAJm1hc3RhaHlldGlAQmVuamFtaW5zLU1hY0Jvb2stUHJvLmxvY2
FsAQIDBA==
NhAAAAAwEAAQAAAQEAtHZtQYLHXEwfslYvhIqJfps4EoK2iJMwRY82KTFVtrv7cZa6oJcT
lWwI0Q7SpNt2e7hFqguebKpJtQKag2sOYQrq6zuX/nz4VwWaIm1+cZwb6DgTbX2k67iJ2r
wRlDzvZW0HluboFpHMWWHVdr1WvsU+x5+odzCkqP9EYXoCwFOFH6q8NCI53xTF8jDpijiX
CshXp45agkdq99H53bBH2+fs95eDtWHO/0uAWd+8RpT7puTtPzZGtbN1s9MR0dKAXpGOaq
eBtyuiTt7GnqxOPpjUa8D9deB3T5HibPkTywjfbL4EkQ2g5YHEPUbQPRaFwyhaI6Nhfy18
he2aC/RgwwAAA+DRWYzQ0VmM0AAAAAdzc2gtcnNhAAABAQC0dm1BgsdcTB+yVi+Eiol+mz
gSgraIkzBFjzYpMVW2u/txlrqglxOVbAjRDtKk23Z7uEWqC55sqkm1ApqDaw5hCurrO5f+
fPhXBZoibX5xnBvoOBNtfaTruInavBGUPO9lbQeW5ugWkcxZYdV2vVa+xT7Hn6h3MKSo/0
RhegLAU4Ufqrw0IjnfFMXyMOmKOJcKyFenjlqCR2r30fndsEfb5+z3l4O1Yc7/S4BZ37xG
lPum5O0/Nka1s3Wz0xHR0oBekY5qp4G3K6JO3saerE4+mNRrwP114HdPkeJs+RPLCN9svg
SRDaDlgcQ9RtA9FoXDKFojo2F/LXyF7ZoL9GDDAAAAAwEAAQAAAQAsoKjOLZg9o/mmsZeY
sGXmMF6CfV7EkZm7afob375xrTU2Vu8aLaJDLm9Tu9WtvTQkzmIz9iGcf9Qwdk9dtojcyM
VlnNwurBsB8jm2z9sYH2HrYIq1Zf/15zH4LNAwF42gSIE6+SlmA3JEnGQctCASl1a6KSqR
Jy9hN5dif7jUdKiy/0LgYT64DjSyCSSgHS4W85O/AVHL03gambgy2CjZV1b2Wec4x3TBaH
XcRJuH2h4ZytiaiF+WSnvUU2kUtlfAciifWPNBqWyMe0gLeVDOx67fL6hZ82zW2MaNlb7D
ybG76lahftWX02YPCe0W+rzKSNMK+BJtTwY83zlmYcaJAAAAgEPADs8XQl/9XzrzGy1vNw
eUWBN7QW8ecIiUBKk/5JA64sy3sX3bG0LPEovYQbMiGzseXcDarSrijFA+iQJ/HfykvIqA
l3x7JriqiG4/2imauvhzJcdcNmwfo/xNpOLx/svXkX+HELqolbF5E4S1Ig82TZTaous63H
1UKBBEnbC2AAAAgQDe+idTInf3IfOpeFeuTZTQAYLKoNdFm4jWMNDMIvwgLWKPQZ0MOn0y
WvkS0Rm6YPYM2zsHzw+Lb0PkP2N4V4Lg5q5nK6tK2WJ+JBBwR/iq50kh0tuZCAx7UFoWDO
WTkHDjN2ERGjJCp83agX7DT8XUV9tZ158CE/mhZmiZRRYHVwAAAIEAzzBlq1JUnXriM3yF
RGDk0htc6tvkYv4iNJSutnaaYaDGmObqWJrGEgmJfLvlhdy/zeUIRNqE/4B3x68tF+uC/7
LeonnEflkHQyDPXxfkfVHGbFcdWQfe5wgmCagdipkjoFDIfrScS3MXmeU6vZpP0/K1Bq6A
SIZdKzFgitpPanUAAAAmbWFzdGFoeWV0aUBCZW5qYW1pbnMtTWFjQm9vay1Qcm8ubG9jYW
wBAgMEBQ==
-----END OPENSSH PRIVATE KEY-----

2
spec/fixtures/rsa_ca.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCkX2PLzgfucdLVzbriXdUUofT3N2gfwYsZNC9wx9YI3DEKYjvmV6kdvNqeyR9GMH5yGJCtrfpYYbf6uchYW1n1mNS5VZ2IBCCsTF/e0RnQ3tz6QzKkeIydrWnc5tgIwW295/ATGH/Uc7GRJ7CA5XpxyCZVSPkbQxIY8Yj33zKeRE3LanViAcaoBBOCubghsXgtpz9WNihP0cyl3zh00QKQC1cNhcNSwvHAdl6BmFNC7r5u/ve2/bXrDq/Xq81xzsf5kqgrKqCNpTVP0D/LCox0QmT5/uvgK/HT5uVqoeCUDgs2kgWkwRXX+OQHbTfXEwaibiRVtV/rS8Aihe6WWqNJ mastahyeti@Benjamins-MacBook-Pro.local
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0dm1BgsdcTB+yVi+Eiol+mzgSgraIkzBFjzYpMVW2u/txlrqglxOVbAjRDtKk23Z7uEWqC55sqkm1ApqDaw5hCurrO5f+fPhXBZoibX5xnBvoOBNtfaTruInavBGUPO9lbQeW5ugWkcxZYdV2vVa+xT7Hn6h3MKSo/0RhegLAU4Ufqrw0IjnfFMXyMOmKOJcKyFenjlqCR2r30fndsEfb5+z3l4O1Yc7/S4BZ37xGlPum5O0/Nka1s3Wz0xHR0oBekY5qp4G3K6JO3saerE4+mNRrwP114HdPkeJs+RPLCN9svgSRDaDlgcQ9RtA9FoXDKFojo2F/LXyF7ZoL9GDD mastahyeti@Benjamins-MacBook-Pro.local

48
spec/fixtures/rsa_leaf_for_dsa_ca поставляемый
Просмотреть файл

@ -1,28 +1,28 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
FsAQIDBA==
-----END OPENSSH PRIVATE KEY-----

2
spec/fixtures/rsa_leaf_for_dsa_ca-cert.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgSZ4oqjDU7UFxilJ+vIsgokXIxg9Ki0HAESYNYSZR0hcAAAADAQABAAABAQDW2qklU7JmoO0zG4eTq3CfJz3vjiFQ1nbT8obNgetFUmLbEIO41k7kGkgRhv8UrBpvk5SdvjrXdlm3nkpu2VOAofFO5YmRz6CImAqF2ftAe2EHHmKMR+AGNFaveyXtO3WSshemD+ZYVhhm+v4O4+vssOQjnGB9MSbSKojCrRao2e62KTzdhc2inSmZQ4ECHmQtOW0FKMlGNazw7WRprP8bmhUmsxZzijPGkTGTgcncuvWlbt0avRxV3p+T9OHu3khs/sHg0gToqAdGG07/QeFjLTCQtw5Bdu9PUIq9xT1aUhBgE00xt5XcyFjfxK3q4bvioCDdpNAwdn0IBFGBSI31AAAAAAAAAHsAAAABAAAACG15LWlkZW50AAAAEAAAAAxteS1wcmluY2lwYWwAAAAAAAAAAP//////////AAAAEgAAAANmb28AAAAHAAAAA2JhcgAAABMAAAADYmF6AAAACAAAAARxd2VyAAAAAAAAAbEAAAAHc3NoLWRzcwAAAIEA42KM5lsnAW80o3Jee9jG5XfK9hYc/zPd3Ke2aKkvX3g1FfYuuAIcYBnVV9VVnbgyVeHH9BmSQ7uJXfHPgNz/ykU0l1hrX8qqVzEu1wZQDJj56QgBkb3iewUnsdwWp/Byk+XtD5qE//vZNR4OGekqjTac3sAfqNOrWONVboC5Sw8AAAAVAIPReE54n/uVkvAUVl43VGGMdiP/AAAAgFtcd0ef6kE5a2WSttrwsAv9YSpnf9pe1WHHl3PIpnNSIsEl3XAKRYeNQJ5xJEunTAQMW9BISbDsKUXf5ZcroDiPi43W+Sknj3xHAPXhjxcs12c9rmbVNfzHkm8Z+yuJ5QY5zvVYpTx0FMkBJxRv6rEwE16aWhy6rc6IOhuTedPRAAAAgBbqDjm86aIFtlgHAZqEr4ngp/3RRRVJunq0aHlp5DLy/NnwlN//LhyxrgFCCfY8kUOtPpcDVVyKl4/YKz6Rv37AqgIyhxpiqpa+O/zY2uUECkSTgD2En5oyYslBk1DVM+4PHinQXMr5NRToGjiJo8z36NKEW7Cgt+9Y0wVRdlmkAAAANwAAAAdzc2gtZHNzAAAAKETyz2R1lSbTHTx4njfJ528Zr60lKm35I5gDgKHBu5k9IbWK2AI67X0= mastahyeti@Benjamins-MacBook-Pro.local
ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgeY4Eli/rlbXgW67OO+TtwyoOjCO3Hs3Yf0JxwoXbpI4AAAADAQABAAABAQC4ByCg3c5gnejAzXkHw0IEfGxVLyxUrYiL2vcXCHdgHnXdfHpoXMuS1Co/gOdijbRNjGs7Y8evr93N/u/3eIhridSY/urTpEKi+ozZ0RGrIdJZObDs6nT1LkuuiQG85iVo7CIkM4jI4Mls0QPeFXb6kjESQQwIINaphSBtNbfMtMGTk8/uVBgUDUKLNc9XoD01H3HjpYmL5GLX5Thq0N7+B9UNwMcMw+sHt6UpPovNpwvgvq6LHKuKziJG87uxRcOBX6pSt6AKM0/qDh1RDG6Zof5qbYhUGOOodjrgi21yj5kQt76WXxQPus1PRZs67j5ztABLfKc1/jKRo0iGuNkrAAAAAAAAAHsAAAABAAAACG15LWlkZW50AAAAEAAAAAxteS1wcmluY2lwYWwAAAAAAAAAAP//////////AAAAEgAAAANmb28AAAAHAAAAA2JhcgAAABMAAAADYmF6AAAACAAAAARxd2VyAAAAAAAAAbEAAAAHc3NoLWRzcwAAAIEA1VfhLtqcWip3Y/Y1MrP54nzexum99t1rQrZaS5Yd8npyPCbGONqPrc1DWwmD4utLIxpkNMKPAUDbgq67QdTv/hDqsrD0WmKcB90MYNwVL1ymXgTF5U7pVY3pgNBjrD2/jc74j7uXcuLjQ8Jbm8tKBfLHicPGc6JHy5ZcM6c/2nkAAAAVAOo2fp0V+Fl0Q25aSKG5KKUd/y7FAAAAgA1gnIwFZVUO9ksauCJdljxHeSHQxyI7+X++nSlne1/wyRvae3IKrK8NCdxzs15stKTbNrPGXUklwfrQkSRuJQL5xpjz5KH6ayGx9ZmMWnGnyGxulnzzLb2Wm2vHS6jy3yKSBR+6jBLKxge6BX76hILAR0xWpWqXyeX6YcLRMliBAAAAgBz87rlkn95Lrnh452xz5nTDO2IbkaVwMQ1CHJmx8ZI+52+PUY3CuNwZoCqyNh3TtuPp8UNEI42hdwXaNBqrOi1UUA+VNJKCjFv1ECBa6KFLKkZrc4iSQpNImYnc7g31CRNSkg329mhjSGGZN3icCNk11VV0zcYZtfemXDotoF1mAAAANwAAAAdzc2gtZHNzAAAAKCSVUv5dHk6QTmbZypazGRgqZ0YbmVg+c9O0C6HzYMYPyYFNYm16vE4= mastahyeti@Benjamins-MacBook-Pro.local

2
spec/fixtures/rsa_leaf_for_dsa_ca.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDW2qklU7JmoO0zG4eTq3CfJz3vjiFQ1nbT8obNgetFUmLbEIO41k7kGkgRhv8UrBpvk5SdvjrXdlm3nkpu2VOAofFO5YmRz6CImAqF2ftAe2EHHmKMR+AGNFaveyXtO3WSshemD+ZYVhhm+v4O4+vssOQjnGB9MSbSKojCrRao2e62KTzdhc2inSmZQ4ECHmQtOW0FKMlGNazw7WRprP8bmhUmsxZzijPGkTGTgcncuvWlbt0avRxV3p+T9OHu3khs/sHg0gToqAdGG07/QeFjLTCQtw5Bdu9PUIq9xT1aUhBgE00xt5XcyFjfxK3q4bvioCDdpNAwdn0IBFGBSI31 mastahyeti@Benjamins-MacBook-Pro.local
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4ByCg3c5gnejAzXkHw0IEfGxVLyxUrYiL2vcXCHdgHnXdfHpoXMuS1Co/gOdijbRNjGs7Y8evr93N/u/3eIhridSY/urTpEKi+ozZ0RGrIdJZObDs6nT1LkuuiQG85iVo7CIkM4jI4Mls0QPeFXb6kjESQQwIINaphSBtNbfMtMGTk8/uVBgUDUKLNc9XoD01H3HjpYmL5GLX5Thq0N7+B9UNwMcMw+sHt6UpPovNpwvgvq6LHKuKziJG87uxRcOBX6pSt6AKM0/qDh1RDG6Zof5qbYhUGOOodjrgi21yj5kQt76WXxQPus1PRZs67j5ztABLfKc1/jKRo0iGuNkr mastahyeti@Benjamins-MacBook-Pro.local

48
spec/fixtures/rsa_leaf_for_ecdsa_ca поставляемый
Просмотреть файл

@ -1,28 +1,28 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
FsAQIDBA==
-----END OPENSSH PRIVATE KEY-----

Просмотреть файл

@ -1 +1 @@
ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgLTeZ55YtrP9nutK/47ffZkm/v4KCqbbdKM68GIsyFMwAAAADAQABAAABAQC6YHtAsZIKrGDR0l7IvEq5QpGjRNthPcaOOkSFmoW+nd2OKnQwiL0UymY1nOybPFGbPewkKPUe/ArOKKhhmCAeT43v0r3WpneFojHq5w8uuMxDuHljRiqkrgTgmYUorObUHXlZTebHkeAqGMFdFbaA6BAG5CXgDzXKt0rgPa+rI0S0D0hHOi6YJdKGafcQPaX3fS3jxj5xPlAGHuR+0DNMHhIuMdV8SeBRI1SLN7BzzvDij6habf/20VbBFnNbmHzUbC4a/8hyH1s9nYTc9ZZhOhGwU81spTvWIybtIAwx0/EH6w2RWDOZYJFzT57XYtnnMA/JWMVw2A1nYE+P0RKTAAAAAAAAAHsAAAABAAAACG15LWlkZW50AAAAEAAAAAxteS1wcmluY2lwYWwAAAAAAAAAAP//////////AAAAEgAAAANmb28AAAAHAAAAA2JhcgAAABMAAAADYmF6AAAACAAAAARxd2VyAAAAAAAAAGgAAAATZWNkc2Etc2hhMi1uaXN0cDI1NgAAAAhuaXN0cDI1NgAAAEEEPErod0kn5hHN/SSYaqB7egl6KxzX1ygE89pB052/sNKATfzvIntXUntQk+j7BGIyACK5UfT/PxGohsOj/Ru1xgAAAGQAAAATZWNkc2Etc2hhMi1uaXN0cDI1NgAAAEkAAAAhAMy6JsWQ4K3IgTQxzPm0nVoHRdn4TyCPmeUGV0R0VH1cAAAAIC64+NH6LTBCYDB85eJp9pgz8NZE4yflF8xv8IV/kMxQ mastahyeti@Benjamins-MacBook-Pro.local
ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgvEqILb6IeytsEHSdeedGABgoPHeMoS3xvwPKzjz52CsAAAADAQABAAABAQDP3DHavAi9JGxAf3GoWPZpsn6OXZXNB2kI3s+HaPuoSjZPV7S4Z1B1gLAOfx65nFuD/9Wxl4WNd7HYHryl0TI63gi2Wswb1ciI6XK/YJk7tTxXdAyVIWYU6Enr6KotlHM7NeIs1HgvjwNOTTN62PqZDoz7JIFKJtTBB0d60asRxXS1DRJ7qSdwMzHb4DKGcnGCrVBoh5RzTKZMCZDWfE7e89fz+ohqRKUm/LKBkxXACVSEAeHZTYi+HNcPOte7oal2EH/d2EjRwwajVWebXJSEqNk3VsQ8V8Qm94BznfIgGX3OCgG3E3Vqg5Ly/1ULr/2xJFmptHyMonKvpzHkQFFnAAAAAAAAAHsAAAABAAAACG15LWlkZW50AAAAEAAAAAxteS1wcmluY2lwYWwAAAAAAAAAAP//////////AAAAEgAAAANmb28AAAAHAAAAA2JhcgAAABMAAAADYmF6AAAACAAAAARxd2VyAAAAAAAAAGgAAAATZWNkc2Etc2hhMi1uaXN0cDI1NgAAAAhuaXN0cDI1NgAAAEEEQ/HXJhC09vtW0E3mvnk7bqi59W3A+3/cPyHHgSy3jsEzNJk0fhYa4e61WpN58KgL+LIWAbR091/TFMauKpCSaQAAAGUAAAATZWNkc2Etc2hhMi1uaXN0cDI1NgAAAEoAAAAhAPFJWKg5UdROwlV6DxiNtnIZqqVRT9gDEb4CS7PsaUWHAAAAIQDSpZmpkuI30e2YkQwwOzx8NBJrGngn4Juf9XVyxIBjEg== mastahyeti@Benjamins-MacBook-Pro.local

2
spec/fixtures/rsa_leaf_for_ecdsa_ca.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6YHtAsZIKrGDR0l7IvEq5QpGjRNthPcaOOkSFmoW+nd2OKnQwiL0UymY1nOybPFGbPewkKPUe/ArOKKhhmCAeT43v0r3WpneFojHq5w8uuMxDuHljRiqkrgTgmYUorObUHXlZTebHkeAqGMFdFbaA6BAG5CXgDzXKt0rgPa+rI0S0D0hHOi6YJdKGafcQPaX3fS3jxj5xPlAGHuR+0DNMHhIuMdV8SeBRI1SLN7BzzvDij6habf/20VbBFnNbmHzUbC4a/8hyH1s9nYTc9ZZhOhGwU81spTvWIybtIAwx0/EH6w2RWDOZYJFzT57XYtnnMA/JWMVw2A1nYE+P0RKT mastahyeti@Benjamins-MacBook-Pro.local
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDP3DHavAi9JGxAf3GoWPZpsn6OXZXNB2kI3s+HaPuoSjZPV7S4Z1B1gLAOfx65nFuD/9Wxl4WNd7HYHryl0TI63gi2Wswb1ciI6XK/YJk7tTxXdAyVIWYU6Enr6KotlHM7NeIs1HgvjwNOTTN62PqZDoz7JIFKJtTBB0d60asRxXS1DRJ7qSdwMzHb4DKGcnGCrVBoh5RzTKZMCZDWfE7e89fz+ohqRKUm/LKBkxXACVSEAeHZTYi+HNcPOte7oal2EH/d2EjRwwajVWebXJSEqNk3VsQ8V8Qm94BznfIgGX3OCgG3E3Vqg5Ly/1ULr/2xJFmptHyMonKvpzHkQFFn mastahyeti@Benjamins-MacBook-Pro.local

50
spec/fixtures/rsa_leaf_for_ed25519_ca поставляемый
Просмотреть файл

@ -1,28 +1,28 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAQEA4wZo4GcLQVglx1KOkylpHmkR/XuvGbapw5b1woLXJWp38B/7iblX
IS4zKMpqSqtsIimPnV1HpF0DPmOc+r2WPCAhVOiAKuNZFVF2Ehpti9H1gIWxcjAs/jpn8H
HB968FVoFeIgFwRJtTuFfyn8tVhHb+rgdPFYZvOsFKyDfNBGloQgNSdwM62K2UadV2Y7Kv
m14UZFjzIBzd7PgK2OmffJkQGFpMtL06FLa2DnqjaIjk2wy5vIdB2aqUArzWb5+zGU7nNJ
8fa5pEe5u/X4+nhIJg8GRkcAI3KO1/lwzRmZ17XIkyz6hLv4WKoUQCrJN7EdV8JUspAZJy
RwPuhBGdbwAAA+CPWXmIj1l5iAAAAAdzc2gtcnNhAAABAQDjBmjgZwtBWCXHUo6TKWkeaR
H9e68ZtqnDlvXCgtclanfwH/uJuVchLjMoympKq2wiKY+dXUekXQM+Y5z6vZY8ICFU6IAq
41kVUXYSGm2L0fWAhbFyMCz+OmfwccH3rwVWgV4iAXBEm1O4V/Kfy1WEdv6uB08Vhm86wU
rIN80EaWhCA1J3AzrYrZRp1XZjsq+bXhRkWPMgHN3s+ArY6Z98mRAYWky0vToUtrYOeqNo
iOTbDLm8h0HZqpQCvNZvn7MZTuc0nx9rmkR7m79fj6eEgmDwZGRwAjco7X+XDNGZnXtciT
LPqEu/hYqhRAKsk3sR1XwlSykBknJHA+6EEZ1vAAAAAwEAAQAAAQEA1gKw0vnQbmT+GAwH
Q0sCQRyjTOVPh1neZvbj7d0Rm7/mGILNyGLjc+/tYkKOOJ2obfvn2lyYsKTN7f5ReT1HZp
6TTUtvpv5yd9o3B5HKOshOOj3NrOslPvMoEE3sn+Rpj8acSko43zPdlCW0Hla74weZxcw2
DQCR0j1slZmktsYwXc5WI4BQ8KhkMArSapDhbonuLz7rT9PnL8KA5E8byAJd9YKf0P7qaj
Xy78JCMoevk8QsvhA3jVRJ0+5r3v7g/4oh5UpJXsqyNzKmUJm7UJ0uHf6e2fJRCREhePJ3
hKqixF+AE6mGPpL86YZriVMGMx8++8FrjM/zCWz2EVnXQQAAAIEAzF5TxZ8KTpJ6Jz7huT
g6mLh5OMbTtEUssRCsQ2spXOm8b/MhM2/miKUdpVxlyr4nJhxv+S3wJR/hoaH7yCWN4ZZA
9ekZeuQKdhdW9rCSDDLzl9LuWxyjX5PoH8cy/XWe/9rocO7v+19dqxUQkeuIxLtmgJhdNN
itIVE/342sEscAAACBAPVxwjvWhtrQXHAtjXlLgo1EJJyZyYB2D1X/mAARSYlORMOk0piO
2tKEyQeLI1TUWAnMJoOuncG+/5tguscKMqRWAz1Dqg1OK9hbXO0blTOir86oCLL01PkSTF
iDPbd4mVe/iHMo2+uJIY+7qMpeP+wEXuVJbKiykgKmD2NQhSTHAAAAgQDsydyYQH1725ed
XQVUozi4UC7KaZekU/dCIa2+JGUyDA9a9HKU7CA/gzKHfRIdco1vQc1MAcI6SLrz9TJYAV
GLFN1NSimzpl+M64AWU0sbT/6AEfkE5ocduFednN4RO1hGn6l/C7/rjr8YO4AdklbgMdKa
ypAv/mZbIutdA5TKGQAAACZtYXN0YWh5ZXRpQEJlbmphbWlucy1NYWNCb29rLVByby5sb2
NhbAECAw==
NhAAAAAwEAAQAAAQEAz5QrNkd0xrU+h8uS4/nOV8V1CLvIEzTxBVefNa4Ylz7Nx6HK/4NS
tyryEMEUOg8/ZH9aWoc+s1YveqYmlLeNz8t221wrWj/lynMxet0woZznXGbdA7Id5X++gm
vLttlrGk/0U9ZBfQMzTu+ZJ/71I9s/TY0GYniNetivgKAfvBuJJhRcTpEPg3HnGMQf0oQ4
2dMqtLUz4UXWy7wd5+QWN1g/6mL/zmJcBwrqFLUkIeZcPRwmpkTJ259Ry7QjAyL0igcWrK
Bxo4y0iJEnUQdQuMzcmf2voYpsngYmNgLRnovIFgisXNRlKYhoODkdiuonpWnlh6ud/sph
w5lBra8tqwAAA+DK/JwMyvycDAAAAAdzc2gtcnNhAAABAQDPlCs2R3TGtT6Hy5Lj+c5XxX
UIu8gTNPEFV581rhiXPs3Hocr/g1K3KvIQwRQ6Dz9kf1pahz6zVi96piaUt43Py3bbXCta
P+XKczF63TChnOdcZt0Dsh3lf76Ca8u22WsaT/RT1kF9AzNO75kn/vUj2z9NjQZieI162K
+AoB+8G4kmFFxOkQ+DcecYxB/ShDjZ0yq0tTPhRdbLvB3n5BY3WD/qYv/OYlwHCuoUtSQh
5lw9HCamRMnbn1HLtCMDIvSKBxasoHGjjLSIkSdRB1C4zNyZ/a+himyeBiY2AtGei8gWCK
xc1GUpiGg4OR2K6ielaeWHq53+ymHDmUGtry2rAAAAAwEAAQAAAQA1yOmNbeRnHE0weGH+
Khr6CRKzCZzkxSHyRWreSNbcUYyWPmjP3eIPzdPc3Xp1NMAzNQBfVo27gAhbWjPC8vCOt+
R7IB2ni8jptQFMGYXhSjt0aL65l2xBq+DcADxPi3RB5BelpW1gi/S+bjyb7WbtPIDhgjn2
R9A41W5cAKFYZr5frmfpa4V9lwahd4FCSSzVYDkBKBmUAEKgEivR4Zowil0wBYzJQhHjTo
feur2gtN6otTz3z8+hp9F7dZPuGaPvk89QybW4iR3BwQ9rRRO7LdD/CzJ36zLuWo9M1wJB
ba448SdVTV7bGkhoegXaud3FLC9MI/2U9suL7CPHDv0xAAAAgFhrjzY3jFZAFaGpCFhpAJ
6Jdufb198kFS3//exvv+oqMBCzELYYVL9xTKMerRolTDzy/HVXnJGOBylT04pEaElRr/6M
kp/vhfDEJz6+6lYkM3LATlnbHwKTsjAnNJnfb9fgNzDza7hRHXbVvaPTHtVxusX2szGiXN
cGnMYJifjrAAAAgQD2appk1Jlvsuo09B/nlgefiyGWn8+u9bBovOhCOEbGLzT1yJtQzaRp
og9mC490sq85GDJiNhcqt0pwYRGuiRukAGiNR5GtkE6kA8wJK1cFReLlWF93RpTC+BeFqy
H9s+KR63wRMzI6XCCRYbXb/3sC8Ck3OQaQTIisUQNxf3RAOQAAAIEA16bi6iMYP9dWI4jw
GYPkxRvnIvaQDymjOtNm/5ST1DaQBPlZ3De9fgzA2ok4jf1m0O2G1KDziyEk0TS895wXS1
VLox6y+kDhA1gtzPWx/43YjQFNZEi5GyEnPdIqm1Dj3Hi9t+9qajvRWJzqym+AzfoiU5Ov
3e/wzhXjvm771QMAAAAmbWFzdGFoeWV0aUBCZW5qYW1pbnMtTWFjQm9vay1Qcm8ubG9jYW
wBAgMEBQ==
-----END OPENSSH PRIVATE KEY-----

Просмотреть файл

@ -1 +1 @@
ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgbhL/z39lfkd1ehqluClW1g2RbecbuPHW6ZpWOzohkxAAAAADAQABAAABAQDjBmjgZwtBWCXHUo6TKWkeaRH9e68ZtqnDlvXCgtclanfwH/uJuVchLjMoympKq2wiKY+dXUekXQM+Y5z6vZY8ICFU6IAq41kVUXYSGm2L0fWAhbFyMCz+OmfwccH3rwVWgV4iAXBEm1O4V/Kfy1WEdv6uB08Vhm86wUrIN80EaWhCA1J3AzrYrZRp1XZjsq+bXhRkWPMgHN3s+ArY6Z98mRAYWky0vToUtrYOeqNoiOTbDLm8h0HZqpQCvNZvn7MZTuc0nx9rmkR7m79fj6eEgmDwZGRwAjco7X+XDNGZnXtciTLPqEu/hYqhRAKsk3sR1XwlSykBknJHA+6EEZ1vAAAAAAAAAHsAAAABAAAACG15LWlkZW50AAAAEAAAAAxteS1wcmluY2lwYWwAAAAAAAAAAP//////////AAAAEgAAAANmb28AAAAHAAAAA2JhcgAAABMAAAADYmF6AAAACAAAAARxd2VyAAAAAAAAADMAAAALc3NoLWVkMjU1MTkAAAAg0hC5rhL6X9WB8sE4jHf/U7c/0fT/PdMAYTdkWg9MD5cAAABTAAAAC3NzaC1lZDI1NTE5AAAAQAWciW28pLZnS8dZj/q+Su/0Ax4GFFZWSEmO6mcB2mW1QAbtK4mil71W9YX43ucq2m8UxjN3O8oNA9+kZPN6xA4= mastahyeti@Benjamins-MacBook-Pro.local
ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAg1Eoq6hzGU5dLiudxaUwM8ERN7KjM3W3pe/WDyY84CDkAAAADAQABAAABAQDPlCs2R3TGtT6Hy5Lj+c5XxXUIu8gTNPEFV581rhiXPs3Hocr/g1K3KvIQwRQ6Dz9kf1pahz6zVi96piaUt43Py3bbXCtaP+XKczF63TChnOdcZt0Dsh3lf76Ca8u22WsaT/RT1kF9AzNO75kn/vUj2z9NjQZieI162K+AoB+8G4kmFFxOkQ+DcecYxB/ShDjZ0yq0tTPhRdbLvB3n5BY3WD/qYv/OYlwHCuoUtSQh5lw9HCamRMnbn1HLtCMDIvSKBxasoHGjjLSIkSdRB1C4zNyZ/a+himyeBiY2AtGei8gWCKxc1GUpiGg4OR2K6ielaeWHq53+ymHDmUGtry2rAAAAAAAAAHsAAAABAAAACG15LWlkZW50AAAAEAAAAAxteS1wcmluY2lwYWwAAAAAAAAAAP//////////AAAAEgAAAANmb28AAAAHAAAAA2JhcgAAABMAAAADYmF6AAAACAAAAARxd2VyAAAAAAAAADMAAAALc3NoLWVkMjU1MTkAAAAgeA4dhcNfbkcpY/TnfjDoIl5juGdaUckPNcDiTqoncswAAABTAAAAC3NzaC1lZDI1NTE5AAAAQDW6fjvvxWM8opAtvbgtNKP1Xz+bwWsYCm0KsRbrKqD0SNr2VYgC4/DHd3D5vH/03SUSM16kfY7n+ofESgTSQQY= mastahyeti@Benjamins-MacBook-Pro.local

2
spec/fixtures/rsa_leaf_for_ed25519_ca.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDjBmjgZwtBWCXHUo6TKWkeaRH9e68ZtqnDlvXCgtclanfwH/uJuVchLjMoympKq2wiKY+dXUekXQM+Y5z6vZY8ICFU6IAq41kVUXYSGm2L0fWAhbFyMCz+OmfwccH3rwVWgV4iAXBEm1O4V/Kfy1WEdv6uB08Vhm86wUrIN80EaWhCA1J3AzrYrZRp1XZjsq+bXhRkWPMgHN3s+ArY6Z98mRAYWky0vToUtrYOeqNoiOTbDLm8h0HZqpQCvNZvn7MZTuc0nx9rmkR7m79fj6eEgmDwZGRwAjco7X+XDNGZnXtciTLPqEu/hYqhRAKsk3sR1XwlSykBknJHA+6EEZ1v mastahyeti@Benjamins-MacBook-Pro.local
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPlCs2R3TGtT6Hy5Lj+c5XxXUIu8gTNPEFV581rhiXPs3Hocr/g1K3KvIQwRQ6Dz9kf1pahz6zVi96piaUt43Py3bbXCtaP+XKczF63TChnOdcZt0Dsh3lf76Ca8u22WsaT/RT1kF9AzNO75kn/vUj2z9NjQZieI162K+AoB+8G4kmFFxOkQ+DcecYxB/ShDjZ0yq0tTPhRdbLvB3n5BY3WD/qYv/OYlwHCuoUtSQh5lw9HCamRMnbn1HLtCMDIvSKBxasoHGjjLSIkSdRB1C4zNyZ/a+himyeBiY2AtGei8gWCKxc1GUpiGg4OR2K6ielaeWHq53+ymHDmUGtry2r mastahyeti@Benjamins-MacBook-Pro.local

48
spec/fixtures/rsa_leaf_for_rsa_ca поставляемый
Просмотреть файл

@ -1,28 +1,28 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
wBAgMEBQ==
-----END OPENSSH PRIVATE KEY-----

2
spec/fixtures/rsa_leaf_for_rsa_ca-cert.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgc8zlTSTQa/QmcXRnCrI5jVhMylWNn6a3n7m2siR6CsUAAAADAQABAAABAQDoAez3BykY8pTpAACaa0NjcEtwo2BKA8BmaEU7GKrCpa7I7E+F2na7PZ2OxD2ilUgyNi3MI/EN3YmzmTQrSyr2c/woimHw4Dm4WF/jZZ7DGQtXalGSxoD8jZ17aTCSZUIyPu7BbVcYLDhVSbk9Q/CsHENk5tpb7oUsrAhXi8+9OcZvRFYWXdavoomYgI/Ox5Kv9mXdiPfhwsmLg8pX6eNb4RAS3dnRKWVOnNkxb0p9yhztp394J7Zoq7zlRsy3nAGdQD9yRjVPpFyCiHjrZNgWpy7JwtEHUsRb12zdoLlTtxojmDaohdq6GLBAJcIRwwMJPRmsO/Wv3VO5vA7FM1nbAAAAAAAAAHsAAAABAAAACG15LWlkZW50AAAAEAAAAAxteS1wcmluY2lwYWwAAAAAAAAAAP//////////AAAAEgAAAANmb28AAAAHAAAAA2JhcgAAABMAAAADYmF6AAAACAAAAARxd2VyAAAAAAAAARcAAAAHc3NoLXJzYQAAAAMBAAEAAAEBAKRfY8vOB+5x0tXNuuJd1RSh9Pc3aB/Bixk0L3DH1gjcMQpiO+ZXqR282p7JH0YwfnIYkK2t+lhht/q5yFhbWfWY1LlVnYgEIKxMX97RGdDe3PpDMqR4jJ2tadzm2AjBbb3n8BMYf9RzsZEnsIDlenHIJlVI+RtDEhjxiPffMp5ETctqdWIBxqgEE4K5uCGxeC2nP1Y2KE/RzKXfOHTRApALVw2Fw1LC8cB2XoGYU0Luvm7+97b9tesOr9erzXHOx/mSqCsqoI2lNU/QP8sKjHRCZPn+6+Ar8dPm5Wqh4JQOCzaSBaTBFdf45AdtN9cTBqJuJFW1X+tLwCKF7pZao0kAAAEPAAAAB3NzaC1yc2EAAAEAMrWMI/6diuTQqgnorp5FqzGEVOWbG/Sqf4wlCYW+50cq14GM+MbVOlL0Sg3Ub9s03/EP2z5D/QtBY2p3iR65u9ysaI3T6kCn5Z0PHNRoWvMrsafs1cUZ1/dJo+eoX4XfEAhwQqGeRwTh5L77ospjQlX4fB+Ip00IAI1zBHQl2w+KOLJ/zpJXuv9QGUxe5mJIc8Eg2Z/vX2YAWzGk3jVpc2IYpG3aKcrWaCet68fpbLPqj/sVNrQ1Hgt23lPSZAxlwv1N+ASA4QVAfIE+a3OOU54/CSDdDXD0AOy/q3+XeJuQHpxFrPHIe6RICDo6YFQ2hyqLdi8soDt3tNqkuHe8BA== mastahyeti@Benjamins-MacBook-Pro.local
ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgFwHJLmPRmmyp+grUiAtpunaUCenXeK1VQqDOZBm5MmwAAAADAQABAAABAQCrkUq4uUToJ+Z7wDeG9ts3xsfHo/IttzkEbOj1q6bgT9qTeC9fk6p8f0+cfmtiAJec60ebEXjaiXl5I6kG9N6akeIvLV3fHqbmnt5gT+TTkthAVf8xnbFeXHWUWRLSvznRxI02elJfjx519omRHP7wySTbl9vnAtpu3zca8LFPOVk8Wr0WuZhAvvsGU0s+qHbOcmwX2lCtysYkLufpZt+rJBnJA0pkBCrseFe9DWqcUh7uRPWswNzuOeJzv/BKhZYzbn2qu0jeZ/pVvTd4AUCyRd/9yqtZVZO6HF4AJ4GJuMci7YCiDeVlnkac6c+aupnMgpSUiR+9JW1mHez8G+pFAAAAAAAAAHsAAAABAAAACG15LWlkZW50AAAAEAAAAAxteS1wcmluY2lwYWwAAAAAAAAAAP//////////AAAAEgAAAANmb28AAAAHAAAAA2JhcgAAABMAAAADYmF6AAAACAAAAARxd2VyAAAAAAAAARcAAAAHc3NoLXJzYQAAAAMBAAEAAAEBALR2bUGCx1xMH7JWL4SKiX6bOBKCtoiTMEWPNikxVba7+3GWuqCXE5VsCNEO0qTbdnu4RaoLnmyqSbUCmoNrDmEK6us7l/58+FcFmiJtfnGcG+g4E219pOu4idq8EZQ872VtB5bm6BaRzFlh1Xa9Vr7FPsefqHcwpKj/RGF6AsBThR+qvDQiOd8UxfIw6Yo4lwrIV6eOWoJHavfR+d2wR9vn7PeXg7Vhzv9LgFnfvEaU+6bk7T82RrWzdbPTEdHSgF6Rjmqngbcrok7exp6sTj6Y1GvA/XXgd0+R4mz5E8sI32y+BJENoOWBxD1G0D0WhcMoWiOjYX8tfIXtmgv0YMMAAAEPAAAAB3NzaC1yc2EAAAEAKEm7F+BPSw2THlBtAvNiUDTdSNXSYAeUWdfWDDA5IATOPVcjTjPL0NKX4LZrJyfnkm5fO/FDV9fC3Pxt2Iq4NyyqaSUZX3s6w1gDqyh/tcwOLk7Pjs0smejClzwApox5nuvDuKZhnSV4o2xfSWVdud30nLT5KsJrQik/oeMvv9Xm+IzX5HLdIg6wsYlw+mVRpACQ6r6fci3aGZC4j5VUR/ckWTKuE5ELIfXsinY9pA5/sbLVRwTvYTYJO3CRg0ZL6bmbBaiZHYN/S+s6M9Bq6gs3vHcPVCQJtu25E9wK0FtOrU5WB3VgI8ZZo/xH2y5SMZuTikL+5YHPUgW5tFP/jA== mastahyeti@Benjamins-MacBook-Pro.local

2
spec/fixtures/rsa_leaf_for_rsa_ca.pub поставляемый
Просмотреть файл

@ -1 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDoAez3BykY8pTpAACaa0NjcEtwo2BKA8BmaEU7GKrCpa7I7E+F2na7PZ2OxD2ilUgyNi3MI/EN3YmzmTQrSyr2c/woimHw4Dm4WF/jZZ7DGQtXalGSxoD8jZ17aTCSZUIyPu7BbVcYLDhVSbk9Q/CsHENk5tpb7oUsrAhXi8+9OcZvRFYWXdavoomYgI/Ox5Kv9mXdiPfhwsmLg8pX6eNb4RAS3dnRKWVOnNkxb0p9yhztp394J7Zoq7zlRsy3nAGdQD9yRjVPpFyCiHjrZNgWpy7JwtEHUsRb12zdoLlTtxojmDaohdq6GLBAJcIRwwMJPRmsO/Wv3VO5vA7FM1nb mastahyeti@Benjamins-MacBook-Pro.local
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrkUq4uUToJ+Z7wDeG9ts3xsfHo/IttzkEbOj1q6bgT9qTeC9fk6p8f0+cfmtiAJec60ebEXjaiXl5I6kG9N6akeIvLV3fHqbmnt5gT+TTkthAVf8xnbFeXHWUWRLSvznRxI02elJfjx519omRHP7wySTbl9vnAtpu3zca8LFPOVk8Wr0WuZhAvvsGU0s+qHbOcmwX2lCtysYkLufpZt+rJBnJA0pkBCrseFe9DWqcUh7uRPWswNzuOeJzv/BKhZYzbn2qu0jeZ/pVvTd4AUCyRd/9yqtZVZO6HF4AJ4GJuMci7YCiDeVlnkac6c+aupnMgpSUiR+9JW1mHez8G+pF mastahyeti@Benjamins-MacBook-Pro.local