131 lines
5.6 KiB
C
131 lines
5.6 KiB
C
#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 {
|
|
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_
|
|
|