Skip to content

Commit d74f258

Browse files
committed
Fix decode_openssh_signature to respect offset
1 parent e0c24b2 commit d74f258

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

lib/ssh_data/encoding.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,13 +329,13 @@ def decode_string_public_key(raw, offset=0, algo=nil)
329329
def decode_openssh_signature(raw, offset=0)
330330
total_read = 0
331331

332-
magic = raw.byteslice(total_read, OPENSSH_SIGNATURE_MAGIC.bytesize)
332+
magic = raw.byteslice(offset, OPENSSH_SIGNATURE_MAGIC.bytesize)
333333
unless magic == OPENSSH_SIGNATURE_MAGIC
334334
raise DecodeError, "bad OpenSSH signature"
335335
end
336336

337337
total_read += OPENSSH_SIGNATURE_MAGIC.bytesize
338-
offset = total_read
338+
offset += total_read
339339
data, read = decode_fields(raw, OPENSSH_SIGNATURE_FIELDS, offset)
340340
total_read += read
341341
[data, total_read]

spec/encoding_spec.rb

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,4 +806,33 @@
806806
expect(read).to eq(0)
807807
end
808808
end
809+
810+
describe ("#decode_openssh_signature") do
811+
let(:signature) {
812+
Base64.decode64(%Q(
813+
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgoXgg2XgepEwBr3CQzkHXigy8T8
814+
uvs69Dvox5fgnGgPMAAAAEZmlsZQAAAAAAAAAGc2hhNTEyAAAAUwAAAAtzc2gtZWQyNTUx
815+
OQAAAECRxENUPwmbRveDvNFOc36EuyMIa6jXWbCVkEQ2dtORyFAnChmr1kHMFX4B9TQm6U
816+
ssvYRRUo6ePL5DuAjLP+kD
817+
))
818+
}
819+
820+
it "can decode a signature" do
821+
data, total_read = SSHData::Encoding.decode_openssh_signature(signature)
822+
expect(total_read).to eq(signature.bytesize)
823+
expect(data[:sigversion]).to eq(1)
824+
expect(data[:reserved]).to be_empty
825+
expect(data[:namespace]).to eq("file")
826+
expect(data[:hashalgorithm]).to eq("sha512")
827+
expect(data[:signature]).not_to be_empty
828+
expect(data[:publickey]).not_to be_empty
829+
end
830+
831+
it "can decode a signature starting at offset" do
832+
prefix = "helloworld"
833+
signature_appended = prefix + signature
834+
data, total_read = SSHData::Encoding.decode_openssh_signature(signature_appended, offset = prefix.bytesize)
835+
expect(total_read).to eq(signature.bytesize)
836+
end
837+
end
809838
end

0 commit comments

Comments
 (0)