Process Services PXI

Process Services PXI

Process Services PXI “pxi:ps9” #

Command Header (Pre 2.0)Command Header (Post 2.0)Available since system versionDescription
0x000100C60x000100C61.0.0-0This crypts a raw message with RSA.
0x000202840x000202841.0.0-0SignRsaSha256
0x000302840x000302841.0.0-0VerifyRsaSha256
0x00040140Removed1.0.0-0, removed with 2.0.0-2SetAesKey
0x000501C40x000401C41.0.0-0EncryptDecryptAes
0x000602840x000502841.0.0-0EncryptSignDecryptVerifyAesCcm
0x000700000x000600001.0.0-0GetRomId. This reads 0x40-bytes from gamecard command 0xC6 (gamecard-uniqueID), and returns the first 0x10-bytes from that since the rest of the command reply is all 0xFF-bytes.
0x000800000x000700001.0.0-0GetRomId2. The first u8 this returns is from GetRomMakerCode, the following 0x10-bytes are from encrypting the 0x10-bytes which GetRomId also returns. This is encrypted with AES-CBC, the regular normal-key and IV set by Process9 for this are loaded from the Process9 .rodata section.
0x000900000x000800001.0.0-0GetCTRCardAutoStartupBit
0x000A00000x000900001.0.0-0GetRomMakerCode
0x000B00000x000A00001.0.0-0GetLocalFriendCodeSeed
0x000C00000x000B00001.0.0-0GetDeviceId
0x000D00420x000C00421.0.0-0SeedRNG
0x000E00420x000D00421.0.0-0GenerateRandomBytes
0x040100840x040100848.1.0-0_New3DSGenerateAmiiboHMAC. New_3DS-only. cmd[1] = insize, cmd[2] = outsize, cmd[3] = (insize<<8) | 0x4, cmd[4] = inbufptr, cmd[5] = (outsize<<8) | 0x14, and cmd[6] = outbufptr.
0x040200820x040200828.1.0-0_New3DSGenerateAmiiboKeyData. New_3DS-only. cmd[1] = insize, cmd[2] = u8 flag, cmd[3] = (insize<<8) | 0x4, cmd[4] = inbufptr.
0x040300440x040300448.1.0-0_New3DSAmiiboEncryptDecrypt. New_3DS-only.
0x040400440x040400448.1.0-0_New3DSAmiiboEncryptDecryptDev. New_3DS-only.

These RSA commands are an interface for using the RSA engine. The system will hang when it attempts to use a >RSA-2048 RSA bit-size with the RSA engine, since the RSA engine does not support >RSA-2048. These RSA commands have an input field specifying what RSA bit-size to use, but the RSA padding code is hard-coded to use RSA-2048.

The New3DS 0x040X commands(used for Amiibo crypto) were removed with 9.3.0-21, the code for that was moved into NFC-module.

Command 0x04010084 #

The input buffer size must be <=0x1E0-bytes, and the out buffer size must be >0 and <=0x20-bytes. This calculates a SHA256-HMAC over the input buffer using the current already-generated Amiibo HMAC key(generated_amiibodata+0x20), the output hash is then written to the out buffer.

Command 0x04020082 #

This is used for Amiibo key generation. 0x30-bytes are generated. The input buffer size must be 0x40-bytes.

The input u8 must be either zero or non-zero, the used value varies depending on what crypto(AES/HMAC) operation is done after the crypto init.

Structure of the input buffer:

OffsetSizeDescription
0x00x2This is the raw Amiibo-write counter u16 from page[4] byte1.
0x20xEAll-zero.
0x100x8This is the first 8-bytes of the NFC tag serial-number(page0-1).
0x180x8Same 8-bytes as above.
0x200x20This is the plaintext hash from NFC tag page[0x18], which is the hash listed under the page 0x15 section here.

Command 0x04030044 #

This is used for the actual Amiibo AES crypto, max input buffer size is same as command 0x04010084. AES-CTR is used here. Normal-key = generated_amiibodata+0x0, CTR = generated_amiibodata+0x10(see command 0x04010084 regarding generated_amiibodata).

Command 0x04040044 #

Similar to 0x04030044, except this is devunit-only with dev-only keys.

RSA Context #

OffsetSizeDescription
0x00x100Modulo
0x1000x100Exponent
0x2000x4RSA bit-size.
0x2040x1Exponent Type. 0 = Short Exponent, 1 = Long Exponent. See notes below.
0x2050x3Padding

This context structure is fixed to 0x208-bytes.

Notes on exponents:

  • When the type is a short exponent, the exponent field is used as an u32 field with little endianness.
    • An example use of this type is to load the common public exponent, 0x10001.
  • When a long exponent is set, the exponent field is a buffer of a big endian number instead.