{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import type { BlockCipher, CipherComponent, PresetComponent } from '@jscrypto/core';\nimport {\n  speck128_128 as speck128_128Impl,\n  speck128_192 as speck128_192Impl,\n  speck128_256 as speck128_256Impl,\n  speck32_64 as speck32_64Impl,\n  speck48_72 as speck48_72Impl,\n  speck48_96 as speck48_96Impl,\n  speck64_96 as speck64_96Impl,\n  speck64_128 as speck64_128Impl,\n  speck96_96 as speck96_96Impl,\n  speck96_144 as speck96_144Impl,\n} from 'js-speck';\n\nexport type SpeckVariantName =\n  | '32-64'\n  | '48-72'\n  | '48-96'\n  | '64-96'\n  | '64-128'\n  | '96-96'\n  | '96-144'\n  | '128-128'\n  | '128-192'\n  | '128-256';\n\ntype SpeckImpl = {\n  readonly blockBytes: number;\n  readonly keyBytes: number;\n  encrypt(key: Uint8Array, data: Uint8Array): ArrayLike<number>;\n  decrypt(key: Uint8Array, data: Uint8Array): ArrayLike<number>;\n};\n\nconst variants: Record<SpeckVariantName, SpeckImpl> = {\n  '32-64': speck32_64Impl,\n  '48-72': speck48_72Impl,\n  '48-96': speck48_96Impl,\n  '64-96': speck64_96Impl,\n  '64-128': speck64_128Impl,\n  '96-96': speck96_96Impl,\n  '96-144': speck96_144Impl,\n  '128-128': speck128_128Impl,\n  '128-192': speck128_192Impl,\n  '128-256': speck128_256Impl,\n};\n\nexport function createSpeckCipher(variant: SpeckVariantName, key: Uint8Array): BlockCipher {\n  if (!variant) {\n    throw new Error('SPECK variant is required.');\n  }\n\n  const impl = variants[variant];\n  if (!impl) {\n    throw new Error(`Unknown SPECK variant: ${String(variant)}.`);\n  }\n\n  if (key.length !== impl.keyBytes) {\n    throw new Error(`SPECK ${variant} key must be ${impl.keyBytes * 8} bits.`);\n  }\n\n  const blockSize = impl.blockBytes;\n\n  return {\n    blockSize,\n\n    encryptBlock(input, inputOffset, output, outputOffset) {\n      transformBlock(impl, key, input, inputOffset, output, outputOffset, true);\n    },\n\n    decryptBlock(input, inputOffset, output, outputOffset) {\n      transformBlock(impl, key, input, inputOffset, output, outputOffset, false);\n    },\n\n    encrypt(input, output) {\n      return transformBlocks(impl, key, input, output, true);\n    },\n\n    decrypt(input, output) {\n      return transformBlocks(impl, key, input, output, false);\n    },\n  };\n}\n\nfunction createComponent<Name extends string>(\n  name: Name,\n  variant: SpeckVariantName,\n): CipherComponent<Name> {\n  const impl = variants[variant];\n  return {\n    kind: 'cipher',\n    name,\n    type: 'block',\n    blockSize: impl.blockBytes,\n    keySizes: [impl.keyBytes],\n    create(key) {\n      return createSpeckCipher(variant, key);\n    },\n  };\n}\n\nexport const speck32_64 = createComponent('SPECK32/64', '32-64');\nexport const speck48_72 = createComponent('SPECK48/72', '48-72');\nexport const speck48_96 = createComponent('SPECK48/96', '48-96');\nexport const speck64_96 = createComponent('SPECK64/96', '64-96');\nexport const speck64_128 = createComponent('SPECK64/128', '64-128');\nexport const speck96_96 = createComponent('SPECK96/96', '96-96');\nexport const speck96_144 = createComponent('SPECK96/144', '96-144');\nexport const speck128_128 = createComponent('SPECK128/128', '128-128');\nexport const speck128_192 = createComponent('SPECK128/192', '128-192');\nexport const speck128_256 = createComponent('SPECK128/256', '128-256');\n\nexport const allSpeckComponents: readonly CipherComponent[] = [\n  speck32_64,\n  speck48_72,\n  speck48_96,\n  speck64_96,\n  speck64_128,\n  speck96_96,\n  speck96_144,\n  speck128_128,\n  speck128_192,\n  speck128_256,\n];\n\nexport const speckPreset: PresetComponent<'speck'> = {\n  kind: 'preset',\n  name: 'speck',\n  components() {\n    return allSpeckComponents;\n  },\n};\n\nfunction transformBlocks(\n  impl: SpeckImpl,\n  key: Uint8Array,\n  input: Uint8Array,\n  output: Uint8Array,\n  encrypting: boolean,\n): Uint8Array {\n  assertBlocks(input, output, impl.blockBytes);\n  for (let offset = 0; offset < input.length; offset += impl.blockBytes) {\n    transformBlock(impl, key, input, offset, output, offset, encrypting);\n  }\n  return output;\n}\n\nfunction transformBlock(\n  impl: SpeckImpl,\n  key: Uint8Array,\n  input: Uint8Array,\n  inputOffset: number,\n  output: Uint8Array,\n  outputOffset: number,\n  encrypting: boolean,\n): void {\n  const block = input.subarray(inputOffset, inputOffset + impl.blockBytes);\n  if (block.length !== impl.blockBytes) {\n    throw new Error(`SPECK block must be ${impl.blockBytes * 8} bits.`);\n  }\n  const transformed = encrypting ? impl.encrypt(key, block) : impl.decrypt(key, block);\n  output.set(transformed, outputOffset);\n}\n\nfunction assertBlocks(input: Uint8Array, output: Uint8Array, blockSize: number): void {\n  if (input.length % blockSize !== 0) {\n    throw new Error(`SPECK input length must be a multiple of ${blockSize * 8} bits.`);\n  }\n  if (output.length !== input.length) {\n    throw new Error('SPECK output length must equal input length.');\n  }\n}\n"],"names":["speck32_64Impl","speck48_72Impl","speck48_96Impl","speck64_96Impl","speck64_128Impl","speck96_96Impl","speck96_144Impl","speck128_128Impl","speck128_192Impl","speck128_256Impl"],"mappings":"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"}