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 []
示例#2
0
 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 _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)
示例#4
0
    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)
示例#5
0
    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)
示例#6
0
 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)
示例#7
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))
示例#8
0
 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)
示例#9
0
    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 _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)
示例#11
0
    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_()
示例#12
0
    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))
示例#13
0
    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))
示例#14
0
    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_()
示例#15
0
    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_()
示例#16
0
class YKPlusDevice(YKStandardDevice):
    mode = MODE.mode_for_flags(True, False, True)
    default_name = 'YubiKey Plus'
示例#17
0
 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)
示例#18
0
 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())
示例#19
0
 def mode(self):
     return MODE.mode_for_flags(*self.flags)
示例#20
0
 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)
示例#21
0
 def mode(self):
     return MODE.mode_for_flags(*self.flags)
示例#22
0
 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 __init__(self, devs, index,
              mode=MODE.mode_for_flags(False, False, True)):
     self._devs = devs
     self._index = index
     self._mode = mode
     self._serial = None
示例#24
0
 def has_ccid(self):
     return MODE.flags_for_mode(self.mode)[1]
 def has_ccid(self):
     return MODE.flags_for_mode(self.mode)[1]