/** * @cond internal * @file test_x25519.c * @copyright * Copyright (c) 2016 Cryptography Research, Inc. \n * Released under the MIT License. See LICENSE.txt for license information. * @author Mike Hamburg * @brief Tests for x25519 key exchange and signatures. */ #include "x25519.h" #include "strobe_config.h" #include #include #include #include static void __attribute__((unused)) randomize(uint8_t foo[X25519_BYTES]) { unsigned i; static unsigned int seed = 0x12345678; for (i=0; i>24; } } int main(int argc, char **argv) { (void)argc; (void)argv; int i; unsigned char secret1[X25519_BYTES], public1[X25519_BYTES], secret2[X25519_BYTES], public2[X25519_BYTES], shared1[X25519_BYTES], shared2[X25519_BYTES]; for (i=0; i<1000; i++) { randomize(secret1); x25519_base(public1,secret1,i%2); randomize(secret2); x25519_base(public2,secret2,i%2); x25519(shared1,secret1,public2,i%2); x25519(shared2,secret2,public1,i%2); if (memcmp(shared1,shared2,sizeof(shared1))) { printf("FAIL shared %d\n",i); } } #if X25519_SUPPORT_SIGN && X25519_SUPPORT_VERIFY unsigned char eph_secret[X25519_BYTES], eph_public[X25519_BYTES], challenge[X25519_BYTES], response[X25519_BYTES]; for (i=0; i<1000; i++) { randomize(secret1); x25519_base(public1,secret1,0); randomize(eph_secret); x25519_base(eph_public,eph_secret,0); randomize(challenge); x25519_sign_p2(response,challenge,eph_secret,secret1); if (0 != x25519_verify_p2(response,challenge,eph_public,public1)) { printf("FAIL sign %d\n",i); } challenge[4] ^= 1; if (0 == x25519_verify_p2(response,challenge,eph_public,public1)) { printf("FAIL unsign %d\n",i); } } #endif unsigned char base[X25519_BYTES] = {9}; unsigned char key[X25519_BYTES] = {9}; unsigned char *b = base, *k = key, *tmp; for (i=0; i<1000; i++) { x25519(b,k,b,1); tmp = b; b = k; k = tmp; } for (i=0; i