/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Definitions of EC-RDSA Curve Parameters
*
* Copyright (c) 2019 Vitaly Chikunov <vt@altlinux.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*/
#ifndef _CRYTO_ECRDSA_DEFS_H
#define _CRYTO_ECRDSA_DEFS_H
#include <crypto/internal/ecc.h>
#define ECRDSA_MAX_SIG_SIZE (2 * 512 / 8 )
#define ECRDSA_MAX_DIGITS (512 / 64 )
/*
* EC-RDSA uses its own set of curves.
*
* cp256{a,b,c} curves first defined for GOST R 34.10-2001 in RFC 4357 (as
* 256-bit {A,B,C}-ParamSet), but inherited for GOST R 34.10-2012 and
* proposed for use in R 50.1.114-2016 and RFC 7836 as the 256-bit curves.
*/
/* OID_gostCPSignA 1.2.643.2.2.35.1 */
static u64 cp256a_g_x[] = {
0 x0000000000000001ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull, };
static u64 cp256a_g_y[] = {
0 x22ACC99C9E9F1E14ull, 0 x35294F2DDF23E3B1ull,
0 x27DF505A453F2B76ull, 0 x8D91E471E0989CDAull, };
static u64 cp256a_p[] = { /* p = 2^256 - 617 */
0 xFFFFFFFFFFFFFD97ull, 0 xFFFFFFFFFFFFFFFFull,
0 xFFFFFFFFFFFFFFFFull, 0 xFFFFFFFFFFFFFFFFull };
static u64 cp256a_n[] = {
0 x45841B09B761B893ull, 0 x6C611070995AD100ull,
0 xFFFFFFFFFFFFFFFFull, 0 xFFFFFFFFFFFFFFFFull };
static u64 cp256a_a[] = { /* a = p - 3 */
0 xFFFFFFFFFFFFFD94ull, 0 xFFFFFFFFFFFFFFFFull,
0 xFFFFFFFFFFFFFFFFull, 0 xFFFFFFFFFFFFFFFFull };
static u64 cp256a_b[] = {
0 x00000000000000a6ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull };
static struct ecc_curve gost_cp256a = {
.name = "cp256a" ,
.nbits = 256 ,
.g = {
.x = cp256a_g_x,
.y = cp256a_g_y,
.ndigits = 256 / 64 ,
},
.p = cp256a_p,
.n = cp256a_n,
.a = cp256a_a,
.b = cp256a_b
};
/* OID_gostCPSignB 1.2.643.2.2.35.2 */
static u64 cp256b_g_x[] = {
0 x0000000000000001ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull, };
static u64 cp256b_g_y[] = {
0 x744BF8D717717EFCull, 0 xC545C9858D03ECFBull,
0 xB83D1C3EB2C070E5ull, 0 x3FA8124359F96680ull, };
static u64 cp256b_p[] = { /* p = 2^255 + 3225 */
0 x0000000000000C99ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x8000000000000000ull, };
static u64 cp256b_n[] = {
0 xE497161BCC8A198Full, 0 x5F700CFFF1A624E5ull,
0 x0000000000000001ull, 0 x8000000000000000ull, };
static u64 cp256b_a[] = { /* a = p - 3 */
0 x0000000000000C96ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x8000000000000000ull, };
static u64 cp256b_b[] = {
0 x2F49D4CE7E1BBC8Bull, 0 xE979259373FF2B18ull,
0 x66A7D3C25C3DF80Aull, 0 x3E1AF419A269A5F8ull, };
static struct ecc_curve gost_cp256b = {
.name = "cp256b" ,
.nbits = 256 ,
.g = {
.x = cp256b_g_x,
.y = cp256b_g_y,
.ndigits = 256 / 64 ,
},
.p = cp256b_p,
.n = cp256b_n,
.a = cp256b_a,
.b = cp256b_b
};
/* OID_gostCPSignC 1.2.643.2.2.35.3 */
static u64 cp256c_g_x[] = {
0 x0000000000000000ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull, };
static u64 cp256c_g_y[] = {
0 x366E550DFDB3BB67ull, 0 x4D4DC440D4641A8Full,
0 x3CBF3783CD08C0EEull, 0 x41ECE55743711A8Cull, };
static u64 cp256c_p[] = {
0 x7998F7B9022D759Bull, 0 xCF846E86789051D3ull,
0 xAB1EC85E6B41C8AAull, 0 x9B9F605F5A858107ull,
/* pre-computed value for Barrett's reduction */
0 xedc283cdd217b5a2ull, 0 xbac48fc06398ae59ull,
0 x405384d55f9f3b73ull, 0 xa51f176161f1d734ull,
0 x0000000000000001ull, };
static u64 cp256c_n[] = {
0 xF02F3A6598980BB9ull, 0 x582CA3511EDDFB74ull,
0 xAB1EC85E6B41C8AAull, 0 x9B9F605F5A858107ull, };
static u64 cp256c_a[] = { /* a = p - 3 */
0 x7998F7B9022D7598ull, 0 xCF846E86789051D3ull,
0 xAB1EC85E6B41C8AAull, 0 x9B9F605F5A858107ull, };
static u64 cp256c_b[] = {
0 x000000000000805aull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull, };
static struct ecc_curve gost_cp256c = {
.name = "cp256c" ,
.nbits = 256 ,
.g = {
.x = cp256c_g_x,
.y = cp256c_g_y,
.ndigits = 256 / 64 ,
},
.p = cp256c_p,
.n = cp256c_n,
.a = cp256c_a,
.b = cp256c_b
};
/* tc512{a,b} curves first recommended in 2013 and then standardized in
* R 50.1.114-2016 and RFC 7836 for use with GOST R 34.10-2012 (as TC26
* 512-bit ParamSet{A,B}).
*/
/* OID_gostTC26Sign512A 1.2.643.7.1.2.1.2.1 */
static u64 tc512a_g_x[] = {
0 x0000000000000003ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull, };
static u64 tc512a_g_y[] = {
0 x89A589CB5215F2A4ull, 0 x8028FE5FC235F5B8ull,
0 x3D75E6A50E3A41E9ull, 0 xDF1626BE4FD036E9ull,
0 x778064FDCBEFA921ull, 0 xCE5E1C93ACF1ABC1ull,
0 xA61B8816E25450E6ull, 0 x7503CFE87A836AE3ull, };
static u64 tc512a_p[] = { /* p = 2^512 - 569 */
0 xFFFFFFFFFFFFFDC7ull, 0 xFFFFFFFFFFFFFFFFull,
0 xFFFFFFFFFFFFFFFFull, 0 xFFFFFFFFFFFFFFFFull,
0 xFFFFFFFFFFFFFFFFull, 0 xFFFFFFFFFFFFFFFFull,
0 xFFFFFFFFFFFFFFFFull, 0 xFFFFFFFFFFFFFFFFull, };
static u64 tc512a_n[] = {
0 xCACDB1411F10B275ull, 0 x9B4B38ABFAD2B85Dull,
0 x6FF22B8D4E056060ull, 0 x27E69532F48D8911ull,
0 xFFFFFFFFFFFFFFFFull, 0 xFFFFFFFFFFFFFFFFull,
0 xFFFFFFFFFFFFFFFFull, 0 xFFFFFFFFFFFFFFFFull, };
static u64 tc512a_a[] = { /* a = p - 3 */
0 xFFFFFFFFFFFFFDC4ull, 0 xFFFFFFFFFFFFFFFFull,
0 xFFFFFFFFFFFFFFFFull, 0 xFFFFFFFFFFFFFFFFull,
0 xFFFFFFFFFFFFFFFFull, 0 xFFFFFFFFFFFFFFFFull,
0 xFFFFFFFFFFFFFFFFull, 0 xFFFFFFFFFFFFFFFFull, };
static u64 tc512a_b[] = {
0 x503190785A71C760ull, 0 x862EF9D4EBEE4761ull,
0 x4CB4574010DA90DDull, 0 xEE3CB090F30D2761ull,
0 x79BD081CFD0B6265ull, 0 x34B82574761CB0E8ull,
0 xC1BD0B2B6667F1DAull, 0 xE8C2505DEDFC86DDull, };
static struct ecc_curve gost_tc512a = {
.name = "tc512a" ,
.nbits = 512 ,
.g = {
.x = tc512a_g_x,
.y = tc512a_g_y,
.ndigits = 512 / 64 ,
},
.p = tc512a_p,
.n = tc512a_n,
.a = tc512a_a,
.b = tc512a_b
};
/* OID_gostTC26Sign512B 1.2.643.7.1.2.1.2.2 */
static u64 tc512b_g_x[] = {
0 x0000000000000002ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull, };
static u64 tc512b_g_y[] = {
0 x7E21340780FE41BDull, 0 x28041055F94CEEECull,
0 x152CBCAAF8C03988ull, 0 xDCB228FD1EDF4A39ull,
0 xBE6DD9E6C8EC7335ull, 0 x3C123B697578C213ull,
0 x2C071E3647A8940Full, 0 x1A8F7EDA389B094Cull, };
static u64 tc512b_p[] = { /* p = 2^511 + 111 */
0 x000000000000006Full, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x8000000000000000ull, };
static u64 tc512b_n[] = {
0 xC6346C54374F25BDull, 0 x8B996712101BEA0Eull,
0 xACFDB77BD9D40CFAull, 0 x49A1EC142565A545ull,
0 x0000000000000001ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x8000000000000000ull, };
static u64 tc512b_a[] = { /* a = p - 3 */
0 x000000000000006Cull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x0000000000000000ull,
0 x0000000000000000ull, 0 x8000000000000000ull, };
static u64 tc512b_b[] = {
0 xFB8CCBC7C5140116ull, 0 x50F78BEE1FA3106Eull,
0 x7F8B276FAD1AB69Cull, 0 x3E965D2DB1416D21ull,
0 xBF85DC806C4B289Full, 0 xB97C7D614AF138BCull,
0 x7E3E06CF6F5E2517ull, 0 x687D1B459DC84145ull, };
static struct ecc_curve gost_tc512b = {
.name = "tc512b" ,
.nbits = 512 ,
.g = {
.x = tc512b_g_x,
.y = tc512b_g_y,
.ndigits = 512 / 64 ,
},
.p = tc512b_p,
.n = tc512b_n,
.a = tc512b_a,
.b = tc512b_b
};
#endif
Messung V0.5 in Prozent C=95 H=91 G=92
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-08)
¤
*© Formatika GbR, Deutschland