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

  1. Check the numeric ret code against the SDF/GM error code table to identify the device reason
  2. Verify the device is present and the driver daemon is running, then reopen the session and retry
  3. Open a fresh session (device.open_session()) if the old handle went stale after device restart
  4. 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

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


AI-assisted analysis of jumpserver/jumpserver@6ec464fabd (2026-08-28). Data as JSON: /api/errors/f9a9c0a0b82d94df. Report an issue: GitHub.