Install
$ agentstack add skill-allanninal-claude-code-skills-constant-time-analysis ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Constant-Time Analysis
Analyze cryptographic code to detect operations that leak secret data through execution timing variations.
When to Use
User writing crypto code? ──yes──> Use this skill
│
no
│
v
User asking about timing attacks? ──yes──> Use this skill
│
no
│
v
Code handles secret keys/tokens? ──yes──> Use this skill
│
no
│
v
Skip this skill
Concrete triggers:
- User implements signature, encryption, or key derivation
- Code contains
/or%operators on secret-derived values - User mentions "constant-time", "timing attack", "side-channel", "KyberSlash"
- Reviewing functions named
sign,verify,encrypt,decrypt,derive_key
When NOT to Use
- Non-cryptographic code (business logic, UI, etc.)
- Public data processing where timing leaks don't matter
- Code that doesn't handle secrets, keys, or authentication tokens
- High-level API usage where timing is handled by the library
Language Selection
Based on the file extension or language context, refer to the appropriate guide:
| Language | File Extensions | Guide | | ---------- | --------------------------------- | -------------------------------------------------------- | | C, C++ | .c, .h, .cpp, .cc, .hpp | [references/compiled.md](references/compiled.md) | | Go | .go | [references/compiled.md](references/compiled.md) | | Rust | .rs | [references/compiled.md](references/compiled.md) | | Swift | .swift | [references/swift.md](references/swift.md) | | Java | .java | [references/vm-compiled.md](references/vm-compiled.md) | | Kotlin | .kt, .kts | [references/kotlin.md](references/kotlin.md) | | C# | .cs | [references/vm-compiled.md](references/vm-compiled.md) | | PHP | .php | [references/php.md](references/php.md) | | JavaScript | .js, .mjs, .cjs | [references/javascript.md](references/javascript.md) | | TypeScript | .ts, .tsx | [references/javascript.md](references/javascript.md) | | Python | .py | [references/python.md](references/python.md) | | Ruby | .rb | [references/ruby.md](references/ruby.md) |
Quick Start
# Analyze any supported file type
uv run {baseDir}/ct_analyzer/analyzer.py
# Include conditional branch warnings
uv run {baseDir}/ct_analyzer/analyzer.py --warnings
# Filter to specific functions
uv run {baseDir}/ct_analyzer/analyzer.py --func 'sign|verify'
# JSON output for CI
uv run {baseDir}/ct_analyzer/analyzer.py --json
Native Compiled Languages Only (C, C++, Go, Rust)
# Cross-architecture testing (RECOMMENDED)
uv run {baseDir}/ct_analyzer/analyzer.py --arch x86_64 crypto.c
uv run {baseDir}/ct_analyzer/analyzer.py --arch arm64 crypto.c
# Multiple optimization levels
uv run {baseDir}/ct_analyzer/analyzer.py --opt-level O0 crypto.c
uv run {baseDir}/ct_analyzer/analyzer.py --opt-level O3 crypto.c
VM-Compiled Languages (Java, Kotlin, C#)
# Analyze Java bytecode
uv run {baseDir}/ct_analyzer/analyzer.py CryptoUtils.java
# Analyze Kotlin bytecode (Android/JVM)
uv run {baseDir}/ct_analyzer/analyzer.py CryptoUtils.kt
# Analyze C# IL
uv run {baseDir}/ct_analyzer/analyzer.py CryptoUtils.cs
Note: Java, Kotlin, and C# compile to bytecode (JVM/CIL) that runs on a virtual machine with JIT compilation. The analyzer examines the bytecode directly, not the JIT-compiled native code. The --arch and --opt-level flags do not apply to these languages.
Swift (iOS/macOS)
# Analyze Swift for native architecture
uv run {baseDir}/ct_analyzer/analyzer.py crypto.swift
# Analyze for specific architecture (iOS devices)
uv run {baseDir}/ct_analyzer/analyzer.py --arch arm64 crypto.swift
# Analyze with different optimization levels
uv run {baseDir}/ct_analyzer/analyzer.py --opt-level O0 crypto.swift
Note: Swift compiles to native code like C/C++/Go/Rust, so it uses assembly-level analysis and supports --arch and --opt-level flags.
Prerequisites
| Language | Requirements | | ---------------------- | --------------------------------------------------------- | | C, C++, Go, Rust | Compiler in PATH (gcc/clang, go, rustc) | | Swift | Xcode or Swift toolchain (swiftc in PATH) | | Java | JDK with javac and javap in PATH | | Kotlin | Kotlin compiler (kotlinc) + JDK (javap) in PATH | | C# | .NET SDK + ilspycmd (dotnet tool install -g ilspycmd) | | PHP | PHP with VLD extension or OPcache | | JavaScript/TypeScript | Node.js in PATH | | Python | Python 3.x in PATH | | Ruby | Ruby with --dump=insns support |
macOS users: Homebrew installs Java and .NET as "keg-only". You must add them to your PATH:
# For Java (add to ~/.zshrc)
export PATH="/opt/homebrew/opt/openjdk@21/bin:$PATH"
# For .NET tools (add to ~/.zshrc)
export PATH="$HOME/.dotnet/tools:$PATH"
See [references/vm-compiled.md](references/vm-compiled.md) for detailed setup instructions and troubleshooting.
Quick Reference
| Problem | Detection | Fix | | ---------------------- | ------------------------------- | -------------------------------------------- | | Division on secrets | DIV, IDIV, SDIV, UDIV | Barrett reduction or multiply-by-inverse | | Branch on secrets | JE, JNE, BEQ, BNE | Constant-time selection (cmov, bit masking) | | Secret comparison | Early-exit memcmp | Use crypto/subtle or constant-time compare | | Weak RNG | rand(), mt_rand, Math.random | Use crypto-secure RNG | | Table lookup by secret | Array subscript on secret index | Bit-sliced lookups |
Interpreting Results
PASSED - No variable-time operations detected.
FAILED - Dangerous instructions found. Example:
[ERROR] SDIV
Function: decompose_vulnerable
Reason: SDIV has early termination optimization; execution time depends on operand values
Verifying Results (Avoiding False Positives)
CRITICAL: Not every flagged operation is a vulnerability. The tool has no data flow analysis - it flags ALL potentially dangerous operations regardless of whether they involve secrets.
For each flagged violation, ask: Does this operation's input depend on secret data?
- Identify the secret inputs to the function (private keys, plaintext, signatures, tokens)
- Trace data flow from the flagged instruction back to inputs
- Common false positive patterns:
```c // FALSE POSITIVE: Division uses public constant, not secret int numblocks = datalen / 16; // data_len is length, not content
// TRUE POSITIVE: Division involves secret-derived value int32t q = secretcoef / GAMMA2; // secret_coef from private key ```
- Document your analysis for each flagged item
Quick Triage Questions
| Question | If Yes | If No | | ------------------------------------------------- | --------------------- | --------------------- | | Is the operand a compile-time constant? | Likely false positive | Continue | | Is the operand a public parameter (length, count)?| Likely false positive | Continue | | Is the operand derived from key/plaintext/secret? | TRUE POSITIVE | Likely false positive | | Can an attacker influence the operand value? | TRUE POSITIVE | Likely false positive |
Limitations
- Static Analysis Only: Analyzes assembly/bytecode, not runtime behavior. Cannot detect cache timing or microarchitectural side-channels.
- No Data Flow Analysis: Flags all dangerous operations regardless of whether they process secrets. Manual review required.
- Compiler/Runtime Variations: Different compilers, optimization levels, and runtime versions may produce different output.
Real-World Impact
- KyberSlash (2023): Division instructions in post-quantum ML-KEM implementations allowed key recovery
- Lucky Thirteen (2013): Timing differences in CBC padding validation enabled plaintext recovery
- RSA Timing Attacks: Early implementations leaked private key bits through division timing
References
- Cryptocoding Guidelines - Defensive coding for crypto
- KyberSlash - Division timing in post-quantum crypto
- BearSSL Constant-Time - Practical constant-time techniques
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: allanninal
- Source: allanninal/claude-code-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.