2 * Copyright (C) 2001-2003 by NBMK Encryption Technologies.
5 * NBMK Encryption Technologies provides no support of any kind for
6 * this software. Questions or concerns about it may be addressed to
7 * the members of the relevant open-source community at
8 * <tech-crypto@netbsd.org>.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions are
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above
18 * copyright notice, this list of conditions and the following
19 * disclaimer in the documentation and/or other materials provided
20 * with the distribution.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 /*****************************************************************************
36 * @(#) n8_dsa.h 1.25@(#)
37 *****************************************************************************/
39 /*****************************************************************************/
41 * @brief Contains definitions for DSA functions.
43 *****************************************************************************/
45 /*****************************************************************************
47 * 05/19/03 brr Clean up include files.
48 * 02/20/02 brr Removed references to the queue structure.
49 * 01/29/02 bac Renamed NUMBER_OF_BYTES_IN_VALUE to DSA_SIGN_LENGTH.
50 * 11/19/01 bac Added n8_DSAValidateKey.
51 * 11/10/01 spm Replaced use of ceil() with homemade integer version.
52 * 10/12/01 dkm Moved public portion to n8_pub_common.h and n8_pub_pk.h.
53 * 10/01/01 hml Added UnitID and SKSKeyHandle in the KeyObject and moved
54 * the material struct in here.
55 * 09/10/01 bac Test for public key and modulus lengths in
56 * N8_DSAInitializeKey (BUG #129). Added
57 * N8_DSA_PUBLIC_KEY_LENGTH_[MIN|MAX] and
58 * N8_DSA_PRIVATE_KEY_LENGTH.
59 * 08/16/01 mmd Now including n8_driver_api.h instead of simon_driver_api.h.
60 * 07/30/01 bac Fixed length calculation macros to accept and use a queue
61 * control pointer. Lots of logic changes to be seemlessly
62 * portable to the FPGA.
63 * 06/28/01 bac Minor typo fix.
64 * 06/25/01 bac Lots of changes to affect functionality with the v1.0.1 QMgr
65 * 05/22/01 mel Original version.
66 ****************************************************************************/
70 #include "n8_common.h"
71 #include "n8_pub_pk.h"
72 #include "n8_pk_common.h"
73 #include "n8_pub_errors.h"
74 #include "n8_driver_api.h"
77 #define DSA_SIGN_LENGTH 20
79 /* Macros for extracting DSA parameters from the Big Number Cache.
80 These take key_length as a parameter. Some will behave badly
81 if key_length is odd. */
83 /* Several DSA quanties are of fixed length. They must fit in the least number of BNC
84 * digits to ensure the uppermost digit is not zero.
86 #define PK_DSA_N_Bit_Length 160
87 #define PK_DSA_E1_Bit_Length 160
88 #define PK_DSA_Q_Bit_Length 160
89 #define PK_DSA_R_Bit_Length 160
90 #define PK_DSA_S_Bit_Length 160
91 #define PK_DSA_X_Bit_Length 160
93 /* length of private key in bytes */
94 #define N8_DSA_PRIVATE_KEY_LENGTH 20
95 #define N8_DSA_PUBLIC_KEY_LENGTH_MIN 64
96 #define N8_DSA_PUBLIC_KEY_LENGTH_MAX 512
99 * N 160 bits (rounded up)
100 * E1 160 bits (rounded up)
101 * R 160 bits (rounded up)
102 * S 160 bits (rounded up)
104 * g R mod p key length
105 * Q 160 bits (rounded up)
106 * X 160 bits (rounded up)
109 #define PK_DSA_RoundUp(__L) (CEIL((__L) , (SIMON_BITS_PER_DIGIT)))
111 #define PK_DSA_N_Byte_Length PKDIGITS_TO_BYTES(PK_DSA_N_BNC_Length)
112 #define PK_DSA_E1_Byte_Length PKDIGITS_TO_BYTES(PK_DSA_E1_BNC_Length)
113 #define PK_DSA_R_Byte_Length PKDIGITS_TO_BYTES(PK_DSA_R_BNC_Length)
114 #define PK_DSA_S_Byte_Length PKDIGITS_TO_BYTES(PK_DSA_S_BNC_Length)
116 #define PK_DSA_P_Byte_Length(__KL) ((__KL)*PK_Bytes_Per_BigNum_Digit)
117 #define PK_DSA_P_Param_Offset (0)
119 #define PK_DSA_G_Byte_Length(__KL) ((__KL)*PK_Bytes_Per_BigNum_Digit)
120 #define PK_DSA_GR_MOD_P_Byte_Length(__KL) ((__KL)*PK_Bytes_Per_BigNum_Digit)
121 #define PK_DSA_GR_MOD_P_Param_Offset(__KL) PKDIGITS_TO_BYTES(__KL)
123 #define PK_DSA_INVK_Byte_Length (2*PK_Bytes_Per_BigNum_Digit)
124 #define PK_DSA_Q_Byte_Length PKDIGITS_TO_BYTES(PK_DSA_Q_BNC_Length)
125 #define PK_DSA_Q_Param_Offset(__KL) PKDIGITS_TO_BYTES(2*(__KL))
127 #define PK_DSA_X_Byte_Length PKDIGITS_TO_BYTES(PK_DSA_X_BNC_Length)
128 #define PK_DSA_X_Param_Offset(__KL) PKDIGITS_TO_BYTES(2*(__KL)+PK_DSA_Q_BNC_Length)
130 #define PK_DSA_Y_Byte_Length(__KL) ((__KL)*PK_Bytes_Per_BigNum_Digit)
132 #define PK_DSA_CP_Byte_Length (PK_Bytes_Per_BigNum_Digit)
133 #define PK_DSA_CP_Param_Offset(__KL) \
134 (PK_DSA_X_Param_Offset((__KL)) + PK_DSA_X_Byte_Length)
136 #define PK_DSA_Param_Byte_Length(__KL) \
137 PK_DSA_P_Byte_Length((__KL)) + \
138 PK_DSA_GR_MOD_P_Byte_Length((__KL)) + \
139 PK_DSA_Q_Byte_Length + \
140 PK_DSA_X_Byte_Length + \
141 PK_DSA_CP_Byte_Length
144 #define PK_DSA_SKS_Word_Length(__KL) (8*(__KL)+20)
147 #define PK_DSA_N_BNC_Offset (0)
148 #define PK_DSA_E1_BNC_Offset (PK_DSA_N_BNC_Offset + PK_DSA_N_BNC_Length)
149 #define PK_DSA_R_BNC_Offset (PK_DSA_E1_BNC_Offset + PK_DSA_E1_BNC_Length)
150 #define PK_DSA_S_BNC_Offset (PK_DSA_R_BNC_Offset + PK_DSA_R_BNC_Length)
151 #define PK_DSA_P_BNC_Offset (PK_DSA_S_BNC_Offset + PK_DSA_S_BNC_Length)
154 #define PK_DSA_N_BNC_Length PK_DSA_RoundUp(PK_DSA_N_Bit_Length)
155 #define PK_DSA_E1_BNC_Length PK_DSA_RoundUp(PK_DSA_E1_Bit_Length)
156 #define PK_DSA_R_BNC_Length PK_DSA_RoundUp(PK_DSA_R_Bit_Length)
157 #define PK_DSA_S_BNC_Length PK_DSA_RoundUp(PK_DSA_S_Bit_Length)
158 #define PK_DSA_Q_BNC_Length PK_DSA_RoundUp(PK_DSA_Q_Bit_Length)
159 #define PK_DSA_X_BNC_Length PK_DSA_RoundUp(PK_DSA_X_Bit_Length)
160 #define PK_DSA_P_BNC_Length(__KL) (__KL)
161 #define PK_DSA_G_BNC_Length(__KL) (__KL)
162 #define PK_DSA_GR_MOD_P_BNC_Length(__KL) (__KL)
163 #define PK_DSA_Y_BNC_Length(__KL) (__KL)
164 #define PK_DSA_CP_BNC_Length 1
168 uint32_t q
; /* secret prime number. used for
169 private operations. */
170 uint32_t cp
; /* additive inverse of the
171 multiplicative inverse of the least
172 significant digit of p, mod 2^128.
173 used for private operations. */
174 uint32_t gR_mod_p
; /* g*R mod q. (private) */
175 uint32_t p
; /* secret prime number. used for
176 private operations. */
177 uint32_t privateKey
; /* private key x */
178 uint32_t publicKey
; /* public key y */
179 uint32_t g
; /* generator = h^(p-1)/q mod p, where h is less
180 than p - 1 and g > 1. */
181 uint32_t paramBlock
; /* parameter block in PK format,
182 suitable for loading directly into
183 the Big Num Cache (BNC) */
184 } N8_DSAKeyObjectPhysical_t
;
186 /**********************************************************************
187 * function prototypes
188 **********************************************************************/
189 N8_Status_t
n8_DSAValidateKey(const N8_DSAKeyMaterial_t
*material_p
,
190 const N8_KeyType_t type
);
191 #endif /* N8_DSA_H */