Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/crypto/ccp/dbc.py
26285 views
1
#!/usr/bin/python3
2
# SPDX-License-Identifier: GPL-2.0
3
4
import ctypes
5
import os
6
7
DBC_UID_SIZE = 16
8
DBC_NONCE_SIZE = 16
9
DBC_SIG_SIZE = 32
10
11
PARAM_GET_FMAX_CAP = (0x3,)
12
PARAM_SET_FMAX_CAP = (0x4,)
13
PARAM_GET_PWR_CAP = (0x5,)
14
PARAM_SET_PWR_CAP = (0x6,)
15
PARAM_GET_GFX_MODE = (0x7,)
16
PARAM_SET_GFX_MODE = (0x8,)
17
PARAM_GET_CURR_TEMP = (0x9,)
18
PARAM_GET_FMAX_MAX = (0xA,)
19
PARAM_GET_FMAX_MIN = (0xB,)
20
PARAM_GET_SOC_PWR_MAX = (0xC,)
21
PARAM_GET_SOC_PWR_MIN = (0xD,)
22
PARAM_GET_SOC_PWR_CUR = (0xE,)
23
24
DEVICE_NODE = "/dev/dbc"
25
26
lib = ctypes.CDLL("./dbc_library.so", mode=ctypes.RTLD_GLOBAL)
27
28
29
def handle_error(code):
30
raise OSError(code, os.strerror(code))
31
32
33
def get_nonce(device, signature):
34
if not device:
35
raise ValueError("Device required")
36
buf = ctypes.create_string_buffer(DBC_NONCE_SIZE)
37
ret = lib.get_nonce(device.fileno(), ctypes.byref(buf), signature)
38
if ret:
39
handle_error(ret)
40
return buf.value
41
42
43
def set_uid(device, new_uid, signature):
44
if not signature:
45
raise ValueError("Signature required")
46
if not new_uid:
47
raise ValueError("UID required")
48
ret = lib.set_uid(device.fileno(), new_uid, signature)
49
if ret:
50
handle_error(ret)
51
return True
52
53
54
def process_param(device, message, signature, data=None):
55
if not signature:
56
raise ValueError("Signature required")
57
if type(message) != tuple:
58
raise ValueError("Expected message tuple")
59
arg = ctypes.c_int(data if data else 0)
60
sig = ctypes.create_string_buffer(signature, len(signature))
61
ret = lib.process_param(device.fileno(), message[0], ctypes.pointer(sig), ctypes.pointer(arg))
62
if ret:
63
handle_error(ret)
64
return arg.value, sig.value
65
66