Base58 = require "base-58"
BLAKE2s = require "./BLAKE2s"

Encode a public key as a miniLock ID.

Accepts a Uint8Array publicKey and returns a miniLock ID String if the input is acceptable.

exports.encode = (publicKey) ->
  if publicKey?.length is 32
    slots = new Uint8Array(33)
    slots[index] = publicKey[index] for index in [0..32]
    slots[32] = (new BLAKE2s length: 1).update(publicKey).digest()[0]

Decode the public key from a miniLockID.

Accepts a miniLock ID String and returns a Uint8Array publicKey if the input is acceptable.

exports.decode = (miniLockID) ->
  slots = Base58.decode(miniLockID)
  if slots.length is 33
    publicKey = new Uint8Array(slots.subarray(0, 32))
    encodedChecksum = slots[32]
    trueChecksum = (new BLAKE2s length: 1).update(publicKey).digest()[0]
    return publicKey if encodedChecksum is trueChecksum

true if the miniLockID is acceptable and false if it is not.

exports.isAcceptable = (miniLockID) ->
  /^[1-9A-Za-z]{40,55}$/.test(miniLockID) and @decode(miniLockID)?