A500/A100など(Tegra2世代tablet)のSBKをcpu_idから計算

Acer A500やA100など(NVIDIA Tegra2採用タブレット)のSBK (Secure Boot Key: 32桁のHexコード)を機器固有のcpu_id (先頭の0を除くと15桁のHexコード)から計算する。


やること

できること

起動できない状態(いわゆる文鎮, brick)から回復させることができる。partitionがおかしい場合も正しく再生成できる。
また、自前でICS(Android 4.0以降)にupgradeする工程で、bootloaderを書き換える作業を行える。

cpu_idを取得

adb shellで操作し、/sys/firmware/fuse/acer_cpu_idを開く。

cat /sys/firmware/fuse/acer_cpu_id

15桁(先頭の0を除く)の16進数表記のcpu_idが得られる。

SBKを計算

SBK Calculator など、SBKを計算するWebページがある。
ここでは計算をするpythonスクリプトを公開する。 (License: Public Domain)


#!/usr/bin/python
# -*- coding: utf-8 -*-
import array

# main
import sys
if len(sys.argv) <= 1 :
	print "SBK (Secure Boot Key) Calculator for Acer A500/A501/A100...(Tegra2)\n * APX mode\n * nvflash\n * CPUID (cat /sys/firmware/fuse/acer_cpu_id  in adb shell)"
	print "Usage: # python %s CPUID(hex) ..." % sys.argv[0]
	quit()

input_data = sys.argv[1:]

for cpuid in input_data :
	if "0x" == cpuid[0:2] :	# remove "0x"
		cpuid = cpuid[2:]

	if len(cpuid) == 16 :
		pass
	elif len(cpuid) == 15 :
		cpuid = "0" + cpuid
	else:
		print "%s : too long or short" % cpuid
		continue

	if not set(cpuid) <= set('0123456789abcdefABCDEF') :
		print "%s : invalid ID" % cpuid
		continue

	uid = tuple(bytearray( (cpuid[8:] + cpuid[:8]).upper() ))
	sbk = [0,] * 4
	for i in range(0,4) :
		sbk[i] = uid[i*4] *1000000 + uid[i*4 +1] *10000 + uid[i*4 +2] *100 + uid[i*4 +3]
	sbk_a = array.array('L', ( sbk[0] ^ sbk[3] , sbk[1] ^ sbk[2] , sbk[1] , sbk[0] ) )
	sbk_a.byteswap()

	print "%s : %s" % ( cpuid , "0x%08X 0x%08X 0x%08X 0x%08X" % tuple(sbk_a) )
# end

APXモードで、nvflashを用いて書き込み

ここで計算したSBKを使う。この文書ではSBKの計算までを扱う。


http://tri.dw.land.to/doc/1209150A500_SBK.html

Last-Modified: