Skip to content

Commit

Permalink
Merge pull request #7 from ynsta/copy
Browse files Browse the repository at this point in the history
Copy function update
  • Loading branch information
Marcos Del Sol Vives authored May 23, 2017
2 parents 0d2b873 + 84c326e commit adda029
Show file tree
Hide file tree
Showing 4 changed files with 141 additions and 21 deletions.
33 changes: 16 additions & 17 deletions amiibo.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include "mbedtls/md.h"
#include "mbedtls/aes.h"
#include <errno.h>
#include <endian.h>
#include "portable_endian.h"


#define HMAC_POS_DATA 0x008
Expand Down Expand Up @@ -158,23 +158,22 @@ bool nfc3d_amiibo_load_keys(nfc3d_amiibo_keys * amiiboKeys, const char * path) {
}


void nfc3d_amiibo_copy_app_data(uint8_t * dst, const uint8_t * src) {
void nfc3d_amiibo_copy_app_data(const uint8_t * src, uint8_t * dst) {

uint16_t *ami_nb_wr = (uint16_t*)(dst + 0x29);
uint16_t *cfg_nb_wr = (uint16_t*)(dst + 0xB4);
uint16_t *ami_nb_wr = (uint16_t*)(dst + 0x29);
uint16_t *cfg_nb_wr = (uint16_t*)(dst + 0xB4);

/* increment write counters */
*ami_nb_wr = htobe16(be16toh(*ami_nb_wr) + 1);
*cfg_nb_wr = htobe16(be16toh(*cfg_nb_wr) + 1);

/* copy flags */
dst[0x2C] = src[0x2C];
/* copy programID */
memcpy(dst + 0xAC, src + 0xAC, 8);
/* copy AppID */
memcpy(dst + 0xB6, src + 0xB6, 4);

/* copy AppData */
memcpy(dst + 0xDC, src + 0xDC, 216);
/* increment write counters */
*ami_nb_wr = htobe16(be16toh(*ami_nb_wr) + 1);
*cfg_nb_wr = htobe16(be16toh(*cfg_nb_wr) + 1);

/* copy flags */
dst[0x2C] = src[0x2C];
/* copy programID */
memcpy(dst + 0xAC, src + 0xAC, 8);
/* copy AppID */
memcpy(dst + 0xB6, src + 0xB6, 4);
/* copy AppData */
memcpy(dst + 0xDC, src + 0xDC, 216);
}

6 changes: 3 additions & 3 deletions amiitool.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ int main(int argc, char ** argv) {
self = argv[0];

char * infile = NULL;
char * savefile = NULL;
char * savefile = NULL;
char * outfile = NULL;
char * keyfile = NULL;
char op = '\0';
Expand Down Expand Up @@ -144,7 +144,7 @@ int main(int argc, char ** argv) {
}
}

nfc3d_amiibo_copy_app_data(plain_base, plain_save);
nfc3d_amiibo_copy_app_data(plain_save, plain_base);
nfc3d_amiibo_pack(&amiiboKeys, plain_base, modified);
}

Expand All @@ -169,4 +169,4 @@ int main(int argc, char ** argv) {
fclose(f);

return 0;
}
}
2 changes: 1 addition & 1 deletion include/nfc3d/amiibo.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ typedef struct {
bool nfc3d_amiibo_unpack(const nfc3d_amiibo_keys * amiiboKeys, const uint8_t * tag, uint8_t * plain);
void nfc3d_amiibo_pack(const nfc3d_amiibo_keys * amiiboKeys, const uint8_t * plain, uint8_t * tag);
bool nfc3d_amiibo_load_keys(nfc3d_amiibo_keys * amiiboKeys, const char * path);
void nfc3d_amiibo_copy_app_data(uint8_t * dst, const uint8_t * src);
void nfc3d_amiibo_copy_app_data(const uint8_t * src, uint8_t * dst);

#endif
121 changes: 121 additions & 0 deletions portable_endian.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
// "License": Public Domain
// I, Mathias Panzenböck, place this file hereby into the public domain. Use it at your own risk for whatever you like.
// In case there are jurisdictions that don't support putting things in the public domain you can also consider it to
// be "dual licensed" under the BSD, MIT and Apache licenses, if you want to. This code is trivial anyway. Consider it
// an example on how to get the endian conversion functions on different platforms.

#ifndef PORTABLE_ENDIAN_H__
#define PORTABLE_ENDIAN_H__

#if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) && !defined(__WINDOWS__)

# define __WINDOWS__

#endif

#if defined(__linux__) || defined(__CYGWIN__)

# include <endian.h>

#elif defined(__APPLE__)

# include <libkern/OSByteOrder.h>

# define htobe16(x) OSSwapHostToBigInt16(x)
# define htole16(x) OSSwapHostToLittleInt16(x)
# define be16toh(x) OSSwapBigToHostInt16(x)
# define le16toh(x) OSSwapLittleToHostInt16(x)

# define htobe32(x) OSSwapHostToBigInt32(x)
# define htole32(x) OSSwapHostToLittleInt32(x)
# define be32toh(x) OSSwapBigToHostInt32(x)
# define le32toh(x) OSSwapLittleToHostInt32(x)

# define htobe64(x) OSSwapHostToBigInt64(x)
# define htole64(x) OSSwapHostToLittleInt64(x)
# define be64toh(x) OSSwapBigToHostInt64(x)
# define le64toh(x) OSSwapLittleToHostInt64(x)

# define __BYTE_ORDER BYTE_ORDER
# define __BIG_ENDIAN BIG_ENDIAN
# define __LITTLE_ENDIAN LITTLE_ENDIAN
# define __PDP_ENDIAN PDP_ENDIAN

#elif defined(__OpenBSD__)

# include <sys/endian.h>

#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)

# include <sys/endian.h>

# define be16toh(x) betoh16(x)
# define le16toh(x) letoh16(x)

# define be32toh(x) betoh32(x)
# define le32toh(x) letoh32(x)

# define be64toh(x) betoh64(x)
# define le64toh(x) letoh64(x)

#elif defined(__WINDOWS__)

# include <windows.h>

# if BYTE_ORDER == LITTLE_ENDIAN

# if defined(_MSC_VER)
# include <stdlib.h>
# define htobe16(x) _byteswap_ushort(x)
# define htole16(x) (x)
# define be16toh(x) _byteswap_ushort(x)
# define le16toh(x) (x)

# define htobe32(x) _byteswap_ulong(x)
# define htole32(x) (x)
# define be32toh(x) _byteswap_ulong(x)
# define le32toh(x) (x)

# define htobe64(x) _byteswap_uint64(x)
# define htole64(x) (x)
# define be64toh(x) _byteswap_uint64(x)
# define le64toh(x) (x)

# elif defined(__GNUC__) || defined(__clang__)

# define htobe16(x) __builtin_bswap16(x)
# define htole16(x) (x)
# define be16toh(x) __builtin_bswap16(x)
# define le16toh(x) (x)

# define htobe32(x) __builtin_bswap32(x)
# define htole32(x) (x)
# define be32toh(x) __builtin_bswap32(x)
# define le32toh(x) (x)

# define htobe64(x) __builtin_bswap64(x)
# define htole64(x) (x)
# define be64toh(x) __builtin_bswap64(x)
# define le64toh(x) (x)
# else
# error platform not supported
# endif

# else

# error byte order not supported

# endif

# define __BYTE_ORDER BYTE_ORDER
# define __BIG_ENDIAN BIG_ENDIAN
# define __LITTLE_ENDIAN LITTLE_ENDIAN
# define __PDP_ENDIAN PDP_ENDIAN

#else

# error platform not supported

#endif

#endif

0 comments on commit adda029

Please sign in to comment.