diff options
author | schwarze <> | 2018-03-30 18:38:22 +0000 |
---|---|---|
committer | schwarze <> | 2018-03-30 18:38:22 +0000 |
commit | 810118eed119b981459082f7ecf50c1acb764fcd (patch) | |
tree | 699c65fd5a3a439a747f7f1ed3eec0bdefe8b9ab | |
parent | b11798247d8aaa0d3dc696c0a1f41d6113b2756e (diff) | |
download | openbsd-810118eed119b981459082f7ecf50c1acb764fcd.tar.gz openbsd-810118eed119b981459082f7ecf50c1acb764fcd.tar.bz2 openbsd-810118eed119b981459082f7ecf50c1acb764fcd.zip |
jsing@ points out to me that our X25519 interface was copied from
BoringSSL rather than from OpenSSL and that it is not hooked into evp(3).
So delete all text from OpenSSL including the Copyright and license
and replace it by some text assembled from comments in BoringSSL
code and headers and some text written myself, all under ISC license.
In particular, also describe X25519_keypair(3), add SYNOPSIS, RETURN
VALUES, STANDARDS, and a reference to D. J. Bernsteins instructions
on how to use the algorithm. Delete the text related to EVP_PKEY
describing features we do not support.
-rw-r--r-- | src/lib/libcrypto/man/X25519.3 | 183 |
1 files changed, 85 insertions, 98 deletions
diff --git a/src/lib/libcrypto/man/X25519.3 b/src/lib/libcrypto/man/X25519.3 index 6292d33ff5..b2812149b1 100644 --- a/src/lib/libcrypto/man/X25519.3 +++ b/src/lib/libcrypto/man/X25519.3 | |||
@@ -1,112 +1,99 @@ | |||
1 | .\" $OpenBSD: X25519.3,v 1.2 2018/03/30 01:03:51 schwarze Exp $ | 1 | .\" $OpenBSD: X25519.3,v 1.3 2018/03/30 18:38:22 schwarze Exp $ |
2 | .\" full merge up to: OpenSSL man7/X25519 69687aa8 Mar 28 23:57:28 2017 +0200 | 2 | .\" contains some text from: BoringSSL curve25519.h, curve25519.c |
3 | .\" selective merge up to: OpenSSL f929439f Mar 15 12:19:16 2018 +0000 | 3 | .\" content also checked up to: OpenSSL f929439f Mar 15 12:19:16 2018 +0000 |
4 | .\" | 4 | .\" |
5 | .\" This file was written by Dr. Stephen Henson <steve@openssl.org> | 5 | .\" Copyright (c) 2015 Google Inc. |
6 | .\" and Matt Caswell <matt@openssl.org>. | 6 | .\" Copyright (c) 2018 Ingo Schwarze <schwarze@openbsd.org> |
7 | .\" Copyright (c) 2017, 2018 The OpenSSL Project. All rights reserved. | ||
8 | .\" | 7 | .\" |
9 | .\" Redistribution and use in source and binary forms, with or without | 8 | .\" Permission to use, copy, modify, and/or distribute this software for any |
10 | .\" modification, are permitted provided that the following conditions | 9 | .\" purpose with or without fee is hereby granted, provided that the above |
11 | .\" are met: | 10 | .\" copyright notice and this permission notice appear in all copies. |
12 | .\" | 11 | .\" |
13 | .\" 1. Redistributions of source code must retain the above copyright | 12 | .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES |
14 | .\" notice, this list of conditions and the following disclaimer. | 13 | .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
15 | .\" | 14 | .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR |
16 | .\" 2. Redistributions in binary form must reproduce the above copyright | 15 | .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
17 | .\" notice, this list of conditions and the following disclaimer in | 16 | .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
18 | .\" the documentation and/or other materials provided with the | 17 | .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
19 | .\" distribution. | 18 | .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
20 | .\" | ||
21 | .\" 3. All advertising materials mentioning features or use of this | ||
22 | .\" software must display the following acknowledgment: | ||
23 | .\" "This product includes software developed by the OpenSSL Project | ||
24 | .\" for use in the OpenSSL Toolkit. (http://www.openssl.org/)" | ||
25 | .\" | ||
26 | .\" 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | ||
27 | .\" endorse or promote products derived from this software without | ||
28 | .\" prior written permission. For written permission, please contact | ||
29 | .\" openssl-core@openssl.org. | ||
30 | .\" | ||
31 | .\" 5. Products derived from this software may not be called "OpenSSL" | ||
32 | .\" nor may "OpenSSL" appear in their names without prior written | ||
33 | .\" permission of the OpenSSL Project. | ||
34 | .\" | ||
35 | .\" 6. Redistributions of any form whatsoever must retain the following | ||
36 | .\" acknowledgment: | ||
37 | .\" "This product includes software developed by the OpenSSL Project | ||
38 | .\" for use in the OpenSSL Toolkit (http://www.openssl.org/)" | ||
39 | .\" | ||
40 | .\" THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | ||
41 | .\" EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
42 | .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
43 | .\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | ||
44 | .\" ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
45 | .\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
46 | .\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
47 | .\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
48 | .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
49 | .\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
50 | .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
51 | .\" OF THE POSSIBILITY OF SUCH DAMAGE. | ||
52 | .\" | 19 | .\" |
53 | .Dd $Mdocdate: March 30 2018 $ | 20 | .Dd $Mdocdate: March 30 2018 $ |
54 | .Dt X25519 3 | 21 | .Dt X25519 3 |
55 | .Os | 22 | .Os |
56 | .Sh NAME | 23 | .Sh NAME |
57 | .Nm X25519 | 24 | .Nm X25519 , |
58 | .Nd EVP_PKEY X25519 support | 25 | .Nm X25519_keypair |
26 | .Nd Elliptic Curve Diffie-Hellman primitive based on Curve25519 | ||
27 | .Sh SYNOPSIS | ||
28 | .Ft int | ||
29 | .Fo X25519 | ||
30 | .Fa "uint8_t out_shared_key[X25519_KEY_LENGTH]" | ||
31 | .Fa "const uint8_t private_key[X25519_KEY_LENGTH]" | ||
32 | .Fa "const uint8_t peer_public_value[X25519_KEY_LENGTH]" | ||
33 | .Fc | ||
34 | .Ft void | ||
35 | .Fo X25519_keypair | ||
36 | .Fa "uint8_t out_public_value[X25519_KEY_LENGTH]" | ||
37 | .Fa "uint8_t out_private_key[X25519_KEY_LENGTH]" | ||
38 | .Fc | ||
59 | .Sh DESCRIPTION | 39 | .Sh DESCRIPTION |
60 | The | 40 | Curve25519 is an elliptic curve over a prime field specified in RFC 7748. |
61 | .Nm | 41 | The prime field is defined by the prime number 2^255 - 19. |
62 | .Vt EVP_PKEY | ||
63 | implementation supports key generation and key derivation using X25519. | ||
64 | It has associated private and public key formats compatible with | ||
65 | draft-ietf-curdle-pkix-03. | ||
66 | .Pp | ||
67 | No additional parameters can be set during key generation. | ||
68 | .Pp | ||
69 | The peer public key must be set using | ||
70 | .Xr EVP_PKEY_derive_set_peer 3 | ||
71 | when performing key derivation. | ||
72 | .Pp | ||
73 | A context for the | ||
74 | .Nm | ||
75 | algorithm can be obtained by calling: | ||
76 | .Pp | 42 | .Pp |
77 | .Dl EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(NID_X25519, NULL); | 43 | .Fn X25519 |
44 | is the Diffie-Hellman primitive built from Curve25519 as described | ||
45 | in RFC 7748 section 5. | ||
46 | Section 6.1 describes the intended use in an Elliptic Curve Diffie-Hellman | ||
47 | (ECDH) protocol. | ||
78 | .Pp | 48 | .Pp |
79 | X25519 private keys can be loaded from a PKCS#8 private key file using | 49 | .Fn X25519 |
80 | .Xr PEM_read_bio_PrivateKey 3 | 50 | writes a shared key to |
81 | or similar functions. | 51 | .Fa out_shared_key |
82 | Setting a private key also sets the associated public key. | 52 | that is calculated from the given |
53 | .Fa private_key | ||
54 | and the | ||
55 | .Fa peer_public_value | ||
56 | by scalar multiplication. | ||
57 | Do not use the shared key directly, rather use a key derivation | ||
58 | function and also include the two public values as inputs. | ||
83 | .Pp | 59 | .Pp |
84 | X25519 public keys can be loaded from a SubjectPublicKeyInfo | 60 | .Fn X25519_keypair |
85 | structure in a PEM file using | 61 | sets |
86 | .Xr PEM_read_bio_PUBKEY 3 | 62 | .Fa out_public_value |
87 | or similar functions. | 63 | and |
88 | .Sh EXAMPLES | 64 | .Fa out_private_key |
89 | Generate an | 65 | to a freshly generated public/private key pair. |
90 | .Nm | 66 | First, the |
91 | private key and write it to standard output in PEM format: | 67 | .Fa out_private_key |
92 | .Bd -literal | 68 | is generated with |
93 | #include <openssl/evp.h> | 69 | .Xr arc4random_buf 3 . |
94 | #include <openssl/pem.h> | 70 | Then, the opposite of the masking described in RFC 7748 section 5 |
95 | 71 | is applied to it to make sure that the generated private key is never | |
96 | EVP_PKEY *pkey = NULL; | 72 | correctly masked. |
97 | EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(NID_X25519, NULL); | 73 | The purpose is to cause incorrect implementations on the peer side |
98 | EVP_PKEY_keygen_init(pctx); | 74 | to consistently fail. |
99 | EVP_PKEY_keygen(pctx, &pkey); | 75 | Correct implementations will decode the key correctly even when it is |
100 | EVP_PKEY_CTX_free(pctx); | 76 | not correctly masked. |
101 | PEM_write_PrivateKey(stdout, pkey, NULL, NULL, 0, NULL, NULL); | 77 | Finally, the |
102 | .Ed | 78 | .Fa out_public_value |
79 | is calculated from the | ||
80 | .Fa out_private_key | ||
81 | by multiplying it with the Montgomery base point | ||
82 | .Vt uint8_t u[32] No = Brq 9 . | ||
103 | .Pp | 83 | .Pp |
104 | The key derivation example in | 84 | The size of a public and private key is |
105 | .Xr EVP_PKEY_derive 3 | 85 | .Dv X25519_KEY_LENGTH No = 32 |
106 | can be used with | 86 | bytes each. |
107 | .Nm . | 87 | .Sh RETURN VALUES |
88 | .Fn X25519 | ||
89 | returns 1 on success or 0 on error. | ||
90 | Failure can occur when the input is a point of small order. | ||
108 | .Sh SEE ALSO | 91 | .Sh SEE ALSO |
109 | .Xr EVP_PKEY_CTX_new 3 , | 92 | .Rs |
110 | .Xr EVP_PKEY_derive 3 , | 93 | .%A D. J. Bernstein |
111 | .Xr EVP_PKEY_keygen 3 , | 94 | .%R A state-of-the-art Diffie-Hellman function:\ |
112 | .Xr PEM_read_bio_PrivateKey 3 | 95 | How do I use Curve25519 in my own software? |
96 | .%U http://cr.yp.to/ecdh.html | ||
97 | .Re | ||
98 | .Sh STANDARDS | ||
99 | RFC 7748: Elliptic Curves for Security | ||