summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschwarze <>2018-03-30 18:38:22 +0000
committerschwarze <>2018-03-30 18:38:22 +0000
commit810118eed119b981459082f7ecf50c1acb764fcd (patch)
tree699c65fd5a3a439a747f7f1ed3eec0bdefe8b9ab
parentb11798247d8aaa0d3dc696c0a1f41d6113b2756e (diff)
downloadopenbsd-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.3183
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
60The 40Curve25519 is an elliptic curve over a prime field specified in RFC 7748.
61.Nm 41The prime field is defined by the prime number 2^255 - 19.
62.Vt EVP_PKEY
63implementation supports key generation and key derivation using X25519.
64It has associated private and public key formats compatible with
65draft-ietf-curdle-pkix-03.
66.Pp
67No additional parameters can be set during key generation.
68.Pp
69The peer public key must be set using
70.Xr EVP_PKEY_derive_set_peer 3
71when performing key derivation.
72.Pp
73A context for the
74.Nm
75algorithm 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
44is the Diffie-Hellman primitive built from Curve25519 as described
45in RFC 7748 section 5.
46Section 6.1 describes the intended use in an Elliptic Curve Diffie-Hellman
47(ECDH) protocol.
78.Pp 48.Pp
79X25519 private keys can be loaded from a PKCS#8 private key file using 49.Fn X25519
80.Xr PEM_read_bio_PrivateKey 3 50writes a shared key to
81or similar functions. 51.Fa out_shared_key
82Setting a private key also sets the associated public key. 52that is calculated from the given
53.Fa private_key
54and the
55.Fa peer_public_value
56by scalar multiplication.
57Do not use the shared key directly, rather use a key derivation
58function and also include the two public values as inputs.
83.Pp 59.Pp
84X25519 public keys can be loaded from a SubjectPublicKeyInfo 60.Fn X25519_keypair
85structure in a PEM file using 61sets
86.Xr PEM_read_bio_PUBKEY 3 62.Fa out_public_value
87or similar functions. 63and
88.Sh EXAMPLES 64.Fa out_private_key
89Generate an 65to a freshly generated public/private key pair.
90.Nm 66First, the
91private key and write it to standard output in PEM format: 67.Fa out_private_key
92.Bd -literal 68is generated with
93#include <openssl/evp.h> 69.Xr arc4random_buf 3 .
94#include <openssl/pem.h> 70Then, the opposite of the masking described in RFC 7748 section 5
95 71is applied to it to make sure that the generated private key is never
96EVP_PKEY *pkey = NULL; 72correctly masked.
97EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(NID_X25519, NULL); 73The purpose is to cause incorrect implementations on the peer side
98EVP_PKEY_keygen_init(pctx); 74to consistently fail.
99EVP_PKEY_keygen(pctx, &pkey); 75Correct implementations will decode the key correctly even when it is
100EVP_PKEY_CTX_free(pctx); 76not correctly masked.
101PEM_write_PrivateKey(stdout, pkey, NULL, NULL, 0, NULL, NULL); 77Finally, the
102.Ed 78.Fa out_public_value
79is calculated from the
80.Fa out_private_key
81by multiplying it with the Montgomery base point
82.Vt uint8_t u[32] No = Brq 9 .
103.Pp 83.Pp
104The key derivation example in 84The size of a public and private key is
105.Xr EVP_PKEY_derive 3 85.Dv X25519_KEY_LENGTH No = 32
106can be used with 86bytes each.
107.Nm . 87.Sh RETURN VALUES
88.Fn X25519
89returns 1 on success or 0 on error.
90Failure 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
99RFC 7748: Elliptic Curves for Security