summaryrefslogtreecommitdiffstats
path: root/security/crypto.py
blob: f961a212a7ee6ef17e5d871f9f60094d9012d570 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from pyspx.shake_256f import generate_keypair, sign, verify
import hashlib
from typing import Tuple, Optional
import os

class CryptoManager:
    def __init__(self):
        self.signing_key: Optional[bytes] = None
        self.verify_key: Optional[bytes] = None
        
    def generate_keys(self) -> Tuple[bytes, bytes]:
        """Generate new signing keypair"""
        self.signing_key, self.verify_key = generate_keypair()
        return self.signing_key, self.verify_key
        
    def sign_message(self, message: bytes) -> bytes:
        """Sign a message using the signing key"""
        if not self.signing_key:
            raise ValueError("No signing key available")
        return sign(message, self.signing_key)
        
    def verify_signature(self, message: bytes, signature: bytes, 
                        public_key: bytes) -> bool:
        """Verify a message signature"""
        try:
            verify(message, signature, public_key)
            return True
        except:
            return False
            
    def hash_data(self, data: bytes) -> str:
        """Create SHA-256 hash of data"""
        return hashlib.sha256(data).hexdigest()
        
    def generate_nonce(self) -> bytes:
        """Generate a random nonce"""
        return os.urandom(32)