Skip to content

Instantly share code, notes, and snippets.

@dogtopus
Created July 24, 2021 06:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dogtopus/1b3be82675857821b446465115348dac to your computer and use it in GitHub Desktop.
Save dogtopus/1b3be82675857821b446465115348dac to your computer and use it in GitHub Desktop.
DS4Key generation
#!/usr/bin/env python3
from Cryptodome.PublicKey import RSA
from Cryptodome.Signature import pss
from Cryptodome.Hash import SHA256
from Cryptodome.Math.Numbers import Integer
import io
import shutil
import sys
if __name__ == '__main__':
if len(sys.argv) < 4:
print(f'Usage {sys.argv[0]} ca serial out')
print('Serial format: 00000000000000000001TTTTNNNNNNNN (T: type [1|2: DS4, 3: A7105], N: actual serial)')
sys.exit(1)
with open(sys.argv[1], 'rb') as f:
ca = RSA.import_key(f.read())
if not ca.can_sign:
raise RuntimeError('CA private key missing.')
ca_pss = pss.new(ca)
serial = bytes.fromhex(sys.argv[2])
if len(serial) != 16:
raise RuntimeError('Bad serial.')
ds4key_key = RSA.generate(2048)
buf = io.BytesIO()
#buf.write(b'\x00' * 8)
#buf.write(b'\x00\x01\x00\x01\xde\xad\xbe\xef')
buf.write(serial)
buf.write(ds4key_key.n.to_bytes(0x100, 'big'))
buf.write(ds4key_key.e.to_bytes(0x100, 'big'))
sha = SHA256.new(buf.getvalue())
sig = ca_pss.sign(sha)
buf.write(sig)
pq = Integer(ds4key_key.q).inverse(ds4key_key.p)
dp1 = Integer(ds4key_key.d) % (ds4key_key.p-1)
dq1 = Integer(ds4key_key.d) % (ds4key_key.q-1)
buf.write(ds4key_key.p.to_bytes(0x80, 'big'))
buf.write(ds4key_key.q.to_bytes(0x80, 'big'))
buf.write(dp1.to_bytes(0x80))
buf.write(dq1.to_bytes(0x80))
buf.write(pq.to_bytes(0x80))
buf.seek(0)
with open(sys.argv[3], 'wb') as f:
shutil.copyfileobj(buf, f)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment