Coverage for tropicsquare / config / sensors.py: 89%

124 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-27 21:24 +0000

1"""Sensors configuration (CFG_SENSORS @ 0x08)""" 

2 

3from tropicsquare.config.base import BaseConfig 

4from tropicsquare.config.constants import ( 

5 SENSORS_PTRNG0_TEST_DIS_BIT, 

6 SENSORS_PTRNG1_TEST_DIS_BIT, 

7 SENSORS_OSCMON_DIS_BIT, 

8 SENSORS_SHIELD_DIS_BIT, 

9 SENSORS_VMON_DIS_BIT, 

10 SENSORS_GLITCH_DIS_BIT, 

11 SENSORS_TEMP_DIS_BIT, 

12 SENSORS_LASER_DIS_BIT, 

13 SENSORS_EMP_DIS_BIT, 

14 SENSORS_CPU_ALERT_DIS_BIT, 

15 SENSORS_BF_PIN_VER_DIS_BIT, 

16 SENSORS_BF_SCB_DIS_BIT, 

17 SENSORS_BF_CPB_DIS_BIT, 

18 SENSORS_BF_ECC_DIS_BIT, 

19 SENSORS_BF_RAM_DIS_BIT, 

20 SENSORS_BF_EKDB_DIS_BIT, 

21 SENSORS_BF_IMEM_DIS_BIT, 

22 SENSORS_BF_PLATFORM_DIS_BIT 

23) 

24 

25 

26class SensorsConfig(BaseConfig): 

27 """Sensors and fault detection configuration register. 

28 

29 Controls security sensors and bit-flip detection mechanisms. 

30 Each field disables a specific security feature when set to True. 

31 

32 Fields: 

33 

34 - ptrng0_test_dis: PTRNG0 test disable (bit 0) 

35 - ptrng1_test_dis: PTRNG1 test disable (bit 1) 

36 - oscmon_dis: Oscillator monitoring disable (bit 2) 

37 - shield_dis: Shield monitoring disable (bit 3) 

38 - vmon_dis: Voltage monitoring disable (bit 4) 

39 - glitch_dis: Glitch detection disable (bit 5) 

40 - temp_dis: Temperature sensor disable (bit 6) 

41 - laser_dis: Laser detection disable (bit 7) 

42 - emp_dis: EMP detection disable (bit 8) 

43 - cpu_alert_dis: CPU alert disable (bit 9) 

44 - bf_pin_ver_dis: Bit-flip PIN verification disable (bit 10) 

45 - bf_scb_dis: Bit-flip SCB disable (bit 11) 

46 - bf_cpb_dis: Bit-flip CPB disable (bit 12) 

47 - bf_ecc_dis: Bit-flip ECC disable (bit 13) 

48 - bf_ram_dis: Bit-flip RAM disable (bit 14) 

49 - bf_ekdb_dis: Bit-flip EKDB disable (bit 15) 

50 - bf_imem_dis: Bit-flip instruction memory disable (bit 16) 

51 - bf_platform_dis: Bit-flip platform disable (bit 17) 

52 """ 

53 

54 def _get_bit(self, bit_pos): 

55 """Helper to get bit value.""" 

56 return bool((self._value >> bit_pos) & 1) 

57 

58 def _set_bit(self, bit_pos, value): 

59 """Helper to set bit value.""" 

60 if value: 

61 self._value |= (1 << bit_pos) 

62 else: 

63 self._value &= ~(1 << bit_pos) 

64 

65 @property 

66 def ptrng0_test_dis(self) -> bool: 

67 """PTRNG0 test disable (bit 0).""" 

68 return self._get_bit(SENSORS_PTRNG0_TEST_DIS_BIT) 

69 

70 @ptrng0_test_dis.setter 

71 def ptrng0_test_dis(self, value: bool) -> None: 

72 self._set_bit(SENSORS_PTRNG0_TEST_DIS_BIT, value) 

73 

74 @property 

75 def ptrng1_test_dis(self) -> bool: 

76 """PTRNG1 test disable (bit 1).""" 

77 return self._get_bit(SENSORS_PTRNG1_TEST_DIS_BIT) 

78 

79 @ptrng1_test_dis.setter 

80 def ptrng1_test_dis(self, value: bool) -> None: 

81 self._set_bit(SENSORS_PTRNG1_TEST_DIS_BIT, value) 

82 

83 @property 

84 def oscmon_dis(self) -> bool: 

85 """Oscillator monitoring disable (bit 2).""" 

86 return self._get_bit(SENSORS_OSCMON_DIS_BIT) 

87 

88 @oscmon_dis.setter 

89 def oscmon_dis(self, value: bool) -> None: 

90 self._set_bit(SENSORS_OSCMON_DIS_BIT, value) 

91 

92 @property 

93 def shield_dis(self) -> bool: 

94 """Shield monitoring disable (bit 3).""" 

95 return self._get_bit(SENSORS_SHIELD_DIS_BIT) 

96 

97 @shield_dis.setter 

98 def shield_dis(self, value: bool) -> None: 

99 self._set_bit(SENSORS_SHIELD_DIS_BIT, value) 

100 

101 @property 

102 def vmon_dis(self) -> bool: 

103 """Voltage monitoring disable (bit 4).""" 

104 return self._get_bit(SENSORS_VMON_DIS_BIT) 

105 

106 @vmon_dis.setter 

107 def vmon_dis(self, value: bool) -> None: 

108 self._set_bit(SENSORS_VMON_DIS_BIT, value) 

109 

110 @property 

111 def glitch_dis(self) -> bool: 

112 """Glitch detection disable (bit 5).""" 

113 return self._get_bit(SENSORS_GLITCH_DIS_BIT) 

114 

115 @glitch_dis.setter 

116 def glitch_dis(self, value: bool) -> None: 

117 self._set_bit(SENSORS_GLITCH_DIS_BIT, value) 

118 

119 @property 

120 def temp_dis(self) -> bool: 

121 """Temperature sensor disable (bit 6).""" 

122 return self._get_bit(SENSORS_TEMP_DIS_BIT) 

123 

124 @temp_dis.setter 

125 def temp_dis(self, value: bool) -> None: 

126 self._set_bit(SENSORS_TEMP_DIS_BIT, value) 

127 

128 @property 

129 def laser_dis(self) -> bool: 

130 """Laser detection disable (bit 7).""" 

131 return self._get_bit(SENSORS_LASER_DIS_BIT) 

132 

133 @laser_dis.setter 

134 def laser_dis(self, value: bool) -> None: 

135 self._set_bit(SENSORS_LASER_DIS_BIT, value) 

136 

137 @property 

138 def emp_dis(self) -> bool: 

139 """EMP detection disable (bit 8).""" 

140 return self._get_bit(SENSORS_EMP_DIS_BIT) 

141 

142 @emp_dis.setter 

143 def emp_dis(self, value: bool) -> None: 

144 self._set_bit(SENSORS_EMP_DIS_BIT, value) 

145 

146 @property 

147 def cpu_alert_dis(self) -> bool: 

148 """CPU alert disable (bit 9).""" 

149 return self._get_bit(SENSORS_CPU_ALERT_DIS_BIT) 

150 

151 @cpu_alert_dis.setter 

152 def cpu_alert_dis(self, value: bool) -> None: 

153 self._set_bit(SENSORS_CPU_ALERT_DIS_BIT, value) 

154 

155 @property 

156 def bf_pin_ver_dis(self) -> bool: 

157 """Bit-flip PIN verification disable (bit 10).""" 

158 return self._get_bit(SENSORS_BF_PIN_VER_DIS_BIT) 

159 

160 @bf_pin_ver_dis.setter 

161 def bf_pin_ver_dis(self, value: bool) -> None: 

162 self._set_bit(SENSORS_BF_PIN_VER_DIS_BIT, value) 

163 

164 @property 

165 def bf_scb_dis(self) -> bool: 

166 """Bit-flip SCB disable (bit 11).""" 

167 return self._get_bit(SENSORS_BF_SCB_DIS_BIT) 

168 

169 @bf_scb_dis.setter 

170 def bf_scb_dis(self, value: bool) -> None: 

171 self._set_bit(SENSORS_BF_SCB_DIS_BIT, value) 

172 

173 @property 

174 def bf_cpb_dis(self) -> bool: 

175 """Bit-flip CPB disable (bit 12).""" 

176 return self._get_bit(SENSORS_BF_CPB_DIS_BIT) 

177 

178 @bf_cpb_dis.setter 

179 def bf_cpb_dis(self, value: bool) -> None: 

180 self._set_bit(SENSORS_BF_CPB_DIS_BIT, value) 

181 

182 @property 

183 def bf_ecc_dis(self) -> bool: 

184 """Bit-flip ECC disable (bit 13).""" 

185 return self._get_bit(SENSORS_BF_ECC_DIS_BIT) 

186 

187 @bf_ecc_dis.setter 

188 def bf_ecc_dis(self, value: bool) -> None: 

189 self._set_bit(SENSORS_BF_ECC_DIS_BIT, value) 

190 

191 @property 

192 def bf_ram_dis(self) -> bool: 

193 """Bit-flip RAM disable (bit 14).""" 

194 return self._get_bit(SENSORS_BF_RAM_DIS_BIT) 

195 

196 @bf_ram_dis.setter 

197 def bf_ram_dis(self, value: bool) -> None: 

198 self._set_bit(SENSORS_BF_RAM_DIS_BIT, value) 

199 

200 @property 

201 def bf_ekdb_dis(self) -> bool: 

202 """Bit-flip EKDB disable (bit 15).""" 

203 return self._get_bit(SENSORS_BF_EKDB_DIS_BIT) 

204 

205 @bf_ekdb_dis.setter 

206 def bf_ekdb_dis(self, value: bool) -> None: 

207 self._set_bit(SENSORS_BF_EKDB_DIS_BIT, value) 

208 

209 @property 

210 def bf_imem_dis(self) -> bool: 

211 """Bit-flip instruction memory disable (bit 16).""" 

212 return self._get_bit(SENSORS_BF_IMEM_DIS_BIT) 

213 

214 @bf_imem_dis.setter 

215 def bf_imem_dis(self, value: bool) -> None: 

216 self._set_bit(SENSORS_BF_IMEM_DIS_BIT, value) 

217 

218 @property 

219 def bf_platform_dis(self) -> bool: 

220 """Bit-flip platform disable (bit 17).""" 

221 return self._get_bit(SENSORS_BF_PLATFORM_DIS_BIT) 

222 

223 @bf_platform_dis.setter 

224 def bf_platform_dis(self, value: bool) -> None: 

225 self._set_bit(SENSORS_BF_PLATFORM_DIS_BIT, value) 

226 

227 def to_dict(self) -> dict: 

228 """Export fields as dictionary. 

229 

230 :returns: Configuration fields and their values 

231 :rtype: dict 

232 """ 

233 return { 

234 'ptrng0_test_dis': self.ptrng0_test_dis, 

235 'ptrng1_test_dis': self.ptrng1_test_dis, 

236 'oscmon_dis': self.oscmon_dis, 

237 'shield_dis': self.shield_dis, 

238 'vmon_dis': self.vmon_dis, 

239 'glitch_dis': self.glitch_dis, 

240 'temp_dis': self.temp_dis, 

241 'laser_dis': self.laser_dis, 

242 'emp_dis': self.emp_dis, 

243 'cpu_alert_dis': self.cpu_alert_dis, 

244 'bf_pin_ver_dis': self.bf_pin_ver_dis, 

245 'bf_scb_dis': self.bf_scb_dis, 

246 'bf_cpb_dis': self.bf_cpb_dis, 

247 'bf_ecc_dis': self.bf_ecc_dis, 

248 'bf_ram_dis': self.bf_ram_dis, 

249 'bf_ekdb_dis': self.bf_ekdb_dis, 

250 'bf_imem_dis': self.bf_imem_dis, 

251 'bf_platform_dis': self.bf_platform_dis 

252 } 

253 

254 def __str__(self) -> str: 

255 """Human-readable representation.""" 

256 fields = self.to_dict() 

257 enabled_sensors = [k for k, v in fields.items() if not v] 

258 disabled_sensors = [k for k, v in fields.items() if v] 

259 return "SensorsConfig({} enabled, {} disabled)".format( 

260 len(enabled_sensors), len(disabled_sensors))