lib/ruby_home/http/services/verify_finish_service.rb
module RubyHome
class VerifyFinishService
def initialize(accessory_info:, encrypted_data:, session_key:, shared_secret:)
@accessory_info = accessory_info
@encrypted_data = encrypted_data
@session_key = session_key
@shared_secret = HAP::Crypto::SessionKey.new(shared_secret)
end
def run
if paired_client_exists?
RubyHome.dns_service.update
OpenStruct.new(
success?: true,
controller_to_accessory_key: shared_secret.controller_to_accessory_key,
accessory_to_controller_key: shared_secret.accessory_to_controller_key
)
else
OpenStruct.new(success?: false)
end
end
private
NONCE = -"PV-Msg03"
attr_reader :accessory_info, :encrypted_data, :session_key, :shared_secret
def paired_client_exists?
accessory_info.paired_clients.any? do |paired_client|
paired_client[:identifier] == identifier
end
end
def chacha20poly1305
HAP::Crypto::ChaCha20Poly1305.new(session_key)
end
def nonce
HexHelper.pad(NONCE)
end
def decrypted_data
chacha20poly1305.decrypt(nonce, encrypted_data)
end
def unpacked_decrypted_data
TLV.decode(decrypted_data)
end
def identifier
unpacked_decrypted_data[:identifier]
end
end
end