47 lines
1.6 KiB
TypeScript
47 lines
1.6 KiB
TypeScript
import { MAX_FIRMWARE_FILE_SIZE } from '@/lib/firmware'
|
|
import {
|
|
buildFirmwareHashInput,
|
|
type FirmwareHashByteOrder,
|
|
} from '@/lib/firmwareHash'
|
|
import { concatenateBlocks, parseIntelHex } from '@/lib/intelHex'
|
|
|
|
export type SignatureFileMode = 'raw-file' | 'intel-hex' | 'intel-hex-block-header'
|
|
|
|
export interface ParsedSignatureFile {
|
|
data: Uint8Array
|
|
dataBytes: number
|
|
effectiveDataBytes: number
|
|
headerBytes: number
|
|
blockCount?: number
|
|
warnings: string[]
|
|
}
|
|
|
|
export async function parseSignatureFile(
|
|
file: File,
|
|
mode: SignatureFileMode,
|
|
byteOrder: FirmwareHashByteOrder = 'big-endian',
|
|
): Promise<ParsedSignatureFile> {
|
|
if (file.size > MAX_FIRMWARE_FILE_SIZE) throw new Error('文件不能超过 64 MiB')
|
|
if (mode === 'raw-file') {
|
|
const data = new Uint8Array(await file.arrayBuffer())
|
|
return { data, dataBytes: data.length, effectiveDataBytes: data.length, headerBytes: 0, warnings: [] }
|
|
}
|
|
if (mode !== 'intel-hex' && mode !== 'intel-hex-block-header') throw new Error('文件数据模式无效')
|
|
const parsed = parseIntelHex(await file.text())
|
|
const headerBytes = mode === 'intel-hex-block-header' ? parsed.blocks.length * 8 : 0
|
|
if (parsed.totalBytes + headerBytes > MAX_FIRMWARE_FILE_SIZE) {
|
|
throw new Error('加入 Block 校验头后的待验签数据不能超过 64 MiB')
|
|
}
|
|
const data = mode === 'intel-hex-block-header'
|
|
? buildFirmwareHashInput(parsed.blocks, 'block-header', byteOrder)
|
|
: concatenateBlocks(parsed.blocks)
|
|
return {
|
|
data,
|
|
dataBytes: data.length,
|
|
effectiveDataBytes: parsed.totalBytes,
|
|
headerBytes,
|
|
blockCount: parsed.blocks.length,
|
|
warnings: parsed.warnings,
|
|
}
|
|
}
|