tool/gnuk_upgrade.py: Support non-smartcard auth
This commit is contained in:
@@ -1,3 +1,9 @@
|
|||||||
|
2012-11-01 Niibe Yutaka <gniibe@fsij.org>
|
||||||
|
|
||||||
|
* tool/gnuk_upgrade.py (main): New option '-k' to specify keygrip
|
||||||
|
for non-smartcard key.
|
||||||
|
(gpg_sign): Support non-smartcard key.
|
||||||
|
|
||||||
2012-10-31 Niibe Yutaka <gniibe@fsij.org>
|
2012-10-31 Niibe Yutaka <gniibe@fsij.org>
|
||||||
|
|
||||||
* tool/get_raw_public_key.py: New.
|
* tool/get_raw_public_key.py: New.
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
from struct import *
|
from struct import *
|
||||||
import sys, time, os, binascii, string
|
import sys, time, os, binascii, string
|
||||||
|
|
||||||
# INPUT: binary file
|
# INPUT: binary files (regnual_image, upgrade_firmware_image)
|
||||||
|
|
||||||
# Assume only single CCID device is attached to computer, and it's Gnuk Token
|
# Assume only single CCID device is attached to computer, and it's Gnuk Token
|
||||||
|
|
||||||
@@ -390,11 +390,18 @@ from subprocess import check_output
|
|||||||
|
|
||||||
SHA256_OID_PREFIX="3031300d060960864801650304020105000420"
|
SHA256_OID_PREFIX="3031300d060960864801650304020105000420"
|
||||||
|
|
||||||
def gpg_sign(hash):
|
# When user specify KEYGRIP, use it. Or else, connect to SCD directly.
|
||||||
result = check_output(["gpg-connect-agent",
|
def gpg_sign(keygrip, hash):
|
||||||
"SCD SETDATA " + SHA256_OID_PREFIX + hash,
|
if keygrip:
|
||||||
"SCD PKAUTH OPENPGP.3",
|
result = check_output(["gpg-connect-agent",
|
||||||
"/bye"])
|
"SIGKEY %s" % keygrip,
|
||||||
|
"SETHASH --hash=sha256 %s" % hash,
|
||||||
|
"PKSIGN --hash=sha256", "/bye"])
|
||||||
|
else:
|
||||||
|
result = check_output(["gpg-connect-agent",
|
||||||
|
"SCD SETDATA " + SHA256_OID_PREFIX + hash,
|
||||||
|
"SCD PKAUTH OPENPGP.3",
|
||||||
|
"/bye"])
|
||||||
signed = ""
|
signed = ""
|
||||||
while True:
|
while True:
|
||||||
i = result.find('%')
|
i = result.find('%')
|
||||||
@@ -406,8 +413,12 @@ def gpg_sign(hash):
|
|||||||
signed += chr(int(hex_str,16))
|
signed += chr(int(hex_str,16))
|
||||||
result = result[i+3:]
|
result = result[i+3:]
|
||||||
|
|
||||||
pos = signed.index("D ") + 2
|
if keygrip:
|
||||||
signed = signed[pos:-4] # \nOK\n
|
pos = signed.index("D (7:sig-val(3:rsa(1:s256:") + 26
|
||||||
|
signed = signed[pos:-7]
|
||||||
|
else:
|
||||||
|
pos = signed.index("D ") + 2
|
||||||
|
signed = signed[pos:-4] # \nOK\n
|
||||||
if len(signed) != 256:
|
if len(signed) != 256:
|
||||||
raise ValueError, binascii.hexlify(signed)
|
raise ValueError, binascii.hexlify(signed)
|
||||||
return signed
|
return signed
|
||||||
@@ -419,7 +430,7 @@ def crc32(bytestr):
|
|||||||
crc = binascii.crc32(bytestr)
|
crc = binascii.crc32(bytestr)
|
||||||
return UNSIGNED(crc)
|
return UNSIGNED(crc)
|
||||||
|
|
||||||
def main(data_regnual, data_upgrade):
|
def main(keygrip, data_regnual, data_upgrade):
|
||||||
l = len(data_regnual)
|
l = len(data_regnual)
|
||||||
if (l & 0x03) != 0:
|
if (l & 0x03) != 0:
|
||||||
data_regnual = data_regnual.ljust(l + 4 - (l & 0x03), chr(0))
|
data_regnual = data_regnual.ljust(l + 4 - (l & 0x03), chr(0))
|
||||||
@@ -441,7 +452,7 @@ def main(data_regnual, data_upgrade):
|
|||||||
icc.icc_power_on()
|
icc.icc_power_on()
|
||||||
icc.cmd_select_openpgp()
|
icc.cmd_select_openpgp()
|
||||||
challenge = icc.cmd_get_challenge()
|
challenge = icc.cmd_get_challenge()
|
||||||
signed = gpg_sign(binascii.hexlify(to_string(challenge)))
|
signed = gpg_sign(keygrip, binascii.hexlify(to_string(challenge)))
|
||||||
icc.cmd_external_authenticate(signed)
|
icc.cmd_external_authenticate(signed)
|
||||||
icc.stop_gnuk()
|
icc.stop_gnuk()
|
||||||
mem_info = icc.mem_info()
|
mem_info = icc.mem_info()
|
||||||
@@ -478,6 +489,11 @@ def main(data_regnual, data_upgrade):
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
keygrip = None
|
||||||
|
if sys.argv[1] == '-k':
|
||||||
|
sys.argv.pop(1)
|
||||||
|
keygrip = sys.argv[1]
|
||||||
|
sys.argv.pop(1)
|
||||||
filename_regnual = sys.argv[1]
|
filename_regnual = sys.argv[1]
|
||||||
filename_upgrade = sys.argv[2]
|
filename_upgrade = sys.argv[2]
|
||||||
f = open(filename_regnual)
|
f = open(filename_regnual)
|
||||||
@@ -488,4 +504,4 @@ if __name__ == '__main__':
|
|||||||
data_upgrade = f.read()
|
data_upgrade = f.read()
|
||||||
f.close()
|
f.close()
|
||||||
print "%s: %d" % (filename_upgrade, len(data_upgrade))
|
print "%s: %d" % (filename_upgrade, len(data_upgrade))
|
||||||
main(data_regnual, data_upgrade[4096:])
|
main(keygrip, data_regnual, data_upgrade[4096:])
|
||||||
|
|||||||
Reference in New Issue
Block a user