windows-nt/Source/XPSP1/NT/ds/win32/ntcrypto/dssinc/cryptdsa.h

136 lines
5.8 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
#ifndef __CRYPTDSA_
#define __CRYPTDSA_
#ifdef __cplusplus
extern "C" {
#endif
#define SHA_BITS 160
// Number of bits output by SHA
#define SHA_DWORDS 5
// Number of DWORDS output by SHA
#define DSA_Q_MINDWORDS 5
// Minimum number of DWORDS in q
#define DSA_Q_MAXDWORDS 128
// Maximum number of DWORDS in q
#define DSA_P_MINDWORDS 16
// Minimum number of DWORDS in p
#define DSA_P_MAXDWORDS 128
// Maximum number of DWORDS in p
#define DSA_Q_MAXDIGITS DWORDS_TO_DIGITS(DSA_Q_MAXDWORDS)
#define DSA_P_MAXDIGITS DWORDS_TO_DIGITS(DSA_P_MAXDWORDS)
typedef struct {
void *pInfo;
void *pFuncRNG;
} RNGINFO;
typedef struct {
DWORD nbitp; // Number of significant bits in p.
// (Multiple of 64, 512 <= nbitp <= 1024)
DWORD nbitq; // Number of significant bits in q.
// Must be exactly 160.
DWORD p[DSA_P_MAXDWORDS];// Public prime p, 512-1024 bits
DWORD q[DSA_Q_MAXDWORDS];// Public prime q (160 bits, divides p-1)
DWORD g[DSA_P_MAXDWORDS];// Public generator g of order q (mod p)
DWORD j[DSA_P_MAXDWORDS];// j = (p - 1) / q
DWORD y[DSA_P_MAXDWORDS];// Public value g^x (mod p), where x is private
DWORD S[SHA_DWORDS]; // 160-bit pattern used to construct q
DWORD C; // 12-bit value of C used to construct p
} dsa_public_t;
typedef struct {
digit_t qdigit[DSA_Q_MAXDIGITS];
DWORD lngq_digits; // Length of q in digits
reciprocal_1_t qrecip; // Information about 1/q
digit_t gmodular[DSA_P_MAXDIGITS];
// g as residue mod p
digit_t ymodular[DSA_P_MAXDIGITS];
// y as residue mod p
mp_modulus_t pmodulus; // Constants mod p
} dsa_precomputed_t;
typedef struct {
dsa_public_t pub; // Public data
DWORD x[DSA_P_MAXDWORDS];// Private exponent x (mod q)
dsa_precomputed_t precomputed; // Precomputed public data
} dsa_private_t;
typedef struct {
DWORD r[SHA_DWORDS]; // (g^k mod p) mod q
DWORD s[SHA_DWORDS]; // (SHA(m) + x*r)/k mod q
} dsa_signature_t;
typedef struct {
VOID *pOffload; // pointer to expo offload info
FARPROC pFuncExpoOffload;
RNGINFO *pRNGInfo; // pointer to RNG info
} dsa_other_info;
typedef const dsa_precomputed_t dsa_precomputed_tc;
typedef const dsa_private_t dsa_private_tc;
typedef const dsa_public_t dsa_public_tc;
typedef const dsa_signature_t dsa_signature_tc;
void DSA_gen_x(DWORDC cXDigits, // In
DWORDC cXDwords, // In
digit_t *pMod, // In
dsa_other_info *pOtherInfo, // In
DWORD *pdwX, // Out
digit_t *pXDigit); // Out
BOOL DSA_gen_x_and_y(BOOL fUseQ, // In
dsa_other_info *pOtherInfo, // In
dsa_private_t *privkey); // Out
BOOL DSA_check_g(DWORDC lngp_digits, // In
digit_tc *pGModular, // In
mp_modulus_t *pPModulo, // In
DWORDC lngq_digits, // In
digit_tc *pQDigit); // In
BOOL DSA_key_generation(DWORDC nbitp, // In
DWORDC nbitq, // In
dsa_other_info *pOtherInfo, // In
dsa_private_t *privkey); // Out
BOOL DSA_key_import_fillin(dsa_private_t *privkey); // In, Out
BOOL DSA_precompute_pgy(dsa_public_tc *pubkey, // In
dsa_precomputed_t *precomputed); // Out
BOOL DSA_precompute(dsa_public_tc *pubkey, // In
dsa_precomputed_t *precomputed, // Out
const BOOL checkSC); // In
BOOL DSA_sign(DWORDC message_hash[SHA_DWORDS], /* TBD */
dsa_private_tc *privkey,
dsa_signature_t *signature,
dsa_other_info *pOtherInfo);
BOOL DSA_signature_verification(DWORDC message_hash[SHA_DWORDS],
dsa_public_tc *pubkey,
dsa_precomputed_tc *precomputed_argument,
dsa_signature_tc *signature,
dsa_other_info *pOtherInfo);
BOOL DSA_parameter_verification(
dsa_public_tc *pPubkey,
dsa_precomputed_tc *pPrecomputed
);
BOOL DSA_verify_j(
dsa_public_tc *pPubkey,
dsa_precomputed_tc *pPrecomputed
);
#ifdef __cplusplus
}
#endif
#endif __CRYPTDSA_