def export_simpleblob(self, rsa_key): result = PUBLICKEYSTRUC_s.pack(bType_SIMPLEBLOB, CUR_BLOB_VERSION, self.alg_id) if rsa_key.alg_id != CALG_RSA_KEYX: raise ValueError('SIMPLEBLOB export only supported under RSA key') result += struct.pack('<I', CALG_RSA_KEYX) result += rsa_key.encrypt(self.key) return result
def export_publickeyblob(self): n = self.key.key.n e = self.key.key.e n_bytes = long_to_bytes(n)[::-1] result = PUBLICKEYSTRUC_s.pack(bType_PUBLICKEYBLOB, CUR_BLOB_VERSION, CALG_RSA_KEYX) result += RSAPUBKEY_s.pack(RSAPUBKEY_MAGIC, len(n_bytes) * 8, e) result += n_bytes return result
def export_privatekeyblob(self): key = self.key.key n = key.n e = key.e d = key.d p = key.p q = key.q n_bytes = long_to_bytes(n)[::-1] key_len = len(n_bytes) * 8 result = PUBLICKEYSTRUC_s.pack(bType_PRIVATEKEYBLOB, CUR_BLOB_VERSION, CALG_RSA_KEYX) result += RSAPUBKEY_s.pack(PRIVATEKEYBLOB_MAGIC, key_len, e) result += n_bytes result += long_to_bytes(p, key_len / 16)[::-1] result += long_to_bytes(q, key_len / 16)[::-1] result += long_to_bytes(d % (p - 1), key_len / 16)[::-1] result += long_to_bytes(d % (q - 1), key_len / 16)[::-1] result += long_to_bytes(inverse(q, p), key_len / 16)[::-1] result += long_to_bytes(d, key_len / 8)[::-1] return result
def export_plaintextkeyblob(self): result = PUBLICKEYSTRUC_s.pack(bType_PLAINTEXTKEYBLOB, 2, self.alg_id) result += struct.pack('<I', len(self.key)) result += self.key return result