You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: Implement ML-DSA-65 validation and enhance REALITY settings
- Added validation functions for ML-DSA-65 seed and verify keys, ensuring correct lengths and encoding.
- Updated XRayConfig to enforce pairing rules for mldsa65Seed and mldsa65Verify, raising errors for mismatches.
- Enhanced inbound dialog schema to include ML-DSA-65 fields and validation logic.
- Updated frontend components to display hints and validation messages related to ML-DSA-65 settings.
- Added tests for ML-DSA-65 validation to ensure robustness and correctness.
Copy file name to clipboardExpand all lines: dashboard/public/statics/locales/en.json
+7-1Lines changed: 7 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -2247,6 +2247,7 @@
2247
2247
"copyMldsa65Verify": "Copy Verify Key",
2248
2248
"mldsa65SeedCopied": "Seed copied to clipboard",
2249
2249
"mldsa65VerifyCopied": "Verify key copied to clipboard",
2250
+
"mldsa65DestCertHint": "Optional. Requires a matching seed+verify pair. The REALITY target should use a large (typically RSA) certificate — ECDSA targets often fail silently with no useful client/server logs.",
2250
2251
"vlessHandshakeLabel": "Handshake method",
2251
2252
"vlessEncryptionLabel": "Encryption method",
2252
2253
"vlessEncryptionHint": "Choose the wire format for encrypted payloads.",
@@ -2706,7 +2707,12 @@
2706
2707
"destinationPortRange": "Destination port must be a whole number from 0 to 65535.",
2707
2708
"realityServerNamesRequired": "REALITY requires at least one server name.",
2708
2709
"realityServerNamesFormat": "REALITY server names must be a list of non-empty strings.",
2709
-
"realityServerNamesNoEmpty": "Each REALITY server name must be non-empty; remove blank lines or extra commas."
2710
+
"realityServerNamesNoEmpty": "Each REALITY server name must be non-empty; remove blank lines or extra commas.",
2711
+
"mldsa65SeedInvalid": "ML-DSA-65 seed must be a 32-byte URL-safe Base64 value.",
2712
+
"mldsa65VerifyInvalid": "ML-DSA-65 verify must be a 1952-byte URL-safe Base64 public key.",
2713
+
"mldsa65VerifyRequiresSeed": "ML-DSA-65 verify requires a matching seed on the server. Generate a pair or clear verify.",
2714
+
"mldsa65SeedReusesPrivateKey": "ML-DSA-65 seed must not be the same as the REALITY private key.",
2715
+
"mldsa65PairMismatch": "ML-DSA-65 verify does not match the seed. Generate a new pair or paste matching values."
2710
2716
},
2711
2717
"discardDraftTitle": "Discard new inbound?",
2712
2718
"discardDraftDescription": "This inbound is not in the list yet. Close without adding it will discard your changes.",
Copy file name to clipboardExpand all lines: dashboard/public/statics/locales/fa.json
+7-1Lines changed: 7 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -2162,6 +2162,7 @@
2162
2162
"copyMldsa65Verify": "کپی Verify",
2163
2163
"mldsa65SeedCopied": "Seed در کلیپبورد کپی شد",
2164
2164
"mldsa65VerifyCopied": "Verify در کلیپبورد کپی شد",
2165
+
"mldsa65DestCertHint": "اختیاری. به جفت seed+verify همخوان نیاز دارد. هدف REALITY باید گواهی بزرگ (معمولاً RSA) داشته باشد — اهداف ECDSA اغلب بدون لاگ مفید در کلاینت/سرور بهصورت خاموش شکست میخورند.",
2165
2166
"vlessHandshakeLabel": "روش دستدهی",
2166
2167
"vlessEncryptionLabel": "روش رمزنگاری",
2167
2168
"vlessEncryptionHint": "قالب دادهی رمزگذاریشده را انتخاب کنید.",
@@ -2619,7 +2620,12 @@
2619
2620
"destinationPortRange": "پورت مقصد باید عدد صحیح از ۰ تا ۶۵۵۳۵ باشد.",
2620
2621
"realityServerNamesRequired": "REALITY حداقل به یک نام سرور نیاز دارد.",
2621
2622
"realityServerNamesFormat": "نامهای سرور REALITY باید فهرستی از رشتههای غیرخالی باشد.",
2622
-
"realityServerNamesNoEmpty": "هر نام سرور REALITY باید غیرخالی باشد؛ خطوط خالی یا ویرگولهای اضافی را حذف کنید."
2623
+
"realityServerNamesNoEmpty": "هر نام سرور REALITY باید غیرخالی باشد؛ خطوط خالی یا ویرگولهای اضافی را حذف کنید.",
2624
+
"mldsa65SeedInvalid": "Seed مربوط به ML-DSA-65 باید مقدار Base64 URL-safe بهطول ۳۲ بایت باشد.",
2625
+
"mldsa65VerifyInvalid": "Verify مربوط به ML-DSA-65 باید کلید عمومی Base64 URL-safe بهطول ۱۹۵۲ بایت باشد.",
2626
+
"mldsa65VerifyRequiresSeed": "Verify مربوط به ML-DSA-65 به seed همخوان در سرور نیاز دارد. جفت را تولید کنید یا Verify را پاک کنید.",
2627
+
"mldsa65SeedReusesPrivateKey": "Seed مربوط به ML-DSA-65 نباید با کلید خصوصی REALITY یکی باشد.",
2628
+
"mldsa65PairMismatch": "Verify مربوط به ML-DSA-65 با seed همخوان نیست. جفت جدید تولید کنید یا مقادیر همخوان وارد کنید."
2623
2629
},
2624
2630
"discardDraftTitle": "ورودی جدید را دور بیندازید؟",
2625
2631
"discardDraftDescription": "این ورودی هنوز در فهرست نیست. بستن بدون افزودن، تغییرات را دور میاندازد.",
Copy file name to clipboardExpand all lines: dashboard/public/statics/locales/ru.json
+7-1Lines changed: 7 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -2137,6 +2137,7 @@
2137
2137
"copyMldsa65Verify": "Копировать Verify",
2138
2138
"mldsa65SeedCopied": "Seed скопирован в буфер обмена",
2139
2139
"mldsa65VerifyCopied": "Verify скопирован в буфер обмена",
2140
+
"mldsa65DestCertHint": "Необязательно. Нужна согласованная пара seed+verify. Цель REALITY должна использовать крупный (обычно RSA) сертификат — цели с ECDSA часто молча ломаются без полезных логов на клиенте и сервере.",
2140
2141
"vlessHandshakeLabel": "Метод рукопожатия",
2141
2142
"vlessEncryptionLabel": "Метод шифрования",
2142
2143
"vlessEncryptionHint": "Выберите формат для зашифрованных данных.",
@@ -2594,7 +2595,12 @@
2594
2595
"destinationPortRange": "Порт назначения должен быть целым числом от 0 до 65535.",
2595
2596
"realityServerNamesRequired": "Для REALITY нужно хотя бы одно имя сервера (server name).",
2596
2597
"realityServerNamesFormat": "Имена серверов REALITY должны быть списком непустых строк.",
2597
-
"realityServerNamesNoEmpty": "Каждое имя сервера REALITY должно быть непустым; удалите пустые строки или лишние запятые."
2598
+
"realityServerNamesNoEmpty": "Каждое имя сервера REALITY должно быть непустым; удалите пустые строки или лишние запятые.",
2599
+
"mldsa65SeedInvalid": "Seed ML-DSA-65 должен быть URL-safe Base64 длиной 32 байта.",
2600
+
"mldsa65VerifyInvalid": "Verify ML-DSA-65 должен быть URL-safe Base64 публичным ключом длиной 1952 байта.",
2601
+
"mldsa65VerifyRequiresSeed": "Verify ML-DSA-65 требует matching seed на сервере. Создайте пару или очистите verify.",
2602
+
"mldsa65SeedReusesPrivateKey": "Seed ML-DSA-65 не должен совпадать с private key REALITY.",
2603
+
"mldsa65PairMismatch": "Verify ML-DSA-65 не соответствует seed. Создайте новую пару или вставьте согласованные значения."
2598
2604
},
2599
2605
"discardDraftTitle": "Отменить новый входящий?",
2600
2606
"discardDraftDescription": "Этот входящий ещё не в списке. Закрытие без добавления отменит изменения.",
'Optional. Requires a matching seed+verify pair. The REALITY target should use a large (typically RSA) certificate — ECDSA targets often fail silently with no useful client/server logs.',
0 commit comments