jumpserver/jumpserver · critical · GMDeviceError
generate random error
Error message
generate random error
What it means
Raised by GM/SM crypto HSM session wrapper when the underlying HS_SDF_GenerateRandom driver call returns a non-zero return code. It means the hardware security device (SDF-compatible GM card) failed to produce the requested random bytes. The numeric code carried in the exception indicates the device-level reason.
Source
Thrown at apps/common/sdk/gm/sctu/session.py:20
from common.sdk.gm.base.exception import GMDeviceError
from .session_mixin import SM4Mixin
class Session(SM4Mixin):
def __init__(self, driver, session):
super().__init__()
self._session = session
self._driver = driver
def get_device_info(self):
pass
def generate_random(self, length=64):
random_data = (c_ubyte * length)()
ret = self._driver.HS_SDF_GenerateRandom(self._session, c_int(length), random_data)
if ret != 0:
raise GMDeviceError("generate random error", ret)
return bytes(random_data)
def close(self):
ret = self._driver.HS_SDF_CloseSession(self._session)
if ret != 0:
raise GMDeviceError("close session failed", ret)
View on GitHub (pinned to 6ec464fabd)
Solutions
- Check the numeric ret code against the SDF/GM error code table to identify the device reason
- Verify the device is present and the driver daemon is running, then reopen the session and retry
- Open a fresh session (device.open_session()) if the old handle went stale after device restart
- Inspect device logs / contact vendor if the code persists on a healthy-looking device
Example fix
// before
rnd = session.generate_random(64)
// after
try:
rnd = session.generate_random(64)
except GMDeviceError as e:
logger.error(f"HSM random failed: code={e.args[1:]}")
session = device.open_session() # reopen and retry once
rnd = session.generate_random(64) Defensive patterns
Strategy: retry
Validate before calling
# probe the device before relying on it ret = device.open_session() # raises early if device unhealthy session = ret
Try / catch
try:
rnd = session.generate_random(64)
except GMDeviceError as e:
logger.error(f"HSM random failed: {e}")
session = device.open_session()
rnd = session.generate_random(64) # one retry with fresh session Prevention
- Keep a health-check on the HSM session in long-running services
- Reopen sessions on a schedule or after any GMDeviceError
- Monitor the device daemon and alert on restarts
When it happens
Trigger: Calling session.generate_random(length) while the HSM device is malfunctioning, disconnected, out of entropy, or when the session handle is stale/invalid after a device restart. Also triggered if length is invalid for the device.
Common situations: HSM USB/PCIe link dropped, device driver crashed or was reloaded, session opened before device firmware finished initializing, entropy pool exhausted on virtual/emulated SDF devices, or a stale session handle after the daemon restarted.
Related errors
- encrypt failed
- decrypt failed
- close session failed
- generate random error
- data must be bytes or bytearray
AI-assisted analysis of jumpserver/jumpserver@6ec464fabd (2026-08-28).
Data as JSON: /api/errors/f9a9c0a0b82d94df.
Report an issue: GitHub.