| |
|
|
| 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 |
|
|