f20080305d
Определение специфических рекомендаций (матрица профилей §8):
1. Ж/д слой (закрыт мёртвый railway ×2.5 у РАС):
- /api/v1/water/{case_id} отдаёт railway=rail как LineString
(без service/industrial/military веток), кэш общий v2;
- railway_warning «перекрыть/проверить немедленно» по профилям;
- SearchMap: Polyline слой ж/д (тёмно-красный), счётчики 💧/🚂.
2. cant_swim → профиль не_умеет_плавать (water ×3.0, без изменения
радиуса, critical_warning «обследовать водоёмы НЕМЕДЛЕННО»):
- раньше чекбокс влиял только на текст, в скоринге был пробел;
- derive в analyze._derive_profiles — работает и для closed_cases.
3. unmodeled_profiles: ДЦП/слабое зрение/слух — честная пометка
«вне поведенческой модели» с пояснением (vector_tasks B12:
профили без аналога не выдавать за учтённые); блок на фронте
в карточке здоровья.
Площадь воды: сферический эксцесс, проверен на квадрате 53° (744017 м²
vs 743272 точного). Тесты: 202 passed (новый test_cant_swim_profile).
101 lines
2.6 KiB
Python
101 lines
2.6 KiB
Python
import hashlib
|
|
|
|
|
|
class Algorithms:
|
|
# DS Algorithms
|
|
NONE = "none"
|
|
HS256 = "HS256"
|
|
HS384 = "HS384"
|
|
HS512 = "HS512"
|
|
RS256 = "RS256"
|
|
RS384 = "RS384"
|
|
RS512 = "RS512"
|
|
ES256 = "ES256"
|
|
ES384 = "ES384"
|
|
ES512 = "ES512"
|
|
|
|
# Content Encryption Algorithms
|
|
A128CBC_HS256 = "A128CBC-HS256"
|
|
A192CBC_HS384 = "A192CBC-HS384"
|
|
A256CBC_HS512 = "A256CBC-HS512"
|
|
A128GCM = "A128GCM"
|
|
A192GCM = "A192GCM"
|
|
A256GCM = "A256GCM"
|
|
|
|
# Pseudo algorithm for encryption
|
|
A128CBC = "A128CBC"
|
|
A192CBC = "A192CBC"
|
|
A256CBC = "A256CBC"
|
|
|
|
# CEK Encryption Algorithms
|
|
DIR = "dir"
|
|
RSA1_5 = "RSA1_5"
|
|
RSA_OAEP = "RSA-OAEP"
|
|
RSA_OAEP_256 = "RSA-OAEP-256"
|
|
A128KW = "A128KW"
|
|
A192KW = "A192KW"
|
|
A256KW = "A256KW"
|
|
ECDH_ES = "ECDH-ES"
|
|
ECDH_ES_A128KW = "ECDH-ES+A128KW"
|
|
ECDH_ES_A192KW = "ECDH-ES+A192KW"
|
|
ECDH_ES_A256KW = "ECDH-ES+A256KW"
|
|
A128GCMKW = "A128GCMKW"
|
|
A192GCMKW = "A192GCMKW"
|
|
A256GCMKW = "A256GCMKW"
|
|
PBES2_HS256_A128KW = "PBES2-HS256+A128KW"
|
|
PBES2_HS384_A192KW = "PBES2-HS384+A192KW"
|
|
PBES2_HS512_A256KW = "PBES2-HS512+A256KW"
|
|
|
|
# Compression Algorithms
|
|
DEF = "DEF"
|
|
|
|
HMAC = {HS256, HS384, HS512}
|
|
RSA_DS = {RS256, RS384, RS512}
|
|
RSA_KW = {RSA1_5, RSA_OAEP, RSA_OAEP_256}
|
|
RSA = RSA_DS.union(RSA_KW)
|
|
EC_DS = {ES256, ES384, ES512}
|
|
EC_KW = {ECDH_ES, ECDH_ES_A128KW, ECDH_ES_A192KW, ECDH_ES_A256KW}
|
|
EC = EC_DS.union(EC_KW)
|
|
AES_PSEUDO = {A128CBC, A192CBC, A256CBC, A128GCM, A192GCM, A256GCM}
|
|
AES_JWE_ENC = {A128CBC_HS256, A192CBC_HS384, A256CBC_HS512, A128GCM, A192GCM, A256GCM}
|
|
AES_ENC = AES_JWE_ENC.union(AES_PSEUDO)
|
|
AES_KW = {A128KW, A192KW, A256KW}
|
|
AEC_GCM_KW = {A128GCMKW, A192GCMKW, A256GCMKW}
|
|
AES = AES_ENC.union(AES_KW)
|
|
PBES2_KW = {PBES2_HS256_A128KW, PBES2_HS384_A192KW, PBES2_HS512_A256KW}
|
|
|
|
HMAC_AUTH_TAG = {A128CBC_HS256, A192CBC_HS384, A256CBC_HS512}
|
|
GCM = {A128GCM, A192GCM, A256GCM}
|
|
|
|
SUPPORTED = HMAC.union(RSA_DS).union(EC_DS).union([DIR]).union(AES_JWE_ENC).union(RSA_KW).union(AES_KW)
|
|
|
|
ALL = SUPPORTED.union([NONE]).union(AEC_GCM_KW).union(EC_KW).union(PBES2_KW)
|
|
|
|
HASHES = {
|
|
HS256: hashlib.sha256,
|
|
HS384: hashlib.sha384,
|
|
HS512: hashlib.sha512,
|
|
RS256: hashlib.sha256,
|
|
RS384: hashlib.sha384,
|
|
RS512: hashlib.sha512,
|
|
ES256: hashlib.sha256,
|
|
ES384: hashlib.sha384,
|
|
ES512: hashlib.sha512,
|
|
}
|
|
|
|
KEYS = {}
|
|
|
|
|
|
ALGORITHMS = Algorithms()
|
|
|
|
|
|
class Zips:
|
|
DEF = "DEF"
|
|
NONE = None
|
|
SUPPORTED = {DEF, NONE}
|
|
|
|
|
|
ZIPS = Zips()
|
|
|
|
JWE_SIZE_LIMIT = 250 * 1024
|