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
84 lines
2.8 KiB
TypeScript
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');
|
|
});
|
|
});
|