/* logic/pin.h — APP 启动 PIN(纯 C;宿主可裸测)。 * * 定位(诚实标注):PIN 只挡「随手翻看」——TF 卡可拔出直读,数据目录明文可改, * 故不引入加密库、不宣称安全边界。存储口径:加盐迭代哈希(FNV-1a ×1000 轮, * 每次设置新随机盐,hex 输出),落在 meow_config_*(App 自有 KV → TF MeowData)。 * 盐/哈希只做「不知道 PIN 无法直接重算」的轻量门槛,防不了离线暴力或改配置。 * * 配置键(meow_config_*,值均为字符串): * pin.enabled = "1"/"0" * pin.hash = 16 位 hex(64-bit 摘要) * pin.salt = 16 位 hex(每次设置重新生成) * enabled=1 但 hash/salt 缺失或格式不合法时一律按「未启用」处理(fail-closed)。 * * 本模块只依赖 include/meow_ui_config.h 的三个声明(get/set/remove/int),不碰 UI; * 宿主测试链 test_pin.c 内的 meow_config_* 存根即可,无需 SDK/设备。 */ #ifndef MR_PIN_H #define MR_PIN_H #ifdef __cplusplus extern "C" { #endif #define MR_PIN_MIN_LEN 4 /* 允许的最短位数 */ #define MR_PIN_MAX_LEN 8 /* 允许的最长位数 */ /* 返回码(set/change/disable)。verify 用 1/0 表示对/错,不返回错误码。 */ #define MR_PIN_OK 0 /* 成功 */ #define MR_PIN_ERR_FORMAT (-1) /* PIN 非法:非 4-8 位纯数字(NULL/空/符号/超长) */ #define MR_PIN_ERR_STATE (-2) /* 状态不满足:change 时尚未启用 */ #define MR_PIN_ERR_WRONG (-3) /* change 时原 PIN 校验失败 */ #define MR_PIN_ERR_STORE (-4) /* meow_config_* 落盘失败(无数据目录/只读/IO) */ /* 4-8 位纯 ASCII 数字('0'-'9')→ 1;其余(含 NULL、空串、符号、全角数字)→ 0。 */ int mr_pin_valid(const char *pin); /* 当前是否启用:1=已启用且 hash/salt 完整合法;0=未启用或配置损坏(fail-closed)。 */ int mr_pin_enabled(void); /* 设置/重设 PIN(生成新盐 + 迭代哈希并立即落盘)。成功即生效(下次启动进锁屏)。 * 返回 MR_PIN_OK / MR_PIN_ERR_FORMAT / MR_PIN_ERR_STORE。 */ int mr_pin_set(const char *pin); /* 校验:1=匹配;0=不匹配/未启用/输入非法(不区分,避免侧信道式提示)。 */ int mr_pin_verify(const char *pin); /* 修改:先校验 old,再以新盐重设 new。失败时旧 PIN 保持有效(先校验后写盘)。 * 返回 MR_PIN_OK / MR_PIN_ERR_STATE / MR_PIN_ERR_FORMAT / MR_PIN_ERR_WRONG / MR_PIN_ERR_STORE。 */ int mr_pin_change(const char *old_pin, const char *new_pin); /* 关闭 PIN:删 hash/salt 并把 enabled 置 0(幂等;调用方已通过锁屏验证时无需再输 PIN)。 * 返回 MR_PIN_OK / MR_PIN_ERR_STORE。 */ int mr_pin_disable(void); /* 诊断/测试用:读回当前 hex 盐/哈希。返回 1=读成功,0=未设。 */ int mr_pin_get_salt(char *out, int outsz); int mr_pin_get_hash(char *out, int outsz); #ifdef __cplusplus } #endif #endif /* MR_PIN_H */