From 94eeabd78957116538db31b6e4c3c2e2822dc829 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Thu, 5 Nov 2026 17:37:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E5=BA=93:=20=E6=89=93=E5=8C=85?= =?UTF-8?q?=E6=94=B9=E6=A0=B9=E5=B8=83=E5=B1=80=E5=B9=B6=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=20meow=5Fsign=20=E4=B8=80=E9=94=AE=E7=AD=BE=E5=90=8D=EF=BC=88M?= =?UTF-8?q?16=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tuku/README.md | 41 ++++++++++++++++++++ tuku/pack_tuku.sh | 96 ++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 128 insertions(+), 9 deletions(-) create mode 100644 tuku/README.md diff --git a/tuku/README.md b/tuku/README.md new file mode 100644 index 0000000..5361e54 --- /dev/null +++ b/tuku/README.md @@ -0,0 +1,41 @@ +# tuku(os.meow.picbrowser)打包与签名 + +图库 App(系统包名 `os.meow.picbrowser`)。构建与打包: + +```sh +./build_tuku.sh # 交叉编译 picbrowser(MIPS32r2 静态) +./pack_tuku.sh # 打包 → os.meow.picbrowser.mpk(根布局;未签名) +``` + +## 一键签名出包 + +```sh +MEOW_SIGN_KEY=/path/to/signing.key ./pack_tuku.sh +``` + +- 工具查找顺序:`$MEOW_SIGN` → `PATH` 里的 `meow_sign` → `$HOME/Proj/MeowOS-For-R3P2/patch_v2/meow_sign/meow_sign`。 +- 私钥:`$MEOW_SIGN_KEY`。未设置时脚本**警告并仍产出未签名包**(退出码 0);但 `os.meow.*` 系统包无签名会被设备拒装。 +- 有工具 + 密钥时执行 `meow_sign sign `;若存在 `.pub` 再执行 `meow_sign verify .pub`。 +- 私钥**不入库、不随包分发**;本仓不包含任何密钥材料。 + +## mpk 布局 + +`.mpk` = tar.gz,条目直接在根层: + +``` +os.meow.picbrowser.mpk +├── app.json +├── picbrowser +└── # 仅签名包有(Ed25519,尾部追加) +``` + +即 `tar -C build/os.meow.picbrowser -czf os.meow.picbrowser.mpk app.json picbrowser`—— +不带 `os.meow.picbrowser/` 目录前缀,也不带 `./` 前缀。脚本在签名前用 `tar -tzf` 断言这一点。 + +签名是往 tar.gz 尾部**追加** footer,签名后的 mpk 不要再跑 `tar -t` / `gzip` 之类的命令: +gzip 会报 `trailing garbage ignored`,属预期现象,不是包损坏。要检查布局请在签名前做。 + +## 安装 + +把 `.mpk` 放到设备 TF 卡,执行 `nyai install os.meow.picbrowser.mpk`; +`os.meow.*` 包必须验签通过(footer.package == 文件名茎 == `app.json.package`)。 diff --git a/tuku/pack_tuku.sh b/tuku/pack_tuku.sh index 0df32ef..d7348c9 100755 --- a/tuku/pack_tuku.sh +++ b/tuku/pack_tuku.sh @@ -1,14 +1,92 @@ -#!/bin/bash -# pack_tuku.sh — 出包 os.meow.picbrowser.mpk(tar.gz,根目录 os.meow.picbrowser/,含 app.json + picbrowser)。 -# .mpk 文件名茎 = app.json.package = 安装目录名(os.meow.picbrowser)。 +#!/usr/bin/env bash +# pack_tuku.sh — 一键出包 os.meow.picbrowser.mpk(根布局 tar.gz,可选内联签名)。 +# +# 布局:mpk 内的条目直接是 app.json + picbrowser(无 / 前缀、无 ./ 前缀), +# 与安装端「.mpk 内容在 tar 根」的解包口径一致。 +# +# 一键签名(推荐;os.meow.* 无签名设备会拒装): +# MEOW_SIGN_KEY=/path/to/signing.key ./pack_tuku.sh +# +# 环境变量: +# MEOW_SIGN 指定 meow_sign 可执行文件;未设时依次找 PATH 里的 meow_sign、 +# 再回退 $HOME/Proj/MeowOS-For-R3P2/patch_v2/meow_sign/meow_sign。 +# MEOW_SIGN_KEY 私钥路径。未设 → 警告并产出未签名包(退出码 0); +# 设了但找不到工具/密钥或签名失败 → 报错退出(不静默交付未签名包)。 +# 若同目录存在 .pub,签名后自动 verify。 +# +# 注意:签名是往 tar.gz 尾部追加 footer。签名后的 mpk **不要**再跑 tar/gzip 类命令 +# (gzip 会报 "trailing garbage ignored",属预期,不是包损坏)。因此根布局断言 +# 必须在签名前用 tar -tzf 做。 set -e cd "$(dirname "$0")" + +PKG=os.meow.picbrowser +MPK="$PKG.mpk" +STAGE="build/$PKG" + [ -x picbrowser ] || ./build_tuku.sh -rm -rf build/os.meow.picbrowser -mkdir -p build/os.meow.picbrowser -cp app.json picbrowser build/os.meow.picbrowser/ +rm -rf "$STAGE" +mkdir -p "$STAGE" +cp app.json picbrowser "$STAGE/" -rm -f os.meow.picbrowser.mpk -( cd build && tar czf ../os.meow.picbrowser.mpk os.meow.picbrowser ) -ls -la os.meow.picbrowser.mpk +rm -f "$MPK" +tar -C "$STAGE" -czf "$MPK" app.json picbrowser + +# 根布局断言(签名前):第一层有 app.json,且不带 / 或 ./ 前缀。 +listing="$(tar -C "$STAGE" -tzf "$MPK")" +printf '%s\n' "$listing" +if ! printf '%s\n' "$listing" | grep -qx 'app.json'; then + echo "错误:$MPK 根层缺少 app.json(布局不是根布局)" >&2 + exit 1 +fi +if printf '%s\n' "$listing" | grep -q "^\(\./\)\?$PKG/"; then + echo "错误:$MPK 仍带 $PKG/ 前缀(嵌套布局)" >&2 + exit 1 +fi + +find_sign_tool() { + if [ -n "${MEOW_SIGN:-}" ]; then + printf '%s\n' "$MEOW_SIGN" + elif command -v meow_sign >/dev/null 2>&1; then + command -v meow_sign + elif [ -x "$HOME/Proj/MeowOS-For-R3P2/patch_v2/meow_sign/meow_sign" ]; then + printf '%s\n' "$HOME/Proj/MeowOS-For-R3P2/patch_v2/meow_sign/meow_sign" + else + return 1 + fi +} + +if [ -z "${MEOW_SIGN_KEY:-}" ]; then + echo "警告:未签名(未设置 MEOW_SIGN_KEY),已产出未签名包 $MPK" >&2 + echo " 设 MEOW_SIGN_KEY=<私钥> 后重跑,或手动 sign;os.meow.* 未签名设备拒装。" >&2 +else + if [ ! -f "$MEOW_SIGN_KEY" ]; then + echo "错误:MEOW_SIGN_KEY=$MEOW_SIGN_KEY 不存在" >&2 + exit 1 + fi + if ! SIGN_TOOL="$(find_sign_tool)"; then + echo "错误:找不到 meow_sign(可用 MEOW_SIGN=/path/to/meow_sign 指定);$MPK 未签名" >&2 + exit 1 + fi + if [ ! -x "$SIGN_TOOL" ]; then + echo "错误:$SIGN_TOOL 不可执行(可用 MEOW_SIGN 指定可执行的 meow_sign);$MPK 未签名" >&2 + exit 1 + fi + if ! "$SIGN_TOOL" sign "$MPK" "$MEOW_SIGN_KEY"; then + echo "错误:meow_sign sign 失败,$MPK 仍是未签名包" >&2 + echo " 若提示 cannot execute / required file not found,多半是该二进制与本机不兼容,用 MEOW_SIGN 指定可执行版本。" >&2 + exit 1 + fi + if [ -f "$MEOW_SIGN_KEY.pub" ]; then + if ! "$SIGN_TOOL" verify "$MPK" "$MEOW_SIGN_KEY.pub"; then + echo "错误:meow_sign verify 失败,$MPK 签名无效" >&2 + exit 1 + fi + else + echo "提示:未找到 $MEOW_SIGN_KEY.pub,跳过 verify" + fi + # 签名后不要再 tar -t/-z:footer 在 gzip 流外,gzip 会报 trailing garbage(预期)。 +fi + +ls -la "$MPK"