guile-fediverse/http-signature/ontology.scm

ontology.scm

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