def CryptImportKey(data, pub_key=None): publickeystruc = PUBLICKEYSTRUC._make(PUBLICKEYSTRUC_s.unpack_from(data)) if publickeystruc.bVersion != CUR_BLOB_VERSION: raise NotImplementedError('PUBLICKEYSTRUC.bVersion={} not implemented'.format(publickeystruc.bVersion)) if publickeystruc.aiKeyAlg not in algorithm_registry: raise NotImplementedError('ALG_ID {:x} not implemented'.format(publickeystruc.aiKeyAlg)) if publickeystruc.bType == bType_PUBLICKEYBLOB: if GET_ALG_CLASS(publickeystruc.aiKeyAlg) != ALG_CLASS_KEY_EXCHANGE: raise ValueError('Invalid ALG_ID {:x} for PUBLICKEYBLOB'.format(publickeystruc.aiKeyAlg)) return algorithm_registry[publickeystruc.aiKeyAlg].import_publickeyblob(data[8:]) elif publickeystruc.bType == bType_PRIVATEKEYBLOB: if GET_ALG_CLASS(publickeystruc.aiKeyAlg) != ALG_CLASS_KEY_EXCHANGE: raise ValueError('Invalid ALG_ID {:x} for PRIVATEKEYBLOB'.format(publickeystruc.aiKeyAlg)) return algorithm_registry[publickeystruc.aiKeyAlg].import_privatekeyblob(data[8:]) elif publickeystruc.bType == bType_PLAINTEXTKEYBLOB: if GET_ALG_CLASS(publickeystruc.aiKeyAlg) != ALG_CLASS_DATA_ENCRYPT: raise ValueError('Invalid ALG_ID {:x} for PLAINTEXTKEYBLOB'.format(publickeystruc.aiKeyAlg)) return algorithm_registry[publickeystruc.aiKeyAlg].import_plaintextkeyblob(data[8:]) elif publickeystruc.bType == bType_SIMPLEBLOB: if GET_ALG_CLASS(publickeystruc.aiKeyAlg) != ALG_CLASS_DATA_ENCRYPT: raise ValueError('Invalid ALG_ID {:x} for SIMPLEBLOB'.format(publickeystruc.aiKeyAlg)) return algorithm_registry[publickeystruc.aiKeyAlg].import_simpleblob(data[8:], pub_key) else: raise NotImplementedError('PUBLICKEYSTRUC.bType={} not implemented'.format(publickeystruc.bType))
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