socram8888 / amiitool

Reverse-engineered amiibo cryptography
MIT License
293 stars 79 forks source link

Port amiitool to an includable function? #4

Open b- opened 7 years ago

b- commented 7 years ago

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- commented 7 years ago

(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 commented 7 years ago

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 commented 6 years ago

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:

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 commented 2 years ago

@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 commented 2 years ago

@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 commented 2 years ago

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

socram8888 commented 2 years ago

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 commented 2 years ago

sure, i appreciate it

jozz024 commented 2 years ago

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 commented 2 years ago

@jozz024 mbedTLS is used for:

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 commented 2 years ago

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