Skip to main content

Obtain Sui Address and Public Key from Private Key

Functions for deriving the Sui address and public key from a private key (secret key) using Sui-compatible cryptography.

note

Compatible across all microcontroller implementations and IDEs.

SDK way (adaptation for ArduinoIDE)

✅ Fully compatible with ArduinoIDE on supported platforms.

This is the most developer-friendly approach, similar to what you may find in the Mysten Labs SDKs.

const char* privateKey = "suiprivkey1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq509duq";

// Create the keypair object
MicroSuiEd25519 keypair = SuiKeypair_fromSecretKey(sui_private_key_bech32);
Serial.print(F(" Created KeyPair - userAddress: ")); Serial.println(address);

const char* address = keypair.toSuiAddress(&keypair);
Serial.print(F(" Sui Address: ")); Serial.println(keypair.toSuiAddress(&keypair));

const char* public_key = keypair.getPublicKey(&keypair);
Serial.print(F(" Public Key: ")); Serial.println(keypair.toSuiAddress(&public_key));

Core functions way

✅ Fully compatible with any IDE and any microcontroller, offering full control and customization for developers.

This method is recommended for 8-bit microcontrollers or other memory-constrained environments.

const char* private_key_bech32 = "suiprivkey1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq509duq";


// Bech32 private key to 32 bytes private key convertion
uint8_t private_key_bytes[32];
microsui_decode_sui_privkey(private_key_bech32, private_key_bytes);

// Obtain Public Key from Private Key (and converting it to base64)
uint8_t public_key_bytes[32];
char public_key_base64[(32 + 2) / 3 * 4 + 1];
get_public_key_from_private_key(private_key_bytes, public_key);
bytes_to_base64(public_key_bytes, sizeof(public_key_bytes), public_key_base64, sizeof(public_key_base64));
Serial.print(F(" Public Key (in base64): ")); Serial.println(public_key_base64);
Serial.print(F(" Public Key (in bytes): "));
for (int i = 0; i < 32; i++) {
Serial.print(F("%02x", public_key[i]));
}
Serial.print(F("\n"));

// Obtain Public Key from Private Key (and converting it to base64)
uint8_t public_key_bytes[32];
char public_key_base64[(32 + 2) / 3 * 4 + 1];
get_public_key_from_private_key(private_key_bytes, public_key);
bytes_to_base64(public_key_bytes, sizeof(public_key_bytes), public_key_base64, sizeof(public_key_base64));
Serial.print(F(" Public Key (in base64): ")); Serial.println(public_key_base64);
Serial.print(F(" Public Key (in bytes): "));
for (int i = 0; i < 32; i++) {
Serial.print(F("%02x", public_key[i]));
}
Serial.print(F("\n"));

// Obtain Sui Address from Public Key
char sui_address[67]; // Placeholder for Sui address
uint8_t encoded_address[32];
microsui_pubkey_to_sui_address(public_key, encoded_address); // Encode public key to Sui address
char encoded_address_string[65];
bytes_to_hex(encoded_address, 32, encoded_address_string); // Convert the encoded address to a hex string
sui_address[0] = '0';
sui_address[1] = 'x';
memcpy(sui_address + 2, encoded_address_string, 65);
Serial.print(F(" Sui Address: ")); Serial.println(sui_address);