def open_all_devices(): max_index = c_uint() status = u2fh_devs_discover(devs, byref(max_index)) if status == 0: # We have devices! devices = [] resp = create_string_buffer(1024) for index in range(max_index.value + 1): buf_size = c_size_t(1024) if u2fh_get_device_description( devs, index, resp, byref(buf_size)) == 0: if resp.value.startswith('Yubikey NEO'): mode = MODE.mode_for_flags( 'OTP' in resp.value, 'CCID' in resp.value, 'U2F' in resp.value ) devices.append(U2FDevice(devs, index, mode)) elif resp.value.startswith('Yubikey 4'): mode = MODE.mode_for_flags( 'OTP' in resp.value, 'CCID' in resp.value, 'U2F' in resp.value ) devices.append(YK4Device(devs, index, mode)) elif resp.value.startswith('Security Key by Yubico'): devices.append(SKYDevice(devs, index)) return devices else: # No devices! # u2fh_devs_done(devs) pass return []
def _read_mode(self, dev): vid = c_int() pid = c_int() try: yk_get_key_vid_pid(dev, byref(vid), byref(pid)) mode = 0x0f & pid.value return MODE.mode_for_flags(bool(mode & 1), bool(mode & 4), bool(mode & 2)) except: # We know we at least have OTP enabled... return MODE.mode_for_flags(True, False, False)
def __init__(self, dev): self._dev = dev ser = c_uint() if yk_get_serial(dev, 0, 0, byref(ser)): self._serial = ser.value else: self._serial = None vid = c_int() pid = c_int() try: yk_get_key_vid_pid(dev, byref(vid), byref(pid)) mode = 0x0f & pid.value if mode == 1: # mode 1 has PID 0112 and mode 2 has PID 0111 self._mode = 2 elif mode == 2: self._mode = 1 else: # all others have 011x where x = mode self._mode = mode except: self._mode = MODE.mode_for_flags(True, False, False) status = ykds_alloc() try: if yk_get_status(dev, status): self._version = (ykds_version_major(status), ykds_version_minor(status), ykds_version_build(status)) else: self._version = (0, 0, 0) finally: ykds_free(status)
def __init__(self, dev): self._dev = dev ser = c_uint() if yk_get_serial(dev, 0, 0, byref(ser)): self._serial = ser.value else: self._serial = None vid = c_int() pid = c_int() try: yk_get_key_vid_pid(dev, byref(vid), byref(pid)) mode = 0x0f & pid.value if mode == 1: # mode 1 has PID 0112 and mode 2 has PID 0111 self._mode = 2 elif mode == 2: self._mode = 1 else: # all others have 011x where x = mode self._mode = mode except: self._mode = MODE.mode_for_flags(True, False, False) status = ykds_alloc() try: if yk_get_status(dev, status): self._version = ( ykds_version_major(status), ykds_version_minor(status), ykds_version_build(status) ) else: self._version = (0, 0, 0) finally: ykds_free(status)
def __init__(self, devs, index, mode=MODE.mode_for_flags(False, False, True)): self._devs = devs self._index = index self._mode = mode self._serial = None self._version = (0, 0, 0)
class YKStandardDevice(BaseDevice): device_type = 'OTP' supported = False serial = None version = (0, 0, 0) mode = MODE.mode_for_flags(True, False, False) def __init__(self, version): self._version = version @property def default_name(self): return 'YubiKey %s' % '.'.join(map(str, self._version))
def _read_mode(self, dev): vid = c_int() pid = c_int() try: yk_get_key_vid_pid(dev, byref(vid), byref(pid)) mode = 0x0f & pid.value if mode == 1: # mode 1 has PID 0112 and mode 2 has PID 0111 return 2 elif mode == 2: return 1 else: # all others have 011x where x = mode return mode except: # We know we at least have OTP enabled... return MODE.mode_for_flags(True, False, False)
def change_mode(self): mode = ModeDialog.change_mode(self._neo, self) if mode is not None: self._neo.set_mode(mode) self._mode_btn.setText(m.change_mode_1 % MODE.name_for_mode(mode)) remove_dialog = QtGui.QMessageBox(self) remove_dialog.setWindowTitle(m.change_mode) remove_dialog.setIcon(QtGui.QMessageBox.Information) remove_dialog.setText(m.remove_device) remove_dialog.setStandardButtons(QtGui.QMessageBox.NoButton) self._neo.removed.connect(remove_dialog.accept) remove_dialog.exec_()
def set_neo(self, neo): self._neo = neo if not neo: return self._name_btn.setDisabled(neo.serial is None) self._name.setText(m.name_1 % neo.name) self._serial.setText(m.serial_1 % neo.serial) show_firmware = neo.version != (0, 0, 0) self._u2f_row.setDirection( QtGui.QBoxLayout.LeftToRight if show_firmware else QtGui.QBoxLayout.RightToLeft) self._firmware.setVisible(show_firmware) self._firmware.setText(m.firmware_1 % '.'.join(map(str, neo.version))) if neo.u2f_capable: self._u2f.setText(m.u2f_1 % m.u2f_supported) else: self._u2f.setText(m.u2f_1 % m.u2f_not_supported_1 % U2F_URL) self._mode_btn.setText(m.change_mode_1 % MODE.name_for_mode(neo.mode))
def set_neo(self, neo): self._neo = neo if not neo: return self._name_btn.setDisabled(neo.serial is None) self._name.setText(m.name_1 % neo.name) self._serial.setText(m.serial_1 % neo.serial) show_firmware = neo.version != (0, 0, 0) self._u2f_row.setDirection( QtGui.QBoxLayout.LeftToRight if show_firmware else QtGui. QBoxLayout.RightToLeft) self._firmware.setVisible(show_firmware) self._firmware.setText(m.firmware_1 % '.'.join(map(str, neo.version))) if neo.u2f_capable: self._u2f.setText(m.u2f_1 % m.u2f_supported) else: self._u2f.setText(m.u2f_1 % m.u2f_not_supported_1 % U2F_URL) self._mode_btn.setText(m.change_mode_1 % MODE.name_for_mode(neo.mode))
def change_mode(self): mode = ModeDialog.change_mode(self._neo, self) if mode is not None: try: self._neo.set_mode(mode) except ModeSwitchError: QtGui.QMessageBox.critical(self, m.mode_error, m.mode_error_desc) return self._mode_btn.setText(m.change_mode_1 % MODE.name_for_mode(mode)) remove_dialog = QtGui.QMessageBox(self) remove_dialog.setWindowTitle(m.change_mode) remove_dialog.setIcon(QtGui.QMessageBox.Information) remove_dialog.setText(m.remove_device) remove_dialog.setStandardButtons(QtGui.QMessageBox.NoButton) self._neo.removed.connect(remove_dialog.accept) remove_dialog.exec_()
class YKPlusDevice(YKStandardDevice): mode = MODE.mode_for_flags(True, False, True) default_name = 'YubiKey Plus'
def mode(self, value): otp, ccid, u2f, touch_eject = MODE.flags_for_mode(value) self._otp.setChecked(otp) self._ccid.setChecked(ccid) self._u2f.setChecked(u2f)
def mode(self, value): otp, ccid, u2f, touch_eject = MODE.flags_for_mode(value) self._otp.setChecked(otp and self._otp.isEnabled()) self._ccid.setChecked(ccid and self._ccid.isEnabled()) self._u2f.setChecked(u2f and self._u2f.isEnabled())
def mode(self): return MODE.mode_for_flags(*self.flags)
def __init__(self, devs, index, mode=MODE.mode_for_flags(False, False, True)): self._devs = devs self._index = index self._mode = mode self._serial = None
def has_ccid(self): return MODE.flags_for_mode(self.mode)[1]