if not n*ellipticcurve.Point( curve, x, y ) == \ ellipticcurve.INFINITY: return False return True # NIST Curve P-192: _p = 6277101735386680763835789423207666416083908700390324961279L _r = 6277101735386680763835789423176059013767194773182842284081L # s = 0x3045ae6fc8422f64ed579528d38120eae12196d5L # c = 0x3099d2bbbfcb2538542dcd5fb078b6ef5f3d6fe2c745de65L _b = 0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1L _Gx = 0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012L _Gy = 0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811L curve_192 = ellipticcurve.CurveFp(_p, -3, _b) generator_192 = ellipticcurve.Point(curve_192, _Gx, _Gy, _r) # NIST Curve P-224: _p = 26959946667150639794667015087019630673557916260026308143510066298881L _r = 26959946667150639794667015087019625940457807714424391721682722368061L # s = 0xbd71344799d5c7fcdc45b59fa3b9ab8f6a948bc5L # c = 0x5b056c7e11dd68f40469ee7f3c7a7d74f7d121116506d031218291fbL _b = 0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4L _Gx = 0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21L _Gy = 0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34L curve_224 = ellipticcurve.CurveFp(_p, -3, _b) generator_224 = ellipticcurve.Point(curve_224, _Gx, _Gy, _r) # NIST Curve P-256:
k2 = (0x30 * section_count) + (0x10 * (sha_key_id + 1)) meta = meta[:k1] + correct_sha[:0x10] + meta[k1 + 0x10:] meta = meta[:k2] + correct_sha[0x10:] + ('\x00' * 0xC) + meta[k2 + 0x10:] else: print "Section already has correct hash" # reinsert decrypted metadata into file f = f[:meta_offset + 0x20] + meta_keys + meta_header + meta + f[meta_offset + meta_len:] # self signature is now invalid, so we need to fix it print "Fixing signature" sig_len = struct.unpack('>Q', meta_header[0x0:0x8])[0] hash = int(hashlib.sha1(f[:sig_len]).hexdigest(), 16) curve = ellipticcurve.CurveFp(p, a, b) g = ellipticcurve.Point(curve, Gx, Gy, N) pubkey = ecdsa.Public_key(g, g * priv) privkey = ecdsa.Private_key(pubkey, priv) sig = privkey.sign(hash, randrange(1, N)) meta = meta[:sig_len - meta_offset - 0x80] + '\x00' + pack( sig.r, 160) + '\x00' + pack(sig.s, 160) + meta[sig_len - meta_offset - 0x80 + 42:] # reencrypt metadata and reinsert into self print "Re-encrypting and inserting metadata" meta, crap = aes128ctr(meta, meta_key, meta_iv) f = f[:meta_offset + 0x20] + meta_keys_enc + meta_header_enc + meta + f[meta_offset + meta_len:]