---
name: "Crypt::Digest::KangarooTwelve"
section: "3pm"
platform: "linux"
package: "perl-cryptx"
version: "0.091-2"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/Crypt::Digest::KangarooTwelve"
---

# Crypt::Digest::KangarooTwelve(3pm)

XOF (extendable output) hash function KangarooTwelve

## NAME

Crypt::Digest::KangarooTwelve - XOF (extendable output) hash function KangarooTwelve

## SYNOPSIS

```
   use Crypt::Digest::KangarooTwelve;
   my $d = Crypt::Digest::KangarooTwelve->new(128); # 128-bit security
   $d->add('any data');
   $d->customization('optional context string');
   my $result = $d->done(32);                      # 32 bytes of output
   # or absorb input from a file instead
   my $file_d = Crypt::Digest::KangarooTwelve->new(128);
   $file_d->addfile('filename.dat');
   $file_d->customization('optional context string');
   my $file_result = $file_d->done(32);
```

## DESCRIPTION

*Since: CryptX-0.089*

Provides an interface to KangarooTwelve (K12) as defined in RFC 9861 \<https://www.rfc-editor.org/rfc/rfc9861\>.

KangarooTwelve is a fast cryptographic hash and XOF based on a reduced-round (12-round) Keccak-p permutation. It supports an optional **customization string** that binds the output to a specific context. `done()` can be called multiple times to stream arbitrary amounts of output.

**Order of operations**: `add()` must be called before `customization()`; `customization()` must be called before `done()`. After the first `done()`, treat the object as being in output mode: do not call `add()` or `customization()` again on that state. Use `reset()` or a new object to start hashing a new message.

## METHODS

Unless noted otherwise, assume `$d` is an existing KangarooTwelve object created via `"new"`, for example:

```
 my $d = Crypt::Digest::KangarooTwelve->new(128);
```

### new

```
 my $d = Crypt::Digest::KangarooTwelve->new($num);
 # $num ... [integer] 128 or 256 (security level in bits)
```

### clone

```
 my $d2 = $d->clone;
```

### reset

```
 $d->reset;
```

### add

Appends data to the message. Returns the object itself (for chaining).

Each argument is converted to bytes using Perl's usual scalar stringification. Defined scalars, including numbers and string-overloaded objects, are accepted. `"undef"` is treated as an empty string and may emit Perl's usual "uninitialized value" warning.

```
 $d->add('any data');
 #or
 $d->add('chunk1', 'chunk2', ...);
```

### addfile

Reads the file content and appends it to the message. Returns the object itself (for chaining).

```
 $d->addfile('filename.dat');
 #or
 my $filehandle = ...; # existing binary-mode filehandle
 $d->addfile($filehandle);
```

### customization

```
 $d->customization('context string');  # optional; call after add(), before done()
```

Each argument is converted to bytes using Perl's usual scalar stringification. Defined scalars, including numbers and string-overloaded objects, are accepted. `"undef"` is treated as an empty string and may emit Perl's usual "uninitialized value" warning.

### done

Returns `$len` bytes of output as a binary string. Can be called repeatedly to stream an unlimited amount of output from the same absorbed input. The `$len` argument is required and must be a positive integer. Single `done()` calls are limited to 1,000,000,000 bytes, but the recommended way to read large output is to call `done()` repeatedly in 10 MB chunks.

After the first `done()` call the object is in output mode. Calling `add()` or `customization()` in this state croaks; use `reset()` or create a new object to hash a different message.

```
 my $result_raw = $d->done($len);
 # can be called multiple times; $len is the number of output bytes to read
 # after the first done(), add() / customization() croak until you call reset()
```

## SEE ALSO

- •

  CryptX, Crypt::Digest::SHAKE, Crypt::Digest::TurboSHAKE

- •

  RFC 9861 \<https://www.rfc-editor.org/rfc/rfc9861\>
