oak 0.4.1 → 0.4.2

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.
@@ -0,0 +1,893 @@
1
+ # OAK: Encryption-in-OAK
2
+
3
+ OAK is a serialization and envelope format which encodes simple Ruby
4
+ objects as strings. It bundles together a variety of well-understood
5
+ encoding libraries into a succinct self-describing package.
6
+
7
+ OAK v3 was first described in [OAK: The Object ArKive](DESIGN.md).
8
+
9
+ Since 2017-09-13, OAK has been used by ALI for volatile caches in
10
+ Redis, and for durable Correspondence bodies in S3.
11
+
12
+ In Q4 2017 I evaluated, then set aside, the possibility of adding
13
+ encryption features to OAK. The motive then was to encrypt our
14
+ volatile caches in Redis, for which our hosting provider offers no
15
+ encryption-at-rest. This plan was eventually scrapped because we
16
+ decided we didn't need it and because I learned enough about modern
17
+ encryption to see that my plan was off track.
18
+
19
+ In Q3 2018 I am updating and simplifying that plan to to support
20
+ encryption of secrets.
21
+
22
+ Author: [JHW](https://github.com/jhwillett)
23
+ Advisors: Isaac, Rishav, Chris L.
24
+
25
+ Things get tricky with symmetric encryption. The _identity_ of our
26
+ encryption keys must be communicated from `OAK.encode` to
27
+ `OAK.decode`, but they cannot be explicitly present in the OAK
28
+ string itself.
29
+
30
+ Absent encryption, `OAK.decode` is nice unary pure function on OAK
31
+ strings. But to support decryption, `OAK.decode` cannot _only_ look
32
+ at the OAK string to effect a decode. It must also have a
33
+ side-channel for secrets. It degenerates to a binary function which
34
+ also must be passed a table of available encryption keys.
35
+
36
+ In anticipation of key migration, OAK works with a dictionary of
37
+ multiple named keys. `OAK.encode` records the encryption key (if
38
+ any) in the OAK string, and `OAK.decode` uses the key to select the
39
+ proper secrets from the keychain table.
40
+
41
+ Furthermore, sound encryption practice with streaming modes demands we
42
+ include random noise at the start of each encrypted stream. Hence,
43
+ `OAK.encode` degrades from a pure function to be nondeterministic.
44
+
45
+ Here's a sneak preview of some OAK encryption:
46
+
47
+ ```
48
+ $ export TOE_KEYS=foo,bar # set up a key chain with 1 keys
49
+
50
+ $ export TOE_KEY_foo=oak_3CNB_3725491808_52_RjFTQTMyX0qAlJNbIK4fwYY0kh5vNKF5mMpHK-ZBZkfFarRjVPxS_ok
51
+
52
+ $ export TOE_KEY_bar=oak_3CNB_201101230_52_RjFTQTMyXxbYlRcFH8JgiFNZMbnlFTAfUyvJCnXgCESpBmav_Etp_ok
53
+
54
+ $ echo 'Hello!' | bin/oak.rb --format none # OAK_3 with naked interior
55
+ oak_3CNN_2640238464_12_F1SU6_Hello!_ok
56
+
57
+ $ echo 'Hello!' | bin/oak.rb --format none --force-oak-4 # OAK_4 with naked interior sneak preview
58
+ oak_4_N25_CN2640238464_F1SU6_Hello!_ok
59
+
60
+ $ echo 'Hello!' | bin/oak.rb # OAK_3 defaults to base64
61
+ oak_3CNB_2640238464_16_RjFTVTZfSGVsbG8h_ok
62
+
63
+ $ echo 'Hello!' | bin/oak.rb --force-oak-4 # OAK_4 defaults to base64
64
+ oak_4_B34_Q04yNjQwMjM4NDY0X0YxU1U2X0hlbGxvIQ_ok
65
+
66
+ $ echo 'Hello!' | bin/oak.rb --key-chain TOE --key foo # OAK_4 encrypted
67
+ oak_4foo_B71_HlcPvmphFuA2gj1GsMBFzZuaHT1YMvq7EOcsBIO7DNtxwszsD4M4p-ZuYc5Z7oq2tl12SA0_ok
68
+
69
+ $ echo 'Hello!' | bin/oak.rb --key-chain TOE --key foo # OAK_4 encryption is nondeterministic
70
+ oak_4foo_B71_TcLpBTydPhfImx7Uorg_EQPPn2q01AHjHZaXCiGimEoJA2nJZB9nhJP9Bt8_Itv7Kvn0kKs_ok
71
+
72
+ $ echo 'Hello!' | bin/oak.rb --key-chain TOE --key foo | bin/oak.rb --key-chain TOE --mode decode-lines
73
+ Hello!
74
+ ```
75
+ Here is a quick parse of some OAK strings:
76
+ ```
77
+ $ echo 'Hello!' | bin/oak.rb --format none # OAK_3 with naked interior
78
+ oak_3CNN_2640238464_12_F1SU6_Hello!_ok
79
+ oak_3 # OAK ver 3
80
+ C # checksum Crc32
81
+ N # compression None
82
+ N # format None
83
+ 2640238464 # checksum value (F1SU6_Hello!)
84
+ 12 # 12 data bytes (F1SU6_Hello!)
85
+ F1SU6_Hello! # data FRIZZY, 1 UTF-8 str, 6 chars, "Hello!"
86
+ ok # end of sequence
87
+
88
+ $ echo 'Hello!' | bin/oak.rb --format none --force-oak-4 # OAK_4 with naked interior
89
+ oak_4_N25_CN2640238464_F1SU6_Hello!_ok
90
+ oak_4 # OAK ver 4 w/ no encryption key
91
+ N # format None
92
+ 25 # 25 data bytes (CN2640238464_F1SU6_Hello!)
93
+ C # checksum Crc32
94
+ N # compression None
95
+ 2640238464 # checksum value
96
+ F1SU6_Hello! # data FRIZZY, 1 UTF-8 str, 6 chars, "Hello!"
97
+ ok # end of sequence
98
+
99
+ $ echo 'Hello!' | bin/oak.rb # OAK_3 defaults to base64
100
+ oak_3CNB_2640238464_16_RjFTVTZfSGVsbG8h_ok
101
+ oak_3 # OAK ver 3
102
+ C # checksum Crc32
103
+ N # compression None
104
+ B # format Base64
105
+ 2640238464 # checksum value (F1SU6_Hello!)
106
+ 16 # 16 data bytes
107
+ RjFTVTZfSGVsbG8h # data: base64("F1SU6_Hello!")
108
+ ok # end of sequence
109
+
110
+ $ echo 'Hello!' | bin/oak.rb --force-oak-4 # OAK_4 defaults to base64
111
+ oak_4_B34_Q04yNjQwMjM4NDY0X0YxU1U2X0hlbGxvIQ_ok
112
+ oak_4 # OAK ver 4 w/ no encryption key
113
+ B # format Base64
114
+ 34 # 34 data bytes Q04u...vxIQ
115
+ Q04yNjQwMjM4NDY0X0YxU1U2X0hlbGxvIQ # data: base64("CN2640238464_F1SU6_Hello!")
116
+ ok # end of sequence
117
+
118
+ $ echo 'Hello!' | bin/oak.rb --key-chain TOE --key foo # OAK_4 encrypted
119
+ oak_4foo_B71_HlcPvmphFuA2gj1GsMBFzZuaHT1YMvq7EOcsBIO7DNtxwszsD4M4p-ZuYc5Z7oq2tl12SA0_ok
120
+ oak_4foo # OAK ver 4 encrypted with key "foo"
121
+ B # format Base64
122
+ 71 # 71 data bytes HlcP...2SA0
123
+ HlcPvmphFuA2g... # base64 of encrypted data
124
+ ```
125
+ The header fields are authenticated, even the ones which are presented
126
+ in plaintext:
127
+ ```
128
+ oak_4foo_B # authenticated-but-plaintext part
129
+ 71 # in-between part
130
+ HlcPvmphFuA2g... # authenticated-and-encrypted part
131
+ ```
132
+
133
+ ## OAK Encryption History
134
+
135
+ * Proposed Q4 2017: [oak-openssl-ciphers](https://github.com/ProsperWorks/ALI/pull/5434 )
136
+ * Initial support for symmetric key encryption. Not integrated or active.
137
+ * Introduced OAK_4 for encryption but preserves read+write for OAK_3.
138
+ * Sought to expose all algorithms supported by OpenSSL::Cipher.
139
+ * By failing to curate algorithms, less-educated users are put
140
+ in a position of making expert decisions.
141
+ * Neglected differences between modes of operation.
142
+ * Sought to be deterministic.
143
+ * Neglected risks reusing initialization vectors.
144
+ * Did not merge.
145
+
146
+ * Proposed Q3 2018: [oak-openssl-ciphers-redux](https://github.com/ProsperWorks/ALI/pull/9335/files)
147
+ * Still introduces OAK_4 for encryption but preserves read+write for OAK_3.
148
+ * Narrows choices to just AES-256-GCM with random IV.
149
+ * Authenticates all headers.
150
+ * Encrypts all headers not required for decryption.
151
+ * Split out into smaller PRs:
152
+ * [oak-openssl-ciphers-redux-part-i](https://github.com/ProsperWorks/ALI/pull/9560) plan docs
153
+ * [oak-openssl-ciphers-redux-part-ii](https://github.com/ProsperWorks/ALI/pull/9561) api syntax
154
+ * [oak-openssl-ciphers-redux-part-iii](https://github.com/ProsperWorks/ALI/pull/9562) corruption tests
155
+ * [oak-openssl-ciphers-redux-part-iv](https://github.com/ProsperWorks/ALI/pull/9563) main implementation
156
+ * [oak-openssl-ciphers-redux-part-v](https://github.com/ProsperWorks/ALI/pull/9572) bin/oak.rb cli
157
+
158
+ ## JHW Revisits Encryption-in-OAK 2018-07-15
159
+
160
+ [oak-openssl-ciphers](https://github.com/ProsperWorks/ALI/pull/5434)
161
+ was originally prepared against
162
+ [minor_2017_10_mystic](https://github.com/ProsperWorks/ALI/pull/5930)
163
+ and presented in Arch Review 2017-09-18. It never merged because
164
+ feedback and further research raised many questions. In particular,
165
+ the IV is much more delicate than I originally understood.
166
+
167
+ Per expert recommendations, GCM and CBC are the two more viable stream
168
+ modes. Of them, GCM is much more sensitive to accidental IV reuse.
169
+ So much so, that GCM is not recommended in the absence of a fully
170
+ automated IV management.
171
+
172
+ _**At ProsperWorks' current level of organization I believe the only
173
+ credible option is CBC or GCM with a random IV selected for every
174
+ message.**_
175
+
176
+ Therefore _**encrypted OAK will be nondeterministic in the plaintext**_.
177
+ This is a bummer but I see no way to avoid it without compromising
178
+ security.
179
+
180
+ Also, today I see no point in supporting anything other than AES. All
181
+ of AES-128, AES-192, and AES-256 are probably adequate for our needs,
182
+ but if we support just AES-256 then we don't have to answer any thorny
183
+ questions. There too much security downside in letting the caller
184
+ pick any old block cipher or mode of operation which is supported by
185
+ OpenSSL. This outweighs any ambition to future-proof OAK by offering
186
+ open-ended support.
187
+
188
+ GCM not only encrypts, but authenticates. It is an
189
+ [AEAD](https://en.wikipedia.org/wiki/Authenticated_encryption) and we
190
+ can authenticate all the headers, including those which are
191
+ transmitted in plaintext.
192
+
193
+ Therefore, _**OAK_4 will support only AES-256-GCM with a random IV
194
+ selected each time a message is encrypted**_. OAK_4 keys will be 32
195
+ byte random binary strings. OAK_4 IVs will be 12 byte binary strings
196
+ which are encoded into each OAK string. OAK_4 will use no salt other
197
+ than the random IV for each encryption
198
+
199
+ _**OAK_4 will allow compression within encryption.**_
200
+
201
+ _**OAK_4 will encrypt all OAK header fields except those which are
202
+ necessary to support decryption.**_ Yes, [Kerckhoffs's
203
+ Principle](https://en.wikipedia.org/wiki/Kerckhoffs%27s_principle),
204
+ but also [Precautionary
205
+ Principle](https://en.wikipedia.org/wiki/Precautionary_principle). To
206
+ be transmitted plain: the format and version identifiers "oak_4", the
207
+ format code (base64 or none), the name of the key used, and the
208
+ redundancy check for the _encrypted_ message.
209
+
210
+ OAK_4 will also support authentication via GCM. "oak_4", the
211
+ encryption key name, and the format flag will be authenticated but
212
+ transmitted plain. All the encrypted fields are also authenticated.
213
+ We can save space by skipping redundancy flags in encrypted OAK_4
214
+ sequences.
215
+
216
+ ## Appendix: Excerpts from Best Practices Research
217
+
218
+ [https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation) (sentences rearranged some here to group subtopics better)
219
+
220
+ An initialization vector (IV) or starting variable
221
+ (SV)[[5]](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#cite_note-ISO-10116-5)
222
+ is a block of bits that is used by several modes to randomize the
223
+ encryption and hence to produce distinct ciphertexts even if the same
224
+ plaintext is encrypted multiple times, without the need for a slower
225
+ re-keying
226
+ process.[[6]](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#cite_note-HUANG-6)
227
+
228
+ An initialization vector has different security requirements than a
229
+ key, so the IV usually does not need to be secret. However, in most
230
+ cases, it is important that an initialization vector is never reused
231
+ under the same key.
232
+
233
+ For CBC and CFB, reusing an IV leaks some information about the first
234
+ block of plaintext, and about any common prefix shared by the two
235
+ messages. ...
236
+
237
+ In CBC mode, the IV must, in addition, be unpredictable at encryption
238
+ time; in particular, the (previously) common practice of re-using the
239
+ last ciphertext block of a message as the IV for the next message is
240
+ insecure (for example, this method was used by SSL 2.0). If an
241
+ attacker knows the IV (or the previous block of ciphertext) before he
242
+ specifies the next plaintext, he can check his guess about plaintext
243
+ of some block that was encrypted with the same key before (this is
244
+ known as the TLS CBC IV attack).
245
+
246
+ For OFB and CTR, reusing an IV completely destroys security. This can
247
+ be seen because both modes effectively create a bitstream that is
248
+ XORed with the plaintext, and this bitstream is dependent on the
249
+ password and IV only. Reusing a bitstream destroys security
250
+
251
+ [https://esj.com/Articles/2008/07/01/8-Best-Practices-for-Encryption-Key-Management-and-Data-Security.aspx?Page=2](https://esj.com/Articles/2008/07/01/8-Best-Practices-for-Encryption-Key-Management-and-Data-Security.aspx?Page=2)
252
+
253
+ * Step 1: Eliminate as much collection and storage of sensitive data
254
+ as possible - if you don't really need it, get rid of it (or never
255
+ collect it in the first place);
256
+ * Step 2: Encrypt, hash, or mask the remaining sensitive data at rest
257
+ and in transit.
258
+
259
+ * Best Practice #1: Decentralize encryption and decryption
260
+ * Best Practice #2: Centralize key management with distributed execution
261
+ * Best Practice #3: Support multiple encryption standards
262
+ * Best Practice #4: Centralize user profiles for authentication and access to keys
263
+ * Best Practice #5: Do not require decryption/re-encryption for key rotation or expiration
264
+ * Best Practice #6: Keep comprehensive logs and audit trails
265
+ * Best Practice #7: Use one solution to support fields, files, and databases
266
+ * Best Practice #8: Support third-party integration
267
+
268
+ [https://cloud.google.com/security/encryption-at-rest/default-encryption/](https://cloud.google.com/security/encryption-at-rest/default-encryption/)
269
+
270
+ April 2017
271
+
272
+ * Google uses several layers of encryption to protect customer data at
273
+ rest in Google Cloud Platform products.
274
+ * Google Cloud Platform encrypts customer content stored at rest,
275
+ without any action required from the customer, using one or more
276
+ encryption mechanisms. There are some minor exceptions.
277
+ * Data for storage is split into chunks, and each chunk is encrypted
278
+ with a unique data encryption key. These data encryption keys are
279
+ stored with the data, encrypted with ("wrapped" by) key encryption
280
+ keys that are exclusively stored and used inside Google's central
281
+ Key Management Service. Google's Key Management Service is redundant
282
+ and globally distributed.
283
+ * Data stored in Google Cloud Platform is encrypted at the storage
284
+ level using either AES256 or AES128.
285
+ * Google uses a common cryptographic library, Keyczar, to implement
286
+ encryption consistently across almost all Google Cloud Platform
287
+ products. (The open-sourced version of Keyczar has known security
288
+ issues, and is NOT the version used internally at Google.) Because
289
+ this common library is widely accessible, only a small team of
290
+ cryptographers needs to properly implement and maintain this tightly
291
+ controlled and reviewed code.
292
+ * Google uses the Advanced Encryption Standard (AES) algorithm to
293
+ encrypt data at rest. AES is widely used because (1) [both AES256
294
+ and AES128 are recommended by the National Institute of Standards
295
+ and Technology (NIST) for long-term storage
296
+ use](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf)
297
+ (as of November 2015), and (2) AES is often included as part of
298
+ customer compliance requirements.
299
+ * Data stored across Google Cloud Storage is encrypted at the storage
300
+ level using AES, in [Galois/Counter Mode
301
+ (GCM)](http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf)
302
+ in almost all cases. This is implemented in the [BoringSSL
303
+ library](https://boringssl.googlesource.com/boringssl/) that Google
304
+ maintains. This library was forked from OpenSSL for internal use,
305
+ after [many flaws were exposed in
306
+ OpenSSL](https://www.openssl.org/news/vulnerabilities.html). In
307
+ select cases, AES is used in Cipher Block Chaining (CBC) mode with a
308
+ hashed message authentication code (HMAC) for authentication; and
309
+ for some replicated files, AES is used in Counter (CTR) mode with
310
+ HMAC. (Further details on algorithms are provided [later in this
311
+ document](https://cloud.google.com/security/encryption-at-rest/default-encryption/#googles_common_cryptographic_library).)
312
+ In other Google Cloud Platform products, AES is used in a variety of
313
+ modes.
314
+ * In addition to the storage system level encryption described above,
315
+ in most cases data is also encrypted at the storage device level,
316
+ with at least AES128 for hard disks (HDD) and AES256 for new solid
317
+ state drives (SSD), using a separate device-level key (which is
318
+ different than the key used to encrypt the data at the storage
319
+ level). As older devices are replaced, solely AES256 will be used
320
+ for device-level encryption.
321
+ * At the time of this document's publication, Google uses the
322
+ following encryption algorithms for encryption at rest for DEKs and
323
+ KEKs. These are subject to change as we continue to improve our
324
+ capabilities and security.
325
+ * Symmetric Encryption
326
+ * **AES-GCM (256 bits) (preferred)**
327
+ * AES-CBC
328
+ * AES-CTR (128 and 256 bits)
329
+ * AES-EAX (128 and 256 bits)
330
+ * Symmetric Signatures
331
+ * HMAC-SHA256 (preferred)
332
+ * HMAC-SHA512
333
+ * HMAC-SHA1
334
+
335
+ [http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf)
336
+
337
+ NIST Special Publication 800-131A Revision 1
338
+
339
+ Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths
340
+
341
+ November 2015
342
+
343
+ * **The use of AES-128, AES-192, AES-256 and three-key TDEA is acceptable.**
344
+
345
+ [http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf](http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf)
346
+
347
+ NIST Special Publication 800-38D
348
+
349
+ Recommendation for Block Cipher Modes of Operation: Galois/Counter
350
+ Mode (GCM) and GMAC
351
+
352
+ November, 2007
353
+
354
+ * This Recommendation specifies the Galois/Counter Mode (GCM), an
355
+ algorithm for authenticated encryption with associated data, and its
356
+ specialization, GMAC, for generating a message authentication code
357
+ (MAC) on data that is not encrypted. **GCM and GMAC are modes of
358
+ operation for an underlying approved symmetric key block cipher.**
359
+ * GCM is constructed from an approved symmetric key block cipher with
360
+ a block size of 128 bits, such as the Advanced Encryption Standard
361
+ (AES) algorithm that is specified in Federal Information Processing
362
+ Standard (FIPS) Pub. 197 [2]. **Thus, GCM is a mode of operation of
363
+ the AES algorithm.**
364
+ * ..If the GCM input is restricted to data that is not to be
365
+ encrypted, the resulting specialization of GCM, called GMAC, is
366
+ simply an authentication mode on the input data. In the rest of this
367
+ document, statements about GCM also apply to GMAC.
368
+ * **GCM provides stronger authentication assurance than a
369
+ (non-cryptographic) checksum or error detecting code;** in
370
+ particular, GCM can detect both 1) accidental modifications of the
371
+ data and 2) intentional, unauthorized modifications.
372
+ * ...The underlying block cipher shall be approved, the block size
373
+ shall be 128 bits, and **the key size shall be at least 128 bits**.
374
+ * ...For IVs, it is recommended that implementations restrict support
375
+ to the length of **96 bits, to promote interoperability, efficiency,
376
+ and simplicity of design**.
377
+ * JHW checked 96 == OpenSSL::Cipher.new('aes-256-gcm').random_iv.size * 8
378
+ * JHW checked 96 == OpenSSL::Cipher.new('aes-128-gcm').random_iv.size * 8
379
+ * ... **The IVs in GCM must fulfill the following "uniqueness"
380
+ requirement**: The probability that the authenticated encryption
381
+ function ever will be invoked with the same IV and the same key on
382
+ two (or more) distinct sets of input data shall be no greater than
383
+ 2^32.
384
+ * Compliance with this requirement is crucial to the security of
385
+ GCM. Across all instances of the authenticated encryption function
386
+ with a given key, if even one IV is ever repeated, then the
387
+ implementation may be vulnerable to the forgery attacks that are
388
+ described in Ref [5] and summarized in Appendix A. **In practice,
389
+ this requirement is almost as important as the secrecy of the key. **
390
+
391
+ [http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38c.pdf](http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38c.pdf)
392
+
393
+ NIST Special Publication 800-38C
394
+
395
+ Recommendation for Block Cipher Modes of Operation: The CCM Mode for
396
+ Authentication and Confidentiality
397
+
398
+ May 2004
399
+
400
+ [http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html)
401
+
402
+ Amazon EBS encryption handles key management for you. Each newly
403
+ created volume is encrypted with a unique 256-bit key. Any snapshots
404
+ of this volume and any subsequent volumes created from those snapshots
405
+ also share that key. These keys are protected by AWS key management
406
+ infrastructure, which implements strong logical and physical security
407
+ controls to prevent unauthorized access. Your data and associated keys
408
+ are encrypted using the industry standard AES-256 algorithm.
409
+
410
+ You cannot change the CMK that is associated with an existing snapshot
411
+ or encrypted volume. However, you can associate a different CMK during
412
+ a snapshot copy operation (including encrypting a copy of an
413
+ unencrypted snapshot) and the resulting copied snapshot use the new
414
+ CMK.
415
+
416
+ The AWS overall key management infrastructure is consistent with
417
+ National Institute of Standards and Technology (NIST) 800-57
418
+ recommendations and uses cryptographic algorithms approved by Federal
419
+ Information Processing Standards (FIPS) 140-2.
420
+
421
+ Each AWS account has a unique master key that is stored separately
422
+ from your data, on a system that is surrounded with strong physical
423
+ and logical security controls. Each encrypted volume (and its
424
+ subsequent snapshots) is encrypted with a unique volume encryption key
425
+ that is then encrypted with a region-specific secure master key. The
426
+ volume encryption keys are used in memory on the server that hosts
427
+ your EC2 instance; they are never stored on disk in plaintext.
428
+
429
+ [http://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html](http://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html)
430
+
431
+ You have three mutually exclusive options depending on how you choose
432
+ to manage the encryption keys:
433
+
434
+ * Use Server-Side Encryption with Amazon S3-Managed Keys (SSE-S3) -
435
+ Each object is encrypted with a unique key employing strong
436
+ multi-factor encryption. As an additional safeguard, it encrypts the
437
+ key itself with a master key that it regularly rotates. Amazon S3
438
+ server-side encryption uses one of the strongest block ciphers
439
+ available, 256-bit Advanced Encryption Standard (AES-256), to
440
+ encrypt your data. For more information, see [Protecting Data Using
441
+ Server-Side Encryption with Amazon S3-Managed Encryption Keys
442
+ (SSE-S3)](http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html).
443
+ * Use Server-Side Encryption with AWS KMS-Managed Keys (SSE-KMS) -
444
+ Similar to SSE-S3, but with some additional benefits along with some
445
+ additional charges for using this service. There are separate
446
+ permissions for the use of an envelope key (that is, a key that
447
+ protects your data's encryption key) that provides added protection
448
+ against unauthorized access of your objects in S3. SSE-KMS also
449
+ provides you with an audit trail of when your key was used and by
450
+ whom. Additionally, you have the option to create and manage
451
+ encryption keys yourself, or use a default key that is unique to
452
+ you, the service you're using, and the region you're working in. For
453
+ more information, see [Protecting Data Using Server-Side Encryption
454
+ with AWS KMS-Managed Keys
455
+ (SSE-KMS)](http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html).
456
+ * Use Server-Side Encryption with Customer-Provided Keys (SSE-C) - You
457
+ manage the encryption keys and Amazon S3 manages the encryption, as
458
+ it writes to disks, and decryption, when you access your
459
+ objects. For more information, see [Protecting Data Using
460
+ Server-Side Encryption with Customer-Provided Encryption Keys
461
+ (SSE-C)](http://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html).
462
+
463
+ [https://tools.ietf.org/html/rfc5084#section-2](https://tools.ietf.org/html/rfc5084#section-2)
464
+
465
+ Using AES-CCM and AES-GCM Authenticated Encryption in the Cryptographic Message Syntax (CMS)
466
+
467
+ November 2007
468
+
469
+ Status: Proposed Standard
470
+
471
+ The reuse of an **AES-CCM** or **AES-GCM** nonce/key combination destroys
472
+ the security guarantees. As a result, it can be extremely difficult
473
+ to use AES-CCM or AES-GCM securely when using statically configured
474
+ keys. **For safety's sake, implementations MUST use an automated key
475
+ management system**.
476
+
477
+ JHW Note: If we want to avoid building or buying or renting a KMS, we
478
+ should hold back from AES-CCM or AES- GCM for now. AES-CBC is still a
479
+ credible choice and even recommended by some.
480
+
481
+ [https://tools.ietf.org/html/rfc4107](https://tools.ietf.org/html/rfc4107)
482
+
483
+ Guidelines for Cryptographic Key Management
484
+
485
+ June 2005
486
+
487
+ Status: BEST CURRENT PRACTICE
488
+
489
+ * When symmetric cryptographic mechanisms are used in a protocol, the
490
+ presumption is that automated key management is generally but not
491
+ always needed. If manual keying is proposed, the burden of proving
492
+ that automated key management is not required falls to the proposer.
493
+ * There is not one answer to that question; circumstances differ. **In
494
+ general, automated key management SHOULD be used.** Occasionally,
495
+ relying on manual key management is reasonable; we propose some
496
+ guidelines for making that judgment.
497
+ * Automated key management and manual key management provide very
498
+ different features.
499
+ * In particular, the protocol associated with an automated key
500
+ management technique will confirm the liveness of the peer,
501
+ protect against replay, authenticate the source of the
502
+ short-term session key, associate protocol state information
503
+ with the short-term session key, and ensure that a fresh
504
+ short-term session key is generated.
505
+ * For some symmetric cryptographic algorithms, implementations
506
+ must prevent overuse of a given key. An implementation of such
507
+ algorithms can make use of automated key management when the
508
+ usage limits are nearly exhausted, in order to establish
509
+ replacement keys before the limits are reached, thereby
510
+ maintaining secure communications.
511
+ * Examples of automated key management systems include IPsec IKE
512
+ and Kerberos. S/MIME and TLS also include automated key
513
+ management functions.
514
+ * Key management schemes should not be designed by amateurs; it is
515
+ almost certainly inappropriate for working groups to design their
516
+ own.
517
+ * In general, automated key management SHOULD be used to establish
518
+ session keys.
519
+ * Automated key management MUST be used if any of these conditions hold:
520
+ * A party will have to manage n^2 static keys, where n may become large.
521
+ * Any stream cipher (such as RC4
522
+ [[TK](https://tools.ietf.org/html/rfc4107#ref-TK)], AES-CTR
523
+ [[NIST](https://tools.ietf.org/html/rfc4107#ref-NIST)], or
524
+ AES-CCM [[WHF](https://tools.ietf.org/html/rfc4107#ref-WHF)]) is
525
+ used.
526
+ * An initialization vector (IV) might be reused, especially an
527
+ implicit IV. Note that random or pseudo-random explicit IVs are
528
+ not a problem unless the probability of repetition is high.
529
+ * Large amounts of data might need to be encrypted in a short
530
+ time, causing frequent change of the short-term session key.
531
+ * Long-term session keys are used by more than two
532
+ parties. Multicast is a necessary exception, but multicast key
533
+ management standards are emerging in order to avoid this in the
534
+ future. Sharing long-term session keys should generally be
535
+ discouraged.
536
+ * The likely operational environment is one where personnel (or
537
+ device) turnover is frequent, causing frequent change of the
538
+ short-term session key.
539
+ * Manual key management may be a reasonable approach in any of these
540
+ situations:
541
+ * The environment has very limited available bandwidth or very
542
+ high round-trip times. Public key systems tend to require long
543
+ messages and lots of computation; symmetric key alternatives,
544
+ such as Kerberos, often require several round trips and
545
+ interaction with third parties.
546
+ * The information being protected has low value.
547
+ * The total volume of traffic over the entire lifetime of the
548
+ long-term session key will be very low.
549
+ * The scale of each deployment is very limited.
550
+ * Note that assertions about such things should often be viewed with
551
+ skepticism. The burden of demonstrating that manual key management
552
+ is appropriate falls to the proponents -- and it is a fairly high
553
+ hurdle.
554
+ * Systems that employ manual key management need provisions for key
555
+ changes. There MUST be some way to indicate which key is in use to
556
+ avoid problems during transition. Designs SHOULD sketch plausible
557
+ mechanisms for deploying new keys and replacing old ones that might
558
+ have been compromised. If done well, such mechanisms can later be
559
+ used by an add-on key management scheme.
560
+ * Lack of clarity about the parties involved in authentication is not
561
+ a valid reason for avoiding key management. Rather, it tends to
562
+ indicate a deeper problem with the underlying security model.
563
+ * When manual key management is used, long-term shared secrets MUST be
564
+ unpredictable "random" values, ensuring that an adversary will have
565
+ no greater expectation than 50% of finding the value after searching
566
+ half the key search space.
567
+
568
+ JHW Note: RFC-4107 talks a lot about session keys. I don't know how
569
+ the session concept applies to our encryption at rest use cases, so I
570
+ am not sure how to interpret some of this.
571
+
572
+ [https://tools.ietf.org/html/bcp106](https://tools.ietf.org/html/bcp106)
573
+
574
+ Randomness Requirements for Security
575
+
576
+ June 2005
577
+
578
+ * /dev/random returns bytes from the pool but blocks when the
579
+ estimated entropy drops to zero. As entropy is added to the pool
580
+ from events, more data becomes available via /dev/random. Random
581
+ data obtained from such a /dev/random device is suitable for key
582
+ generation for long term keys, if enough random bits are in the pool
583
+ or are added in a reasonable amount of time.
584
+ * **Random data obtained from ... /dev/random ... is suitable for
585
+ key generation for long term keys**
586
+ * /dev/urandom works like /dev/random; however, it provides data even
587
+ when the entropy estimate for the random pool drops to zero. This
588
+ may be adequate for session keys or for other key generation tasks
589
+ for which blocking to await more random bits is not acceptable. The
590
+ risk of continuing to take data even when the pool's entropy
591
+ estimate is small in that past output may be computable from current
592
+ output, provided that an attacker can reverse SHA-1. Given that
593
+ SHA-1 is designed to be non-invertible, this is a reasonable risk.
594
+ * **/dev/urandom ... may be adequate for session keys or for other
595
+ key generation tasks for which blocking to await more random
596
+ bits is not acceptable.**
597
+ * To obtain random numbers under Linux, Solaris, or other UNIX systems
598
+ equipped with code as described above, all an application has to do
599
+ is open either /dev/random or /dev/urandom and read the desired
600
+ number of bytes.
601
+
602
+ [https://www.feistyduck.com/library/openssl-cookbook/online/ch-openssl.html#openssl-recommended-configuration](https://www.feistyduck.com/library/openssl-cookbook/online/ch-openssl.html#openssl-recommended-configuration)
603
+
604
+ The design principles for all configurations here are essentially the
605
+ same as those from the previous section, but I am going to make two
606
+ changes to achieve better performance. First, I am going to put
607
+ 128-bit suites on top of the list. Although 256-bit suites provide
608
+ some increase in security, for most sites the increase is not
609
+ meaningful and yet still comes with the performance penalty. Second, I
610
+ am going to prefer HMAC-SHA over HMAC-SHA256 and HMAC-SHA384
611
+ suites. The latter two are much slower but also don't provide a
612
+ meaningful increase in security.
613
+
614
+ ...
615
+
616
+ The following is my default starting configuration, designed to offer
617
+ strong security as well as good performance:
618
+
619
+ - ECDHE-ECDSA-AES128-GCM-SHA256
620
+ - ECDHE-ECDSA-AES256-GCM-SHA384
621
+ - ECDHE-ECDSA-AES128-SHA
622
+ - ECDHE-ECDSA-AES256-SHA
623
+ - ECDHE-ECDSA-AES128-SHA256
624
+ - ECDHE-ECDSA-AES256-SHA384
625
+ - ECDHE-RSA-AES128-GCM-SHA256
626
+ - ECDHE-RSA-AES256-GCM-SHA384
627
+ - ECDHE-RSA-AES128-SHA
628
+ - ECDHE-RSA-AES256-SHA
629
+ - ECDHE-RSA-AES128-SHA256
630
+ - ECDHE-RSA-AES256-SHA384
631
+ - DHE-RSA-AES128-GCM-SHA256
632
+ - DHE-RSA-AES256-GCM-SHA384
633
+ - DHE-RSA-AES128-SHA
634
+ - DHE-RSA-AES256-SHA
635
+ - DHE-RSA-AES128-SHA256
636
+ - DHE-RSA-AES256-SHA256
637
+
638
+ JHW Note: ^^^ Of course that recommendation is for a web site, not for
639
+ cold storage.
640
+
641
+ [http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/Cipher.html](http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/Cipher.html)
642
+
643
+ Ruby docs for OpenSSL::Cipher
644
+
645
+ * You should never use ECB mode unless you are absolutely sure that
646
+ you absolutely need it
647
+ * Always create a secure random IV for every encryption of your
648
+ [Cipher](http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/Cipher/Cipher.html)
649
+ * If the
650
+ [OpenSSL](http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL.html)
651
+ version used supports it, an Authenticated Encryption mode (such as
652
+ GCM or CCM) should always be preferred over any unauthenticated
653
+ mode.
654
+ * Currently,
655
+ [OpenSSL](http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL.html)
656
+ supports AE only in combination with Associated Data (AEAD) where
657
+ additional associated data is included in the encryption process to
658
+ compute a tag at the end of the encryption. This tag will also be
659
+ used in the decryption process and by verifying its validity, the
660
+ authenticity of a given ciphertext is established.
661
+ * This is superior to unauthenticated modes in that it allows to
662
+ detect if somebody effectively changed the ciphertext after it had
663
+ been encrypted. This prevents malicious modifications of the
664
+ ciphertext that could otherwise be exploited to modify ciphertexts
665
+ in ways beneficial to potential attackers.
666
+ * If no associated data is needed for encryption and later decryption,
667
+ the
668
+ [OpenSSL](http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL.html)
669
+ library still requires a value to be set - "" may be used in case
670
+ none is available. An example using the GCM (Galois Counter Mode)...
671
+
672
+ [https://tools.ietf.org/html/rfc4880#page-6](https://tools.ietf.org/html/rfc4880#page-6)
673
+
674
+ OpenPGP Message Format
675
+
676
+ November 2007
677
+
678
+ Status PROPOSED STANDARD
679
+
680
+ * OpenPGP wraps it all in Radix-64 aka ASCII Armor.
681
+ * header (e.g. "-----BEGIN PGP MESSAGE-----")
682
+ * armor headers
683
+ * armored data
684
+ * checksum
685
+ * footer
686
+ * To encrypt, OpenPGP generates a new "session key" for each message,
687
+ which is encrypted with the recipient's public key.
688
+ * The encrypted session key is sent with the message.
689
+
690
+ The (unencrypted) session key is used to symmetrically encrypt the
691
+ (usually compressed) message.
692
+
693
+ * To authenticate, OpenPGP generates a hash of the message, encrypts
694
+ it with the sender's private key.
695
+ * The encrypted message hash is sent with the message.
696
+ * OpenPGP implements, and recommends, compress-then-encrypt!
697
+ * "OpenPGP implementations SHOULD compress the message after
698
+ applying the signature but before encryption."
699
+ * "... Furthermore, compression has the added side effect that
700
+ some types of attacks can be thwarted by the fact that slightly
701
+ altered, compressed data rarely uncompresses without severe
702
+ errors. This is hardly rigorous, but it is operationally
703
+ useful. ..."
704
+ * Asymmetric include RSA, Elgamal, DSA.
705
+ * Symmetric include plain, IDEA, TripleDES, CAST5, Blowfish, AES-128,
706
+ -192, -256, Twofish
707
+ * No IV but super-salty.
708
+ * "OpenPGP CFB mode uses an initialization vector (IV) of all
709
+ zeros, and prefixes the plaintext with BS+2 octets of random
710
+ data, such that octets BS+1 and BS+2 match octets BS-1 and BS.
711
+ It does a CFB resynchronization after encrypting those BS+2
712
+ octets."
713
+ * Compression include none, ZIP, ZLIB, BZIP2
714
+ * Hashes include MD5, SHA-1, SHA256, SHA512, others
715
+ * GnuPG is a compliant implementation.
716
+ * OpenPGP is slammed in
717
+ [https://blog.cryptographyengineering.com/2014/08/13/whats-matter-with-pgp/](https://blog.cryptographyengineering.com/2014/08/13/whats-matter-with-pgp/)
718
+ on:
719
+ * Key management
720
+ * Format
721
+ * Defaults
722
+
723
+ [https://www.apple.com/business/docs/iOS_Security_Guide.pdf](https://www.apple.com/business/docs/iOS_Security_Guide.pdf)
724
+
725
+ iOS Security
726
+
727
+ 10 March 2017
728
+
729
+ * When an iOS device is turned on, its application processor
730
+ immediately executes code from read-only memory known as the Boot
731
+ ROM. This immutable code, known as the hardware root of trust, is
732
+ laid down during chip fabrication, and is implicitly trusted. The
733
+ Boot ROM code contains the Apple Root CA public key, which is used
734
+ to verify that the iBoot bootloader is signed by Apple before
735
+ allowing it to load.
736
+ * Every iOS device has a dedicated AES 256 crypto engine built into
737
+ the DMA path between the flash storage and main system memory,
738
+ making file encryption highly efficient.
739
+ * The device's unique ID (UID) and a device group ID (GID) are AES
740
+ 256-bit keys fused (UID) or compiled (GID) into the application
741
+ processor and Secure Enclave during manufacturing. No software or
742
+ firmware can read them directly;
743
+ * Additionally, the Secure Enclave's UID and GID can only be used by
744
+ the AES engine dedicated to the Secure Enclave. The UIDs are unique
745
+ to each device and aren't recorded by Apple or any of its suppliers.
746
+ * The UID allows data to be cryptographically tied to a particular device.
747
+ * Apart from the UID and GID, all other cryptographic keys are created
748
+ by the system's random number generator (RNG) using an algorithm
749
+ based on CTR_DRBG. System entropy is generated from timing
750
+ variations during boot, and additionally from interrupt timing once
751
+ the device has booted. Keys generated inside the Secure Enclave use
752
+ its true hardware random number.
753
+ * **Every time a file on the data partition is created,** Data
754
+ Protection creates **a new 256-bit key** (the "per-file" key) and
755
+ gives it to the hardware AES engine, which uses the key to encrypt
756
+ the file as it **is written to flash memory using AES CBC
757
+ mode**. ... **The initialization vector (IV) is calculated with the
758
+ block offset into the file, encrypted with the SHA-1 hash of the
759
+ per-file key.** The **per-file key is wrapped** with one of several
760
+ class keys, depending on the circumstances under which the file
761
+ should be accessible. Like all other wrappings, this is performed
762
+ **using NIST AES key wrapping, per RFC 3394**. The wrapped per-file
763
+ key is stored in the file's metadata.
764
+ * The metadata of all files in the file system is encrypted with a
765
+ random key, which is created when iOS is first installed or when the
766
+ device is wiped by a user.
767
+ * ...this key isn't used to maintain the confidentiality of data;
768
+ instead, it's designed to be quickly erased on demand
769
+
770
+ [https://tools.ietf.org/html/rfc3394](https://tools.ietf.org/html/rfc3394)
771
+
772
+ Advanced Encryption Standard (AES) Key Wrap Algorithm
773
+
774
+ September 2002
775
+
776
+ * The AES Key Wrap algorithm will probably be adopted by the USA for
777
+ encryption of AES keys.
778
+ * NIST has assigned the following object identifiers to identify the
779
+ key wrap algorithm...
780
+ * id-aes128-wrap
781
+ * id-aes192-wrap
782
+ * id-aes256-wrap
783
+
784
+ [https://tools.ietf.org/html/rfc529](https://tools.ietf.org/html/rfc5297)[7](https://tools.ietf.org/html/rfc5297)
785
+
786
+ Synthetic Initialization Vector (SIV) Authenticated Encryption
787
+
788
+ Using the Advanced Encryption Standard (AES)
789
+
790
+ October 2008
791
+
792
+ * The nonce-based authenticated encryption schemes described above are
793
+ susceptible to reuse and/or misuse of the nonce. Depending on the
794
+ specific scheme there are subtle and critical requirements placed on
795
+ the nonce.
796
+ * ... many applications obtain access to cryptographic functions via
797
+ an application program interface to a cryptographic library.
798
+ * These libraries are typically not stateful and any nonce,
799
+ initialization vector, or counter required by the cipher mode is
800
+ passed to the cryptographic library by the application.
801
+ * Putting the construction of a security-critical datum outside the
802
+ control of the encryption engine places an onerous burden on the
803
+ application writer who may not provide the necessary cryptographic
804
+ hygiene.
805
+ * Perhaps his random number generator is not very good or maybe an
806
+ application fault causes a counter to be reset. The fragility of
807
+ the cipher mode may result in its inadvertent misuse. Also, if
808
+ one's environment is (knowingly or unknowingly) a virtual machine,
809
+ it may be possible to roll back a virtual state machine and cause
810
+ nonce reuse thereby gutting the security of the authenticated
811
+ encryption scheme.
812
+
813
+ [https://www.schneier.com/books/cryptography_engineering/](https://www.schneier.com/books/cryptography_engineering/)
814
+
815
+ Cryptography Engineering: Design Principles and Practical Applications
816
+
817
+ © 2010 Ferguson, Schneier, Kohno
818
+
819
+ I cite here the book, not the website.
820
+
821
+ * Chapter 3, Section 3.5.6, p59
822
+ * "Despite these cryptographic advances, **AES is still what we
823
+ recommend**. It is fast. All known attacks are theoretical, not
824
+ practical... It is also the official standard, sanctioned by the
825
+ U.S. government."
826
+ * Chapter 3, Section 3.5.7, p60
827
+ * "Note that **we advocate the use of 256-bit keys for systems with
828
+ a design strength of 128 bits**."
829
+ * "To emphasize our desire for 128 bits of security, and thus our
830
+ quest for a secure block cipher, **we will use AES with 256-bit
831
+ keys throughout the rest of this book**." But once there is a
832
+ clear consensus of how to respond to the new cryptanalytic
833
+ results against AES, we will likely replace AWS with another
834
+ block cipher with 256-bit keys."
835
+ * Chapter 4, Section 4.5, p70
836
+ * "As with OFB mode, **you must make absolutely sure never to reuse
837
+ a single key/nonce combination**. This is a disadvantage that is
838
+ often mentioned for CTR, but CBC has exactly the same problem.
839
+ If you use the same IV twice, you start leaking data about the
840
+ plaintexts. **CBC is a bit more robust, as it is more likely to
841
+ * "The real question is whether you can ensure that the nonce is
842
+ unique. If there's any doubt, **you should use a mode like
843
+ random IV CBC mode, where the IV is generated randomly and
844
+ outside of the application developer's control**.
845
+ * Chapter 4, Section 4.7, p71
846
+ * "Nonce generation turns out to be a really hard problem in many
847
+ systems, so we do not recommend exposing to application
848
+ developers any mode that uses nonces. ... so **if you're
849
+ developing an application and need to use an encryption mode,
850
+ play it safe and use random IV CBC mode**.
851
+ * Chapter 5, Section 5.5, p87
852
+ * "In the short term, **we recommend using one of the newer SHA
853
+ hash function family members - SHA-224, SHA-256, SHA-385, or
854
+ SHA-512**. Moreover we suggest you choose a hash function from
855
+ the SHA(sub d) family, or **use SHA-512 and truncate the output
856
+ to 256 bits**. In the long run, **we will very likely recommend
857
+ the winner of the SHA-3 competition**."
858
+ * JHW Note: [https://en.wikipedia.org/wiki/SHA-3](https://en.wikipedia.org/wiki/SHA-3) SHA-3 released August 5, 2015
859
+ * Chapter 6, Introduction, p89
860
+ * "**Encryption** prevents Eve from reading the messages but **does
861
+ not prevent her from manipulating the messages**. This is where
862
+ the MAC comes in."
863
+ * Chapter 6, Section 6.6, p95
864
+ * "As you may have gathered from the previous discussion, **we
865
+ would choose HMAC-SHA-256**: the HMAC construction using SHA-256
866
+ as a hash function. Most systems use 64- or 96-bit MAC values,
867
+ and even that might seem like a lot of overhead. As far as we
868
+ know, there is no collision attack on the MAC value if it is
869
+ used in the traditional manner, so **truncating the results from
870
+ HMAC-SHA-256 to 128 bits should be safe**, given current
871
+ knowledge in the field"
872
+ * "GMAC is fast, but provides only at most 64 bits of security and
873
+ isn't suitable when used to produce short tags. It also
874
+ requires a nonce, which is a common source of security problem
875
+ [sic -jhw]."
876
+ * Chapter 6, Section 6.7, p97
877
+ * "This is where the Horton Principle comes in. **You should
878
+ authenticate the meaning, not the message.** This means that **the
879
+ MAC should authenticate not only _m_, but also all the
880
+ information that Bob uses in parsing _m_ into its meaning**.
881
+ This would typically include data like protocol identifier,
882
+ protocol version number, protocol message identifier, sizes for
883
+ various fields, etc."
884
+ * "The Horton Principle is one of the reasons why **authentication
885
+ at lower protocol levels does not provide adequate
886
+ authentication for higher-level protocols**. An authentication
887
+ system at the IP packet level cannot know how the e-mail program
888
+ is going to interpret the data. This precludes it from checking
889
+ that the context in which the message is interpreted is the same
890
+ as the context in which the message was sent. The only solution
891
+ is to have the e-mail program provide its own authentication of
892
+ the data exchanged - in addition to the authentication on the
893
+ lower levels of course."