q-armor-cli 0.1.0__cp313-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
Binary file
q_armor_cli/main.pyc ADDED
Binary file
@@ -0,0 +1,105 @@
1
+ Metadata-Version: 2.5
2
+ Name: q-armor-cli
3
+ Version: 0.1.0
4
+ Summary: q-armor: the QArmor operator command line. Post-quantum posture of a TLS endpoint, the VQS of a validator, and the protection proxy.
5
+ License-Expression: LicenseRef-Proprietary
6
+ License-File: LICENSE
7
+ Requires-Python: >=3.11
8
+ Requires-Dist: q-armor-lib==0.1.0
9
+ Provides-Extra: proxy
10
+ Requires-Dist: q-armor-proxy==0.1.0; extra == 'proxy'
11
+ Requires-Dist: uvicorn>=0.29; extra == 'proxy'
12
+ Description-Content-Type: text/markdown
13
+
14
+ # q-armor-cli
15
+
16
+ **`q-armor`: post-quantum posture of any TLS endpoint, from your terminal, in one command.**
17
+
18
+ [![PyPI](https://img.shields.io/pypi/v/q-armor-cli.svg)](https://pypi.org/project/q-armor-cli/)
19
+ [![Python](https://img.shields.io/pypi/pyversions/q-armor-cli.svg)](https://pypi.org/project/q-armor-cli/)
20
+ [![Licence](https://img.shields.io/badge/licence-proprietary-1f6feb.svg)](https://idenq.io)
21
+
22
+ > The traffic your validator is emitting right now is being recorded by somebody who cannot read it yet. Harvest Now, Decrypt Later is the one attack you cannot respond to after the fact, because the copy was taken years before the key broke. The first useful question is simple: what is this endpoint actually negotiating?
23
+
24
+ ```bash
25
+ pip install q-armor-cli
26
+ q-armor scan example.com
27
+ ```
28
+
29
+ ```
30
+ hostname: example.com
31
+ port: 443
32
+ tls_version: TLSv1.3
33
+ cipher_suite: TLS_AES_256_GCM_SHA384
34
+ cert_key_type: rsa-2048
35
+ cert_issuer: DigiCert Inc
36
+ key_exchange_group: x25519
37
+ signing_algo: rsa
38
+ session_algo: x25519
39
+ vqs_score: 80
40
+ risk_tier: deny
41
+ consensus_weight_factor: 0.1
42
+ error: None
43
+ ```
44
+
45
+ `vqs_score` is **exposure**, so higher is worse. RSA signing and an x25519 key
46
+ exchange are both classical, both fall to Shor, and the consensus weight
47
+ factor is what that costs a validator: one tenth of its vote.
48
+
49
+ ## Three commands
50
+
51
+ ```
52
+ q-armor scan example.com # post-quantum posture of a TLS endpoint
53
+ q-armor vqs <validator-id> # a validator's VQS
54
+ q-armor proxy --port 8080 # start the protection proxy
55
+ ```
56
+
57
+ Add `--json` to any of them and pipe it into whatever you already run.
58
+
59
+ Three, and the list is not a matter of taste: `docs/priorities.md` (P1-11)
60
+ says that before writing a CLI you have to answer **what an operator asks
61
+ for**, "because a CLI without that case is surface to maintain".
62
+
63
+ ## What it will not do
64
+
65
+ - **It does not reimplement detection.** Every command consumes
66
+ [`q-armor-lib`](https://pypi.org/project/q-armor-lib/). A second scanner
67
+ here would be another producer of the `key_establishment_class` axis,
68
+ diverging in silence.
69
+ - **It does not let telemetry block your answer.** A `scan` reports what it
70
+ measured even if the border is down, misconfigured or refusing on consent
71
+ grounds. A command that failed because it could not report would be a
72
+ command that lies about what it has measured. `--no-telemetry` turns the
73
+ emission off outright.
74
+
75
+ ## Exit codes, so a script can tell the difference
76
+
77
+ | Code | Meaning |
78
+ |---|---|
79
+ | `0` | It measured the endpoint |
80
+ | `1` | Error |
81
+ | `2` | It could not observe the endpoint: that is a **finding**, not a broken command |
82
+ | `3` | `vqs` only: the local validator registry is not present |
83
+
84
+ Code 3 is repository-root code (`services/state/validator_store.py`) that no
85
+ wheel carries, so installed from PyPI the command says so by name with its own
86
+ code instead of dying with an ImportError. It works from a checkout, until the
87
+ registry moves to the platform's `POST /validators` (`docs/priorities.md`,
88
+ P1-13).
89
+
90
+ ## The QArmor family
91
+
92
+ Five packages, one version, published together from a single tag.
93
+
94
+ | Package | What it is |
95
+ |---|---|
96
+ | [`q-armor-lib`](https://pypi.org/project/q-armor-lib/) | Detection, scoring and the control-plane client |
97
+ | [`q-armor-cli`](https://pypi.org/project/q-armor-cli/) | This one: `q-armor`, the operator's command line |
98
+ | [`q-armor-proxy`](https://pypi.org/project/q-armor-proxy/) | Enterprise runtime: protection proxy, firewall, SIEM webhook |
99
+ | [`q-armor-chain`](https://pypi.org/project/q-armor-chain/) | DVN worker and `QArmorDVN.sol` |
100
+ | [`q-armor-pqc`](https://pypi.org/project/q-armor-pqc/) | Interim ML-DSA-65 primitive |
101
+
102
+ ## Next
103
+
104
+ Scanning is free. The collective canary network, real-time alerting and
105
+ on-premise deployment are the paid tiers: [idenq.io](https://idenq.io)
@@ -0,0 +1,8 @@
1
+ q_armor_cli-0.1.0.dist-info/METADATA,sha256=2gstxpTRQg60g5sh5ahs6ilVn31r76HgmWiyNowCfpA,4288
2
+ q_armor_cli-0.1.0.dist-info/WHEEL,sha256=-zTsoBF2cM-n6FfeRTSHkZua7m6FZrGuqBAbmTcK2jk,89
3
+ q_armor_cli-0.1.0.dist-info/entry_points.txt,sha256=tLaLxAHSQCREwJ0dJFRAOwQcqnpoy9RYxQIy9bAqzfU,50
4
+ q_armor_cli-0.1.0.dist-info/licenses/LICENSE,sha256=_hSpUliph3myKpSwc1d-P3Rea95W79Sb6LQ1QHZAqAQ,1205
5
+ q_armor_cli/__init__.pyc,sha256=p6nxRoMdIAC2KiPMq1LUMmQj20VIPvoOoRRHRiqWlz4,120
6
+ q_armor_cli/__main__.pyc,sha256=MQN8R2rkil7EehG54SPyua7lh0-pwV2QyHDrVLKw-J4,216
7
+ q_armor_cli/main.pyc,sha256=OlEZxWayETFyz0rfanlss64-NiVtpbefpD1wB-AGUqI,9578
8
+ q_armor_cli-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: cp313-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ q-armor = q_armor_cli.main:main
@@ -0,0 +1,23 @@
1
+ IdenQ Proprietary Licence
2
+
3
+ Copyright (c) 2025-2026 IdenQ. All rights reserved.
4
+
5
+ This software, its source code, its compiled forms and its documentation
6
+ (the "Software") are the confidential and proprietary property of IdenQ.
7
+
8
+ No licence, express or implied, is granted to any person or organisation to
9
+ use, copy, reproduce, modify, merge, publish, distribute, sublicense, sell,
10
+ reverse engineer, decompile or disassemble the Software, in whole or in part,
11
+ except under the terms of a separate written agreement signed by IdenQ. Any
12
+ such agreement governs the Software to the extent of its terms; everything it
13
+ does not grant remains reserved.
14
+
15
+ Access to the Software, including through a public package index or a
16
+ repository, does not by itself grant any right to it.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL IDENQ
21
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
22
+ CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.