Skip to content

Instantly share code, notes, and snippets.

@rust-play
Created October 24, 2025 12:27
Show Gist options
  • Save rust-play/086db87dfa13baad978393a0792de8e5 to your computer and use it in GitHub Desktop.
Save rust-play/086db87dfa13baad978393a0792de8e5 to your computer and use it in GitHub Desktop.
Code shared from the Rust Playground
// Note: In real ECC, the modulus P is a large prime (256 bits or more),
// which requires an external crate like `num-bigint` or `crypto-bigint`.
// This example uses u128, which is only 128 bits, for demonstration purposes.
// We will map the general equation to the standard Weierstrass form over a finite field:
// LHS: R * sin^2(θ) -> y_squared
// RHS: A*(r/cos(θ))^3 + B*(r/cos(θ))^1 + C -> A_std * x^3 + B_std * x + C_std
/// Evaluates the right-hand side of the Elliptic Curve equation (Weierstrass form)
/// over a finite field, using only Rust's standard library integer types (u128).
///
/// The equation evaluated is: result = (A_std * x^3 + B_std * x + C_std) mod P
///
/// # Arguments
/// * `x` - The x-coordinate (derived from r/cos(θ)).
/// * `a_std` - The coefficient A (from your equation).
/// * `b_std` - The coefficient B (from your equation).
/// * `c_std` - The coefficient C (from your equation).
/// * `p` - The prime modulus P.
///
/// # Returns
/// The result of the calculation: (RHS) mod P.
fn evaluate_ecc_rhs(
x: u128,
a_std: u128,
b_std: u128,
c_std: u128,
p: u128,
) -> u128 {
// 1. Calculate the raw right-hand side (RHS) without modulo.
// We use temporary u128s, but MUST be careful of overflow before the final modulo P.
// In real ECC, this is why a BigInt library is mandatory.
// Calculate x^3. This is the main overflow risk point.
let x_cubed = x.saturating_mul(x).saturating_mul(x);
// Calculate A_std * x^3
let term1 = a_std.saturating_mul(x_cubed);
// Calculate B_std * x
let term2 = b_std.saturating_mul(x);
// Add all terms together. This calculation represents (RHS_raw)
let rhs_sum = term1.saturating_add(term2).saturating_add(c_std);
// 2. Apply the modulo P
// The modulus operation must handle potential wrapping, but for positive numbers,
// the built-in % operator performs the modulo arithmetic correctly.
// We assume the intermediate sum fits within u128, which is a strong limitation here.
let result_mod_p = rhs_sum % p;
result_mod_p
}
fn main() {
println!("--- Conceptual ECC Evaluation (Stdlib u128) ---");
// Define parameters. P must be large, but must fit in u128.
// For a real ECC curve, these would be large, randomly chosen integers.
let p: u128 = 34028236692093846346337460743176821145; // A large prime near u128::MAX/5
let a_std: u128 = 25; // Coefficient A
let b_std: u128 = 100; // Coefficient B
let c_std: u128 = 15; // Coefficient C (The 'B' term in standard ECC form)
// Choose an x-coordinate to test.
let x_coord: u128 = 123456789012345678901234567890123456789;
// --- EVALUATION ---
let y_squared_mod_p = evaluate_ecc_rhs(x_coord, a_std, b_std, c_std, p);
println!("\nCurve Equation: y^2 = {}*x^3 + {}*x + {} (mod P)", a_std, b_std, c_std);
println!("P (Modulus): {}", p);
println!("Test Point x: {}", x_coord);
println!("\n--- Result ---");
println!("The value of y^2 (mod P) for the given x is: {}", y_squared_mod_p);
// NOTE: The LHS (R * sin^2(θ)) is equal to the result y_squared_mod_p
// if the point is on the curve. This result is the value it must equal.
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment