| 
							 | 
						 | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						import uuid | 
					
					
						
						| 
							 | 
						import json | 
					
					
						
						| 
							 | 
						import base64 | 
					
					
						
						| 
							 | 
						from datetime import datetime, UTC | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						from cryptography.hazmat.primitives.asymmetric import rsa, ed25519 | 
					
					
						
						| 
							 | 
						from cryptography.hazmat.primitives import serialization | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						DEFAULT_KEY_TYPE = "ed25519"   | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def generate_did(): | 
					
					
						
						| 
							 | 
						    """Генерация уникального DiD на основе UUID v4""" | 
					
					
						
						| 
							 | 
						    return f"did:hmp:{uuid.uuid4()}" | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def generate_keys(key_type=DEFAULT_KEY_TYPE): | 
					
					
						
						| 
							 | 
						    """Генерация пары ключей""" | 
					
					
						
						| 
							 | 
						    if key_type == "rsa": | 
					
					
						
						| 
							 | 
						        private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048) | 
					
					
						
						| 
							 | 
						    elif key_type == "ed25519": | 
					
					
						
						| 
							 | 
						        private_key = ed25519.Ed25519PrivateKey.generate() | 
					
					
						
						| 
							 | 
						    else: | 
					
					
						
						| 
							 | 
						        raise ValueError(f"Неизвестный тип ключа: {key_type}") | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						    public_key = private_key.public_key() | 
					
					
						
						| 
							 | 
						    return private_key, public_key | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def serialize_private_key(private_key, password=None): | 
					
					
						
						| 
							 | 
						    """Сериализация приватного ключа""" | 
					
					
						
						| 
							 | 
						    encryption = ( | 
					
					
						
						| 
							 | 
						        serialization.BestAvailableEncryption(password.encode()) | 
					
					
						
						| 
							 | 
						        if password else | 
					
					
						
						| 
							 | 
						        serialization.NoEncryption() | 
					
					
						
						| 
							 | 
						    ) | 
					
					
						
						| 
							 | 
						    return private_key.private_bytes( | 
					
					
						
						| 
							 | 
						        encoding=serialization.Encoding.PEM, | 
					
					
						
						| 
							 | 
						        format=serialization.PrivateFormat.PKCS8, | 
					
					
						
						| 
							 | 
						        encryption_algorithm=encryption, | 
					
					
						
						| 
							 | 
						    ).decode() | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def serialize_public_key(public_key): | 
					
					
						
						| 
							 | 
						    """Сериализация публичного ключа""" | 
					
					
						
						| 
							 | 
						    return public_key.public_bytes( | 
					
					
						
						| 
							 | 
						        encoding=serialization.Encoding.PEM, | 
					
					
						
						| 
							 | 
						        format=serialization.PublicFormat.SubjectPublicKeyInfo, | 
					
					
						
						| 
							 | 
						    ).decode() | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def create_identity(name="Core Identity", key_type=DEFAULT_KEY_TYPE, metadata=None, password=None): | 
					
					
						
						| 
							 | 
						    """Создание полной идентичности""" | 
					
					
						
						| 
							 | 
						    did = generate_did() | 
					
					
						
						| 
							 | 
						    priv_key, pub_key = generate_keys(key_type) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						    identity = { | 
					
					
						
						| 
							 | 
						        "id": did, | 
					
					
						
						| 
							 | 
						        "name": name, | 
					
					
						
						| 
							 | 
						        "pubkey": serialize_public_key(pub_key), | 
					
					
						
						| 
							 | 
						        "privkey": serialize_private_key(priv_key, password), | 
					
					
						
						| 
							 | 
						        "metadata": json.dumps(metadata or {}), | 
					
					
						
						| 
							 | 
						        "created_at": datetime.now(UTC).isoformat(), | 
					
					
						
						| 
							 | 
						        "updated_at": datetime.now(UTC).isoformat(), | 
					
					
						
						| 
							 | 
						    } | 
					
					
						
						| 
							 | 
						    return identity | 
					
					
						
						| 
							 | 
						
 |