@elizaos/skills 2.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -0
- package/package.json +53 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +96 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/bird/SKILL.md +224 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/bluebubbles/SKILL.md +131 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +203 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +284 -0
- package/skills/discord/SKILL.md +578 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/food-order/SKILL.md +48 -0
- package/skills/gemini/SKILL.md +43 -0
- package/skills/gifgrep/SKILL.md +79 -0
- package/skills/github/SKILL.md +77 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +245 -0
- package/skills/himalaya/SKILL.md +257 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +74 -0
- package/skills/local-places/SERVER_README.md +101 -0
- package/skills/local-places/SKILL.md +102 -0
- package/skills/local-places/pyproject.toml +21 -0
- package/skills/local-places/src/local_places/__init__.py +2 -0
- package/skills/local-places/src/local_places/google_places.py +314 -0
- package/skills/local-places/src/local_places/main.py +65 -0
- package/skills/local-places/src/local_places/schemas.py +107 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +310 -0
- package/skills/nano-banana-pro/SKILL.md +58 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/notion/SKILL.md +172 -0
- package/skills/obsidian/SKILL.md +81 -0
- package/skills/openai-image-gen/SKILL.md +89 -0
- package/skills/openai-image-gen/scripts/gen.py +240 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +52 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +51 -0
- package/skills/oracle/SKILL.md +125 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/security-ask-questions-if-underspecified/.claude-plugin/plugin.json +10 -0
- package/skills/security-ask-questions-if-underspecified/README.md +24 -0
- package/skills/security-ask-questions-if-underspecified/skills/ask-questions-if-underspecified/SKILL.md +85 -0
- package/skills/security-audit-context-building/.claude-plugin/plugin.json +10 -0
- package/skills/security-audit-context-building/README.md +58 -0
- package/skills/security-audit-context-building/commands/audit-context.md +21 -0
- package/skills/security-audit-context-building/skills/audit-context-building/SKILL.md +297 -0
- package/skills/security-audit-context-building/skills/audit-context-building/resources/COMPLETENESS_CHECKLIST.md +47 -0
- package/skills/security-audit-context-building/skills/audit-context-building/resources/FUNCTION_MICRO_ANALYSIS_EXAMPLE.md +355 -0
- package/skills/security-audit-context-building/skills/audit-context-building/resources/OUTPUT_REQUIREMENTS.md +71 -0
- package/skills/security-building-secure-contracts/.claude-plugin/plugin.json +10 -0
- package/skills/security-building-secure-contracts/README.md +241 -0
- package/skills/security-building-secure-contracts/skills/algorand-vulnerability-scanner/SKILL.md +284 -0
- package/skills/security-building-secure-contracts/skills/algorand-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +405 -0
- package/skills/security-building-secure-contracts/skills/audit-prep-assistant/SKILL.md +409 -0
- package/skills/security-building-secure-contracts/skills/cairo-vulnerability-scanner/SKILL.md +329 -0
- package/skills/security-building-secure-contracts/skills/cairo-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +722 -0
- package/skills/security-building-secure-contracts/skills/code-maturity-assessor/SKILL.md +218 -0
- package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/ASSESSMENT_CRITERIA.md +355 -0
- package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/EXAMPLE_REPORT.md +248 -0
- package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/REPORT_FORMAT.md +33 -0
- package/skills/security-building-secure-contracts/skills/cosmos-vulnerability-scanner/SKILL.md +334 -0
- package/skills/security-building-secure-contracts/skills/cosmos-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +740 -0
- package/skills/security-building-secure-contracts/skills/guidelines-advisor/SKILL.md +252 -0
- package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/ASSESSMENT_AREAS.md +329 -0
- package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/DELIVERABLES.md +118 -0
- package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/EXAMPLE_REPORT.md +298 -0
- package/skills/security-building-secure-contracts/skills/secure-workflow-guide/SKILL.md +161 -0
- package/skills/security-building-secure-contracts/skills/secure-workflow-guide/resources/EXAMPLE_REPORT.md +279 -0
- package/skills/security-building-secure-contracts/skills/secure-workflow-guide/resources/WORKFLOW_STEPS.md +132 -0
- package/skills/security-building-secure-contracts/skills/solana-vulnerability-scanner/SKILL.md +389 -0
- package/skills/security-building-secure-contracts/skills/solana-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +669 -0
- package/skills/security-building-secure-contracts/skills/substrate-vulnerability-scanner/SKILL.md +298 -0
- package/skills/security-building-secure-contracts/skills/substrate-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +791 -0
- package/skills/security-building-secure-contracts/skills/token-integration-analyzer/SKILL.md +362 -0
- package/skills/security-building-secure-contracts/skills/token-integration-analyzer/resources/ASSESSMENT_CATEGORIES.md +571 -0
- package/skills/security-building-secure-contracts/skills/token-integration-analyzer/resources/REPORT_TEMPLATES.md +141 -0
- package/skills/security-building-secure-contracts/skills/ton-vulnerability-scanner/SKILL.md +388 -0
- package/skills/security-building-secure-contracts/skills/ton-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +595 -0
- package/skills/security-burpsuite-project-parser/.claude-plugin/plugin.json +10 -0
- package/skills/security-burpsuite-project-parser/README.md +103 -0
- package/skills/security-burpsuite-project-parser/commands/burp-search.md +18 -0
- package/skills/security-burpsuite-project-parser/skills/SKILL.md +358 -0
- package/skills/security-burpsuite-project-parser/skills/scripts/burp-search.sh +99 -0
- package/skills/security-claude-in-chrome-troubleshooting/.claude-plugin/plugin.json +8 -0
- package/skills/security-claude-in-chrome-troubleshooting/README.md +31 -0
- package/skills/security-claude-in-chrome-troubleshooting/skills/claude-in-chrome-troubleshooting/SKILL.md +251 -0
- package/skills/security-constant-time-analysis/.claude-plugin/plugin.json +9 -0
- package/skills/security-constant-time-analysis/README.md +381 -0
- package/skills/security-constant-time-analysis/commands/ct-check.md +20 -0
- package/skills/security-constant-time-analysis/ct_analyzer/__init__.py +49 -0
- package/skills/security-constant-time-analysis/ct_analyzer/analyzer.py +1284 -0
- package/skills/security-constant-time-analysis/ct_analyzer/script_analyzers.py +3081 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/__init__.py +1 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_analyzer.py +1397 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/bn_excerpt.js +205 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_constant_time.c +181 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.c +74 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.go +78 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.rs +92 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.cs +174 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.java +161 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.kt +181 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.php +140 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.py +252 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.rb +188 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.swift +199 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.ts +154 -0
- package/skills/security-constant-time-analysis/pyproject.toml +52 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/README.md +90 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/SKILL.md +219 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/compiled.md +129 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/javascript.md +136 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/kotlin.md +252 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/php.md +172 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/python.md +179 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/ruby.md +198 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/swift.md +288 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/vm-compiled.md +354 -0
- package/skills/security-constant-time-analysis/uv.lock +8 -0
- package/skills/security-culture-index/.claude-plugin/plugin.json +8 -0
- package/skills/security-culture-index/README.md +79 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/SKILL.md +293 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/anti-patterns.md +255 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/conversation-starters.md +408 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/interview-trait-signals.md +253 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/motivators.md +158 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/patterns-archetypes.md +147 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/primary-traits.md +307 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/secondary-traits.md +228 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/team-composition.md +148 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/check_deps.py +108 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/__init__.py +20 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/constants.py +122 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/extract.py +187 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/models.py +16 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/opencv_extractor.py +520 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/extract_pdf.py +237 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/pyproject.toml +18 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/burnout-report.md +113 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/comparison-report.md +103 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/hiring-profile.md +127 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/individual-report.md +85 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/predicted-profile.md +165 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/team-report.md +109 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/analyze-team.md +188 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/coach-manager.md +267 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/compare-profiles.md +188 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/define-hiring-profile.md +220 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/detect-burnout.md +206 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/extract-from-pdf.md +121 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/interpret-individual.md +183 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/interview-debrief.md +234 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/mediate-conflict.md +306 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/plan-onboarding.md +322 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/predict-from-interview.md +250 -0
- package/skills/security-differential-review/.claude-plugin/plugin.json +10 -0
- package/skills/security-differential-review/README.md +109 -0
- package/skills/security-differential-review/commands/diff-review.md +21 -0
- package/skills/security-differential-review/skills/differential-review/SKILL.md +220 -0
- package/skills/security-differential-review/skills/differential-review/adversarial.md +203 -0
- package/skills/security-differential-review/skills/differential-review/methodology.md +234 -0
- package/skills/security-differential-review/skills/differential-review/patterns.md +300 -0
- package/skills/security-differential-review/skills/differential-review/reporting.md +369 -0
- package/skills/security-dwarf-expert/.claude-plugin/plugin.json +10 -0
- package/skills/security-dwarf-expert/README.md +38 -0
- package/skills/security-dwarf-expert/skills/dwarf-expert/SKILL.md +93 -0
- package/skills/security-dwarf-expert/skills/dwarf-expert/reference/coding.md +31 -0
- package/skills/security-dwarf-expert/skills/dwarf-expert/reference/dwarfdump.md +50 -0
- package/skills/security-dwarf-expert/skills/dwarf-expert/reference/readelf.md +8 -0
- package/skills/security-entry-point-analyzer/.claude-plugin/plugin.json +10 -0
- package/skills/security-entry-point-analyzer/README.md +74 -0
- package/skills/security-entry-point-analyzer/commands/entry-points.md +18 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/SKILL.md +251 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/cosmwasm.md +182 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/move-aptos.md +107 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/move-sui.md +87 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/solana.md +155 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/solidity.md +135 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/ton.md +185 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/vyper.md +141 -0
- package/skills/security-firebase-apk-scanner/.claude-plugin/plugin.json +10 -0
- package/skills/security-firebase-apk-scanner/README.md +85 -0
- package/skills/security-firebase-apk-scanner/commands/scan-apk.md +18 -0
- package/skills/security-firebase-apk-scanner/scanner.sh +1408 -0
- package/skills/security-firebase-apk-scanner/skills/firebase-apk-scanner/SKILL.md +197 -0
- package/skills/security-firebase-apk-scanner/skills/firebase-apk-scanner/references/vulnerabilities.md +803 -0
- package/skills/security-fix-review/.claude-plugin/plugin.json +13 -0
- package/skills/security-fix-review/README.md +118 -0
- package/skills/security-fix-review/commands/fix-review.md +24 -0
- package/skills/security-fix-review/skills/fix-review/SKILL.md +264 -0
- package/skills/security-fix-review/skills/fix-review/references/bug-detection.md +408 -0
- package/skills/security-fix-review/skills/fix-review/references/finding-matching.md +298 -0
- package/skills/security-fix-review/skills/fix-review/references/report-parsing.md +398 -0
- package/skills/security-insecure-defaults/.claude-plugin/plugin.json +10 -0
- package/skills/security-insecure-defaults/README.md +45 -0
- package/skills/security-insecure-defaults/skills/insecure-defaults/SKILL.md +117 -0
- package/skills/security-insecure-defaults/skills/insecure-defaults/references/examples.md +409 -0
- package/skills/security-modern-python/.claude-plugin/plugin.json +10 -0
- package/skills/security-modern-python/README.md +58 -0
- package/skills/security-modern-python/hooks/hooks.json +16 -0
- package/skills/security-modern-python/hooks/intercept-legacy-python.bats +388 -0
- package/skills/security-modern-python/hooks/intercept-legacy-python.sh +109 -0
- package/skills/security-modern-python/hooks/test_helper.bash +75 -0
- package/skills/security-modern-python/skills/modern-python/SKILL.md +333 -0
- package/skills/security-modern-python/skills/modern-python/references/dependabot.md +43 -0
- package/skills/security-modern-python/skills/modern-python/references/migration-checklist.md +141 -0
- package/skills/security-modern-python/skills/modern-python/references/pep723-scripts.md +259 -0
- package/skills/security-modern-python/skills/modern-python/references/prek.md +211 -0
- package/skills/security-modern-python/skills/modern-python/references/pyproject.md +254 -0
- package/skills/security-modern-python/skills/modern-python/references/ruff-config.md +240 -0
- package/skills/security-modern-python/skills/modern-python/references/security-setup.md +255 -0
- package/skills/security-modern-python/skills/modern-python/references/testing.md +284 -0
- package/skills/security-modern-python/skills/modern-python/references/uv-commands.md +200 -0
- package/skills/security-modern-python/skills/modern-python/templates/dependabot.yml +36 -0
- package/skills/security-modern-python/skills/modern-python/templates/pre-commit-config.yaml +66 -0
- package/skills/security-property-based-testing/.claude-plugin/plugin.json +9 -0
- package/skills/security-property-based-testing/README.md +47 -0
- package/skills/security-property-based-testing/skills/property-based-testing/README.md +88 -0
- package/skills/security-property-based-testing/skills/property-based-testing/SKILL.md +109 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/design.md +191 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/generating.md +200 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/libraries.md +130 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/refactoring.md +181 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/reviewing.md +209 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/strategies.md +124 -0
- package/skills/semgrep-rule-creator/.claude-plugin/plugin.json +8 -0
- package/skills/semgrep-rule-creator/README.md +43 -0
- package/skills/semgrep-rule-creator/commands/semgrep-rule.md +26 -0
- package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/SKILL.md +168 -0
- package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/references/quick-reference.md +203 -0
- package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/references/workflow.md +240 -0
- package/skills/semgrep-rule-variant-creator/.claude-plugin/plugin.json +9 -0
- package/skills/semgrep-rule-variant-creator/README.md +86 -0
- package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/SKILL.md +205 -0
- package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/applicability-analysis.md +250 -0
- package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/language-syntax-guide.md +324 -0
- package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/workflow.md +518 -0
- package/skills/session-logs/SKILL.md +115 -0
- package/skills/sharp-edges/.claude-plugin/plugin.json +10 -0
- package/skills/sharp-edges/README.md +48 -0
- package/skills/sharp-edges/skills/sharp-edges/SKILL.md +292 -0
- package/skills/sharp-edges/skills/sharp-edges/references/auth-patterns.md +252 -0
- package/skills/sharp-edges/skills/sharp-edges/references/case-studies.md +274 -0
- package/skills/sharp-edges/skills/sharp-edges/references/config-patterns.md +333 -0
- package/skills/sharp-edges/skills/sharp-edges/references/crypto-apis.md +190 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-c.md +205 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-csharp.md +285 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-go.md +270 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-java.md +263 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-javascript.md +269 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-kotlin.md +265 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-php.md +245 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-python.md +274 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-ruby.md +273 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-rust.md +272 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-swift.md +287 -0
- package/skills/sharp-edges/skills/sharp-edges/references/language-specific.md +588 -0
- package/skills/sherpa-onnx-tts/SKILL.md +103 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +370 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +111 -0
- package/skills/skill-creator/scripts/quick_validate.py +101 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +46 -0
- package/skills/spec-to-code-compliance/.claude-plugin/plugin.json +10 -0
- package/skills/spec-to-code-compliance/README.md +67 -0
- package/skills/spec-to-code-compliance/commands/spec-compliance.md +22 -0
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/SKILL.md +349 -0
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/COMPLETENESS_CHECKLIST.md +69 -0
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/IR_EXAMPLES.md +417 -0
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/OUTPUT_REQUIREMENTS.md +105 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/static-analysis/.claude-plugin/plugin.json +8 -0
- package/skills/static-analysis/README.md +59 -0
- package/skills/static-analysis/skills/codeql/SKILL.md +315 -0
- package/skills/static-analysis/skills/sarif-parsing/SKILL.md +479 -0
- package/skills/static-analysis/skills/sarif-parsing/resources/jq-queries.md +162 -0
- package/skills/static-analysis/skills/sarif-parsing/resources/sarif_helpers.py +331 -0
- package/skills/static-analysis/skills/semgrep/SKILL.md +337 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/testing-handbook-skills/.claude-plugin/plugin.json +8 -0
- package/skills/testing-handbook-skills/README.md +241 -0
- package/skills/testing-handbook-skills/scripts/pyproject.toml +8 -0
- package/skills/testing-handbook-skills/scripts/validate-skills.py +657 -0
- package/skills/testing-handbook-skills/skills/address-sanitizer/SKILL.md +341 -0
- package/skills/testing-handbook-skills/skills/aflpp/SKILL.md +640 -0
- package/skills/testing-handbook-skills/skills/atheris/SKILL.md +515 -0
- package/skills/testing-handbook-skills/skills/cargo-fuzz/SKILL.md +454 -0
- package/skills/testing-handbook-skills/skills/codeql/SKILL.md +549 -0
- package/skills/testing-handbook-skills/skills/constant-time-testing/SKILL.md +507 -0
- package/skills/testing-handbook-skills/skills/coverage-analysis/SKILL.md +607 -0
- package/skills/testing-handbook-skills/skills/fuzzing-dictionary/SKILL.md +297 -0
- package/skills/testing-handbook-skills/skills/fuzzing-obstacles/SKILL.md +426 -0
- package/skills/testing-handbook-skills/skills/harness-writing/SKILL.md +614 -0
- package/skills/testing-handbook-skills/skills/libafl/SKILL.md +625 -0
- package/skills/testing-handbook-skills/skills/libfuzzer/SKILL.md +795 -0
- package/skills/testing-handbook-skills/skills/ossfuzz/SKILL.md +426 -0
- package/skills/testing-handbook-skills/skills/ruzzy/SKILL.md +443 -0
- package/skills/testing-handbook-skills/skills/semgrep/SKILL.md +601 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/SKILL.md +372 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/agent-prompt.md +280 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/discovery.md +452 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/domain-skill.md +504 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/fuzzer-skill.md +454 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/technique-skill.md +527 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/tool-skill.md +366 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/testing.md +482 -0
- package/skills/testing-handbook-skills/skills/wycheproof/SKILL.md +533 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +135 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +95 -0
- package/skills/variant-analysis/.claude-plugin/plugin.json +8 -0
- package/skills/variant-analysis/README.md +41 -0
- package/skills/variant-analysis/commands/variants.md +23 -0
- package/skills/variant-analysis/skills/variant-analysis/METHODOLOGY.md +327 -0
- package/skills/variant-analysis/skills/variant-analysis/SKILL.md +142 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/cpp.ql +119 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/go.ql +69 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/java.ql +71 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/javascript.ql +63 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/python.ql +80 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/cpp.yaml +98 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/go.yaml +63 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/java.yaml +61 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/javascript.yaml +60 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/python.yaml +72 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/variant-report-template.md +75 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- package/skills/weather/SKILL.md +54 -0
- package/skills/yara-authoring/.claude-plugin/plugin.json +9 -0
- package/skills/yara-authoring/README.md +131 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/SKILL.md +645 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_Mac_ProtonRAT_Jan25.yar +99 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_NPM_SupplyChain_Jan25.yar +170 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_Win_Remcos_Jan25.yar +103 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/SUSP_CRX_SuspiciousPermissions.yar +134 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/SUSP_JS_Obfuscation_Jan25.yar +185 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/crx-module.md +214 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/dex-module.md +383 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/performance.md +333 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/strings.md +433 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/style-guide.md +257 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/testing.md +399 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/scripts/atom_analyzer.py +526 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/scripts/pyproject.toml +25 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/scripts/yara_lint.py +631 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/workflows/rule-development.md +493 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Excerpt from bn.js - BigNumber library
|
|
3
|
+
* https://github.com/indutny/bn.js
|
|
4
|
+
*
|
|
5
|
+
* This excerpt demonstrates common timing vulnerability patterns
|
|
6
|
+
* in JavaScript cryptographic libraries.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
// Division operations - use hardware division which has variable timing
|
|
10
|
+
BN.prototype.div = function div(num) {
|
|
11
|
+
return this.divmod(num, 'div', false).div;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
BN.prototype.mod = function mod(num) {
|
|
15
|
+
return this.divmod(num, 'mod', false).mod;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
BN.prototype.umod = function umod(num) {
|
|
19
|
+
return this.divmod(num, 'mod', true).mod;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// Comparison function - early-exit on sign differences leaks timing
|
|
23
|
+
BN.prototype.cmp = function cmp(num) {
|
|
24
|
+
if (this.negative !== 0 && num.negative === 0) return -1;
|
|
25
|
+
if (this.negative === 0 && num.negative !== 0) return 1;
|
|
26
|
+
|
|
27
|
+
var res = this.ucmp(num);
|
|
28
|
+
if (this.negative !== 0) return -res | 0;
|
|
29
|
+
return res;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Unsigned comparison - iterates until difference found (timing leak)
|
|
33
|
+
BN.prototype.ucmp = function ucmp(num) {
|
|
34
|
+
if (this.length > num.length) return 1;
|
|
35
|
+
if (this.length < num.length) return -1;
|
|
36
|
+
|
|
37
|
+
var res = 0;
|
|
38
|
+
for (var i = this.length - 1; i >= 0; i--) {
|
|
39
|
+
var a = this.words[i] | 0;
|
|
40
|
+
var b = num.words[i] | 0;
|
|
41
|
+
if (a === b) continue; // Early exit - timing leak!
|
|
42
|
+
if (a < b) {
|
|
43
|
+
res = -1;
|
|
44
|
+
} else if (a > b) {
|
|
45
|
+
res = 1;
|
|
46
|
+
}
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
return res;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// Modular exponentiation - windowed method with data-dependent branches
|
|
53
|
+
Red.prototype.pow = function pow(a, num) {
|
|
54
|
+
if (num.isZero()) return new BN(1).toRed(this);
|
|
55
|
+
if (num.cmpn(1) === 0) return a.clone();
|
|
56
|
+
|
|
57
|
+
var windowSize = 4;
|
|
58
|
+
var wnd = new Array(1 << windowSize);
|
|
59
|
+
wnd[0] = new BN(1).toRed(this);
|
|
60
|
+
wnd[1] = a;
|
|
61
|
+
for (var i = 2; i < wnd.length; i++) {
|
|
62
|
+
wnd[i] = this.mul(wnd[i - 1], a);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
var res = wnd[0];
|
|
66
|
+
var current = 0;
|
|
67
|
+
var currentLen = 0;
|
|
68
|
+
var start = num.bitLength() % 26;
|
|
69
|
+
if (start === 0) {
|
|
70
|
+
start = 26;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
for (i = num.length - 1; i >= 0; i--) {
|
|
74
|
+
var word = num.words[i];
|
|
75
|
+
for (var j = start - 1; j >= 0; j--) {
|
|
76
|
+
var bit = (word >> j) & 1;
|
|
77
|
+
if (res !== wnd[0]) {
|
|
78
|
+
res = this.sqr(res);
|
|
79
|
+
}
|
|
80
|
+
// Data-dependent branch on secret exponent bit!
|
|
81
|
+
if (bit === 0 && current === 0) {
|
|
82
|
+
currentLen = 0;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
current <<= 1;
|
|
86
|
+
current |= bit;
|
|
87
|
+
currentLen++;
|
|
88
|
+
if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;
|
|
89
|
+
res = this.mul(res, wnd[current]);
|
|
90
|
+
currentLen = 0;
|
|
91
|
+
current = 0;
|
|
92
|
+
}
|
|
93
|
+
start = 26;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return res;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// Division with remainder - internally uses variable-time division
|
|
100
|
+
BN.prototype.divmod = function divmod(num, mode, positive) {
|
|
101
|
+
if (num.isZero()) {
|
|
102
|
+
throw new Error('division by zero');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (this.isZero()) {
|
|
106
|
+
return {
|
|
107
|
+
div: new BN(0),
|
|
108
|
+
mod: new BN(0)
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
var div, mod, res;
|
|
113
|
+
if (this.negative !== 0 && num.negative === 0) {
|
|
114
|
+
res = this.neg().divmod(num, mode);
|
|
115
|
+
if (mode !== 'mod') {
|
|
116
|
+
div = res.div.neg();
|
|
117
|
+
}
|
|
118
|
+
if (mode !== 'div') {
|
|
119
|
+
mod = res.mod.neg();
|
|
120
|
+
if (positive && mod.negative !== 0) {
|
|
121
|
+
mod.iadd(num);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return { div: div, mod: mod };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Uses division internally
|
|
128
|
+
if (this.length > num.length || this.cmp(num) >= 0) {
|
|
129
|
+
// Variable-time long division algorithm
|
|
130
|
+
var shift = num.bitLength() - this.bitLength();
|
|
131
|
+
// ... implementation uses / and % operators
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return { div: div, mod: mod };
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// Montgomery reduction - uses modular operations
|
|
138
|
+
Mont.prototype.mul = function mul(a, b) {
|
|
139
|
+
if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);
|
|
140
|
+
|
|
141
|
+
var t = a.mul(b);
|
|
142
|
+
// Uses mod operation internally
|
|
143
|
+
var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
|
|
144
|
+
var u = t.isub(c).iushrn(this.shift);
|
|
145
|
+
var res = u;
|
|
146
|
+
|
|
147
|
+
if (u.cmp(this.m) >= 0) {
|
|
148
|
+
res = u.isub(this.m);
|
|
149
|
+
} else if (u.cmpn(0) < 0) {
|
|
150
|
+
res = u.iadd(this.m);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return res._forceRed(this);
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
// Modular inverse - uses extended Euclidean algorithm with data-dependent iterations
|
|
157
|
+
BN.prototype.invm = function invm(num) {
|
|
158
|
+
return this.egcd(num).a.umod(num);
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
BN.prototype._invmp = function _invmp(p) {
|
|
162
|
+
var a = this;
|
|
163
|
+
var b = p.clone();
|
|
164
|
+
|
|
165
|
+
if (a.negative !== 0) {
|
|
166
|
+
a = a.umod(p);
|
|
167
|
+
} else {
|
|
168
|
+
a = a.clone();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
var x1 = new BN(1);
|
|
172
|
+
var x2 = new BN(0);
|
|
173
|
+
|
|
174
|
+
// Iterations depend on input values - timing leak
|
|
175
|
+
while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
|
|
176
|
+
// ... iteration count reveals information about inputs
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return res;
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
// Test function to prevent dead code elimination
|
|
183
|
+
function runBnOperations() {
|
|
184
|
+
var a = new BN('deadbeef', 16);
|
|
185
|
+
var b = new BN('cafebabe', 16);
|
|
186
|
+
|
|
187
|
+
// These operations have timing leaks
|
|
188
|
+
var divResult = a.div(b);
|
|
189
|
+
var modResult = a.mod(b);
|
|
190
|
+
var cmpResult = a.cmp(b);
|
|
191
|
+
|
|
192
|
+
console.log('Division:', divResult.toString(16));
|
|
193
|
+
console.log('Modulo:', modResult.toString(16));
|
|
194
|
+
console.log('Comparison:', cmpResult);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Stub for BN constructor
|
|
198
|
+
function BN(number, base) {
|
|
199
|
+
this.words = [];
|
|
200
|
+
this.length = 0;
|
|
201
|
+
this.negative = 0;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function Red() {}
|
|
205
|
+
function Mont() {}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constant-time implementation of ML-DSA Decompose (Algorithm 36)
|
|
3
|
+
*
|
|
4
|
+
* This implementation avoids hardware division by using Barrett reduction
|
|
5
|
+
* and branchless conditional selection, ensuring constant-time execution.
|
|
6
|
+
*
|
|
7
|
+
* Based on Trail of Bits' ML-DSA implementation.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#include <stdint.h>
|
|
11
|
+
#include <stddef.h>
|
|
12
|
+
|
|
13
|
+
// ML-DSA parameters
|
|
14
|
+
#define Q 8380417
|
|
15
|
+
#define GAMMA2_87 ((Q - 1) / 32) // 261888 for ML-DSA-87
|
|
16
|
+
#define GAMMA2_44 ((Q - 1) / 88) // 95232 for ML-DSA-44/65
|
|
17
|
+
|
|
18
|
+
// Barrett reduction constants for different gamma2 values
|
|
19
|
+
// These allow division by 2*gamma2 without using DIV instruction
|
|
20
|
+
// Computed as: ceil(2^32 / (2 * gamma2))
|
|
21
|
+
#define BARRETT_MU_87 0x2081ULL // For gamma2 = 261888 (ML-DSA-87): 2^32 / 523776
|
|
22
|
+
#define BARRETT_MU_44 0x5A1DULL // For gamma2 = 95232 (ML-DSA-44/65): 2^32 / 190464
|
|
23
|
+
|
|
24
|
+
// Constant-time helper: returns 1 if x != 0, 0 otherwise
|
|
25
|
+
static inline uint32_t ct_is_nonzero(uint32_t x) {
|
|
26
|
+
return (x | (uint32_t)(-(int32_t)x)) >> 31;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Constant-time helper: returns 1 if x == 0, 0 otherwise
|
|
30
|
+
static inline uint32_t ct_is_zero(uint32_t x) {
|
|
31
|
+
return 1 ^ ct_is_nonzero(x);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Constant-time helper: returns 1 if x < y (unsigned), 0 otherwise
|
|
35
|
+
static inline uint32_t ct_lt(uint32_t x, uint32_t y) {
|
|
36
|
+
return (x ^ ((x ^ y) | ((x - y) ^ y))) >> 31;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Constant-time helper: returns 1 if x > y (unsigned), 0 otherwise
|
|
40
|
+
static inline uint32_t ct_gt(uint32_t x, uint32_t y) {
|
|
41
|
+
return ct_lt(y, x);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Constant-time helper: returns mask (0xFFFFFFFF if bit != 0, 0 otherwise)
|
|
45
|
+
static inline uint32_t ct_mask(uint32_t bit) {
|
|
46
|
+
return (uint32_t)(-(int32_t)ct_is_nonzero(bit));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Constant-time helper: select x if bit != 0, y otherwise
|
|
50
|
+
static inline uint32_t ct_select(uint32_t x, uint32_t y, uint32_t bit) {
|
|
51
|
+
uint32_t m = ct_mask(bit);
|
|
52
|
+
return (x & m) | (y & ~m);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Constant-time helper: select x if bit != 0, y otherwise (signed version)
|
|
56
|
+
static inline int32_t ct_select_signed(int32_t x, int32_t y, uint32_t bit) {
|
|
57
|
+
return (int32_t)ct_select((uint32_t)x, (uint32_t)y, bit);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Barrett reduction to compute r / (2 * gamma2) without DIV instruction
|
|
62
|
+
*
|
|
63
|
+
* For gamma2 = 261888 (ML-DSA-87):
|
|
64
|
+
* 2 * gamma2 = 523776
|
|
65
|
+
* mu = ceil(2^32 / 523776) = 8192 + some correction
|
|
66
|
+
*
|
|
67
|
+
* q = (r * mu) >> 32
|
|
68
|
+
*/
|
|
69
|
+
static inline uint32_t barrett_div(uint32_t r, uint64_t mu, uint32_t divisor) {
|
|
70
|
+
uint64_t q = ((uint64_t)r * mu) >> 32;
|
|
71
|
+
// Correction: if r - q*divisor >= divisor, add 1
|
|
72
|
+
uint32_t remainder = r - (uint32_t)q * divisor;
|
|
73
|
+
uint32_t correction = ct_gt(remainder, divisor - 1) | ct_is_zero(remainder - divisor + divisor);
|
|
74
|
+
return (uint32_t)q + (correction & ct_lt(remainder, r + 1));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* CONSTANT-TIME: Decompose using Barrett reduction
|
|
79
|
+
*
|
|
80
|
+
* Decomposes r into (r1, r0) such that r = r1 * (2 * gamma2) + r0
|
|
81
|
+
* where -gamma2 < r0 <= gamma2.
|
|
82
|
+
*
|
|
83
|
+
* This implementation:
|
|
84
|
+
* 1. Uses Barrett reduction instead of hardware division
|
|
85
|
+
* 2. Uses branchless conditional selection instead of if statements
|
|
86
|
+
*/
|
|
87
|
+
void decompose_constant_time(uint32_t r, uint32_t gamma2, uint32_t *r1, int32_t *r0) {
|
|
88
|
+
uint32_t two_gamma2 = 2 * gamma2;
|
|
89
|
+
|
|
90
|
+
// Barrett reduction: compute r1 = r / (2 * gamma2)
|
|
91
|
+
// Using precomputed constants - select the right one using constant-time selection
|
|
92
|
+
// This avoids any runtime division
|
|
93
|
+
uint64_t mu_87 = BARRETT_MU_87;
|
|
94
|
+
uint64_t mu_44 = BARRETT_MU_44;
|
|
95
|
+
|
|
96
|
+
// Constant-time selection of mu based on gamma2
|
|
97
|
+
// Note: We use bit operations to select without branching
|
|
98
|
+
uint32_t is_87 = ct_is_zero(gamma2 - GAMMA2_87);
|
|
99
|
+
uint64_t mu = (mu_87 & (uint64_t)ct_mask(is_87)) |
|
|
100
|
+
(mu_44 & (uint64_t)ct_mask(ct_is_zero(is_87)));
|
|
101
|
+
|
|
102
|
+
// Compute quotient using multiplication and shift (no DIV)
|
|
103
|
+
uint64_t q64 = ((uint64_t)r * mu) >> 32;
|
|
104
|
+
uint32_t q = (uint32_t)q64;
|
|
105
|
+
|
|
106
|
+
// Compute remainder: r0 = r - q * (2 * gamma2)
|
|
107
|
+
int32_t r0_temp = (int32_t)(r - q * two_gamma2);
|
|
108
|
+
|
|
109
|
+
// Correction: handle case where Barrett underestimates
|
|
110
|
+
// If r0_temp >= 2*gamma2, increment q and adjust r0
|
|
111
|
+
uint32_t needs_correction = ct_gt((uint32_t)r0_temp, two_gamma2 - 1);
|
|
112
|
+
q += needs_correction;
|
|
113
|
+
r0_temp = ct_select_signed(r0_temp - (int32_t)two_gamma2, r0_temp, needs_correction);
|
|
114
|
+
|
|
115
|
+
// Center r0 around 0: if r0 > gamma2, subtract 2*gamma2 and increment r1
|
|
116
|
+
// This is done branchlessly using constant-time selection
|
|
117
|
+
uint32_t needs_centering = ct_gt((uint32_t)r0_temp, gamma2);
|
|
118
|
+
|
|
119
|
+
*r0 = ct_select_signed(r0_temp - (int32_t)two_gamma2, r0_temp, needs_centering);
|
|
120
|
+
*r1 = q + needs_centering;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* CONSTANT-TIME: UseHint using branchless selection
|
|
125
|
+
*
|
|
126
|
+
* All conditional logic is replaced with constant-time bit operations.
|
|
127
|
+
*/
|
|
128
|
+
uint32_t use_hint_constant_time(uint32_t r, uint32_t hint, uint32_t gamma2) {
|
|
129
|
+
uint32_t r1;
|
|
130
|
+
int32_t r0;
|
|
131
|
+
|
|
132
|
+
// Decompose (constant-time)
|
|
133
|
+
decompose_constant_time(r, gamma2, &r1, &r0);
|
|
134
|
+
|
|
135
|
+
// m = (Q - 1) / (2 * gamma2)
|
|
136
|
+
// Precomputed values to avoid runtime division
|
|
137
|
+
// For gamma2 = 261888: m = 8380416 / 523776 = 16 - 1 = 15
|
|
138
|
+
// For gamma2 = 95232: m = 8380416 / 190464 = 44 - 1 = 43
|
|
139
|
+
uint32_t m_87 = 15;
|
|
140
|
+
uint32_t m_44 = 43;
|
|
141
|
+
uint32_t is_87_hint = ct_is_zero(gamma2 - GAMMA2_87);
|
|
142
|
+
uint32_t m = ct_select(m_87, m_44, is_87_hint);
|
|
143
|
+
|
|
144
|
+
// If hint == 0, return r1
|
|
145
|
+
// If hint != 0:
|
|
146
|
+
// If r0 > 0, return (r1 + 1) mod (m + 1)
|
|
147
|
+
// Else return (r1 - 1 + (m + 1)) mod (m + 1)
|
|
148
|
+
|
|
149
|
+
// Compute both branches
|
|
150
|
+
uint32_t m_plus_1 = m + 1;
|
|
151
|
+
|
|
152
|
+
// r1_inc = (r1 + 1) mod (m + 1)
|
|
153
|
+
// Since r1 < m+1, we just need to check if r1 + 1 == m + 1
|
|
154
|
+
uint32_t r1_plus_1 = r1 + 1;
|
|
155
|
+
uint32_t r1_inc = ct_select(0, r1_plus_1, ct_is_zero(r1_plus_1 - m_plus_1));
|
|
156
|
+
|
|
157
|
+
// r1_dec = (r1 - 1 + (m + 1)) mod (m + 1) = (r1 + m) mod (m + 1)
|
|
158
|
+
uint32_t r1_plus_m = r1 + m;
|
|
159
|
+
uint32_t r1_dec = ct_select(r1_plus_m - m_plus_1, r1_plus_m,
|
|
160
|
+
ct_gt(r1_plus_m, m_plus_1 - 1));
|
|
161
|
+
|
|
162
|
+
// Select based on r0 > 0 (constant-time)
|
|
163
|
+
// r0 > 0 is equivalent to r0 being positive and non-zero
|
|
164
|
+
uint32_t r0_positive = ct_gt((uint32_t)((r0 >> 31) ^ r0), 0) & ct_is_zero((uint32_t)(r0 >> 31));
|
|
165
|
+
uint32_t adjusted = ct_select(r1_inc, r1_dec, r0_positive);
|
|
166
|
+
|
|
167
|
+
// Final selection based on hint
|
|
168
|
+
return ct_select(adjusted, r1, ct_is_zero(hint));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Test functions to ensure code is not dead-code eliminated
|
|
172
|
+
uint32_t test_decompose_ct(uint32_t r) {
|
|
173
|
+
uint32_t r1;
|
|
174
|
+
int32_t r0;
|
|
175
|
+
decompose_constant_time(r, GAMMA2_87, &r1, &r0);
|
|
176
|
+
return r1 + (uint32_t)r0;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
uint32_t test_use_hint_ct(uint32_t r, uint32_t hint) {
|
|
180
|
+
return use_hint_constant_time(r, hint, GAMMA2_87);
|
|
181
|
+
}
|
package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.c
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vulnerable implementation of ML-DSA Decompose (Algorithm 36)
|
|
3
|
+
*
|
|
4
|
+
* This implementation uses hardware division which has data-dependent timing,
|
|
5
|
+
* making it vulnerable to timing side-channel attacks like KyberSlash.
|
|
6
|
+
*
|
|
7
|
+
* DO NOT use this in production - for testing purposes only.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#include <stdint.h>
|
|
11
|
+
|
|
12
|
+
// ML-DSA parameters
|
|
13
|
+
#define Q 8380417
|
|
14
|
+
#define GAMMA2_87 ((Q - 1) / 32) // 261888 for ML-DSA-87
|
|
15
|
+
#define GAMMA2_44 ((Q - 1) / 88) // 95232 for ML-DSA-44/65
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* VULNERABLE: Decompose using hardware division
|
|
19
|
+
*
|
|
20
|
+
* Decomposes r into (r1, r0) such that r = r1 * (2 * gamma2) + r0
|
|
21
|
+
* where -gamma2 < r0 <= gamma2.
|
|
22
|
+
*
|
|
23
|
+
* This uses the / and % operators which compile to DIV/IDIV instructions
|
|
24
|
+
* on x86, which have data-dependent timing.
|
|
25
|
+
*/
|
|
26
|
+
void decompose_vulnerable(int32_t r, int32_t gamma2, int32_t *r1, int32_t *r0) {
|
|
27
|
+
int32_t two_gamma2 = 2 * gamma2;
|
|
28
|
+
|
|
29
|
+
// VULNERABLE: Hardware division with data-dependent timing
|
|
30
|
+
*r1 = r / two_gamma2;
|
|
31
|
+
*r0 = r % two_gamma2;
|
|
32
|
+
|
|
33
|
+
// Center r0 around 0
|
|
34
|
+
if (*r0 > gamma2) {
|
|
35
|
+
*r0 -= two_gamma2;
|
|
36
|
+
*r1 += 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* VULNERABLE: UseHint using branches on potentially secret data
|
|
42
|
+
*
|
|
43
|
+
* The hint values may be derived from secret data in some contexts,
|
|
44
|
+
* making these branches potentially exploitable.
|
|
45
|
+
*/
|
|
46
|
+
int32_t use_hint_vulnerable(int32_t r, int32_t hint, int32_t gamma2) {
|
|
47
|
+
int32_t r1, r0;
|
|
48
|
+
|
|
49
|
+
// This decompose call is also vulnerable
|
|
50
|
+
decompose_vulnerable(r, gamma2, &r1, &r0);
|
|
51
|
+
|
|
52
|
+
// VULNERABLE: Branch on hint which may depend on secret data
|
|
53
|
+
if (hint == 0) {
|
|
54
|
+
return r1;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// VULNERABLE: Branch on r0's sign
|
|
58
|
+
if (r0 > 0) {
|
|
59
|
+
return (r1 + 1) % ((Q - 1) / (2 * gamma2) + 1);
|
|
60
|
+
} else {
|
|
61
|
+
return (r1 - 1 + ((Q - 1) / (2 * gamma2) + 1)) % ((Q - 1) / (2 * gamma2) + 1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Test functions to ensure code is not dead-code eliminated
|
|
66
|
+
int32_t test_decompose(int32_t r) {
|
|
67
|
+
int32_t r1, r0;
|
|
68
|
+
decompose_vulnerable(r, GAMMA2_87, &r1, &r0);
|
|
69
|
+
return r1 + r0;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
int32_t test_use_hint(int32_t r, int32_t hint) {
|
|
73
|
+
return use_hint_vulnerable(r, hint, GAMMA2_87);
|
|
74
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Package decompose contains vulnerable implementations of ML-DSA decompose
|
|
2
|
+
// for testing the constant-time analyzer.
|
|
3
|
+
//
|
|
4
|
+
// DO NOT use this in production - for testing purposes only.
|
|
5
|
+
package main
|
|
6
|
+
|
|
7
|
+
// ML-DSA parameters
|
|
8
|
+
const (
|
|
9
|
+
Q = 8380417
|
|
10
|
+
Gamma87 = (Q - 1) / 32 // 261888 for ML-DSA-87
|
|
11
|
+
Gamma44 = (Q - 1) / 88 // 95232 for ML-DSA-44/65
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
// DecomposeVulnerable uses hardware division which has data-dependent timing.
|
|
15
|
+
// This is vulnerable to timing side-channel attacks like KyberSlash.
|
|
16
|
+
//
|
|
17
|
+
// VULNERABLE: Uses / and % operators which compile to DIV instructions
|
|
18
|
+
// that have variable execution time based on operand values.
|
|
19
|
+
func DecomposeVulnerable(r int32, gamma2 int32) (r1 int32, r0 int32) {
|
|
20
|
+
twoGamma2 := 2 * gamma2
|
|
21
|
+
|
|
22
|
+
// VULNERABLE: Hardware division with data-dependent timing
|
|
23
|
+
r1 = r / twoGamma2
|
|
24
|
+
r0 = r % twoGamma2
|
|
25
|
+
|
|
26
|
+
// Center r0 around 0
|
|
27
|
+
// VULNERABLE: Branch on r0 which may depend on secret data
|
|
28
|
+
if r0 > gamma2 {
|
|
29
|
+
r0 -= twoGamma2
|
|
30
|
+
r1 += 1
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return r1, r0
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// UseHintVulnerable uses branches on potentially secret-derived data.
|
|
37
|
+
//
|
|
38
|
+
// VULNERABLE: Contains conditional branches that may leak timing information
|
|
39
|
+
// when the hint or r values are derived from secret data.
|
|
40
|
+
func UseHintVulnerable(r int32, hint int32, gamma2 int32) int32 {
|
|
41
|
+
r1, r0 := DecomposeVulnerable(r, gamma2)
|
|
42
|
+
|
|
43
|
+
m := (Q - 1) / (2 * gamma2)
|
|
44
|
+
|
|
45
|
+
// VULNERABLE: Branch on hint which may depend on secret data
|
|
46
|
+
if hint == 0 {
|
|
47
|
+
return r1
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// VULNERABLE: Branch on r0's sign
|
|
51
|
+
if r0 > 0 {
|
|
52
|
+
return (r1 + 1) % (m + 1)
|
|
53
|
+
}
|
|
54
|
+
return (r1 - 1 + m + 1) % (m + 1)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// PowerDecomposeVulnerable demonstrates another vulnerable pattern:
|
|
58
|
+
// using division for power-of-2 decomposition instead of bit shifts.
|
|
59
|
+
func PowerDecomposeVulnerable(r int32, d int32) (r1 int32, r0 int32) {
|
|
60
|
+
// VULNERABLE: Should use bit shifts instead of division
|
|
61
|
+
// This compiles to IDIV even though it could be a simple shift
|
|
62
|
+
divisor := int32(1) << d
|
|
63
|
+
r1 = r / divisor
|
|
64
|
+
r0 = r % divisor
|
|
65
|
+
return r1, r0
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
func main() {
|
|
69
|
+
// Test calls to prevent dead code elimination
|
|
70
|
+
r1, r0 := DecomposeVulnerable(12345, Gamma87)
|
|
71
|
+
_ = r1 + r0
|
|
72
|
+
|
|
73
|
+
result := UseHintVulnerable(12345, 1, Gamma87)
|
|
74
|
+
_ = result
|
|
75
|
+
|
|
76
|
+
r1p, r0p := PowerDecomposeVulnerable(12345, 13)
|
|
77
|
+
_ = r1p + r0p
|
|
78
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
//! Vulnerable implementations of ML-DSA decompose for testing the constant-time analyzer.
|
|
2
|
+
//!
|
|
3
|
+
//! DO NOT use this in production - for testing purposes only.
|
|
4
|
+
|
|
5
|
+
/// ML-DSA modulus
|
|
6
|
+
const Q: i32 = 8380417;
|
|
7
|
+
|
|
8
|
+
/// Gamma2 for ML-DSA-87
|
|
9
|
+
const GAMMA2_87: i32 = (Q - 1) / 32; // 261888
|
|
10
|
+
|
|
11
|
+
/// Gamma2 for ML-DSA-44/65
|
|
12
|
+
const GAMMA2_44: i32 = (Q - 1) / 88; // 95232
|
|
13
|
+
|
|
14
|
+
/// VULNERABLE: Decompose using hardware division
|
|
15
|
+
///
|
|
16
|
+
/// This implementation uses the / and % operators which compile to IDIV
|
|
17
|
+
/// instructions on x86, which have data-dependent timing.
|
|
18
|
+
///
|
|
19
|
+
/// This makes it vulnerable to timing side-channel attacks like KyberSlash.
|
|
20
|
+
#[inline(never)]
|
|
21
|
+
pub fn decompose_vulnerable(r: i32, gamma2: i32) -> (i32, i32) {
|
|
22
|
+
let two_gamma2 = 2 * gamma2;
|
|
23
|
+
|
|
24
|
+
// VULNERABLE: Hardware division with data-dependent timing
|
|
25
|
+
let mut r1 = r / two_gamma2;
|
|
26
|
+
let mut r0 = r % two_gamma2;
|
|
27
|
+
|
|
28
|
+
// Center r0 around 0
|
|
29
|
+
// VULNERABLE: Branch on r0 which may depend on secret data
|
|
30
|
+
if r0 > gamma2 {
|
|
31
|
+
r0 -= two_gamma2;
|
|
32
|
+
r1 += 1;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
(r1, r0)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/// VULNERABLE: UseHint using branches on potentially secret-derived data
|
|
39
|
+
///
|
|
40
|
+
/// The hint values may be derived from secret data in some contexts,
|
|
41
|
+
/// making these branches potentially exploitable.
|
|
42
|
+
#[inline(never)]
|
|
43
|
+
pub fn use_hint_vulnerable(r: i32, hint: i32, gamma2: i32) -> i32 {
|
|
44
|
+
let (r1, r0) = decompose_vulnerable(r, gamma2);
|
|
45
|
+
|
|
46
|
+
let m = (Q - 1) / (2 * gamma2);
|
|
47
|
+
|
|
48
|
+
// VULNERABLE: Branch on hint which may depend on secret data
|
|
49
|
+
if hint == 0 {
|
|
50
|
+
return r1;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// VULNERABLE: Branch on r0's sign
|
|
54
|
+
if r0 > 0 {
|
|
55
|
+
(r1 + 1) % (m + 1)
|
|
56
|
+
} else {
|
|
57
|
+
(r1 - 1 + m + 1) % (m + 1)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/// VULNERABLE: Floating-point division
|
|
62
|
+
///
|
|
63
|
+
/// Uses floating-point division which has variable latency on most processors.
|
|
64
|
+
#[inline(never)]
|
|
65
|
+
pub fn fp_divide_vulnerable(a: f64, b: f64) -> f64 {
|
|
66
|
+
// VULNERABLE: FDIV/DIVSD has variable latency
|
|
67
|
+
a / b
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/// VULNERABLE: Square root
|
|
71
|
+
///
|
|
72
|
+
/// Uses floating-point square root which has variable latency.
|
|
73
|
+
#[inline(never)]
|
|
74
|
+
pub fn fp_sqrt_vulnerable(x: f64) -> f64 {
|
|
75
|
+
// VULNERABLE: FSQRT/SQRTSD has variable latency
|
|
76
|
+
x.sqrt()
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
fn main() {
|
|
80
|
+
// Test calls to prevent dead code elimination
|
|
81
|
+
let (r1, r0) = decompose_vulnerable(12345, GAMMA2_87);
|
|
82
|
+
println!("Decompose: r1={}, r0={}", r1, r0);
|
|
83
|
+
|
|
84
|
+
let result = use_hint_vulnerable(12345, 1, GAMMA2_87);
|
|
85
|
+
println!("UseHint: {}", result);
|
|
86
|
+
|
|
87
|
+
let div_result = fp_divide_vulnerable(100.0, 3.0);
|
|
88
|
+
println!("FP Divide: {}", div_result);
|
|
89
|
+
|
|
90
|
+
let sqrt_result = fp_sqrt_vulnerable(2.0);
|
|
91
|
+
println!("FP Sqrt: {}", sqrt_result);
|
|
92
|
+
}
|