Add security ontology. This is used by mastodon for instance, and to identify the key of actors that are going to sign server-to-server messages.
http-signature/ontology.scm unknown status 1
1 | + | ;;;; Copyright (C) 2020 Julien Lepiller <julien@lepiller.eu> | |
2 | + | ;;;; | |
3 | + | ;;;; This library is free software; you can redistribute it and/or | |
4 | + | ;;;; modify it under the terms of the GNU Lesser General Public | |
5 | + | ;;;; License as published by the Free Software Foundation; either | |
6 | + | ;;;; version 3 of the License, or (at your option) any later version. | |
7 | + | ;;;; | |
8 | + | ;;;; This library is distributed in the hope that it will be useful, | |
9 | + | ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | + | ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
11 | + | ;;;; Lesser General Public License for more details. | |
12 | + | ;;;; | |
13 | + | ;;;; You should have received a copy of the GNU Lesser General Public | |
14 | + | ;;;; License along with this library; if not, write to the Free Software | |
15 | + | ;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
16 | + | ;;;; | |
17 | + | ||
18 | + | (define-module (http-signatures ontology) | |
19 | + | #:use-module (activitystreams activitystreams) | |
20 | + | #:use-module (ice-9 match) | |
21 | + | #:use-module (jsonld json) | |
22 | + | #:use-module (web uri) | |
23 | + | #:export (security-ontology)) | |
24 | + | ||
25 | + | (define sec:vocab "https://w3id.org/security#") | |
26 | + | ||
27 | + | (define* (make-sec-type label #:key (uri (string-append sec:vocab label)) | |
28 | + | (comment "") (subclass-of '())) | |
29 | + | (make-as-type label #:uri uri #:comment comment #:subclass-of subclass-of)) | |
30 | + | ||
31 | + | (define* (make-as-property label domain range | |
32 | + | #:key (uri (string-append as:vocab label)) | |
33 | + | (functional? #f) (subproperty-of '()) (comment "")) | |
34 | + | (make-as-property label domain range #:uri uri #:functional? functional? | |
35 | + | #:subproperty-of subproperty-of #:comment comment)) | |
36 | + | ||
37 | + | ;; Classes | |
38 | + | ||
39 | + | (define sec:Digest | |
40 | + | (make-sec-type | |
41 | + | "Digest" | |
42 | + | #:comment | |
43 | + | "This class represents a message digest that may be used for data integrity | |
44 | + | verification. The digest algorithm used will determine the cryptographic | |
45 | + | properties of the digest.")) | |
46 | + | ||
47 | + | (define sec:EncryptedMessage | |
48 | + | (make-sec-type | |
49 | + | "EncryptedMessage" | |
50 | + | #:comment | |
51 | + | "A class of messages that are obfuscated in some cryptographic manner. | |
52 | + | These messages are incredibly difficult to decrypt without the proper | |
53 | + | decryption key.")) | |
54 | + | ||
55 | + | (define sec:Signature | |
56 | + | (make-sec-type | |
57 | + | "Signature" | |
58 | + | #:comment | |
59 | + | "This class represents a digital signature on serialized data. It is an | |
60 | + | abstract class and should not be used other than for Semantic Web reasoning | |
61 | + | purposes, such as by a reasoning agent.")) | |
62 | + | ||
63 | + | (define sec:GraphSignature2012 | |
64 | + | (make-sec-type | |
65 | + | "GraphSignature2012" | |
66 | + | #:subclass-of (list sec:Signature) | |
67 | + | #:comment | |
68 | + | "A graph signature is used for digital signatures on RDF graphs. The | |
69 | + | default canonicalization mechanism is specified in the RDF Graph normalization | |
70 | + | specification, which effectively deterministically names all unnamed nodes. | |
71 | + | The default signature mechanism uses a SHA-256 digest and RSA to perform the | |
72 | + | digital signature.")) | |
73 | + | ||
74 | + | (define sec:LinkedDataSignature2015 | |
75 | + | (make-sec-type | |
76 | + | "LinkedDataSignature2015" | |
77 | + | #:subclass-of (list sec:Signature) | |
78 | + | #:comment | |
79 | + | "A Linked Data signature is used for digital signatures on RDF Datasets. | |
80 | + | The default canonicalization mechanism is specified in the RDF Dataset | |
81 | + | Normalization specification, which effectively deterministically names all | |
82 | + | unnamed nodes. The default signature mechanism uses a SHA-256 digest and RSA | |
83 | + | to perform the digital signature. This signature uses a algorithm for | |
84 | + | producing the data that it signs and verifies that is different from other | |
85 | + | Linked Data signatures.")) | |
86 | + | ||
87 | + | (define sec:LinkedDataSignature2016 | |
88 | + | (make-sec-type | |
89 | + | "LinkedDataSignature2016" | |
90 | + | #:subclass-of (list sec:Signature) | |
91 | + | #:comment | |
92 | + | "A Linked Data signature is used for digital signatures on RDF Datasets. | |
93 | + | The default canonicalization mechanism is specified in the RDF Dataset | |
94 | + | Normalization specification, which effectively deterministically names all | |
95 | + | unnamed nodes. The default signature mechanism uses a SHA-256 digest and RSA | |
96 | + | to perform the digital signature.")) | |
97 | + | ||
98 | + | (define sec:Key | |
99 | + | (make-sec-type | |
100 | + | "Key" | |
101 | + | #:comment | |
102 | + | "This class represents a cryptographic key that may be used for encryption, | |
103 | + | decryption, or digitally signing data.")) | |
104 | + | ||
105 | + | (define sec-types (list sec:Digest sec:EncryptedMessage sec:Signature | |
106 | + | sec:GraphSignature2012 sec:LinkedDataSignature2015 | |
107 | + | sec:LinkedDataSignature2016 sec:Key)) | |
108 | + | ||
109 | + | (define sec:authenticationTag | |
110 | + | (make-sec-property | |
111 | + | "authenticationTag" "EncryptedMessage" string? | |
112 | + | #:coment | |
113 | + | "Not specified")) | |
114 | + | ||
115 | + | (define sec:creator | |
116 | + | (make-sec-property | |
117 | + | "creator" "Signature" iri? | |
118 | + | #:coment | |
119 | + | "Not specified")) | |
120 | + | ||
121 | + | (define sec:cipherAlgorithm | |
122 | + | (make-sec-property | |
123 | + | "cipherAlgorithm" "EncryptedMessage" string? | |
124 | + | #:comment | |
125 | + | "The cipher algorithm describes the mechanism used to encrypt a message. | |
126 | + | It is typically a string expressing the cipher suite, the strength of the | |
127 | + | cipher, and a block cipher mode.")) | |
128 | + | ||
129 | + | (define sec:cipherData | |
130 | + | (make-sec-property | |
131 | + | "cipherData" "EncryptedMessage" string? | |
132 | + | #:comment | |
133 | + | "Cipher data an opaque blob of information that is used to specify an | |
134 | + | encrypted message.")) | |
135 | + | ||
136 | + | (define sec:digestAlgorithm | |
137 | + | (make-sec-property | |
138 | + | "digestAlgorithm" "Digest" string? | |
139 | + | #:comment | |
140 | + | "The digest algorithm is used to specify the cryptographic function to use | |
141 | + | when generating the data to be digitally signed. Typically, data that is to be | |
142 | + | signed goes through three steps: 1) canonicalization, 2) digest, and | |
143 | + | 3) signature. This property is used to specify the algorithm that should be | |
144 | + | used for step #2. A signature class typically specifies a default digest | |
145 | + | method, so this property is typically used to specify information for a | |
146 | + | signature algorithm.")) | |
147 | + | ||
148 | + | (define sec:digestValue | |
149 | + | (make-sec-property | |
150 | + | "digestValue" "Digest" string? | |
151 | + | #:comment | |
152 | + | "The digest value is used to express the output of the digest algorithm | |
153 | + | expressed in Base-16 (hexadecimal) format.")) | |
154 | + | ||
155 | + | (define sec:cipherKey | |
156 | + | (make-sec-property | |
157 | + | "cipherKey" "EncryptedMessage" string? | |
158 | + | #:comment | |
159 | + | "A cipher key is a symmetric key that is used to encrypt or decrypt a | |
160 | + | piece of information. The key itself may be expressed in clear text or | |
161 | + | encrypted.")) | |
162 | + | ||
163 | + | (define sec:expires | |
164 | + | (make-sec-property | |
165 | + | "expires" "" string? | |
166 | + | #:comment | |
167 | + | "The expiration time is typically associated with a Key and specifies when | |
168 | + | the validity of the key will expire. It is considered a best practice to only | |
169 | + | create keys that have very definite expiration periods. This period is | |
170 | + | typically set to between six months and two years. An digital signature | |
171 | + | created using an expired key MUST be marked as invalid by any software | |
172 | + | attempting to verify the signature.")) | |
173 | + | ||
174 | + | (define sec:initializationVector | |
175 | + | (make-sec-property | |
176 | + | "initializationVector" "EncryptedMessage" string? | |
177 | + | #:comment | |
178 | + | "The initialization vector (IV) is a byte stream that is typically used to | |
179 | + | initialize certain block cipher encryption schemes. For a receiving | |
180 | + | application to be able to decrypt a message, it must know the decryption key | |
181 | + | and the initialization vector. The value is typically base-64 encoded.")) | |
182 | + | ||
183 | + | (define sec:nonce | |
184 | + | (make-sec-property | |
185 | + | "nonce" "" string? | |
186 | + | #:comment | |
187 | + | "This property is used in conjunction with the input to the signature | |
188 | + | hashing function in order to protect against replay attacks. Typically, | |
189 | + | receivers need to track all nonce values used within a certain time period | |
190 | + | in order to ensure that an attacker cannot merely re-send a compromised | |
191 | + | packet in order to execute a privileged request.")) | |
192 | + | ||
193 | + | (define sec:canonicalizationAlgorithm | |
194 | + | (make-sec-property | |
195 | + | "canonicalizationAlgorithm" "" (list iri? string?) | |
196 | + | #:comment | |
197 | + | "The canonicalization algorithm is used to transform the input data into a | |
198 | + | form that can be passed to a cryptographic digest method. The digest is then | |
199 | + | digitally signed using a digital signature algorithm. Canonicalization ensures | |
200 | + | that a piece of software that is generating a digital signature is able to do | |
201 | + | so on the same set of information in a deterministic manner.")) | |
202 | + | ||
203 | + | (define sec:owner | |
204 | + | (make-sec-property | |
205 | + | "owner" "Key" iri? | |
206 | + | #:comment | |
207 | + | "An owner is an entity that claims control over a particular resource. | |
208 | + | Note that ownership is best validated as a two-way relationship where the | |
209 | + | owner claims ownership over a particular resource, and the resource clearly | |
210 | + | identifies its owner.")) | |
211 | + | ||
212 | + | (define sec:password | |
213 | + | (make-sec-property | |
214 | + | "password" "" string? | |
215 | + | #:comment | |
216 | + | "A secret that is used to generate a key that can be used to encrypt or | |
217 | + | decrypt message. It is typically a string value.")) | |
218 | + | ||
219 | + | (define sec:privateKeyPem | |
220 | + | (make-sec-property | |
221 | + | "privateKeyPem" "Key" string? | |
222 | + | #:comment | |
223 | + | "A private key PEM property is used to specify the PEM-encoded version of | |
224 | + | the private key. This encoding is compatible with almost every Secure Sockets | |
225 | + | Layer library implementation and typically plugs directly into functions | |
226 | + | intializing private keys.")) | |
227 | + | ||
228 | + | (define sec:publicKey | |
229 | + | (make-sec-property | |
230 | + | "publicKey" "EncryptedMessage" iri? | |
231 | + | #:comment | |
232 | + | "A public key property is used to specify a URL that contains information | |
233 | + | about a public key.")) | |
234 | + | ||
235 | + | (define sec:publicKeyPem | |
236 | + | (make-sec-property | |
237 | + | "publicKeyPem" "Key" string? | |
238 | + | #:comment | |
239 | + | "A public key PEM property is used to specify the PEM-encoded version of | |
240 | + | the public key. This encoding is compatible with almost every Secure Sockets | |
241 | + | Layer library implementation and typically plugs directly into functions | |
242 | + | intializing public keys.")) | |
243 | + | ||
244 | + | (define sec:publicKeyService | |
245 | + | (make-sec-property | |
246 | + | "publicKeyService" "" string? | |
247 | + | #:comment | |
248 | + | "The publicKeyService property is used to express the REST URL that provides | |
249 | + | public key management services as defined by the Web Key specification.")) | |
250 | + | ||
251 | + | (define sec:revoked | |
252 | + | (make-sec-property | |
253 | + | "revoked" "" date? | |
254 | + | #:comment | |
255 | + | "The revocation time is typically associated with a Key that has been | |
256 | + | marked as invalid as of the date and time associated with the property. Key | |
257 | + | revocations are often used when a key is compromised, such as the theft of the | |
258 | + | private key, or during the course of best-practice key rotation schedules.")) | |
259 | + | ||
260 | + | (define sec:signature | |
261 | + | (make-sec-property | |
262 | + | ;; XXX: not correct, there is no defined domain | |
263 | + | "signature" "Object" "Signature" | |
264 | + | #:comment | |
265 | + | "The signature property is used to associate a signature with a graph of | |
266 | + | information. The signature property is typically not included in the | |
267 | + | canonicalized graph that is then digested, and digitally signed.")) | |
268 | + | ||
269 | + | (define sec:signatureValue | |
270 | + | (make-sec-property | |
271 | + | "signatureValue" "Signature" string? | |
272 | + | #:comment | |
273 | + | "The signature value is used to express the output of the signature | |
274 | + | algorithm expressed in base-64 format.")) | |
275 | + | ||
276 | + | (define sec:signatureAlgorithm | |
277 | + | (make-sec-property | |
278 | + | "signatureAlgorithm" "Signature" string? | |
279 | + | #:comment | |
280 | + | "The signature algorithm is used to specify the cryptographic signature | |
281 | + | function to use when digitally signing the digest data. Typically, text to be | |
282 | + | signed goes through three steps: 1) canonicalization, 2) digest, and | |
283 | + | 3) signature. This property is used to specify the algorithm that should be | |
284 | + | used for step #3. A signature class typically specifies a default signature | |
285 | + | algorithm, so this property rarely needs to be used in practice when | |
286 | + | specifying digital signatures.")) | |
287 | + | ||
288 | + | (define sec-properties | |
289 | + | (list sec:cipherAlgorithm sec:cipherData sec:digestAlgorithm sec:digestValue | |
290 | + | sec:cipherKey sec:expires sec:initializationVector sec:nonce | |
291 | + | sec:canonicalizationAlgorithm sec:owner sec:password | |
292 | + | sec:privateKeyPem sec:publicKey sec:publicKeyPem sec:publicKeyService | |
293 | + | sec:revoked sec:signature sec:signatureValue sec:signatureAlgorithm)) | |
294 | + | ||
295 | + | (define (security-ontology (append sec-types sec-properties))) |