Merge pull request #3279 from MHSanaei/mldsa65

add mldsa65
This commit is contained in:
Sanaei 2025-07-27 16:52:44 +02:00 committed by GitHub
commit 702f03e4b7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 81 additions and 4 deletions

View file

@ -263,6 +263,7 @@ func (s *SubJsonService) realityData(rData map[string]any) map[string]any {
rltyData["show"] = false rltyData["show"] = false
rltyData["publicKey"] = rltyClientSettings["publicKey"] rltyData["publicKey"] = rltyClientSettings["publicKey"]
rltyData["fingerprint"] = rltyClientSettings["fingerprint"] rltyData["fingerprint"] = rltyClientSettings["fingerprint"]
rltyData["mldsa65Verify"] = rltyClientSettings["mldsa65Verify"]
// Set random data // Set random data
rltyData["spiderX"] = "/" + random.Seq(15) rltyData["spiderX"] = "/" + random.Seq(15)

View file

@ -732,6 +732,7 @@ class RealityStreamSettings extends XrayCommonClass {
maxClient = '', maxClient = '',
maxTimediff = 0, maxTimediff = 0,
shortIds = RandomUtil.randomShortIds(), shortIds = RandomUtil.randomShortIds(),
mldsa65Seed = '',
settings = new RealityStreamSettings.Settings() settings = new RealityStreamSettings.Settings()
) { ) {
super(); super();
@ -744,6 +745,7 @@ class RealityStreamSettings extends XrayCommonClass {
this.maxClient = maxClient; this.maxClient = maxClient;
this.maxTimediff = maxTimediff; this.maxTimediff = maxTimediff;
this.shortIds = Array.isArray(shortIds) ? shortIds.join(",") : shortIds; this.shortIds = Array.isArray(shortIds) ? shortIds.join(",") : shortIds;
this.mldsa65Seed = mldsa65Seed;
this.settings = settings; this.settings = settings;
} }
@ -754,7 +756,8 @@ class RealityStreamSettings extends XrayCommonClass {
json.settings.publicKey, json.settings.publicKey,
json.settings.fingerprint, json.settings.fingerprint,
json.settings.serverName, json.settings.serverName,
json.settings.spiderX json.settings.spiderX,
json.settings.mldsa65Verify,
); );
} }
return new RealityStreamSettings( return new RealityStreamSettings(
@ -767,6 +770,7 @@ class RealityStreamSettings extends XrayCommonClass {
json.maxClient, json.maxClient,
json.maxTimediff, json.maxTimediff,
json.shortIds, json.shortIds,
json.mldsa65Seed,
settings, settings,
); );
} }
@ -782,6 +786,7 @@ class RealityStreamSettings extends XrayCommonClass {
maxClient: this.maxClient, maxClient: this.maxClient,
maxTimediff: this.maxTimediff, maxTimediff: this.maxTimediff,
shortIds: this.shortIds.split(","), shortIds: this.shortIds.split(","),
mldsa65Seed: this.mldsa65Seed,
settings: this.settings, settings: this.settings,
}; };
} }
@ -792,13 +797,15 @@ RealityStreamSettings.Settings = class extends XrayCommonClass {
publicKey = '', publicKey = '',
fingerprint = UTLS_FINGERPRINT.UTLS_CHROME, fingerprint = UTLS_FINGERPRINT.UTLS_CHROME,
serverName = '', serverName = '',
spiderX = '/' spiderX = '/',
mldsa65Verify = ''
) { ) {
super(); super();
this.publicKey = publicKey; this.publicKey = publicKey;
this.fingerprint = fingerprint; this.fingerprint = fingerprint;
this.serverName = serverName; this.serverName = serverName;
this.spiderX = spiderX; this.spiderX = spiderX;
this.mldsa65Verify = mldsa65Verify;
} }
static fromJson(json = {}) { static fromJson(json = {}) {
return new RealityStreamSettings.Settings( return new RealityStreamSettings.Settings(
@ -806,6 +813,7 @@ RealityStreamSettings.Settings = class extends XrayCommonClass {
json.fingerprint, json.fingerprint,
json.serverName, json.serverName,
json.spiderX, json.spiderX,
json.mldsa65Verify
); );
} }
toJson() { toJson() {
@ -814,6 +822,7 @@ RealityStreamSettings.Settings = class extends XrayCommonClass {
fingerprint: this.fingerprint, fingerprint: this.fingerprint,
serverName: this.serverName, serverName: this.serverName,
spiderX: this.spiderX, spiderX: this.spiderX,
mldsa65Verify: this.mldsa65Verify
}; };
} }
}; };

View file

@ -50,6 +50,7 @@ func (a *ServerController) initRouter(g *gin.RouterGroup) {
g.GET("/getDb", a.getDb) g.GET("/getDb", a.getDb)
g.POST("/importDB", a.importDB) g.POST("/importDB", a.importDB)
g.POST("/getNewX25519Cert", a.getNewX25519Cert) g.POST("/getNewX25519Cert", a.getNewX25519Cert)
g.POST("/getNewmldsa65", a.getNewmldsa65)
} }
func (a *ServerController) refreshStatus() { func (a *ServerController) refreshStatus() {
@ -198,3 +199,12 @@ func (a *ServerController) getNewX25519Cert(c *gin.Context) {
} }
jsonObj(c, cert, nil) jsonObj(c, cert, nil)
} }
func (a *ServerController) getNewmldsa65(c *gin.Context) {
cert, err := a.serverService.GetNewmldsa65()
if err != nil {
jsonMsg(c, I18nWeb(c, "pages.inbounds.toasts.getNewmldsa65Error"), err)
return
}
jsonObj(c, cert, nil)
}

View file

@ -52,5 +52,14 @@
<a-form-item label=" "> <a-form-item label=" ">
<a-button type="primary" icon="import" @click="getNewX25519Cert">Get New Cert</a-button> <a-button type="primary" icon="import" @click="getNewX25519Cert">Get New Cert</a-button>
</a-form-item> </a-form-item>
<a-form-item label="mldsa65 Seed">
<a-input v-model="inbound.stream.reality.mldsa65Seed"></a-input>
</a-form-item>
<a-form-item label="mldsa65 Verify">
<a-textarea v-model="inbound.stream.reality.settings.mldsa65Verify"></a-textarea>
</a-form-item>
<a-form-item label=" ">
<a-button type="primary" icon="import" @click="getNewmldsa65">Get New Seed</a-button>
</a-form-item>
</template> </template>
{{end}} {{end}}

View file

@ -141,7 +141,17 @@
} }
inModal.inbound.stream.reality.privateKey = msg.obj.privateKey; inModal.inbound.stream.reality.privateKey = msg.obj.privateKey;
inModal.inbound.stream.reality.settings.publicKey = msg.obj.publicKey; inModal.inbound.stream.reality.settings.publicKey = msg.obj.publicKey;
} },
async getNewmldsa65() {
inModal.loading(true);
const msg = await HttpUtil.post('/server/getNewmldsa65');
inModal.loading(false);
if (!msg.success) {
return;
}
inModal.inbound.stream.reality.mldsa65Seed = msg.obj.seed;
inModal.inbound.stream.reality.settings.mldsa65Verify = msg.obj.verify;
},
}, },
}); });

View file

@ -709,3 +709,29 @@ func (s *ServerService) GetNewX25519Cert() (any, error) {
return keyPair, nil return keyPair, nil
} }
func (s *ServerService) GetNewmldsa65() (any, error) {
// Run the command
cmd := exec.Command(xray.GetBinaryPath(), "mldsa65")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
return nil, err
}
lines := strings.Split(out.String(), "\n")
SeedLine := strings.Split(lines[0], ":")
VerifyLine := strings.Split(lines[1], ":")
seed := strings.TrimSpace(SeedLine[1])
verify := strings.TrimSpace(VerifyLine[1])
keyPair := map[string]any{
"seed": seed,
"verify": verify,
}
return keyPair, nil
}

View file

@ -260,6 +260,7 @@
"resetInboundClientTrafficSuccess" = "تم إعادة تعيين حركة المرور" "resetInboundClientTrafficSuccess" = "تم إعادة تعيين حركة المرور"
"trafficGetError" = "خطأ في الحصول على حركات المرور" "trafficGetError" = "خطأ في الحصول على حركات المرور"
"getNewX25519CertError" = "حدث خطأ أثناء الحصول على شهادة X25519." "getNewX25519CertError" = "حدث خطأ أثناء الحصول على شهادة X25519."
"getNewmldsa65Error" = "حدث خطاء في الحصول على mldsa65."
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "طلب" "request" = "طلب"

View file

@ -258,7 +258,7 @@
"resetInboundClientTrafficSuccess" = "Traffic has been reset." "resetInboundClientTrafficSuccess" = "Traffic has been reset."
"trafficGetError" = "Error getting traffics." "trafficGetError" = "Error getting traffics."
"getNewX25519CertError" = "Error while obtaining the X25519 certificate." "getNewX25519CertError" = "Error while obtaining the X25519 certificate."
"getNewmldsa65Error" = "Error while obtaining mldsa65."
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "Request" "request" = "Request"

View file

@ -262,6 +262,7 @@
"resetInboundClientTrafficSuccess" = "El tráfico ha sido reiniciado" "resetInboundClientTrafficSuccess" = "El tráfico ha sido reiniciado"
"trafficGetError" = "Error al obtener los tráficos" "trafficGetError" = "Error al obtener los tráficos"
"getNewX25519CertError" = "Error al obtener el certificado X25519." "getNewX25519CertError" = "Error al obtener el certificado X25519."
"getNewmldsa65Error" = "Error al obtener el certificado mldsa65."
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "Pedido" "request" = "Pedido"

View file

@ -262,6 +262,7 @@
"resetInboundClientTrafficSuccess" = "ترافیک بازنشانی شد" "resetInboundClientTrafficSuccess" = "ترافیک بازنشانی شد"
"trafficGetError" = "خطا در دریافت ترافیک‌ها" "trafficGetError" = "خطا در دریافت ترافیک‌ها"
"getNewX25519CertError" = "خطا در دریافت گواهی X25519." "getNewX25519CertError" = "خطا در دریافت گواهی X25519."
"getNewmldsa65Error" = "خطا در دریافت گواهی mldsa65."
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "درخواست" "request" = "درخواست"

View file

@ -262,6 +262,7 @@
"resetInboundClientTrafficSuccess" = "Lalu lintas telah direset" "resetInboundClientTrafficSuccess" = "Lalu lintas telah direset"
"trafficGetError" = "Gagal mendapatkan data lalu lintas" "trafficGetError" = "Gagal mendapatkan data lalu lintas"
"getNewX25519CertError" = "Terjadi kesalahan saat mendapatkan sertifikat X25519." "getNewX25519CertError" = "Terjadi kesalahan saat mendapatkan sertifikat X25519."
"getNewmldsa65Error" = "Terjadi kesalahan saat mendapatkan sertifikat mldsa65."
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "Permintaan" "request" = "Permintaan"

View file

@ -262,6 +262,7 @@
"resetInboundClientTrafficSuccess" = "トラフィックがリセットされました" "resetInboundClientTrafficSuccess" = "トラフィックがリセットされました"
"trafficGetError" = "トラフィックの取得中にエラーが発生しました" "trafficGetError" = "トラフィックの取得中にエラーが発生しました"
"getNewX25519CertError" = "X25519証明書の取得中にエラーが発生しました。" "getNewX25519CertError" = "X25519証明書の取得中にエラーが発生しました。"
"getNewmldsa65Error" = "mldsa65証明書の取得中にエラーが発生しました。"
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "リクエスト" "request" = "リクエスト"

View file

@ -262,6 +262,7 @@
"resetInboundClientTrafficSuccess" = "O tráfego foi reiniciado" "resetInboundClientTrafficSuccess" = "O tráfego foi reiniciado"
"trafficGetError" = "Erro ao obter tráfegos" "trafficGetError" = "Erro ao obter tráfegos"
"getNewX25519CertError" = "Erro ao obter o certificado X25519." "getNewX25519CertError" = "Erro ao obter o certificado X25519."
"getNewmldsa65Error" = "Erro ao obter o certificado mldsa65."
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "Requisição" "request" = "Requisição"

View file

@ -262,6 +262,7 @@
"resetInboundClientTrafficSuccess" = "Трафик сброшен" "resetInboundClientTrafficSuccess" = "Трафик сброшен"
"trafficGetError" = "Ошибка получения данных о трафике" "trafficGetError" = "Ошибка получения данных о трафике"
"getNewX25519CertError" = "Ошибка при получении сертификата X25519." "getNewX25519CertError" = "Ошибка при получении сертификата X25519."
"getNewmldsa65Error" = "Ошибка при получении сертификата mldsa65."
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "Запрос" "request" = "Запрос"

View file

@ -262,6 +262,7 @@
"resetInboundClientTrafficSuccess" = "Trafik sıfırlandı" "resetInboundClientTrafficSuccess" = "Trafik sıfırlandı"
"trafficGetError" = "Trafik bilgisi alınırken hata oluştu" "trafficGetError" = "Trafik bilgisi alınırken hata oluştu"
"getNewX25519CertError" = "X25519 sertifikası alınırken hata oluştu." "getNewX25519CertError" = "X25519 sertifikası alınırken hata oluştu."
"getNewmldsa65Error" = "mldsa65 sertifikası alınırken hata oluştu."
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "İstek" "request" = "İstek"

View file

@ -262,6 +262,7 @@
"resetInboundClientTrafficSuccess" = "Трафік скинуто" "resetInboundClientTrafficSuccess" = "Трафік скинуто"
"trafficGetError" = "Помилка отримання даних про трафік" "trafficGetError" = "Помилка отримання даних про трафік"
"getNewX25519CertError" = "Помилка при отриманні сертифіката X25519." "getNewX25519CertError" = "Помилка при отриманні сертифіката X25519."
"getNewmldsa65Error" = "Помилка при отриманні сертифіката mldsa65."
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "Запит" "request" = "Запит"

View file

@ -262,6 +262,7 @@
"resetInboundClientTrafficSuccess" = "Đã đặt lại lưu lượng" "resetInboundClientTrafficSuccess" = "Đã đặt lại lưu lượng"
"trafficGetError" = "Lỗi khi lấy thông tin lưu lượng" "trafficGetError" = "Lỗi khi lấy thông tin lưu lượng"
"getNewX25519CertError" = "Lỗi khi lấy chứng chỉ X25519." "getNewX25519CertError" = "Lỗi khi lấy chứng chỉ X25519."
"getNewmldsa65Error" = "Lỗi khi lấy chúng tôi mldsa65."
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "Lời yêu cầu" "request" = "Lời yêu cầu"

View file

@ -262,6 +262,7 @@
"resetInboundClientTrafficSuccess" = "流量已重置" "resetInboundClientTrafficSuccess" = "流量已重置"
"trafficGetError" = "获取流量数据时出错" "trafficGetError" = "获取流量数据时出错"
"getNewX25519CertError" = "获取X25519证书时出错。" "getNewX25519CertError" = "获取X25519证书时出错。"
"getNewmldsa65Error" = "获取mldsa65证书时出错。"
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "请求" "request" = "请求"

View file

@ -264,6 +264,7 @@
"resetInboundClientTrafficSuccess" = "流量已重置" "resetInboundClientTrafficSuccess" = "流量已重置"
"trafficGetError" = "取得流量資料時發生錯誤" "trafficGetError" = "取得流量資料時發生錯誤"
"getNewX25519CertError" = "取得X25519憑證時發生錯誤。" "getNewX25519CertError" = "取得X25519憑證時發生錯誤。"
"getNewmldsa65Error" = "取得mldsa65憑證時發生錯誤。"
[pages.inbounds.stream.general] [pages.inbounds.stream.general]
"request" = "請求" "request" = "請求"