summaryrefslogtreecommitdiff
path: root/test/default/pwhash_scrypt_ll.c
blob: db72e4e9413af90ebdcf4c4b1d8a22bf1c236df6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define TEST_NAME "pwhash_scrypt_ll"
#include "cmptest.h"

/* Tarsnap test vectors, see: https://www.tarsnap.com/scrypt/scrypt.pdf */

static const char *password1 = "";
static const char *salt1 = "";
static uint64_t    N1 = 16U;
static uint32_t    r1 = 1U;
static uint32_t    p1 = 1U;

static const char *password2 = "password";
static const char *salt2 = "NaCl";
static uint64_t    N2 = 1024U;
static uint32_t    r2 = 8U;
static uint32_t    p2 = 16U;

static const char *password3 = "pleaseletmein";
static const char *salt3  = "SodiumChloride";
static uint64_t    N3 = 16384U;
static uint32_t    r3 = 8U;
static uint32_t    p3 = 1U;

static void test_vector(const char *password, const char *salt,
                        uint64_t N, uint32_t r, uint32_t p)
{
    uint8_t data[64];
    size_t  i;
    size_t  olen = (sizeof data / sizeof data[0]);
    size_t  passwordLength = strlen(password);
    size_t  saltLenght = strlen(salt);
    int     lineitems = 0;
    int     lineitemsLimit = 15;

    if (crypto_pwhash_scryptsalsa208sha256_ll((const uint8_t *) password,
                                              passwordLength,
                                              (const uint8_t *) salt,
                                              saltLenght,
                                              N, r, p, data, olen) != 0) {
        printf("pwhash_scryptsalsa208sha256_ll([%s],[%s]) failure\n",
               password, salt);
        return;
    }

    printf("scrypt('%s', '%s', %llu, %lu, %lu, %lu) =\n",
           password, salt,
           (unsigned long long) N, (unsigned long) r, (unsigned long) p,
           (unsigned long) olen);

    for (i = 0; i < olen; ++i) {
        printf("%02x%c", data[i], lineitems < lineitemsLimit ? ' ' : '\n');
        lineitems = lineitems < lineitemsLimit ? lineitems + 1 : 0;
    }
}

int main(void)
{
   test_vector(password1, salt1, N1, r1, p1);
   test_vector(password2, salt2, N2, r2, p2);
   test_vector(password3, salt3, N3, r3, p3);

   return 0;
}