/usr/lib/python2.7/dist-packages/pyhsm/stick.py is in python-pyhsm 1.2.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | """
module for actually talking to the YubiHSM
"""
# Copyright (c) 2011 Yubico AB
# See the file COPYING for licence statement.
__all__ = [
# constants
# functions
'read',
'write',
'flush',
# classes
'YHSM_Stick',
]
import sys
import serial
import pyhsm.util
import pyhsm.exception
class YHSM_Stick():
"""
The current YHSM is a USB device using serial communication.
This class exposes the basic functions read, write and flush (input).
"""
def __init__(self, device, timeout=1, debug=False):
"""
Open YHSM device.
"""
self.debug = debug
self.device = device
self.num_read_bytes = 0
self.num_write_bytes = 0
self.ser = None # to not bomb in destructor on open fail
self.ser = serial.serial_for_url(device)
self.ser.baudrate = 115200
self.ser.timeout = timeout
if self.debug:
sys.stderr.write("%s: OPEN %s\n" %(
self.__class__.__name__,
self.ser
))
return None
def acquire(self):
"""
Do nothing
"""
return self.acquire
def write(self, data, debug_info=None):
"""
Write data to YHSM device.
"""
self.num_write_bytes += len(data)
if self.debug:
if not debug_info:
debug_info = str(len(data))
sys.stderr.write("%s: WRITE %s:\n%s\n" %(
self.__class__.__name__,
debug_info,
pyhsm.util.hexdump(data)
))
return self.ser.write(data)
def read(self, num_bytes, debug_info=None):
"""
Read a number of bytes from YubiHSM device.
"""
if self.debug:
if not debug_info:
debug_info = str(num_bytes)
sys.stderr.write("%s: READING %s\n" %(
self.__class__.__name__,
debug_info
))
res = self.ser.read(num_bytes)
if self.debug:
sys.stderr.write("%s: READ %i:\n%s\n" %(
self.__class__.__name__,
len(res),
pyhsm.util.hexdump(res)
))
self.num_read_bytes += len(res)
return res
def flush(self):
"""
Flush input buffers.
"""
if self.debug:
sys.stderr.write("%s: FLUSH INPUT (%i bytes waiting)\n" %(
self.__class__.__name__,
self.ser.inWaiting()
))
self.ser.flushInput()
def drain(self):
""" Drain input. """
if self.debug:
sys.stderr.write("%s: DRAIN INPUT (%i bytes waiting)\n" %(
self.__class__.__name__,
self.ser.inWaiting()
))
old_timeout = self.ser.timeout
self.ser.timeout = 0.1
data = self.ser.read(1)
while len(data):
if self.debug:
sys.stderr.write("%s: DRAINED 0x%x (%c)\n" %(self.__class__.__name__, ord(data[0]), data[0]))
data = self.ser.read(1)
self.ser.timeout = old_timeout
return True
def raw_device(self):
""" Get raw serial device. Only intended for test code/debugging! """
return self.ser
def set_debug(self, new):
"""
Set debug mode (boolean).
Returns old setting.
"""
if type(new) is not bool:
raise pyhsm.exception.YHSM_WrongInputType(
'new', bool, type(new))
old = self.debug
self.debug = new
return old
def __repr__(self):
return '<%s instance at %s: %s - r:%i w:%i>' % (
self.__class__.__name__,
hex(id(self)),
self.device,
self.num_read_bytes,
self.num_write_bytes
)
def __del__(self):
"""
Close device when YHSM instance is destroyed.
"""
if self.debug:
sys.stderr.write("%s: CLOSE %s\n" %(
self.__class__.__name__,
self.ser
))
if self.ser:
self.ser.close()
|