Contents

# 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" \
"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;
}
```

#### Product and Performance Information

1

Performance varies by use, configuration and other factors. Learn more at www.Intel.com/PerformanceIndex.