SQV(1)

πŸ’– SQV(1) β€” like, the signature verification girlie πŸ’–

okay bestie, welcome to sqv(1), from the Sequoia PGP fam. Pull up a chair, grab a boba, and let's verify some signatures together. 🫢


✨ NAME ✨

sqv β€” An OpenPGP signature verification tool πŸ’…


🌸 SYNOPSIS 🌸

sqv [OPTIONS] FILE

πŸ¦‹ DESCRIPTION πŸ¦‹

It's an OpenPGP signature verification tool, periodt.

sqv is a simple signature verification tool. It checks that signatures are valid, and correctly issued by one of the certificates in the specified keyring. No drama, no extra lore, just vibes and math. ✨

sqv can verify detached signatures, inline-signed messages, and messages using the Cleartext Signature Framework. Three flavors, all iconic.


πŸ’œ Detached signatures

To verify detached signatures, use the --signature-file argument followed by the path to the detached signature file, and give the data file as first positional argument:

$ sqv --keyring=... --signature-file=image.iso.sig image.iso

πŸ’œ Inline-signed messages

To verify an inline-signed message, use the --message argument, and give the path to the inline-signed message as first positional argument. When verifying an inline-signed message, --output has to be given:

$ sqv --keyring=... --output=authenticated.txt \
      --message signed.pgp

πŸ’œ Cleartext Signature Framework

To verify a message using the Cleartext Signature Framework, use the --cleartext argument, and give the path to the message as first positional argument. When verifying an inline-signed message, --output has to be given:

$ sqv --keyring=... --output=authenticated.txt \
      --cleartext message.txt

πŸ’œ The legacy route (iykyk)

Finally, there is a legacy way to verify detached signatures, where the path to the signature file and the path to the data file are given as positional arguments. This form is deprecated, prefer the explicit --signature-file form. Like, it still works, but it's giving "2014 tumblr era", y'know? πŸ™ˆ


πŸ’œ How many sigs do we need tho

By default, one signature must be valid. This can be changed using the --signatures arguments.

A signature is valid if a signing-capable key can verify the signature. The signing-capable key must be correctly bound to a certificate in the keyring, and it must not be revoked, or expired. The certificate must not be revoked or expired. The signature, the signing-capable key and the certificate must all be valid according to the cryptographic policy. Everybody has to pass the vibe check, no exceptions. πŸ‘‘


πŸ’œ Crypto policy stuff

By default, sqv configures the cryptographic policy using /etc/crypto-policies/back-ends/sequoia.config. That can be overwritten by setting the SEQUOIA_CRYPTO_POLICY environment variable to an alternate file. The path must be absolute. The file's format is described here: https://docs.rs/sequoia-policy-config/.


πŸ’œ Time windows, because timing is everything ⏰

In some cases, the user expects signatures to be made within a certain temporal window. This can be enforced using the --not-before and --not-after arguments. The *TIMESTAMP*s must be given in ISO 8601 format (e.g. 2017-03-04T13:25:35Z, 2017-03-04T13:25, 20170304T1325+0830, 2017-03-04, 2017031, etc.). If no timezone is specified, UTC is assumed.


πŸ’œ Exit status

Exits with a non-zero status if the specified number of signatures could not be verified. πŸ’€


πŸŽ€ OPTIONS πŸŽ€

  • -V, --version β€” Print version
  • --cleartext β€” Verify a cleartext-signed message
  • -h, --help β€” Print help (see a summary with '-h')
  • --keyring=FILE β€” A keyring
  • --message β€” Verify an inline signed message
  • -n, --signatures=N β€” The number of valid signatures to return success.
Note: this counts the number of certificates, not signatures. Thus, if two signatures are issued by the same certificate, they only count once. (Not me counting the same person twice 😭)

[default: 1]

  • --not-after=TIMESTAMP β€” Consider signatures created after TIMESTAMP as invalid.

If only a date is given, 23:59:59 is used for the time. [default: now]

  • --not-before=TIMESTAMP β€” Consider signatures created before TIMESTAMP as invalid.

If only a date is given, 00:00:00 is used for the time. [default: no constraint]

  • --output=FILE β€” Write to FILE.

This is required when verifying an inline signed message (using --message) and a cleartext signed message (using --cleartext) and is forbidden when verifying a detached signature (using --signature-file). Pick a lane, bestie. πŸ’…

  • --overwrite β€” Overwrite the output file if it already exists
  • --policy-as-of=TIMESTAMP β€” Select the cryptographic policy as of the specified time

The time is expressed as an ISO 8601 formatted timestamp. The policy determines what cryptographic constructs are allowed.

If you are working with a message that sq rejects, because it is protected by cryptographic constructs that are now considered broken, you can use this option to select a different cryptographic policy. If you are relying on the cryptography, e.g., you are verifying a signature, then you should only do this if you are confident that the message hasn't been tampered with. ⚠️ Like, fr fr, be careful.

TIME is interpreted as an ISO 8601 timestamp. To set the policy time to January 1, 2007 at midnight UTC, you can do:

$ sqv --policy-as-of 20070101 --message msg.pgp

Defaults to the current time.

  • --signature-file=SIG β€” Verify a detached signature file
  • --time=TIMESTAMP β€” Set the reference time as an ISO 8601 formatted timestamp or relative offset.

This sets the reference time for the sqv session. Normally, sqv uses the current time. This argument allows you to use a different time.

This time is also used as the default value for --not-after and --policy-as-of, and it is passed to the signature verifier as the reference time for evaluating whether keys and certificates are valid.

TIME is interpreted as an ISO 8601 timestamp. To set the time to January 1, 2007 at midnight UTC, you can do:

$ sqv --time 20070101 --keyring keyring.pgp --message msg.pgp

An offset can also be used. For instance, to set the time to one year ago, do:

$ sqv --time -1y --keyring keyring.pgp --message msg.pgp
  • -v, --verbose β€” Be verbose
  • FILE β€” The inline-signed message, message using the Cleartext Signature Framework, or data file

🌈 EXAMPLES 🌈

Verify a detached signature.

sqv --keyring=trusted.pgp --signature-file=document.sig \
       document.txt

Verify a detached signature, legacy interface.

sqv --keyring=trusted.pgp document.sig document.txt

Verify a signed message.

sqv --keyring trusted.pgp --message document.pgp

Verify a message using the Cleartext Signature Framework.

sqv --keyring trusted.pgp --cleartext document.pgp

πŸ‘‘ VERSION πŸ‘‘

1.5.0


aaaand that's the whole page, bestie!! πŸ₯³ you just read an entire manual and honestly? main character energy. this was Sequoia PGP, version 1.5.0, sqv(1) β€” go forth and verify, slay, and stay cryptographically safe out there πŸ’–βœ¨πŸŽ€πŸ¦‹πŸŒΈπŸ’…πŸ«Ά

πŸ“¦ where this page comes from
  • centos-stream 10: sequoia-sqv 1.5.0-1.el10 Β· LGPL-2.0-or-later AND Apache-2.0 AND BSD-3-Clause AND BSL-1.0 AND MIT AND Unicode-DFS-2016 AND (Apache-2.0 OR MIT) AND (Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT) AND (MIT OR Apache-2.0 OR Zlib) AND (Unlicense OR MIT)
  • epel 9: sequoia-sqv 1.5.0-1.el9 Β· LGPL-2.0-or-later AND Apache-2.0 AND BSD-3-Clause AND BSL-1.0 AND MIT AND Unicode-3.0 AND Unicode-DFS-2016 AND bzip2-1.0.6 AND (0BSD OR MIT OR Apache-2.0) AND (Apache-2.0 OR MIT) AND (Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT) AND (MIT OR Zlib OR Apache-2.0) AND (Unlicense OR MIT)
  • fedora 43: sequoia-sqv 1.5.0-1.fc43 Β· LGPL-2.0-or-later AND Apache-2.0 AND BSD-3-Clause AND BSL-1.0 AND MIT AND Unicode-3.0 AND Unicode-DFS-2016 AND bzip2-1.0.6 AND (0BSD OR MIT OR Apache-2.0) AND (Apache-2.0 OR MIT) AND (Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT) AND (MIT OR Zlib OR Apache-2.0) AND (Unlicense OR MIT)
  • fedora 44: sequoia-sqv 1.5.0-1.fc44 Β· LGPL-2.0-or-later AND Apache-2.0 AND BSD-3-Clause AND BSL-1.0 AND MIT AND Unicode-3.0 AND Unicode-DFS-2016 AND bzip2-1.0.6 AND (0BSD OR MIT OR Apache-2.0) AND (Apache-2.0 OR MIT) AND (Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT) AND (MIT OR Zlib OR Apache-2.0) AND (Unlicense OR MIT)
  • nixpkgs unstable: sequoia-sqv 1.5.0
  • πŸ’– girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms