31 lines
		
	
	
	
		
			963 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
	
		
			963 B
		
	
	
	
		
			Python
		
	
	
	
	
	
# https://stackoverflow.com/a/18266970
 | 
						|
 | 
						|
from Crypto.PublicKey import RSA
 | 
						|
from struct import pack
 | 
						|
from hashlib import sha3_512
 | 
						|
from cryptography.hazmat.primitives.serialization import load_der_private_key
 | 
						|
from functools import cache
 | 
						|
 | 
						|
 | 
						|
class PRNG(object):
 | 
						|
    def __init__(self, seed):
 | 
						|
        self.index = 0
 | 
						|
        self.seed = sha3_512(seed).digest()
 | 
						|
        self.buffer = b""
 | 
						|
    def __call__(self, n):
 | 
						|
        while len(self.buffer) < n:
 | 
						|
            self.buffer += sha3_512(self.seed + pack("<d", self.index)).digest()
 | 
						|
            self.index += 1
 | 
						|
        result, self.buffer = self.buffer[:n], self.buffer[n:]
 | 
						|
        return result
 | 
						|
 | 
						|
 | 
						|
def _generate_deterministic_rsa_private_key(secret_bytes):
 | 
						|
    return RSA.generate(2048, randfunc=PRNG(secret_bytes)).export_key('DER')
 | 
						|
 | 
						|
@cache
 | 
						|
def generate_deterministic_rsa_private_key(secret_bytes):
 | 
						|
    return load_der_private_key(
 | 
						|
        _generate_deterministic_rsa_private_key(secret_bytes),
 | 
						|
        password=None,
 | 
						|
    )
 |