mirror of
https://github.com/signalapp/libsignal.git
synced 2024-09-20 20:03:07 +02:00
83 lines
2.1 KiB
TypeScript
83 lines
2.1 KiB
TypeScript
//
|
|
// Copyright 2023 Signal Messenger, LLC.
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
/* eslint @typescript-eslint/no-shadow: ["error", { "allow": ["hash"] }] */
|
|
|
|
import { randomBytes } from 'crypto';
|
|
import { RANDOM_LENGTH } from './zkgroup/internal/Constants';
|
|
import * as Native from '../Native';
|
|
|
|
export type UsernameLink = { entropy: Buffer; encryptedUsername: Buffer };
|
|
|
|
export function generateCandidates(
|
|
nickname: string,
|
|
minNicknameLength: number,
|
|
maxNicknameLength: number
|
|
): string[] {
|
|
return Native.Username_CandidatesFrom(
|
|
nickname,
|
|
minNicknameLength,
|
|
maxNicknameLength
|
|
).split(',');
|
|
}
|
|
|
|
export function fromParts(
|
|
nickname: string,
|
|
discriminator: string,
|
|
minNicknameLength: number,
|
|
maxNicknameLength: number
|
|
): { username: string; hash: Buffer } {
|
|
const hash = Native.Username_HashFromParts(
|
|
nickname,
|
|
discriminator,
|
|
minNicknameLength,
|
|
maxNicknameLength
|
|
);
|
|
// If we generated the hash correctly, we can format the nickname and discriminator manually.
|
|
const username = `${nickname}.${discriminator}`;
|
|
return { username, hash };
|
|
}
|
|
|
|
export function hash(username: string): Buffer {
|
|
return Native.Username_Hash(username);
|
|
}
|
|
|
|
export function generateProof(username: string): Buffer {
|
|
const random = randomBytes(RANDOM_LENGTH);
|
|
return generateProofWithRandom(username, random);
|
|
}
|
|
|
|
export function generateProofWithRandom(
|
|
username: string,
|
|
random: Buffer
|
|
): Buffer {
|
|
return Native.Username_Proof(username, random);
|
|
}
|
|
|
|
export function decryptUsernameLink(usernameLink: UsernameLink): string {
|
|
return Native.UsernameLink_DecryptUsername(
|
|
usernameLink.entropy,
|
|
usernameLink.encryptedUsername
|
|
);
|
|
}
|
|
|
|
export function createUsernameLink(
|
|
username: string,
|
|
previousEntropy?: Buffer
|
|
): UsernameLink {
|
|
const usernameLinkData = Native.UsernameLink_Create(
|
|
username,
|
|
previousEntropy ?? null
|
|
);
|
|
const entropy = usernameLinkData.slice(0, 32);
|
|
const encryptedUsername = usernameLinkData.slice(32);
|
|
return { entropy, encryptedUsername };
|
|
}
|
|
|
|
// Only for testing. Will throw on failure.
|
|
export function verifyProof(proof: Buffer, hash: Buffer): void {
|
|
Native.Username_Verify(proof, hash);
|
|
}
|