Merge branch 'master' into jamie-working2
This commit is contained in:
commit
e580477102
41
.github/dependabot.yml
vendored
41
.github/dependabot.yml
vendored
@ -15,6 +15,8 @@ updates:
|
||||
day: 'friday'
|
||||
time: '03:00'
|
||||
timezone: Europe/London
|
||||
cooldown:
|
||||
default-days: 2
|
||||
commit-message:
|
||||
prefix: 'chore (deps): '
|
||||
ignore:
|
||||
@ -25,12 +27,8 @@ updates:
|
||||
# see issue #2214 for rationale for each of these
|
||||
- dependency-name: '@xmldom/xmldom'
|
||||
versions: [ '>=0.9.0' ]
|
||||
- dependency-name: 'bcryptjs'
|
||||
versions: [ '>=3.0.0' ]
|
||||
- dependency-name: 'bootstrap'
|
||||
versions: [ '>=5.0.0' ]
|
||||
- dependency-name: 'bson'
|
||||
versions: [ '>=5.0.0' ]
|
||||
- dependency-name: 'cbor'
|
||||
versions: [ '>=10.0.0' ]
|
||||
- dependency-name: 'eslint'
|
||||
@ -43,11 +41,12 @@ updates:
|
||||
versions: [ '>=2.0.0' ]
|
||||
- dependency-name: 'jimp'
|
||||
versions: [ '1.6.1' ]
|
||||
- dependency-name: 'webpack-dev-server'
|
||||
versions: [ '>=5.1.0' ]
|
||||
- dependency-name: 'jq-web'
|
||||
versions: [ '>=0.6.0' ]
|
||||
groups:
|
||||
#
|
||||
# Grouping so we don't get a seperate PR for every patch version.
|
||||
# Grouping so patch version updates are batched together in a single PR
|
||||
# and similarly with minor version updates
|
||||
#
|
||||
patch-updates:
|
||||
applies-to: version-updates
|
||||
@ -55,6 +54,12 @@ updates:
|
||||
- '*'
|
||||
update-types:
|
||||
- 'patch'
|
||||
minor-updates:
|
||||
applies-to: version-updates
|
||||
patterns:
|
||||
- '*'
|
||||
update-types:
|
||||
- 'minor'
|
||||
|
||||
# Versioning on Github Actions
|
||||
- package-ecosystem: "github-actions"
|
||||
@ -66,5 +71,27 @@ updates:
|
||||
day: 'friday'
|
||||
time: '03:00'
|
||||
timezone: Europe/London
|
||||
cooldown:
|
||||
default-days: 4
|
||||
commit-message:
|
||||
prefix: 'chore (deps): '
|
||||
groups:
|
||||
actions-dependencies:
|
||||
patterns:
|
||||
- "*"
|
||||
|
||||
- package-ecosystem: docker
|
||||
directory: /
|
||||
schedule:
|
||||
interval: 'weekly'
|
||||
day: 'friday'
|
||||
time: '03:00'
|
||||
timezone: Europe/London
|
||||
cooldown:
|
||||
default-days: 4
|
||||
commit-message:
|
||||
prefix: 'chore (deps): '
|
||||
groups:
|
||||
docker-dependencies:
|
||||
patterns:
|
||||
- "*"
|
||||
|
||||
14
.github/workflows/master.yml
vendored
14
.github/workflows/master.yml
vendored
@ -16,10 +16,10 @@ jobs:
|
||||
pages: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
|
||||
- name: Set node version
|
||||
uses: actions/setup-node@v6
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
with:
|
||||
node-version: 24
|
||||
registry-url: "https://registry.npmjs.org"
|
||||
@ -44,9 +44,17 @@ jobs:
|
||||
- name: Generate sitemap
|
||||
run: npx grunt exec:sitemap
|
||||
|
||||
- name: Setup Chrome
|
||||
id: setup-chrome
|
||||
if: success()
|
||||
run: |
|
||||
npx @puppeteer/browsers install chrome@148
|
||||
echo chromedir=$(dirname $(find `pwd`/chrome/* -name chrome -print -quit)) >> $GITHUB_OUTPUT
|
||||
|
||||
- name: UI Tests
|
||||
if: success()
|
||||
run: |
|
||||
export PATH=${{ steps.setup-chrome.outputs.chromedir }}:$PATH
|
||||
sudo apt-get install xvfb
|
||||
xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
|
||||
|
||||
@ -56,7 +64,7 @@ jobs:
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
if: success() && github.ref == 'refs/heads/master'
|
||||
uses: crazy-max/ghaction-github-pages@v5
|
||||
uses: crazy-max/ghaction-github-pages@1d6ee9b181a81033a16bd707a1401afa978daab4 # v5.0.0
|
||||
with:
|
||||
target_branch: gh-pages
|
||||
build_dir: ./build/prod
|
||||
|
||||
22
.github/workflows/pull_requests.yml
vendored
22
.github/workflows/pull_requests.yml
vendored
@ -12,10 +12,10 @@ jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
|
||||
- name: Set node version
|
||||
uses: actions/setup-node@v6
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
with:
|
||||
node-version: 24
|
||||
registry-url: "https://registry.npmjs.org"
|
||||
@ -39,28 +39,36 @@ jobs:
|
||||
|
||||
- name: Upload Build Artefact
|
||||
if: success()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: zipped-build
|
||||
path: build/prod/*.zip
|
||||
retention-days: 5
|
||||
|
||||
- name: Setup Chrome
|
||||
id: setup-chrome
|
||||
if: success()
|
||||
run: |
|
||||
npx @puppeteer/browsers install chrome@148
|
||||
echo chromedir=$(dirname $(find `pwd`/chrome/* -name chrome -print -quit)) >> $GITHUB_OUTPUT
|
||||
|
||||
- name: UI Tests
|
||||
if: success()
|
||||
run: |
|
||||
export PATH=${{ steps.setup-chrome.outputs.chromedir }}:$PATH
|
||||
sudo apt-get install xvfb
|
||||
xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
if: success()
|
||||
uses: docker/setup-buildx-action@v4
|
||||
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v4
|
||||
uses: docker/setup-qemu-action@06116385d9baf250c9f4dcb4858b16962ea869c3 # v4.1.0
|
||||
|
||||
- name: Production Image Build
|
||||
if: success()
|
||||
id: build-image
|
||||
uses: docker/build-push-action@v6
|
||||
uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
|
||||
with:
|
||||
platforms: linux/amd64,linux/arm64
|
||||
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||
|
||||
33
.github/workflows/releases.yml
vendored
33
.github/workflows/releases.yml
vendored
@ -22,10 +22,10 @@ jobs:
|
||||
contents: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
|
||||
- name: Set node version
|
||||
uses: actions/setup-node@v6
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
with:
|
||||
node-version: 24
|
||||
registry-url: "https://registry.npmjs.org"
|
||||
@ -46,20 +46,29 @@ jobs:
|
||||
- name: Production Build
|
||||
run: npx grunt prod
|
||||
|
||||
- name: UI Tests
|
||||
- name: Setup Chrome
|
||||
id: setup-chrome
|
||||
if: success()
|
||||
run: |
|
||||
npx @puppeteer/browsers install chrome@148
|
||||
echo chromedir=$(dirname $(find `pwd`/chrome/* -name chrome -print -quit)) >> $GITHUB_OUTPUT
|
||||
|
||||
- name: UI Tests
|
||||
if: success()
|
||||
run: |
|
||||
export PATH=${{ steps.setup-chrome.outputs.chromedir }}:$PATH
|
||||
sudo apt-get install xvfb
|
||||
xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v4
|
||||
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v4
|
||||
uses: docker/setup-qemu-action@06116385d9baf250c9f4dcb4858b16962ea869c3 # v4.1.0
|
||||
|
||||
- name: Image Metadata
|
||||
id: image-metadata
|
||||
uses: docker/metadata-action@v6
|
||||
uses: docker/metadata-action@80c7e94dd9b9319bd5eb7a0e0fe9291e23a2a2e9 # v6.1.0
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
@ -68,24 +77,24 @@ jobs:
|
||||
type=semver,pattern={{version}}
|
||||
|
||||
- name: Log in to GHCR
|
||||
uses: docker/login-action@v4
|
||||
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ env.REGISTRY_USER }}
|
||||
password: ${{ env.REGISTRY_PASSWORD }}
|
||||
|
||||
- name: Publish to GHCR
|
||||
uses: docker/build-push-action@v6
|
||||
uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
tags: ${{ steps.image-metadata.outputs.tags }}
|
||||
labels: ${{ steps.image-metadata.outputs.labels }}
|
||||
platforms: linux/amd64,linux/arm64
|
||||
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||
|
||||
- name: Upload Release Assets
|
||||
id: upload-release-assets
|
||||
uses: svenstaro/upload-release-action@v2
|
||||
uses: svenstaro/upload-release-action@29e53e917877a24fad85510ded594ab3c9ca12de # v2
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: build/prod/*.zip
|
||||
@ -101,10 +110,10 @@ jobs:
|
||||
needs: main
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
|
||||
- name: Set node version
|
||||
uses: actions/setup-node@v6
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
with:
|
||||
node-version: 24
|
||||
registry-url: "https://registry.npmjs.org"
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@ -10,6 +10,8 @@ src/core/config/OperationConfig.json
|
||||
src/core/operations/index.mjs
|
||||
src/node/config/OperationConfig.json
|
||||
src/node/index.mjs
|
||||
tests/operations/index.mjs
|
||||
**/*.DS_Store
|
||||
tests/browser/output/*
|
||||
.node-version
|
||||
chrome
|
||||
|
||||
146
CHANGELOG.md
146
CHANGELOG.md
@ -13,6 +13,75 @@ All major and minor version changes will be documented in this file. Details of
|
||||
|
||||
## Details
|
||||
|
||||
### [11.1.0] - 2026-06-13
|
||||
This release includes a security fix ([#2557])
|
||||
- Security: Add fix, and tests, for Lorem Ipsum DoS issue [@GCHQDeveloper581] | [#2557]
|
||||
- chore (deps): bump the patch-updates group with 4 updates | [#2552]
|
||||
- chore (deps): bump the actions-dependencies group with 2 updates | [#2551]
|
||||
- chore (deps): bump the docker-dependencies group with 2 updates | [#2550]
|
||||
- chore (deps): bump protobufjs from 8.5.0 to 8.6.2 in the minor-updates group | [#2553]
|
||||
- Security Policy Update [@C85297] | [#2547]
|
||||
- Fix spurious error messages generated during webpack build [@GCHQDeveloper581] | [#2545]
|
||||
- chore (deps): bump shell-quote from 1.8.3 to 1.8.4 | [#2543]
|
||||
- Implementing ROR13 feature [@Fufu-btw] | [#2539]
|
||||
- New operation improvements [@jl5193] [@GCHQDeveloper581] | [#1431]
|
||||
- Npm and yarn/major version updates [@GCHQDeveloper581] | [#2527]
|
||||
- Update README to reflect AES Decrypt changes [@andreasrtv] | [#2502]
|
||||
- feat: add Escape Smart Characters operation [@HarelKatz] | [#2391]
|
||||
- feat: Get AES IV from input (QoL) [@andreasrtv] | [#2471]
|
||||
- fix: validate text encoding options [@SyedIshmumAhnaf] | [#2497]
|
||||
- chore (deps): bump the minor-updates group with 5 updates [@GCHQDeveloper581] | [#2500]
|
||||
- chore (deps): bump the patch-updates group with 2 updates | [#2499]
|
||||
- chore (deps): bump nginxinc/nginx-unprivileged from `df0e9ed` to `0a1e718` in the docker-dependencies group | [#2498]
|
||||
- Add remove ANSI escape codes operation [@Louis-Ladd] [@GCHQDeveloper581] | [#2143]
|
||||
- Fix option ingredients being overwriten [@C85297] | [#2341]
|
||||
- chore (deps): bump qs and express | [#2478]
|
||||
- chore (deps): bump tmp from 0.2.5 to 0.2.7 | [#2479]
|
||||
- chore (deps): bump the patch-updates group across 1 directory with 6 updates | [#2463]
|
||||
- chore (deps): bump the docker-dependencies group across 1 directory with 2 updates | [#2468]
|
||||
- chore (deps): bump terser from 5.46.2 to 5.48.0 | [#2385]
|
||||
- Make dependabot quieter [@GCHQDeveloper581] | [#2467]
|
||||
- update sitemap [@Blank0120] | [#2443]
|
||||
- Bump webpack-dev-server to 5.2.4 [@GCHQDeveloper581] | [#2417]
|
||||
- Fix pgp tests [@GCHQDeveloper581] [@C85297] | [#2461]
|
||||
- chore (deps): bump the patch-updates group across 1 directory with 4 updates | [#2438]
|
||||
- chore (deps): bump docker/setup-buildx-action from 4.0.0 to 4.1.0 | [#2439]
|
||||
- chore (deps): bump docker/login-action from 4.1.0 to 4.2.0 | [#2441]
|
||||
- chore (deps): bump docker/metadata-action from 6.0.0 to 6.1.0 | [#2442]
|
||||
- update bson [@Blank0120] [@GCHQDeveloper581] | [#2425]
|
||||
- chore (deps): bump webpack from 5.106.2 to 5.107.1 | [#2428]
|
||||
- chore (deps): bump protobufjs from 7.5.8 to 7.6.0 | [#2429]
|
||||
- chore (deps): bump sql-formatter from 15.7.4 to 15.8.0 | [#2430]
|
||||
- chore (deps): bump docker/build-push-action from 7.1.0 to 7.2.0 | [#2431]
|
||||
- Fix flaky `npm run testui` [@lzandman] | [#2412]
|
||||
- Include git ref in website download zip name [@C85297] | [#2339]
|
||||
- Bump nginxinc/nginx-unprivileged from `808f784` to `b9f7ba1` | [#2389]
|
||||
- Series Chart HTML Formatting fix [@C85297] | [#2403]
|
||||
- Parse Ethernet Frame HTML formatting fix [@C85297] | [#2402]
|
||||
- Parse IPv4 Header HTML formatting fix [@C85297] | [#2401]
|
||||
- Update chromedriver, and install corresponding chrome in workflows (fixes build) [@GCHQDeveloper581] | [#2387]
|
||||
- chore (deps): bump @codemirror/view from 6.41.1 to 6.43.0 | [#2384]
|
||||
- chore (deps): bump globals from 17.5.0 to 17.6.0 | [#2386]
|
||||
- chore (deps): bump the patch-updates group across 1 directory with 3 updates | [#2388]
|
||||
- [StepSecurity] Apply security best practices [@GCHQDeveloper581] StepSecurity Bot <bot@stepsecurity.io> | [#2378]
|
||||
- Build docker container for arm v7 as well [@GCHQDeveloper581] | [#2379]
|
||||
- chore (deps): bump fast-uri from 3.1.0 to 3.1.2 | [#2372]
|
||||
- update bcryptjs [@C85297] [@GCHQDeveloper581] | [#2368]
|
||||
- chore (deps): bump picomatch from 2.3.1 to 2.3.2 | [#2370]
|
||||
- chore (deps): bump ip-address from 10.1.0 to 10.2.0 | [#2371]
|
||||
- chore (deps): bump axios from 1.15.0 to 1.16.0 | [#2369]
|
||||
- feat(operation-wrap): add new Wrap operation to format text at specified line width [@0xff1ce] | [#1882]
|
||||
- chore (deps): bump the patch-updates group across 1 directory with 5 updates | [#2354]
|
||||
- chore (deps): bump docker/login-action from 3 to 4 | [#2363]
|
||||
- chore (deps): bump docker/setup-buildx-action from 3 to 4 | [#2364]
|
||||
- chore (deps): bump crazy-max/ghaction-github-pages from 3 to 5 | [#2365]
|
||||
- chore (deps): bump docker/metadata-action from 4 to 6 | [#2366]
|
||||
- chore (deps): bump docker/setup-qemu-action from 3 to 4 | [#2367]
|
||||
- Update dependabot for Node 24. [@GCHQDeveloper581] | [#2361]
|
||||
- chore (deps): bump uuid from 13.0.0 to 14.0.0 | [#2332]
|
||||
- chore (deps): bump webpack-bundle-analyzer from 5.2.0 to 5.3.0 | [#2353]
|
||||
- Fix all zeros after 16384 bytes with Blake3 [@zachbowden] [@GCHQDeveloper581] | [#2351]
|
||||
|
||||
## [11.0.0] - 2026-04-28
|
||||
- Revert sitemap to v8.0.X to fix build/deploy on master [@GCHQDeveloper581] | [#2348]
|
||||
- Node version update from 22 to 24 [@lzandman] [@GCHQDeveloper581] | [#2347]
|
||||
@ -638,6 +707,7 @@ Breaking changes:
|
||||
## [4.0.0] - 2016-11-28
|
||||
- Initial open source commit [@n1474335] | [b1d73a72](https://github.com/gchq/CyberChef/commit/b1d73a725dc7ab9fb7eb789296efd2b7e4b08306)
|
||||
|
||||
[11.1.0]: https://github.com/gchq/CyberChef/releases/tag/v11.1.0
|
||||
[11.0.0]: https://github.com/gchq/CyberChef/releases/tag/v11.0.0
|
||||
[10.24.0]: https://github.com/gchq/CyberChef/releases/tag/v10.24.0
|
||||
[10.23.0]: https://github.com/gchq/CyberChef/releases/tag/v10.23.0
|
||||
@ -655,7 +725,7 @@ Breaking changes:
|
||||
[10.11.0]: https://github.com/gchq/CyberChef/releases/tag/v10.11.0
|
||||
[10.10.0]: https://github.com/gchq/CyberChef/releases/tag/v10.10.0
|
||||
[10.9.0]: https://github.com/gchq/CyberChef/releases/tag/v10.9.0
|
||||
[10.8.0]: https://github.com/gchq/CyberChef/releases/tag/v10.7.0
|
||||
[10.8.0]: https://github.com/gchq/CyberChef/releases/tag/v10.8.0
|
||||
[10.7.0]: https://github.com/gchq/CyberChef/releases/tag/v10.7.0
|
||||
[10.6.0]: https://github.com/gchq/CyberChef/releases/tag/v10.6.0
|
||||
[10.5.0]: https://github.com/gchq/CyberChef/releases/tag/v10.5.0
|
||||
@ -923,6 +993,14 @@ Breaking changes:
|
||||
[@hsolberg]: https://github.com/hsolberg
|
||||
[@lzandman]: https://github.com/lzandman
|
||||
[@engin0223]: https://github.com/engin0223
|
||||
[@Fufu-btw]: https://github.com/Fufu-btw
|
||||
[@jl5193]: https://github.com/jl5193
|
||||
[@andreasrtv]: https://github.com/andreasrtv
|
||||
[@HarelKatz]: https://github.com/HarelKatz
|
||||
[@SyedIshmumAhnaf]: https://github.com/SyedIshmumAhnaf
|
||||
[@Louis-Ladd]: https://github.com/Louis-Ladd
|
||||
[@Blank0120]: https://github.com/Blank0120
|
||||
[@zachbowden]: https://github.com/zachbowden
|
||||
|
||||
|
||||
[8ad18b]: https://github.com/gchq/CyberChef/commit/8ad18bc7db6d9ff184ba3518686293a7685bf7b7
|
||||
@ -1220,4 +1298,70 @@ Breaking changes:
|
||||
[#2273]: https://github.com/gchq/CyberChef/pull/2273
|
||||
[#2342]: https://github.com/gchq/CyberChef/pull/2342
|
||||
[#1922]: https://github.com/gchq/CyberChef/pull/1922
|
||||
[#2557]: https://github.com/gchq/CyberChef/pull/2557
|
||||
[#2552]: https://github.com/gchq/CyberChef/pull/2552
|
||||
[#2551]: https://github.com/gchq/CyberChef/pull/2551
|
||||
[#2550]: https://github.com/gchq/CyberChef/pull/2550
|
||||
[#2553]: https://github.com/gchq/CyberChef/pull/2553
|
||||
[#2547]: https://github.com/gchq/CyberChef/pull/2547
|
||||
[#2545]: https://github.com/gchq/CyberChef/pull/2545
|
||||
[#2543]: https://github.com/gchq/CyberChef/pull/2543
|
||||
[#2539]: https://github.com/gchq/CyberChef/pull/2539
|
||||
[#1431]: https://github.com/gchq/CyberChef/pull/1431
|
||||
[#2527]: https://github.com/gchq/CyberChef/pull/2527
|
||||
[#2502]: https://github.com/gchq/CyberChef/pull/2502
|
||||
[#2391]: https://github.com/gchq/CyberChef/pull/2391
|
||||
[#2471]: https://github.com/gchq/CyberChef/pull/2471
|
||||
[#2497]: https://github.com/gchq/CyberChef/pull/2497
|
||||
[#2500]: https://github.com/gchq/CyberChef/pull/2500
|
||||
[#2499]: https://github.com/gchq/CyberChef/pull/2499
|
||||
[#2498]: https://github.com/gchq/CyberChef/pull/2498
|
||||
[#2143]: https://github.com/gchq/CyberChef/pull/2143
|
||||
[#2341]: https://github.com/gchq/CyberChef/pull/2341
|
||||
[#2478]: https://github.com/gchq/CyberChef/pull/2478
|
||||
[#2479]: https://github.com/gchq/CyberChef/pull/2479
|
||||
[#2463]: https://github.com/gchq/CyberChef/pull/2463
|
||||
[#2468]: https://github.com/gchq/CyberChef/pull/2468
|
||||
[#2385]: https://github.com/gchq/CyberChef/pull/2385
|
||||
[#2467]: https://github.com/gchq/CyberChef/pull/2467
|
||||
[#2443]: https://github.com/gchq/CyberChef/pull/2443
|
||||
[#2417]: https://github.com/gchq/CyberChef/pull/2417
|
||||
[#2461]: https://github.com/gchq/CyberChef/pull/2461
|
||||
[#2438]: https://github.com/gchq/CyberChef/pull/2438
|
||||
[#2439]: https://github.com/gchq/CyberChef/pull/2439
|
||||
[#2441]: https://github.com/gchq/CyberChef/pull/2441
|
||||
[#2442]: https://github.com/gchq/CyberChef/pull/2442
|
||||
[#2425]: https://github.com/gchq/CyberChef/pull/2425
|
||||
[#2428]: https://github.com/gchq/CyberChef/pull/2428
|
||||
[#2429]: https://github.com/gchq/CyberChef/pull/2429
|
||||
[#2430]: https://github.com/gchq/CyberChef/pull/2430
|
||||
[#2431]: https://github.com/gchq/CyberChef/pull/2431
|
||||
[#2412]: https://github.com/gchq/CyberChef/pull/2412
|
||||
[#2339]: https://github.com/gchq/CyberChef/pull/2339
|
||||
[#2389]: https://github.com/gchq/CyberChef/pull/2389
|
||||
[#2403]: https://github.com/gchq/CyberChef/pull/2403
|
||||
[#2402]: https://github.com/gchq/CyberChef/pull/2402
|
||||
[#2401]: https://github.com/gchq/CyberChef/pull/2401
|
||||
[#2387]: https://github.com/gchq/CyberChef/pull/2387
|
||||
[#2384]: https://github.com/gchq/CyberChef/pull/2384
|
||||
[#2386]: https://github.com/gchq/CyberChef/pull/2386
|
||||
[#2388]: https://github.com/gchq/CyberChef/pull/2388
|
||||
[#2378]: https://github.com/gchq/CyberChef/pull/2378
|
||||
[#2379]: https://github.com/gchq/CyberChef/pull/2379
|
||||
[#2372]: https://github.com/gchq/CyberChef/pull/2372
|
||||
[#2368]: https://github.com/gchq/CyberChef/pull/2368
|
||||
[#2370]: https://github.com/gchq/CyberChef/pull/2370
|
||||
[#2371]: https://github.com/gchq/CyberChef/pull/2371
|
||||
[#2369]: https://github.com/gchq/CyberChef/pull/2369
|
||||
[#1882]: https://github.com/gchq/CyberChef/pull/1882
|
||||
[#2354]: https://github.com/gchq/CyberChef/pull/2354
|
||||
[#2363]: https://github.com/gchq/CyberChef/pull/2363
|
||||
[#2364]: https://github.com/gchq/CyberChef/pull/2364
|
||||
[#2365]: https://github.com/gchq/CyberChef/pull/2365
|
||||
[#2366]: https://github.com/gchq/CyberChef/pull/2366
|
||||
[#2367]: https://github.com/gchq/CyberChef/pull/2367
|
||||
[#2361]: https://github.com/gchq/CyberChef/pull/2361
|
||||
[#2332]: https://github.com/gchq/CyberChef/pull/2332
|
||||
[#2353]: https://github.com/gchq/CyberChef/pull/2353
|
||||
[#2351]: https://github.com/gchq/CyberChef/pull/2351
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
# Modifier --platform=$BUILDPLATFORM limits the platform to "BUILDPLATFORM" during buildx multi-platform builds
|
||||
# This is because npm "chromedriver" package is not compatiable with all platforms
|
||||
# For more info see: https://docs.docker.com/build/building/multi-platform/#cross-compilation
|
||||
FROM --platform=$BUILDPLATFORM node:24-alpine AS builder
|
||||
FROM --platform=$BUILDPLATFORM node:24-alpine@sha256:fb71d01345f11b708a3553c66e7c74074f2d506400ea81973343d915cb64eef0 AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
@ -27,7 +27,7 @@ RUN npm run build
|
||||
#########################################
|
||||
# Package static build files into nginx #
|
||||
#########################################
|
||||
FROM nginxinc/nginx-unprivileged:stable-alpine AS cyberchef
|
||||
FROM nginxinc/nginx-unprivileged:stable-alpine@sha256:37f356a5eba5d187365b4f59cd6cc29f1f922ad18146d554b576a80983377e6a AS cyberchef
|
||||
|
||||
LABEL maintainer="GCHQ <oss@gchq.gov.uk>"
|
||||
|
||||
|
||||
15
Gruntfile.js
15
Gruntfile.js
@ -89,6 +89,8 @@ module.exports = function (grunt) {
|
||||
const compileYear = grunt.template.today("UTC:yyyy"),
|
||||
compileTime = grunt.template.today("UTC:dd/mm/yyyy HH:MM:ss") + " UTC",
|
||||
pkg = grunt.file.readJSON("package.json"),
|
||||
version = process.env.GITHUB_SHA || `v${pkg.version}`,
|
||||
downloadZipFilename = `CyberChef_${version}.zip`,
|
||||
webpackConfig = require("./webpack.config.js"),
|
||||
BUILD_CONSTANTS = {
|
||||
COMPILE_YEAR: JSON.stringify(compileYear),
|
||||
@ -129,7 +131,9 @@ module.exports = function (grunt) {
|
||||
chunks: ["main"],
|
||||
compileYear: compileYear,
|
||||
compileTime: compileTime,
|
||||
version: pkg.version,
|
||||
version: version,
|
||||
latestReleaseVersion: pkg.version,
|
||||
downloadZipFilename: downloadZipFilename,
|
||||
minify: {
|
||||
removeComments: true,
|
||||
collapseWhitespace: true,
|
||||
@ -140,7 +144,8 @@ module.exports = function (grunt) {
|
||||
new BundleAnalyzerPlugin({
|
||||
analyzerMode: "static",
|
||||
reportFilename: "BundleAnalyzerReport.html",
|
||||
openAnalyzer: false
|
||||
openAnalyzer: false,
|
||||
excludeAssets: /.*Worker.js/
|
||||
}),
|
||||
]
|
||||
};
|
||||
@ -245,7 +250,7 @@ module.exports = function (grunt) {
|
||||
"!build/prod/index.html",
|
||||
"!build/prod/BundleAnalyzerReport.html",
|
||||
],
|
||||
dest: `build/prod/CyberChef_v${pkg.version}.zip`
|
||||
dest: `build/prod/${downloadZipFilename}`
|
||||
}
|
||||
},
|
||||
connect: {
|
||||
@ -333,12 +338,12 @@ module.exports = function (grunt) {
|
||||
switch (process.platform) {
|
||||
case "darwin":
|
||||
return chainCommands([
|
||||
`shasum -a 256 build/prod/CyberChef_v${pkg.version}.zip | awk '{print $1;}' > build/prod/sha256digest.txt`,
|
||||
`shasum -a 256 build/prod/${downloadZipFilename} | awk '{print $1;}' > build/prod/sha256digest.txt`,
|
||||
`sed -i '' -e "s/DOWNLOAD_HASH_PLACEHOLDER/$(cat build/prod/sha256digest.txt)/" build/prod/index.html`
|
||||
]);
|
||||
default:
|
||||
return chainCommands([
|
||||
`sha256sum build/prod/CyberChef_v${pkg.version}.zip | awk '{print $1;}' > build/prod/sha256digest.txt`,
|
||||
`sha256sum build/prod/${downloadZipFilename} | awk '{print $1;}' > build/prod/sha256digest.txt`,
|
||||
`sed -i -e "s/DOWNLOAD_HASH_PLACEHOLDER/$(cat build/prod/sha256digest.txt)/" build/prod/index.html`
|
||||
]);
|
||||
}
|
||||
|
||||
@ -72,6 +72,7 @@ You can use as many operations as you like in simple or complex ways. Some examp
|
||||
- [Carry out different operations on data of different types][8]
|
||||
- [Use parts of the input as arguments to operations][9]
|
||||
- [Perform AES decryption, extracting the IV from the beginning of the cipher stream][10]
|
||||
- [A simpler way to perform the same AES Decryption][13]
|
||||
- [Automagically detect several layers of nested encoding][12]
|
||||
|
||||
|
||||
@ -147,6 +148,7 @@ CyberChef is released under the [Apache 2.0 Licence](https://www.apache.org/lice
|
||||
[7]: https://gchq.github.io/CyberChef/#recipe=Fork('%5C%5Cn','%5C%5Cn',false)From_UNIX_Timestamp('Seconds%20(s)')&input=OTc4MzQ2ODAwCjEwMTI2NTEyMDAKMTA0NjY5NjQwMAoxMDgxMDg3MjAwCjExMTUzMDUyMDAKMTE0OTYwOTYwMA
|
||||
[8]: https://gchq.github.io/CyberChef/#recipe=Fork('%5C%5Cn','%5C%5Cn',false)Conditional_Jump('1',false,'base64',10)To_Hex('Space')Return()Label('base64')To_Base64('A-Za-z0-9%2B/%3D')&input=U29tZSBkYXRhIHdpdGggYSAxIGluIGl0ClNvbWUgZGF0YSB3aXRoIGEgMiBpbiBpdA
|
||||
[9]: https://gchq.github.io/CyberChef/#recipe=Register('key%3D(%5B%5C%5Cda-f%5D*)',true,false)Find_/_Replace(%7B'option':'Regex','string':'.*data%3D(.*)'%7D,'$1',true,false,true)RC4(%7B'option':'Hex','string':'$R0'%7D,'Hex','Latin1')&input=aHR0cDovL21hbHdhcmV6LmJpei9iZWFjb24ucGhwP2tleT0wZTkzMmE1YyZkYXRhPThkYjdkNWViZTM4NjYzYTU0ZWNiYjMzNGUzZGIxMQ
|
||||
[10]: https://gchq.github.io/CyberChef/#recipe=Register('(.%7B32%7D)',true,false)Drop_bytes(0,32,false)AES_Decrypt(%7B'option':'Hex','string':'1748e7179bd56570d51fa4ba287cc3e5'%7D,%7B'option':'Hex','string':'$R0'%7D,'CTR','Hex','Raw',%7B'option':'Hex','string':''%7D)&input=NTFlMjAxZDQ2MzY5OGVmNWY3MTdmNzFmNWI0NzEyYWYyMGJlNjc0YjNiZmY1M2QzODU0NjM5NmVlNjFkYWFjNDkwOGUzMTljYTNmY2Y3MDg5YmZiNmIzOGVhOTllNzgxZDI2ZTU3N2JhOWRkNmYzMTFhMzk0MjBiODk3OGU5MzAxNGIwNDJkNDQ3MjZjYWVkZjU0MzZlYWY2NTI0MjljMGRmOTRiNTIxNjc2YzdjMmNlODEyMDk3YzI3NzI3M2M3YzcyY2Q4OWFlYzhkOWZiNGEyNzU4NmNjZjZhYTBhZWUyMjRjMzRiYTNiZmRmN2FlYjFkZGQ0Nzc2MjJiOTFlNzJjOWU3MDlhYjYwZjhkYWY3MzFlYzBjYzg1Y2UwZjc0NmZmMTU1NGE1YTNlYzI5MWNhNDBmOWU2MjlhODcyNTkyZDk4OGZkZDgzNDUzNGFiYTc5YzFhZDE2NzY3NjlhN2MwMTBiZjA0NzM5ZWNkYjY1ZDk1MzAyMzcxZDYyOWQ5ZTM3ZTdiNGEzNjFkYTQ2OGYxZWQ1MzU4OTIyZDJlYTc1MmRkMTFjMzY2ZjMwMTdiMTRhYTAxMWQyYWYwM2M0NGY5NTU3OTA5OGExNWUzY2Y5YjQ0ODZmOGZmZTljMjM5ZjM0ZGU3MTUxZjZjYTY1MDBmZTRiODUwYzNmMWMwMmU4MDFjYWYzYTI0NDY0NjE0ZTQyODAxNjE1YjhmZmFhMDdhYzgyNTE0OTNmZmRhN2RlNWRkZjMzNjg4ODBjMmI5NWIwMzBmNDFmOGYxNTA2NmFkZDA3MWE2NmNmNjBlNWY0NmYzYTIzMGQzOTdiNjUyOTYzYTIxYTUzZg
|
||||
[10]: https://gchq.github.io/CyberChef/#recipe=Register('(.%7B32%7D)',true,false,false)Drop_bytes(0,32,false)AES_Decrypt(%7B'option':'Hex','string':'1748e7179bd56570d51fa4ba287cc3e5'%7D,%7B'option':'Hex','string':'$R0'%7D,16,'CTR','Hex','Raw',%7B'option':'Hex','string':''%7D,%7B'option':'Hex','string':''%7D,'Off')&input=NTFlMjAxZDQ2MzY5OGVmNWY3MTdmNzFmNWI0NzEyYWYyMGJlNjc0YjNiZmY1M2QzODU0NjM5NmVlNjFkYWFjNDkwOGUzMTljYTNmY2Y3MDg5YmZiNmIzOGVhOTllNzgxZDI2ZTU3N2JhOWRkNmYzMTFhMzk0MjBiODk3OGU5MzAxNGIwNDJkNDQ3MjZjYWVkZjU0MzZlYWY2NTI0MjljMGRmOTRiNTIxNjc2YzdjMmNlODEyMDk3YzI3NzI3M2M3YzcyY2Q4OWFlYzhkOWZiNGEyNzU4NmNjZjZhYTBhZWUyMjRjMzRiYTNiZmRmN2FlYjFkZGQ0Nzc2MjJiOTFlNzJjOWU3MDlhYjYwZjhkYWY3MzFlYzBjYzg1Y2UwZjc0NmZmMTU1NGE1YTNlYzI5MWNhNDBmOWU2MjlhODcyNTkyZDk4OGZkZDgzNDUzNGFiYTc5YzFhZDE2NzY3NjlhN2MwMTBiZjA0NzM5ZWNkYjY1ZDk1MzAyMzcxZDYyOWQ5ZTM3ZTdiNGEzNjFkYTQ2OGYxZWQ1MzU4OTIyZDJlYTc1MmRkMTFjMzY2ZjMwMTdiMTRhYTAxMWQyYWYwM2M0NGY5NTU3OTA5OGExNWUzY2Y5YjQ0ODZmOGZmZTljMjM5ZjM0ZGU3MTUxZjZjYTY1MDBmZTRiODUwYzNmMWMwMmU4MDFjYWYzYTI0NDY0NjE0ZTQyODAxNjE1YjhmZmFhMDdhYzgyNTE0OTNmZmRhN2RlNWRkZjMzNjg4ODBjMmI5NWIwMzBmNDFmOGYxNTA2NmFkZDA3MWE2NmNmNjBlNWY0NmYzYTIzMGQzOTdiNjUyOTYzYTIxYTUzZg
|
||||
[11]: https://gchq.github.io/CyberChef/#recipe=XOR(%7B'option':'Hex','string':'3a'%7D,'Standard',false)To_Hexdump(16,false,false)&input=VGhlIGFuc3dlciB0byB0aGUgdWx0aW1hdGUgcXVlc3Rpb24gb2YgbGlmZSwgdGhlIFVuaXZlcnNlLCBhbmQgZXZlcnl0aGluZyBpcyA0Mi4
|
||||
[12]: https://gchq.github.io/CyberChef/#recipe=Magic(3,false,false)&input=V1VhZ3dzaWFlNm1QOGdOdENDTFVGcENwQ0IyNlJtQkRvREQ4UGFjZEFtekF6QlZqa0syUXN0RlhhS2hwQzZpVVM3UkhxWHJKdEZpc29SU2dvSjR3aGptMWFybTg2NHFhTnE0UmNmVW1MSHJjc0FhWmM1VFhDWWlmTmRnUzgzZ0RlZWpHWDQ2Z2FpTXl1QlY2RXNrSHQxc2NnSjg4eDJ0TlNvdFFEd2JHWTFtbUNvYjJBUkdGdkNLWU5xaU45aXBNcTFaVTFtZ2tkYk51R2NiNzZhUnRZV2hDR1VjOGc5M1VKdWRoYjhodHNoZVpud1RwZ3FoeDgzU1ZKU1pYTVhVakpUMnptcEM3dVhXdHVtcW9rYmRTaTg4WXRrV0RBYzFUb291aDJvSDRENGRkbU5LSldVRHBNd21uZ1VtSzE0eHdtb21jY1BRRTloTTE3MkFQblNxd3hkS1ExNzJSa2NBc3lzbm1qNWdHdFJtVk5OaDJzMzU5d3I2bVMyUVJQ
|
||||
[13]: https://gchq.github.io/CyberChef/#recipe=AES_Decrypt(%7B'option':'Hex','string':'1748e7179bd56570d51fa4ba287cc3e5'%7D,%7B'option':'Hex','string':'$R0'%7D,16,'CTR','Hex','Raw',%7B'option':'Hex','string':''%7D,%7B'option':'Hex','string':''%7D,'From%20start')&input=NTFlMjAxZDQ2MzY5OGVmNWY3MTdmNzFmNWI0NzEyYWYyMGJlNjc0YjNiZmY1M2QzODU0NjM5NmVlNjFkYWFjNDkwOGUzMTljYTNmY2Y3MDg5YmZiNmIzOGVhOTllNzgxZDI2ZTU3N2JhOWRkNmYzMTFhMzk0MjBiODk3OGU5MzAxNGIwNDJkNDQ3MjZjYWVkZjU0MzZlYWY2NTI0MjljMGRmOTRiNTIxNjc2YzdjMmNlODEyMDk3YzI3NzI3M2M3YzcyY2Q4OWFlYzhkOWZiNGEyNzU4NmNjZjZhYTBhZWUyMjRjMzRiYTNiZmRmN2FlYjFkZGQ0Nzc2MjJiOTFlNzJjOWU3MDlhYjYwZjhkYWY3MzFlYzBjYzg1Y2UwZjc0NmZmMTU1NGE1YTNlYzI5MWNhNDBmOWU2MjlhODcyNTkyZDk4OGZkZDgzNDUzNGFiYTc5YzFhZDE2NzY3NjlhN2MwMTBiZjA0NzM5ZWNkYjY1ZDk1MzAyMzcxZDYyOWQ5ZTM3ZTdiNGEzNjFkYTQ2OGYxZWQ1MzU4OTIyZDJlYTc1MmRkMTFjMzY2ZjMwMTdiMTRhYTAxMWQyYWYwM2M0NGY5NTU3OTA5OGExNWUzY2Y5YjQ0ODZmOGZmZTljMjM5ZjM0ZGU3MTUxZjZjYTY1MDBmZTRiODUwYzNmMWMwMmU4MDFjYWYzYTI0NDY0NjE0ZTQyODAxNjE1YjhmZmFhMDdhYzgyNTE0OTNmZmRhN2RlNWRkZjMzNjg4ODBjMmI5NWIwMzBmNDFmOGYxNTA2NmFkZDA3MWE2NmNmNjBlNWY0NmYzYTIzMGQzOTdiNjUyOTYzYTIxYTUzZg
|
||||
|
||||
26
SECURITY.md
26
SECURITY.md
@ -2,25 +2,15 @@
|
||||
|
||||
## Supported Versions
|
||||
|
||||
CyberChef is supported on a best endeavours basis. Patches will be applied to
|
||||
the latest version rather than retroactively to older versions. To ensure you
|
||||
are using the most secure version of CyberChef, please make sure you have the
|
||||
[latest release](https://github.com/gchq/CyberChef/releases/latest). The
|
||||
official [live demo](https://gchq.github.io/CyberChef/) is always up to date.
|
||||
CyberChef is supported on a best endeavours basis.
|
||||
Patches will be applied to the latest version rather than retroactively to older versions.
|
||||
To ensure you are using the most secure version of CyberChef, please make sure you have the [latest release](https://github.com/gchq/CyberChef/releases/latest). [The official website](https://gchq.github.io/CyberChef/) is always up to date.
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
In most scenarios, the most appropriate way to report a vulnerability is to
|
||||
[raise a new issue](https://github.com/gchq/CyberChef/issues/new/choose)
|
||||
describing the problem in as much detail as possible, ideally with examples.
|
||||
This will obviously be public. If you feel that the vulnerability is
|
||||
significant enough to warrant a private disclosure, please email
|
||||
[oss@gchq.gov.uk](mailto:oss@gchq.gov.uk) and
|
||||
[n1474335@gmail.com](mailto:n1474335@gmail.com).
|
||||
If you discover a vulnerability in CyberChef, please do not publicly disclose it, and do not create a GitHub issue.
|
||||
|
||||
Disclosures of vulnerabilities in CyberChef are always welcomed. Whilst we aim
|
||||
to write clean and secure code free from bugs, we recognise that this is an open
|
||||
source project written by analysts in their spare time, relying on dozens of
|
||||
open source libraries that are modified and updated on a regular basis. We hope
|
||||
that the community will continue to support us as we endeavour to maintain and
|
||||
develop this tool together.
|
||||
Instead, send an email as soon as possible to [CyberChefSecurity@gchq.gov.uk](mailto:CyberChefSecurity@gchq.gov.uk).
|
||||
The report will be acknowledged and actioned urgently by the CyberChef maintainers.
|
||||
|
||||
If you do not receive a timely acknowledgement, please notify [oss@gchq.gov.uk](mailto:oss@gchq.gov.uk) and [CyberChef@gchq.gov.uk](mailto:CyberChef@gchq.gov.uk) of your vulnerability report.
|
||||
|
||||
2488
package-lock.json
generated
2488
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
59
package.json
59
package.json
@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "cyberchef",
|
||||
"version": "11.0.0",
|
||||
"version": "11.1.0",
|
||||
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
|
||||
"author": "n1474335 <n1474335@gmail.com>",
|
||||
"author": "GCHQ <CyberChef@gchq.gov.uk>",
|
||||
"homepage": "https://gchq.github.io/CyberChef",
|
||||
"copyright": "Crown copyright 2016",
|
||||
"license": "Apache-2.0",
|
||||
@ -39,30 +39,31 @@
|
||||
"node >= 24"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@babel/eslint-parser": "^7.28.6",
|
||||
"@babel/eslint-parser": "^7.29.7",
|
||||
"@babel/plugin-syntax-import-assertions": "^7.28.6",
|
||||
"@babel/plugin-transform-runtime": "^7.29.0",
|
||||
"@babel/preset-env": "^7.29.5",
|
||||
"@babel/runtime": "^7.29.2",
|
||||
"@babel/plugin-transform-runtime": "^7.29.7",
|
||||
"@babel/preset-env": "^7.29.7",
|
||||
"@babel/runtime": "^7.29.7",
|
||||
"@codemirror/commands": "^6.10.3",
|
||||
"@codemirror/language": "^6.12.3",
|
||||
"@codemirror/search": "^6.7.0",
|
||||
"@codemirror/state": "^6.5.4",
|
||||
"@codemirror/view": "^6.41.1",
|
||||
"@codemirror/view": "^6.43.1",
|
||||
"@puppeteer/browsers": "3.0.4",
|
||||
"autoprefixer": "^10.5.0",
|
||||
"babel-loader": "^10.1.1",
|
||||
"base64-loader": "^1.0.0",
|
||||
"chromedriver": "^146.0.6",
|
||||
"chromedriver": "^148.0.4",
|
||||
"cli-progress": "^3.12.0",
|
||||
"colors": "^1.4.0",
|
||||
"compression-webpack-plugin": "^12.0.0",
|
||||
"copy-webpack-plugin": "^14.0.0",
|
||||
"core-js": "^3.49.0",
|
||||
"cspell": "^9.7.0",
|
||||
"cspell": "^10.0.1",
|
||||
"css-loader": "^7.1.4",
|
||||
"eslint": "^9.39.4",
|
||||
"eslint-plugin-jsdoc": "^50.8.0",
|
||||
"globals": "^17.4.0",
|
||||
"globals": "^17.6.0",
|
||||
"grunt": "^1.6.2",
|
||||
"grunt-chmod": "~1.1.1",
|
||||
"grunt-concurrent": "^3.0.0",
|
||||
@ -70,25 +71,25 @@
|
||||
"grunt-contrib-connect": "^5.0.1",
|
||||
"grunt-contrib-copy": "~1.0.0",
|
||||
"grunt-contrib-watch": "^1.1.0",
|
||||
"grunt-eslint": "^25.0.0",
|
||||
"grunt-eslint": "^26.0.0",
|
||||
"grunt-exec": "~3.0.0",
|
||||
"grunt-webpack": "^6.0.0",
|
||||
"grunt-webpack": "^8.0.0",
|
||||
"grunt-zip": "^1.0.0",
|
||||
"html-webpack-plugin": "^5.6.7",
|
||||
"imports-loader": "^5.0.0",
|
||||
"mini-css-extract-plugin": "2.10.2",
|
||||
"modify-source-webpack-plugin": "^4.1.0",
|
||||
"nightwatch": "^3.15.0",
|
||||
"postcss": "^8.5.14",
|
||||
"nightwatch": "^3.16.0",
|
||||
"postcss": "^8.5.15",
|
||||
"postcss-css-variables": "^0.19.0",
|
||||
"postcss-import": "^16.1.1",
|
||||
"postcss-loader": "^8.2.1",
|
||||
"prompt": "^1.3.0",
|
||||
"sitemap": "^8.0.3",
|
||||
"terser": "^5.46.2",
|
||||
"webpack": "^5.106.2",
|
||||
"sitemap": "^9.0.1",
|
||||
"terser": "^5.48.0",
|
||||
"webpack": "^5.107.2",
|
||||
"webpack-bundle-analyzer": "^5.3.0",
|
||||
"webpack-dev-server": "^5.0.4",
|
||||
"webpack-dev-server": "^5.2.4",
|
||||
"webpack-node-externals": "^3.0.0",
|
||||
"worker-loader": "^3.0.8"
|
||||
},
|
||||
@ -104,15 +105,15 @@
|
||||
"assert": "^2.1.0",
|
||||
"avsc": "^5.7.9",
|
||||
"bcryptjs": "^3.0.3",
|
||||
"bignumber.js": "^9.3.1",
|
||||
"bignumber.js": "^11.1.3",
|
||||
"blakejs": "^1.2.1",
|
||||
"bootstrap": "4.6.2",
|
||||
"bootstrap-colorpicker": "^3.4.0",
|
||||
"bootstrap-material-design": "^4.1.3",
|
||||
"browserify-zlib": "^0.2.0",
|
||||
"bson": "^4.7.2",
|
||||
"bson": "^7.2.0",
|
||||
"buffer": "^6.0.3",
|
||||
"cbor": "9.0.2",
|
||||
"cbor": "10.0.12",
|
||||
"chi-squared": "^1.1.0",
|
||||
"codepage": "^1.15.0",
|
||||
"crypto-api": "^0.8.5",
|
||||
@ -121,8 +122,8 @@
|
||||
"ctph.js": "0.0.5",
|
||||
"d3": "7.9.0",
|
||||
"d3-hexbin": "^0.2.2",
|
||||
"diff": "^5.2.2",
|
||||
"dompurify": "^3.4.2",
|
||||
"diff": "^9.0.0",
|
||||
"dompurify": "^3.4.8",
|
||||
"es6-promisify": "^7.0.0",
|
||||
"escodegen": "^2.1.0",
|
||||
"esprima": "^4.0.1",
|
||||
@ -141,7 +142,7 @@
|
||||
"js-sha3": "^0.9.3",
|
||||
"jsesc": "^3.1.0",
|
||||
"json5": "^2.2.3",
|
||||
"jsonata": "^2.1.0",
|
||||
"jsonata": "^2.2.1",
|
||||
"jsonpath-plus": "^10.4.0",
|
||||
"jsonwebtoken": "9.0.3",
|
||||
"jsqr": "^1.4.0",
|
||||
@ -154,7 +155,7 @@
|
||||
"loglevel-message-prefix": "^3.0.0",
|
||||
"lz-string": "^1.5.0",
|
||||
"lz4js": "^0.2.0",
|
||||
"markdown-it": "^14.1.1",
|
||||
"markdown-it": "^14.2.0",
|
||||
"moment": "^2.30.1",
|
||||
"moment-timezone": "^0.6.2",
|
||||
"ngeohash": "^0.6.3",
|
||||
@ -168,7 +169,7 @@
|
||||
"path": "^0.12.7",
|
||||
"popper.js": "^1.16.1",
|
||||
"process": "^0.11.10",
|
||||
"protobufjs": "^7.5.6",
|
||||
"protobufjs": "^8.6.2",
|
||||
"punycode.js": "^2.3.1",
|
||||
"qr-image": "^3.2.0",
|
||||
"reflect-metadata": "^0.2.2",
|
||||
@ -177,11 +178,11 @@
|
||||
"snackbarjs": "^1.1.0",
|
||||
"sortablejs": "^1.15.7",
|
||||
"split.js": "^1.6.5",
|
||||
"sql-formatter": "^15.7.3",
|
||||
"sql-formatter": "^15.8.1",
|
||||
"ssdeep.js": "0.0.3",
|
||||
"stream-browserify": "^3.0.0",
|
||||
"tesseract.js": "^6.0.1",
|
||||
"ua-parser-js": "^1.0.41",
|
||||
"tesseract.js": "^7.0.0",
|
||||
"ua-parser-js": "^2.0.10",
|
||||
"unorm": "^1.6.0",
|
||||
"url": "^0.11.4",
|
||||
"utf8": "^3.0.0",
|
||||
|
||||
@ -138,6 +138,8 @@ class Chef {
|
||||
|
||||
if (!highlights) return false;
|
||||
|
||||
if (direction === "reverse") highlights.reverse();
|
||||
|
||||
for (let i = 0; i < highlights.length; i++) {
|
||||
// Remove multiple highlights before processing again
|
||||
pos = [pos[0]];
|
||||
|
||||
@ -49,6 +49,7 @@
|
||||
"Escape Unicode Characters",
|
||||
"Unescape Unicode Characters",
|
||||
"Normalise Unicode",
|
||||
"Escape Smart Characters",
|
||||
"To Quoted Printable",
|
||||
"From Quoted Printable",
|
||||
"To Punycode",
|
||||
@ -118,6 +119,7 @@
|
||||
"GOST Verify",
|
||||
"GOST Key Wrap",
|
||||
"GOST Key Unwrap",
|
||||
"ROR13",
|
||||
"ROT13",
|
||||
"ROT13 Brute Force",
|
||||
"ROT47",
|
||||
@ -188,6 +190,7 @@
|
||||
"Generate PGP Key Pair",
|
||||
"PGP Encrypt",
|
||||
"PGP Decrypt",
|
||||
"PGP Sign",
|
||||
"PGP Verify",
|
||||
"PGP Encrypt and Sign",
|
||||
"PGP Decrypt and Verify",
|
||||
@ -238,6 +241,7 @@
|
||||
"Bit shift right",
|
||||
"Rotate left",
|
||||
"Rotate right",
|
||||
"ROR13",
|
||||
"ROT13",
|
||||
"ROT8000"
|
||||
]
|
||||
@ -303,6 +307,7 @@
|
||||
"Diff",
|
||||
"Remove whitespace",
|
||||
"Remove null bytes",
|
||||
"Remove ANSI Escape Codes",
|
||||
"To Upper case",
|
||||
"To Lower case",
|
||||
"Swap case",
|
||||
|
||||
@ -58,3 +58,66 @@ fs.writeFileSync(
|
||||
code
|
||||
);
|
||||
console.log("Written operation index.");
|
||||
|
||||
// find all test files
|
||||
const testsDir = path.join(process.cwd() + "/tests/operations/tests/");
|
||||
const testObjs = [];
|
||||
fs.readdirSync(testsDir).forEach(file => {
|
||||
if (!file.endsWith(".mjs")) return;
|
||||
testObjs.push(file.split(".mjs")[0]);
|
||||
});
|
||||
|
||||
// Construct test index file
|
||||
code = `/**
|
||||
* THIS FILE IS AUTOMATICALLY GENERATED BY src/core/config/scripts/generateOpsIndex.mjs
|
||||
*
|
||||
* @author john [john19696@protonmail.com]
|
||||
* @author tlwr [toby@toby.codes]
|
||||
* @author n1474335 [n1474335@gmail.com]
|
||||
* @copyright Crown Copyright ${new Date().getUTCFullYear()}
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import {
|
||||
setLongTestFailure,
|
||||
logTestReport,
|
||||
} from "../lib/utils.mjs";
|
||||
|
||||
import "../lib/wasmFetchPolyfill.mjs";
|
||||
|
||||
import TestRegister from "../lib/TestRegister.mjs";
|
||||
`;
|
||||
|
||||
testObjs.forEach(obj => {
|
||||
if (obj !== "SplitColourChannels")
|
||||
code += `import "./tests/${obj}.mjs";\n`;
|
||||
else
|
||||
code += `// Cannot test operations that use the File type yet
|
||||
// import "./tests/SplitColourChannels.mjs";\n`;
|
||||
});
|
||||
|
||||
code += `
|
||||
|
||||
const testStatus = {
|
||||
allTestsPassing: true,
|
||||
counts: {
|
||||
total: 0,
|
||||
}
|
||||
};
|
||||
|
||||
setLongTestFailure();
|
||||
|
||||
const logOpsTestReport = logTestReport.bind(null, testStatus);
|
||||
|
||||
(async function() {
|
||||
const results = await TestRegister.runTests();
|
||||
logOpsTestReport(results);
|
||||
})();
|
||||
`;
|
||||
|
||||
// Write tests file
|
||||
fs.writeFileSync(
|
||||
path.join(testsDir, "../index.mjs"),
|
||||
code
|
||||
);
|
||||
console.log("Written operation tests index.");
|
||||
|
||||
@ -23,7 +23,7 @@ if (!fs.existsSync(dir)) {
|
||||
console.log("Example> node --experimental-modules src/core/config/scripts/newOperation.mjs");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const testDir = path.join(process.cwd() + "/tests/operations/tests/");
|
||||
const ioTypes = ["string", "byteArray", "number", "html", "ArrayBuffer", "BigNumber", "JSON", "File", "List<File>"];
|
||||
|
||||
const schema = {
|
||||
@ -123,6 +123,30 @@ prompt.get(schema, (err, result) => {
|
||||
return txt.charAt(0).toUpperCase() + txt.substr(1);
|
||||
}).replace(/[\s-()./]/g, "");
|
||||
|
||||
const testTemplate = `/**
|
||||
* ${moduleName} tests
|
||||
*
|
||||
* @author ${result.authorName} [${result.authorEmail}]
|
||||
* @copyright Crown Copyright ${(new Date()).getFullYear()}
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "${result.opName}: test",
|
||||
input: "Example input",
|
||||
expectedOutput: "Expected output",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "${result.opName}",
|
||||
args: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
`;
|
||||
|
||||
const template = `/**
|
||||
* @author ${result.authorName} [${result.authorEmail}]
|
||||
@ -218,13 +242,16 @@ export default ${moduleName};
|
||||
}
|
||||
fs.writeFileSync(filename, template);
|
||||
|
||||
const testFilename = path.join(testDir, `./${moduleName}.mjs`);
|
||||
fs.writeFileSync(testFilename, testTemplate);
|
||||
|
||||
console.log(`\nOperation template written to ${colors.green(filename)}`);
|
||||
console.log(`\nOperation test template written to ${colors.green(testFilename)}`);
|
||||
console.log(`\nNext steps:
|
||||
1. Add your operation to ${colors.green("src/core/config/Categories.json")}
|
||||
2. Write your operation code.
|
||||
3. Write tests in ${colors.green("tests/operations/tests/")}
|
||||
2. Write your operation code in ${colors.green(filename)}
|
||||
3. Write your operation test code in ${colors.green(testFilename)}
|
||||
4. Run ${colors.cyan("npm run lint")} and ${colors.cyan("npm run test")}
|
||||
5. Submit a Pull Request to get your operation added to the official CyberChef repository.`);
|
||||
|
||||
});
|
||||
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
class DishType {
|
||||
|
||||
/**
|
||||
* Warn translations dont work without value from bind
|
||||
* Warn translations don't work without value from bind
|
||||
*/
|
||||
static checkForValue(value) {
|
||||
if (value === undefined) {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Custom error type for handling operation that isnt included in node.js API
|
||||
* Custom error type for handling operation that isn't included in node.js API
|
||||
*
|
||||
* @author d98762625 [d98762625@gmail.com]
|
||||
* @copyright Crown Copyright 2018
|
||||
|
||||
@ -39,41 +39,46 @@ class AESDecrypt extends Operation {
|
||||
"value": "",
|
||||
"toggleValues": ["Hex", "UTF8", "Latin1", "Base64"]
|
||||
},
|
||||
{
|
||||
"name": "IV Length",
|
||||
"type": "number",
|
||||
"value": 16
|
||||
},
|
||||
{
|
||||
"name": "Mode",
|
||||
"type": "argSelector",
|
||||
"value": [
|
||||
{
|
||||
name: "CBC",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "CFB",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "OFB",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "CTR",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "GCM",
|
||||
on: [5, 6]
|
||||
on: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "ECB",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "CBC/NoPadding",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
},
|
||||
{
|
||||
name: "ECB/NoPadding",
|
||||
off: [5, 6]
|
||||
off: [6, 7]
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -98,6 +103,26 @@ class AESDecrypt extends Operation {
|
||||
"type": "toggleString",
|
||||
"value": "",
|
||||
"toggleValues": ["Hex", "UTF8", "Latin1", "Base64"]
|
||||
},
|
||||
{
|
||||
"name": "IV from input",
|
||||
"type": "argSelector",
|
||||
"value": [
|
||||
{
|
||||
name: "Off",
|
||||
on: [1],
|
||||
off: [2]
|
||||
},
|
||||
{
|
||||
name: "From start",
|
||||
on: [2],
|
||||
off: [1]
|
||||
}, {
|
||||
name: "From end",
|
||||
on: [2],
|
||||
off: [1]
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
}
|
||||
@ -110,14 +135,18 @@ class AESDecrypt extends Operation {
|
||||
* @throws {OperationError} if cannot decrypt input or invalid key length
|
||||
*/
|
||||
run(input, args) {
|
||||
let iv;
|
||||
|
||||
const key = Utils.convertToByteString(args[0].string, args[0].option),
|
||||
iv = Utils.convertToByteString(args[1].string, args[1].option),
|
||||
mode = args[2].split("/")[0],
|
||||
noPadding = args[2].endsWith("NoPadding"),
|
||||
inputType = args[3],
|
||||
outputType = args[4],
|
||||
gcmTag = Utils.convertToByteString(args[5].string, args[5].option),
|
||||
aad = Utils.convertToByteString(args[6].string, args[6].option);
|
||||
ivLength = args[2],
|
||||
mode = args[3].split("/")[0],
|
||||
noPadding = args[3].endsWith("NoPadding"),
|
||||
inputType = args[4],
|
||||
outputType = args[5],
|
||||
gcmTag = Utils.convertToByteString(args[6].string, args[6].option),
|
||||
aad = Utils.convertToByteString(args[7].string, args[7].option),
|
||||
ivFromInput = args[8];
|
||||
|
||||
|
||||
if ([16, 24, 32].indexOf(key.length) < 0) {
|
||||
throw new OperationError(`Invalid key length: ${key.length} bytes
|
||||
@ -130,11 +159,27 @@ The following algorithms will be used based on the size of the key:
|
||||
|
||||
input = Utils.convertToByteString(input, inputType);
|
||||
|
||||
if (ivFromInput !== "Off") {
|
||||
if (input.length <= ivLength) {
|
||||
throw new OperationError(`Input is too short to contain an IV of ${ivLength} bytes.`);
|
||||
}
|
||||
|
||||
if (ivFromInput === "From start") {
|
||||
iv = input.substr(0, ivLength);
|
||||
input = input.substr(ivLength);
|
||||
} else {
|
||||
iv = input.substr(input.length - ivLength);
|
||||
input = input.substr(0, input.length - ivLength);
|
||||
}
|
||||
} else {
|
||||
iv = Utils.convertToByteString(args[1].string, args[1].option);
|
||||
}
|
||||
|
||||
const decipher = forge.cipher.createDecipher("AES-" + mode, key);
|
||||
|
||||
/* Allow for a "no padding" mode */
|
||||
if (noPadding) {
|
||||
decipher.mode.unpad = function(output, options) {
|
||||
decipher.mode.unpad = function (output, options) {
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
@ -8,6 +8,7 @@ import Operation from "../Operation.mjs";
|
||||
import Utils from "../Utils.mjs";
|
||||
import forge from "node-forge";
|
||||
import OperationError from "../errors/OperationError.mjs";
|
||||
import { toHexFast } from "../lib/Hex.mjs";
|
||||
|
||||
/**
|
||||
* AES Encrypt operation
|
||||
@ -92,6 +93,11 @@ class AESEncrypt extends Operation {
|
||||
"type": "toggleString",
|
||||
"value": "",
|
||||
"toggleValues": ["Hex", "UTF8", "Latin1", "Base64"]
|
||||
},
|
||||
{
|
||||
"name": "Include IV in output",
|
||||
"type": "option",
|
||||
"value": ["Off", "Prepend", "Append"]
|
||||
}
|
||||
];
|
||||
}
|
||||
@ -107,10 +113,11 @@ class AESEncrypt extends Operation {
|
||||
const key = Utils.convertToByteString(args[0].string, args[0].option),
|
||||
iv = Utils.convertToByteString(args[1].string, args[1].option),
|
||||
mode = args[2].split("/")[0],
|
||||
noPadding = args[2].endsWith("NoPadding"),
|
||||
noPadding = args[2].endsWith("NoPadding"),
|
||||
inputType = args[3],
|
||||
outputType = args[4],
|
||||
aad = Utils.convertToByteString(args[5].string, args[5].option);
|
||||
aad = Utils.convertToByteString(args[5].string, args[5].option),
|
||||
includeIV = args[6];
|
||||
|
||||
if ([16, 24, 32].indexOf(key.length) < 0) {
|
||||
throw new OperationError(`Invalid key length: ${key.length} bytes
|
||||
@ -133,26 +140,34 @@ The following algorithms will be used based on the size of the key:
|
||||
additionalData: mode === "GCM" ? aad : undefined
|
||||
});
|
||||
if (noPadding) {
|
||||
cipher.mode.pad = function(output, options) {
|
||||
cipher.mode.pad = function (output, options) {
|
||||
return true;
|
||||
};
|
||||
}
|
||||
cipher.update(forge.util.createBuffer(input));
|
||||
cipher.finish();
|
||||
|
||||
let output = cipher.output.getBytes();
|
||||
|
||||
if (includeIV === "Prepend") {
|
||||
output = iv + output;
|
||||
} else if (includeIV === "Append") {
|
||||
output = output + iv;
|
||||
}
|
||||
|
||||
if (outputType === "Hex") {
|
||||
output = toHexFast(Utils.strToByteArray(output));
|
||||
|
||||
if (mode === "GCM") {
|
||||
return cipher.output.toHex() + "\n\n" +
|
||||
return output + "\n\n" +
|
||||
"Tag: " + cipher.mode.tag.toHex();
|
||||
}
|
||||
return cipher.output.toHex();
|
||||
} else {
|
||||
if (mode === "GCM") {
|
||||
return cipher.output.getBytes() + "\n\n" +
|
||||
"Tag: " + cipher.mode.tag.getBytes();
|
||||
}
|
||||
return cipher.output.getBytes();
|
||||
} else if (mode === "GCM") {
|
||||
return output + "\n\n" +
|
||||
"Tag: " + cipher.mode.tag.getBytes();
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
*/
|
||||
|
||||
import Operation from "../Operation.mjs";
|
||||
import bson from "bson";
|
||||
import { deserialize } from "bson";
|
||||
import OperationError from "../errors/OperationError.mjs";
|
||||
|
||||
/**
|
||||
@ -37,7 +37,7 @@ class BSONDeserialise extends Operation {
|
||||
if (!input.byteLength) return "";
|
||||
|
||||
try {
|
||||
const data = bson.deserialize(new Buffer(input));
|
||||
const data = deserialize(new Uint8Array(input));
|
||||
return JSON.stringify(data, null, 2);
|
||||
} catch (err) {
|
||||
throw new OperationError(err.toString());
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
*/
|
||||
|
||||
import Operation from "../Operation.mjs";
|
||||
import bson from "bson";
|
||||
import { serialize } from "bson";
|
||||
import OperationError from "../errors/OperationError.mjs";
|
||||
|
||||
/**
|
||||
@ -38,7 +38,8 @@ class BSONSerialise extends Operation {
|
||||
|
||||
try {
|
||||
const data = JSON.parse(input);
|
||||
return bson.serialize(data).buffer;
|
||||
const result = serialize(data);
|
||||
return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);
|
||||
} catch (err) {
|
||||
throw new OperationError(err.toString());
|
||||
}
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
import Operation from "../Operation.mjs";
|
||||
import OperationError from "../errors/OperationError.mjs";
|
||||
import cptable from "codepage";
|
||||
import {CHR_ENC_CODE_PAGES} from "../lib/ChrEnc.mjs";
|
||||
|
||||
@ -48,6 +49,9 @@ class DecodeText extends Operation {
|
||||
*/
|
||||
run(input, args) {
|
||||
const format = CHR_ENC_CODE_PAGES[args[0]];
|
||||
if (!format) {
|
||||
throw new OperationError("Invalid encoding");
|
||||
}
|
||||
return cptable.utils.decode(format, new Uint8Array(input));
|
||||
}
|
||||
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
import Operation from "../Operation.mjs";
|
||||
import OperationError from "../errors/OperationError.mjs";
|
||||
import cptable from "codepage";
|
||||
import {CHR_ENC_CODE_PAGES} from "../lib/ChrEnc.mjs";
|
||||
|
||||
@ -48,6 +49,9 @@ class EncodeText extends Operation {
|
||||
*/
|
||||
run(input, args) {
|
||||
const format = CHR_ENC_CODE_PAGES[args[0]];
|
||||
if (!format) {
|
||||
throw new OperationError("Invalid encoding");
|
||||
}
|
||||
const encoded = cptable.utils.encode(format, input);
|
||||
return new Uint8Array(encoded).buffer;
|
||||
}
|
||||
|
||||
129
src/core/operations/EscapeSmartCharacters.mjs
Normal file
129
src/core/operations/EscapeSmartCharacters.mjs
Normal file
@ -0,0 +1,129 @@
|
||||
/**
|
||||
* @author HarelKatz [github.com/HarelKatz]
|
||||
* @copyright Crown Copyright 2026
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import Operation from "../Operation.mjs";
|
||||
|
||||
/**
|
||||
* Escape Smart Characters operation
|
||||
*/
|
||||
class EscapeSmartCharacters extends Operation {
|
||||
|
||||
/**
|
||||
* EscapeSmartCharacters constructor
|
||||
*/
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.name = "Escape Smart Characters";
|
||||
this.module = "Default";
|
||||
this.description = "Converts smart (typographic) Unicode characters — e.g. smart quotes, em/en dashes, ellipses, ©, ®, ™, arrows — into their plain ASCII equivalents.<br><br>Characters with no ASCII mapping (e.g. <code>☣</code>) are handled according to the 'Unmappable characters' option.<br><br>e.g. <code>“Hello” — world…</code> becomes <code>\"Hello\" -- world...</code>";
|
||||
this.infoURL = "";
|
||||
this.inputType = "string";
|
||||
this.outputType = "string";
|
||||
this.args = [
|
||||
{
|
||||
name: "Unmappable characters",
|
||||
type: "option",
|
||||
value: ["Include", "Remove", "Replace with '.'"]
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} input
|
||||
* @param {Object[]} args
|
||||
* @returns {string}
|
||||
*/
|
||||
run(input, args) {
|
||||
const [unmappable] = args;
|
||||
let result = "";
|
||||
for (const ch of input) {
|
||||
if (ch.codePointAt(0) < 128) {
|
||||
result += ch;
|
||||
} else if (Object.prototype.hasOwnProperty.call(SMART_MAP, ch)) {
|
||||
result += SMART_MAP[ch];
|
||||
} else {
|
||||
switch (unmappable) {
|
||||
case "Remove":
|
||||
break;
|
||||
case "Replace with '.'":
|
||||
result += ".";
|
||||
break;
|
||||
case "Include":
|
||||
default:
|
||||
result += ch;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const SMART_MAP = {
|
||||
// Smart double quotes
|
||||
"“": "\"", // “ left double quotation mark
|
||||
"”": "\"", // ” right double quotation mark
|
||||
"„": "\"", // „ double low-9 quotation mark
|
||||
"‟": "\"", // ‟ double high-reversed-9 quotation mark
|
||||
"″": "\"", // ″ double prime
|
||||
|
||||
// Smart single quotes / apostrophes
|
||||
"‘": "'", // ‘ left single quotation mark
|
||||
"’": "'", // ’ right single quotation mark / apostrophe
|
||||
"‚": "'", // ‚ single low-9 quotation mark
|
||||
"‛": "'", // ‛ single high-reversed-9 quotation mark
|
||||
"′": "'", // ′ prime
|
||||
|
||||
// Dashes & hyphens
|
||||
"‐": "-", // ‐ hyphen
|
||||
"‑": "-", // ‑ non-breaking hyphen
|
||||
"‒": "-", // ‒ figure dash
|
||||
"–": "-", // – en dash
|
||||
"—": "--", // — em dash
|
||||
"―": "--", // ― horizontal bar
|
||||
|
||||
// Ellipsis
|
||||
"…": "...", // …
|
||||
|
||||
// Trademark / copyright symbols
|
||||
"©": "(c)", // ©
|
||||
"®": "(r)", // ®
|
||||
"™": "(tm)", // ™
|
||||
|
||||
// Arrows
|
||||
"←": "<--", // ←
|
||||
"→": "-->", // →
|
||||
"↑": "^", // ↑
|
||||
"↓": "v", // ↓
|
||||
"↔": "<->", // ↔
|
||||
"⇐": "<==", // ⇐
|
||||
"⇒": "==>", // ⇒
|
||||
"⇔": "<=>", // ⇔
|
||||
|
||||
// Guillemets
|
||||
"«": "<<", // «
|
||||
"»": ">>", // »
|
||||
"‹": "<", // ‹
|
||||
"›": ">", // ›
|
||||
|
||||
// Math & misc symbols
|
||||
"×": "x", // ×
|
||||
"÷": "/", // ÷
|
||||
"±": "+/-", // ±
|
||||
"•": "*", // •
|
||||
"·": ".", // ·
|
||||
|
||||
// Non-ASCII spaces
|
||||
"\u00A0": " ", // NBSP
|
||||
"\u2002": " ", // en space
|
||||
"\u2003": " ", // em space
|
||||
"\u2009": " ", // thin space
|
||||
"\u200A": " " // hair space
|
||||
};
|
||||
|
||||
export default EscapeSmartCharacters;
|
||||
@ -50,6 +50,14 @@ class GenerateDeBruijnSequence extends Operation {
|
||||
throw new OperationError("Invalid alphabet size, required to be between 2 and 9 (inclusive).");
|
||||
}
|
||||
|
||||
if (!Number.isInteger(k)) {
|
||||
throw new OperationError("Invalid alphabet size, required to be integer.");
|
||||
}
|
||||
|
||||
if (!Number.isInteger(n)) {
|
||||
throw new OperationError("Invalid key length, required to be integer.");
|
||||
}
|
||||
|
||||
if (n < 2) {
|
||||
throw new OperationError("Invalid key length, required to be at least 2.");
|
||||
}
|
||||
|
||||
@ -8,6 +8,10 @@ import Operation from "../Operation.mjs";
|
||||
import OperationError from "../errors/OperationError.mjs";
|
||||
import { GenerateParagraphs, GenerateSentences, GenerateWords, GenerateBytes } from "../lib/LoremIpsum.mjs";
|
||||
|
||||
// arbitrary limits set to avoid DoS by requesting ridiculous amounts of data
|
||||
const maxLoremWords = 100_000; // same limit also used for paragraphs/sentences
|
||||
const maxLoremCharacters = 1_000_000;
|
||||
|
||||
/**
|
||||
* Generate Lorem Ipsum operation
|
||||
*/
|
||||
@ -47,9 +51,7 @@ class GenerateLoremIpsum extends Operation {
|
||||
*/
|
||||
run(input, args) {
|
||||
const [length, lengthType] = args;
|
||||
if (length < 1) {
|
||||
throw new OperationError("Length must be greater than 0");
|
||||
}
|
||||
checkLimits(lengthType, length);
|
||||
switch (lengthType) {
|
||||
case "Paragraphs":
|
||||
return GenerateParagraphs(length);
|
||||
@ -68,3 +70,32 @@ class GenerateLoremIpsum extends Operation {
|
||||
}
|
||||
|
||||
export default GenerateLoremIpsum;
|
||||
|
||||
/**
|
||||
* check combined validity of lengthType and length arguments
|
||||
* @param {string} lengthType
|
||||
* @param {number} length
|
||||
* @throws {OperationError}
|
||||
*/
|
||||
function checkLimits(lengthType, length) {
|
||||
if (length < 1) {
|
||||
throw new OperationError("Length must be greater than 0");
|
||||
}
|
||||
|
||||
switch (lengthType) {
|
||||
case "Paragraphs":
|
||||
case "Sentences":
|
||||
case "Words":
|
||||
if (length > maxLoremWords) {
|
||||
throw new OperationError("Length must be less than " + maxLoremWords);
|
||||
}
|
||||
break;
|
||||
case "Bytes":
|
||||
if (length > maxLoremCharacters) {
|
||||
throw new OperationError("Length must be less than " + maxLoremCharacters);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new OperationError("Invalid length type");
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,6 +12,7 @@ import { getSubkeySize, ASP } from "../lib/PGP.mjs";
|
||||
import { cryptNotice } from "../lib/Crypt.mjs";
|
||||
import * as es6promisify from "es6-promisify";
|
||||
const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify;
|
||||
const KEY_FLAGS = kbpgp.const.openpgp.key_flags;
|
||||
|
||||
|
||||
/**
|
||||
@ -73,11 +74,11 @@ class GeneratePGPKeyPair extends Operation {
|
||||
if (name) userIdentifier += name;
|
||||
if (email) userIdentifier += ` <${email}>`;
|
||||
|
||||
let flags = kbpgp.const.openpgp.certify_keys;
|
||||
flags |= kbpgp.const.openpgp.sign_data;
|
||||
flags |= kbpgp.const.openpgp.auth;
|
||||
flags |= kbpgp.const.openpgp.encrypt_comm;
|
||||
flags |= kbpgp.const.openpgp.encrypt_storage;
|
||||
let flags = KEY_FLAGS.certify_keys;
|
||||
flags |= KEY_FLAGS.sign_data;
|
||||
flags |= KEY_FLAGS.auth;
|
||||
flags |= KEY_FLAGS.encrypt_comm;
|
||||
flags |= KEY_FLAGS.encrypt_storage;
|
||||
|
||||
const keyGenerationOptions = {
|
||||
userid: userIdentifier,
|
||||
@ -89,11 +90,11 @@ class GeneratePGPKeyPair extends Operation {
|
||||
},
|
||||
subkeys: [{
|
||||
"nbits": getSubkeySize(keySize),
|
||||
"flags": kbpgp.const.openpgp.sign_data,
|
||||
"flags": KEY_FLAGS.sign_data,
|
||||
"expire_in": 86400 * 365 * 8
|
||||
}, {
|
||||
"nbits": getSubkeySize(keySize),
|
||||
"flags": kbpgp.const.openpgp.encrypt_comm | kbpgp.const.openpgp.encrypt_storage,
|
||||
"flags": KEY_FLAGS.encrypt_comm | KEY_FLAGS.encrypt_storage,
|
||||
"expire_in": 86400 * 365 * 2
|
||||
}],
|
||||
asp: ASP
|
||||
|
||||
83
src/core/operations/PGPSign.mjs
Normal file
83
src/core/operations/PGPSign.mjs
Normal file
@ -0,0 +1,83 @@
|
||||
/**
|
||||
* @author GCHQDeveloper581
|
||||
* @copyright Crown Copyright 2026
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import Operation from "../Operation.mjs";
|
||||
import kbpgp from "kbpgp";
|
||||
import { ASP, importPrivateKey } from "../lib/PGP.mjs";
|
||||
import OperationError from "../errors/OperationError.mjs";
|
||||
import * as es6promisify from "es6-promisify";
|
||||
const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify;
|
||||
|
||||
/**
|
||||
* PGP Sign operation
|
||||
*/
|
||||
class PGPSign extends Operation {
|
||||
|
||||
/**
|
||||
* PGPSign constructor
|
||||
*/
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.name = "PGP Sign";
|
||||
this.module = "PGP";
|
||||
this.description = [
|
||||
"Input: the message you want to sign",
|
||||
"<br><br>",
|
||||
"Arguments: the ASCII-armoured PGP private key of the sender.",
|
||||
"<br><br>",
|
||||
"Pretty Good Privacy is an encryption standard (OpenPGP) used for encrypting, decrypting, and signing messages.",
|
||||
"<br><br>",
|
||||
"This function uses the Keybase implementation of PGP.",
|
||||
].join("\n");
|
||||
this.infoURL = "https://wikipedia.org/wiki/Pretty_Good_Privacy"; // Usually a Wikipedia link. Remember to remove localisation (i.e. https://wikipedia.org/etc rather than https://en.wikipedia.org/etc)
|
||||
this.inputType = "string";
|
||||
this.outputType = "string";
|
||||
this.args = [
|
||||
{
|
||||
"name": "Private key of signer",
|
||||
"type": "text",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"name": "Private key passphrase (optional)",
|
||||
"type": "string",
|
||||
"value": ""
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} input
|
||||
* @param {Object[]} args
|
||||
* @returns {string}
|
||||
*
|
||||
* @throws {OperationError} if failed private key import or failed encryption
|
||||
*/
|
||||
async run(input, args) {
|
||||
const message = input,
|
||||
[privateKey, passphrase] = args;
|
||||
let signedMessage;
|
||||
|
||||
if (!privateKey) throw new OperationError("Enter the private key of the signer.");
|
||||
const privKey = await importPrivateKey(privateKey, passphrase);
|
||||
|
||||
try {
|
||||
signedMessage = await promisify(kbpgp.box)({
|
||||
"msg": message,
|
||||
"sign_with": privKey,
|
||||
"asp": ASP
|
||||
});
|
||||
} catch (err) {
|
||||
throw new OperationError(`Couldn't sign message: ${err}`);
|
||||
}
|
||||
|
||||
return signedMessage;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default PGPSign;
|
||||
@ -20,7 +20,7 @@ class ParityBit extends Operation {
|
||||
|
||||
this.name = "Parity Bit";
|
||||
this.module = "Default";
|
||||
this.description = "A parity bit, or check bit, is the simplest form of error detection. It is a bit which is added to a string of bits and represents if the number of 1's in the binary string is an even number or odd number.<br><br>If a delimiter is specified, the parity bit calculation will be performed on each 'block' of the input data, where the blocks are created by slicing the input at each occurence of the delimiter character";
|
||||
this.description = "A parity bit, or check bit, is the simplest form of error detection. It is a bit which is added to a string of bits and represents if the number of 1's in the binary string is an even number or odd number.<br><br>If a delimiter is specified, the parity bit calculation will be performed on each 'block' of the input data, where the blocks are created by slicing the input at each occurrence of the delimiter character";
|
||||
this.infoURL = "https://wikipedia.org/wiki/Parity_bit";
|
||||
this.inputType = "string";
|
||||
this.outputType = "string";
|
||||
|
||||
@ -92,7 +92,7 @@ class ParseEthernetFrame extends Operation {
|
||||
const packetData = input.slice(offset);
|
||||
|
||||
if (outputFormat === "Packet data") {
|
||||
return Utils.byteArrayToChars(packetData);
|
||||
return Utils.escapeHtml(Utils.byteArrayToChars(packetData));
|
||||
} else if (outputFormat === "Packet data (hex)") {
|
||||
return toHex(packetData);
|
||||
} else if (outputFormat === "Text output") {
|
||||
|
||||
@ -74,7 +74,7 @@ class ParseIPv4Header extends Operation {
|
||||
checksum = input[10] << 8 | input[11],
|
||||
srcIP = input[12] << 24 | input[13] << 16 | input[14] << 8 | input[15],
|
||||
dstIP = input[16] << 24 | input[17] << 16 | input[18] << 8 | input[19],
|
||||
checksumHeader = input.slice(0, 10).concat([0, 0]).concat(input.slice(12, 20));
|
||||
checksumHeader = [...input.slice(0, 10), 0, 0, ...input.slice(12, 20)];
|
||||
let version = (input[0] >>> 4) & 0x0f,
|
||||
options = [];
|
||||
|
||||
@ -138,7 +138,7 @@ class ParseIPv4Header extends Operation {
|
||||
} else if (outputFormat === "Data (hex)") {
|
||||
return toHex(data);
|
||||
} else if (outputFormat === "Data (raw)") {
|
||||
return Utils.byteArrayToChars(data);
|
||||
return Utils.escapeHtml(Utils.byteArrayToChars(data));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
import Operation from "../Operation.mjs";
|
||||
import OperationError from "../errors/OperationError.mjs";
|
||||
import BSON from "bson";
|
||||
import { ObjectId } from "bson";
|
||||
|
||||
/**
|
||||
* Parse ObjectID timestamp operation
|
||||
@ -35,7 +35,7 @@ class ParseObjectIDTimestamp extends Operation {
|
||||
*/
|
||||
run(input, args) {
|
||||
try {
|
||||
const objectId = new BSON.ObjectID(input);
|
||||
const objectId = new ObjectId(input);
|
||||
return objectId.getTimestamp().toISOString();
|
||||
} catch (err) {
|
||||
throw new OperationError(err);
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
*/
|
||||
|
||||
import Operation from "../Operation.mjs";
|
||||
import UAParser from "ua-parser-js";
|
||||
import { UAParser } from "ua-parser-js";
|
||||
|
||||
/**
|
||||
* Parse User Agent operation
|
||||
|
||||
83
src/core/operations/ROR13.mjs
Normal file
83
src/core/operations/ROR13.mjs
Normal file
@ -0,0 +1,83 @@
|
||||
/**
|
||||
* ROR13 Hash operation (Windows API hashing convention)
|
||||
* @author fufu_btw
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import Operation from "../Operation.mjs";
|
||||
|
||||
/**
|
||||
* Implements a ROR13 hash used for API name hashing techniques.
|
||||
*/
|
||||
class ROR13 extends Operation {
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.name = "ROR13";
|
||||
this.module = "Default";
|
||||
this.description = "Computes a ROR13 hash used in API hashing techniques.";
|
||||
this.infoURL = "";
|
||||
this.inputType = "byteArray";
|
||||
this.outputType = "string";
|
||||
|
||||
this.args = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Rotate right (32-bit)
|
||||
*
|
||||
* @param {number} value - input value
|
||||
* @param {number} bits - rotation bits
|
||||
* @returns {number} rotated value
|
||||
*/
|
||||
ror(value, bits) {
|
||||
return ((value >>> bits) | (value << (32 - bits))) >>> 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute ROR13 hash
|
||||
*
|
||||
* @param {byteArray} input - input bytes
|
||||
* @param {Object[]} args - operation arguments
|
||||
* @returns {string} hex hash
|
||||
*/
|
||||
run(input, args) {
|
||||
let hash = 0;
|
||||
|
||||
for (let i = 0; i < input.length; i++) {
|
||||
const chr = input[i] & 0xFF;
|
||||
hash = this.ror(hash, 13);
|
||||
hash = (hash + chr) >>> 0;
|
||||
}
|
||||
|
||||
return "0x" + hash.toString(16).padStart(8, "0").toUpperCase();
|
||||
}
|
||||
|
||||
/**
|
||||
* Highlight input
|
||||
*
|
||||
* @param {Object[]} pos
|
||||
* @param {Object[]} args
|
||||
* @returns {Object[]}
|
||||
*/
|
||||
highlight(pos, args) {
|
||||
return pos;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse highlight
|
||||
*
|
||||
* @param {Object[]} pos
|
||||
* @param {Object[]} args
|
||||
* @returns {Object[]}
|
||||
*/
|
||||
highlightReverse(pos, args) {
|
||||
return pos;
|
||||
}
|
||||
}
|
||||
|
||||
export default ROR13;
|
||||
41
src/core/operations/RemoveANSIEscapeCodes.mjs
Normal file
41
src/core/operations/RemoveANSIEscapeCodes.mjs
Normal file
@ -0,0 +1,41 @@
|
||||
/**
|
||||
* @author Louis-Ladd [lewisharshman1@gmail.com]
|
||||
* @copyright Crown Copyright 2025
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import Operation from "../Operation.mjs";
|
||||
|
||||
/**
|
||||
* Remove ANSI Escape Codes operation
|
||||
*/
|
||||
class RemoveANSIEscapeCodes extends Operation {
|
||||
|
||||
/**
|
||||
* RemoveANSIEscapeCodes constructor
|
||||
*/
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.name = "Remove ANSI Escape Codes";
|
||||
this.module = "Default";
|
||||
this.description = "Removes ANSI Escape Codes.";
|
||||
this.infoURL = "https://wikipedia.org/wiki/ANSI_escape_code";
|
||||
this.inputType = "string";
|
||||
this.outputType = "string";
|
||||
this.args = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} input
|
||||
* @param {Object[]} args
|
||||
* @returns {string}
|
||||
*/
|
||||
run(input, args) {
|
||||
const ansiRegex = /\x1B\[[0-?]*[ -/]*[@-~]/g;
|
||||
return input.replace(ansiRegex, "");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default RemoveANSIEscapeCodes;
|
||||
@ -20,7 +20,7 @@ class SHA2 extends Operation {
|
||||
|
||||
this.name = "SHA2";
|
||||
this.module = "Crypto";
|
||||
this.description = "The SHA-2 (Secure Hash Algorithm 2) hash functions were designed by the NSA. SHA-2 includes significant changes from its predecessor, SHA-1. The SHA-2 family consists of hash functions with digests (hash values) that are 224, 256, 384 or 512 bits: SHA224, SHA256, SHA384, SHA512.<br><br><ul><li>SHA-512 operates on 64-bit words.</li><li>SHA-256 operates on 32-bit words.</li><li>SHA-384 is largely identical to SHA-512 but is truncated to 384 bytes.</li><li>SHA-224 is largely identical to SHA-256 but is truncated to 224 bytes.</li><li>SHA-512/224 and SHA-512/256 are truncated versions of SHA-512, but the initial values are generated using the method described in Federal Information Processing Standards (FIPS) PUB 180-4.</li></ul> The message digest algorithm for SHA256 variants consists, by default, of 64 rounds, and for SHA512 variants, it is, by default, 160.";
|
||||
this.description = "The SHA-2 (Secure Hash Algorithm 2) hash functions were designed by the NSA. SHA-2 includes significant changes from its predecessor, SHA-1. The SHA-2 family consists of hash functions with digests (hash values) that are 224, 256, 384 or 512 bits: SHA224, SHA256, SHA384, SHA512.<br><br><ul><li>SHA-512 operates on 64-bit words.</li><li>SHA-256 operates on 32-bit words.</li><li>SHA-384 is largely identical to SHA-512 but is truncated to 384 bits.</li><li>SHA-224 is largely identical to SHA-256 but is truncated to 224 bits.</li><li>SHA-512/224 and SHA-512/256 are truncated versions of SHA-512, but the initial values are generated using the method described in Federal Information Processing Standards (FIPS) PUB 180-4.</li></ul> The message digest algorithm for SHA256 variants consists, by default, of 64 rounds, and for SHA512 variants, it is, by default, 160.";
|
||||
this.infoURL = "https://wikipedia.org/wiki/SHA-2";
|
||||
this.inputType = "ArrayBuffer";
|
||||
this.outputType = "string";
|
||||
|
||||
@ -15,6 +15,20 @@ import Utils from "../Utils.mjs";
|
||||
const d3 = d3temp.default ? d3temp.default : d3temp;
|
||||
const nodom = nodomtemp.default ? nodomtemp.default: nodomtemp;
|
||||
|
||||
/**
|
||||
* Removes D3's internal bound data from a nodom tree before serialization.
|
||||
* nodom serializes enumerable expando properties such as __data__ as attributes,
|
||||
* so leaving them on attacker-controlled values can create executable markup.
|
||||
*
|
||||
* @param {Object} node
|
||||
*/
|
||||
function clearD3BoundData(node) {
|
||||
delete node.__data__;
|
||||
|
||||
if (!node.childNodes) return;
|
||||
node.childNodes.forEach(clearD3BoundData);
|
||||
}
|
||||
|
||||
/**
|
||||
* Series chart operation
|
||||
*/
|
||||
@ -222,6 +236,8 @@ class SeriesChart extends Operation {
|
||||
.text(serie.name);
|
||||
});
|
||||
|
||||
clearD3BoundData(svg.node());
|
||||
|
||||
return svg._groups[0][0].outerHTML;
|
||||
}
|
||||
|
||||
|
||||
@ -8,6 +8,8 @@ import Operation from "../Operation.mjs";
|
||||
import Utils from "../Utils.mjs";
|
||||
import OperationError from "../errors/OperationError.mjs";
|
||||
|
||||
const MAX_WIDTH = 65536;
|
||||
|
||||
/**
|
||||
* To Hexdump operation
|
||||
*/
|
||||
@ -30,7 +32,8 @@ class ToHexdump extends Operation {
|
||||
"name": "Width",
|
||||
"type": "number",
|
||||
"value": 16,
|
||||
"min": 1
|
||||
"min": 1,
|
||||
"max": MAX_WIDTH
|
||||
},
|
||||
{
|
||||
"name": "Upper case hex",
|
||||
@ -63,6 +66,9 @@ class ToHexdump extends Operation {
|
||||
if (length < 1 || Math.round(length) !== length)
|
||||
throw new OperationError("Width must be a positive integer");
|
||||
|
||||
if (length > MAX_WIDTH)
|
||||
throw new OperationError(`Width must be no more than ${MAX_WIDTH}`);
|
||||
|
||||
const lines = [];
|
||||
for (let i = 0; i < data.length; i += length) {
|
||||
let lineNo = Utils.hex(i, 8);
|
||||
|
||||
@ -7,12 +7,12 @@
|
||||
import Operation from "../Operation.mjs";
|
||||
import Utils from "../Utils.mjs";
|
||||
import { toHex } from "../lib/Hex.mjs";
|
||||
import OperationError from "../errors/OperationError.mjs";
|
||||
|
||||
/**
|
||||
* XOR Checksum operation
|
||||
*/
|
||||
class XORChecksum extends Operation {
|
||||
|
||||
/**
|
||||
* XORChecksum constructor
|
||||
*/
|
||||
@ -21,7 +21,8 @@ class XORChecksum extends Operation {
|
||||
|
||||
this.name = "XOR Checksum";
|
||||
this.module = "Crypto";
|
||||
this.description = "XOR Checksum splits the input into blocks of a configurable size and performs the XOR operation on these blocks.";
|
||||
this.description =
|
||||
"XOR Checksum splits the input into blocks of a configurable size and performs the XOR operation on these blocks.";
|
||||
this.infoURL = "https://wikipedia.org/wiki/XOR";
|
||||
this.inputType = "ArrayBuffer";
|
||||
this.outputType = "string";
|
||||
@ -29,7 +30,7 @@ class XORChecksum extends Operation {
|
||||
{
|
||||
name: "Blocksize",
|
||||
type: "number",
|
||||
value: 4
|
||||
value: 4,
|
||||
},
|
||||
];
|
||||
}
|
||||
@ -41,6 +42,12 @@ class XORChecksum extends Operation {
|
||||
*/
|
||||
run(input, args) {
|
||||
const blocksize = args[0];
|
||||
|
||||
|
||||
if (!Number.isInteger(blocksize) || blocksize <= 0) {
|
||||
throw new OperationError("Blocksize must be a positive integer.");
|
||||
}
|
||||
|
||||
input = new Uint8Array(input);
|
||||
|
||||
const res = Array(blocksize);
|
||||
|
||||
@ -42,6 +42,14 @@ class App {
|
||||
this.progress = 0;
|
||||
this.ingId = 0;
|
||||
|
||||
// stateChangeId increments on every statechange dispatch; bakeStateId records
|
||||
// the stateChangeId captured when the most recent bake started. autoBake uses
|
||||
// these to decide whether the output is genuinely stale, so a debounced
|
||||
// autoBake firing shortly after a manual bake doesn't clobber the bake's
|
||||
// hideStaleIndicator with a redundant showStaleIndicator.
|
||||
this.stateChangeId = 0;
|
||||
this.bakeStateId = -1;
|
||||
|
||||
this.appLoaded = false;
|
||||
this.workerLoaded = false;
|
||||
this.waitersLoaded = false;
|
||||
@ -136,6 +144,9 @@ class App {
|
||||
bake(step=false) {
|
||||
if (this.baking) return;
|
||||
|
||||
// Record which state version this bake is covering.
|
||||
this.bakeStateId = this.stateChangeId;
|
||||
|
||||
// Reset attemptHighlight flag
|
||||
this.options.attemptHighlight = true;
|
||||
|
||||
@ -166,7 +177,10 @@ class App {
|
||||
nums: [this.manager.tabs.getActiveTab("input")],
|
||||
step: false
|
||||
});
|
||||
} else {
|
||||
} else if (this.bakeStateId < this.stateChangeId) {
|
||||
// Only show stale-indicator if the most recent bake didn't cover the
|
||||
// current state. Without this guard, a debounced autoBake firing after
|
||||
// a manual bake completed would re-show the indicator on fresh output.
|
||||
this.manager.controls.showStaleIndicator();
|
||||
}
|
||||
}
|
||||
@ -768,6 +782,10 @@ class App {
|
||||
* @param {event} e
|
||||
*/
|
||||
stateChange(e) {
|
||||
// Bump the state-change counter synchronously so a manual bake invoked between
|
||||
// here and the debounced autoBake firing can record it via bakeStateId.
|
||||
this.stateChangeId++;
|
||||
|
||||
debounce(function() {
|
||||
this.progress = 0;
|
||||
this.autoBake();
|
||||
|
||||
@ -166,6 +166,7 @@ class HTMLIngredient {
|
||||
id="${this.id}"
|
||||
tabindex="${this.tabIndex}"
|
||||
arg-name="${this.name}"
|
||||
data-target="${this.target}"
|
||||
${this.disabled ? "disabled" : ""}>`;
|
||||
for (i = 0; i < this.value.length; i++) {
|
||||
if ((m = this.value[i].name.match(/\[([a-z0-9 -()^]+)\]/i))) {
|
||||
|
||||
@ -868,15 +868,15 @@
|
||||
Be aware that the standalone version will never update itself, meaning it will not receive bug fixes or new features until you re-download newer versions manually.
|
||||
</p>
|
||||
|
||||
<h6>CyberChef v<%= htmlWebpackPlugin.options.version %></h6>
|
||||
<h6>CyberChef <%= htmlWebpackPlugin.options.version %></h6>
|
||||
<ul>
|
||||
<li>Build time: <%= htmlWebpackPlugin.options.compileTime %></li>
|
||||
<li>The changelog for this version can be viewed <a href="https://github.com/gchq/CyberChef/blob/v<%= htmlWebpackPlugin.options.version %>/CHANGELOG.md">here</a></li>
|
||||
<li>The changelog for this version can be viewed <a href="https://github.com/gchq/CyberChef/blob/v<%= htmlWebpackPlugin.options.latestReleaseVersion %>/CHANGELOG.md">here</a></li>
|
||||
<li>© Crown Copyright 2016-<%= htmlWebpackPlugin.options.compileYear %></li>
|
||||
<li>Released under the Apache Licence, Version 2.0</li>
|
||||
<li>SHA256 hash: DOWNLOAD_HASH_PLACEHOLDER</li>
|
||||
</ul>
|
||||
<a href="CyberChef_v<%= htmlWebpackPlugin.options.version %>.zip" download class="btn btn-outline-primary">Download ZIP file</a>
|
||||
<a href="<%= htmlWebpackPlugin.options.downloadZipFilename %>" download class="btn btn-outline-primary">Download ZIP file</a>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary" data-dismiss="modal">Ok</button>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import sm from "sitemap";
|
||||
import { SitemapStream, streamToPromise } from "sitemap";
|
||||
import OperationConfig from "../../core/config/OperationConfig.json" with { type: "json" };
|
||||
|
||||
/**
|
||||
@ -11,7 +11,7 @@ import OperationConfig from "../../core/config/OperationConfig.json" with { type
|
||||
|
||||
const baseUrl = "https://gchq.github.io/CyberChef/";
|
||||
|
||||
const smStream = new sm.SitemapStream({});
|
||||
const smStream = new SitemapStream({});
|
||||
|
||||
smStream.write({
|
||||
url: baseUrl,
|
||||
@ -28,6 +28,6 @@ for (const op in OperationConfig) {
|
||||
}
|
||||
smStream.end();
|
||||
|
||||
sm.streamToPromise(smStream).then(
|
||||
streamToPromise(smStream).then(
|
||||
(buffer) => console.log(buffer.toString()), // eslint-disable-line no-console
|
||||
);
|
||||
|
||||
@ -487,11 +487,19 @@ class RecipeWaiter {
|
||||
* @param {HTMLElement} op
|
||||
*/
|
||||
triggerArgEvents(op) {
|
||||
// Trigger populateOption and argSelector events
|
||||
// Trigger argSelector events and populateOption events only where the target is empty.
|
||||
// When loading a saved recipe, arguments are populated before this method is called, so
|
||||
// re-triggering populateOption events would overwrite saved custom values with defaults.
|
||||
const args = op.querySelectorAll(".arg");
|
||||
const triggerableOptions = op.querySelectorAll(".populate-option, .arg-selector");
|
||||
const evt = new Event("change", {bubbles: true});
|
||||
|
||||
if (triggerableOptions.length) {
|
||||
for (const el of triggerableOptions) {
|
||||
if (el.classList.contains("populate-option")) {
|
||||
const target = args[el.getAttribute("data-target")];
|
||||
if (target && target.value !== "") continue;
|
||||
}
|
||||
el.dispatchEvent(evt);
|
||||
}
|
||||
}
|
||||
|
||||
@ -30,8 +30,8 @@ module.exports = {
|
||||
testOp(browser, "A1Z26 Cipher Decode", "20 5 19 20 15 21 20 16 21 20", "testoutput");
|
||||
testOp(browser, "A1Z26 Cipher Encode", "test input", "20 5 19 20 9 14 16 21 20");
|
||||
testOp(browser, "ADD", "test input", "Ê»ÉÊv¿ÄÆËÊ", [{ "option": "Hex", "string": "56" }]);
|
||||
testOp(browser, "AES Decrypt", "b443f7f7c16ac5396a34273f6f639caa", "test output", [{ "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, { "option": "Hex", "string": "00000000000000000000000000000000" }, "CBC", "Hex", "Raw", { "option": "Hex", "string": "" }]);
|
||||
testOp(browser, "AES Encrypt", "test input", "e42eb8fbfb7a98fff061cd2c1a794d92", [{"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, {"option": "Hex", "string": "00000000000000000000000000000000"}, "CBC", "Raw", "Hex"]);
|
||||
testOp(browser, "AES Decrypt", "b443f7f7c16ac5396a34273f6f639caa", "test output", [{ "option": "Hex", "string": "00112233445566778899aabbccddeeff" }, { "option": "Hex", "string": "00000000000000000000000000000000" }, 16, "CBC", "Hex", "Raw", { "option": "Hex", "string": "" }, { "option": "Hex", "string": "" }, "Off"]);
|
||||
testOp(browser, "AES Encrypt", "test input", "e42eb8fbfb7a98fff061cd2c1a794d92", [{"option": "Hex", "string": "00112233445566778899aabbccddeeff"}, {"option": "Hex", "string": "00000000000000000000000000000000"}, "CBC", "Raw", "Hex", "Off"]);
|
||||
testOp(browser, "AND", "test input", "4$04 $044", [{ "option": "Hex", "string": "34" }]);
|
||||
testOp(browser, "Add line numbers", "test input", "1 test input");
|
||||
testOp(browser, ["From Hex", "Add Text To Image", "SHA2"], Images.PNG_HEX, "50cdf8ea483c55564a091650c2bccb4586f919b721e5fe9d6a61660505b4346d6ebdb2ef0cf075a7728cd84cb26ea3e477b5bd86a94a49a27d79423994afb60a", [[], ["Chef", "Center", "Middle", 0, 0, 16, "Roboto"], []]);
|
||||
@ -80,8 +80,8 @@ module.exports = {
|
||||
testOpHtml(browser, "Bombe", "XTSYN WAEUG EZALY NRQIM AMLZX MFUOD AWXLY LZCUZ QOQBQ JLCPK NDDRW F", "table tr:last-child td:first-child", "ECG", ["3-rotor", "LEYJVCNIXWPBQMDRTAKZGFUHOS", "BDFHJLCPRTXVZNYEIWGAKMUSQO<W", "AJDKSIRUXBLHWTMCQGZNPYFVOE<F", "ESOVPZJAYQUIRHXLNFTGKDCMWB<K", "AY BR CU DH EQ FS GL IP JX KN MO TZ VW", "HELLO CYBER CHEFU SER", 0, true]);
|
||||
testOp(browser, ["Bzip2 Compress", "To Hex"], "test input", "42 5a 68 39 31 41 59 26 53 59 cf 96 82 1d 00 00 03 91 80 40 00 02 21 4e 00 20 00 21 90 c2 10 c0 88 33 92 8e df 17 72 45 38 50 90 cf 96 82 1d");
|
||||
testOp(browser, ["From Hex", "Bzip2 Decompress"], "425a68393141592653597b0884b7000003038000008200ce00200021a647a4218013709517c5dc914e14241ec2212dc0", "test_output", [[], [true]]);
|
||||
// testOp(browser, "CBOR Decode", "test input", "test output");
|
||||
// testOp(browser, "CBOR Encode", "test input", "test output");
|
||||
testOp(browser, ["From Hex", "CBOR Decode"], "f9 3e 00", "1.5");
|
||||
testOp(browser, ["CBOR Encode", "To Hex"], "1.5", "f9 3e 00");
|
||||
testOp(browser, "CRC Checksum", "test input", "77c7", ["CRC-16"]);
|
||||
testOp(browser, "CRC Checksum", "test input", "29822bc8", ["CRC-32"]);
|
||||
testOp(browser, "CRC Checksum", "test input", "9d", ["CRC-8"]);
|
||||
@ -278,11 +278,11 @@ module.exports = {
|
||||
testOpHtml(browser, "Parse UDP", "04 89 00 35 00 2c 01 01", "tr:last-child td:last-child", "0x0101");
|
||||
// testOp(browser, "Parse UNIX file permissions", "test input", "test_output");
|
||||
// testOp(browser, "Parse URI", "test input", "test_output");
|
||||
// testOp(browser, "Parse User Agent", "test input", "test_output");
|
||||
testOp(browser, "Parse User Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0 ", /Architecture: amd64/);
|
||||
// testOp(browser, "Parse X.509 certificate", "test input", "test_output");
|
||||
testOpFile(browser, "Play Media", "files/mp3example.mp3", "audio", "");
|
||||
// testOp(browser, "Power Set", "test input", "test_output");
|
||||
// testOp(browser, "Protobuf Decode", "test input", "test_output");
|
||||
testOp(browser, ["From Hex", "Protobuf Decode"], "0d1c0000001203596f751a024d65202b2a0a0a066162633132331200", /"1": "abc123"/, [[], ["", false, false]]);
|
||||
// testOp(browser, "Pseudo-Random Number Generator", "test input", "test_output");
|
||||
// testOp(browser, "RC2 Decrypt", "test input", "test_output");
|
||||
// testOp(browser, "RC2 Encrypt", "test input", "test_output");
|
||||
|
||||
48
tests/browser/03_recipe_load.js
Normal file
48
tests/browser/03_recipe_load.js
Normal file
@ -0,0 +1,48 @@
|
||||
/**
|
||||
* Regression tests for recipe loading behaviour.
|
||||
*
|
||||
* @author C85297 [95289555+C85297@users.noreply.github.com]
|
||||
* @copyright Crown Copyright
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
const utils = require("./browserUtils.js");
|
||||
|
||||
module.exports = {
|
||||
before: browser => {
|
||||
browser
|
||||
.resizeWindow(1280, 800)
|
||||
.url(browser.launchUrl)
|
||||
.useCss()
|
||||
.waitForElementNotPresent("#preloader", 10000);
|
||||
},
|
||||
|
||||
"Recipe load preserves populated arguments": browser => {
|
||||
const inputFormat = "HH:mm:ss a MMM DD, YYYY ";
|
||||
const input = "10:20:30 pm Sep 26, 2019 ";
|
||||
|
||||
utils.loadRecipe(
|
||||
browser,
|
||||
"Translate DateTime Format",
|
||||
input,
|
||||
[
|
||||
"Standard date and time",
|
||||
inputFormat,
|
||||
"UTC",
|
||||
"DD/MM/YYYY HH:mm:ss",
|
||||
"UTC"
|
||||
]
|
||||
);
|
||||
|
||||
browser.execute(() => {
|
||||
return Array.from(document.querySelectorAll("#rec-list li.operation .arg"))
|
||||
.map(arg => arg.value);
|
||||
}, [], function({value}) {
|
||||
browser.expect(value[1]).to.equal(inputFormat);
|
||||
});
|
||||
},
|
||||
|
||||
after: browser => {
|
||||
browser.end();
|
||||
}
|
||||
};
|
||||
@ -51,14 +51,17 @@ function setInput(browser, input, type=true) {
|
||||
*/
|
||||
function bake(browser) {
|
||||
browser
|
||||
// Let any pending debounced inputChange/stateChange (~20ms each) fire so the
|
||||
// worker has the latest input buffer before we ask it to bake.
|
||||
.pause(50)
|
||||
// Ensure we're not currently busy
|
||||
.waitForElementNotVisible("#output-loader", 5000)
|
||||
.waitForElementNotVisible("#output-loader", 10000)
|
||||
.expect.element("#bake span").text.to.equal("BAKE!");
|
||||
|
||||
browser
|
||||
.click("#bake")
|
||||
.waitForElementNotVisible("#stale-indicator", 5000)
|
||||
.waitForElementNotVisible("#output-loader", 5000);
|
||||
.waitForElementNotVisible("#stale-indicator", 10000)
|
||||
.waitForElementNotVisible("#output-loader", 10000);
|
||||
}
|
||||
|
||||
/** @function
|
||||
|
||||
@ -18,6 +18,7 @@ import {
|
||||
import TestRegister from "../lib/TestRegister.mjs";
|
||||
import "./tests/nodeApi.mjs";
|
||||
import "./tests/operations.mjs";
|
||||
import "./tests/PGP.mjs";
|
||||
import "./tests/File.mjs";
|
||||
import "./tests/Dish.mjs";
|
||||
import "./tests/NodeDish.mjs";
|
||||
|
||||
69
tests/node/tests/PGP.mjs
Normal file
69
tests/node/tests/PGP.mjs
Normal file
@ -0,0 +1,69 @@
|
||||
/**
|
||||
* PGP node tests.
|
||||
*
|
||||
* @author C85297 [95289555+C85297@users.noreply.github.com]
|
||||
* @copyright Crown Copyright 2026
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import assert from "assert";
|
||||
import kbpgp from "kbpgp";
|
||||
import * as es6promisify from "es6-promisify";
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
import it from "../assertionHandler.mjs";
|
||||
import GeneratePGPKeyPair from "../../../src/core/operations/GeneratePGPKeyPair.mjs";
|
||||
|
||||
const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify;
|
||||
|
||||
const PUBLIC_KEY_BLOCK = /-----BEGIN PGP PUBLIC KEY BLOCK-----[\s\S]*-----END PGP PUBLIC KEY BLOCK-----/;
|
||||
|
||||
/**
|
||||
* Generate a PGP key pair and import the generated public key.
|
||||
*
|
||||
* @param {string} keyType
|
||||
* @returns {Promise<Object>}
|
||||
*/
|
||||
async function generateAndImportPublicKey(keyType) {
|
||||
const operation = new GeneratePGPKeyPair();
|
||||
const generatedKeyPair = await operation.run("", [
|
||||
keyType,
|
||||
"",
|
||||
"User",
|
||||
"akb@notreal.gchq.gov.uk"
|
||||
]);
|
||||
|
||||
const publicKey = generatedKeyPair.match(PUBLIC_KEY_BLOCK);
|
||||
|
||||
assert(publicKey, "Generated key pair should contain an ASCII-armoured public key");
|
||||
|
||||
return promisify(kbpgp.KeyManager.import_from_armored_pgp)({
|
||||
armored: publicKey[0],
|
||||
opts: {
|
||||
"no_check_keys": true
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
TestRegister.addApiTests([
|
||||
it("Generate PGP Key Pair: ECC keys should include ECDSA signing and ECDH encryption subkeys", async () => {
|
||||
const publicKey = await generateAndImportPublicKey("ECC-256");
|
||||
const subkeyAlgorithms = publicKey.subkeys.map(subkey => subkey.key.type);
|
||||
|
||||
assert.strictEqual(
|
||||
publicKey.primary.key.type,
|
||||
kbpgp.const.openpgp.public_key_algorithms.ECDSA,
|
||||
"Generated ECC PGP primary key should use ECDSA"
|
||||
);
|
||||
|
||||
assert(
|
||||
subkeyAlgorithms.includes(kbpgp.const.openpgp.public_key_algorithms.ECDSA),
|
||||
"Generated ECC PGP key should include an ECDSA signing subkey"
|
||||
);
|
||||
|
||||
assert(
|
||||
subkeyAlgorithms.includes(kbpgp.const.openpgp.public_key_algorithms.ECDH),
|
||||
"Generated ECC PGP key should include an ECDH encryption subkey"
|
||||
);
|
||||
})
|
||||
]);
|
||||
@ -79,7 +79,46 @@ TestRegister.addApiTests([
|
||||
string: "some iv some iv1",
|
||||
option: "utf8",
|
||||
},
|
||||
ivLength: 16,
|
||||
mode: "OFB",
|
||||
inputType: "Hex",
|
||||
outputType: "Raw",
|
||||
gcmTag: {
|
||||
option: "Hex",
|
||||
string: ""
|
||||
},
|
||||
aad: {
|
||||
option: "Hex",
|
||||
string: ""
|
||||
},
|
||||
ivFromInput: "Off"
|
||||
});
|
||||
assert.equal(result.toString(), "a slightly longer sampleinput?");
|
||||
}),
|
||||
|
||||
it("AES decrypt: IV from input", () => {
|
||||
const result = AESDecrypt("4a123af235a507bbc9d5871721d61b98504d569a9a5a7847e2d78315fec7736f6d6520697620736f6d6520697631", {
|
||||
key: {
|
||||
string: "some longer key1",
|
||||
option: "utf8",
|
||||
},
|
||||
iv: {
|
||||
string: "",
|
||||
option: "Hex",
|
||||
},
|
||||
ivLength: 16,
|
||||
mode: "OFB",
|
||||
inputType: "Hex",
|
||||
outputType: "Raw",
|
||||
gcmTag: {
|
||||
option: "Hex",
|
||||
string: ""
|
||||
},
|
||||
aad: {
|
||||
option: "Hex",
|
||||
string: ""
|
||||
},
|
||||
ivFromInput: "From end"
|
||||
});
|
||||
assert.equal(result.toString(), "a slightly longer sampleinput?");
|
||||
}),
|
||||
|
||||
@ -1,214 +0,0 @@
|
||||
/* eslint no-console: 0 */
|
||||
|
||||
/**
|
||||
* Test Runner
|
||||
*
|
||||
* For running the tests in the test register.
|
||||
*
|
||||
* @author tlwr [toby@toby.codes]
|
||||
* @author n1474335 [n1474335@gmail.com]
|
||||
* @copyright Crown Copyright 2017
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import "../lib/wasmFetchPolyfill.mjs";
|
||||
import { setLongTestFailure, logTestReport } from "../lib/utils.mjs";
|
||||
|
||||
import TestRegister from "../lib/TestRegister.mjs";
|
||||
import "./tests/A1Z26CipherDecode.mjs";
|
||||
import "./tests/AESKeyWrap.mjs";
|
||||
import "./tests/AnalyseUUID.mjs";
|
||||
import "./tests/AlternatingCaps.mjs";
|
||||
import "./tests/AvroToJSON.mjs";
|
||||
import "./tests/BaconCipher.mjs";
|
||||
import "./tests/Base32.mjs";
|
||||
import "./tests/Base45.mjs";
|
||||
import "./tests/Base58.mjs";
|
||||
import "./tests/Base62.mjs";
|
||||
import "./tests/Base64.mjs";
|
||||
import "./tests/Base85.mjs";
|
||||
import "./tests/Base92.mjs";
|
||||
import "./tests/BCD.mjs";
|
||||
import "./tests/Bech32.mjs";
|
||||
import "./tests/BitwiseOp.mjs";
|
||||
import "./tests/BLAKE2b.mjs";
|
||||
import "./tests/BLAKE2s.mjs";
|
||||
import "./tests/BLAKE3.mjs";
|
||||
import "./tests/Bombe.mjs";
|
||||
import "./tests/BSON.mjs";
|
||||
import "./tests/ByteRepr.mjs";
|
||||
import "./tests/CaesarBoxCipher.mjs";
|
||||
import "./tests/CaretMdecode.mjs";
|
||||
import "./tests/CartesianProduct.mjs";
|
||||
import "./tests/CBORDecode.mjs";
|
||||
import "./tests/CBOREncode.mjs";
|
||||
import "./tests/CetaceanCipherDecode.mjs";
|
||||
import "./tests/CetaceanCipherEncode.mjs";
|
||||
import "./tests/ChaCha.mjs";
|
||||
import "./tests/ChangeIPFormat.mjs";
|
||||
import "./tests/CharEnc.mjs";
|
||||
import "./tests/Charts.mjs";
|
||||
import "./tests/Ciphers.mjs";
|
||||
import "./tests/CipherSaber2.mjs";
|
||||
import "./tests/CMAC.mjs";
|
||||
import "./tests/Code.mjs";
|
||||
import "./tests/Colossus.mjs";
|
||||
import "./tests/Comment.mjs";
|
||||
import "./tests/Compress.mjs";
|
||||
import "./tests/ConditionalJump.mjs";
|
||||
import "./tests/ConvertCoordinateFormat.mjs";
|
||||
import "./tests/ConvertLeetSpeak.mjs";
|
||||
import "./tests/ConvertToNATOAlphabet.mjs";
|
||||
import "./tests/CRCChecksum.mjs";
|
||||
import "./tests/Crypt.mjs";
|
||||
import "./tests/CSV.mjs";
|
||||
import "./tests/DateTime.mjs";
|
||||
import "./tests/DefangIP.mjs";
|
||||
import "./tests/DisassembleARM.mjs";
|
||||
import "./tests/DropNthBytes.mjs";
|
||||
import "./tests/ECDSA.mjs";
|
||||
import "./tests/ELFInfo.mjs";
|
||||
import "./tests/Enigma.mjs";
|
||||
import "./tests/ExtractAudioMetadata.mjs";
|
||||
import "./tests/ExtractEmailAddresses.mjs";
|
||||
import "./tests/ExtractHashes.mjs";
|
||||
import "./tests/ExtractIPAddresses.mjs";
|
||||
import "./tests/Fernet.mjs";
|
||||
import "./tests/Float.mjs";
|
||||
import "./tests/FileTree.mjs";
|
||||
import "./tests/FletcherChecksum.mjs";
|
||||
import "./tests/Fork.mjs";
|
||||
import "./tests/FromDecimal.mjs";
|
||||
import "./tests/GenerateAllChecksums.mjs";
|
||||
import "./tests/GenerateAllHashes.mjs";
|
||||
import "./tests/GenerateDeBruijnSequence.mjs";
|
||||
import "./tests/GenerateQRCode.mjs";
|
||||
import "./tests/GetAllCasings.mjs";
|
||||
import "./tests/GOST.mjs";
|
||||
import "./tests/Gunzip.mjs";
|
||||
import "./tests/Gzip.mjs";
|
||||
import "./tests/Hash.mjs";
|
||||
import "./tests/HASSH.mjs";
|
||||
import "./tests/HaversineDistance.mjs";
|
||||
import "./tests/Hex.mjs";
|
||||
import "./tests/Hexdump.mjs";
|
||||
import "./tests/HKDF.mjs";
|
||||
import "./tests/Image.mjs";
|
||||
import "./tests/IndexOfCoincidence.mjs";
|
||||
import "./tests/JA3Fingerprint.mjs";
|
||||
import "./tests/JA4.mjs";
|
||||
import "./tests/JA3SFingerprint.mjs";
|
||||
import "./tests/Jsonata.mjs";
|
||||
import "./tests/JSONBeautify.mjs";
|
||||
import "./tests/JSONMinify.mjs";
|
||||
import "./tests/JSONtoCSV.mjs";
|
||||
import "./tests/Jump.mjs";
|
||||
import "./tests/JWK.mjs";
|
||||
import "./tests/JWTDecode.mjs";
|
||||
import "./tests/JWTSign.mjs";
|
||||
import "./tests/JWTVerify.mjs";
|
||||
import "./tests/LevenshteinDistance.mjs";
|
||||
import "./tests/Lorenz.mjs";
|
||||
import "./tests/LS47.mjs";
|
||||
import "./tests/LuhnChecksum.mjs";
|
||||
import "./tests/LZNT1Decompress.mjs";
|
||||
import "./tests/LZString.mjs";
|
||||
import "./tests/Magic.mjs";
|
||||
import "./tests/Media.mjs";
|
||||
import "./tests/MIMEDecoding.mjs";
|
||||
import "./tests/Modhex.mjs";
|
||||
import "./tests/MorseCode.mjs";
|
||||
import "./tests/MS.mjs";
|
||||
import "./tests/MultipleBombe.mjs";
|
||||
import "./tests/MurmurHash3.mjs";
|
||||
import "./tests/NetBIOS.mjs";
|
||||
import "./tests/NormaliseUnicode.mjs";
|
||||
import "./tests/NTLM.mjs";
|
||||
import "./tests/OTP.mjs";
|
||||
import "./tests/ParseEthernetFrame.mjs";
|
||||
import "./tests/ParseIPRange.mjs";
|
||||
import "./tests/ParseObjectIDTimestamp.mjs";
|
||||
import "./tests/ParseQRCode.mjs";
|
||||
import "./tests/ParseSSHHostKey.mjs";
|
||||
import "./tests/ParseTCP.mjs";
|
||||
import "./tests/ParseTLSRecord.mjs";
|
||||
import "./tests/ParseTLV.mjs";
|
||||
import "./tests/ParseUDP.mjs";
|
||||
import "./tests/PEMtoHex.mjs";
|
||||
import "./tests/PGP.mjs";
|
||||
import "./tests/PHP.mjs";
|
||||
import "./tests/ParityBit.mjs";
|
||||
import "./tests/PHPSerialize.mjs";
|
||||
import "./tests/PowerSet.mjs";
|
||||
import "./tests/Protobuf.mjs";
|
||||
import "./tests/PubKeyFromCert.mjs";
|
||||
import "./tests/PubKeyFromPrivKey.mjs";
|
||||
import "./tests/Rabbit.mjs";
|
||||
import "./tests/RAKE.mjs";
|
||||
import "./tests/Regex.mjs";
|
||||
import "./tests/Register.mjs";
|
||||
import "./tests/RegularExpression.mjs";
|
||||
import "./tests/RenderMarkdown.mjs";
|
||||
import "./tests/RisonEncodeDecode.mjs";
|
||||
import "./tests/Rotate.mjs";
|
||||
import "./tests/RSA.mjs";
|
||||
import "./tests/Salsa20.mjs";
|
||||
import "./tests/XSalsa20.mjs";
|
||||
import "./tests/SeqUtils.mjs";
|
||||
import "./tests/SetDifference.mjs";
|
||||
import "./tests/SetIntersection.mjs";
|
||||
import "./tests/SetUnion.mjs";
|
||||
import "./tests/Shuffle.mjs";
|
||||
import "./tests/SIGABA.mjs";
|
||||
import "./tests/SM2.mjs";
|
||||
import "./tests/SM4.mjs";
|
||||
import "./tests/RC6.mjs";
|
||||
// import "./tests/SplitColourChannels.mjs"; // Cannot test operations that use the File type yet
|
||||
import "./tests/SQLBeautify.mjs";
|
||||
import "./tests/StrUtils.mjs";
|
||||
import "./tests/StripIPv4Header.mjs";
|
||||
import "./tests/StripTCPHeader.mjs";
|
||||
import "./tests/StripUDPHeader.mjs";
|
||||
import "./tests/Subsection.mjs";
|
||||
import "./tests/SwapCase.mjs";
|
||||
import "./tests/SymmetricDifference.mjs";
|
||||
import "./tests/TakeNthBytes.mjs";
|
||||
import "./tests/Template.mjs";
|
||||
import "./tests/TextEncodingBruteForce.mjs";
|
||||
import "./tests/TextIntegerConverter.mjs";
|
||||
import "./tests/ToFromInsensitiveRegex.mjs";
|
||||
import "./tests/TranslateDateTimeFormat.mjs";
|
||||
import "./tests/Typex.mjs";
|
||||
import "./tests/UnescapeString.mjs";
|
||||
import "./tests/Unicode.mjs";
|
||||
import "./tests/Wrap.mjs";
|
||||
import "./tests/URLEncodeDecode.mjs";
|
||||
import "./tests/RSA.mjs";
|
||||
import "./tests/CBOREncode.mjs";
|
||||
import "./tests/CBORDecode.mjs";
|
||||
import "./tests/JA3Fingerprint.mjs";
|
||||
import "./tests/JA3SFingerprint.mjs";
|
||||
import "./tests/HASSH.mjs";
|
||||
import "./tests/JSONtoYAML.mjs";
|
||||
|
||||
// Cannot test operations that use the File type yet
|
||||
// import "./tests/SplitColourChannels.mjs";
|
||||
import "./tests/YARA.mjs";
|
||||
import "./tests/ParseCSR.mjs";
|
||||
import "./tests/XXTEA.mjs";
|
||||
|
||||
const testStatus = {
|
||||
allTestsPassing: true,
|
||||
counts: {
|
||||
total: 0,
|
||||
},
|
||||
};
|
||||
|
||||
setLongTestFailure();
|
||||
|
||||
const logOpsTestReport = logTestReport.bind(null, testStatus);
|
||||
|
||||
(async function () {
|
||||
const results = await TestRegister.runTests();
|
||||
logOpsTestReport(results);
|
||||
})();
|
||||
@ -68,6 +68,32 @@ TestRegister.addTests([
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Encode text: empty encoding",
|
||||
input: "hello",
|
||||
expectedOutput: "Invalid encoding",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Encode text",
|
||||
"args": [""]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Decode text: empty encoding",
|
||||
input: "68 65 6c 6c 6f",
|
||||
expectedOutput: "Invalid encoding",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "From Hex",
|
||||
"args": ["Space"]
|
||||
},
|
||||
{
|
||||
"op": "Decode text",
|
||||
"args": [""]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Generate Base64 Windows PowerShell",
|
||||
input: "ZABpAHIAIAAiAGMAOgBcAHAAcgBvAGcAcgBhAG0AIABmAGkAbABlAHMAIgAgAA==",
|
||||
|
||||
@ -41,6 +41,17 @@ TestRegister.addTests([
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Series chart escapes x-axis values in serialized SVG",
|
||||
input: `s,x"><script>globalThis.seriesChartInjected=1</script><g a=",1`,
|
||||
unexpectedMatch: /<script>|__data__=/,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Series chart",
|
||||
"args": ["Line feed", "Comma", "", 1, "red"]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Heatmap chart",
|
||||
input: "100 100\n200 200\n300 300\n400 400\n500 500",
|
||||
|
||||
@ -74,7 +74,8 @@ The following algorithms will be used based on the size of the key:
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""},
|
||||
"CBC", "Raw", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -90,7 +91,8 @@ The following algorithms will be used based on the size of the key:
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "00000000000000000000000000000000"},
|
||||
"CBC", "Raw", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -106,7 +108,8 @@ The following algorithms will be used based on the size of the key:
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "00000000000000000000000000000000"},
|
||||
"CTR", "Raw", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -122,7 +125,8 @@ The following algorithms will be used based on the size of the key:
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
"CBC", "Raw", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -138,7 +142,8 @@ The following algorithms will be used based on the size of the key:
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
"CFB", "Raw", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -154,7 +159,8 @@ The following algorithms will be used based on the size of the key:
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
"OFB", "Raw", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -170,7 +176,8 @@ The following algorithms will be used based on the size of the key:
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
"CTR", "Raw", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -186,7 +193,8 @@ The following algorithms will be used based on the size of the key:
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": ""},
|
||||
"ECB", "Raw", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -204,7 +212,8 @@ Tag: 16a3e732a605cc9ca29108f742ca0743`,
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": ""},
|
||||
"GCM", "Raw", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -222,7 +231,8 @@ Tag: 3b5378917f67b0aade9891fc6c291646`,
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "ffeeddccbbaa99887766554433221100"},
|
||||
"GCM", "Raw", "Hex",
|
||||
{"option": "UTF8", "string": "additional data"}
|
||||
{"option": "UTF8", "string": "additional data"},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -238,7 +248,8 @@ Tag: 3b5378917f67b0aade9891fc6c291646`,
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"CBC", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -254,7 +265,8 @@ Tag: 3b5378917f67b0aade9891fc6c291646`,
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"CFB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -270,7 +282,8 @@ Tag: 3b5378917f67b0aade9891fc6c291646`,
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"OFB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -286,7 +299,8 @@ Tag: 3b5378917f67b0aade9891fc6c291646`,
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"CTR", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -304,7 +318,8 @@ Tag: 70fad2ca19412c20f40fd06918736e56`,
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -322,7 +337,8 @@ Tag: 61cc4b70809452b0b3e38f913fa0a109`,
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "UTF8", "string": "additional data"}
|
||||
{"option": "UTF8", "string": "additional data"},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -338,7 +354,8 @@ Tag: 61cc4b70809452b0b3e38f913fa0a109`,
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"ECB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -354,7 +371,8 @@ Tag: 61cc4b70809452b0b3e38f913fa0a109`,
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"CBC", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -370,7 +388,8 @@ Tag: 61cc4b70809452b0b3e38f913fa0a109`,
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"CFB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -386,7 +405,8 @@ Tag: 61cc4b70809452b0b3e38f913fa0a109`,
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"OFB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -402,7 +422,8 @@ Tag: 61cc4b70809452b0b3e38f913fa0a109`,
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"CTR", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -420,7 +441,8 @@ Tag: 86db597d5302595223cadbd990f1309b`,
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -438,7 +460,8 @@ Tag: aeedf3e6ca4201577c0cf3e9ce58159d`,
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "UTF8", "string": "additional data"}
|
||||
{"option": "UTF8", "string": "additional data"},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -454,7 +477,8 @@ Tag: aeedf3e6ca4201577c0cf3e9ce58159d`,
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"ECB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -470,7 +494,8 @@ Tag: aeedf3e6ca4201577c0cf3e9ce58159d`,
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"CBC", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -486,7 +511,8 @@ Tag: aeedf3e6ca4201577c0cf3e9ce58159d`,
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"CFB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -502,7 +528,8 @@ Tag: aeedf3e6ca4201577c0cf3e9ce58159d`,
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"OFB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -518,7 +545,8 @@ Tag: aeedf3e6ca4201577c0cf3e9ce58159d`,
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"CTR", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -536,7 +564,8 @@ Tag: 821b1e5f32dad052e502775a523d957a`,
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -554,7 +583,8 @@ Tag: a8f04c4d93bbef82bef61a103371aef9`,
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "UTF8", "string": "additional data"}
|
||||
{"option": "UTF8", "string": "additional data"},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -570,7 +600,46 @@ Tag: a8f04c4d93bbef82bef61a103371aef9`,
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"ECB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "AES Encrypt: AES-256-GCM, Binary, AAD, prepend IV to output",
|
||||
input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018",
|
||||
expectedOutput: `1748e7179bd56570d51fa4ba287cc3e51287f188ad4d7ab0d9ff69b3c29cb11f861389532d8cb9337181da2e8cfc74a84927e8c0dd7a28a32fd485afe694259a63c199b199b95edd87c7aa95329feac340f2b78b72956a85f367044d821766b1b7135815571df44900695f1518cf3ae38ecb650f
|
||||
|
||||
Tag: a8f04c4d93bbef82bef61a103371aef9`,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "AES Encrypt",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "UTF8", "string": "additional data"},
|
||||
"Prepend"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "AES Encrypt: AES-256-GCM, Binary, AAD, append IV to output",
|
||||
input: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018",
|
||||
expectedOutput: `1287f188ad4d7ab0d9ff69b3c29cb11f861389532d8cb9337181da2e8cfc74a84927e8c0dd7a28a32fd485afe694259a63c199b199b95edd87c7aa95329feac340f2b78b72956a85f367044d821766b1b7135815571df44900695f1518cf3ae38ecb650f1748e7179bd56570d51fa4ba287cc3e5
|
||||
|
||||
Tag: a8f04c4d93bbef82bef61a103371aef9`,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "AES Encrypt",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "UTF8", "string": "additional data"},
|
||||
"Append"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -776,9 +845,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""},
|
||||
16,
|
||||
"CBC", "Hex", "Raw",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -793,9 +864,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "00000000000000000000000000000000"},
|
||||
16,
|
||||
"CBC", "Hex", "Raw",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -810,9 +883,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "00000000000000000000000000000000"},
|
||||
16,
|
||||
"CTR", "Hex", "Raw",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -827,9 +902,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
16,
|
||||
"CBC", "Hex", "Raw",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -844,9 +921,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
16,
|
||||
"CFB", "Hex", "Raw",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -861,9 +940,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
16,
|
||||
"OFB", "Hex", "Raw",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -878,9 +959,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
16,
|
||||
"CTR", "Hex", "Raw",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -895,9 +978,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": ""},
|
||||
16,
|
||||
"ECB", "Hex", "Raw",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -912,9 +997,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": ""},
|
||||
16,
|
||||
"GCM", "Hex", "Raw",
|
||||
{"option": "Hex", "string": "16a3e732a605cc9ca29108f742ca0743"},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -929,9 +1016,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||
{"option": "Hex", "string": "ffeeddccbbaa99887766554433221100"},
|
||||
16,
|
||||
"GCM", "Hex", "Raw",
|
||||
{"option": "Hex", "string": "3b5378917f67b0aade9891fc6c291646"},
|
||||
{"option": "UTF8", "string": "additional data"}
|
||||
{"option": "UTF8", "string": "additional data"},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -946,9 +1035,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"CBC", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -963,9 +1054,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"CFB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -980,9 +1073,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"OFB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -997,9 +1092,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"CTR", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1014,9 +1111,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "Hex", "string": "70fad2ca19412c20f40fd06918736e56"},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1031,9 +1130,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "Hex", "string": "61cc4b70809452b0b3e38f913fa0a109"},
|
||||
{"option": "UTF8", "string": "additional data"}
|
||||
{"option": "UTF8", "string": "additional data"},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1048,9 +1149,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "51e201d463698ef5f717f71f5b4712af"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"ECB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1065,9 +1168,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"CBC", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1082,9 +1187,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"CFB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1099,9 +1206,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"OFB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1116,9 +1225,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"CTR", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1133,9 +1244,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "Hex", "string": "86db597d5302595223cadbd990f1309b"},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1150,9 +1263,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "Hex", "string": "aeedf3e6ca4201577c0cf3e9ce58159d"},
|
||||
{"option": "UTF8", "string": "additional data"}
|
||||
{"option": "UTF8", "string": "additional data"},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1167,9 +1282,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "6801ed503c9d96ee5f9d78b07ab1b295dba3c2adf81c7816"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"ECB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1184,9 +1301,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"CBC", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1201,9 +1320,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"CFB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1218,9 +1339,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"OFB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1235,9 +1358,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"CTR", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1252,9 +1377,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "Hex", "string": "821b1e5f32dad052e502775a523d957a"},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1269,9 +1396,11 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "Hex", "string": "a8f04c4d93bbef82bef61a103371aef9"},
|
||||
{"option": "UTF8", "string": "additional data"}
|
||||
{"option": "UTF8", "string": "additional data"},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -1286,9 +1415,106 @@ The following algorithms will be used based on the size of the key:
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": "1748e7179bd56570d51fa4ba287cc3e5"},
|
||||
16,
|
||||
"ECB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""}
|
||||
{"option": "Hex", "string": ""},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "AES Decrypt: IV from input, with too short input",
|
||||
input: "1748e7179bd56570d51fa4ba287cc3e5",
|
||||
expectedOutput: "Input is too short to contain an IV of 16 bytes.",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "AES Decrypt",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": ""},
|
||||
16,
|
||||
"ECB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""},
|
||||
"From start"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "AES Decrypt: AES-256-ECB with IV from input start, Binary",
|
||||
input: "1748e7179bd56570d51fa4ba287cc3e57e8521ba3f356ef692a51841807e141464aadc07bbc0ef2b628b8745bae356d245682a220688afca7be987b60cb120681ed42680ee93a67065619a3beaac11111a6cd88a6afa9e367722cb57df343f8548f2d691b295184da4ed5f3b763aaa8558502cb348ab58e81986337096e90caa",
|
||||
expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "AES Decrypt",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": ""},
|
||||
16,
|
||||
"ECB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""},
|
||||
"From start"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "AES Decrypt: AES-256-ECB with IV from input end, Binary",
|
||||
input: "7e8521ba3f356ef692a51841807e141464aadc07bbc0ef2b628b8745bae356d245682a220688afca7be987b60cb120681ed42680ee93a67065619a3beaac11111a6cd88a6afa9e367722cb57df343f8548f2d691b295184da4ed5f3b763aaa8558502cb348ab58e81986337096e90caa1748e7179bd56570d51fa4ba287cc3e5",
|
||||
expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "AES Decrypt",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": ""},
|
||||
16,
|
||||
"ECB", "Hex", "Hex",
|
||||
{"option": "Hex", "string": ""},
|
||||
{"option": "Hex", "string": ""},
|
||||
"From end"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "AES Decrypt: AES-256-GCM with IV from input start, Binary, AAD",
|
||||
input: "1748e7179bd56570d51fa4ba287cc3e51287f188ad4d7ab0d9ff69b3c29cb11f861389532d8cb9337181da2e8cfc74a84927e8c0dd7a28a32fd485afe694259a63c199b199b95edd87c7aa95329feac340f2b78b72956a85f367044d821766b1b7135815571df44900695f1518cf3ae38ecb650f",
|
||||
expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "AES Decrypt",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": ""},
|
||||
16,
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "Hex", "string": "a8f04c4d93bbef82bef61a103371aef9"},
|
||||
{"option": "UTF8", "string": "additional data"},
|
||||
"From start"
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "AES Decrypt: AES-256-GCM with 12-byte IV from input start, Binary, AAD",
|
||||
input: "1748e7179bd56570d51fa4ba623c81f4605da9ac3df29c67c43abe4aad5230dca82a98ab31f042fe871b81a0a1e8b8af41044d46f627828e7d11eca2d04ac27f4e7c7c9a20da87854df9868a2ddbd67d85f7db92f9ff1272cfb7955a2d279dbe715965011fddf6e730e79e7b22f89817",
|
||||
expectedOutput: "7a0e643132750e96d805d11e9e48e281fa39a41039286423cc1c045e5442b40bf1c3f2822bded3f9c8ef11cb25da64dda9c7ab87c246bd305385150c98f31465c2a6180fe81d31ea289b916504d5a12e1de26cb10adba84a0cb0c86f94bc14bc554f3018",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "AES Decrypt",
|
||||
"args": [
|
||||
{"option": "Hex", "string": "2d767f6e9333d1c77581946e160b2b7368c2cdd5e2b80f04ca09d64e02afbfe1"},
|
||||
{"option": "Hex", "string": ""},
|
||||
12,
|
||||
"GCM", "Hex", "Hex",
|
||||
{"option": "Hex", "string": "c311c9144f8ae145ec46e2c69179a4b7"},
|
||||
{"option": "UTF8", "string": "additional data"},
|
||||
"From start"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
132
tests/operations/tests/EscapeSmartCharacters.mjs
Normal file
132
tests/operations/tests/EscapeSmartCharacters.mjs
Normal file
@ -0,0 +1,132 @@
|
||||
/**
|
||||
* Escape Smart Characters tests
|
||||
*
|
||||
* @author HarelKatz [github.com/HarelKatz]
|
||||
* @copyright Crown Copyright 2026
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
"name": "Escape Smart Characters: smart quotes and apostrophes",
|
||||
"input": "“Hello,” she said, ‘yes.’",
|
||||
"expectedOutput": "\"Hello,\" she said, 'yes.'",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Escape Smart Characters",
|
||||
"args": ["Include"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Escape Smart Characters: em dash, en dash and ellipsis",
|
||||
"input": "page 1–3 — wait…",
|
||||
"expectedOutput": "page 1-3 -- wait...",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Escape Smart Characters",
|
||||
"args": ["Include"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Escape Smart Characters: trademark symbols",
|
||||
"input": "Foo© Bar® Baz™",
|
||||
"expectedOutput": "Foo(c) Bar(r) Baz(tm)",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Escape Smart Characters",
|
||||
"args": ["Include"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Escape Smart Characters: arrows and guillemets",
|
||||
"input": "← → ↔ ⇒ « »",
|
||||
"expectedOutput": "<-- --> <-> ==> << >>",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Escape Smart Characters",
|
||||
"args": ["Include"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Escape Smart Characters: math and misc",
|
||||
"input": "3 × 4 ÷ 2 = 6, ±0.5 • item",
|
||||
"expectedOutput": "3 x 4 / 2 = 6, +/-0.5 * item",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Escape Smart Characters",
|
||||
"args": ["Include"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Escape Smart Characters: NBSP becomes regular space",
|
||||
"input": "a b c",
|
||||
"expectedOutput": "a b c",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Escape Smart Characters",
|
||||
"args": ["Include"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Escape Smart Characters: unmappable Include preserves char",
|
||||
"input": "warning: ☣ hazard",
|
||||
"expectedOutput": "warning: ☣ hazard",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Escape Smart Characters",
|
||||
"args": ["Include"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Escape Smart Characters: unmappable Remove drops char",
|
||||
"input": "warning: ☣ hazard",
|
||||
"expectedOutput": "warning: hazard",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Escape Smart Characters",
|
||||
"args": ["Remove"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Escape Smart Characters: unmappable Replace substitutes dot",
|
||||
"input": "warning: ☣ hazard",
|
||||
"expectedOutput": "warning: . hazard",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Escape Smart Characters",
|
||||
"args": ["Replace with '.'"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Escape Smart Characters: pure ASCII passes through",
|
||||
"input": "hello world! 123",
|
||||
"expectedOutput": "hello world! 123",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Escape Smart Characters",
|
||||
"args": ["Include"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Escape Smart Characters: empty input",
|
||||
"input": "",
|
||||
"expectedOutput": "",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Escape Smart Characters",
|
||||
"args": ["Include"]
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
||||
@ -14,15 +14,18 @@ const validTokenSha256 = "eyJyb2xlIjoic3VwZXJ1c2VyIiwidXNlciI6ImFkbWluIn0.aab3Ew
|
||||
const validKey = "mysecretkey";
|
||||
const wrongKey = "notTheKey";
|
||||
|
||||
const outputObject = {
|
||||
user: "admin",
|
||||
role: "superuser",
|
||||
};
|
||||
const outputObject = `{
|
||||
"role": "superuser",
|
||||
"user": "admin"
|
||||
}`;
|
||||
|
||||
const outputVerify = {
|
||||
valid: true,
|
||||
payload: outputObject,
|
||||
};
|
||||
const outputVerify = `{
|
||||
"valid": true,
|
||||
"payload": {
|
||||
"role": "superuser",
|
||||
"user": "admin"
|
||||
}
|
||||
}`;
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
|
||||
80
tests/operations/tests/GenerateLoremIpsum.mjs
Normal file
80
tests/operations/tests/GenerateLoremIpsum.mjs
Normal file
@ -0,0 +1,80 @@
|
||||
/**
|
||||
* Generate Lorem Ipsum tests
|
||||
*
|
||||
* @author GCHQDeveloper581
|
||||
* @copyright Crown Copyright 2025
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Generate Lorem Ipsum: Exceeds Word Limit",
|
||||
input: "",
|
||||
expectedOutput: "Length must be less than 100000",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Generate Lorem Ipsum",
|
||||
"args": [999_999, "Words"]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Generate Lorem Ipsum: Within Word Limit",
|
||||
input: "",
|
||||
// each word is >= 3 characters long, so expect at least 3000 characters
|
||||
expectedMatch: /.{3000,}/s,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Generate Lorem Ipsum",
|
||||
"args": [1000, "Words"]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Generate Lorem Ipsum: Exceeds Byte Limit",
|
||||
input: "",
|
||||
expectedOutput: "Length must be less than 1000000",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Generate Lorem Ipsum",
|
||||
"args": [1_000_001, "Bytes"]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Generate Lorem Ipsum: Exceeds Sentence Limit",
|
||||
input: "",
|
||||
expectedOutput: "Length must be less than 100000",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Generate Lorem Ipsum",
|
||||
"args": [999_999, "Sentences"]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Generate Lorem Ipsum: Exceeds Paragraph Limit",
|
||||
input: "",
|
||||
expectedOutput: "Length must be less than 100000",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Generate Lorem Ipsum",
|
||||
"args": [999_999, "Paragraphs"]
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Generate Lorem Ipsum: Incorrect lengthType",
|
||||
input: "",
|
||||
expectedOutput: "Invalid length type",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Generate Lorem Ipsum",
|
||||
"args": [999_999, "Novels"]
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
|
||||
]);
|
||||
@ -126,6 +126,17 @@ TestRegister.addTests([
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "To Hexdump: Width too large",
|
||||
input: "H",
|
||||
expectedOutput: "Width must be no more than 65536",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "To Hexdump",
|
||||
args: [155555555555555, false, false, false]
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "From Hexdump: xxd",
|
||||
input: `00000000: 0001 0203 0405 0607 0809 0a0b 0c0d 0e0f ................
|
||||
|
||||
@ -12,7 +12,7 @@ TestRegister.addTests([
|
||||
{
|
||||
name: "IPv6 Transition: IPv4 to IPv6",
|
||||
input: "198.51.100.7",
|
||||
expectedOutput: "6to4: 2002:c633:6407::/48\nIPv4 Mapped: ::ffff:c633:6407\nIPv4 Translated: ::ffff:0:c633:6407\nNat 64: 64:ff9b::c633:6407",
|
||||
expectedOutput: "6to4: 2002:c633:6407::/48\nIPv4 Mapped: ::ffff:c633:6407\nIPv4 Translated: ::ffff:0:c633:6407\nNat 64: 64:ff9b::c633:6407\n",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "IPv6 Transition Addresses",
|
||||
@ -22,7 +22,7 @@ TestRegister.addTests([
|
||||
}, {
|
||||
name: "IPv6 Transition: IPv4 /24 Range to IPv6",
|
||||
input: "198.51.100.0/24",
|
||||
expectedOutput: "6to4: 2002:c633:6400::/40\nIPv4 Mapped: ::ffff:c633:6400/120\nIPv4 Translated: ::ffff:0:c633:6400/120\nNat 64: 64:ff9b::c633:6400/120",
|
||||
expectedOutput: "6to4: 2002:c633:6400::/40\nIPv4 Mapped: ::ffff:c633:6400/120\nIPv4 Translated: ::ffff:0:c633:6400/120\nNat 64: 64:ff9b::c633:6400/120\n",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "IPv6 Transition Addresses",
|
||||
@ -32,7 +32,7 @@ TestRegister.addTests([
|
||||
}, {
|
||||
name: "IPv6 Transition: IPv4 to IPv6 Remove headers",
|
||||
input: "198.51.100.7",
|
||||
expectedOutput: "2002:c633:6407::/48\n::ffff:c633:6407\n::ffff:0:c633:6407\n64:ff9b::c633:6407",
|
||||
expectedOutput: "2002:c633:6407::/48\n::ffff:c633:6407\n::ffff:0:c633:6407\n64:ff9b::c633:6407\n",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "IPv6 Transition Addresses",
|
||||
@ -42,7 +42,7 @@ TestRegister.addTests([
|
||||
}, {
|
||||
name: "IPv6 Transition: IPv6 to IPv4",
|
||||
input: "64:ff9b::c633:6407",
|
||||
expectedOutput: "IPv4: 198.51.100.7",
|
||||
expectedOutput: "IPv4: 198.51.100.7\n",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "IPv6 Transition Addresses",
|
||||
|
||||
@ -10,138 +10,144 @@ import {ASCII_TEXT, UTF8_TEXT, ALL_BYTES} from "../../samples/Ciphers.mjs";
|
||||
|
||||
// RSA-1024
|
||||
const ALICE_PRIVATE = `-----BEGIN PGP PRIVATE KEY BLOCK-----
|
||||
Version: Keybase OpenPGP v2.0.77
|
||||
Version: Keybase OpenPGP v2.1.17
|
||||
Comment: https://keybase.io/crypto
|
||||
|
||||
xcEYBFsNaYsBBAC9rnmjTzLLBCey2gq9un+XXP089sP3AONhSivdJlJEEWjt999o
|
||||
g8vM18TcEk1sxyItp/GLlE/T70NPFAvdVXKI0KDQZ9fm77JDKitl587npRaspOOX
|
||||
L1yUVFGVr4YEPDLoAT4PJgwI3TsEBfLGeOZqBqd/stw/FKjrNZJLRYfjnQARAQAB
|
||||
AAP9G3EGgAM74fXJQy1wUwqMMvsXrUjgs6IZQ0Cryo7PZVxExfNlCtsmZ42VGWbn
|
||||
H071OY22eu8LWCn2nut+MUM6EnjDZ7e/u85eHd0r5fY/3Vl0lQCy53RDdEQ3w8vA
|
||||
XcUSabxwqpubmtyC3jxIXmVH6rLLmSpGGX8IqHRTfNDwHTECAPsgeVy0qkT0kJq1
|
||||
Aw8gthHO6c3m1NOcAPyTqSRLVspxRDB0LuYHnVxAN+dUHFYAfwPj+h+E6ROolqe4
|
||||
IKtrls8CAMFcwisDUQXFQFmO2pkpgaQTkN9XjGqBhjYd1EGs+WcYZb7eD98Ue0TZ
|
||||
GUF4UtzHUW5hIiCgkTrwpdpRqE3xudMCAJbhnzE+Mj7yKAHAV8LjZfpJA9hh1G8c
|
||||
ATDpoWD1yAcLO1mMVkSExpMHoiuQ5ujzWyCHYnXDdRo6jkowP4JxIX+axs0AwrQE
|
||||
EwEKAB4FAlsNaYsCGy8DCwkHAxUKCAIeAQIXgAMWAgECGQEACgkQhCRlSN+Y5IXj
|
||||
5QP8CZns1zlWk7S37Dhvxe3K3EYVgefc+EDWsj3xvlo+QUKQMAmANFNnqYzt++mv
|
||||
cVhvGzyn+wa244fJb3xGYAi+G4Ya5pWQbXSzAVhjteHyLcjS6VZ/ydxDGCZK37Gc
|
||||
MYs/8x4kwdU+A8/bQhJ+nRVEJjkg0OcoH9rJv0kB+ilcC7LHwRgEWw1piwEEAOXO
|
||||
Jib0QIvuqKAZiN3Yol3xC9Wz5aXQyg7qCnnYHHrPIMgYvGrTjjvDFCwM5uxCv38Q
|
||||
d6rJnzrRXTC1EiAia/b7f76Z0r4W+j6KdVCGpQnVQE6b//WdY5ys1xLAkNr4xwNj
|
||||
42nrOIMGB1qV0XezJ4VBOMpMHlwE2WR27HOQakXDABEBAAEAA/9Svw4BzMVJHaBe
|
||||
NZOQviaIyPjH9ETmle2LvT4UbXqjxd057544oQCACFhFHEgyHj6x1A4i0wKgvS5f
|
||||
EXP7WimhUEybo8YktbYX691QGPHNNQw5dc6IzLZmSm9p1zpuOs1VBHs6lpR5Y0WT
|
||||
/2vDrbY2Loa+Dojuvuq3hY1Bu5fjcQIA/SdK6T8sEYwdZTfCKEWdvMQ8zhjioNNn
|
||||
5enUNT/WQXw6qvkczD2U48PlIXpwfn4Rjh3sGEiumng334LTslXtvwIA6GOl6eFC
|
||||
337clY0Yyog7cTsEZTdCQBIScZi7grMuL9KFWx4UbfHiDS976MRu1ciATCTSCdc5
|
||||
xgLEUF51WrWw/QIApR/pGgDg/Ow32jS38VonCH6TpFFMk9KciKCMm7sRrG3J6kFK
|
||||
UxuxWXPs+pWXjTn6ItfrX6M8dZZkC2BBR9UyrqB5wsCDBBgBCgAPBQJbDWmLBQkP
|
||||
CZwAAhsuAKgJEIQkZUjfmOSFnSAEGQEKAAYFAlsNaYsACgkQPtlTQFIjCzrjvQQA
|
||||
hyGjZ2zDMxyXA3oEoD3RfjPQtAYFPJ5i0/ir/FD2nX7//cyd8zJS24P6S9+ID8vB
|
||||
0n+JwF6KrvjqpMneXXbPmi5OebqMogLahWmhCtjriDKrfJJiL0HmTKGl89p2Z59e
|
||||
BoLbm4Jpk1rL7EmoibsmUZdBUutf0tw5IusXd/B5sNwhdgQArBzyHVIFyN+fegTE
|
||||
9cR677M92NjYhqY8c+fF/AV+7XQv0Vsi9B//HeTMCml6jytxdSIZBl7uLrasIOd0
|
||||
FJk+VP7UrOfDaz6oVq+tarStAelfqT9DRQXw+nEdes4bxDsPvi1OieTtexJRO181
|
||||
zdsmOukv2RhgrJzFCcpzAkUYGqjHwRgEWw1piwEEALDKG2L6NNhTXZ3MJJLVtEPD
|
||||
65c9KmT8DagJXCp0cl3bQbcs+zLmsfYwnIKNTOxnhxAER+5e6jmW4K7sbLY593rO
|
||||
iqDXXX8OR28t88IGjlIrVd+2t6+ma5ecSgsyVqBDFFTpAzg+QFWdk2VEOlA5zNfC
|
||||
dX94pLUMjPDAHSsZfrufABEBAAEAA/wIFwePzPFUIOR8zxWxXnQkUbfbMOJawqoB
|
||||
UYRVMQT2xIzKTBWmq6XjJTBUTREDFG26zudXwiInxn67ongLErX/Zhohq8lBYjjx
|
||||
QkQRtU+QSDsksdJJL0Lj/6SAkljkhXmO+jYmRVirQfGBVl33Dk9YWnd/VePO5epn
|
||||
nYPxEGT+MQIA6n9nHmzbz5ohSi6Ovn4OW0704K3kLhOQ3WP3j+5+bWXv0Xd89w7v
|
||||
ZMyv0IJOvhOw1670BcBxbI/CSFD4Nz+k+QIAwQAP/M8TdG1Twwx6yED0syNvPDfN
|
||||
5hzZM8031zTBbguSRJskD18aBtwcUun93+dcilRY94gXbl4xSq3YitTDVwIAvX+P
|
||||
06nJmFdgeoanpcYIBA4hwi+LPyfPcGo6tfnsxk7ul1mBK27TR+AjnJ+HNFCh54CM
|
||||
4cLH1djyBmwEt30Wm6FjwsCDBBgBCgAPBQJbDWmLBQkDwmcAAhsuAKgJEIQkZUjf
|
||||
mOSFnSAEGQEKAAYFAlsNaYsACgkQW/Z2teklb4u5/gP/fnZ7ZuV+l4c2EQY5Xnk8
|
||||
S/lY3Xr9zoucjQwQWeRKwAQYoiovzxA4XV8gGyrdAsrIPUFLp7PmUBG4YJV/7sVo
|
||||
zzRwVq+jS8Jo0xYbGJMv2DuAnXXrYCZWZRqRscr1Wlc+CUACmxYZjC1DVVrAXr0j
|
||||
TqYTk+jjhemTTAtUelgMhcX82wP9EEU66hCYFUayjn4bBlR1yEvMpJd8JSTHR/dZ
|
||||
H8t3Ri6R2AYRqBxro0JEXDhL9iDnuPQVxsbgq2YlhHrPJI8opKuxV7wrXrupzwFf
|
||||
KixJMNwsAPk/nSc4qIZvXTi2fmyAZDJYUgsm6CwkxumaVvIdVNGRmxqGSRTuEInt
|
||||
W03Cwfs=
|
||||
=Mb52
|
||||
xcEYBGoXHs0BBADB6Loj+NXNQBgVNCDtFYxNvjvVinPAqW7/spsvjCOhDrIkqGf2
|
||||
foY6sjLpsdZaHh+CtEApc3Fn3gLSq17PCY0KJwcirbp3kYyEzZ2rAhJlpqmW3mua
|
||||
mqffrOgOpvlR1Hoa7SL4qTWqvwX68p5PUcETKAKE2CQVMj1mki882ldMzQARAQAB
|
||||
AAP7BMz0sshJzsOL9RZtzEDQ0OnpRE+hrv7i2xy6X9J53VZmTacHr+ARBan8vbFj
|
||||
66Y8RHme7wfHInmqGzoX5ktHvRH52+gm902kPUWW9WPtoIT+j2n1/ifzZI4SJl8g
|
||||
ssysKwNz+Et+1ffxPJGkWnblyrXG6JtNwmwBjMgAA1jxqPcCAP6k7GDbW9gtt2B1
|
||||
5d+0g78dSf2WXLhO0YqmromyXm1Ub9asKfL42eayXZjy6KQb5xlO9bNWH5AkfGx7
|
||||
qVTPox8CAMLxBcfhzC92e7kDApuebFadCiIrSv0puE57DbVyMb8xtY+khl/pHlnA
|
||||
9IslbZTBFRbjJgcprHWvtUhd7NUhHpMB/A/iYINYQ9jLovVtijsmeGc1zAHCYtzN
|
||||
36UtikIDDs+uWT5RD5RDRh8CXEtpGs8wvyQsfmt0xLwdtilvFdefq9aoPc0AwrQE
|
||||
EwEKAB4FAmoXHs0CGy8DCwkHAxUKCAIeAQIXgAMWAgECGQEACgkQG3UgSyrfjYz9
|
||||
WwQAtBfgtztR1z05tzkCfEAGHMNmcJoUdh5kUnDJa0ekg3rSAYWTP294+OLQM/Up
|
||||
t7KjprDNQjMDy24gaBldAInTgo8I/x1JcfQeluuZKKe4lbmST6229onE6bXeb17n
|
||||
aLZaSiYI/qLyC8xeb9WkfmR8uRumXSFrTJxHvPzLB4Pgx2nHwRgEahcezQEEAKjU
|
||||
543TxZbzZiae6XWFIXjFgWE/vBC+5ZYEyTAG6jtwfP4tgagb+chJG+hoFA9HZXXP
|
||||
r5CPiNZUW6aPpbaMRmubIZs7uCpw3RfcZ+AR+Q9unf0kCJxXThRBhhWHipaLB44M
|
||||
weCueUawRjwnJVog9nIEE1Heg5G9/fHemLZJ7iU/ABEBAAEAA/4wEreATe20Rsgu
|
||||
dQ9a1DasseheLYy6Y/Dxn5k94KovlJ8yrPh/Sr/8BL06lvAnTZgZTLLcAdLf3JNg
|
||||
QQTZjuW55cRBu73aegvM4UKvmTxAXgJXk9ADpYTfH7yyyp3B6VTFt5kFwIzFJqvo
|
||||
b7NNN87qNuCAfOumSA31k2K+RUupiQIA0EVM8yCWvB8qG0+qW63yqwuP4/YGtg7L
|
||||
G5a+v6+Fz8UuLKtBchy4xfPZMP5IsXdbAtYQiPlSvAZNRYH1eG+eNQIAz4XRXQZI
|
||||
KO7yHawxUsEfuTt1G9yKjUCYCN4yiD/cfYtXoB9wLHRmsC6mBc8XwhtszYnQGKRV
|
||||
+fdYoluxcH30IwIAxKHe5hylDp5/LO0pZK+uXQqD6D30Q5xzeWwHgfXsce6PXZ1J
|
||||
9tblAyYDjRzCGtJ1sjqsVeEEZTU6s5r9Y9ViCaTvwsCDBBgBCgAPBQJqFx7NBQkP
|
||||
CZwAAhsuAKgJEBt1IEsq342MnSAEGQEKAAYFAmoXHs0ACgkQOfwkCKoimvpKxQP/
|
||||
U55dBOApPc0egWCgEBaUocwZ6Tg8dvCw5/8h/ttHtb7dh4G+XHq3zPOz8yHS22r0
|
||||
uTmDbQFT7QnPWuFgN5UBYIM4jilTbeVLbCPYTXvCnzAF6QRLV1OdwrESpFs4vqwZ
|
||||
UmffzoeI6rFHI9HHHiUZ/S2u9YdyqLfHMTZe9s8iByuMtgP+IzQHozMdEXNFUlFp
|
||||
xw/b5Tv4ps5Hs+/iSiGJDJvC6xtWXi2kpU2kNACKW69vt/5DLloTNHVOAR7Zo4zV
|
||||
OYo6u//mQRvjtmzvr5WJg6Ti+o/nZEaUIL7CXaCwbdeJkG8QSX1U5l734U1D2U+J
|
||||
wmTfuZ1DQBdl7A2rTInPmI5Iuz7HwRcEahcezQEEAMQmvSmxyBpSKd7pRbYzTNDn
|
||||
tTJtCmFRi/jFh5nA4bU280srqNzFD00YiWFSEn+FXimJjLgDhu3v9XI74KBINZd/
|
||||
uRzxgvW2972T0ogxx4BPrRa3tCcdJKijKwfnNG0T9mrNz2W4P2JY0ZR0pIC94nm0
|
||||
mg8EkEHxwCypavxmo/mpABEBAAEAA/ICZzFHLpTzjw4iz+dcMS1uSn+znnPTjtq/
|
||||
a6wath9TmQdKwY+hgd/RBlkFngdtcUB75LODMIffYmKrDz9IiN/CGMl4G0CBoVTP
|
||||
gx+mmCGLUX3T0ozDra8dmO5Tv8LIbF4xpx0GOA1gQ0mNC1w2NJRyJY7PIF6bevdy
|
||||
lFl6ZAp/AgD4RILvX1Cj3ZMJcQ6G7loyUSiVQRpR7uMVfGlIJeP4rAXqpvfyeUnn
|
||||
jT28RsFFszcKHZXRxWby2fBscDxtwEsTAgDKQrGL6jRBvojwNn4kixBG9v1RkRBr
|
||||
PykEUJsOmOlgmd2hQslfD/dNrJSwxvzl8q5RI1PlI1343UdRQEDDY6PTAgCPADVb
|
||||
3ghi5A2uh+LyORRt2A7C353Mz8cofue/N78ViChBy1Bh7Yyh0jo/wtoaP98aQfYq
|
||||
Z2krI8wWrLIfUHx8mtvCwIMEGAEKAA8FAmoXHs0FCQPCZwACGy4AqAkQG3UgSyrf
|
||||
jYydIAQZAQoABgUCahcezQAKCRCNZtcgmBdHpJhpA/4+MD1IjjP9ttE6Sg2/vdUJ
|
||||
Yzij2vQMwBIcrYPJ3vW86g4WMz8a2kaBC+MAoHzYNvv7CwZPpXpvGm9jWww7EKOm
|
||||
Gwuza7Yi9kseqVz+/wIJcseiI3e/o9XCRgbXtTJmgNsJW3fRIJnmMnuAJ/4ykL1G
|
||||
x4i15bky1sW0pvoXAaCL0Y1BBACvg8WLxpdnvWWYHv9z/x9cDOxZG2j2/rjG2VnC
|
||||
lDkZI4+/DM2NB9l/dDiUqiuaSipPHELW2zFHG9uvnVnB8lTwsJ8pnP2n4zWdxfqf
|
||||
IkEm6mZ6yp+uNaLPO4RiqjwPirSNqharqUSxRYtIFwlcpoCQcW00B55vMiawZX2G
|
||||
Eq/5/Q==
|
||||
=HBWf
|
||||
-----END PGP PRIVATE KEY BLOCK-----`;
|
||||
|
||||
const ALICE_PUBLIC = `-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: Keybase OpenPGP v2.0.77
|
||||
Version: Keybase OpenPGP v2.1.17
|
||||
Comment: https://keybase.io/crypto
|
||||
|
||||
xo0EWw1piwEEAL2ueaNPMssEJ7LaCr26f5dc/Tz2w/cA42FKK90mUkQRaO3332iD
|
||||
y8zXxNwSTWzHIi2n8YuUT9PvQ08UC91VcojQoNBn1+bvskMqK2XnzuelFqyk45cv
|
||||
XJRUUZWvhgQ8MugBPg8mDAjdOwQF8sZ45moGp3+y3D8UqOs1kktFh+OdABEBAAHN
|
||||
AMK0BBMBCgAeBQJbDWmLAhsvAwsJBwMVCggCHgECF4ADFgIBAhkBAAoJEIQkZUjf
|
||||
mOSF4+UD/AmZ7Nc5VpO0t+w4b8XtytxGFYHn3PhA1rI98b5aPkFCkDAJgDRTZ6mM
|
||||
7fvpr3FYbxs8p/sGtuOHyW98RmAIvhuGGuaVkG10swFYY7Xh8i3I0ulWf8ncQxgm
|
||||
St+xnDGLP/MeJMHVPgPP20ISfp0VRCY5INDnKB/ayb9JAfopXAuyzo0EWw1piwEE
|
||||
AOXOJib0QIvuqKAZiN3Yol3xC9Wz5aXQyg7qCnnYHHrPIMgYvGrTjjvDFCwM5uxC
|
||||
v38Qd6rJnzrRXTC1EiAia/b7f76Z0r4W+j6KdVCGpQnVQE6b//WdY5ys1xLAkNr4
|
||||
xwNj42nrOIMGB1qV0XezJ4VBOMpMHlwE2WR27HOQakXDABEBAAHCwIMEGAEKAA8F
|
||||
AlsNaYsFCQ8JnAACGy4AqAkQhCRlSN+Y5IWdIAQZAQoABgUCWw1piwAKCRA+2VNA
|
||||
UiMLOuO9BACHIaNnbMMzHJcDegSgPdF+M9C0BgU8nmLT+Kv8UPadfv/9zJ3zMlLb
|
||||
g/pL34gPy8HSf4nAXoqu+Oqkyd5dds+aLk55uoyiAtqFaaEK2OuIMqt8kmIvQeZM
|
||||
oaXz2nZnn14GgtubgmmTWsvsSaiJuyZRl0FS61/S3Dki6xd38Hmw3CF2BACsHPId
|
||||
UgXI3596BMT1xHrvsz3Y2NiGpjxz58X8BX7tdC/RWyL0H/8d5MwKaXqPK3F1IhkG
|
||||
Xu4utqwg53QUmT5U/tSs58NrPqhWr61qtK0B6V+pP0NFBfD6cR16zhvEOw++LU6J
|
||||
5O17ElE7XzXN2yY66S/ZGGCsnMUJynMCRRgaqM6NBFsNaYsBBACwyhti+jTYU12d
|
||||
zCSS1bRDw+uXPSpk/A2oCVwqdHJd20G3LPsy5rH2MJyCjUzsZ4cQBEfuXuo5luCu
|
||||
7Gy2Ofd6zoqg111/DkdvLfPCBo5SK1XftrevpmuXnEoLMlagQxRU6QM4PkBVnZNl
|
||||
RDpQOczXwnV/eKS1DIzwwB0rGX67nwARAQABwsCDBBgBCgAPBQJbDWmLBQkDwmcA
|
||||
AhsuAKgJEIQkZUjfmOSFnSAEGQEKAAYFAlsNaYsACgkQW/Z2teklb4u5/gP/fnZ7
|
||||
ZuV+l4c2EQY5Xnk8S/lY3Xr9zoucjQwQWeRKwAQYoiovzxA4XV8gGyrdAsrIPUFL
|
||||
p7PmUBG4YJV/7sVozzRwVq+jS8Jo0xYbGJMv2DuAnXXrYCZWZRqRscr1Wlc+CUAC
|
||||
mxYZjC1DVVrAXr0jTqYTk+jjhemTTAtUelgMhcX82wP9EEU66hCYFUayjn4bBlR1
|
||||
yEvMpJd8JSTHR/dZH8t3Ri6R2AYRqBxro0JEXDhL9iDnuPQVxsbgq2YlhHrPJI8o
|
||||
pKuxV7wrXrupzwFfKixJMNwsAPk/nSc4qIZvXTi2fmyAZDJYUgsm6CwkxumaVvId
|
||||
VNGRmxqGSRTuEIntW03Cwfs=
|
||||
=PuGL
|
||||
xo0EahcezQEEAMHouiP41c1AGBU0IO0VjE2+O9WKc8Cpbv+ymy+MI6EOsiSoZ/Z+
|
||||
hjqyMumx1loeH4K0QClzcWfeAtKrXs8JjQonByKtuneRjITNnasCEmWmqZbea5qa
|
||||
p9+s6A6m+VHUehrtIvipNaq/Bfrynk9RwRMoAoTYJBUyPWaSLzzaV0zNABEBAAHN
|
||||
AMK0BBMBCgAeBQJqFx7NAhsvAwsJBwMVCggCHgECF4ADFgIBAhkBAAoJEBt1IEsq
|
||||
342M/VsEALQX4Lc7Udc9Obc5AnxABhzDZnCaFHYeZFJwyWtHpIN60gGFkz9vePji
|
||||
0DP1Kbeyo6awzUIzA8tuIGgZXQCJ04KPCP8dSXH0HpbrmSinuJW5kk+ttvaJxOm1
|
||||
3m9e52i2WkomCP6i8gvMXm/VpH5kfLkbpl0ha0ycR7z8yweD4Mdpzo0EahcezQEE
|
||||
AKjU543TxZbzZiae6XWFIXjFgWE/vBC+5ZYEyTAG6jtwfP4tgagb+chJG+hoFA9H
|
||||
ZXXPr5CPiNZUW6aPpbaMRmubIZs7uCpw3RfcZ+AR+Q9unf0kCJxXThRBhhWHipaL
|
||||
B44MweCueUawRjwnJVog9nIEE1Heg5G9/fHemLZJ7iU/ABEBAAHCwIMEGAEKAA8F
|
||||
AmoXHs0FCQ8JnAACGy4AqAkQG3UgSyrfjYydIAQZAQoABgUCahcezQAKCRA5/CQI
|
||||
qiKa+krFA/9Tnl0E4Ck9zR6BYKAQFpShzBnpODx28LDn/yH+20e1vt2Hgb5cerfM
|
||||
87PzIdLbavS5OYNtAVPtCc9a4WA3lQFggziOKVNt5UtsI9hNe8KfMAXpBEtXU53C
|
||||
sRKkWzi+rBlSZ9/Oh4jqsUcj0cceJRn9La71h3Kot8cxNl72zyIHK4y2A/4jNAej
|
||||
Mx0Rc0VSUWnHD9vlO/imzkez7+JKIYkMm8LrG1ZeLaSlTaQ0AIpbr2+3/kMuWhM0
|
||||
dU4BHtmjjNU5ijq7/+ZBG+O2bO+vlYmDpOL6j+dkRpQgvsJdoLBt14mQbxBJfVTm
|
||||
XvfhTUPZT4nCZN+5nUNAF2XsDatMic+Yjki7Ps6NBGoXHs0BBADEJr0pscgaUine
|
||||
6UW2M0zQ57UybQphUYv4xYeZwOG1NvNLK6jcxQ9NGIlhUhJ/hV4piYy4A4bt7/Vy
|
||||
O+CgSDWXf7kc8YL1tve9k9KIMceAT60Wt7QnHSSooysH5zRtE/Zqzc9luD9iWNGU
|
||||
dKSAveJ5tJoPBJBB8cAsqWr8ZqP5qQARAQABwsCDBBgBCgAPBQJqFx7NBQkDwmcA
|
||||
AhsuAKgJEBt1IEsq342MnSAEGQEKAAYFAmoXHs0ACgkQjWbXIJgXR6SYaQP+PjA9
|
||||
SI4z/bbROkoNv73VCWM4o9r0DMASHK2Dyd71vOoOFjM/GtpGgQvjAKB82Db7+wsG
|
||||
T6V6bxpvY1sMOxCjphsLs2u2IvZLHqlc/v8CCXLHoiN3v6PVwkYG17UyZoDbCVt3
|
||||
0SCZ5jJ7gCf+MpC9RseIteW5MtbFtKb6FwGgi9GNQQQAr4PFi8aXZ71lmB7/c/8f
|
||||
XAzsWRto9v64xtlZwpQ5GSOPvwzNjQfZf3Q4lKormkoqTxxC1tsxRxvbr51ZwfJU
|
||||
8LCfKZz9p+M1ncX6nyJBJupmesqfrjWizzuEYqo8D4q0jaoWq6lEsUWLSBcJXKaA
|
||||
kHFtNAeebzImsGV9hhKv+f0=
|
||||
=IODM
|
||||
-----END PGP PUBLIC KEY BLOCK-----`;
|
||||
|
||||
// ECC-384
|
||||
const BOB_PRIVATE = `-----BEGIN PGP PRIVATE KEY BLOCK-----
|
||||
Version: Keybase OpenPGP v2.0.77
|
||||
Version: Keybase OpenPGP v2.1.17
|
||||
Comment: https://keybase.io/crypto
|
||||
|
||||
xcAABFsNafYBAYDHiv+tCi4267xI6iTmBrhOKdNbKLWIYMG1OoE1f9qpT+nAVKFR
|
||||
zUAFXKqQjqMDESkAEQEAAQABewd7cLkIQHGKly8PE+P0h7fV7X5bJqwZiqDwC8DU
|
||||
38vCUO/KtkZO3jEQYA1U9DsNDQDA73KCr3K1tSX1afeWzb8vVBY4ZzXocKb9AMDV
|
||||
Vk17t1N4nClMfqpGIDELtYBMiiCDyJ0AwLsnQb9cE+g1MZETtNDYXXxilkO/4CP9
|
||||
8j4HzQDCZAQTAQoAHgUCWw1p9gIbLwMLCQcDFQoIAh4BAheAAxYCAQIZAQAKCRCE
|
||||
cIHWt/IPg+sqAYC6goCyOCYD/DytOW3I2cb12iDyFOSDsOx6lrmIgLyP0dDnbJHb
|
||||
S9ar68yuHeDqP7jHiARbDWn2AQEAwSE4qpbLQzSIUfwmfWXmHneAuQIkEYawRxK/
|
||||
H1JkGxcAEQEAAQAA/0pvbnK5OdBGMABBSehs3LrW/hWWIL0y/MfS7h/6gSJ5AID3
|
||||
YOgHLqEgM1Bo2TzvIjwlAIDH3E+0ynQFdLH96FPp47eLAH9e/NZ74e2N8sTMBoYO
|
||||
1sbcLp7CkwQYAQoADwUCWw1p9gUJDwmcAAIbLgBICRCEcIHWt/IPgz0gBBkBCgAG
|
||||
BQJbDWn2AAoJELU8cYHhYcru2lwBAL4OUK2fkhzh2VU3meXgAMWjoP6ryRUCTmSQ
|
||||
xuULvvCyfZMBfiHzV5QLgXSUVUA7Og6mlH5pw2gtgsZhijwwywkzF3tQ+s++hOZR
|
||||
161wHxQKgwHIU8eIBFsNafYBAQCjOV/I3a0HkXVtLndCrWFcjmLzim9PX8EpYUV3
|
||||
yG2/AQARAQABAAD8DBWPVduzl7/ZJcAu7CzR7F376NxG8J42+ioX12n9cNEAgNj7
|
||||
qAcnQCtTDlb1waf4mdcAgMCTCuwur8AqIOSjoOzqwucAf1MfeKXhwNAEtoiD7S44
|
||||
f8UvxsKTBBgBCgAPBQJbDWn2BQkDwmcAAhsuAEgJEIRwgda38g+DPSAEGQEKAAYF
|
||||
AlsNafYACgkQNBtaoVz6VrvTVAD+LD063VrU7vlJ7xQwtMun4G3FW+RKgb7Rsww8
|
||||
B1mt68F5dQGAm8ctxECzEMmyO8jSkjOLkG6u8zLQWFm9MBZqcdmt6EUDf1dA/3xu
|
||||
/y59qEGb0j4w
|
||||
=I/Gz
|
||||
xaQEahclbRMFK4EEACIDAwSvC1SlbUU7/QJFldLQGfAeyhu0mRvTIcxzANM9SdkI
|
||||
dS2ArnVOZCB7cnfj5AF1nAjphKCv+01LAkGpCF6dUrvDwDeicMaq+E1OPVc+G0bH
|
||||
O4qQwJgyRLV/GNUZ0ASSmNYAAYCxPV5eRqoX/13vQ38EFBDqWVQE5BuIvvFqNI2R
|
||||
2RW7hAyI8AWazxDF90gurec8mWYXJM0AwpYEExMKAB4FAmoXJW0CGy8DCwkHAxUK
|
||||
CAIeAQIXgAMWAgECGQEACgkQXd9oo/PqkifstAF+KMP1xACDyAqsoZjzmOdD03+r
|
||||
qaHk3EDO7J98qA+g3laUj/bx21IM8FJNEJHKs9TpAYD8LpHAGHmDuBKZDCZKabIS
|
||||
avxAOuoEHOOu9GlGk+8LgftPLW3EYUf/R7m4mGIq1UzHdwRqFyVtEwgqhkjOPQMB
|
||||
BwIDBGf0GrkZYEH+SU15lkMjYcHndaqwYbF+JPgUVc6ZiQYDkaY2uodq+n82HoNr
|
||||
zsCvKJxzC9upm8qzOwFHL+C7UvoAAP9MeWPmsuLSLXq+cVeqoEHAFQ/VYTBL/N7A
|
||||
XeiiDdUbKBFmwsAnBBgTCgAPBQJqFyVtBQkPCZwAAhsCAGoJEF3faKPz6pInXyAE
|
||||
GRMKAAYFAmoXJW0ACgkQVQZtQ9p5kJtfDQD+Ns1eh7rEAXveFSOLhx7Vw/5kUWm8
|
||||
wVWbqWDK5tJTF5EA/2+3jIQfg+/pE+VkO/NuIGQ9bUqGmGuX0s14TcjqDm9LNugB
|
||||
f27462A7iEkTab0nOQXtd6+L3PeHRUPUT1CFq+74M5GABr0wobJ5CCaQNxQH++IK
|
||||
vwF+MSD0JajEVgi99qzSQOTZe8UGArddSCIJuUxNwEzaxvT6DombpLJ2O4yYklR/
|
||||
xwoJx3sEahclbRIIKoZIzj0DAQcCAwRjn9T4UunA8a8ZuWP31AJheebCAcPFWBGx
|
||||
dkxFeX65heVpMipOZ97EczRkitfAmiwt7cREq6yhvZ42KMOcZHPIAwEKCQABAFwA
|
||||
UyvBBcchnSFCguG8EbEeA+DFKS62fvhqMHyMLGtfDUvChwQYEwoADwUCahclbQUJ
|
||||
A8JnAAIbDAAKCRBd32ij8+qSJ1+sAX4wkp3GZiRAtUZujC3bJ0ukYJjieNHFapA6
|
||||
r+0ku3mR/9OFDbVaTPEcL7nhgGY94q8BfRvczdClIK0rdY/bopQDq4uERoiB/bsH
|
||||
1VFadIEvMZeIppWGb8d93IpZErGT9xQI8A==
|
||||
=XC/n
|
||||
-----END PGP PRIVATE KEY BLOCK-----`;
|
||||
|
||||
const BOB_PUBLIC = `-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: Keybase OpenPGP v2.0.77
|
||||
Version: Keybase OpenPGP v2.1.17
|
||||
Comment: https://keybase.io/crypto
|
||||
|
||||
xj0EWw1p9gEBgMeK/60KLjbrvEjqJOYGuE4p01sotYhgwbU6gTV/2qlP6cBUoVHN
|
||||
QAVcqpCOowMRKQARAQABzQDCZAQTAQoAHgUCWw1p9gIbLwMLCQcDFQoIAh4BAheA
|
||||
AxYCAQIZAQAKCRCEcIHWt/IPg+sqAYC6goCyOCYD/DytOW3I2cb12iDyFOSDsOx6
|
||||
lrmIgLyP0dDnbJHbS9ar68yuHeDqP7jOLQRbDWn2AQEAwSE4qpbLQzSIUfwmfWXm
|
||||
HneAuQIkEYawRxK/H1JkGxcAEQEAAcKTBBgBCgAPBQJbDWn2BQkPCZwAAhsuAEgJ
|
||||
EIRwgda38g+DPSAEGQEKAAYFAlsNafYACgkQtTxxgeFhyu7aXAEAvg5QrZ+SHOHZ
|
||||
VTeZ5eAAxaOg/qvJFQJOZJDG5Qu+8LJ9kwF+IfNXlAuBdJRVQDs6DqaUfmnDaC2C
|
||||
xmGKPDDLCTMXe1D6z76E5lHXrXAfFAqDAchTzi0EWw1p9gEBAKM5X8jdrQeRdW0u
|
||||
d0KtYVyOYvOKb09fwSlhRXfIbb8BABEBAAHCkwQYAQoADwUCWw1p9gUJA8JnAAIb
|
||||
LgBICRCEcIHWt/IPgz0gBBkBCgAGBQJbDWn2AAoJEDQbWqFc+la701QA/iw9Ot1a
|
||||
1O75Se8UMLTLp+BtxVvkSoG+0bMMPAdZrevBeXUBgJvHLcRAsxDJsjvI0pIzi5Bu
|
||||
rvMy0FhZvTAWanHZrehFA39XQP98bv8ufahBm9I+MA==
|
||||
=K9ht
|
||||
xm8EahclbRMFK4EEACIDAwSvC1SlbUU7/QJFldLQGfAeyhu0mRvTIcxzANM9SdkI
|
||||
dS2ArnVOZCB7cnfj5AF1nAjphKCv+01LAkGpCF6dUrvDwDeicMaq+E1OPVc+G0bH
|
||||
O4qQwJgyRLV/GNUZ0ASSmNbNAMKWBBMTCgAeBQJqFyVtAhsvAwsJBwMVCggCHgEC
|
||||
F4ADFgIBAhkBAAoJEF3faKPz6pIn7LQBfijD9cQAg8gKrKGY85jnQ9N/q6mh5NxA
|
||||
zuyffKgPoN5WlI/28dtSDPBSTRCRyrPU6QGA/C6RwBh5g7gSmQwmSmmyEmr8QDrq
|
||||
BBzjrvRpRpPvC4H7Ty1txGFH/0e5uJhiKtVMzlIEahclbRMIKoZIzj0DAQcCAwRn
|
||||
9Bq5GWBB/klNeZZDI2HB53WqsGGxfiT4FFXOmYkGA5GmNrqHavp/Nh6Da87Aryic
|
||||
cwvbqZvKszsBRy/gu1L6wsAnBBgTCgAPBQJqFyVtBQkPCZwAAhsCAGoJEF3faKPz
|
||||
6pInXyAEGRMKAAYFAmoXJW0ACgkQVQZtQ9p5kJtfDQD+Ns1eh7rEAXveFSOLhx7V
|
||||
w/5kUWm8wVWbqWDK5tJTF5EA/2+3jIQfg+/pE+VkO/NuIGQ9bUqGmGuX0s14Tcjq
|
||||
Dm9LNugBf27462A7iEkTab0nOQXtd6+L3PeHRUPUT1CFq+74M5GABr0wobJ5CCaQ
|
||||
NxQH++IKvwF+MSD0JajEVgi99qzSQOTZe8UGArddSCIJuUxNwEzaxvT6DombpLJ2
|
||||
O4yYklR/xwoJzlYEahclbRIIKoZIzj0DAQcCAwRjn9T4UunA8a8ZuWP31AJheebC
|
||||
AcPFWBGxdkxFeX65heVpMipOZ97EczRkitfAmiwt7cREq6yhvZ42KMOcZHPIAwEK
|
||||
CcKHBBgTCgAPBQJqFyVtBQkDwmcAAhsMAAoJEF3faKPz6pInX6wBfjCSncZmJEC1
|
||||
Rm6MLdsnS6RgmOJ40cVqkDqv7SS7eZH/04UNtVpM8RwvueGAZj3irwF9G9zN0KUg
|
||||
rSt1j9uilAOri4RGiIH9uwfVUVp0gS8xl4imlYZvx33cilkSsZP3FAjw
|
||||
=BHOx
|
||||
-----END PGP PUBLIC KEY BLOCK-----`;
|
||||
|
||||
TestRegister.addTests([
|
||||
@ -205,29 +211,46 @@ TestRegister.addTests([
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "PGP Sign/Verify: RSA, All bytes",
|
||||
input: ALL_BYTES,
|
||||
expectedMatch: /Signed by PGP key ID: 2ADF8D8C\nPGP fingerprint: 7afe93ff7614167c3fe831fe1b75204b2adf8d8c\nSigned on .*\n----------------------------------\n/,
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "PGP Sign",
|
||||
"args": [ALICE_PRIVATE, ""]
|
||||
},
|
||||
{
|
||||
"op": "PGP Verify",
|
||||
"args": [ALICE_PUBLIC]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "PGP Decrypt and Verify: UTF8, Alice -> Bob",
|
||||
input: `-----BEGIN PGP MESSAGE-----
|
||||
Version: Keybase OpenPGP v2.0.77
|
||||
Version: Keybase OpenPGP v2.1.17
|
||||
Comment: https://keybase.io/crypto
|
||||
|
||||
wTwDhHCB1rfyD4MBAX9ld8xGcf2v+X+pwINN0R0TvkWxNesKOQIKPV01AH8JG0J+
|
||||
+yFqLXqDHgYSLANNamfSwQoBOTWuh/5V6gpiXVm2oLHPv997AtoD/kVQrqylF5Xo
|
||||
HUsqPGtSgBA5WPX8tMoHKuqWxEy9FviLnIv73OZN0Ph70uo2E+QIv0Qx27znK0Jy
|
||||
KDSERvcldgShmVbDP3Pxtxkfr9xa2gar5f0OPovOmKGsTGciQJqPkclRwzIXg12L
|
||||
hyd2ElYOMf6vg/yOc06sX4Ih1Tn6JkYqMVJydykMv3g4Z8OXTfwrMLxwO1n3ZB/T
|
||||
OLdhBdsnREnyCqntBVjMKoRTQhfwq48n7b6caZ+aCPISdDIyDKBpxEzXaNBeEY2V
|
||||
GCqORM9WhsQ4A6pAx2SP694qH5vgOwrYrgeOU17oK++mzd1GyU2CXoFi73/PANJD
|
||||
TdC3hGr+S4XeuqZ368QG1cBWhNybsOu5sM2YbArb71ZMYuLDp+VolJbEkVf4c/dD
|
||||
pVEOaX39NVKe6HcpOiw+CFO6GEkQqCXNprWK6ivBHzkAlF2pjjqlS6qhWxFPicSD
|
||||
+1ZKM1fmZu99bhTmdqE3MJx//QMu7mvlHaM85OQkWhWPBxGw/60GVBX9YtvUtfMS
|
||||
IOE1W/Zqmqzq+4frwnzWwYv9/U1RwIs/qlFVnzliREOzW+om8EncSSd7fQ==
|
||||
=fEAT
|
||||
wX4DEY2FMRPYAl0SAgMEKY2yuB8s16oRWWhJ1RsxNhR8byKFUyFZvi0ETIORMYu+
|
||||
kkLWgFlVjqPV9q2eVtuVK9f+S/OIm0pztImhq5ZNMDB8r7s0wX4YskSrWRpMKwRr
|
||||
CtoNlPS3//fT3Ll4a2tn8guxyC7lAtmJ6nxZj+qpSZLSwQwBhFlgARdqlp4eTAhF
|
||||
PRcqHVCqZYSTdjAyerLtfZDaswEwLgGxsshRSJ7BDHxg7NqRcdFkChrWT0s4JpnV
|
||||
/Woq0xcApim1bpyHXG/tT4oM3hbjfpulb92gq2TUNdzb9lJGaKbLHl/0zkoBvHDE
|
||||
pxtr021JXERB8MNDIIpDESpjCrZ20YCHNr/sBqVm0yM7YGrDLlV+n7oUgL4HK2FU
|
||||
tehxUEt4rca81UesYu/Wul6mHh/7Ft4jJuZuf/w9fCWQ6z+9MAEOBXdzWUp5BCyF
|
||||
ce1STpICAdtRHInJ9zR08qn0ahrwHsvHPFPVIQJDargD5MSqav/3LS2TYqKYYKHy
|
||||
TUCxIWqA77Qk3rEaFX+eHxTW4BTlMPArA7ffywkgJAPzrLL+gEgtOLCv2RhNZevR
|
||||
weglQRtcuh5N/F9fsmPfsi80R0//LpEeyFX6GueXDw81+AKG9pOTI71Ny8H4W0eA
|
||||
B5dCiOFNHZKCZUlA6GFa04X/XgmfPzTPMtgizbT72/2kfwxJGZY4ngdMVLqfhnVA
|
||||
nfyQLFrOF9giJqDEsjtPXJ0h20stMLMykPUIK0UUf9vPthE86ugCY1XcGQWsuB4U
|
||||
jmdH1dqEUk29TaUz/97s
|
||||
=Ah/0
|
||||
-----END PGP MESSAGE-----
|
||||
`,
|
||||
expectedOutput: `Signed by PGP key ID: DF98E485
|
||||
PGP fingerprint: e94e06dd0b3744a0e970de9d84246548df98e485
|
||||
Signed on Tue, 29 May 2018 15:44:52 GMT
|
||||
expectedOutput: `Signed by PGP key ID: 2ADF8D8C
|
||||
PGP fingerprint: 7afe93ff7614167c3fe831fe1b75204b2adf8d8c
|
||||
Signed on Wed, 27 May 2026 17:18:20 GMT
|
||||
----------------------------------
|
||||
${UTF8_TEXT}`,
|
||||
recipeConfig: [
|
||||
@ -238,19 +261,19 @@ ${UTF8_TEXT}`,
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "PGP Decrypt: ASCII, Alice -> Bob",
|
||||
name: "PGP Decrypt: ASCII, Alice",
|
||||
input: `-----BEGIN PGP MESSAGE-----
|
||||
Version: Keybase OpenPGP v2.0.77
|
||||
Version: Keybase OpenPGP v2.1.17
|
||||
Comment: https://keybase.io/crypto
|
||||
|
||||
wYwDPtlTQFIjCzoBBACSlbN7tmQVxR5ZD0rvCwXUkxO3RU8WgBkkmrTCUs9a+xrS
|
||||
F9HuKcpX/N6XrwTXyuX3BN2tGys4zd6nHV8jYqBoIyWJsWe3viTa1dh/x4183+GP
|
||||
fP61gizi3pj0gi2vfGnMhnThbdiO32PVKAeHLHBK+r3XlXZ0kzZCQKRgd55yr9Kk
|
||||
Aa4SR+qpvtdobkDzbnbhcPLR6CQ8TMjTiNXEpgTc1i0JcP8jaMVFzBt8qgmDMdqU
|
||||
H2qMY1O7hezH3fp+EZzCAccJMtK7VPk13WAgMRH22HirG4aK1i75IVOtjBgObzDh
|
||||
8zKua7QLi6wJD/AtQ+D3/NgVpzoXwdoLvTjEcAyy+YWNWkJF/jvx3XV1Q/Fz7sHJ
|
||||
/bspORYvbi591S4U0m4pikwiOZk=
|
||||
=AVb/
|
||||
wYwDOfwkCKoimvoBA/98ONH8b+HoaDOVLhtF+9Pz5Sk/NZ43htOpm/3+b2B81GKZ
|
||||
fcUfJYzItyt4X5Ps1ksfrArokG6blkIHPwZdcF7TJ9rWy/cC9S3zP/LF893xT9Z7
|
||||
buWj1BjqfNy15WtGJnnQeCJVI4ya0cb3G/I/zAF/mT6R/JcldbJ1OTz9Zy5pZtKi
|
||||
AQL7B8IscCxsx9jxc1ZR3swn+fr603BVP6/mXRRtKIa5DXZR5uMU9ChZ5AYQeHXe
|
||||
ZzstlcSJWJvuF+uJy3Yc07ttzqQtOQGLh0iBeALK7BWqLsUBqKabZSHTZ4uFdkv9
|
||||
86ZebPsfjVlhz4oFYenBUq1C15Zpvut28pHpgh2TLuXPHKkmTwI2Zz9LvVRjBW7A
|
||||
rmDPrpTfy9MOrkjkY7zQSevi
|
||||
=/Zwh
|
||||
-----END PGP MESSAGE-----`,
|
||||
expectedOutput: ASCII_TEXT,
|
||||
recipeConfig: [
|
||||
@ -262,21 +285,22 @@ H2qMY1O7hezH3fp+EZzCAccJMtK7VPk13WAgMRH22HirG4aK1i75IVOtjBgObzDh
|
||||
},
|
||||
{
|
||||
name: "PGP Verify: ASCII, Alice",
|
||||
input: `-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA256
|
||||
input: `-----BEGIN PGP MESSAGE-----
|
||||
Version: Keybase OpenPGP v2.1.17
|
||||
Comment: https://keybase.io/crypto
|
||||
|
||||
A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iLMEAQEIAB0WIQRLbJy6MLpYOr9qojE+2VNAUiMLOgUCXRTsvwAKCRA+2VNAUiML
|
||||
OuaHBADMMNtsuN92Fb+UrDimsv6TDQpbJhDkwp9kZdKYP5HAmSYAhXBG7N+YCMw+
|
||||
v2FSpUu9jJiPBm1K1SEwLufQVexoRv6RsBNolRFB07sArau0s0DnIXUchCZWvyTP
|
||||
1KsjBnDr84U2b11H58g4DlTT4gQrz30rFuHz9AGmPAtDHbSXIA==
|
||||
=vnk/
|
||||
-----END PGP SIGNATURE-----`,
|
||||
expectedOutput: `Signed by PGP key ID: DF98E485
|
||||
PGP fingerprint: e94e06dd0b3744a0e970de9d84246548df98e485
|
||||
Signed on Thu, 27 Jun 2019 16:20:15 GMT
|
||||
yMB1AnicO8LLzMDFaPlHhWOV0qxfjKcnljJkiTsIOiok5+fm5ucp5GYWlyRmpyqU
|
||||
ZCSWKBSk5hfkpCrkggTKM1LzFEqKKjPz0hVK8hVSUosz0/MUivNzU0syQGJA/UC1
|
||||
Jak5lQpp+fk5BUX5+WkKmcUgtaV5KalFqcUlmbmJJSCTUxWAGlLzSjNLKhWAimA6
|
||||
wfqK9Q7NYWFg5GJgY2UCOYyBi1MA5tqzj1kYZqaFSuxmUvBnvvAzZOOuyT9vnT75
|
||||
5GVzY2WfOB8H08l5vCZNbBUegsqPPh2aXPQgo8GglTPO2e7qY75g49mzDm+8POfH
|
||||
nstrb2/93JHrXD5fbcbuVrsFJ01XWE2Xy7HtTgrasGG7ySLZqLStBj2r0n4dTX7g
|
||||
MV1ETCdx6nqHA+4as4Oy9040BACRHYIP
|
||||
=rkte
|
||||
-----END PGP MESSAGE-----`,
|
||||
expectedOutput: `Signed by PGP key ID: 2ADF8D8C
|
||||
PGP fingerprint: 7afe93ff7614167c3fe831fe1b75204b2adf8d8c
|
||||
Signed on Wed, 27 May 2026 19:03:45 GMT
|
||||
----------------------------------
|
||||
A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.`,
|
||||
recipeConfig: [
|
||||
|
||||
@ -41,5 +41,16 @@ TestRegister.addTests([
|
||||
"args": ["Hex", "Text output"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse Ethernet frame escapes packet data HTML",
|
||||
input: "000000000000ffffffffffff08003c696d67207372633d78206f6e6572726f723d616c6572742831293e3c7363726970743e616c6572742832293c2f7363726970743e",
|
||||
expectedOutput: "<img src=x onerror=alert(1)><script>alert(2)</script>",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "Parse Ethernet frame",
|
||||
"args": ["Hex", "Packet data"]
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
||||
|
||||
34
tests/operations/tests/ParseIPv4Header.mjs
Normal file
34
tests/operations/tests/ParseIPv4Header.mjs
Normal file
@ -0,0 +1,34 @@
|
||||
/**
|
||||
* Parse IPv4 header tests.
|
||||
*
|
||||
* @author C85297 [95289555+C85297@users.noreply.github.com]
|
||||
* @copyright Crown Copyright 2026
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Parse IPv4 header: Correctly formatted HTML output",
|
||||
input: "45 00 00 3c 1c 46 40 00 40 06 b1 e6 c0 a8 00 01 c0 a8 00 02 3c 73 63 72 69 70 74 3e 61 6c 65 72 74 28 31 33 33 37 29 3c 2f 73 63 72 69 70 74 3e",
|
||||
expectedOutput: "<script>alert(1337)</script>",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Parse IPv4 header",
|
||||
args: ["Hex", "Data (raw)"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Parse IPv4 header: regression for Uint8Array.concat crash on truncated raw input",
|
||||
input: "\x45\x00\x00\x14\x00\x00\x00\x00\x40\x06\x00\x00",
|
||||
expectedOutput: "",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Parse IPv4 header",
|
||||
args: ["Raw", "Data (raw)"]
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
||||
@ -51,16 +51,16 @@ const OUT_CRL_PEM_RSA = `Certificate Revocation List (CRL):
|
||||
DirName:/C=UK/ST=London/O=BB/CN=Test Root CA
|
||||
serial:37:5D:4B:F6:BD:7C:11:7C:CC:46:1A:FF:D7:2F:2C:26:F8:1E:4B:3D
|
||||
X509v3 CRL Distribution Points:
|
||||
Full Name:
|
||||
URI:http://example.com/full-crl
|
||||
Full Name:
|
||||
URI:ldap://example.com/full-crl
|
||||
Full Name:
|
||||
IP:127.0.0.1
|
||||
Full Name:
|
||||
URI:http://example.com/full-crl
|
||||
Full Name:
|
||||
URI:ldap://example.com/full-crl
|
||||
Full Name:
|
||||
IP:127.0.0.1
|
||||
X509v3 CRL Number:
|
||||
1E3C
|
||||
issuerAltName:
|
||||
Unsupported CRL extension. Try openssl CLI.
|
||||
X509v3 Issuer Alternative Name:
|
||||
|
||||
Revoked Certificates:
|
||||
Serial Number: 1000
|
||||
Revocation Date: Sun, 25 Aug 2024 03:23:08 GMT
|
||||
@ -143,16 +143,16 @@ const OUT_CRL_PEM_RSA_CRL_REASON_AND_INVALIDITY_DATE = `Certificate Revocation L
|
||||
DirName:/C=UK/ST=London/O=BB/CN=Test Root CA
|
||||
serial:37:5D:4B:F6:BD:7C:11:7C:CC:46:1A:FF:D7:2F:2C:26:F8:1E:4B:3D
|
||||
X509v3 CRL Distribution Points:
|
||||
Full Name:
|
||||
URI:http://example.com/full-crl
|
||||
Full Name:
|
||||
URI:ldap://example.com/full-crl
|
||||
Full Name:
|
||||
IP:127.0.0.1
|
||||
Full Name:
|
||||
URI:http://example.com/full-crl
|
||||
Full Name:
|
||||
URI:ldap://example.com/full-crl
|
||||
Full Name:
|
||||
IP:127.0.0.1
|
||||
X509v3 CRL Number:
|
||||
1E3D
|
||||
issuerAltName:
|
||||
Unsupported CRL extension. Try openssl CLI.
|
||||
X509v3 Issuer Alternative Name:
|
||||
|
||||
Revoked Certificates:
|
||||
Serial Number: 1000
|
||||
Revocation Date: Sun, 25 Aug 2024 12:08:48 GMT
|
||||
|
||||
45
tests/operations/tests/ROR13.mjs
Normal file
45
tests/operations/tests/ROR13.mjs
Normal file
@ -0,0 +1,45 @@
|
||||
/**
|
||||
* ROR13 tests.
|
||||
*
|
||||
* @author fufu_btw [contact@fufu.red]
|
||||
* @copyright Crown Copyright 2026
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "ROR13: AddConsoleAliasW",
|
||||
input: "AddConsoleAliasW",
|
||||
expectedOutput: "0x9916128C",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROR13",
|
||||
args: []
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROR13 Hash: LoadLibraryA",
|
||||
input: "LoadLibraryA",
|
||||
expectedOutput: "0xEC0E4E8E",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROR13",
|
||||
args: []
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "ROR13 Hash: CloseHandle",
|
||||
input: "CloseHandle",
|
||||
expectedOutput: "0x0FFD97FB",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "ROR13",
|
||||
args: []
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
@ -59,6 +59,7 @@ TestRegister.addTests([
|
||||
"option": "Hex",
|
||||
"string": "$R0"
|
||||
},
|
||||
16,
|
||||
"CTR", "Hex", "Raw",
|
||||
{
|
||||
"option": "Hex",
|
||||
@ -67,7 +68,8 @@ TestRegister.addTests([
|
||||
{
|
||||
"option": "Hex",
|
||||
"string": ""
|
||||
}
|
||||
},
|
||||
"Off"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
62
tests/operations/tests/RemoveANSIEscapeCodes.mjs
Normal file
62
tests/operations/tests/RemoveANSIEscapeCodes.mjs
Normal file
@ -0,0 +1,62 @@
|
||||
/**
|
||||
* @author Louis-Ladd [lewisharshman1@gmail.com]
|
||||
* @copyright Crown Copyright 2025
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
"name": "Remove ANSI Escape Codes: text using x1b escape code",
|
||||
"input": "\x1b[31mHello, \x1b[31mWorld!",
|
||||
"expectedOutput": "Hello, World!",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Remove ANSI Escape Codes",
|
||||
"args": [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Remove ANSI Escape Codes: text with incomplete codes",
|
||||
"input": "\x1b[31 Hello, World!",
|
||||
"expectedOutput": "ello, World!",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Remove ANSI Escape Codes",
|
||||
"args": [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Remove ANSI Escape Codes: cursor commands and clear screen",
|
||||
"input": "\x1b[2J\x1b[H\x1b[3BHello, World!",
|
||||
"expectedOutput": "Hello, World!",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "Remove ANSI Escape Codes",
|
||||
"args": [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "Remove ANSI Escape Codes: text containing javascript escape representation of ansi escape codes",
|
||||
// input/output expressed in hex to avoid accidental interpretation of Javascript escapes and to make the test case explicit
|
||||
"input": "5c 30 33 33 5b 33 32 3b 31 3b 33 3b 34 3b 39 6d 48 65 6c 6c 6f 2c 20 5c 30 33 33 5b 33 32 3b 31 3b 33 3b 34 3b 39 6d 57 6f 72 6c 64 21",
|
||||
"expectedOutput": "5c 30 33 33 5b 33 32 3b 31 3b 33 3b 34 3b 39 6d 48 65 6c 6c 6f 2c 20 5c 30 33 33 5b 33 32 3b 31 3b 33 3b 34 3b 39 6d 57 6f 72 6c 64 21",
|
||||
"recipeConfig": [
|
||||
{
|
||||
"op": "From Hex",
|
||||
"args": ["Auto"]
|
||||
},
|
||||
{
|
||||
"op": "Remove ANSI Escape Codes",
|
||||
"args": []
|
||||
},
|
||||
{
|
||||
"op": "To Hex",
|
||||
"args": ["Space", 0]
|
||||
}
|
||||
],
|
||||
},
|
||||
]);
|
||||
Loading…
x
Reference in New Issue
Block a user