// Code generated by kaitai-struct-compiler from a .ksy source file. DO NOT EDIT. import "github.com/kaitai-io/kaitai_struct_go_runtime/kaitai" /** * SSH public keys are encoded in a special binary format, typically represented * to end users as either one-liner OpenSSH format or multi-line PEM format * (commerical SSH). Text wrapper carries extra information about user who * created the key, comment, etc, but the inner binary is always base64-encoded * and follows the same internal format. * * This format spec deals with this internal binary format (called "blob" in * openssh sources) only. Buffer is expected to be raw binary and not base64-d. * Implementation closely follows code in OpenSSH. * @see Source */ type SshPublicKey struct { KeyName *SshPublicKey_Cstring Body interface{} _io *kaitai.Stream _root *SshPublicKey _parent interface{} } func NewSshPublicKey() *SshPublicKey { return &SshPublicKey{ } } func (this *SshPublicKey) Read(io *kaitai.Stream, parent interface{}, root *SshPublicKey) (err error) { this._io = io this._parent = parent this._root = root tmp1 := NewSshPublicKey_Cstring() err = tmp1.Read(this._io, this, this._root) if err != nil { return err } this.KeyName = tmp1 switch (this.KeyName.Value) { case "ssh-rsa": tmp2 := NewSshPublicKey_KeyRsa() err = tmp2.Read(this._io, this, this._root) if err != nil { return err } this.Body = tmp2 case "ecdsa-sha2-nistp256": tmp3 := NewSshPublicKey_KeyEcdsa() err = tmp3.Read(this._io, this, this._root) if err != nil { return err } this.Body = tmp3 case "ssh-ed25519": tmp4 := NewSshPublicKey_KeyEd25519() err = tmp4.Read(this._io, this, this._root) if err != nil { return err } this.Body = tmp4 case "ssh-dss": tmp5 := NewSshPublicKey_KeyDsa() err = tmp5.Read(this._io, this, this._root) if err != nil { return err } this.Body = tmp5 } return err } /** * @see Source */ type SshPublicKey_KeyRsa struct { RsaE *SshPublicKey_Bignum2 RsaN *SshPublicKey_Bignum2 _io *kaitai.Stream _root *SshPublicKey _parent *SshPublicKey _f_keyLength bool keyLength int } func NewSshPublicKey_KeyRsa() *SshPublicKey_KeyRsa { return &SshPublicKey_KeyRsa{ } } func (this *SshPublicKey_KeyRsa) Read(io *kaitai.Stream, parent *SshPublicKey, root *SshPublicKey) (err error) { this._io = io this._parent = parent this._root = root tmp6 := NewSshPublicKey_Bignum2() err = tmp6.Read(this._io, this, this._root) if err != nil { return err } this.RsaE = tmp6 tmp7 := NewSshPublicKey_Bignum2() err = tmp7.Read(this._io, this, this._root) if err != nil { return err } this.RsaN = tmp7 return err } /** * Key length in bits */ func (this *SshPublicKey_KeyRsa) KeyLength() (v int, err error) { if (this._f_keyLength) { return this.keyLength, nil } tmp8, err := this.RsaN.LengthInBits() if err != nil { return 0, err } this.keyLength = int(tmp8) this._f_keyLength = true return this.keyLength, nil } /** * Public key exponent, designated `e` in RSA documentation. */ /** * Modulus of both public and private keys, designated `n` in RSA * documentation. Its length in bits is designated as "key length". */ /** * @see Source */ type SshPublicKey_KeyEd25519 struct { LenPk uint32 Pk []byte _io *kaitai.Stream _root *SshPublicKey _parent *SshPublicKey } func NewSshPublicKey_KeyEd25519() *SshPublicKey_KeyEd25519 { return &SshPublicKey_KeyEd25519{ } } func (this *SshPublicKey_KeyEd25519) Read(io *kaitai.Stream, parent *SshPublicKey, root *SshPublicKey) (err error) { this._io = io this._parent = parent this._root = root tmp9, err := this._io.ReadU4be() if err != nil { return err } this.LenPk = uint32(tmp9) tmp10, err := this._io.ReadBytes(int(this.LenPk)) if err != nil { return err } tmp10 = tmp10 this.Pk = tmp10 return err } /** * @see Source */ type SshPublicKey_KeyEcdsa struct { CurveName *SshPublicKey_Cstring Ec *SshPublicKey_EllipticCurve _io *kaitai.Stream _root *SshPublicKey _parent *SshPublicKey } func NewSshPublicKey_KeyEcdsa() *SshPublicKey_KeyEcdsa { return &SshPublicKey_KeyEcdsa{ } } func (this *SshPublicKey_KeyEcdsa) Read(io *kaitai.Stream, parent *SshPublicKey, root *SshPublicKey) (err error) { this._io = io this._parent = parent this._root = root tmp11 := NewSshPublicKey_Cstring() err = tmp11.Read(this._io, this, this._root) if err != nil { return err } this.CurveName = tmp11 tmp12 := NewSshPublicKey_EllipticCurve() err = tmp12.Read(this._io, this, this._root) if err != nil { return err } this.Ec = tmp12 return err } /** * A integer-prefixed string designed to be read using `sshbuf_get_cstring` * and written by `sshbuf_put_cstring` routines in ssh sources. Name is an * obscure misnomer, as typically "C string" means a null-terminated string. * @see Source */ type SshPublicKey_Cstring struct { Len uint32 Value string _io *kaitai.Stream _root *SshPublicKey _parent interface{} } func NewSshPublicKey_Cstring() *SshPublicKey_Cstring { return &SshPublicKey_Cstring{ } } func (this *SshPublicKey_Cstring) Read(io *kaitai.Stream, parent interface{}, root *SshPublicKey) (err error) { this._io = io this._parent = parent this._root = root tmp13, err := this._io.ReadU4be() if err != nil { return err } this.Len = uint32(tmp13) tmp14, err := this._io.ReadBytes(int(this.Len)) if err != nil { return err } tmp14 = tmp14 this.Value = string(tmp14) return err } /** * @see Source */ type SshPublicKey_KeyDsa struct { DsaP *SshPublicKey_Bignum2 DsaQ *SshPublicKey_Bignum2 DsaG *SshPublicKey_Bignum2 DsaPubKey *SshPublicKey_Bignum2 _io *kaitai.Stream _root *SshPublicKey _parent *SshPublicKey } func NewSshPublicKey_KeyDsa() *SshPublicKey_KeyDsa { return &SshPublicKey_KeyDsa{ } } func (this *SshPublicKey_KeyDsa) Read(io *kaitai.Stream, parent *SshPublicKey, root *SshPublicKey) (err error) { this._io = io this._parent = parent this._root = root tmp15 := NewSshPublicKey_Bignum2() err = tmp15.Read(this._io, this, this._root) if err != nil { return err } this.DsaP = tmp15 tmp16 := NewSshPublicKey_Bignum2() err = tmp16.Read(this._io, this, this._root) if err != nil { return err } this.DsaQ = tmp16 tmp17 := NewSshPublicKey_Bignum2() err = tmp17.Read(this._io, this, this._root) if err != nil { return err } this.DsaG = tmp17 tmp18 := NewSshPublicKey_Bignum2() err = tmp18.Read(this._io, this, this._root) if err != nil { return err } this.DsaPubKey = tmp18 return err } /** * Elliptic curve dump format used by ssh. In OpenSSH code, the following * routines are used to read/write it: * * * sshbuf_get_ec * * get_ec * @see Source */ type SshPublicKey_EllipticCurve struct { Len uint32 Body []byte _io *kaitai.Stream _root *SshPublicKey _parent *SshPublicKey_KeyEcdsa } func NewSshPublicKey_EllipticCurve() *SshPublicKey_EllipticCurve { return &SshPublicKey_EllipticCurve{ } } func (this *SshPublicKey_EllipticCurve) Read(io *kaitai.Stream, parent *SshPublicKey_KeyEcdsa, root *SshPublicKey) (err error) { this._io = io this._parent = parent this._root = root tmp19, err := this._io.ReadU4be() if err != nil { return err } this.Len = uint32(tmp19) tmp20, err := this._io.ReadBytes(int(this.Len)) if err != nil { return err } tmp20 = tmp20 this.Body = tmp20 return err } /** * Big integers serialization format used by ssh, v2. In the code, the following * routines are used to read/write it: * * * sshbuf_get_bignum2 * * sshbuf_get_bignum2_bytes_direct * * sshbuf_put_bignum2 * * sshbuf_get_bignum2_bytes_direct * @see Source */ type SshPublicKey_Bignum2 struct { Len uint32 Body []byte _io *kaitai.Stream _root *SshPublicKey _parent interface{} _f_lengthInBits bool lengthInBits int } func NewSshPublicKey_Bignum2() *SshPublicKey_Bignum2 { return &SshPublicKey_Bignum2{ } } func (this *SshPublicKey_Bignum2) Read(io *kaitai.Stream, parent interface{}, root *SshPublicKey) (err error) { this._io = io this._parent = parent this._root = root tmp21, err := this._io.ReadU4be() if err != nil { return err } this.Len = uint32(tmp21) tmp22, err := this._io.ReadBytes(int(this.Len)) if err != nil { return err } tmp22 = tmp22 this.Body = tmp22 return err } /** * Length of big integer in bits. In OpenSSH sources, this corresponds to * `BN_num_bits` function. */ func (this *SshPublicKey_Bignum2) LengthInBits() (v int, err error) { if (this._f_lengthInBits) { return this.lengthInBits, nil } this.lengthInBits = int(((this.Len - 1) * 8)) this._f_lengthInBits = true return this.lengthInBits, nil }