Pular para conteúdo

Generators

generate_account_number()

Gera uma sequência de números aleatórios.

Returns:

Type Description
str

Uma sequência de dígitos.

Source code in payment_emulation/utils/generators.py
113
114
115
116
117
118
119
120
121
122
def generate_account_number() -> str:
    """Gera uma sequência de números aleatórios.

    Returns:
        Uma sequência de dígitos.
    """
    agency = f"{random.randint(1000, 9999)}{random.randint(0, 9)}"
    account = f"{random.randint(10000, 99999)}{random.randint(10, 99)}"
    account_number =  f"{agency}{account}"
    return account_number

generate_card_number(flag)

Gera um número de cartão válido com base na flag fornecida. As flags preconfiguradas são (Visa, Mastercard, Elo e Other).

Parameters:

Name Type Description Default
flag str

O nome de uma flag que está na variável prefixes.

required

Raises:

Type Description
ValueError

Se a flag não estiver nos prefixes.

Returns:

Type Description
str

Uma sequência de dígitos.

Source code in payment_emulation/utils/generators.py
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
def generate_card_number(flag: str) -> str:
    """Gera um número de cartão válido com base na flag fornecida.
    As flags preconfiguradas são (Visa, Mastercard, Elo e Other).

    Args:
        flag: O nome de uma flag que está na variável `prefixes`.

    Raises:
        ValueError: Se a flag não estiver nos `prefixes`.

    Returns:
        Uma sequência de dígitos.
    """

    if flag.upper() not in prefixes:
        raise ValueError(
            "Flag not supported."
        )

    prefix = random.choice(prefixes[flag])

    total_length = 16

    initial_number = prefix + ''.join(str(random.randint(0, 9)) for _ in range(total_length - len(prefix) - 1))

    for final_digit in range(10):
        full_number = initial_number + str(final_digit)
        if luhn_checksum(full_number) == 0:
            return full_number

generate_cvv(card_number, validity, secret)

Gera um CVV criptografado com base no número do cartão, data de validade e uma chave secreta.

Parameters:

Name Type Description Default
card_number str

Uma sequência de dígitos.

required
validity date

Uma data do tipo date. Ex: 2024-12-1.

required
secret str

Uma sequência de caracteres.

required

Returns:

Type Description
str

Uma sequência de 3 dígitos.

Source code in payment_emulation/utils/generators.py
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
def generate_cvv(card_number: str, validity: date, secret: str) -> str:
    """Gera um CVV criptografado com base no número do cartão, data de validade 
        e uma chave secreta.

        Args:
            card_number: Uma sequência de dígitos.
            validity: Uma data do tipo `date`. Ex: 2024-12-1.
            secret: Uma sequência de caracteres.

        Returns:
            Uma sequência de 3 dígitos.
    """

    data = f"{card_number}-{validity.month}/{str(validity.year)[2:]}"

    hmac_generator = hmac.new(
        secret.encode(), data.encode(), hashlib.sha256
    )

    hash_hex = hmac_generator.hexdigest()

    cvv = ''.join(filter(str.isdigit, hash_hex))[:3]

    return cvv

luhn_checksum(card_number)

Calcula a soma de verificação do algoritmo de Luhn para validar o número do cartão.

Parameters:

Name Type Description Default
card_number str

Uma sequência de dígitos.

required

Returns:

Type Description
int

Válido se for zero, caso contrário, inválido.

Source code in payment_emulation/utils/generators.py
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
def luhn_checksum(card_number: str) -> int:
    """Calcula a soma de verificação do algoritmo de Luhn para validar o número do cartão.

    Args:
        card_number: Uma sequência de dígitos.

    Returns:
        Válido se for zero, caso contrário, inválido.
    """
    def digits_of(n):
        return [int(d) for d in str(n)]

    digits = digits_of(card_number)
    odd_digits = digits[-1::-2]
    even_digits = digits[-2::-2]
    checksum = sum(odd_digits)
    for d in even_digits:
        checksum += sum(digits_of(d * 2))
    return checksum % 10

verify_cvv(card_number, validity, secret, cvv_to_verify)

Verifica se o CVV fornecido corresponde ao número do cartão e à data de validade.

Parameters:

Name Type Description Default
card_number str

uma sequência de dígitos.

required
validity str

uma data com o mês e o ano. Ex: 12/24.

required
secret str

uma chave secreta escolhida para criptografia.

required
cvv_to_verify str

CVV fornecido para verificação.

required

Returns:

Type Description
bool

Um bool, True ou False.

Source code in payment_emulation/utils/generators.py
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
def verify_cvv(card_number: str, validity: str, secret: str,
                cvv_to_verify: str) -> bool:
    """Verifica se o CVV fornecido corresponde ao número do cartão e à data de validade.

    Args:
        card_number: uma sequência de dígitos.
        validity: uma data com o mês e o ano. Ex: 12/24.
        secret: uma chave secreta escolhida para criptografia.
        cvv_to_verify: CVV fornecido para verificação.

    Returns:
        Um `bool`, True ou False.
    """
    expected_cvv = generate_cvv(card_number, validity, secret)

    return cvv_to_verify == expected_cvv