linux/tools/crypto/ccp/dbc.py
Mario Limonciello 2ad01eb5fa crypto: ccp - Fix sample application signature passing
When parameters are sent the PSP returns back it's own signature
for the application to verify the authenticity of the result.

Display this signature to the caller instead of the one the caller
sent.

Fixes: f40d42f116 ("crypto: ccp - Add a sample python script for Dynamic Boost Control")
Fixes: febe3ed322 ("crypto: ccp - Add a sample library for ioctl use")
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2023-09-15 18:29:45 +08:00

65 lines
1.7 KiB
Python

#!/usr/bin/python3
# SPDX-License-Identifier: GPL-2.0
import ctypes
import os
DBC_UID_SIZE = 16
DBC_NONCE_SIZE = 16
DBC_SIG_SIZE = 32
PARAM_GET_FMAX_CAP = (0x3,)
PARAM_SET_FMAX_CAP = (0x4,)
PARAM_GET_PWR_CAP = (0x5,)
PARAM_SET_PWR_CAP = (0x6,)
PARAM_GET_GFX_MODE = (0x7,)
PARAM_SET_GFX_MODE = (0x8,)
PARAM_GET_CURR_TEMP = (0x9,)
PARAM_GET_FMAX_MAX = (0xA,)
PARAM_GET_FMAX_MIN = (0xB,)
PARAM_GET_SOC_PWR_MAX = (0xC,)
PARAM_GET_SOC_PWR_MIN = (0xD,)
PARAM_GET_SOC_PWR_CUR = (0xE,)
DEVICE_NODE = "/dev/dbc"
lib = ctypes.CDLL("./dbc_library.so", mode=ctypes.RTLD_GLOBAL)
def handle_error(code):
raise OSError(code, os.strerror(code))
def get_nonce(device, signature):
if not device:
raise ValueError("Device required")
buf = ctypes.create_string_buffer(DBC_NONCE_SIZE)
ret = lib.get_nonce(device.fileno(), ctypes.byref(buf), signature)
if ret:
handle_error(ret)
return buf.value
def set_uid(device, new_uid, signature):
if not signature:
raise ValueError("Signature required")
if not new_uid:
raise ValueError("UID required")
ret = lib.set_uid(device.fileno(), new_uid, signature)
if ret:
handle_error(ret)
return True
def process_param(device, message, signature, data=None):
if not signature:
raise ValueError("Signature required")
if type(message) != tuple:
raise ValueError("Expected message tuple")
arg = ctypes.c_int(data if data else 0)
sig = ctypes.create_string_buffer(signature, len(signature))
ret = lib.process_param(device.fileno(), message[0], ctypes.pointer(sig), ctypes.pointer(arg))
if ret:
handle_error(ret)
return arg.value, sig.value