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/lib/rex/proto/ntp/header.rb
Views: 15959
# -*- coding: binary -*-12require 'bindata'3require 'bigdecimal'4require 'bigdecimal/util'56module Rex7module Proto8module NTP::Header910class NTPShort < BinData::Primitive11# see: https://datatracker.ietf.org/doc/html/rfc5905#section-612endian :big1314uint16 :seconds15uint16 :fraction1617def set(value)18value = value.to_d19seconds = value.floor20self.seconds = seconds21self.fraction = ((value - seconds) * BigDecimal(2**16)).round22end2324def get25BigDecimal(seconds.value) + (BigDecimal(fraction.value) / BigDecimal(2**16))26end27end2829class NTPTimestamp < BinData::Primitive30UNIX_EPOCH = Time.utc(1900, 1, 1)31# see: https://datatracker.ietf.org/doc/html/rfc5905#section-632endian :big3334uint32 :seconds35uint32 :fraction3637def get38return nil if seconds == 0 && fraction == 03940time_in_seconds = seconds + BigDecimal(fraction.to_s) / BigDecimal((2**32).to_s)41(UNIX_EPOCH + time_in_seconds).utc42end4344def set(time)45if time.nil?46seconds = fraction = 047else48seconds_since_epoch = time.to_r - UNIX_EPOCH.to_r49seconds = seconds_since_epoch.to_i50fraction = ((seconds_since_epoch - seconds) * (2**32)).to_i51end5253self.seconds = seconds54self.fraction = fraction55end56end5758class NTPExtension < BinData::Record59endian :big6061uint16 :ext_type62uint16 :ext_length63uint8_array :ext_value, initial_length: :ext_length64end6566# A unified structure capable of representing NTP versions 1-467class NTPHeader < BinData::Record68# see: https://datatracker.ietf.org/doc/html/rfc958 (NTP v0 - unsupported)69# see: https://datatracker.ietf.org/doc/html/rfc1059 (NTP v1)70# see: https://datatracker.ietf.org/doc/html/rfc1119 (NTP v2)71# see: https://datatracker.ietf.org/doc/html/rfc1305 (NTP v3)72# see: https://datatracker.ietf.org/doc/html/rfc5905 (NTP v4)73endian :big74hide :bytes_remaining_0, :bytes_remaining_17576bit2 :leap_indicator77bit3 :version_number, initial_value: 4, assert: -> { version_number.between?(1, 4) }78bit3 :mode, onlyif: -> { version_number > 1 }79resume_byte_alignment80uint8 :stratum81int8 :poll82int8 :precision83ntp_short :root_delay84ntp_short :root_dispersion85string :reference_id, length: 4, trim_padding: true86ntp_timestamp :reference_timestamp87ntp_timestamp :origin_timestamp88ntp_timestamp :receive_timestamp89ntp_timestamp :transmit_timestamp90count_bytes_remaining :bytes_remaining_091buffer :extensions, length: -> { bytes_remaining_0 - 20 }, onlyif: :has_extensions? do92array :extensions, type: :ntp_extension, read_until: :eof93end94count_bytes_remaining :bytes_remaining_195uint32 :key_identifier, onlyif: :has_key_identifier?96uint8_array :message_digest, initial_length: OpenSSL::Digest::MD5.new.digest_length, onlyif: :has_message_digest?9798private99100def has_extensions?101# -20 for the length of the key identifier and message digest which are required when extensions are present102bytes_remaining_0 - 20 > 0 && version_number > 3103end104105def has_key_identifier?106bytes_remaining_1 > 0 || !key_identifier.clear?107end108109def has_message_digest?110bytes_remaining_1 > 4 || !message_digest.clear?111end112end113114end115end116end117118119