Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Path: blob/master/spec/lib/rex/proto/ntp/header_spec.rb
Views: 15959
# -*- coding:binary -*-12require 'spec_helper'34RSpec.describe Rex::Proto::NTP::Header::NTPShort do5context 'in the default state' do6describe '#to_binary_s' do7it 'is four null bytes' do8expect(subject.to_binary_s).to eq "\x00\x00\x00\x00".b9end10end1112describe '#value' do13it 'is a BigDecimal instance' do14expect(subject.value).to be_a(BigDecimal)15end1617it 'is zero' do18expect(subject.value).to eq 019end20end21end2223context 'when set to a real value' do24let(:value) { 10.015182 }25let(:subject) { described_class.new(value) }2627describe '#to_binary_s' do28it 'is four null bytes' do29expect(subject.to_binary_s).to eq "\x00\x0a\x03\xe3".b30end31end3233describe '#value' do34it 'is a BigDecimal instance' do35expect(subject.value).to be_a(BigDecimal)36end3738it 'is the correct value' do39expect(subject.value.round(6)).to eq value40end41end42end43end4445RSpec.describe Rex::Proto::NTP::Header::NTPTimestamp do46context 'in the default state' do47describe '#to_binary_s' do48it 'is eight null bytes' do49expect(subject.to_binary_s).to eq "\x00\x00\x00\x00\x00\x00\x00\x00".b50end51end5253describe '#value' do54it 'is nil' do55expect(subject.value).to be_nil56end57end58end5960context 'when set to a real value' do61let(:timestamp) { Time.parse('2024-12-12 15:32:42.555253 +0000') }62context 'from parts' do63let(:subject) { described_class.new.tap { |ts| ts.seconds = 0xeb05809a; ts.fraction = 0x8e2517e7 } }6465describe '#to_binary_s' do66it 'is correct' do67expect(subject.to_binary_s).to eq "\xeb\x05\x80\x9a\x8e\x25\x17\xe7".b68end69end7071describe '#value' do72it 'is a Time instance' do73expect(subject.value).to be_a(Time)74end7576it 'is the correct value' do77expect(subject.value.round(6)).to eq timestamp78end79end80end8182context 'from a timestamp' do83let(:subject) { described_class.new(timestamp) }8485describe '#to_binary_s' do86it 'is correct' do87expect(subject.to_binary_s).to eq "\xeb\x05\x80\x9a\x8e\x25\x0f\x84".b88end89end9091describe '#value' do92it 'is a Time instance' do93expect(subject.value).to be_a(Time)94end9596it 'is the correct value' do97expect(subject.value.round(6)).to eq timestamp98end99end100end101end102end103104RSpec.describe Rex::Proto::NTP::Header::NTPHeader do105context 'in the default state' do106describe '#to_binary_s' do107it 'is correct' do108expect(subject.to_binary_s).to eq ("\x20".b + ("\x00".b * 47))109end110end111112describe '#version_number' do113it 'is the latest supported version' do114expect(subject.version_number).to eq 4115end116117it 'throws an exception when set to an invalid value' do118expect { subject.version_number = 0 }.to raise_error(BinData::ValidityError)119expect { subject.version_number = 5 }.to raise_error(BinData::ValidityError)120end121end122123describe '#root_delay' do124it 'is an NTPShort' do125expect(subject.root_delay).to be_a Rex::Proto::NTP::Header::NTPShort126end127128it 'is 0' do129expect(subject.root_delay).to eq 0130end131end132133describe '#root_dispersion' do134it 'is an NTPShort' do135expect(subject.root_dispersion).to be_a Rex::Proto::NTP::Header::NTPShort136end137138it 'is 0' do139expect(subject.root_dispersion).to eq 0140end141end142143describe '#reference_id' do144it 'is an empty string' do145expect(subject.reference_id).to eq ''146end147end148149describe '#reference_timestamp' do150it 'is an NTPTimestamp' do151expect(subject.reference_timestamp).to be_a Rex::Proto::NTP::Header::NTPTimestamp152end153154it 'is nil' do155expect(subject.reference_timestamp).to eq nil156end157end158159describe '#origin_timestamp' do160it 'is an NTPTimestamp' do161expect(subject.origin_timestamp).to be_a Rex::Proto::NTP::Header::NTPTimestamp162end163164it 'is nil' do165expect(subject.origin_timestamp).to eq nil166end167end168169describe '#receive_timestamp' do170it 'is an NTPTimestamp' do171expect(subject.receive_timestamp).to be_a Rex::Proto::NTP::Header::NTPTimestamp172end173174it 'is nil' do175expect(subject.receive_timestamp).to eq nil176end177end178179describe '#transmit_timestamp' do180it 'is an NTPTimestamp' do181expect(subject.transmit_timestamp).to be_a Rex::Proto::NTP::Header::NTPTimestamp182end183184it 'is nil' do185expect(subject.transmit_timestamp).to eq nil186end187end188189describe '#extensions' do190it 'is empty' do191expect(subject.extensions).to be_empty192end193end194195describe '#key_identifier' do196it 'is not set' do197expect(subject.key_identifier?).to be_falsey198end199200it 'is zero' do201expect(subject.key_identifier).to eq 0202end203end204205describe '#message_digest' do206it 'is not set' do207expect(subject.message_digest?).to be_falsey208end209210it 'is empty' do211expect(subject.message_digest).to be_empty212end213end214end215216describe '#read' do217let(:subject) { described_class.new.read(packed) }218context 'when there is no MIC' do219let(:packed) { "\x20" + ("\x00".b * 47) }220221describe '#key_identifier' do222it 'is not set' do223expect(subject.key_identifier?).to be_falsey224end225226it 'is zero' do227expect(subject.key_identifier).to eq 0228end229end230231describe '#message_digest' do232it 'is not set' do233expect(subject.message_digest?).to be_falsey234end235236it 'is empty' do237expect(subject.message_digest).to be_empty238end239end240end241242context 'when there is a key identifier but no message_digest (Crypto-NAK)' do243let(:key_identifier) { 0xdead1337 }244let(:packed) { "\x20" + ("\x00".b * 47) + [key_identifier].pack('N') }245246describe '#key_identifier' do247it 'is set' do248expect(subject.key_identifier?).to be_truthy249end250251it 'is correct' do252expect(subject.key_identifier).to eq key_identifier253end254end255256describe '#message_digest' do257it 'is not set' do258expect(subject.message_digest?).to be_falsey259end260261it 'is empty' do262expect(subject.message_digest).to be_empty263end264end265end266267context 'when there is a key identifier and a message digest' do268let(:key_identifier) { 0xdead1337 }269let(:message_digest) { (0..15).to_a }270let(:packed) { "\x20" + ("\x00".b * 47) + [key_identifier].pack('N') + message_digest.pack('C*') }271272describe '#key_identifier' do273it 'is set' do274expect(subject.key_identifier?).to be_truthy275end276277it 'is correct' do278expect(subject.key_identifier).to eq key_identifier279end280end281282describe '#message_digest' do283it 'is set' do284expect(subject.message_digest?).to be_truthy285end286287it 'is empty' do288expect(subject.message_digest).to eq message_digest289end290end291end292end293end294295296