No description
Find a file
Etan Kissling 470b789256
v0.8.2 (#168)
* Avoid index error when creating zero literal
2025-07-29 13:41:03 +00:00
.github/workflows Replace apt-fast with apt-get (#159) 2024-10-15 15:48:30 +00:00
benchmarks fix modmul 256-bit perf (#156) 2024-07-09 15:35:08 +02:00
helpers Refresh endians2 (#160) 2024-12-03 13:16:02 +01:00
stint Avoid index error when creating zero literal (#167) 2025-05-15 15:45:52 +00:00
tests Avoid index error when creating zero literal (#167) 2025-05-15 15:45:52 +00:00
.gitignore Fix pointer deref issue on Macos and Nim >= 2.0 (#152) 2024-05-20 23:39:33 +07:00
config.nims Fix pointer deref issue on Macos and Nim >= 2.0 (#152) 2024-05-20 23:39:33 +07:00
LICENSE-APACHEv2 Relicense under dual Apache/MIT 2018-03-02 11:48:08 +01:00
LICENSE-MIT Relicense under dual Apache/MIT 2018-03-02 11:48:08 +01:00
nim.cfg add native nim mode (#142) 2023-09-25 16:49:04 +02:00
README.md Initial release (v0.8.0) (#161) 2024-12-04 12:04:10 +01:00
stint.nim add custom literal feature 2023-07-07 13:22:22 +07:00
stint.nimble v0.8.2 (#168) 2025-07-29 13:41:03 +00:00

Stint (Stack-based arbitrary precision integers)

License: Apache License: MIT Stability: experimental Github action

stint provides efficient and convenient N-bit integers for Nim, for arbitrary sizes of N decided at compile time with an interface similar to to int64/uint64.

In addition to basic integer operations, stint also contains primtives for modular arithmetic, endian conversion, basic I/O, bit twiddling etc.

stint integers, like their intXX/uintXX counterpart in Nim are stack-based values, meaning that they are naturally allocation-free and have value-based semantics.

import stint

func addmul(a, b, c: UInt256): UInt256 =
  a * b + c

echo addmul(u256"100000000000000000000000000000", u256"1", u256"2")

Priorities

  • Portability
    • 32 and 64 bit
    • ARM/x86/x86_64 extensively tested
    • Additionally RISC-V and MIPS for open hardware and low power IoT devices.
  • Speed, library is carefully tuned to produce the best assembly given the current compilers. However, the library itself does not require assembly for portability.
  • No heap/dynamic allocation
  • Ease of use:
    • Use traditional +, -, +=, etc operators like on native types
    • converting to and from raw byte BigInts (also called octet string in IETF specs)
    • converting to and from Hex
    • converting to and from decimal strings

Non-priorities include:

  • constant-time operation (not suitable for certain kinds of cryptography out of the box)
  • runtime precision

See also

  • constantine - modular arithmetic and elliptic curve operations focusing on cryptography and constant-time implementation
  • N2472 - _ExtInt(N) - native arbitrary precision integers for C
  • stew - helpers and utilities for ordinary Nim integers (endians2, bitops2 etc)

License

Licensed and distributed under either of

or

at your option. This file may not be copied, modified, or distributed except according to those terms.