Example of Using Discrete-logarithm Based Primitive Functions¶
Use of DLPSignDSA and DLPVerifyDSA
//
// known domain parameters
//
static const int M = 512; // DSA system bitsize
static const int L = 160; // DSA order bitsize
static
BigNumber P("0x8DF2A494492276AA3D25759BB06869CBEAC0D83AFB8D0CF7" \
"CBB8324F0D7882E5D0762FC5B7210EAFC2E9ADAC32AB7AAC" \
"49693DFBF83724C2EC0736EE31C80291");
static
BigNumber Q("0xC773218C737EC8EE993B4F2DED30F48EDACE915F");
static
BigNumber G("0x626D027839EA0A13413163A55B4CB500299D5522956CEFCB" \
"3BFF10F399CE2C2E71CB9DE5FA24BABF58E5B79521925C9C" \
"C42E9F6F464B088CC572AF53E6D78802");
//
// known DSA regular key pair
//
static
BigNumber X("0x2070B3223DBA372FDE1C0FFC7B2E3B498B260614");
static
BigNumber Y("0x19131871D75B1612A819F29D78D1B0D7346F7AA77BB62A85" \
"9BFD6C5675DA9D212D3A36EF1672EF660B8C7C255CC0EC74" \
"858FBA33F44C06699630A76B030EE333");
int DSAsign_verify_sample(void)
{
// DLP context
IppsDLPState *DLPState = newDLP(M, L);
// set up DLP crypto system
ippsDLPSet(P, Q, G, DLPState);
// message
Ipp8u message[] = "abc";
// compute message digest to be signed
Ipp8u md[SHA1_DIGEST_LENGTH/8];
ippsSHA1MessageDigest(message, sizeof(message)-1, md);
BigNumber digest(0, BITS_2_WORDS(SHA1_DIGEST_LENGTH));
ippsSetOctString_BN(md, SHA1_DIGEST_LENGTH/8, digest);
// generate ephemeral key pair (ephX,ephY)
BigNumber ephX(0, BITS_2_WORDS(L));
BigNumber ephY(0, BITS_2_WORDS(M));
IppsPRNGState* pRand = newPRNG();
ippsDLPGenKeyPair(ephX, ephY, DLPState, ippsPRNGen, pRand);
deletePRNG(pRand);
//
// generate signature
//
BigNumber signR(0, BITS_2_WORDS(L)); // R and S signature's component
BigNumber signS(0, BITS_2_WORDS(L));
ippsDLPSetKeyPair(ephX, ephY, DLPState); // set up ephemeral keys
ippsDLPSignDSA(digest, X, // sign digest
signR, signS,
DLPState);
//
// verify signature
//
ippsDLPSetKeyPair(0, Y, DLPState); // set up regular public key
IppDLResult result;
ippsDLPVerifyDSA(digest, signR,signS, // verify
&result, DLPState);
// remove actual keys from context and release resource
ippsDLPInit(M, L, DLPState);
deleteDLP(DLPState);
return result==ippDLValid;
}