Module refinery.units.crypto.keyderive.argon2

Expand source code Browse git
from __future__ import annotations

from refinery.lib.fast.argon2 import (
    ARGON2D,
    ARGON2I,
    ARGON2ID,
    argon2hash,
)
from refinery.lib.types import Param, buf
from refinery.units import Arg, Unit


class argon2(Unit):
    """
    Implements Argon2-based key derivation.
    """
    def __init__(
        self,
        size: Param[int, Arg.Number(metavar='n', help='number of bytes to generate')],
        salt: Param[buf, Arg.Binary(metavar='S', help='salt bytes')],
        iter: Param[int, Arg.Number(metavar='t', help='number of iterations, defaults to {default}')] = 1,
        jobs: Param[int, Arg.Number(metavar='p', help='parallelism, defaults to {default}')] = 1,
        cost: Param[int, Arg.Number(metavar='m', help='memory cost in kibibytes, defaults to the minimum of 8192 per job.')] = 0,
        skey: Param[buf, Arg.Binary(metavar='K', help='optional secret key')] = b'',
        more: Param[buf, Arg.Binary(metavar='X', help='optional additional data')] = b'',
        resist_tmto: Param[bool, Arg.Switch('-i',
            help='Use Argon2i, maximizing resistance to time-memory trade-off (TMTO) attacks. Default is Argon2id.')] = False,
        resist_side: Param[bool, Arg.Switch('-d',
            help='Use Argon2d, maximizing resistance to side-channel attacks. Default is Argon2id.')] = False,
    ):
        if resist_tmto and resist_side:
            resist_tmto = resist_side = False
        super().__init__(
            size=size,
            salt=salt,
            iter=iter,
            skey=skey,
            jobs=jobs,
            cost=cost,
            more=more,
            i=resist_tmto,
            d=resist_side,
        )

    def process(self, data):
        m = self.args.cost
        p = self.args.jobs
        S = bytes(self.args.salt)
        K = self.args.skey
        n = self.args.size
        X = self.args.more
        t = self.args.iter
        K = bytes(K) if K else b''
        X = bytes(X) if X else b''
        m = m or 8192 * p
        if self.args.i:
            v = ARGON2I
        elif self.args.d:
            v = ARGON2D
        else:
            v = ARGON2ID
        return argon2hash(
            password=bytes(data),
            salt=S,
            time_cost=t,
            memory_cost=m,
            parallelism=p,
            tag_length=n,
            variant=v,
            secret=K,
            associated_data=X,
        )

Classes

class argon2 (size, salt, iter=1, jobs=1, cost=0, skey=b'', more=b'', resist_tmto=False, resist_side=False)

Implements Argon2-based key derivation.

Expand source code Browse git
class argon2(Unit):
    """
    Implements Argon2-based key derivation.
    """
    def __init__(
        self,
        size: Param[int, Arg.Number(metavar='n', help='number of bytes to generate')],
        salt: Param[buf, Arg.Binary(metavar='S', help='salt bytes')],
        iter: Param[int, Arg.Number(metavar='t', help='number of iterations, defaults to {default}')] = 1,
        jobs: Param[int, Arg.Number(metavar='p', help='parallelism, defaults to {default}')] = 1,
        cost: Param[int, Arg.Number(metavar='m', help='memory cost in kibibytes, defaults to the minimum of 8192 per job.')] = 0,
        skey: Param[buf, Arg.Binary(metavar='K', help='optional secret key')] = b'',
        more: Param[buf, Arg.Binary(metavar='X', help='optional additional data')] = b'',
        resist_tmto: Param[bool, Arg.Switch('-i',
            help='Use Argon2i, maximizing resistance to time-memory trade-off (TMTO) attacks. Default is Argon2id.')] = False,
        resist_side: Param[bool, Arg.Switch('-d',
            help='Use Argon2d, maximizing resistance to side-channel attacks. Default is Argon2id.')] = False,
    ):
        if resist_tmto and resist_side:
            resist_tmto = resist_side = False
        super().__init__(
            size=size,
            salt=salt,
            iter=iter,
            skey=skey,
            jobs=jobs,
            cost=cost,
            more=more,
            i=resist_tmto,
            d=resist_side,
        )

    def process(self, data):
        m = self.args.cost
        p = self.args.jobs
        S = bytes(self.args.salt)
        K = self.args.skey
        n = self.args.size
        X = self.args.more
        t = self.args.iter
        K = bytes(K) if K else b''
        X = bytes(X) if X else b''
        m = m or 8192 * p
        if self.args.i:
            v = ARGON2I
        elif self.args.d:
            v = ARGON2D
        else:
            v = ARGON2ID
        return argon2hash(
            password=bytes(data),
            salt=S,
            time_cost=t,
            memory_cost=m,
            parallelism=p,
            tag_length=n,
            variant=v,
            secret=K,
            associated_data=X,
        )

Ancestors

Subclasses

Class variables

var reverse

The type of the None singleton.

Inherited members