+
     h;  c                  s8   ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^RI	H
t
HtHtHt ]P                  ! ]4      tRtRtRtRtR	tR
tRtRtRt ! R R]P4                  4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t  ! R R]4      t!]PD                  ! ]4      t#]PD                  ! ]4      t$]PD                  ! ]4      t%]PD                  ! ] 4      t&]PN                  t(]PD                  ! ]!4      t)]PT                  t+]PT                  t,]PZ                  t.]P^                  t0]Pb                  t2]Pf                  t4Rt5]Pl                  t7]Pl                  t8]Pl                  t9]Pl                  t:]Pl                  t;]:t<]:t=]PD                  ! ]4      t>]PD                  ! ]4      t?]P                  ! R]P                  ]7]PT                  ]8]Pf                  ]PD                  ! ]P                  4      ]04      tC]P                  ! R]P                  ]7]PT                  4      tD^tERtF^ tG^tH^ tI^tJ^tK^tL]P                  P                  ]P                  P                  R4      ;'       g    R4      tQ]P                  P                  ]P                  P                  R4      ;'       g    R 4      tR]$P                  ]RR!4      tTR]RP                  nV        ]#]PD                  ! ]PT                  4      .]RP                  nW        ]$]RP                  nV        ]PT                  ]P                  ]Pf                  .]RP                  nW        ]P                  ]RP                  nV        ]%]P                  ]0]4.]RP                  nW        ].]RP                  nV        ]%.]RP                  nW        ].]RP                  nV        ].]RP                  nV        ]P                  ]RP                  nV        ]&]RP                  nV        . ]RP                  nW        ](]RP                  nV        ]$]2]P                  .]RP                  nW        ]7]RP                  nV        ]%.]RP                  nW        ]:.]QP                  nW        ]>]QP                  nV        ])]9.]QP                  nW        ]#]QP                  nV        ]>.]QP                  nW        R]QP                  nV        ]>]%.]QP                  nW        ],]QP                  nV        ]P                  .]QP                  nW        ]7]QP                  nV        ]=]PD                  ! ]P                  4      .]QP                  nW        ]?]QP                  nV        ])]<.]QP                  nW        ]7]QP                  nV        ]?]Pf                  .]QP                  nW        R]QP                  nV        ]?]&]$.]QP                  nW        R]QP                  nV        ]?]&]$.]QP                  nW        ]%]QP                  nV        ]?]$.]QP                  nW        ]7]QP                  nV        ]?]8]0]PT                  ]0.]QP                  nW        ]<]QP                  nV        ];]+.]QP                  nW        R" tr]C! ]r4      tsR# tt]D! ]t4      tuR$ tv ! R% R&]4      twR' txR( tyR) tzR* t{R+ t|R, t}R- t~R. tR# )/    )annotationsN)EmptyQueue)
FIDO_USAGEFIDO_USAGE_PAGECtapHidConnectionHidDescriptors   VendorIDs	   ProductIDs   Products   SerialNumbers   PrimaryUsages   PrimaryUsagePages   MaxInputReportSizes   MaxOutputReportSizes   ReportIDc                  s    ] tR t^,tRtR# )_CFType N__name__
__module____qualname____firstlineno____static_attributes__r	       4/usr/lib/python3.14/site-packages/fido2/hid/macos.pyr   r   ,       r   r   c                  s    ] tR t^0tRtR# )	_CFStringr	   Nr
   r	   r   r   r   r   0   r   r   r   c                  s    ] tR t^4tRtR# )_CFSetr	   Nr
   r	   r   r   r   r   4   r   r   r   c                  s    ] tR t^8tRtR# )_IOHIDManagerr	   Nr
   r	   r   r   r   r   8   r   r   r   c                  s    ] tR t^<tRtR# )_IOHIDDevicer	   Nr
   r	   r   r   r   r   <   r   r   r   c                  s    ] tR t^@tRtR# )
_CFRunLoopr	   Nr
   r	   r   r   r   r   @   r   r   r   c                  s    ] tR t^DtRtR# )_CFAllocatorr	   Nr
   r	   r   r   r   r   D   r   r   r   i  ZIOKitz0/System/Library/Frameworks/IOKit.framework/IOKitZCoreFoundationzB/System/Library/Frameworks/CoreFoundation.framework/CoreFoundationZkCFRunLoopDefaultModec                sX    ????V P                  \        P                  ! WV4      4       R# )z+Handles incoming IN report from HID device.N)ZputctypesZ	string_at)
read_queueresultsenderZreport_typeZ	report_idZreportZreport_lengths   &&&&&&&r   _hid_read_callbackr      s$     	YNN6##F:;r   c                sH    ??\         P                  V P                  4       R # N)cfZCFRunLoopStoprun_loop_ref)
hid_devicer   r   s   &&&r   _hid_removal_callbackr"      s    Z,,-r   c                s   \         P                  4       V n        V P                  '       g   \        P	                  R4       R# \
        P                  V P                  V P                  \        4       \
        P                  V P                  \        \        P                  ! V 4      4       ^p^ pW!8  d   \         P                  \        ^R4      pV P                  P                  4       '       * pV\         8X  d*   V'       d   M7\        P#                  R4       V^,          pKt  \        P	                  RV4        \
        P%                  V P                  V P                  \        4       R# )zBinds a device to the thread's run loop, then starts the run loop.

Args:
hid_device: The MacOsHidDevice object

The HID manager requires a run loop to handle Report reads. This thread
function serves that purpose.
zFailed to get current run loopNTz6Read queue empty after HANDLE_SOURCE, attempting retryz!Unexpected run loop exit code: %d)r   CFRunLoopGetCurrentr    loggerZerroriokitIOHIDDeviceScheduleWithRunLoophandleK_CF_RUNLOOP_DEFAULT_MODEZ"IOHIDDeviceRegisterRemovalCallbackREMOVAL_CALLBACKr   	py_objectCFRunLoopRunInModer   Zempty K_CF_RUN_LOOP_RUN_HANDLED_SOURCEZdebug IOHIDDeviceUnscheduleFromRunLoop)r!   Zmax_retriesZretriesZrun_loop_run_resultZreceived_datas   &    r   _dev_read_threadr.      s!    !446J"""56	((:224M 
,,+V-=-=j-I KG

 33%
 '117799"BB UV1 LL<>QR 
**:224Mr   c                  s.    ] tR tRtR tR tR tR tRtR# )MacCtapHidConnectioni  c           	     	s    Wn         \        VP                  4      V n        \        P                  V P                  ^ 4      pV\        8w  d   \        RV 24      h\        4       V n	        RV n
        \        P                  VP                  ,          ! 4       V n        \        P                  V P                  V P                  V P                   P                  \         \        P"                  ! V P                  4      4       R# )r    z)Failed to open device for communication: N)
descriptor_handle_from_pathpathr'   r%   ZIOHIDDeviceOpenK_IO_RETURN_SUCCESSOSErrorr   r   r    r   c_uint8report_size_inin_report_buffer&IOHIDDeviceRegisterInputReportCallbackREGISTERED_READ_CALLBACKr*   )selfr0   r      && r   __init__ZMacCtapHidConnection.__init__  s    $'
8 &&t{{A6((EfXNOO "' ! "(*2K2K!K N44KK!!OO**$T__-	
r   c           	     	s    \         P                  V P                  V P                  V P                  P
                  \        P                  ! ^ \        4      R4       R# )r    N)	r%   r8   r'   r7   r0   r6   r   ZcastIO_HID_REPORT_CALLBACK)r:      &r   closeZMacCtapHidConnection.close8  s?    44KK!!OO**KK12	
r   c           	     	s    \         P                  V P                  \        ^ V\	        V4      4      pV\
        8w  d   \        RV 24      hR# )r    z"Failed to write report to device: N)r%   IOHIDDeviceSetReportr'   K_IO_HID_REPORT_TYPE_OUTPUTZlenr3   r4   )r:   Zpacketr   r;   r   write_packetZ!MacCtapHidConnection.write_packetA  sL    ++KK'K
 ((>vhGHH )r   c                	sB    V P                   P                  R 4      #   \         dw    \        P                  ! \
        T 3R7      pTP                  4        TP                  4         T P                   P                  R 4      u #   \         d    \        R4      hi ; ii ; i)F)ZtargetZargszFailed reading a response)	r   Zgetr   	threadingZThreadr.   ZstartZjoinr4   )r:   Zread_threads   & r   read_packetZ MacCtapHidConnection.read_packetN  s    		;??&&u-- 	;#**2B$QK;**511 ;9::;	;s"    AB&B BBB)r0   r'   r7   r   r    N)	r   r   r   r   r<   r?   rB   rD   r   r	   r   r   r/   r/     s    
2
I
;r   r/   c                s   \         P                  RV^ 4      p\        P                  W4      p\         P	                  V4       V'       g   R# \         P                  V4      \         P                  4       8w  d"   \        R\         P                  V4       24      h\        P                  ! 4       p\         P                  V\        \        P                  ! V4      4      pV'       g   R# VP                  # )z'Reads int property from the HID device.NzExpected number type, got )r   CFStringCreateWithCStringr%   IOHIDDeviceGetProperty	CFReleaseCFGetTypeIDCFNumberGetTypeIDr4   r   c_int32CFNumberGetValueK_CF_NUMBER_SINT32_TYPEbyrefvalueZdevZkeyZcf_keyZtype_refZoutZret   &&    r   get_int_propertyrQ   [  s    ))$Q7F++C8HLL	~~h2#7#7#9922>>(3K2LMNN
..
C


h(?cAR
SC99r   c                s@   \         P                  RV^ 4      p\        P                  W4      p\         P	                  V4       V'       g   R# \         P                  V4      \         P                  4       8w  d"   \        R\         P                  V4       24      h\        P                  ! ^4      p\         P                  W4\        P                  ! V4      \        4      pV'       g   R#  VP                  P                  R4      ;'       g    R#   \         d     R# i ; i)z*Reads string property from the HID device.NzExpected string type, got zutf-8)r   rE   r%   rF   rG   rH   CFStringGetTypeIDr4   r   Zcreate_string_bufferCFStringGetCStringZsizeof CF_STRING_BUILTIN_ENCODINGS_UTF8rN   ZdecodeZUnicodeDecodeErrorrO   rP   r   get_string_propertyrU   n  s    ))$Q7F++C8HLL	~~h2#7#7#9922>>(3K2LMNN

%
%c
*C


v}}S)+KC yy(00D0 s   )!D D DDc                s    \         P                  V 4      p\        P                  ! 4       p\         P	                  V\        P
                  ! V4      4      pV\        8w  d   \        RV 24      hVP                  # )zObtains the unique IORegistry entry ID for the device.

Args:
handle: reference to the device

Returns:
A unique ID for the device, obtained from the IO Registry
z&Failed to obtain IORegistry entry ID: )	r%   ZIOHIDDeviceGetServicer   c_uint64!IORegistryEntryGetRegistryEntryIDrM   r3   r4   rN   )r'   Zio_service_objentry_idr      &   r   get_device_idrZ     sf     008N H44X.F $$>vhGHH>>r   c                s    \         P                  ! \        V 4      4      p\        P	                  V4      p\        P                  \        V4      pV'       g   \        R V  R24      h\        P                  \        V4      # )z
Device ID z, does not match any HID device on the system)
r   rV   Zintr%   IORegistryEntryIDMatchingIOServiceGetMatchingServiceK_IO_MASTER_PORT_DEFAULTr4   IOHIDDeviceCreateK_CF_ALLOCATOR_DEFAULT)r2   rX   Zmatching_dictZdevice_entryrY   r   r1   r1     sg    s4y)H33H=M44 -L 
4&(TUVV""#9<HHr   c                s    \        V 4      # r   )r/   )r0   r>   r   open_connectionr`     s    
++r   c           	     s   \        V \        4      p\        V \        4      pV\        8X  d   V\        8X  d   \        V 4      p\        V \        4      p\        V \        4      p\        V \        4      p\        V \        4      p\        V \        4      p\        V \        4      p	\        \        V4      WEWWg4      # \        R 4      h)zNot a CTAP device)rQ   &HID_DEVICE_PROPERTY_PRIMARY_USAGE_PAGE!HID_DEVICE_PROPERTY_PRIMARY_USAGEr   r   rZ   HID_DEVICE_PROPERTY_VENDOR_IDHID_DEVICE_PROPERTY_PRODUCT_IDrU   HID_DEVICE_PROPERTY_PRODUCT!HID_DEVICE_PROPERTY_SERIAL_NUMBER)HID_DEVICE_PROPERTY_MAX_INPUT_REPORT_SIZE*HID_DEVICE_PROPERTY_MAX_OUTPUT_REPORT_SIZEr   Zstr
ValueError)
r'   Z
usage_pageZusageZ	device_idZvidZpidZproductZserialZsize_inZsize_outs
   &         r   _get_descriptor_from_handlerj     s    !&*PQJV%FGE_$*)<!&)	v'DEv'EF%f.IJ$V-NO"6+TU#F,VW	NCg
 	
 (
))r   c                s*    \        \        V 4      4      # r   )rj   r1   )r2   r>   r   get_descriptorrk     s    &'8'>??r   c                 s   \         P                  R ^ 4      p V '       g   \        R4      h \         P                  V R 4       \         P	                  V 4      pV'       g   \        R4      h \         P                  V4      p\        V,          ! 4       p\         P                  W4       . pV F   p \        V4      pVP                  V4       K"  	  V\        P                  V4       \        P                  V 4       #   \         d     K^  i ; i  \        P                  T4       i ; i  \        P                  T 4       i ; i)Nz&Unable to obtain HID manager referencez)Failed to obtain devices from HID manager)r%   IOHIDManagerCreater4   IOHIDManagerSetDeviceMatchingIOHIDManagerCopyDevicesZCFSetGetCountIO_HID_DEVICE_REFCFSetGetValuesrj   Zappendri   r   rG   )Zhid_mgrZdevice_set_refZnumZdevicesZdescriptorsr'   r0   s          r   list_descriptorsrq     s   &&tQ/G>??++GT: 66w?EFF	)%%n5C(3.1G  9 K!!<V!DJ&&z2 " LL(
W "  LL(
WsN   2D& D& *AD .C:
D D& :D	D D		D D##D& &D=)Z
__future__r   r   Zctypes.utilZloggingrC   Zqueuer   r   Zbaser   r   r   r   Z	getLoggerr   r$   rc   rd   re   rf   rb   ra   rg   rh   ZHID_DEVICE_PROPERTY_REPORT_IDZ	Structurer   r   r   r   r   r   r   ZPOINTERZ
CF_SET_REFZCF_STRING_REFZCF_TYPE_REFZCF_RUN_LOOP_REFrJ   ZCF_RUN_LOOP_RUN_RESULTZCF_ALLOCATOR_REFZc_void_pZCF_DICTIONARY_REFZCF_MUTABLE_DICTIONARY_REFZc_ulongZ
CF_TYPE_IDZc_longZCF_INDEXZc_doubleZCF_TIME_INTERVALZc_uint32ZCF_STRING_ENCODINGrT   Zc_uintZ	IO_RETURNZIO_HID_REPORT_TYPEZIO_OPTION_BITSZIO_OBJECT_TZMACH_PORT_TZIO_SERVICE_TZIO_REGISTRY_ENTRY_TZIO_HID_MANAGER_REFro   Z	CFUNCTYPEr*   r5   r=   ZIO_HID_CALLBACKrL   r_   r]   rA   r3   ZK_CF_RUN_LOOP_RUN_STOPPEDZK_CF_RUN_LOOP_RUN_TIMED_OUTr,   ZcdllZLoadLibraryZutilZfind_libraryr%   r   Zin_dllr(   rp   ZrestypeZargtypesrE   Zc_char_pZc_boolrS   rH   rI   rR   Zc_intrK   r#   r+   rG   ZIOObjectReleaserl   rn   rm   r[   rV   rW   r^   ZIOHIDDeviceCloser&   r-   rF   r@   r\   r   r9   r"   r)   r.   r/   rQ   rU   rZ   r1   r`   rj   rk   rq   r	   r   r   <module>rr      s>  $ #      O O			8	$ !, !- ( $3 !$3 !)< &,A )-C * + 	f 		 		W 		G 		7 		 		7 	 ^^F#
y)nnW%.., >>,/ OO "OO ^^
==?? __ #,  MM	]] mmmm! ^^M2 NN<0 ))

OO
OO
NN6>>"	  ""4)9)99fooV        #$   	
KKW% : :9	 [[
KK-. L LK *005LM  !   (&..*IJ   '4   $
OO
OO
OO)   %
 !'   
OO	"    $ &- )   )   $ll   !0   "$    6   "/1A6==!Q     $ "-   #5    %5~$F   !(2   %*<)=   &.2 # # +0BK/P # # ,*C   ',2OO+<   (2; ' ' /
NN6??#4 ' ' 0
 #4   $4l#C    !*   #4foo"F   /3 $ $ ,1 $ $ -
 26 & & .3 & & /
 (3   $):M(J   %%.   "
OO'   # -9 ! ! ).9;L-M ! ! *< 22DE .
 ##89 4n:;, :;z&0*
I,*"@r   