// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

import { fromBase64, fromHex } from '../Bytes.std.ts';

export enum HashType {
  size256 = 'sha256',
  size512 = 'sha512',
}

export enum CipherType {
  AES256CBC = 'aes-256-cbc',
  AES256CTR = 'aes-256-ctr',
  AES256GCM = 'aes-256-gcm',
}

export const UUID_BYTE_SIZE = 16;

export const IV_LENGTH = 16;

export const AES_KEY_LENGTH = 32;

export const MAC_LENGTH = 32;

/** @alias */
export const ATTACHMENT_MAC_LENGTH = MAC_LENGTH;

export const DIGEST_LENGTH = 32;

export const PLAINTEXT_HASH_LENGTH = 32;

export const KEY_SET_LENGTH = AES_KEY_LENGTH + MAC_LENGTH;

export function isValidAttachmentKey(
  keyBase64: string | undefined
): keyBase64 is string {
  if (typeof keyBase64 !== 'string') {
    return false;
  }
  const bytes = fromBase64(keyBase64);
  return bytes.byteLength === KEY_SET_LENGTH;
}

export function isValidDigest(
  digestBase64: string | undefined
): digestBase64 is string {
  if (typeof digestBase64 !== 'string') {
    return false;
  }
  const bytes = fromBase64(digestBase64);
  return bytes.byteLength === DIGEST_LENGTH;
}

export function isValidPlaintextHash(
  plaintextHashHex: string | undefined
): plaintextHashHex is string {
  if (typeof plaintextHashHex !== 'string') {
    return false;
  }
  const bytes = fromHex(plaintextHashHex);
  return bytes.byteLength === PLAINTEXT_HASH_LENGTH;
}
