Files
3x-ui-agent/docs/lib/xray/reality.test.ts
T
Sanaei f727d04f65
Release 3X-UI for Docker / build (push) Canceled after 0s
Release 3X-UI / build (386) (push) Canceled after 0s
Release 3X-UI / build (amd64) (push) Canceled after 0s
Release 3X-UI / build (arm64) (push) Canceled after 0s
Release 3X-UI / build (armv5) (push) Canceled after 0s
Release 3X-UI / build (armv6) (push) Canceled after 0s
Release 3X-UI / build (armv7) (push) Canceled after 0s
Release 3X-UI / build (s390x) (push) Canceled after 0s
Release 3X-UI / Build for Windows (amd64) (push) Canceled after 0s
Release 3X-UI / Publish rolling dev release (push) Canceled after 0s
v3.7.0
2026-08-24 15:07:15 +02:00

84 lines
2.8 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import {
generateX25519KeyPair,
isX25519Available,
randomShortId,
realityClientLink,
realityServerInbound,
type RealityConfig,
} from './reality';
import { base64UrlToBytes } from './base64';
import { parseLink } from './links';
describe('X25519 keygen', () => {
it('is available in this environment (Node 22+ / modern browser)', () => {
expect(isX25519Available()).toBe(true);
});
it('produces 32-byte base64url keys that differ', async () => {
const { privateKey, publicKey } = await generateX25519KeyPair();
expect(privateKey).not.toMatch(/[+/=]/);
expect(publicKey).not.toMatch(/[+/=]/);
expect(base64UrlToBytes(privateKey)).toHaveLength(32);
expect(base64UrlToBytes(publicKey)).toHaveLength(32);
expect(privateKey).not.toEqual(publicKey);
});
it('generates a fresh keypair each call', async () => {
const a = await generateX25519KeyPair();
const b = await generateX25519KeyPair();
expect(a.privateKey).not.toEqual(b.privateKey);
});
});
describe('randomShortId', () => {
it('returns lowercase hex of the requested byte length', () => {
const id = randomShortId(4);
expect(id).toMatch(/^[0-9a-f]{8}$/);
});
});
const CONFIG: RealityConfig = {
address: 'example.com',
port: 443,
uuid: '11111111-2222-3333-4444-555555555555',
dest: 'www.microsoft.com:443',
serverNames: ['www.microsoft.com'],
shortIds: ['ab12'],
privateKey: 'PRIV',
publicKey: 'PUB',
fingerprint: 'chrome',
spiderX: '/',
flow: 'xtls-rprx-vision',
};
describe('realityClientLink', () => {
it('builds a parseable vless link with the public REALITY params', () => {
const link = realityClientLink(CONFIG);
const parsed = parseLink(link);
expect(parsed.protocol).toBe('vless');
expect(parsed.credential).toBe(CONFIG.uuid);
expect(parsed.port).toBe(443);
expect(parsed.params.security).toBe('reality');
expect(parsed.params.pbk).toBe('PUB');
expect(parsed.params.sid).toBe('ab12');
expect(parsed.params.sni).toBe('www.microsoft.com');
expect(parsed.params.flow).toBe('xtls-rprx-vision');
// The private key must never appear in a client link.
expect(link).not.toContain('PRIV');
});
});
describe('realityServerInbound', () => {
it('produces a vless+reality inbound with the private key', () => {
const inbound = realityServerInbound(CONFIG) as {
protocol: string;
streamSettings: { security: string; realitySettings: { privateKey: string; dest: string } };
};
expect(inbound.protocol).toBe('vless');
expect(inbound.streamSettings.security).toBe('reality');
expect(inbound.streamSettings.realitySettings.privateKey).toBe('PRIV');
expect(inbound.streamSettings.realitySettings.dest).toBe('www.microsoft.com:443');
});
});