Implement writable key algorithm attributes
[gnuk/gnuk.git] / src / ecc-cdh.c
1 /*
2  * ecc-cdh.c - One-Pass Diffie-Hellman method implementation
3  *             C(1, 1, ECC CDH) for EC DH of OpenPGP ECC
4  *
5  * Copyright (C) 2013 Free Software Initiative of Japan
6  * Author: NIIBE Yutaka <gniibe@fsij.org>
7  *
8  * This file is a part of Gnuk, a GnuPG USB Token implementation.
9  *
10  * Gnuk is free software: you can redistribute it and/or modify it
11  * under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * Gnuk is distributed in the hope that it will be useful, but WITHOUT
16  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
18  * License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22  *
23  */
24
25 /*
26  * References:
27  *
28  * [1] A. Jivsov, Elliptic Curve Cryptography (ECC) in OpenPGP, RFC 6637,
29  *     June 2012.
30  *
31  * [2] Suite B Implementer's Guide to NIST SP 800-56A, July 28, 2009.
32  *
33  */
34
35 static const char param[] = {
36   /**/
37   curve_OID_len,
38   curve_OID,
39   public-key_alg_ID, /*ecdh*/
40   0x03,
41   0x01,
42   KDF_hash_ID, /*sha256*/
43   KEK_alg_ID, /*aes128*/
44   "Anonymous Sender    ",
45   my_finger_print /*20-byte*/
46 };
47
48 /*
49  *
50  */
51 int
52 ecdh (unsigned char *key,
53       const unsigned char *key_encrypted, const ac *P,
54       const naf4_257 *naf_d, const unsigned char *fp)
55 {
56   ac S[1];
57   sha256_context ctx;
58   unsigned char kek[32];
59   unsigned char x[32];
60   int i;
61   const unsigned char *p;
62
63   compute_kP (S, naf_d, P);     /* Get shared secret.  */
64
65   /* Endian change from big to little.  */
66   p = (const unsigned char *)S->x;
67   for (i = 0; i < 32; i++)
68     x[31-i] = p[i];
69
70   /* kdf (kek, S, parameter) */
71   sha256_start (&ctx);
72   sha256_update (&ctx, "\x00\x00\x00\x01", 4);
73   sha256_update (&ctx, x, size of x);
74   sha256_update (&ctx, (const char *)param, size of param);
75   sha256_finish (&ctx, kek);
76 }