1*0ac341f1SConrad Meyer #define TEST_NAME "sodium_utils" 2*0ac341f1SConrad Meyer #include "cmptest.h" 3*0ac341f1SConrad Meyer 4*0ac341f1SConrad Meyer int 5*0ac341f1SConrad Meyer main(void) 6*0ac341f1SConrad Meyer { 7*0ac341f1SConrad Meyer unsigned char buf_add[1000]; 8*0ac341f1SConrad Meyer unsigned char buf1[1000]; 9*0ac341f1SConrad Meyer unsigned char buf2[1000]; 10*0ac341f1SConrad Meyer unsigned char buf1_rev[1000]; 11*0ac341f1SConrad Meyer unsigned char buf2_rev[1000]; 12*0ac341f1SConrad Meyer unsigned char nonce[24]; 13*0ac341f1SConrad Meyer char nonce_hex[49]; 14*0ac341f1SConrad Meyer unsigned char *bin_padded; 15*0ac341f1SConrad Meyer size_t bin_len, bin_len2; 16*0ac341f1SConrad Meyer size_t bin_padded_len; 17*0ac341f1SConrad Meyer size_t bin_padded_maxlen; 18*0ac341f1SConrad Meyer size_t blocksize; 19*0ac341f1SConrad Meyer unsigned int i; 20*0ac341f1SConrad Meyer unsigned int j; 21*0ac341f1SConrad Meyer 22*0ac341f1SConrad Meyer randombytes_buf(buf1, sizeof buf1); 23*0ac341f1SConrad Meyer memcpy(buf2, buf1, sizeof buf2); 24*0ac341f1SConrad Meyer printf("%d\n", sodium_memcmp(buf1, buf2, sizeof buf1)); 25*0ac341f1SConrad Meyer sodium_memzero(buf1, 0U); 26*0ac341f1SConrad Meyer printf("%d\n", sodium_memcmp(buf1, buf2, sizeof buf1)); 27*0ac341f1SConrad Meyer sodium_memzero(buf1, sizeof buf1 / 2); 28*0ac341f1SConrad Meyer printf("%d\n", sodium_memcmp(buf1, buf2, sizeof buf1)); 29*0ac341f1SConrad Meyer printf("%d\n", sodium_memcmp(buf1, buf2, 0U)); 30*0ac341f1SConrad Meyer sodium_memzero(buf2, sizeof buf2 / 2); 31*0ac341f1SConrad Meyer printf("%d\n", sodium_memcmp(buf1, buf2, sizeof buf1)); 32*0ac341f1SConrad Meyer 33*0ac341f1SConrad Meyer memset(nonce, 0, sizeof nonce); 34*0ac341f1SConrad Meyer sodium_increment(nonce, sizeof nonce); 35*0ac341f1SConrad Meyer printf("%s\n", 36*0ac341f1SConrad Meyer sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce)); 37*0ac341f1SConrad Meyer memset(nonce, 255, sizeof nonce); 38*0ac341f1SConrad Meyer sodium_increment(nonce, sizeof nonce); 39*0ac341f1SConrad Meyer printf("%s\n", 40*0ac341f1SConrad Meyer sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce)); 41*0ac341f1SConrad Meyer nonce[1] = 1U; 42*0ac341f1SConrad Meyer sodium_increment(nonce, sizeof nonce); 43*0ac341f1SConrad Meyer printf("%s\n", 44*0ac341f1SConrad Meyer sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce)); 45*0ac341f1SConrad Meyer nonce[1] = 0U; 46*0ac341f1SConrad Meyer sodium_increment(nonce, sizeof nonce); 47*0ac341f1SConrad Meyer printf("%s\n", 48*0ac341f1SConrad Meyer sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce)); 49*0ac341f1SConrad Meyer nonce[0] = 255U; 50*0ac341f1SConrad Meyer nonce[2] = 255U; 51*0ac341f1SConrad Meyer sodium_increment(nonce, sizeof nonce); 52*0ac341f1SConrad Meyer printf("%s\n", 53*0ac341f1SConrad Meyer sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce)); 54*0ac341f1SConrad Meyer for (i = 0U; i < 1000U; i++) { 55*0ac341f1SConrad Meyer bin_len = (size_t) randombytes_uniform(sizeof buf1); 56*0ac341f1SConrad Meyer randombytes_buf(buf1, bin_len); 57*0ac341f1SConrad Meyer randombytes_buf(buf2, bin_len); 58*0ac341f1SConrad Meyer for (j = 0U; j < bin_len; j++) { 59*0ac341f1SConrad Meyer buf1_rev[bin_len - 1 - j] = buf1[j]; 60*0ac341f1SConrad Meyer buf2_rev[bin_len - 1 - j] = buf2[j]; 61*0ac341f1SConrad Meyer } 62*0ac341f1SConrad Meyer if (memcmp(buf1_rev, buf2_rev, bin_len) * 63*0ac341f1SConrad Meyer sodium_compare(buf1, buf2, bin_len) < 64*0ac341f1SConrad Meyer 0) { 65*0ac341f1SConrad Meyer printf("sodium_compare() failure with length=%u\n", 66*0ac341f1SConrad Meyer (unsigned int) bin_len); 67*0ac341f1SConrad Meyer } 68*0ac341f1SConrad Meyer memcpy(buf1, buf2, bin_len); 69*0ac341f1SConrad Meyer if (sodium_compare(buf1, buf2, bin_len)) { 70*0ac341f1SConrad Meyer printf("sodium_compare() equality failure with length=%u\n", 71*0ac341f1SConrad Meyer (unsigned int) bin_len); 72*0ac341f1SConrad Meyer } 73*0ac341f1SConrad Meyer } 74*0ac341f1SConrad Meyer memset(buf1, 0, sizeof buf1); 75*0ac341f1SConrad Meyer if (sodium_is_zero(buf1, sizeof buf1) != 1) { 76*0ac341f1SConrad Meyer printf("sodium_is_zero() failed\n"); 77*0ac341f1SConrad Meyer } 78*0ac341f1SConrad Meyer for (i = 0U; i < sizeof buf1; i++) { 79*0ac341f1SConrad Meyer buf1[i]++; 80*0ac341f1SConrad Meyer if (sodium_is_zero(buf1, sizeof buf1) != 0) { 81*0ac341f1SConrad Meyer printf("sodium_is_zero() failed\n"); 82*0ac341f1SConrad Meyer } 83*0ac341f1SConrad Meyer buf1[i]--; 84*0ac341f1SConrad Meyer } 85*0ac341f1SConrad Meyer bin_len = randombytes_uniform(sizeof buf1); 86*0ac341f1SConrad Meyer randombytes_buf(buf1, bin_len); 87*0ac341f1SConrad Meyer memcpy(buf2, buf1, bin_len); 88*0ac341f1SConrad Meyer memset(buf_add, 0, bin_len); 89*0ac341f1SConrad Meyer j = randombytes_uniform(10000); 90*0ac341f1SConrad Meyer for (i = 0U; i < j; i++) { 91*0ac341f1SConrad Meyer sodium_increment(buf1, bin_len); 92*0ac341f1SConrad Meyer sodium_increment(buf_add, bin_len); 93*0ac341f1SConrad Meyer } 94*0ac341f1SConrad Meyer sodium_add(buf2, buf_add, bin_len); 95*0ac341f1SConrad Meyer if (sodium_compare(buf1, buf2, bin_len) != 0) { 96*0ac341f1SConrad Meyer printf("sodium_add() failed\n"); 97*0ac341f1SConrad Meyer } 98*0ac341f1SConrad Meyer bin_len = randombytes_uniform(sizeof buf1); 99*0ac341f1SConrad Meyer randombytes_buf(buf1, bin_len); 100*0ac341f1SConrad Meyer memcpy(buf2, buf1, bin_len); 101*0ac341f1SConrad Meyer memset(buf_add, 0xff, bin_len); 102*0ac341f1SConrad Meyer sodium_increment(buf2, bin_len); 103*0ac341f1SConrad Meyer sodium_increment(buf2, 0U); 104*0ac341f1SConrad Meyer sodium_add(buf2, buf_add, bin_len); 105*0ac341f1SConrad Meyer sodium_add(buf2, buf_add, 0U); 106*0ac341f1SConrad Meyer if (sodium_compare(buf1, buf2, bin_len) != 0) { 107*0ac341f1SConrad Meyer printf("sodium_add() failed\n"); 108*0ac341f1SConrad Meyer } 109*0ac341f1SConrad Meyer 110*0ac341f1SConrad Meyer assert(sizeof nonce >= 24U); 111*0ac341f1SConrad Meyer memset(nonce, 0xfe, 24U); 112*0ac341f1SConrad Meyer memset(nonce, 0xff, 6U); 113*0ac341f1SConrad Meyer sodium_increment(nonce, 8U); 114*0ac341f1SConrad Meyer printf("%s\n", 115*0ac341f1SConrad Meyer sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce)); 116*0ac341f1SConrad Meyer memset(nonce, 0xfe, 24U); 117*0ac341f1SConrad Meyer memset(nonce, 0xff, 10U); 118*0ac341f1SConrad Meyer sodium_increment(nonce, 12U); 119*0ac341f1SConrad Meyer printf("%s\n", 120*0ac341f1SConrad Meyer sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce)); 121*0ac341f1SConrad Meyer memset(nonce, 0xff, 22U); 122*0ac341f1SConrad Meyer sodium_increment(nonce, 24U); 123*0ac341f1SConrad Meyer printf("%s\n", 124*0ac341f1SConrad Meyer sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce)); 125*0ac341f1SConrad Meyer 126*0ac341f1SConrad Meyer assert(sizeof nonce >= 24U); 127*0ac341f1SConrad Meyer memset(nonce, 0xfe, 24U); 128*0ac341f1SConrad Meyer memset(nonce, 0xff, 6U); 129*0ac341f1SConrad Meyer sodium_add(nonce, nonce, 7U); 130*0ac341f1SConrad Meyer sodium_add(nonce, nonce, 8U); 131*0ac341f1SConrad Meyer printf("%s\n", 132*0ac341f1SConrad Meyer sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce)); 133*0ac341f1SConrad Meyer memset(nonce, 0xfe, 24U); 134*0ac341f1SConrad Meyer memset(nonce, 0xff, 10U); 135*0ac341f1SConrad Meyer sodium_add(nonce, nonce, 11U); 136*0ac341f1SConrad Meyer sodium_add(nonce, nonce, 12U); 137*0ac341f1SConrad Meyer printf("%s\n", 138*0ac341f1SConrad Meyer sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce)); 139*0ac341f1SConrad Meyer memset(nonce, 0xff, 22U); 140*0ac341f1SConrad Meyer sodium_add(nonce, nonce, 23U); 141*0ac341f1SConrad Meyer sodium_add(nonce, nonce, 24U); 142*0ac341f1SConrad Meyer printf("%s\n", 143*0ac341f1SConrad Meyer sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce)); 144*0ac341f1SConrad Meyer 145*0ac341f1SConrad Meyer for (i = 0; i < 2000U; i++) { 146*0ac341f1SConrad Meyer bin_len = randombytes_uniform(200U); 147*0ac341f1SConrad Meyer blocksize = 1U + randombytes_uniform(100U); 148*0ac341f1SConrad Meyer bin_padded_maxlen = bin_len + (blocksize - bin_len % blocksize); 149*0ac341f1SConrad Meyer bin_padded = (unsigned char *) sodium_malloc(bin_padded_maxlen); 150*0ac341f1SConrad Meyer randombytes_buf(bin_padded, bin_padded_maxlen); 151*0ac341f1SConrad Meyer 152*0ac341f1SConrad Meyer assert(sodium_pad(&bin_padded_len, bin_padded, bin_len, 153*0ac341f1SConrad Meyer blocksize, bin_padded_maxlen - 1U) == -1); 154*0ac341f1SConrad Meyer assert(sodium_pad(NULL, bin_padded, bin_len, 155*0ac341f1SConrad Meyer blocksize, bin_padded_maxlen + 1U) == 0); 156*0ac341f1SConrad Meyer assert(sodium_pad(&bin_padded_len, bin_padded, bin_len, 157*0ac341f1SConrad Meyer blocksize, bin_padded_maxlen + 1U) == 0); 158*0ac341f1SConrad Meyer assert(sodium_pad(&bin_padded_len, bin_padded, bin_len, 159*0ac341f1SConrad Meyer 0U, bin_padded_maxlen) == -1); 160*0ac341f1SConrad Meyer assert(sodium_pad(&bin_padded_len, bin_padded, bin_len, 161*0ac341f1SConrad Meyer blocksize, bin_padded_maxlen) == 0); 162*0ac341f1SConrad Meyer assert(bin_padded_len == bin_padded_maxlen); 163*0ac341f1SConrad Meyer 164*0ac341f1SConrad Meyer assert(sodium_unpad(&bin_len2, bin_padded, bin_padded_len, 165*0ac341f1SConrad Meyer bin_padded_len + 1U) == -1); 166*0ac341f1SConrad Meyer assert(sodium_unpad(&bin_len2, bin_padded, bin_padded_len, 167*0ac341f1SConrad Meyer 0U) == -1); 168*0ac341f1SConrad Meyer assert(sodium_unpad(&bin_len2, bin_padded, bin_padded_len, 169*0ac341f1SConrad Meyer blocksize) == 0); 170*0ac341f1SConrad Meyer assert(bin_len2 == bin_len); 171*0ac341f1SConrad Meyer 172*0ac341f1SConrad Meyer sodium_free(bin_padded); 173*0ac341f1SConrad Meyer } 174*0ac341f1SConrad Meyer 175*0ac341f1SConrad Meyer sodium_stackzero(512); 176*0ac341f1SConrad Meyer 177*0ac341f1SConrad Meyer return 0; 178*0ac341f1SConrad Meyer } 179