@crossdyne/security 0.2.0-beta.1 → 0.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/security.utils.ts","../src/crypto/crypto.service.ts","../src/crypto/key-derivation.service.ts","../src/srp/srp.service.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export class SecurityUtils {\r\n static readonly MODULUS_SIZE : number = 384;\r\n static readonly NONCE_SIZE : number = 12;\r\n static readonly TAG_SIZE : number = 16;\r\n static readonly KEY_SIZE : number = 32;\r\n\r\n static readonly N : bigint = BigInt(\"0xAC6BDB41324A9A9BF166DE5E1F403D434A6E1B3B94A7E62AC1211858E002C75AD4455C9D19C0A3180296917A376205164043E20144FF485719D181A99EB574671AC58054457ED444A67032EA17D03AD43464D2397449CA593630A670D90D95A78E846A3C8AF80862098D80F33C42ED7059E75225E0A52718E2379369F65B79680A6560B080092EE71986066735A96A7D42E7597116742B02D3A154471B6A23D84E0D642C790D597A2BB7F5A48F734898BDD138C69493E723491959C1B4BD40C91C1C7924F88D046467A006507E781220A80C55A927906A7C6C9C227E674686DD5D1B855D28F0D604E24586C608630B9A34C4808381A54F0D9080A5F90B60187F\");\r\n static readonly g : bigint = BigInt(2);\r\n static readonly k : bigint = BigInt(\"0xD55AE1AEC9F9115621E93E16E5DE4517DF8450D0957024D1256AA32B71E4E412\");\r\n\r\n /* \r\n Base64 helpers\r\n */\r\n\r\n static toBase64(bytes: Uint8Array): string {\r\n let binary = '';\r\n for (let i = 0; i < bytes.byteLength; i++)\r\n binary += String.fromCharCode(bytes[i]);\r\n\r\n return window.btoa(binary);\r\n }\r\n\r\n static fromBase64(base64: string): Uint8Array {\r\n const cleaned = base64.replace(/-/g, '+').replace(/_/g, '/').replace(/\\s/g, '');\r\n const binary = window.atob(cleaned);\r\n const bytes = new Uint8Array(binary.length);\r\n\r\n for (let i = 0; i < binary.length; i++)\r\n bytes[i] = binary.charCodeAt(i);\r\n\r\n return bytes;\r\n }\r\n\r\n /* \r\n BigInt helpers\r\n */\r\n\r\n static bytesToBigInt = (bytes: Uint8Array): bigint => BigInt('0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join(''));\r\n\r\n static bigIntToFixedBytes(bn: bigint, length: number): Uint8Array {\r\n let hex = bn.toString(16);\r\n\r\n if (hex.length % 2 !== 0) \r\n hex = '0' + hex;\r\n\r\n if (hex.length > length * 2) \r\n throw new Error(`Значение слишком велико для ${length} байт`);\r\n \r\n hex = hex.padStart(length * 2, '0');\r\n\r\n return this.fromHex(hex);\r\n }\r\n\r\n private static fromHex(hex: string): Uint8Array {\r\n const matches = hex.match(/.{1,2}/g);\r\n return new Uint8Array(matches ? matches.map(byte => parseInt(byte, 16)) : []);\r\n } \r\n\r\n /* \r\n Math\r\n */ \r\n \r\n static expMod(base: bigint, exp: bigint, mod: bigint): bigint {\r\n let res = BigInt(1);\r\n base = base % mod;\r\n\r\n while (exp > 0) {\r\n if (exp % BigInt(2) === BigInt(1)) res = (res * base) % mod;\r\n base = (base * base) % mod;\r\n exp = exp / BigInt(2);\r\n }\r\n\r\n return res;\r\n }\r\n\r\n /* \r\n SRP helper\r\n */ \r\n static async hashAsPerSrp6a(items: { value: bigint; length: number }[]): Promise<bigint> {\r\n const buffers = items.map(({ value, length }) => this.bigIntToFixedBytes(value, length));\r\n const totalLen = buffers.reduce((sum, buf) => sum + buf.length, 0);\r\n const combined = new Uint8Array(totalLen);\r\n\r\n let offset = 0;\r\n\r\n for (const buf of buffers) {\r\n combined.set(buf, offset);\r\n offset += buf.length;\r\n }\r\n\r\n const hash = await crypto.subtle.digest('SHA-256', combined);\r\n\r\n return this.bytesToBigInt(new Uint8Array(hash));\r\n }\r\n}","import { SecurityUtils } from '../utils/index.js'\r\n\r\nexport class CryptoService {\r\n\r\n async encryptData<T>(dataModel: T, key: Uint8Array): Promise<string> {\r\n const encoder = new TextEncoder();\r\n let jsonString: string;\r\n if (dataModel instanceof Uint8Array) {\r\n jsonString = `\"${SecurityUtils.toBase64(dataModel)}\"`;\r\n } else {\r\n jsonString = JSON.stringify(dataModel);\r\n }\r\n const plainBytes = encoder.encode(jsonString);\r\n const nonce = crypto.getRandomValues(new Uint8Array(SecurityUtils.NONCE_SIZE));\r\n\r\n const cryptoKey = await crypto.subtle.importKey(\r\n 'raw', \r\n key as BufferSource, \r\n 'AES-GCM', \r\n false, \r\n ['encrypt']);\r\n\r\n const encryptedContent = await crypto.subtle.encrypt({ \r\n name: 'AES-GCM',\r\n iv: nonce, \r\n tagLength: SecurityUtils.TAG_SIZE * 8},\r\n cryptoKey,\r\n plainBytes\r\n );\r\n\r\n const result = new Uint8Array(SecurityUtils.NONCE_SIZE + encryptedContent.byteLength);\r\n result.set(nonce, 0);\r\n result.set(new Uint8Array(encryptedContent), SecurityUtils.NONCE_SIZE);\r\n \r\n return SecurityUtils.toBase64(result);\r\n }\r\n\r\n async decryptedData<T>(encryptedBase64: string, key: Uint8Array): Promise<T | null>{\r\n if (!encryptedBase64) \r\n return null;\r\n\r\n const encryptedBytes = SecurityUtils.fromBase64(encryptedBase64);\r\n\r\n if (encryptedBytes.length < SecurityUtils.NONCE_SIZE + SecurityUtils.TAG_SIZE)\r\n throw new Error('Недопустимый формат зашифрованных данных');\r\n\r\n const nonce = encryptedBytes.slice(0, SecurityUtils.NONCE_SIZE);\r\n const ciphertextWithTag = encryptedBytes.slice(SecurityUtils.NONCE_SIZE);\r\n\r\n const cryptoKey = await crypto.subtle.importKey(\r\n 'raw',\r\n key as BufferSource, \r\n 'AES-GCM', \r\n false,\r\n ['decrypt']);\r\n\r\n try {\r\n const decryptedBuffer = await crypto.subtle.decrypt({ \r\n name: 'AES-GCM',\r\n iv: nonce,\r\n tagLength: \r\n SecurityUtils.TAG_SIZE * 8\r\n },\r\n cryptoKey,\r\n ciphertextWithTag);\r\n\r\n const decoder = new TextDecoder();\r\n const jsonString = decoder.decode(decryptedBuffer);\r\n\r\n return JSON.parse(jsonString) as T;\r\n } catch (e) {\r\n console.error('Ошибка дешифрования:', e);\r\n return null;\r\n }\r\n }\r\n\r\n generateRandomBytes = (length = 32): Uint8Array => crypto.getRandomValues(new Uint8Array(length));\r\n}","import { SecurityUtils } from \"../utils/security.utils.js\";\r\n\r\nexport class KeyDerivationService{\r\n readonly ITERATIONS = 600_000;\r\n readonly KEY_SIZE = 32;\r\n\r\n async deriveKeysFromPassword(login: string, password: string, salt: Uint8Array): Promise<{ kek: Uint8Array; authHash: string }> {\r\n const safeSalt = new Uint8Array(salt);\r\n \r\n const encoder = new TextEncoder();\r\n const normalizedLogin = login.trim().toLocaleLowerCase();\r\n const combinedPassword = `${normalizedLogin}:${password}`;\r\n const passwordBytes = encoder.encode(combinedPassword);\r\n const baseKey = await crypto.subtle.importKey('raw', passwordBytes, 'PBKDF2', false, ['deriveBits', 'deriveKey']);\r\n\r\n const masterKeyBits = await crypto.subtle.deriveBits({\r\n name: 'PBKDF2',\r\n salt: safeSalt, \r\n iterations: this.ITERATIONS,\r\n hash: 'SHA-256'\r\n }, baseKey, this.KEY_SIZE * 8);\r\n\r\n const masterKey = await crypto.subtle.importKey('raw', masterKeyBits, 'HKDF', false, ['deriveBits']);\r\n\r\n const kek = await crypto.subtle.deriveBits(\r\n { name: 'HKDF', hash: 'SHA-256', salt: new Uint8Array(0), info: encoder.encode('AES-GCM-KEK-v1') },\r\n masterKey,\r\n this.KEY_SIZE * 8\r\n );\r\n\r\n const authBytes = await crypto.subtle.deriveBits(\r\n { name: 'HKDF', hash: 'SHA-256', salt: new Uint8Array(0), info: encoder.encode('SERVER-AUTH-HASH-v1') },\r\n masterKey,\r\n this.KEY_SIZE * 8\r\n );\r\n\r\n return {\r\n kek: new Uint8Array(kek),\r\n authHash: SecurityUtils.toBase64(new Uint8Array(authBytes)),\r\n };\r\n }\r\n}","import { KeyDerivationService } from '../crypto/index.js';\r\nimport { SecurityUtils } from '../utils/index.js';\r\n\r\nexport class SrpService {\r\n private readonly keyDerivation = new KeyDerivationService();\r\n\r\n async generateSrpVerifier(authHash: string): Promise<string> {\r\n const x = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(authHash));\r\n const v = SecurityUtils.expMod(SecurityUtils.g, x, SecurityUtils.N);\r\n return SecurityUtils.toBase64(SecurityUtils.bigIntToFixedBytes(v, SecurityUtils.MODULUS_SIZE));\r\n }\r\n\r\n async generateSrpProof(login: string, password: string, saltBase64: string, B_base64: string): Promise<{ A: string; M1: string; S: string }> {\r\n const salt = SecurityUtils.fromBase64(saltBase64);\r\n const { authHash } = await this.keyDerivation.deriveKeysFromPassword(login, password, salt);\r\n const x = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(authHash));\r\n\r\n const aBytes = crypto.getRandomValues(new Uint8Array(32));\r\n const a = SecurityUtils.bytesToBigInt(aBytes);\r\n\r\n const A = SecurityUtils.expMod(SecurityUtils.g, a, SecurityUtils.N);\r\n if (A % SecurityUtils.N === 0n) \r\n throw new Error('Критическая ошибка: A % N === 0');\r\n\r\n const B = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(B_base64));\r\n if (B % SecurityUtils.N === 0n) \r\n throw new Error('Критическая ошибка: B % N === 0');\r\n\r\n const u = await SecurityUtils.hashAsPerSrp6a([\r\n { value: A, length: SecurityUtils.MODULUS_SIZE },\r\n { value: B, length: SecurityUtils.MODULUS_SIZE },\r\n ]);\r\n if (u === 0n) \r\n throw new Error('Недопустимое значение u');\r\n\r\n const gX = SecurityUtils.expMod(SecurityUtils.g, x, SecurityUtils.N);\r\n const term = (SecurityUtils.k * gX) % SecurityUtils.N;\r\n const base = (B - term + SecurityUtils.N) % SecurityUtils.N;\r\n const exponent = a + (u * x);\r\n const S = SecurityUtils.expMod(base, exponent, SecurityUtils.N);\r\n\r\n if (S === 0n) \r\n throw new Error('Критическая ошибка: S === 0');\r\n\r\n const M1 = await SecurityUtils.hashAsPerSrp6a([\r\n { value: A, length: SecurityUtils.MODULUS_SIZE },\r\n { value: B, length: SecurityUtils.MODULUS_SIZE },\r\n { value: S, length: SecurityUtils.MODULUS_SIZE },\r\n ]);\r\n\r\n return {\r\n A: SecurityUtils.toBase64(SecurityUtils.bigIntToFixedBytes(A, SecurityUtils.MODULUS_SIZE)),\r\n M1: SecurityUtils.toBase64(SecurityUtils.bigIntToFixedBytes(M1, 32)),\r\n S: SecurityUtils.toBase64(SecurityUtils.bigIntToFixedBytes(S, SecurityUtils.MODULUS_SIZE)),\r\n };\r\n }\r\n\r\n async verifyServerM2(A_b64: string, M1_b64: string, S_b64: string, serverM2_b64: string): Promise<boolean> {\r\n const A = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(A_b64));\r\n const M1 = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(M1_b64));\r\n const S = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(S_b64));\r\n\r\n const computedM2 = await SecurityUtils.hashAsPerSrp6a([\r\n { value: A, length: SecurityUtils.MODULUS_SIZE },\r\n { value: M1, length: 32 },\r\n { value: S, length: SecurityUtils.MODULUS_SIZE },\r\n ]);\r\n const computedM2_b64 = SecurityUtils.toBase64(SecurityUtils.bigIntToFixedBytes(computedM2, 32));\r\n\r\n return serverM2_b64 === computedM2_b64;\r\n }\r\n}"]}
1
+ {"version":3,"sources":["../src/configurations/security-constants.ts","../src/configurations/supported-hash-algorithms.ts","../src/utils/security.utils.ts","../src/crypto/aes-gcm-options.ts","../src/crypto/crypto.service.ts","../src/crypto/kdf-options.ts","../src/crypto/key-derivation.service.ts","../src/crypto/crypto-version.ts","../src/crypto/crypto-profile.ts","../src/crypto/crypto-profile-registry.ts","../src/utils/srp-encoding.ts","../src/srp/srp-client-service.ts","../src/srp/srp-server-service.ts","../src/srp/srp-group.ts","../src/srp/srp-group-params.ts","../src/srp/srp-options.ts","../src/srp/srp-context-factory.ts"],"names":["CryptoVersion","SrpGroup"],"mappings":"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","file":"index.js","sourcesContent":["export const SecurityConstants = {\r\n AesGcmNonceSize: 12,\r\n AesGcmTagSize: 16,\r\n AesGcmTagSizeMin: 12,\r\n AesGcmTagSizeMax: 16,\r\n KeySizeBytes: 32, // 256 bits\r\n Pbkdf2IterationsDefault: 600_000,\r\n Pbkdf2IterationsMinimum: 100_000\r\n} as const;","import { HashAlgorithm } from \"../crypto/hash-algorithm.js\";\r\n\r\nexport const SupportedHashAlgorithms: ReadonlyArray<HashAlgorithm> = ['SHA-256', 'SHA-384', 'SHA-512'] as const;","/**\r\n * Cryptographic utility functions: Base64, BigInteger conversion, constant-time comparison, modular exponentiation.\r\n */\r\nexport class SecurityUtils {\r\n\r\n /** Encodes Uint8Array to standard Base64. */\r\n static toBase64(bytes: Uint8Array): string {\r\n let binary = '';\r\n\r\n for (let i = 0; i < bytes.length; i++) \r\n binary += String.fromCharCode(bytes[i]);\r\n\r\n return btoa(binary);\r\n }\r\n\r\n /** Decodes URL-safe or standard Base64 to Uint8Array. */\r\n static fromBase64(base64: string): Uint8Array {\r\n let cleaned = base64.replace(/-/g, '+').replace(/_/g, '/').replace(/\\s/g, '');\r\n const mod = cleaned.length % 4;\r\n\r\n if (mod !== 0) {\r\n cleaned += '='.repeat(4 - mod);\r\n }\r\n\r\n const binary = atob(cleaned);\r\n const bytes = new Uint8Array(binary.length);\r\n\r\n for (let i = 0; i < binary.length; i++)\r\n bytes[i] = binary.charCodeAt(i);\r\n\r\n return bytes;\r\n }\r\n\r\n /** Converts big-endian bytes to bigint. */\r\n static bytesToBigInt(bytes: Uint8Array): bigint {\r\n if (bytes.length === 0)\r\n return 0n;\r\n\r\n return BigInt('0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join(''));\r\n }\r\n\r\n /** Converts bigint to fixed-length big-endian bytes (pads/truncates). */\r\n static bigIntToFixedBytes(bn: bigint, length: number): Uint8Array {\r\n let hex = bn.toString(16);\r\n\r\n if (hex.length % 2 !== 0)\r\n hex = '0' + hex;\r\n\r\n if (hex.length > length * 2) \r\n hex = hex.slice(hex.length - length * 2);\r\n else \r\n hex = hex.padStart(length * 2, '0');\r\n\r\n return new Uint8Array(hex.match(/.{1,2}/g)?.map(b => parseInt(b, 16)) || []);\r\n }\r\n\r\n /** Constant-time comparison of two Uint8Arrays. */\r\n static fixedTimeEquals(a: Uint8Array, b: Uint8Array): boolean {\r\n if (a.length !== b.length) \r\n return false;\r\n\r\n let diff = 0;\r\n\r\n for (let i = 0; i < a.length; i++) \r\n diff |= a[i] ^ b[i];\r\n return diff === 0;\r\n }\r\n \r\n /** Modular exponentiation (base^exp mod mod) using binary exponentiation. */\r\n static expMod(base: bigint, exp: bigint, mod: bigint): bigint {\r\n let res = BigInt(1);\r\n\r\n base = base % mod;\r\n\r\n while (exp > 0n) {\r\n if (exp % 2n === 1n)\r\n res = (res * base) % mod;\r\n\r\n base = (base * base) % mod;\r\n exp = exp / 2n;\r\n }\r\n \r\n return res;\r\n }\r\n}","import { SecurityConstants } from \"../configurations/security-constants.js\";\r\n\r\n/**\r\n * AES-GCM encryption options: nonce size, tag size, and optional AAD.\r\n * Mutable builder-style; call {@link build} to validate.\r\n */\r\nexport class AesGcmOptions {\r\n private _nonceSize: number = SecurityConstants.AesGcmNonceSize;\r\n private _tagSize: number = SecurityConstants.AesGcmTagSize;\r\n\r\n /** Optional Additional Authenticated Data (not encrypted). */\r\n public associatedData?: Uint8Array;\r\n\r\n /** Nonce size in bytes (must be 12). */\r\n get nonceSize(): number { return this._nonceSize; }\r\n set nonceSize(v: number) {\r\n if (v !== SecurityConstants.AesGcmNonceSize) throw new RangeError(`AES-GCM requires ${SecurityConstants.AesGcmNonceSize}-byte nonce`);\r\n this._nonceSize = v;\r\n }\r\n\r\n /** Tag size in bytes (12–16, default 16). */\r\n get tagSize(): number { return this._tagSize; }\r\n set tagSize(v: number) {\r\n if (v < SecurityConstants.AesGcmTagSizeMin || v > SecurityConstants.AesGcmTagSizeMax) throw new RangeError(`Tag size must be between ${SecurityConstants.AesGcmTagSizeMin} and ${SecurityConstants.AesGcmTagSizeMax}`);\r\n this._tagSize = v;\r\n }\r\n\r\n /** Validates that {@link tagSize} is in the allowed range. */\r\n validate(): void {\r\n if (this.tagSize < SecurityConstants.AesGcmTagSizeMin || this.tagSize > SecurityConstants.AesGcmTagSizeMax) throw new Error(`Invalid Tag Size: ${this.tagSize}`);\r\n }\r\n\r\n /** Default preset: nonce=12, tag=16, no AAD. */\r\n static get default(): AesGcmOptions { return new AesGcmOptions(); }\r\n\r\n /** Fluent setter for {@link tagSize}. */\r\n withTagSize(s: number): this { this.tagSize = s; return this; }\r\n\r\n /**\r\n * Fluent setter for {@link associatedData}.\r\n * Accepts a byte array or a UTF-8 string (encoded internally).\r\n */\r\n withAssociatedData(aad: Uint8Array | string | undefined): this {\r\n this.associatedData = typeof aad === 'string' ? new TextEncoder().encode(aad) : aad;\r\n return this;\r\n }\r\n\r\n /** Validates and returns this instance. */\r\n build(): AesGcmOptions { this.validate(); return this; }\r\n}","import { SecurityUtils } from '../utils/security.utils.js';\r\nimport { AesGcmOptions } from './aes-gcm-options.js';\r\n\r\n/**\r\n * AES-GCM encryption/decryption service with JSON serialization.\r\n * Encrypted output format (Base64): [Nonce][Ciphertext+Tag].\r\n */\r\nexport class CryptoService {\r\n\r\n /**\r\n * Encrypts a serializable object to a Base64 string.\r\n * @param dataModel - Object or Uint8Array to encrypt.\r\n * @param key - AES-256 key (32 bytes).\r\n * @param options - AES-GCM configuration; uses default if omitted.\r\n * @returns Base64-encoded ciphertext with prepended nonce.\r\n */\r\n async encryptData<T>(dataModel: T, key: Uint8Array, options?: AesGcmOptions): Promise<string> {\r\n const opts = options ?? AesGcmOptions.default;\r\n opts.validate();\r\n\r\n const encoder = new TextEncoder();\r\n let jsonString: string;\r\n if (dataModel instanceof Uint8Array) {\r\n jsonString = `\"${SecurityUtils.toBase64(dataModel)}\"`;\r\n } else {\r\n jsonString = JSON.stringify(dataModel);\r\n }\r\n\r\n const plainBytes = encoder.encode(jsonString);\r\n const nonce = crypto.getRandomValues(new Uint8Array(opts.nonceSize));\r\n\r\n const cryptoKey = await crypto.subtle.importKey(\r\n 'raw',\r\n key as BufferSource, \r\n 'AES-GCM',\r\n false,\r\n ['encrypt']\r\n );\r\n\r\n let associatedData: BufferSource = new Uint8Array(0);\r\n\r\n if (opts.associatedData != null){\r\n associatedData = opts.associatedData as BufferSource;\r\n }\r\n\r\n const encryptedContent = await crypto.subtle.encrypt(\r\n {\r\n name: 'AES-GCM',\r\n iv: nonce,\r\n tagLength: opts.tagSize * 8,\r\n additionalData: associatedData\r\n },\r\n cryptoKey,\r\n plainBytes\r\n );\r\n\r\n const result = new Uint8Array(opts.nonceSize + encryptedContent.byteLength);\r\n result.set(nonce, 0);\r\n result.set(new Uint8Array(encryptedContent), opts.nonceSize);\r\n return SecurityUtils.toBase64(result);\r\n }\r\n\r\n /**\r\n * Decrypts a Base64-encoded ciphertext back to the original object.\r\n * @param encryptedBase64 - The encrypted data.\r\n * @param key - AES-256 key (32 bytes).\r\n * @param options - AES-GCM configuration; uses default if omitted.\r\n * @returns Deserialized object, or null if input is empty.\r\n * @throws If authentication tag mismatch or corrupted data.\r\n */\r\n async decryptData<T>(encryptedBase64: string, key: Uint8Array, options?: AesGcmOptions): Promise<T | null> {\r\n if (!encryptedBase64)\r\n return null;\r\n\r\n const opts = options ?? AesGcmOptions.default;\r\n opts.validate();\r\n\r\n const encryptedBytes = SecurityUtils.fromBase64(encryptedBase64);\r\n\r\n if (encryptedBytes.length < opts.nonceSize + opts.tagSize)\r\n throw new Error(`Invalid format: minimum expected ${opts.nonceSize + opts.tagSize} byte.`);\r\n\r\n const nonce = encryptedBytes.slice(0, opts.nonceSize);\r\n const ciphertextWithTag = encryptedBytes.slice(opts.nonceSize);\r\n\r\n const cryptoKey = await crypto.subtle.importKey(\r\n 'raw',\r\n key as BufferSource,\r\n 'AES-GCM',\r\n false,\r\n ['decrypt']\r\n );\r\n\r\n try {\r\n\r\n let associatedData: BufferSource = new Uint8Array(0);\r\n\r\n if (opts.associatedData != null){\r\n associatedData = opts.associatedData as BufferSource;\r\n }\r\n\r\n const decryptedBuffer = await crypto.subtle.decrypt(\r\n {\r\n name: 'AES-GCM',\r\n iv: nonce,\r\n tagLength: opts.tagSize * 8,\r\n additionalData: associatedData\r\n },\r\n cryptoKey,\r\n ciphertextWithTag\r\n );\r\n\r\n const decoder = new TextDecoder();\r\n const jsonString = decoder.decode(decryptedBuffer);\r\n\r\n return JSON.parse(jsonString) as T;\r\n } catch (e) {\r\n console.error('Decryption error:', e);\r\n throw new Error(\"Decryption failed: authentication tag mismatch or corrupted data.\");\r\n }\r\n }\r\n\r\n /**\r\n * Generates cryptographically secure random bytes.\r\n * @param length - Number of bytes (default 32).\r\n * @returns Uint8Array of random bytes.\r\n */\r\n generateRandomBytes = (length = 32): Uint8Array => crypto.getRandomValues(new Uint8Array(length));\r\n}","import { SecurityConstants } from \"../configurations/security-constants.js\";\r\nimport { SupportedHashAlgorithms } from \"../configurations/supported-hash-algorithms.js\";\r\nimport { HashAlgorithm } from \"./hash-algorithm.js\";\r\n\r\n/**\r\n * PBKDF2 key derivation options: iterations count and hash algorithm.\r\n * Mutable builder-style; call {@link build} to validate.\r\n */\r\nexport class KdfOptions {\r\n private _pbkdf2Iterations: number = SecurityConstants.Pbkdf2IterationsDefault;\r\n private _hashAlgorithm: HashAlgorithm = 'SHA-256';\r\n\r\n /** PBKDF2 iteration count (minimum 100_000). */\r\n get pbkdf2Iterations(): number { return this._pbkdf2Iterations; }\r\n set pbkdf2Iterations(v: number) {\r\n if (v < SecurityConstants.Pbkdf2IterationsMinimum) \r\n throw new RangeError(`PBKDF2 iterations must be ≥ ${SecurityConstants.Pbkdf2IterationsMinimum}`);\r\n\r\n this._pbkdf2Iterations = v;\r\n }\r\n\r\n /** Hash algorithm used by PBKDF2. Must be one of {@link SupportedHashAlgorithms}. */\r\n get hashAlgorithm(): HashAlgorithm { return this._hashAlgorithm; }\r\n set hashAlgorithm(v: HashAlgorithm) {\r\n if (!SupportedHashAlgorithms.includes(v)) \r\n throw new RangeError(`Unsupported hash: ${v}`);\r\n this._hashAlgorithm = v;\r\n }\r\n\r\n /** Validates iterations and hash algorithm. */\r\n validate(): void {\r\n if (this.pbkdf2Iterations < SecurityConstants.Pbkdf2IterationsMinimum) \r\n throw new Error(`Pbkdf2Iterations (${this.pbkdf2Iterations}) below minimum`);\r\n\r\n if (!SupportedHashAlgorithms.includes(this.hashAlgorithm)) \r\n throw new Error(`Invalid hash algorithm: ${this.hashAlgorithm}`);\r\n }\r\n\r\n /** Default preset: SHA-256, 600_000 iterations. */\r\n static get default(): KdfOptions { return new KdfOptions(); }\r\n\r\n /** Fluent setter for {@link pbkdf2Iterations}. */\r\n withPbkdf2Iterations(i: number): this { \r\n this.pbkdf2Iterations = i; \r\n return this; \r\n }\r\n\r\n /** Fluent setter for {@link hashAlgorithm}. */\r\n withHashAlgorithm(h: HashAlgorithm): this { \r\n this.hashAlgorithm = h; \r\n return this; \r\n }\r\n\r\n /** Validates and returns this instance. */\r\n build(): KdfOptions { \r\n this.validate(); \r\n return this; \r\n }\r\n}","import { SecurityConstants } from \"../configurations/security-constants.js\";\r\nimport { SecurityUtils } from \"../utils/security.utils.js\";\r\nimport { HashAlgorithm } from \"./hash-algorithm.js\";\r\nimport { KdfOptions } from \"./kdf-options.js\";\r\n\r\n/**\r\n * Two-stage key derivation: PBKDF2 (master key) → HKDF (sub-keys).\r\n */\r\nexport class KeyDerivationService {\r\n\r\n /**\r\n * Derives KEK and Base64 AuthHash. Identity is normalized (trimmed, lowercase).\r\n * @param identity - User identity (email, username).\r\n * @param password - User password.\r\n * @param salt - Random salt.\r\n * @param options - KDF configuration; uses default if omitted.\r\n * @returns Object with `kek` (Uint8Array) and `authHash` (Base64 string).\r\n */\r\n async deriveKeysFromPassword(identity: string, password: string, salt: Uint8Array, options?: KdfOptions): Promise<{ kek: Uint8Array; authHash: string }> {\r\n const opts = options ?? KdfOptions.default;\r\n opts.validate();\r\n\r\n const safeSalt = new Uint8Array(salt);\r\n const encoder = new TextEncoder();\r\n\r\n const normalizedLogin = identity.trim().toLowerCase();\r\n const combinedPassword = `${normalizedLogin}:${password}`;\r\n const passwordBytes = encoder.encode(combinedPassword);\r\n const baseKey = await crypto.subtle.importKey('raw', passwordBytes, 'PBKDF2', false, ['deriveBits', 'deriveKey']);\r\n\r\n const masterKeyBits = await crypto.subtle.deriveBits({\r\n name: 'PBKDF2',\r\n salt: safeSalt,\r\n iterations: opts.pbkdf2Iterations,\r\n hash: opts.hashAlgorithm\r\n }, baseKey, SecurityConstants.KeySizeBytes * 8);\r\n\r\n const masterKey = await crypto.subtle.importKey('raw', masterKeyBits, 'HKDF', false, ['deriveBits']);\r\n\r\n const kek = await crypto.subtle.deriveBits(\r\n { name: 'HKDF', hash: opts.hashAlgorithm, salt: new Uint8Array(0), info: encoder.encode('AES-GCM-KEK-v1') },\r\n masterKey,\r\n SecurityConstants.KeySizeBytes * 8\r\n );\r\n\r\n const authBytes = await crypto.subtle.deriveBits(\r\n { name: 'HKDF', hash: opts.hashAlgorithm, salt: new Uint8Array(0), info: encoder.encode('SERVER-AUTH-HASH-v1') },\r\n masterKey,\r\n SecurityConstants.KeySizeBytes * 8\r\n );\r\n\r\n return {\r\n kek: new Uint8Array(kek),\r\n authHash: SecurityUtils.toBase64(new Uint8Array(authBytes)),\r\n };\r\n }\r\n\r\n /**\r\n * Derives an SRP-compatible authentication hash (output size = hash output length).\r\n * @param identity - User identity.\r\n * @param password - User password.\r\n * @param salt - Random salt.\r\n * @param srpHashAlgorithm - SRP hash algorithm (SHA-256/384/512).\r\n * @param options - KDF configuration; uses default if omitted.\r\n * @returns Raw hash bytes for use as SRP verifier input (x).\r\n */\r\n async deriveAuthHashForSrp(identity: string, password: string, salt: Uint8Array, srpHashAlgorithm: HashAlgorithm, options?: KdfOptions): Promise<Uint8Array> {\r\n const opts = options ?? KdfOptions.default;\r\n opts.validate();\r\n\r\n const srpHashSize = srpHashAlgorithm === 'SHA-256' ? 32 : srpHashAlgorithm === 'SHA-384' ? 48 : 64;\r\n\r\n const normalizedLogin = identity.trim().toLowerCase();\r\n const combinedPassword = `${normalizedLogin}:${password}`;\r\n const passwordBytes = new TextEncoder().encode(combinedPassword);\r\n\r\n const baseKey = await crypto.subtle.importKey(\r\n 'raw', \r\n passwordBytes as BufferSource, \r\n 'PBKDF2', \r\n false, \r\n ['deriveBits']\r\n );\r\n\r\n const masterKeyBits = await crypto.subtle.deriveBits({\r\n name: 'PBKDF2',\r\n salt: salt as BufferSource,\r\n iterations: opts.pbkdf2Iterations,\r\n hash: srpHashAlgorithm\r\n }, baseKey, SecurityConstants.KeySizeBytes * 8);\r\n\r\n const masterKey = await crypto.subtle.importKey(\r\n 'raw', \r\n masterKeyBits, \r\n 'HKDF', \r\n false, \r\n ['deriveBits']\r\n );\r\n\r\n const info = new TextEncoder().encode('SRP-AUTH-HASH-v1');\r\n const authBytes = await crypto.subtle.deriveBits(\r\n { \r\n name: 'HKDF', \r\n hash: srpHashAlgorithm, \r\n salt: new Uint8Array(0) as BufferSource, \r\n info: info as BufferSource \r\n },\r\n masterKey,\r\n srpHashSize * 8\r\n );\r\n\r\n return new Uint8Array(authBytes);\r\n }\r\n}","/**\r\n * Supported cryptographic profile versions.\r\n * V1: baseline (PBKDF2-HMAC-SHA256, AES-256-GCM, 12-byte nonce, 16-byte tag).\r\n * Append new members sequentially; never change existing values.\r\n */\r\nexport enum CryptoVersion {\r\n\r\n /** Version 1 — initial profile. */\r\n V1 = 1,\r\n}","import { AesGcmOptions } from \"./aes-gcm-options.js\";\r\nimport { CryptoVersion } from \"./crypto-version.js\";\r\nimport { KdfOptions } from \"./kdf-options.js\";\r\n\r\n/**\r\n * Immutable cryptographic profile bundling version, KDF, and AES-GCM settings.\r\n * Thread-safe after construction.\r\n */\r\nexport class CryptoProfile {\r\n\r\n /** Protocol version, influencing KDF defaults, cipher modes, and serialization. */\r\n readonly version: CryptoVersion;\r\n\r\n /** Key derivation parameters (iterations, hash algorithm). */\r\n readonly kdfOptions: KdfOptions;\r\n\r\n /** AES-GCM encryption parameters (nonce size, tag size, AAD). */\r\n readonly aesGcmOptions: AesGcmOptions;\r\n\r\n /**\r\n * Creates a new CryptoProfile.\r\n * @param params - Object containing version, kdfOptions, aesGcmOptions.\r\n */\r\n constructor(params: {\r\n version: CryptoVersion;\r\n kdfOptions: KdfOptions;\r\n aesGcmOptions: AesGcmOptions;\r\n }) {\r\n this.version = params.version;\r\n this.kdfOptions = params.kdfOptions;\r\n this.aesGcmOptions = params.aesGcmOptions;\r\n }\r\n}","import { AesGcmOptions } from \"./aes-gcm-options.js\";\r\nimport { CryptoProfile } from \"./crypto-profile.js\";\r\nimport { CryptoVersion } from \"./crypto-version.js\";\r\nimport { KdfOptions } from \"./kdf-options.js\";\r\n\r\n/**\r\n * Registry of predefined {@link CryptoProfile} instances by version.\r\n * Returns a fresh profile per call.\r\n */\r\nexport class CryptoProfileRegistry {\r\n static getProfile(version: CryptoVersion): CryptoProfile {\r\n switch (version) {\r\n case CryptoVersion.V1:\r\n return new CryptoProfile({\r\n version: CryptoVersion.V1,\r\n kdfOptions: KdfOptions.default,\r\n aesGcmOptions: AesGcmOptions.default,\r\n });\r\n default:\r\n throw new Error(`Unsupported crypto version: ${version}`);\r\n }\r\n }\r\n\r\n /** Latest supported profile (currently V1). */\r\n static get latest(): CryptoProfile {\r\n return this.getProfile(CryptoVersion.V1);\r\n }\r\n}","import { HashAlgorithm } from \"../crypto/hash-algorithm.js\";\r\nimport { SrpContext } from \"../srp/srp-context.js\";\r\nimport { SecurityUtils } from \"./security.utils.js\";\r\n\r\n/**\r\n * SRP-specific serialization and hashing utilities.\r\n */\r\nexport class SrpEncoding {\r\n\r\n /** Serializes a bigint to modulus-sized big-endian bytes. */\r\n static toModulusBytes(ctx: SrpContext, value: bigint): Uint8Array {\r\n return SecurityUtils.bigIntToFixedBytes(value, ctx.modulusSize);\r\n }\r\n\r\n /** Serializes a bigint to hash-sized big-endian bytes. */\r\n static toHashBytes(ctx: SrpContext, value: bigint): Uint8Array {\r\n return SecurityUtils.bigIntToFixedBytes(value, ctx.hashSize);\r\n }\r\n\r\n /** Hashes modulus-sized values (e.g., u = H(A, B)). */\r\n static async hashModuli(ctx: SrpContext, ...values: bigint[]): Promise<bigint> {\r\n const buffers = values.map(v => this.toModulusBytes(ctx, v));\r\n return this.hash(ctx.hashAlgorithmName, ...buffers);\r\n }\r\n\r\n /** Computes M1 = H(A || B || sessionKeyK). */\r\n static async computeM1(ctx: SrpContext, A: bigint, B: bigint, sessionKeyK: Uint8Array): Promise<bigint> {\r\n return this.hash(ctx.hashAlgorithmName, this.toModulusBytes(ctx, A), this.toModulusBytes(ctx, B), sessionKeyK);\r\n }\r\n \r\n /** Computes M2 = H(A || M1 || sessionKeyK). */\r\n static async computeM2(ctx: SrpContext, A: bigint, M1: bigint, sessionKeyK: Uint8Array): Promise<bigint> {\r\n return this.hash(ctx.hashAlgorithmName, this.toModulusBytes(ctx, A), this.toHashBytes(ctx, M1), sessionKeyK);\r\n }\r\n \r\n /** Computes session key K = H(S). */\r\n static async computeSessionKey(ctx: SrpContext, S: bigint): Promise<Uint8Array> {\r\n const sBytes = this.toModulusBytes(ctx, S);\r\n const hashBuffer = await crypto.subtle.digest(\r\n ctx.hashAlgorithmName, \r\n sBytes as BufferSource\r\n );\r\n return new Uint8Array(hashBuffer);\r\n}\r\n\r\n/** Concatenates byte arrays and returns the hash as bigint. */\r\nprivate static async hash(algo: HashAlgorithm, ...buffers: Uint8Array[]): Promise<bigint> {\r\n const totalLen = buffers.reduce((sum, b) => sum + b.length, 0);\r\n const combined = new Uint8Array(totalLen);\r\n let offset = 0;\r\n for (const buf of buffers) { combined.set(buf, offset); offset += buf.length; }\r\n const hashBuffer = await crypto.subtle.digest(algo, combined);\r\n return SecurityUtils.bytesToBigInt(new Uint8Array(hashBuffer));\r\n }\r\n}","import { KeyDerivationService } from \"../crypto/key-derivation.service.js\";\r\nimport { SecurityUtils } from \"../utils/security.utils.js\";\r\nimport { SrpEncoding } from \"../utils/srp-encoding.js\";\r\nimport { SrpContext } from \"./srp-context.js\";\r\n\r\n/**\r\n * Client-side SRP-6a implementation: proof generation, verifier creation, server M2 verification.\r\n */\r\nexport class SrpClientService {\r\n private readonly keyDerivation = new KeyDerivationService();\r\n\r\n /**\r\n * Computes SRP verifier v = g^x mod N from the authentication hash.\r\n * @param authHash - Auth hash (Base64).\r\n * @param ctx - SRP context (N, g, hash algorithm, etc.).\r\n * @returns Verifier as Base64 string.\r\n */\r\n async generateSrpVerifier(authHash: string, ctx: SrpContext): Promise<string> {\r\n const x = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(authHash));\r\n const v = SecurityUtils.expMod(ctx.g, x, ctx.N);\r\n return SecurityUtils.toBase64(SrpEncoding.toModulusBytes(ctx, v));\r\n }\r\n\r\n /**\r\n * Generates client proof (A, M1, session key S) from server challenge.\r\n * @param login - User login.\r\n * @param password - Plaintext password.\r\n * @param saltBase64 - Server salt (URL-safe Base64).\r\n * @param B_base64 - Server public ephemeral B (URL-safe Base64).\r\n * @param ctx - SRP context.\r\n * @returns Object with A, M1, S as Base64 strings.\r\n */\r\n async generateSrpProof(login: string, password: string, saltBase64: string, B_base64: string, ctx: SrpContext): Promise<{ A: string; M1: string; S: string }> {\r\n const salt = SecurityUtils.fromBase64(saltBase64);\r\n\r\n const authHash = await this.keyDerivation.deriveAuthHashForSrp(login, password, salt, ctx.hashAlgorithmName);\r\n const x = SecurityUtils.bytesToBigInt(authHash);\r\n\r\n const aBytes = crypto.getRandomValues(new Uint8Array(32));\r\n const a = SecurityUtils.bytesToBigInt(aBytes);\r\n\r\n const A = SecurityUtils.expMod(ctx.g, a, ctx.N);\r\n if (A % ctx.N === 0n)\r\n throw new Error('Critical error: A % N === 0');\r\n\r\n const B = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(B_base64));\r\n if (B % ctx.N === 0n)\r\n throw new Error('Critical error: B % N === 0');\r\n\r\n const u = await SrpEncoding.hashModuli(ctx, A, B);\r\n if (u === 0n)\r\n throw new Error('Недопустимое значение u');\r\n\r\n const gX = SecurityUtils.expMod(ctx.g, x, ctx.N);\r\n const term = (ctx.k * gX) % ctx.N;\r\n const base = (B - term + ctx.N) % ctx.N;\r\n const exponent = a + (u * x);\r\n const S = SecurityUtils.expMod(base, exponent, ctx.N);\r\n\r\n if (S === 0n)\r\n throw new Error('Critical error: S === 0');\r\n\r\n const sessionKeyK = await SrpEncoding.computeSessionKey(ctx, S);\r\n const M1 = await SrpEncoding.computeM1(ctx, A, B, sessionKeyK);\r\n\r\n return {\r\n A: SecurityUtils.toBase64(SrpEncoding.toModulusBytes(ctx, A)),\r\n M1: SecurityUtils.toBase64(SrpEncoding.toHashBytes(ctx, M1)),\r\n S: SecurityUtils.toBase64(SrpEncoding.toModulusBytes(ctx, S)),\r\n };\r\n }\r\n\r\n /**\r\n * Validates the server proof M2 to authenticate the server.\r\n * @param A_b64 - Client public A (Base64).\r\n * @param M1_b64 - Client proof M1 (Base64).\r\n * @param S_b64 - Session key S (Base64).\r\n * @param serverM2_b64 - Server proof M2 (Base64).\r\n * @param ctx - SRP context.\r\n * @returns True if the server proof is valid.\r\n */\r\n async verifyServerM2(A_b64: string, M1_b64: string, S_b64: string, serverM2_b64: string, ctx: SrpContext): Promise<boolean> {\r\n const A = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(A_b64));\r\n const M1 = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(M1_b64));\r\n const S = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(S_b64));\r\n\r\n const sessionKeyK = await SrpEncoding.computeSessionKey(ctx, S);\r\n const computedM2 = await SrpEncoding.computeM2(ctx, A, M1, sessionKeyK);\r\n const computedM2Bytes = SrpEncoding.toHashBytes(ctx, computedM2);\r\n const serverM2Bytes = SecurityUtils.fromBase64(serverM2_b64);\r\n\r\n return SecurityUtils.fixedTimeEquals(computedM2Bytes, serverM2Bytes);\r\n }\r\n}","import { SecurityUtils } from \"../utils/security.utils.js\";\r\nimport { SrpEncoding } from \"../utils/srp-encoding.js\";\r\nimport { SrpContext } from \"./srp-context.js\";\r\n\r\n/**\r\n * Server-side SRP session state containing ephemeral keys and verifier.\r\n */\r\nexport interface SrpSessionState {\r\n /** User login identifier. */\r\n login: string;\r\n\r\n /** Server private ephemeral key (Base64). */\r\n privateKeyB: string;\r\n\r\n /** Password verifier (Base64). */\r\n verifier: string;\r\n\r\n /** Server public ephemeral key B (Base64). */\r\n publicKeyB: string;\r\n}\r\n\r\n/**\r\n * Server-side SRP-6a: challenge generation, client proof verification, server proof creation.\r\n */\r\nexport class SrpServerService {\r\n\r\n /**\r\n * Generates server challenge B and session state from verifier.\r\n * @param login - User login.\r\n * @param verifierBytes - Stored verifier v as byte array.\r\n * @param ctx - SRP context (hash, N, g, etc.).\r\n * @returns Session state with private b, verifier, and public B.\r\n */\r\n async getSrpChallenge(login: string, verifierBytes: Uint8Array, ctx: SrpContext): Promise<SrpSessionState> {\r\n const v = SecurityUtils.bytesToBigInt(verifierBytes);\r\n\r\n const bBytes = crypto.getRandomValues(new Uint8Array(32));\r\n const b = SecurityUtils.bytesToBigInt(bBytes);\r\n\r\n const gB = SecurityUtils.expMod(ctx.g, b, ctx.N);\r\n const B = (ctx.k * v + gB) % ctx.N;\r\n\r\n return {\r\n login,\r\n privateKeyB: SecurityUtils.toBase64(bBytes),\r\n verifier: SecurityUtils.toBase64(verifierBytes),\r\n publicKeyB: SecurityUtils.toBase64(SrpEncoding.toModulusBytes(ctx, B))\r\n };\r\n }\r\n\r\n /**\r\n * Verifies client M1 proof and returns server M2 proof.\r\n * @param sessionState - Server session state.\r\n * @param a - Client public A (Base64).\r\n * @param m1 - Client proof M1 (Base64).\r\n * @param ctx - SRP context.\r\n * @returns Server proof M2 as Base64 string.\r\n * @throws If verification fails or input is invalid.\r\n */\r\n async verifySrpProof(sessionState: SrpSessionState, a: string, m1: string, ctx: SrpContext): Promise<string> {\r\n const A = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(a));\r\n const M1_client = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(m1));\r\n const b = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(sessionState.privateKeyB));\r\n const v = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(sessionState.verifier));\r\n const B = SecurityUtils.bytesToBigInt(SecurityUtils.fromBase64(sessionState.publicKeyB));\r\n\r\n if (v <= 0n)\r\n throw new Error(\"The verifier is corrupted\");\r\n\r\n if (A % ctx.N === 0n)\r\n throw new Error(\"Incorrect value of A\");\r\n\r\n if (A <= 0n || A >= ctx.N)\r\n throw new Error(\"Invalid A (out of range)\");\r\n\r\n const u = await SrpEncoding.hashModuli(ctx, A, B);\r\n\r\n if (u === 0n)\r\n throw new Error(\"Error in calculating the parameter u\");\r\n\r\n const vU = SecurityUtils.expMod(v, u, ctx.N);\r\n const S = SecurityUtils.expMod((A * vU) % ctx.N, b, ctx.N);\r\n\r\n const sessionKeyK = await SrpEncoding.computeSessionKey(ctx, S);\r\n const M1_server = await SrpEncoding.computeM1(ctx, A, B, sessionKeyK);\r\n\r\n const m1ServerBytes = SrpEncoding.toHashBytes(ctx, M1_server);\r\n const m1ClientBytes = SrpEncoding.toHashBytes(ctx, M1_client);\r\n\r\n if (!SecurityUtils.fixedTimeEquals(m1ServerBytes, m1ClientBytes))\r\n throw new Error(\"Invalid password\");\r\n\r\n const M2_server = await SrpEncoding.computeM2(ctx, A, M1_client, sessionKeyK);\r\n\r\n return SecurityUtils.toBase64(SrpEncoding.toHashBytes(ctx, M2_server));\r\n }\r\n}","/**\r\n * SRP-6a Diffie-Hellman groups (RFC 5054).\r\n * 1024 (~80) deprecated, 1536 (~90) legacy, 2048 (~112) baseline,\r\n * 3072+ (≥128) preferred. g=2 for ≤2048, g=5 for 3072-6144, g=19 for 8192.\r\n * Always use {@link SrpGroupParams} to get N and g.\r\n */\r\nexport enum SrpGroup {\r\n /** 1024-bit, g=2, ~80-bit security. Deprecated, legacy only. */\r\n Rfc5054_1024 = 1,\r\n\r\n /** 1536-bit, g=2, ~90-bit security. Minimum for legacy systems. */\r\n Rfc5054_1536 = 2,\r\n\r\n /** 2048-bit, g=2, ~112-bit security. Recommended baseline. */\r\n Rfc5054_2048 = 3,\r\n\r\n /** 3072-bit, g=5, ~128-bit security. Preferred for long-term. */\r\n Rfc5054_3072 = 4,\r\n\r\n /** 4096-bit, g=5, ~156-bit security. High-security environments. */\r\n Rfc5054_4096 = 5,\r\n\r\n /** 6144-bit, g=5, ~192-bit security. Specialized high-assurance. */\r\n Rfc5054_6144 = 6,\r\n\r\n /** 8192-bit, g=19, ~256-bit security. Experimental, extremely slow. */\r\n Rfc5054_8192 = 7,\r\n\r\n /** User-supplied N and g. Validate safe prime and generator. */\r\n Custom = 99\r\n}","import { SrpGroup } from \"./srp-group.js\";\r\n\r\n/**\r\n * Provides prime modulus (N) and generator (g) for SRP groups (RFC 5054).\r\n */\r\nexport class SrpGroupParams {\r\n\r\n /**\r\n * Returns the prime modulus N for the given SRP group.\r\n * @param group - SRP group identifier.\r\n * @returns N as a bigint.\r\n */\r\n static getN(group: SrpGroup): bigint {\r\n switch (group) {\r\n case SrpGroup.Rfc5054_1024:\r\n return BigInt(\"0x\" +\r\n \"EEAF0AB9\" + \"ADB38DD6\" + \"9C33F80A\" + \"FA8FC5E8\" + \"60726187\" + \"75FF3C0B\" + \"9EA2314C\"+ \r\n \"9C256576\" + \"D674DF74\" + \"96EA81D3\" + \"383B4813\" + \"D692C6E0\" + \"E0D5D8E2\" + \"50B98BE4\" + \r\n \"8E495C1D\" + \"6089DAD1\" + \"5DC7D7B4\" + \"6154D6B6\" + \"CE8EF4AD\" + \"69B15D49\" + \"82559B29\" + \r\n \"7BCF1885\" + \"C529F566\" + \"660E57EC\" + \"68EDBC3C\" + \"05726CC0\" + \"2FD4CBF4\" + \"976EAA9A\" + \r\n \"FD5138FE\" + \"8376435B\" + \"9FC61D2F\" + \"C0EB06E3\");\r\n case SrpGroup.Rfc5054_1536: \r\n return BigInt(\"0x\" +\r\n \"9DEF3CAF\" + \"B939277A\" + \"B1F12A86\" + \"17A47BBB\" + \"DBA51DF4\" + \"99AC4C80\" + \"BEEEA961\" + \r\n \"4B19CC4D\" + \"5F4F5F55\" + \"6E27CBDE\" + \"51C6A94B\" + \"E4607A29\" + \"1558903B\" + \"A0D0F843\" +\r\n \"80B655BB\" + \"9A22E8DC\" + \"DF028A7C\" + \"EC67F0D0\" + \"8134B1C8\" + \"B9798914\" + \"9B609E0B\" +\r\n \"E3BAB63D\" + \"47548381\" + \"DBC5B1FC\" + \"764E3F4B\" + \"53DD9DA1\" + \"158BFD3E\" + \"2B9C8CF5\" +\r\n \"6EDF0195\" + \"39349627\" + \"DB2FD53D\" + \"24B7C486\" + \"65772E43\" + \"7D6C7F8C\" + \"E442734A\" +\r\n \"F7CCB7AE\" + \"837C264A\" + \"E3A9BEB8\" + \"7F8A2FE9\" + \"B8B5292E\" + \"5A021FFF\" + \"5E91479E\" +\r\n \"8CE7A28C\" + \"2442C6F3\" + \"15180F93\" + \"499A234D\" + \"CF76E3FE\" + \"D135F9BB\")\r\n case SrpGroup.Rfc5054_2048:\r\n return BigInt(\"0x\" +\r\n \"AC6BDB41\" + \"324A9A9B\" + \"F166DE5E\" + \"1389582F\" + \"AF72B665\" + \"1987EE07\" + \"FC319294\" +\r\n \"3DB56050\" + \"A37329CB\" + \"B4A099ED\" + \"8193E075\" + \"7767A13D\" + \"D52312AB\" + \"4B03310D\" +\r\n \"CD7F48A9\" + \"DA04FD50\" + \"E8083969\" + \"EDB767B0\" + \"CF609517\" + \"9A163AB3\" + \"661A05FB\" +\r\n \"D5FAAAE8\" + \"2918A996\" + \"2F0B93B8\" + \"55F97993\" + \"EC975EEA\" + \"A80D740A\" + \"DBF4FF74\" +\r\n \"7359D041\" + \"D5C33EA7\" + \"1D281E44\" + \"6B14773B\" + \"CA97B43A\" + \"23FB8016\" + \"76BD207A\" +\r\n \"436C6481\" + \"F1D2B907\" + \"8717461A\" + \"5B9D32E6\" + \"88F87748\" + \"544523B5\" + \"24B0D57D\" +\r\n \"5EA77A27\" + \"75D2ECFA\" + \"032CFBDB\" + \"F52FB378\" + \"61602790\" + \"04E57AE6\" + \"AF874E73\" +\r\n \"03CE5329\" + \"9CCC041C\" + \"7BC308D8\" + \"2A5698F3\" + \"A8D0C382\" + \"71AE35F8\" + \"E9DBFBB6\" +\r\n \"94B5C803\" + \"D89F7AE4\" + \"35DE236D\" + \"525F5475\" + \"9B65E372\" + \"FCD68EF2\" + \"0FA7111F\" +\r\n \"9E4AFF73\");\r\n case SrpGroup.Rfc5054_3072:\r\n return BigInt(\"0x\" +\r\n \"FFFFFFFF\" + \"FFFFFFFF\" + \"C90FDAA2\" + \"2168C234\" + \"C4C6628B\" + \"80DC1CD1\" + \"29024E08\" +\r\n \"8A67CC74\" + \"020BBEA6\" + \"3B139B22\" + \"514A0879\" + \"8E3404DD\" + \"EF9519B3\" + \"CD3A431B\" +\r\n \"302B0A6D\" + \"F25F1437\" + \"4FE1356D\" + \"6D51C245\" + \"E485B576\" + \"625E7EC6\" + \"F44C42E9\" +\r\n \"A637ED6B\" + \"0BFF5CB6\" + \"F406B7ED\" + \"EE386BFB\" + \"5A899FA5\" + \"AE9F2411\" + \"7C4B1FE6\" +\r\n \"49286651\" + \"ECE45B3D\" + \"C2007CB8\" + \"A163BF05\" + \"98DA4836\" + \"1C55D39A\" + \"69163FA8\" +\r\n \"FD24CF5F\" + \"83655D23\" + \"DCA3AD96\" + \"1C62F356\" + \"208552BB\" + \"9ED52907\" + \"7096966D\" +\r\n \"670C354E\" + \"4ABC9804\" + \"F1746C08\" + \"CA18217C\" + \"32905E46\" + \"2E36CE3B\" + \"E39E772C\" +\r\n \"180E8603\" + \"9B2783A2\" + \"EC07A28F\" + \"B5C55DF0\" + \"6F4C52C9\" + \"DE2BCBF6\" + \"95581718\" +\r\n \"3995497C\" + \"EA956AE5\" + \"15D22618\" + \"98FA0510\" + \"15728E5A\" + \"8AAAC42D\" + \"AD33170D\" +\r\n \"04507A33\" + \"A85521AB\" + \"DF1CBA64\" + \"ECFB8504\" + \"58DBEF0A\" + \"8AEA7157\" + \"5D060C7D\" +\r\n \"B3970F85\" + \"A6E1E4C7\" + \"ABF5AE8C\" + \"DB0933D7\" + \"1E8C94E0\" + \"4A25619D\" + \"CEE3D226\" +\r\n \"1AD2EE6B\" + \"F12FFA06\" + \"D98A0864\" + \"D8760273\" + \"3EC86A64\" + \"521F2B18\" + \"177B200C\" +\r\n \"BBE11757\" + \"7A615D6C\" + \"770988C0\" + \"BAD946E2\" + \"08E24FA0\" + \"74E5AB31\" + \"43DB5BFC\" +\r\n \"E0FD108E\" + \"4B82D120\" + \"A93AD2CA\" + \"FFFFFFFF\" + \"FFFFFFFF\");\r\n case SrpGroup.Rfc5054_4096:\r\n return BigInt(\"0x\" +\r\n \"FFFFFFFF\" + \"FFFFFFFF\" + \"C90FDAA2\" + \"2168C234\" + \"C4C6628B\" + \"80DC1CD1\" + \"29024E08\" +\r\n \"8A67CC74\" + \"020BBEA6\" + \"3B139B22\" + \"514A0879\" + \"8E3404DD\" + \"EF9519B3\" + \"CD3A431B\" +\r\n \"302B0A6D\" + \"F25F1437\" + \"4FE1356D\" + \"6D51C245\" + \"E485B576\" + \"625E7EC6\" + \"F44C42E9\" +\r\n \"A637ED6B\" + \"0BFF5CB6\" + \"F406B7ED\" + \"EE386BFB\" + \"5A899FA5\" + \"AE9F2411\" + \"7C4B1FE6\" +\r\n \"49286651\" + \"ECE45B3D\" + \"C2007CB8\" + \"A163BF05\" + \"98DA4836\" + \"1C55D39A\" + \"69163FA8\" +\r\n \"FD24CF5F\" + \"83655D23\" + \"DCA3AD96\" + \"1C62F356\" + \"208552BB\" + \"9ED52907\" + \"7096966D\" +\r\n \"670C354E\" + \"4ABC9804\" + \"F1746C08\" + \"CA18217C\" + \"32905E46\" + \"2E36CE3B\" + \"E39E772C\" +\r\n \"180E8603\" + \"9B2783A2\" + \"EC07A28F\" + \"B5C55DF0\" + \"6F4C52C9\" + \"DE2BCBF6\" + \"95581718\" +\r\n \"3995497C\" + \"EA956AE5\" + \"15D22618\" + \"98FA0510\" + \"15728E5A\" + \"8AAAC42D\" + \"AD33170D\" +\r\n \"04507A33\" + \"A85521AB\" + \"DF1CBA64\" + \"ECFB8504\" + \"58DBEF0A\" + \"8AEA7157\" + \"5D060C7D\" +\r\n \"B3970F85\" + \"A6E1E4C7\" + \"ABF5AE8C\" + \"DB0933D7\" + \"1E8C94E0\" + \"4A25619D\" + \"CEE3D226\" +\r\n \"1AD2EE6B\" + \"F12FFA06\" + \"D98A0864\" + \"D8760273\" + \"3EC86A64\" + \"521F2B18\" + \"177B200C\" +\r\n \"BBE11757\" + \"7A615D6C\" + \"770988C0\" + \"BAD946E2\" + \"08E24FA0\" + \"74E5AB31\" + \"43DB5BFC\" +\r\n \"E0FD108E\" + \"4B82D120\" + \"A9210801\" + \"1A723C12\" + \"A787E6D7\" + \"88719A10\" + \"BDBA5B26\" +\r\n \"99C32718\" + \"6AF4E23C\" + \"1A946834\" + \"B6150BDA\" + \"2583E9CA\" + \"2AD44CE8\" + \"DBBBC2DB\" +\r\n \"04DE8EF9\" + \"2E8EFC14\" + \"1FBECAA6\" + \"287C5947\" + \"4E6BC05D\" + \"99B2964F\" + \"A090C3A2\" +\r\n \"233BA186\" + \"515BE7ED\" + \"1F612970\" + \"CEE2D7AF\" + \"B81BDD76\" + \"2170481C\" + \"D0069127\" +\r\n \"D5B05AA9\" + \"93B4EA98\" + \"8D8FDDC1\" + \"86FFB7DC\" + \"90A6C08F\" + \"4DF435C9\" + \"34063199\" +\r\n \"FFFFFFFF\" + \"FFFFFFFF\");\r\n case SrpGroup.Rfc5054_6144:\r\n return BigInt(\"0x\" +\r\n \"FFFFFFFF\" + \"FFFFFFFF\" + \"C90FDAA2\" + \"2168C234\" + \"C4C6628B\" + \"80DC1CD1\" + \"29024E08\" +\r\n \"8A67CC74\" + \"020BBEA6\" + \"3B139B22\" + \"514A0879\" + \"8E3404DD\" + \"EF9519B3\" + \"CD3A431B\" +\r\n \"302B0A6D\" + \"F25F1437\" + \"4FE1356D\" + \"6D51C245\" + \"E485B576\" + \"625E7EC6\" + \"F44C42E9\" +\r\n \"A637ED6B\" + \"0BFF5CB6\" + \"F406B7ED\" + \"EE386BFB\" + \"5A899FA5\" + \"AE9F2411\" + \"7C4B1FE6\" +\r\n \"49286651\" + \"ECE45B3D\" + \"C2007CB8\" + \"A163BF05\" + \"98DA4836\" + \"1C55D39A\" + \"69163FA8\" +\r\n \"FD24CF5F\" + \"83655D23\" + \"DCA3AD96\" + \"1C62F356\" + \"208552BB\" + \"9ED52907\" + \"7096966D\" +\r\n \"670C354E\" + \"4ABC9804\" + \"F1746C08\" + \"CA18217C\" + \"32905E46\" + \"2E36CE3B\" + \"E39E772C\" +\r\n \"180E8603\" + \"9B2783A2\" + \"EC07A28F\" + \"B5C55DF0\" + \"6F4C52C9\" + \"DE2BCBF6\" + \"95581718\" +\r\n \"3995497C\" + \"EA956AE5\" + \"15D22618\" + \"98FA0510\" + \"15728E5A\" + \"8AAAC42D\" + \"AD33170D\" +\r\n \"04507A33\" + \"A85521AB\" + \"DF1CBA64\" + \"ECFB8504\" + \"58DBEF0A\" + \"8AEA7157\" + \"5D060C7D\" +\r\n \"B3970F85\" + \"A6E1E4C7\" + \"ABF5AE8C\" + \"DB0933D7\" + \"1E8C94E0\" + \"4A25619D\" + \"CEE3D226\" +\r\n \"1AD2EE6B\" + \"F12FFA06\" + \"D98A0864\" + \"D8760273\" + \"3EC86A64\" + \"521F2B18\" + \"177B200C\" +\r\n \"BBE11757\" + \"7A615D6C\" + \"770988C0\" + \"BAD946E2\" + \"08E24FA0\" + \"74E5AB31\" + \"43DB5BFC\" +\r\n \"E0FD108E\" + \"4B82D120\" + \"A9210801\" + \"1A723C12\" + \"A787E6D7\" + \"88719A10\" + \"BDBA5B26\" +\r\n \"99C32718\" + \"6AF4E23C\" + \"1A946834\" + \"B6150BDA\" + \"2583E9CA\" + \"2AD44CE8\" + \"DBBBC2DB\" +\r\n \"04DE8EF9\" + \"2E8EFC14\" + \"1FBECAA6\" + \"287C5947\" + \"4E6BC05D\" + \"99B2964F\" + \"A090C3A2\" +\r\n \"233BA186\" + \"515BE7ED\" + \"1F612970\" + \"CEE2D7AF\" + \"B81BDD76\" + \"2170481C\" + \"D0069127\" +\r\n \"D5B05AA9\" + \"93B4EA98\" + \"8D8FDDC1\" + \"86FFB7DC\" + \"90A6C08F\" + \"4DF435C9\" + \"34028492\" +\r\n \"36C3FAB4\" + \"D27C7026\" + \"C1D4DCB2\" + \"602646DE\" + \"C9751E76\" + \"3DBA37BD\" + \"F8FF9406\" +\r\n \"AD9E530E\" + \"E5DB382F\" + \"413001AE\" + \"B06A53ED\" + \"9027D831\" + \"179727B0\" + \"865A8918\" +\r\n \"DA3EDBEB\" + \"CF9B14ED\" + \"44CE6CBA\" + \"CED4BB1B\" + \"DB7F1447\" + \"E6CC254B\" + \"33205151\" +\r\n \"2BD7AF42\" + \"6FB8F401\" + \"378CD2BF\" + \"5983CA01\" + \"C64B92EC\" + \"F032EA15\" + \"D1721D03\" +\r\n \"F482D7CE\" + \"6E74FEF6\" + \"D55E702F\" + \"46980C82\" + \"B5A84031\" + \"900B1C9E\" + \"59E7C97F\" +\r\n \"BEC7E8F3\" + \"23A97A7E\" + \"36CC88BE\" + \"0F1D45B7\" + \"FF585AC5\" + \"4BD407B2\" + \"2B4154AA\" +\r\n \"CC8F6D7E\" + \"BF48E1D8\" + \"14CC5ED2\" + \"0F8037E0\" + \"A79715EE\" + \"F29BE328\" + \"06A1D58B\" +\r\n \"B7C5DA76\" + \"F550AA3D\" + \"8A1FBFF0\" + \"EB19CCB1\" + \"A313D55C\" + \"DA56C9EC\" + \"2EF29632\" +\r\n \"387FE8D7\" + \"6E3C0468\" + \"043E8F66\" + \"3F4860EE\" + \"12BF2D5B\" + \"0B7474D6\" + \"E694F91E\" +\r\n \"6DCC4024\" + \"FFFFFFFF\" + \"FFFFFFFF\");\r\n case SrpGroup.Rfc5054_8192:\r\n return BigInt(\"0x\" +\r\n \"FFFFFFFF\" + \"FFFFFFFF\" + \"C90FDAA2\" + \"2168C234\" + \"C4C6628B\" + \"80DC1CD1\" + \"29024E08\" +\r\n \"8A67CC74\" + \"020BBEA6\" + \"3B139B22\" + \"514A0879\" + \"8E3404DD\" + \"EF9519B3\" + \"CD3A431B\" +\r\n \"302B0A6D\" + \"F25F1437\" + \"4FE1356D\" + \"6D51C245\" + \"E485B576\" + \"625E7EC6\" + \"F44C42E9\" +\r\n \"A637ED6B\" + \"0BFF5CB6\" + \"F406B7ED\" + \"EE386BFB\" + \"5A899FA5\" + \"AE9F2411\" + \"7C4B1FE6\" +\r\n \"49286651\" + \"ECE45B3D\" + \"C2007CB8\" + \"A163BF05\" + \"98DA4836\" + \"1C55D39A\" + \"69163FA8\" +\r\n \"FD24CF5F\" + \"83655D23\" + \"DCA3AD96\" + \"1C62F356\" + \"208552BB\" + \"9ED52907\" + \"7096966D\" +\r\n \"670C354E\" + \"4ABC9804\" + \"F1746C08\" + \"CA18217C\" + \"32905E46\" + \"2E36CE3B\" + \"E39E772C\" +\r\n \"180E8603\" + \"9B2783A2\" + \"EC07A28F\" + \"B5C55DF0\" + \"6F4C52C9\" + \"DE2BCBF6\" + \"95581718\" +\r\n \"3995497C\" + \"EA956AE5\" + \"15D22618\" + \"98FA0510\" + \"15728E5A\" + \"8AAAC42D\" + \"AD33170D\" +\r\n \"04507A33\" + \"A85521AB\" + \"DF1CBA64\" + \"ECFB8504\" + \"58DBEF0A\" + \"8AEA7157\" + \"5D060C7D\" +\r\n \"B3970F85\" + \"A6E1E4C7\" + \"ABF5AE8C\" + \"DB0933D7\" + \"1E8C94E0\" + \"4A25619D\" + \"CEE3D226\" +\r\n \"1AD2EE6B\" + \"F12FFA06\" + \"D98A0864\" + \"D8760273\" + \"3EC86A64\" + \"521F2B18\" + \"177B200C\" +\r\n \"BBE11757\" + \"7A615D6C\" + \"770988C0\" + \"BAD946E2\" + \"08E24FA0\" + \"74E5AB31\" + \"43DB5BFC\" +\r\n \"E0FD108E\" + \"4B82D120\" + \"A9210801\" + \"1A723C12\" + \"A787E6D7\" + \"88719A10\" + \"BDBA5B26\" +\r\n \"99C32718\" + \"6AF4E23C\" + \"1A946834\" + \"B6150BDA\" + \"2583E9CA\" + \"2AD44CE8\" + \"DBBBC2DB\" +\r\n \"04DE8EF9\" + \"2E8EFC14\" + \"1FBECAA6\" + \"287C5947\" + \"4E6BC05D\" + \"99B2964F\" + \"A090C3A2\" +\r\n \"233BA186\" + \"515BE7ED\" + \"1F612970\" + \"CEE2D7AF\" + \"B81BDD76\" + \"2170481C\" + \"D0069127\" +\r\n \"D5B05AA9\" + \"93B4EA98\" + \"8D8FDDC1\" + \"86FFB7DC\" + \"90A6C08F\" + \"4DF435C9\" + \"34028492\" +\r\n \"36C3FAB4\" + \"D27C7026\" + \"C1D4DCB2\" + \"602646DE\" + \"C9751E76\" + \"3DBA37BD\" + \"F8FF9406\" +\r\n \"AD9E530E\" + \"E5DB382F\" + \"413001AE\" + \"B06A53ED\" + \"9027D831\" + \"179727B0\" + \"865A8918\" +\r\n \"DA3EDBEB\" + \"CF9B14ED\" + \"44CE6CBA\" + \"CED4BB1B\" + \"DB7F1447\" + \"E6CC254B\" + \"33205151\" +\r\n \"2BD7AF42\" + \"6FB8F401\" + \"378CD2BF\" + \"5983CA01\" + \"C64B92EC\" + \"F032EA15\" + \"D1721D03\" +\r\n \"F482D7CE\" + \"6E74FEF6\" + \"D55E702F\" + \"46980C82\" + \"B5A84031\" + \"900B1C9E\" + \"59E7C97F\" +\r\n \"BEC7E8F3\" + \"23A97A7E\" + \"36CC88BE\" + \"0F1D45B7\" + \"FF585AC5\" + \"4BD407B2\" + \"2B4154AA\" +\r\n \"CC8F6D7E\" + \"BF48E1D8\" + \"14CC5ED2\" + \"0F8037E0\" + \"A79715EE\" + \"F29BE328\" + \"06A1D58B\" +\r\n \"B7C5DA76\" + \"F550AA3D\" + \"8A1FBFF0\" + \"EB19CCB1\" + \"A313D55C\" + \"DA56C9EC\" + \"2EF29632\" +\r\n \"387FE8D7\" + \"6E3C0468\" + \"043E8F66\" + \"3F4860EE\" + \"12BF2D5B\" + \"0B7474D6\" + \"E694F91E\" +\r\n \"6DBE1159\" + \"74A3926F\" + \"12FEE5E4\" + \"38777CB6\" + \"A932DF8C\" + \"D8BEC4D0\" + \"73B931BA\" +\r\n \"3BC832B6\" + \"8D9DD300\" + \"741FA7BF\" + \"8AFC47ED\" + \"2576F693\" + \"6BA42466\" + \"3AAB639C\" +\r\n \"5AE4F568\" + \"3423B474\" + \"2BF1C978\" + \"238F16CB\" + \"E39D652D\" + \"E3FDB8BE\" + \"FC848AD9\" +\r\n \"22222E04\" + \"A4037C07\" + \"13EB57A8\" + \"1A23F0C7\" + \"3473FC64\" + \"6CEA306B\" + \"4BCBC886\" +\r\n \"2F8385DD\" + \"FA9D4B7F\" + \"A2C087E8\" + \"79683303\" + \"ED5BDD3A\" + \"062B3CF5\" + \"B3A278A6\" +\r\n \"6D2A13F8\" + \"3F44F82D\" + \"DF310EE0\" + \"74AB6A36\" + \"4597E899\" + \"A0255DC1\" + \"64F31CC5\" +\r\n \"0846851D\" + \"F9AB4819\" + \"5DED7EA1\" + \"B1D510BD\" + \"7EE74D73\" + \"FAF36BC3\" + \"1ECFA268\" +\r\n \"359046F4\" + \"EB879F92\" + \"4009438B\" + \"481C6CD7\" + \"889A002E\" + \"D5EE382B\" + \"C9190DA6\" +\r\n \"FC026E47\" + \"9558E447\" + \"5677E9AA\" + \"9E3050E2\" + \"765694DF\" + \"C81F56E8\" + \"80B96E71\" +\r\n \"60C980DD\" + \"98EDD3DF\" + \"FFFFFFFF\" + \"FFFFFFFF\");\r\n default:\r\n throw new Error(\"Unsupported group\");\r\n }\r\n }\r\n\r\n /**\r\n * Returns the generator g for the given SRP group.\r\n * @param group - SRP group identifier.\r\n * @returns g as a bigint (2, 5, or 19).\r\n */\r\n static getG(group: SrpGroup): bigint {\r\n switch (group) {\r\n case SrpGroup.Rfc5054_1024:\r\n return BigInt(2);\r\n case SrpGroup.Rfc5054_1536: \r\n return BigInt(2)\r\n case SrpGroup.Rfc5054_2048:\r\n return BigInt(2);\r\n case SrpGroup.Rfc5054_3072:\r\n return BigInt(5);\r\n case SrpGroup.Rfc5054_4096:\r\n return BigInt(5);\r\n case SrpGroup.Rfc5054_6144:\r\n return BigInt(5);\r\n case SrpGroup.Rfc5054_8192:\r\n return BigInt(19);\r\n default:\r\n throw new Error(\"Unsupported group\");\r\n }\r\n }\r\n}","import { HashAlgorithm } from \"../crypto/hash-algorithm.js\";\r\nimport { SecurityUtils } from \"../utils/security.utils.js\";\r\nimport { SrpGroupParams } from \"./srp-group-params.js\";\r\nimport { SrpGroup } from \"./srp-group.js\";\r\n\r\n/**\r\n * Immutable-style SRP-6a configuration. Parameters aligned with RFC 5054.\r\n * Compute `k` via {@link computeK}.\r\n */\r\nexport class SrpOptions {\r\n\r\n /** Diffie-Hellman group. Default Rfc5054_3072 (g=5). */\r\n group: SrpGroup = SrpGroup.Rfc5054_3072;\r\n\r\n /** Hash algorithm for SRP computations. Default SHA-256. */\r\n hashAlgorithmName: HashAlgorithm = 'SHA-256';\r\n\r\n /** Salt size in bytes. Default 32. */\r\n saltSize: number = 32;\r\n\r\n /** Prime modulus N for the selected group. */\r\n get N(): bigint { \r\n return SrpGroupParams.getN(this.group); \r\n}\r\n\r\n /** Generator g for the selected group (2, 5, or 19). */\r\n get g(): bigint { \r\n return SrpGroupParams.getG(this.group);\r\n }\r\n\r\n /** Byte length of N (ceil(bitLength / 8)). */\r\n get modulusSize(): number { \r\n return Math.floor((this.N.toString(2).length + 7) / 8); \r\n}\r\n\r\n /**\r\n * Computes the multiplier parameter k = H(PAD(N) || PAD(g)) (RFC 5054, 2.5.3).\r\n * @returns k as a bigint.\r\n */\r\n async computeK(): Promise<bigint> {\r\n const nBytes = SecurityUtils.bigIntToFixedBytes(this.N, this.modulusSize);\r\n const gBytes = SecurityUtils.bigIntToFixedBytes(this.g, this.modulusSize);\r\n const combined = new Uint8Array(nBytes.length + gBytes.length);\r\n combined.set(nBytes, 0);\r\n combined.set(gBytes, nBytes.length);\r\n const hash = await crypto.subtle.digest(this.hashAlgorithmName, combined);\r\n return SecurityUtils.bytesToBigInt(new Uint8Array(hash));\r\n }\r\n}","import { SrpContext } from \"./srp-context.js\";\r\nimport { SrpGroup } from \"./srp-group.js\";\r\nimport { SrpOptions } from \"./srp-options.js\";\r\n\r\n/**\r\n * Factory for creating an {@link SrpContext} from an SRP group.\r\n * Automatically selects the hash algorithm (SHA-256 for ≤3072-bit, SHA-384 for 4096+).\r\n */\r\nexport class SrpContextFactory {\r\n\r\n /**\r\n * Creates an SRP context with the specified group.\r\n * @param group - SRP group (default Rfc5054_3072).\r\n * @returns A ready-to-use SrpContext.\r\n */\r\n static async create(group: SrpGroup = SrpGroup.Rfc5054_3072): Promise<SrpContext> {\r\n const opts = new SrpOptions();\r\n opts.group = group;\r\n opts.hashAlgorithmName = group === SrpGroup.Rfc5054_4096 || group === SrpGroup.Rfc5054_6144 || group === SrpGroup.Rfc5054_8192 ? 'SHA-384' : 'SHA-256';\r\n \r\n return {\r\n N: opts.N,\r\n g: opts.g,\r\n k: await opts.computeK(),\r\n modulusSize: opts.modulusSize,\r\n hashAlgorithmName: opts.hashAlgorithmName,\r\n hashSize: opts.hashAlgorithmName === 'SHA-256' ? 32 : opts.hashAlgorithmName === 'SHA-384' ? 48 : 64\r\n };\r\n }\r\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crossdyne/security",
3
- "version": "0.2.0-beta.1",
3
+ "version": "0.3.0-beta.1",
4
4
  "description": "Security library with SRP authentication and cryptography",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",