def Generate(size=keyinfo.RSA_PRIV.default_size): """ Return a newly generated RSA private key. @param size: length of key in bits to generate @type size: integer @return: a RSA private key @rtype: L{RsaPrivateKey} """ key = RSA.generate(size, util.RandBytes) #NOTE: PyCrypto stores p < q, u = p^{-1} mod q #But OpenSSL and PKCS8 stores q < p, invq = q^{-1} mod p #So we have to reverse the p and q values params = { 'privateExponent': util.PadBytes(util.BigIntToBytes(key.d), 1), 'primeP': util.PadBytes(util.BigIntToBytes(key.q), 1), 'primeQ': util.PadBytes(util.BigIntToBytes(key.p), 1), 'primeExponentP': util.PadBytes(util.BigIntToBytes(key.d % (key.q - 1)), 1), 'primeExponentQ': util.PadBytes(util.BigIntToBytes(key.d % (key.p - 1)), 1), 'crtCoefficient': util.PadBytes(util.BigIntToBytes(key.u), 1) } pubkey = key.publickey() pub_params = { 'modulus': util.PadBytes(util.BigIntToBytes(key.n), 1), 'publicExponent': util.PadBytes(util.BigIntToBytes(key.e), 1) } pub = RsaPublicKey(pub_params, pubkey, size) return RsaPrivateKey(params, pub, key, size)
def Generate(size=keyinfo.DSA_PRIV.default_size): """ Return a newly generated DSA private key. @param size: length of key in bits to generate @type size: integer @return: a DSA private key @rtype: L{DsaPrivateKey} """ key = DSA.generate(size, util.RandBytes) params = { 'x': util.PadBytes(util.BigIntToBytes(key.x), 1) } pubkey = key.publickey() pub_params = { 'g': util.PadBytes(util.BigIntToBytes(pubkey.g), 1), 'p': util.PadBytes(util.BigIntToBytes(pubkey.p), 1), 'q': util.PadBytes(util.BigIntToBytes(pubkey.q), 1), 'y': util.PadBytes(util.BigIntToBytes(pubkey.y), 1) } pub = DsaPublicKey(pub_params, pubkey, size) return DsaPrivateKey(params, pub, key, size)
def Sign(self, msg): """ Return raw byte string of signature on the SHA-1 hash_id of the message. @param msg: message to be signed @type msg: string @return: string representation of long int signature over message @rtype: string """ emsa_encoded = util.MakeEmsaMessage(msg, self.size) byte_string = util.BigIntToBytes(self.key.sign(emsa_encoded, None)[0]) return util.PadBytes(byte_string, self.size / 8 - len(byte_string))