Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port amiitool to an includable function? #4

Open
b- opened this issue May 7, 2017 · 11 comments
Open

Port amiitool to an includable function? #4

b- opened this issue May 7, 2017 · 11 comments

Comments

@b-
Copy link

b- commented May 7, 2017

Hi,

I'm trying to write code that incorporates Amiitool. It would be amazing if it's functionality could be ported to a function, so I could just #include "lib/amiitool/amiitool.h and then do something like

decrypted_dump = amiitool( DECRYPT, key_variable, dump);
modified_dump = dosomestuff(decrypted_dump);
encrypted_dump = amiitool( ENCRYPT, key_variable, modified_dump);

I'm trying to do it myself, but unfortunately I'm very new to C, so any help would be appreciated immensely. To tell you the truth, I'm not even sure my example there doesn't have some glaring error. But I think it should be pretty self explanatory.

Thanks!

@b-
Copy link
Author

b- commented May 7, 2017

(Let's pretend decrypted_dump, modified_dump, encrypted_dump, and key_variable are all arrays of the appropriate size, and ENCRYPT/DECRYPT are some sort of constant, or something)

@socram8888
Copy link
Owner

There already are - there is nfc3d_amiibo_unpack for decryption and nfc3d_amiibo_pack.

I wanted to make this into a static or dynamic library, but I never got around it.

@socram8888
Copy link
Owner

Okay, so let's get started. Poking also @ToolsDevelopper which may be interested in this. @HiddenRamblings is possibly relevant to this since he's the only so far which has used this library in a finished product.

Before I start converting this into a library, I need to know exactly what functions should be exposed, ie what this library should do automatically and what should be left to the developer.

For now, I was thinking in exposing the following functionality:

  • nfc3d_amiibo_create(const nfc3d_master_keys *): creates a new amiibo instance
  • amiibo_from_tag(ctx *, uint8_t *): decrypts the given data into the context, in internal format
  • amiibo_to_tag(ctx *, uint8_t *): encrypts this amiibo into the given buffer
  • amiibo_sign(ctx *): shortcut for amiibo_sign_tag followed by amiibo_sign_data
  • amiibo_sign_data(ctx *): signs the data so it's picked up as data being valid by the 3DS
  • amiibo_sign_tag(ctx *): signs the UID so it's picked up as original amiibo by the 3DS
  • amiibo_check(ctx *): shortcut for amiibo_check_data and amiibo_check_tag
  • amiibo_check_data(ctx *): checks the data signature
  • amiibo_check_tag(ctx *): checks the tag signature
  • amiibo_get_uid(ctx *): returns a pointer to the UID
  • amiibo_get_data(ctx *): returns a pointer to the data

I'm not sure if amiibo_sign_* should be exposed, or be done automatically as part of the amiibo_to_tag call. I'm not sure either if data would be more useful in the format the 3DS uses (so-called "internal format" in amiitool) or as it's stored in the tag ("tag format"

@jozz024
Copy link

jozz024 commented Mar 29, 2022

@socram8888 its been 4 years so i doubt it, but any updates on this? i was looking into using rust's bindgen to use amiitool in rust, but didnt have any luck since it requires a built library iirc

@socram8888
Copy link
Owner

@jozz024 I've not looked any further. Packing up libraries in C is something I'm pretty terrified of and have stayed as far as possible from it.

The encryption is pretty basic, so if you're using Rust maybe it could be easier to just port it entirely and benefit from Rust's dependency manager.

@jozz024
Copy link

jozz024 commented Mar 29, 2022

that was my next thought, have just been debating how to do it.

@socram8888
Copy link
Owner

I've never developed for Rust so I'm sorry but can't help you with the implementation.

However, if you need any aid in understanding the algorithm, or maybe the design of the API, let me know.

@jozz024
Copy link

jozz024 commented Mar 30, 2022

sure, i appreciate it

@jozz024
Copy link

jozz024 commented Mar 30, 2022

hey @socram8888 if its not too much trouble, can you explain what you use mbedtls for? i've found a rust port of that, but i'm still a tad confused as to what it's used for

@socram8888
Copy link
Owner

@jozz024 mbedTLS is used for:

  • Calculating a HMAC-SHA256 as part of the DRBG
  • Checking and generating the fixed part HMAC-SHA256
  • Checking and generating the user content's HMAC-SHA256
  • Decrypting and encrypting the user contents using AES

There's no reason why to use mbedTLS. I used that because it was pretty small and I did not have to deal with the hassle of compiling against a dynamic library such as OpenSSL.

@jozz024
Copy link

jozz024 commented Sep 19, 2022

wow it's been 6 months alr
i finally have a semi working rust amiibo library (https://github.com/jozz024/amiibo-rs) but atm i'm facing issues with lock 💀
i think i'm doing something with the hmac calculation wrong, but i just thought i'd update since i came to check the repo if i did anything wrong

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants