Skip to content

curve25519_dalek crate = runtime error #208

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

Closed
brandonros opened this issue Apr 27, 2025 · 3 comments · Fixed by #217 · May be fixed by #216
Closed

curve25519_dalek crate = runtime error #208

brandonros opened this issue Apr 27, 2025 · 3 comments · Fixed by #217 · May be fixed by #216

Comments

@brandonros
Copy link

use ed25519_compact::ge_scalarmult_base;
use curve25519_dalek::{constants, Scalar};

// fails
fn derrive_public_key(hashed_private_key_bytes: [u8; 64]) -> [u8; 32] {
    let mut input = [0u8; 32];
    input.copy_from_slice(&hashed_private_key_bytes[0..32]);
    let scalar = Scalar::from_bytes_mod_order(input);
    let point = constants::ED25519_BASEPOINT_TABLE * &scalar;
    let compressed_point = point.compress();
    let public_key_bytes = compressed_point.to_bytes();
    public_key_bytes
}

// works
fn derrive_public_key_compact(hashed_private_key_bytes: [u8; 64]) -> [u8; 32] {
    let mut input = [0u8; 32];
    input.copy_from_slice(&hashed_private_key_bytes[0..32]);
    let public_key_bytes = ge_scalarmult_base(&input).to_bytes();
    public_key_bytes
}
[package]
name = "ed25519_vanity_kernel"
version = "0.1.0"
edition = "2024"

[lib]
crate-type = ["cdylib", "rlib"]

[dependencies]
cuda_std = { git = "https://github.com/Rust-GPU/Rust-CUDA.git" }
ed25519-compact = { git = "https://github.com/brandonros/rust-ed25519-compact.git", rev = "7605359ed8508d4cef3b958157ad41108261f8d1", default-features = false, features = ["cuda"] }
sha2 = { version = "0.10.8", default-features = false }
curve25519-dalek = { version = "4.1.3", default-features = false, features = ["alloc", "precomputed-tables"] }
bs58 = { version = "0.5.1", default-features = false }
rand_core = { version = "0.9.3" }
rand_xorshift = { version = "0.4.0", default-features = false }

[build-dependencies]
cuda_builder = { git = "https://github.com/Rust-GPU/Rust-CUDA.git" }

Not sure if this is helpful. Great crate + ecosystem, hope I'm helping trying to "real world use it". Please let me know how I can debug more to provide more meaningful report.

https://github.com/brandonros/ed25519-vanity-rs/tree/no-compact if needed for "full working example"

cc @jorge-ortega let me know if you want to work together on this if you have the cycles

@brandonros
Copy link
Author

similar to #207 and #203

@brandonros
Copy link
Author

illegal-address.ptx.zip

$ cargo run --release -- aa 256 256
    Finished `release` profile [optimized] target(s) in 0.03s
     Running `target/release/ed25519_vanity aa 256 256`
Found 1 CUDA devices
Starting device 0
[0] Loading module...
[0] Starting search loop...

thread 'main' panicked at src/main.rs:123:32:
called `Result::unwrap()` on an `Err` value: IllegalAddress
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

@LegNeato
Copy link
Contributor

I don't have a ton of time right now to help you debug, but I wanted to pop in and say thank you for the great bug reports and pointers to the repo. Makes it a lot easier when one of us has time! 🍻

LegNeato added a commit to LegNeato/Rust-CUDA that referenced this issue May 24, 2025
It would always generate PTX to load only a 1-bit integer (`i1`)
from the provided pointer, regardless of the actual size of `T`.
The alignment specified for the load was also based on the pointer's
alignment, not the pointee's alignment.

This commit changes it to:
1. Load the full `llvm_type_of(T)` instead of `i1`.
2. Use the correct alignment of `T` for the load instruction.
3. Removes an incorrect pointer cast that was based on the return
   ABI of `T` rather than the type of the memory being read.

Possibly fixes Rust-GPU#208.
LegNeato added a commit to LegNeato/Rust-CUDA that referenced this issue May 24, 2025
It would always generate PTX to load only a 1-bit integer (`i1`)
from the provided pointer, regardless of the actual size of `T`.
The alignment specified for the load was also based on the pointer's
alignment, not the pointee's alignment.

This commit changes it to:
1. Load the full `llvm_type_of(T)` instead of `i1`.
2. Use the correct alignment of `T` for the load instruction.
3. Removes an incorrect pointer cast that was based on the return
   ABI of `T` rather than the type of the memory being read.

Possibly fixes Rust-GPU#208.
LegNeato added a commit to LegNeato/Rust-CUDA that referenced this issue May 24, 2025
It would always generate PTX to load only a 1-bit integer (`i1`)
from the provided pointer, regardless of the actual size of `T`.
The alignment specified for the load was also based on the pointer's
alignment, not the pointee's alignment.

This commit changes it to:
1. Load the full `llvm_type_of(T)` instead of `i1`.
2. Use the correct alignment of `T` for the load instruction.
3. Removes an incorrect pointer cast that was based on the return
   ABI of `T` rather than the type of the memory being read.

Possibly fixes Rust-GPU#208.
LegNeato added a commit to LegNeato/Rust-CUDA that referenced this issue May 24, 2025
It would always generate PTX to load only a 1-bit integer (`i1`)
from the provided pointer, regardless of the actual size of `T`.
The alignment specified for the load was also based on the pointer's
alignment, not the pointee's alignment.

This commit changes it to:
1. Load the full `llvm_type_of(T)` instead of `i1`.
2. Use the correct alignment of `T` for the load instruction.
3. Removes an incorrect pointer cast that was based on the return
   ABI of `T` rather than the type of the memory being read.

Possibly fixes Rust-GPU#208.
LegNeato added a commit to LegNeato/Rust-CUDA that referenced this issue May 24, 2025
It would always generate PTX to load only a 1-bit integer (`i1`)
from the provided pointer, regardless of the actual size of `T`.
The alignment specified for the load was also based on the pointer's
alignment, not the pointee's alignment.

This commit changes it to:
1. Load the full `llvm_type_of(T)` instead of `i1`.
2. Use the correct alignment of `T` for the load instruction.
3. Removes an incorrect pointer cast that was based on the return
   ABI of `T` rather than the type of the memory being read.

Possibly fixes Rust-GPU#208.
LegNeato added a commit to LegNeato/Rust-CUDA that referenced this issue May 26, 2025
This isn't fuly correct, as ideally we keep track
of what we have put into constant memory and when
it is filled up spill insead of only spilling when
a static is big. But, this is materially better than
what is there.

Fixes Rust-GPU#208.

See also the debugging and discussion in
Rust-GPU#216
LegNeato added a commit to LegNeato/Rust-CUDA that referenced this issue May 26, 2025
This isn't fully correct, as ideally we keep track
of what we have put into constant memory and when
it is filled up spill insead of only spilling when
a static is big. But, this is materially better than
what is there (which is a runtime error).

An argument can be made to just _always_ use global
memory and we don't have to worry about getting the
packing right.

Fixes Rust-GPU#208.

See also the debugging and discussion in
Rust-GPU#216
LegNeato added a commit to LegNeato/Rust-CUDA that referenced this issue May 26, 2025
This isn't fully correct, as ideally we keep track
of what we have put into constant memory and when
it is filled up spill instdead of only spilling when
a static is big. But, this is materially better than
what is there (which is a runtime error).

An argument can be made to just _always_ use global
memory and we don't have to worry about getting the
packing right.

Fixes Rust-GPU#208.

See also the debugging and discussion in
Rust-GPU#216
LegNeato added a commit that referenced this issue May 26, 2025
* Allow address spaces to propagate to LLVM

This looks like it was code that wasn't deleted after the refactor in
decda87

* Spill large statics from constant to global memory

This isn't fully correct, as ideally we keep track
of what we have put into constant memory and when
it is filled up spill instdead of only spilling when
a static is big. But, this is materially better than
what is there (which is a runtime error).

An argument can be made to just _always_ use global
memory and we don't have to worry about getting the
packing right.

Fixes #208.

See also the debugging and discussion in
#216

* Add `--use-constant-memory-space` flag, off by default

* Make it clear that `#[cuda_std::address_space(constant)]` still works
LegNeato added a commit to LegNeato/Rust-CUDA that referenced this issue May 27, 2025
It would always generate PTX to load only a 1-bit integer (`i1`)
from the provided pointer, regardless of the actual size of `T`.
The alignment specified for the load was also based on the pointer's
alignment, not the pointee's alignment.

This commit changes it to:
1. Load the full `llvm_type_of(T)` instead of `i1`.
2. Use the correct alignment of `T` for the load instruction.
3. Removes an incorrect pointer cast that was based on the return
   ABI of `T` rather than the type of the memory being read.

Possibly fixes Rust-GPU#208.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants