31 lines
1.1 KiB
Python
31 lines
1.1 KiB
Python
|
|
from dataclasses import dataclass
|
||
|
|
from .prime_utils import is_prime
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass(frozen=True)
|
||
|
|
class PublicParams:
|
||
|
|
"""
|
||
|
|
Публичные параметры протокола:
|
||
|
|
- prime_modulus: простое число p
|
||
|
|
- generator: порождающий элемент g
|
||
|
|
"""
|
||
|
|
prime_modulus: int
|
||
|
|
generator: int
|
||
|
|
|
||
|
|
def __post_init__(self):
|
||
|
|
p = self.prime_modulus
|
||
|
|
g = self.generator
|
||
|
|
|
||
|
|
# Проверка простоты модуля
|
||
|
|
if not is_prime(p):
|
||
|
|
raise ValueError(f"prime_modulus={p} не является простым числом")
|
||
|
|
|
||
|
|
# Проверка допустимости генератора
|
||
|
|
if g <= 1 or g >= p - 1:
|
||
|
|
raise ValueError(
|
||
|
|
f"generator={g} вне допустимого диапазона (2..p-2)")
|
||
|
|
|
||
|
|
# Проверка, что генератор не сворачивается в малую подгруппу
|
||
|
|
if pow(g, (p - 1) // 2, p) == 1:
|
||
|
|
raise ValueError(f"generator={g} не является корректным для p={p}")
|