| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,41 @@ | ||
| #ifndef FE_H | ||
| #define FE_H | ||
|
|
||
| #include "fixedint.h" | ||
|
|
||
|
|
||
| /* | ||
| fe means field element. | ||
| Here the field is \Z/(2^255-19). | ||
| An element t, entries t[0]...t[9], represents the integer | ||
| t[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9]. | ||
| Bounds on each t[i] vary depending on context. | ||
| */ | ||
|
|
||
|
|
||
| typedef int32_t fe[10]; | ||
|
|
||
|
|
||
| void fe_0(fe h); | ||
| void fe_1(fe h); | ||
|
|
||
| void fe_frombytes(fe h, const unsigned char *s); | ||
| void fe_tobytes(unsigned char *s, const fe h); | ||
|
|
||
| void fe_copy(fe h, const fe f); | ||
| int fe_isnegative(const fe f); | ||
| int fe_isnonzero(const fe f); | ||
| void fe_cmov(fe f, const fe g, unsigned int b); | ||
| void fe_cswap(fe f, fe g, unsigned int b); | ||
|
|
||
| void fe_neg(fe h, const fe f); | ||
| void fe_add(fe h, const fe f, const fe g); | ||
| void fe_invert(fe out, const fe z); | ||
| void fe_sq(fe h, const fe f); | ||
| void fe_sq2(fe h, const fe f); | ||
| void fe_mul(fe h, const fe f, const fe g); | ||
| void fe_mul121666(fe h, fe f); | ||
| void fe_pow22523(fe out, const fe z); | ||
| void fe_sub(fe h, const fe f, const fe g); | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,72 @@ | ||
| /* | ||
| Portable header to provide the 32 and 64 bits type. | ||
| Not a compatible replacement for <stdint.h>, do not blindly use it as such. | ||
| */ | ||
|
|
||
| #if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined(__WATCOMC__) && (defined(_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_) || defined(__UINT_FAST64_TYPE__)) )) && !defined(FIXEDINT_H_INCLUDED) | ||
| #include <stdint.h> | ||
| #define FIXEDINT_H_INCLUDED | ||
|
|
||
| #if defined(__WATCOMC__) && __WATCOMC__ >= 1250 && !defined(UINT64_C) | ||
| #include <limits.h> | ||
| #define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX)) | ||
| #endif | ||
| #endif | ||
|
|
||
|
|
||
| #ifndef FIXEDINT_H_INCLUDED | ||
| #define FIXEDINT_H_INCLUDED | ||
|
|
||
| #include <limits.h> | ||
|
|
||
| /* (u)int32_t */ | ||
| #ifndef uint32_t | ||
| #if (ULONG_MAX == 0xffffffffUL) | ||
| typedef unsigned long uint32_t; | ||
| #elif (UINT_MAX == 0xffffffffUL) | ||
| typedef unsigned int uint32_t; | ||
| #elif (USHRT_MAX == 0xffffffffUL) | ||
| typedef unsigned short uint32_t; | ||
| #endif | ||
| #endif | ||
|
|
||
|
|
||
| #ifndef int32_t | ||
| #if (LONG_MAX == 0x7fffffffL) | ||
| typedef signed long int32_t; | ||
| #elif (INT_MAX == 0x7fffffffL) | ||
| typedef signed int int32_t; | ||
| #elif (SHRT_MAX == 0x7fffffffL) | ||
| typedef signed short int32_t; | ||
| #endif | ||
| #endif | ||
|
|
||
|
|
||
| /* (u)int64_t */ | ||
| #if (defined(__STDC__) && defined(__STDC_VERSION__) && __STDC__ && __STDC_VERSION__ >= 199901L) | ||
| typedef long long int64_t; | ||
| typedef unsigned long long uint64_t; | ||
|
|
||
| #define UINT64_C(v) v ##ULL | ||
| #define INT64_C(v) v ##LL | ||
| #elif defined(__GNUC__) | ||
| __extension__ typedef long long int64_t; | ||
| __extension__ typedef unsigned long long uint64_t; | ||
|
|
||
| #define UINT64_C(v) v ##ULL | ||
| #define INT64_C(v) v ##LL | ||
| #elif defined(__MWERKS__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(__APPLE_CC__) || defined(_LONG_LONG) || defined(_CRAYC) | ||
| typedef long long int64_t; | ||
| typedef unsigned long long uint64_t; | ||
|
|
||
| #define UINT64_C(v) v ##ULL | ||
| #define INT64_C(v) v ##LL | ||
| #elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined(__BORLANDC__) && __BORLANDC__ > 0x460) || defined(__alpha) || defined(__DECC) | ||
| typedef __int64 int64_t; | ||
| typedef unsigned __int64 uint64_t; | ||
|
|
||
| #define UINT64_C(v) v ##UI64 | ||
| #define INT64_C(v) v ##I64 | ||
| #endif | ||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,74 @@ | ||
| #ifndef GE_H | ||
| #define GE_H | ||
|
|
||
| #include "fe.h" | ||
|
|
||
|
|
||
| /* | ||
| ge means group element. | ||
| Here the group is the set of pairs (x,y) of field elements (see fe.h) | ||
| satisfying -x^2 + y^2 = 1 + d x^2y^2 | ||
| where d = -121665/121666. | ||
| Representations: | ||
| ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z | ||
| ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT | ||
| ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T | ||
| ge_precomp (Duif): (y+x,y-x,2dxy) | ||
| */ | ||
|
|
||
| typedef struct { | ||
| fe X; | ||
| fe Y; | ||
| fe Z; | ||
| } ge_p2; | ||
|
|
||
| typedef struct { | ||
| fe X; | ||
| fe Y; | ||
| fe Z; | ||
| fe T; | ||
| } ge_p3; | ||
|
|
||
| typedef struct { | ||
| fe X; | ||
| fe Y; | ||
| fe Z; | ||
| fe T; | ||
| } ge_p1p1; | ||
|
|
||
| typedef struct { | ||
| fe yplusx; | ||
| fe yminusx; | ||
| fe xy2d; | ||
| } ge_precomp; | ||
|
|
||
| typedef struct { | ||
| fe YplusX; | ||
| fe YminusX; | ||
| fe Z; | ||
| fe T2d; | ||
| } ge_cached; | ||
|
|
||
| void ge_p3_tobytes(unsigned char *s, const ge_p3 *h); | ||
| void ge_tobytes(unsigned char *s, const ge_p2 *h); | ||
| int ge_frombytes_negate_vartime(ge_p3 *h, const unsigned char *s); | ||
|
|
||
| void ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q); | ||
| void ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q); | ||
| void ge_double_scalarmult_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A, const unsigned char *b); | ||
| void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q); | ||
| void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q); | ||
| void ge_scalarmult_base(ge_p3 *h, const unsigned char *a); | ||
|
|
||
| void ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p); | ||
| void ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p); | ||
| void ge_p2_0(ge_p2 *h); | ||
| void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p); | ||
| void ge_p3_0(ge_p3 *h); | ||
| void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p); | ||
| void ge_p3_to_cached(ge_cached *r, const ge_p3 *p); | ||
| void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p); | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,79 @@ | ||
| #include "ed25519.h" | ||
| #include "fe.h" | ||
|
|
||
| void ed25519_key_exchange(unsigned char *shared_secret, const unsigned char *public_key, const unsigned char *private_key) { | ||
| unsigned char e[32]; | ||
| unsigned int i; | ||
|
|
||
| fe x1; | ||
| fe x2; | ||
| fe z2; | ||
| fe x3; | ||
| fe z3; | ||
| fe tmp0; | ||
| fe tmp1; | ||
|
|
||
| int pos; | ||
| unsigned int swap; | ||
| unsigned int b; | ||
|
|
||
| /* copy the private key and make sure it's valid */ | ||
| for (i = 0; i < 32; ++i) { | ||
| e[i] = private_key[i]; | ||
| } | ||
|
|
||
| e[0] &= 248; | ||
| e[31] &= 63; | ||
| e[31] |= 64; | ||
|
|
||
| /* unpack the public key and convert edwards to montgomery */ | ||
| /* due to CodesInChaos: montgomeryX = (edwardsY + 1)*inverse(1 - edwardsY) mod p */ | ||
| fe_frombytes(x1, public_key); | ||
| fe_1(tmp1); | ||
| fe_add(tmp0, x1, tmp1); | ||
| fe_sub(tmp1, tmp1, x1); | ||
| fe_invert(tmp1, tmp1); | ||
| fe_mul(x1, tmp0, tmp1); | ||
|
|
||
| fe_1(x2); | ||
| fe_0(z2); | ||
| fe_copy(x3, x1); | ||
| fe_1(z3); | ||
|
|
||
| swap = 0; | ||
| for (pos = 254; pos >= 0; --pos) { | ||
| b = e[pos / 8] >> (pos & 7); | ||
| b &= 1; | ||
| swap ^= b; | ||
| fe_cswap(x2, x3, swap); | ||
| fe_cswap(z2, z3, swap); | ||
| swap = b; | ||
|
|
||
| /* from montgomery.h */ | ||
| fe_sub(tmp0, x3, z3); | ||
| fe_sub(tmp1, x2, z2); | ||
| fe_add(x2, x2, z2); | ||
| fe_add(z2, x3, z3); | ||
| fe_mul(z3, tmp0, x2); | ||
| fe_mul(z2, z2, tmp1); | ||
| fe_sq(tmp0, tmp1); | ||
| fe_sq(tmp1, x2); | ||
| fe_add(x3, z3, z2); | ||
| fe_sub(z2, z3, z2); | ||
| fe_mul(x2, tmp1, tmp0); | ||
| fe_sub(tmp1, tmp1, tmp0); | ||
| fe_sq(z2, z2); | ||
| fe_mul121666(z3, tmp1); | ||
| fe_sq(x3, x3); | ||
| fe_add(tmp0, tmp0, z3); | ||
| fe_mul(z3, x1, z2); | ||
| fe_mul(z2, tmp1, tmp0); | ||
| } | ||
|
|
||
| fe_cswap(x2, x3, swap); | ||
| fe_cswap(z2, z3, swap); | ||
|
|
||
| fe_invert(z2, z2); | ||
| fe_mul(x2, x2, z2); | ||
| fe_tobytes(shared_secret, x2); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| #include "ed25519.h" | ||
| #include "sha512.h" | ||
| #include "ge.h" | ||
|
|
||
|
|
||
| void ed25519_create_keypair(unsigned char *public_key, unsigned char *private_key, const unsigned char *seed) { | ||
| ge_p3 A; | ||
|
|
||
| sha512(seed, 32, private_key); | ||
| private_key[0] &= 248; | ||
| private_key[31] &= 63; | ||
| private_key[31] |= 64; | ||
|
|
||
| ge_scalarmult_base(&A, private_key); | ||
| ge_p3_tobytes(public_key, &A); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| Copyright (c) 2015 Orson Peters <orsonpeters@gmail.com> | ||
|
|
||
| This software is provided 'as-is', without any express or implied warranty. In no event will the | ||
| authors be held liable for any damages arising from the use of this software. | ||
|
|
||
| Permission is granted to anyone to use this software for any purpose, including commercial | ||
| applications, and to alter it and redistribute it freely, subject to the following restrictions: | ||
|
|
||
| 1. The origin of this software must not be misrepresented; you must not claim that you wrote the | ||
| original software. If you use this software in a product, an acknowledgment in the product | ||
| documentation would be appreciated but is not required. | ||
|
|
||
| 2. Altered source versions must be plainly marked as such, and must not be misrepresented as | ||
| being the original software. | ||
|
|
||
| 3. This notice may not be removed or altered from any source distribution. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| #ifndef SC_H | ||
| #define SC_H | ||
|
|
||
| /* | ||
| The set of scalars is \Z/l | ||
| where l = 2^252 + 27742317777372353535851937790883648493. | ||
| */ | ||
|
|
||
| void sc_reduce(unsigned char *s); | ||
| void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c); | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,40 @@ | ||
| #include "ed25519.h" | ||
|
|
||
| #ifndef ED25519_NO_SEED | ||
|
|
||
| #ifdef _WIN32 | ||
| #include <windows.h> | ||
| #include <wincrypt.h> | ||
| #else | ||
| #include <stdio.h> | ||
| #endif | ||
|
|
||
| int ed25519_create_seed(unsigned char *seed) { | ||
| #ifdef _WIN32 | ||
| HCRYPTPROV prov; | ||
|
|
||
| if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { | ||
| return 1; | ||
| } | ||
|
|
||
| if (!CryptGenRandom(prov, 32, seed)) { | ||
| CryptReleaseContext(prov, 0); | ||
| return 1; | ||
| } | ||
|
|
||
| CryptReleaseContext(prov, 0); | ||
| #else | ||
| FILE *f = fopen("/dev/urandom", "rb"); | ||
|
|
||
| if (f == NULL) { | ||
| return 1; | ||
| } | ||
|
|
||
| fread(seed, 1, 32, f); | ||
| fclose(f); | ||
| #endif | ||
|
|
||
| return 0; | ||
| } | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,275 @@ | ||
| /* LibTomCrypt, modular cryptographic library -- Tom St Denis | ||
| * | ||
| * LibTomCrypt is a library that provides various cryptographic | ||
| * algorithms in a highly modular and flexible manner. | ||
| * | ||
| * The library is free for all purposes without any express | ||
| * guarantee it works. | ||
| * | ||
| * Tom St Denis, tomstdenis@gmail.com, http://libtom.org | ||
| */ | ||
|
|
||
| #include "fixedint.h" | ||
| #include "sha512.h" | ||
|
|
||
| /* the K array */ | ||
| static const uint64_t K[80] = { | ||
| UINT64_C(0x428a2f98d728ae22), UINT64_C(0x7137449123ef65cd), | ||
| UINT64_C(0xb5c0fbcfec4d3b2f), UINT64_C(0xe9b5dba58189dbbc), | ||
| UINT64_C(0x3956c25bf348b538), UINT64_C(0x59f111f1b605d019), | ||
| UINT64_C(0x923f82a4af194f9b), UINT64_C(0xab1c5ed5da6d8118), | ||
| UINT64_C(0xd807aa98a3030242), UINT64_C(0x12835b0145706fbe), | ||
| UINT64_C(0x243185be4ee4b28c), UINT64_C(0x550c7dc3d5ffb4e2), | ||
| UINT64_C(0x72be5d74f27b896f), UINT64_C(0x80deb1fe3b1696b1), | ||
| UINT64_C(0x9bdc06a725c71235), UINT64_C(0xc19bf174cf692694), | ||
| UINT64_C(0xe49b69c19ef14ad2), UINT64_C(0xefbe4786384f25e3), | ||
| UINT64_C(0x0fc19dc68b8cd5b5), UINT64_C(0x240ca1cc77ac9c65), | ||
| UINT64_C(0x2de92c6f592b0275), UINT64_C(0x4a7484aa6ea6e483), | ||
| UINT64_C(0x5cb0a9dcbd41fbd4), UINT64_C(0x76f988da831153b5), | ||
| UINT64_C(0x983e5152ee66dfab), UINT64_C(0xa831c66d2db43210), | ||
| UINT64_C(0xb00327c898fb213f), UINT64_C(0xbf597fc7beef0ee4), | ||
| UINT64_C(0xc6e00bf33da88fc2), UINT64_C(0xd5a79147930aa725), | ||
| UINT64_C(0x06ca6351e003826f), UINT64_C(0x142929670a0e6e70), | ||
| UINT64_C(0x27b70a8546d22ffc), UINT64_C(0x2e1b21385c26c926), | ||
| UINT64_C(0x4d2c6dfc5ac42aed), UINT64_C(0x53380d139d95b3df), | ||
| UINT64_C(0x650a73548baf63de), UINT64_C(0x766a0abb3c77b2a8), | ||
| UINT64_C(0x81c2c92e47edaee6), UINT64_C(0x92722c851482353b), | ||
| UINT64_C(0xa2bfe8a14cf10364), UINT64_C(0xa81a664bbc423001), | ||
| UINT64_C(0xc24b8b70d0f89791), UINT64_C(0xc76c51a30654be30), | ||
| UINT64_C(0xd192e819d6ef5218), UINT64_C(0xd69906245565a910), | ||
| UINT64_C(0xf40e35855771202a), UINT64_C(0x106aa07032bbd1b8), | ||
| UINT64_C(0x19a4c116b8d2d0c8), UINT64_C(0x1e376c085141ab53), | ||
| UINT64_C(0x2748774cdf8eeb99), UINT64_C(0x34b0bcb5e19b48a8), | ||
| UINT64_C(0x391c0cb3c5c95a63), UINT64_C(0x4ed8aa4ae3418acb), | ||
| UINT64_C(0x5b9cca4f7763e373), UINT64_C(0x682e6ff3d6b2b8a3), | ||
| UINT64_C(0x748f82ee5defb2fc), UINT64_C(0x78a5636f43172f60), | ||
| UINT64_C(0x84c87814a1f0ab72), UINT64_C(0x8cc702081a6439ec), | ||
| UINT64_C(0x90befffa23631e28), UINT64_C(0xa4506cebde82bde9), | ||
| UINT64_C(0xbef9a3f7b2c67915), UINT64_C(0xc67178f2e372532b), | ||
| UINT64_C(0xca273eceea26619c), UINT64_C(0xd186b8c721c0c207), | ||
| UINT64_C(0xeada7dd6cde0eb1e), UINT64_C(0xf57d4f7fee6ed178), | ||
| UINT64_C(0x06f067aa72176fba), UINT64_C(0x0a637dc5a2c898a6), | ||
| UINT64_C(0x113f9804bef90dae), UINT64_C(0x1b710b35131c471b), | ||
| UINT64_C(0x28db77f523047d84), UINT64_C(0x32caab7b40c72493), | ||
| UINT64_C(0x3c9ebe0a15c9bebc), UINT64_C(0x431d67c49c100d4c), | ||
| UINT64_C(0x4cc5d4becb3e42b6), UINT64_C(0x597f299cfc657e2a), | ||
| UINT64_C(0x5fcb6fab3ad6faec), UINT64_C(0x6c44198c4a475817) | ||
| }; | ||
|
|
||
| /* Various logical functions */ | ||
|
|
||
| #define ROR64c(x, y) \ | ||
| ( ((((x)&UINT64_C(0xFFFFFFFFFFFFFFFF))>>((uint64_t)(y)&UINT64_C(63))) | \ | ||
| ((x)<<((uint64_t)(64-((y)&UINT64_C(63)))))) & UINT64_C(0xFFFFFFFFFFFFFFFF)) | ||
|
|
||
| #define STORE64H(x, y) \ | ||
| { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \ | ||
| (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \ | ||
| (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \ | ||
| (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } | ||
|
|
||
| #define LOAD64H(x, y) \ | ||
| { x = (((uint64_t)((y)[0] & 255))<<56)|(((uint64_t)((y)[1] & 255))<<48) | \ | ||
| (((uint64_t)((y)[2] & 255))<<40)|(((uint64_t)((y)[3] & 255))<<32) | \ | ||
| (((uint64_t)((y)[4] & 255))<<24)|(((uint64_t)((y)[5] & 255))<<16) | \ | ||
| (((uint64_t)((y)[6] & 255))<<8)|(((uint64_t)((y)[7] & 255))); } | ||
|
|
||
|
|
||
| #define Ch(x,y,z) (z ^ (x & (y ^ z))) | ||
| #define Maj(x,y,z) (((x | y) & z) | (x & y)) | ||
| #define S(x, n) ROR64c(x, n) | ||
| #define R(x, n) (((x) &UINT64_C(0xFFFFFFFFFFFFFFFF))>>((uint64_t)n)) | ||
| #define Sigma0(x) (S(x, 28) ^ S(x, 34) ^ S(x, 39)) | ||
| #define Sigma1(x) (S(x, 14) ^ S(x, 18) ^ S(x, 41)) | ||
| #define Gamma0(x) (S(x, 1) ^ S(x, 8) ^ R(x, 7)) | ||
| #define Gamma1(x) (S(x, 19) ^ S(x, 61) ^ R(x, 6)) | ||
| #ifndef MIN | ||
| #define MIN(x, y) ( ((x)<(y))?(x):(y) ) | ||
| #endif | ||
|
|
||
| /* compress 1024-bits */ | ||
| static int sha512_compress(sha512_context *md, unsigned char *buf) | ||
| { | ||
| uint64_t S[8], W[80], t0, t1; | ||
| int i; | ||
|
|
||
| /* copy state into S */ | ||
| for (i = 0; i < 8; i++) { | ||
| S[i] = md->state[i]; | ||
| } | ||
|
|
||
| /* copy the state into 1024-bits into W[0..15] */ | ||
| for (i = 0; i < 16; i++) { | ||
| LOAD64H(W[i], buf + (8*i)); | ||
| } | ||
|
|
||
| /* fill W[16..79] */ | ||
| for (i = 16; i < 80; i++) { | ||
| W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; | ||
| } | ||
|
|
||
| /* Compress */ | ||
| #define RND(a,b,c,d,e,f,g,h,i) \ | ||
| t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ | ||
| t1 = Sigma0(a) + Maj(a, b, c);\ | ||
| d += t0; \ | ||
| h = t0 + t1; | ||
|
|
||
| for (i = 0; i < 80; i += 8) { | ||
| RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i+0); | ||
| RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],i+1); | ||
| RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],i+2); | ||
| RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],i+3); | ||
| RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],i+4); | ||
| RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],i+5); | ||
| RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],i+6); | ||
| RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],i+7); | ||
| } | ||
|
|
||
| #undef RND | ||
|
|
||
|
|
||
|
|
||
| /* feedback */ | ||
| for (i = 0; i < 8; i++) { | ||
| md->state[i] = md->state[i] + S[i]; | ||
| } | ||
|
|
||
| return 0; | ||
| } | ||
|
|
||
|
|
||
| /** | ||
| Initialize the hash state | ||
| @param md The hash state you wish to initialize | ||
| @return 0 if successful | ||
| */ | ||
| int sha512_init(sha512_context * md) { | ||
| if (md == NULL) return 1; | ||
|
|
||
| md->curlen = 0; | ||
| md->length = 0; | ||
| md->state[0] = UINT64_C(0x6a09e667f3bcc908); | ||
| md->state[1] = UINT64_C(0xbb67ae8584caa73b); | ||
| md->state[2] = UINT64_C(0x3c6ef372fe94f82b); | ||
| md->state[3] = UINT64_C(0xa54ff53a5f1d36f1); | ||
| md->state[4] = UINT64_C(0x510e527fade682d1); | ||
| md->state[5] = UINT64_C(0x9b05688c2b3e6c1f); | ||
| md->state[6] = UINT64_C(0x1f83d9abfb41bd6b); | ||
| md->state[7] = UINT64_C(0x5be0cd19137e2179); | ||
|
|
||
| return 0; | ||
| } | ||
|
|
||
| /** | ||
| Process a block of memory though the hash | ||
| @param md The hash state | ||
| @param in The data to hash | ||
| @param inlen The length of the data (octets) | ||
| @return 0 if successful | ||
| */ | ||
| int sha512_update (sha512_context * md, const unsigned char *in, size_t inlen) | ||
| { | ||
| size_t n; | ||
| size_t i; | ||
| int err; | ||
| if (md == NULL) return 1; | ||
| if (in == NULL) return 1; | ||
| if (md->curlen > sizeof(md->buf)) { | ||
| return 1; | ||
| } | ||
| while (inlen > 0) { | ||
| if (md->curlen == 0 && inlen >= 128) { | ||
| if ((err = sha512_compress (md, (unsigned char *)in)) != 0) { | ||
| return err; | ||
| } | ||
| md->length += 128 * 8; | ||
| in += 128; | ||
| inlen -= 128; | ||
| } else { | ||
| n = MIN(inlen, (128 - md->curlen)); | ||
|
|
||
| for (i = 0; i < n; i++) { | ||
| md->buf[i + md->curlen] = in[i]; | ||
| } | ||
|
|
||
|
|
||
| md->curlen += n; | ||
| in += n; | ||
| inlen -= n; | ||
| if (md->curlen == 128) { | ||
| if ((err = sha512_compress (md, md->buf)) != 0) { | ||
| return err; | ||
| } | ||
| md->length += 8*128; | ||
| md->curlen = 0; | ||
| } | ||
| } | ||
| } | ||
| return 0; | ||
| } | ||
|
|
||
| /** | ||
| Terminate the hash to get the digest | ||
| @param md The hash state | ||
| @param out [out] The destination of the hash (64 bytes) | ||
| @return 0 if successful | ||
| */ | ||
| int sha512_final(sha512_context * md, unsigned char *out) | ||
| { | ||
| int i; | ||
|
|
||
| if (md == NULL) return 1; | ||
| if (out == NULL) return 1; | ||
|
|
||
| if (md->curlen >= sizeof(md->buf)) { | ||
| return 1; | ||
| } | ||
|
|
||
| /* increase the length of the message */ | ||
| md->length += md->curlen * UINT64_C(8); | ||
|
|
||
| /* append the '1' bit */ | ||
| md->buf[md->curlen++] = (unsigned char)0x80; | ||
|
|
||
| /* if the length is currently above 112 bytes we append zeros | ||
| * then compress. Then we can fall back to padding zeros and length | ||
| * encoding like normal. | ||
| */ | ||
| if (md->curlen > 112) { | ||
| while (md->curlen < 128) { | ||
| md->buf[md->curlen++] = (unsigned char)0; | ||
| } | ||
| sha512_compress(md, md->buf); | ||
| md->curlen = 0; | ||
| } | ||
|
|
||
| /* pad upto 120 bytes of zeroes | ||
| * note: that from 112 to 120 is the 64 MSB of the length. We assume that you won't hash | ||
| * > 2^64 bits of data... :-) | ||
| */ | ||
| while (md->curlen < 120) { | ||
| md->buf[md->curlen++] = (unsigned char)0; | ||
| } | ||
|
|
||
| /* store length */ | ||
| STORE64H(md->length, md->buf+120); | ||
| sha512_compress(md, md->buf); | ||
|
|
||
| /* copy output */ | ||
| for (i = 0; i < 8; i++) { | ||
| STORE64H(md->state[i], out+(8*i)); | ||
| } | ||
|
|
||
| return 0; | ||
| } | ||
|
|
||
| int sha512(const unsigned char *message, size_t message_len, unsigned char *out) | ||
| { | ||
| sha512_context ctx; | ||
| int ret; | ||
| if ((ret = sha512_init(&ctx))) return ret; | ||
| if ((ret = sha512_update(&ctx, message, message_len))) return ret; | ||
| if ((ret = sha512_final(&ctx, out))) return ret; | ||
| return 0; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| #ifndef SHA512_H | ||
| #define SHA512_H | ||
|
|
||
| #include <stddef.h> | ||
|
|
||
| #include "fixedint.h" | ||
|
|
||
| /* state */ | ||
| typedef struct sha512_context_ { | ||
| uint64_t length, state[8]; | ||
| size_t curlen; | ||
| unsigned char buf[128]; | ||
| } sha512_context; | ||
|
|
||
|
|
||
| int sha512_init(sha512_context * md); | ||
| int sha512_final(sha512_context * md, unsigned char *out); | ||
| int sha512_update(sha512_context * md, const unsigned char *in, size_t inlen); | ||
| int sha512(const unsigned char *message, size_t message_len, unsigned char *out); | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| #include "ed25519.h" | ||
| #include "sha512.h" | ||
| #include "ge.h" | ||
| #include "sc.h" | ||
|
|
||
|
|
||
| void ed25519_sign(unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key, const unsigned char *private_key) { | ||
| sha512_context hash; | ||
| unsigned char hram[64]; | ||
| unsigned char r[64]; | ||
| ge_p3 R; | ||
|
|
||
|
|
||
| sha512_init(&hash); | ||
| sha512_update(&hash, private_key + 32, 32); | ||
| sha512_update(&hash, message, message_len); | ||
| sha512_final(&hash, r); | ||
|
|
||
| sc_reduce(r); | ||
| ge_scalarmult_base(&R, r); | ||
| ge_p3_tobytes(signature, &R); | ||
|
|
||
| sha512_init(&hash); | ||
| sha512_update(&hash, signature, 32); | ||
| sha512_update(&hash, public_key, 32); | ||
| sha512_update(&hash, message, message_len); | ||
| sha512_final(&hash, hram); | ||
|
|
||
| sc_reduce(hram); | ||
| sc_muladd(signature + 32, hram, private_key, r); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,77 @@ | ||
| #include "ed25519.h" | ||
| #include "sha512.h" | ||
| #include "ge.h" | ||
| #include "sc.h" | ||
|
|
||
| static int consttime_equal(const unsigned char *x, const unsigned char *y) { | ||
| unsigned char r = 0; | ||
|
|
||
| r = x[0] ^ y[0]; | ||
| #define F(i) r |= x[i] ^ y[i] | ||
| F(1); | ||
| F(2); | ||
| F(3); | ||
| F(4); | ||
| F(5); | ||
| F(6); | ||
| F(7); | ||
| F(8); | ||
| F(9); | ||
| F(10); | ||
| F(11); | ||
| F(12); | ||
| F(13); | ||
| F(14); | ||
| F(15); | ||
| F(16); | ||
| F(17); | ||
| F(18); | ||
| F(19); | ||
| F(20); | ||
| F(21); | ||
| F(22); | ||
| F(23); | ||
| F(24); | ||
| F(25); | ||
| F(26); | ||
| F(27); | ||
| F(28); | ||
| F(29); | ||
| F(30); | ||
| F(31); | ||
| #undef F | ||
|
|
||
| return !r; | ||
| } | ||
|
|
||
| int ed25519_verify(const unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key) { | ||
| unsigned char h[64]; | ||
| unsigned char checker[32]; | ||
| sha512_context hash; | ||
| ge_p3 A; | ||
| ge_p2 R; | ||
|
|
||
| if (signature[63] & 224) { | ||
| return 0; | ||
| } | ||
|
|
||
| if (ge_frombytes_negate_vartime(&A, public_key) != 0) { | ||
| return 0; | ||
| } | ||
|
|
||
| sha512_init(&hash); | ||
| sha512_update(&hash, signature, 32); | ||
| sha512_update(&hash, public_key, 32); | ||
| sha512_update(&hash, message, message_len); | ||
| sha512_final(&hash, h); | ||
|
|
||
| sc_reduce(h); | ||
| ge_double_scalarmult_vartime(&R, h, &A, signature + 32); | ||
| ge_tobytes(checker, &R); | ||
|
|
||
| if (!consttime_equal(checker, signature)) { | ||
| return 0; | ||
| } | ||
|
|
||
| return 1; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
| Copyright 2009-2010 Cybozu Labs, Inc. | ||
| Copyright 2011-2014 Kazuho Oku | ||
| All rights reserved. | ||
|
|
||
| Redistribution and use in source and binary forms, with or without | ||
| modification, are permitted provided that the following conditions are met: | ||
|
|
||
| 1. Redistributions of source code must retain the above copyright notice, | ||
| this list of conditions and the following disclaimer. | ||
|
|
||
| 2. Redistributions in binary form must reproduce the above copyright notice, | ||
| this list of conditions and the following disclaimer in the documentation | ||
| and/or other materials provided with the distribution. | ||
|
|
||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
| ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | ||
| LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
| CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||
| INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||
| CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
| ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| POSSIBILITY OF SUCH DAMAGE. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| // Just an empty compilation unit to make MSVC happy and emit a .lib. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,47 @@ | ||
| <?xml version="1.0" encoding="utf-8"?> | ||
| <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
| <ItemGroup Label="ProjectConfigurations"> | ||
| <ProjectConfiguration Include="Debug|x64"> | ||
| <Configuration>Debug</Configuration> | ||
| <Platform>x64</Platform> | ||
| </ProjectConfiguration> | ||
| <ProjectConfiguration Include="Release|x64"> | ||
| <Configuration>Release</Configuration> | ||
| <Platform>x64</Platform> | ||
| </ProjectConfiguration> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <ClInclude Include="picojson.h" /> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <ClCompile Include="picojson.cpp" /> | ||
| </ItemGroup> | ||
| <PropertyGroup Label="Globals"> | ||
| <ProjectGuid>{2C0D058E-DE35-4471-AD99-E68A2CAF9E18}</ProjectGuid> | ||
| <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> | ||
| </PropertyGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||
| <PropertyGroup Label="Configuration"> | ||
| <ConfigurationType>StaticLibrary</ConfigurationType> | ||
| <PlatformToolset>v141</PlatformToolset> | ||
| <CharacterSet>Unicode</CharacterSet> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration"> | ||
| <UseDebugLibraries>true</UseDebugLibraries> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration"> | ||
| <UseDebugLibraries>false</UseDebugLibraries> | ||
| </PropertyGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||
| <ImportGroup Label="ExtensionSettings"> | ||
| </ImportGroup> | ||
| <ImportGroup Label="PropertySheets"> | ||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||
| <Import Project="..\..\Source\VSProps\Base.props" /> | ||
| <Import Project="..\..\Source\VSProps\ClDisableAllWarnings.props" /> | ||
| </ImportGroup> | ||
| <PropertyGroup Label="UserMacros" /> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||
| <ImportGroup Label="ExtensionTargets"> | ||
| </ImportGroup> | ||
| </Project> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| <?xml version="1.0" encoding="utf-8"?> | ||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
| <ItemGroup> | ||
| <ClInclude Include="picojson.h" /> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <ClCompile Include="picojson.cpp" /> | ||
| </ItemGroup> | ||
| </Project> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,139 @@ | ||
| // Copyright 2018 Dolphin Emulator Project | ||
| // Licensed under GPLv2+ | ||
| // Refer to the license.txt file included. | ||
|
|
||
| #include "UICommon/AutoUpdate.h" | ||
|
|
||
| #include <picojson/picojson.h> | ||
|
|
||
| #include "Common/CommonPaths.h" | ||
| #include "Common/FileUtil.h" | ||
| #include "Common/HttpRequest.h" | ||
| #include "Common/Logging/Log.h" | ||
| #include "Common/StringUtil.h" | ||
| #include "Common/scmrev.h" | ||
| #include "Core/ConfigManager.h" | ||
|
|
||
| #ifdef _WIN32 | ||
| #include <Windows.h> | ||
| #endif | ||
|
|
||
| namespace | ||
| { | ||
| bool SystemSupportsAutoUpdates() | ||
| { | ||
| #ifdef _WIN32 | ||
| return true; | ||
| #else | ||
| return false; | ||
| #endif | ||
| } | ||
|
|
||
| #ifdef _WIN32 | ||
|
|
||
| const char UPDATER_FILENAME[] = "Updater.exe"; | ||
| const char UPDATER_RELOC_FILENAME[] = "Updater.2.exe"; | ||
| const char UPDATER_LOG_FILE[] = "Updater.log"; | ||
|
|
||
| std::wstring MakeUpdaterCommandLine(const std::map<std::string, std::string>& flags) | ||
| { | ||
| std::wstring cmdline = UTF8ToUTF16(UPDATER_FILENAME) + L" "; // Start with a fake argv[0]. | ||
| for (const auto& pair : flags) | ||
| { | ||
| std::string value = "--" + pair.first + "=" + pair.second; | ||
| value = ReplaceAll(value, "\"", "\\\""); // Escape double quotes. | ||
| value = "\"" + value + "\" "; | ||
| cmdline += UTF8ToUTF16(value); | ||
| } | ||
| return cmdline; | ||
| } | ||
|
|
||
| // Used to remove the relocated updater file once we don't need it anymore. | ||
| void CleanupFromPreviousUpdate() | ||
| { | ||
| std::string reloc_updater_path = File::GetExeDirectory() + DIR_SEP + UPDATER_RELOC_FILENAME; | ||
| File::Delete(reloc_updater_path); | ||
| } | ||
| #endif | ||
| } // namespace | ||
|
|
||
| void AutoUpdateChecker::CheckForUpdate() | ||
| { | ||
| // Don't bother checking if updates are not supported or not enabled. | ||
| if (SConfig::GetInstance().m_auto_update_track.empty() || !SystemSupportsAutoUpdates()) | ||
| return; | ||
|
|
||
| #ifdef _WIN32 | ||
| CleanupFromPreviousUpdate(); | ||
| #endif | ||
|
|
||
| std::string version_hash = SConfig::GetInstance().m_auto_update_hash_override.empty() ? | ||
| SCM_REV_STR : | ||
| SConfig::GetInstance().m_auto_update_hash_override; | ||
| std::string url = "https://dolphin-emu.org/update/check/v0/" + | ||
| SConfig::GetInstance().m_auto_update_track + "/" + version_hash; | ||
|
|
||
| Common::HttpRequest req{std::chrono::seconds{10}}; | ||
| auto resp = req.Get(url); | ||
| if (!resp) | ||
| { | ||
| ERROR_LOG(COMMON, "Auto-update request failed"); | ||
| return; | ||
| } | ||
| std::string contents(reinterpret_cast<char*>(resp->data()), resp->size()); | ||
| INFO_LOG(COMMON, "Auto-update JSON response: %s", contents.c_str()); | ||
|
|
||
| picojson::value json; | ||
| std::string err = picojson::parse(json, contents); | ||
| if (!err.empty()) | ||
| { | ||
| ERROR_LOG(COMMON, "Invalid JSON received from auto-update service: %s", err.c_str()); | ||
| return; | ||
| } | ||
| picojson::object obj = json.get<picojson::object>(); | ||
|
|
||
| if (obj["status"].get<std::string>() != "outdated") | ||
| { | ||
| INFO_LOG(COMMON, "Auto-update status: we are up to date."); | ||
| return; | ||
| } | ||
|
|
||
| NewVersionInformation nvi; | ||
| nvi.this_manifest_url = obj["old"].get<picojson::object>()["manifest"].get<std::string>(); | ||
| nvi.next_manifest_url = obj["new"].get<picojson::object>()["manifest"].get<std::string>(); | ||
| nvi.content_store_url = obj["content-store"].get<std::string>(); | ||
| nvi.new_shortrev = obj["new"].get<picojson::object>()["name"].get<std::string>(); | ||
| nvi.new_hash = obj["new"].get<picojson::object>()["hash"].get<std::string>(); | ||
| // TODO: generate the HTML changelog from the JSON information. | ||
| OnUpdateAvailable(nvi); | ||
| } | ||
|
|
||
| void AutoUpdateChecker::TriggerUpdate(const AutoUpdateChecker::NewVersionInformation& info) | ||
| { | ||
| #ifdef _WIN32 | ||
| std::map<std::string, std::string> updater_flags; | ||
| updater_flags["this-manifest-url"] = info.this_manifest_url; | ||
| updater_flags["next-manifest-url"] = info.next_manifest_url; | ||
| updater_flags["content-store-url"] = info.content_store_url; | ||
| updater_flags["parent-pid"] = std::to_string(GetCurrentProcessId()); | ||
| updater_flags["install-base-path"] = File::GetExeDirectory(); | ||
| updater_flags["log-file"] = File::GetExeDirectory() + DIR_SEP + UPDATER_LOG_FILE; | ||
|
|
||
| // Copy the updater so it can update itself if needed. | ||
| std::string updater_path = File::GetExeDirectory() + DIR_SEP + UPDATER_FILENAME; | ||
| std::string reloc_updater_path = File::GetExeDirectory() + DIR_SEP + UPDATER_RELOC_FILENAME; | ||
| File::Copy(updater_path, reloc_updater_path); | ||
|
|
||
| // Run the updater! | ||
| std::wstring command_line = MakeUpdaterCommandLine(updater_flags); | ||
| STARTUPINFO sinfo = {sizeof(info)}; | ||
| PROCESS_INFORMATION pinfo; | ||
| INFO_LOG(COMMON, "Updater command line: %s", UTF16ToUTF8(command_line).c_str()); | ||
| if (!CreateProcessW(UTF8ToUTF16(reloc_updater_path).c_str(), | ||
| const_cast<wchar_t*>(command_line.c_str()), nullptr, nullptr, FALSE, 0, | ||
| nullptr, nullptr, &sinfo, &pinfo)) | ||
| { | ||
| ERROR_LOG(COMMON, "Could not start updater process: error=%d", GetLastError()); | ||
| } | ||
| #endif | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| // Copyright 2018 Dolphin Emulator Project | ||
| // Licensed under GPLv2+ | ||
| // Refer to the license.txt file included. | ||
|
|
||
| #pragma once | ||
|
|
||
| #include <string> | ||
|
|
||
| // This class defines all the logic for Dolphin auto-update checking. UI-specific elements have to | ||
| // be defined in a backend specific subclass. | ||
| class AutoUpdateChecker | ||
| { | ||
| public: | ||
| // Initiates a check for updates in the background. Calls the OnUpdateAvailable callback if an | ||
| // update is available, does "nothing" otherwise. | ||
| void CheckForUpdate(); | ||
|
|
||
| struct NewVersionInformation | ||
| { | ||
| // Name (5.0-1234) and revision hash of the new version. | ||
| std::string new_shortrev; | ||
| std::string new_hash; | ||
|
|
||
| // The full changelog in HTML format. | ||
| std::string changelog_html; | ||
|
|
||
| // Internals, to be passed to the updater binary. | ||
| std::string this_manifest_url; | ||
| std::string next_manifest_url; | ||
| std::string content_store_url; | ||
| }; | ||
|
|
||
| // Starts the updater process, which will wait in the background until the current process exits. | ||
| void TriggerUpdate(const NewVersionInformation& info); | ||
|
|
||
| protected: | ||
| virtual void OnUpdateAvailable(const NewVersionInformation& info) = 0; | ||
| }; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,4 +1,5 @@ | ||
| set(SRCS | ||
| AutoUpdate.cpp | ||
| CommandLineParse.cpp | ||
| Disassembler.cpp | ||
| GameFile.cpp | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,78 @@ | ||
| <?xml version="1.0" encoding="utf-8"?> | ||
| <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
| <ItemGroup Label="ProjectConfigurations"> | ||
| <ProjectConfiguration Include="Debug|x64"> | ||
| <Configuration>Debug</Configuration> | ||
| <Platform>x64</Platform> | ||
| </ProjectConfiguration> | ||
| <ProjectConfiguration Include="Release|x64"> | ||
| <Configuration>Release</Configuration> | ||
| <Platform>x64</Platform> | ||
| </ProjectConfiguration> | ||
| </ItemGroup> | ||
| <PropertyGroup Label="Globals"> | ||
| <ProjectGuid>{E4BECBAB-9C6E-41AB-BB56-F9D70AB6BE03}</ProjectGuid> | ||
| <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> | ||
| </PropertyGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||
| <PropertyGroup Label="Configuration"> | ||
| <ConfigurationType>Application</ConfigurationType> | ||
| <PlatformToolset>v141</PlatformToolset> | ||
| <CharacterSet>Unicode</CharacterSet> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration"> | ||
| <UseDebugLibraries>true</UseDebugLibraries> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration"> | ||
| <UseDebugLibraries>false</UseDebugLibraries> | ||
| </PropertyGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||
| <ImportGroup Label="ExtensionSettings"> | ||
| </ImportGroup> | ||
| <ImportGroup Label="PropertySheets"> | ||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||
| <Import Project="..\..\VSProps\Base.props" /> | ||
| <Import Project="..\..\VSProps\PCHUse.props" /> | ||
| </ImportGroup> | ||
| <PropertyGroup Label="UserMacros" /> | ||
| <PropertyGroup /> | ||
| <ItemDefinitionGroup> | ||
| <Link> | ||
| <AdditionalDependencies>iphlpapi.lib;winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||
| </Link> | ||
| </ItemDefinitionGroup> | ||
| <ItemGroup> | ||
| <ProjectReference Include="..\..\..\Externals\cpp-optparse\cpp-optparse.vcxproj"> | ||
| <Project>{c636d9d1-82fe-42b5-9987-63b7d4836341}</Project> | ||
| </ProjectReference> | ||
| <ProjectReference Include="..\..\..\Externals\curl\curl.vcxproj"> | ||
| <Project>{bb00605c-125f-4a21-b33b-7bf418322dcb}</Project> | ||
| </ProjectReference> | ||
| <ProjectReference Include="..\..\..\externals\ed25519\ed25519.vcxproj"> | ||
| <Project>{5bdf4b91-1491-4fb0-bc27-78e9a8e97dc3}</Project> | ||
| </ProjectReference> | ||
| <ProjectReference Include="..\..\..\Externals\mbedtls\mbedTLS.vcxproj"> | ||
| <Project>{bdb6578b-0691-4e80-a46c-df21639fd3b8}</Project> | ||
| </ProjectReference> | ||
| <ProjectReference Include="..\..\..\Externals\zlib\zlib.vcxproj"> | ||
| <Project>{ff213b23-2c26-4214-9f88-85271e557e87}</Project> | ||
| </ProjectReference> | ||
| <ProjectReference Include="..\Common\Common.vcxproj"> | ||
| <Project>{2e6c348c-c75c-4d94-8d1e-9c1fcbf3efe4}</Project> | ||
| </ProjectReference> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <ClCompile Include="Main.cpp" /> | ||
| </ItemGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||
| <ImportGroup Label="ExtensionTargets"> | ||
| </ImportGroup> | ||
| <!--Copy the .exe to binary output folder--> | ||
| <ItemGroup> | ||
| <SourceFiles Include="$(TargetPath)" /> | ||
| </ItemGroup> | ||
| <Target Name="AfterBuild" Inputs="@(SourceFiles)" Outputs="@(SourceFiles -> '$(BinaryOutputDir)%(Filename)%(Extension)')"> | ||
| <Message Text="Copy: @(SourceFiles) -> $(BinaryOutputDir)" Importance="High" /> | ||
| <Copy SourceFiles="@(SourceFiles)" DestinationFolder="$(BinaryOutputDir)" /> | ||
| </Target> | ||
| </Project> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| <?xml version="1.0" encoding="utf-8"?> | ||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
| <ItemGroup> | ||
| <ClCompile Include="Main.cpp" /> | ||
| </ItemGroup> | ||
| </Project> |