feat(sec): 签名鉴权 2B (agent-221) — meow_verify 多公钥数组+v2签名块(含ts,未来宽限,兼容v1)+meow_sign verify子命令+产签README; svc_power 面板身份精确路径绑定(删启发式,3反例验证)
meow_verify→6c2e8ed2; svc_power→306df962; qemu+宿主全过
This commit is contained in:
1 parent
249b6224ab
commit
05a19a9ea3
13 files changed
+497
-78
No files matched your search
@@ -1,8 +1,8 @@
|
||||
/* meow_sig.h — .mpk 签名块格式(MPK_SIGNATURE_DESIGN §3.1)+ 被签消息构造(§3.1)。
|
||||
/* meow_sig.h — .mpk 签名块格式(MPK_SIGNATURE_DESIGN §3.1,2B 扩展 §7)+ 被签消息构造。
|
||||
*
|
||||
* .mpk = [ tar.gz bytes ......................... ] [ meow_sig_block(定长 LE)]
|
||||
* .mpk = [ tar.gz bytes ......................... ] [ meow_sig_block(变长 LE,v1/v2)]
|
||||
*
|
||||
* meow_sig_block(packed,总长 MEOW_SIG_BLOCK_LEN):
|
||||
* meow_sig_block v1(packed,总长 MEOW_SIG_BLOCK_LEN_V1=180):
|
||||
* char magic[8]; "MEOWSIG1"
|
||||
* uint8_t alg; 1 = ed25519
|
||||
* uint8_t flags; 0
|
||||
@@ -11,10 +11,21 @@
|
||||
* uint8_t payload_sha256[32];sha256(整个 .mpk 去掉尾部 footer 的其余字节)
|
||||
* uint8_t sig[64]; Ed25519(pk, msg)
|
||||
* uint32_t msg_len; 实际签名的 msg 字节数(LE)
|
||||
* uint32_t block_len; 本块总长(LE;= MEOW_SIG_BLOCK_LEN)
|
||||
* uint32_t block_len; 本块总长(LE;= MEOW_SIG_BLOCK_LEN_V1)
|
||||
*
|
||||
* 被签消息 msg = "MEOWSIG1" || alg(1B) || package_len(4B,LE) || package || payload_sha256(32B)。
|
||||
* 本文件由 meow_verify 与 meow_sign 共用(meow_sign 用相对路径 include)。 */
|
||||
* meow_sig_block v2(packed,总长 MEOW_SIG_BLOCK_LEN_V2=184;2B 加固):
|
||||
* 在 v1 的 sig 后、msg_len 前插入 uint32_t ts(unix 秒,LE,**纳入被签消息**)。
|
||||
* 前 172 字节(magic/alg/flags/pad/package/payload_sha256/sig)与 v1 完全同偏移,
|
||||
* 故验签端可据尾部 block_len(v1=180 / v2=184)判别版本后按偏移取字段。
|
||||
* flags bit0 (MEOW_SIG_FLAG_TS)=1 标记含时间戳。
|
||||
*
|
||||
* 被签消息:
|
||||
* v1 msg = "MEOWSIG1" || alg(1B) || package_len(4B,LE) || package || payload_sha256(32B)。
|
||||
* v2 msg = v1 msg || ts(4B,LE)。 — 时间戳被签名绑定,防改时间戳。
|
||||
*
|
||||
* 本文件由 meow_verify 与 meow_sign 共用(meow_sign 用相对路径 include)。
|
||||
* v1/v2 兼容:验签端读 v1(旧 2A 包)不检时间戳(无该字段),读 v2(2B 包)检 ts 未来宽限。
|
||||
* (明确不做:防重放/过期——ts 只做「未来异常」宽限拒绝,见 MPK_SIGNATURE_DESIGN §8 诚实标注。) */
|
||||
#ifndef MEOW_SIG_H
|
||||
#define MEOW_SIG_H
|
||||
|
||||
@@ -28,6 +39,9 @@
|
||||
#define MEOW_SIG_SHA256_LEN 32
|
||||
#define MEOW_SIG_SIG_LEN 64
|
||||
|
||||
/* flags 位(v2) */
|
||||
#define MEOW_SIG_FLAG_TS 0x01u /* 含签名时间戳(v2) */
|
||||
|
||||
typedef struct __attribute__((packed)) {
|
||||
uint8_t magic[MEOW_SIG_MAGIC_LEN];
|
||||
uint8_t alg;
|
||||
@@ -40,7 +54,34 @@ typedef struct __attribute__((packed)) {
|
||||
uint32_t block_len;
|
||||
} meow_sig_block_t;
|
||||
|
||||
#define MEOW_SIG_BLOCK_LEN (sizeof(meow_sig_block_t)) /* 定长 180 */
|
||||
typedef struct __attribute__((packed)) {
|
||||
uint8_t magic[MEOW_SIG_MAGIC_LEN];
|
||||
uint8_t alg;
|
||||
uint8_t flags;
|
||||
uint16_t pad;
|
||||
char package[MEOW_SIG_PKG_MAX];
|
||||
uint8_t payload_sha256[MEOW_SIG_SHA256_LEN];
|
||||
uint8_t sig[MEOW_SIG_SIG_LEN];
|
||||
uint32_t ts; /* v2: unix 时间戳(LE,被签名) */
|
||||
uint32_t msg_len;
|
||||
uint32_t block_len;
|
||||
} meow_sig_block_v2_t;
|
||||
|
||||
/* 块版本:由尾部 block_len 判别(v1=180 无 ts;v2=184 含 ts) */
|
||||
#define MEOW_SIG_BLOCK_LEN_V1 (sizeof(meow_sig_block_t)) /* 180 */
|
||||
#define MEOW_SIG_BLOCK_LEN_V2 (sizeof(meow_sig_block_v2_t)) /* 184 = 180 + ts(4) */
|
||||
#define MEOW_SIG_BLOCK_MAX MEOW_SIG_BLOCK_LEN_V2
|
||||
|
||||
/* 签名时间戳未来宽限(秒):ts 在 now+宽限内视为合法时钟误差,超出即拒。 */
|
||||
#define MEOW_SIG_TS_GRACE 86400u /* 24h */
|
||||
|
||||
/* 字段偏移(前 172B 两版同偏移;ts/msg_len 因版本异,见下)。 */
|
||||
#define MEOW_SIG_OFF_PKG 12
|
||||
#define MEOW_SIG_OFF_SHA 76
|
||||
#define MEOW_SIG_OFF_SIG 108
|
||||
#define MEOW_SIG_OFF_TS 172 /* v2 only */
|
||||
#define MEOW_SIG_OFF_MSGLEN_V1 (MEOW_SIG_BLOCK_LEN_V1 - 8) /* 172 */
|
||||
#define MEOW_SIG_OFF_MSGLEN_V2 (MEOW_SIG_BLOCK_LEN_V2 - 8) /* 176 */
|
||||
|
||||
/* 按字节读取 LE 的 uint32(避免 packed 解引用对齐告警) */
|
||||
static inline uint32_t meow_le32(const uint8_t *p)
|
||||
@@ -56,9 +97,10 @@ static inline void meow_le32_put(uint8_t *p, uint32_t v)
|
||||
p[3] = (uint8_t)((v >> 24) & 0xff);
|
||||
}
|
||||
|
||||
#define MEOW_SIG_MSG_MAX (MEOW_SIG_MAGIC_LEN + 1 + 4 + MEOW_SIG_PKG_MAX + MEOW_SIG_SHA256_LEN)
|
||||
/* v1 或 v2 的 msg 均不超过此上限(v1 109 / v2 113)。 */
|
||||
#define MEOW_SIG_MSG_MAX (MEOW_SIG_MAGIC_LEN + 1 + 4 + MEOW_SIG_PKG_MAX + MEOW_SIG_SHA256_LEN + 4)
|
||||
|
||||
/* 按设计构造被签消息 msg = "MEOWSIG1" || alg(1B) || package_len(4B,LE) || package || payload_sha256(32B)。
|
||||
/* 按设计构造 v1 被签消息 msg = "MEOWSIG1" || alg(1B) || package_len(4B,LE) || package || payload_sha256(32B)。
|
||||
* 返回 msg 字节数。签名端与验签端必须用同一构造(meow_sign / meow_verify 共用)。 */
|
||||
static inline unsigned meow_sig_msg_build(char *out, const char *package,
|
||||
const uint8_t payload_sha256[MEOW_SIG_SHA256_LEN])
|
||||
@@ -74,4 +116,14 @@ static inline unsigned meow_sig_msg_build(char *out, const char *package,
|
||||
return o;
|
||||
}
|
||||
|
||||
/* 构造 v2 被签消息 = v1 msg || ts(4B,LE)。返回 msg 字节数(= v1 msg + 4)。 */
|
||||
static inline unsigned meow_sig_msg_build_v2(char *out, const char *package,
|
||||
const uint8_t payload_sha256[MEOW_SIG_SHA256_LEN],
|
||||
uint32_t ts)
|
||||
{
|
||||
unsigned o = meow_sig_msg_build(out, package, payload_sha256);
|
||||
meow_le32_put((uint8_t *)out + o, ts); o += 4;
|
||||
return o;
|
||||
}
|
||||
|
||||
#endif /* MEOW_SIG_H */
|
||||
Reference in new issue
Block a user