int main() { bigint_t a,b,c; int buf[200]; bigint_new(&a,buf,50); bigint_new(&b,buf+50,50); bigint_new(&c,buf+100,100); a2big(&a,"123456789123456789"); a2big(&b,"9876543210"); bigint_mult(&a,&b,&c); printbig(&c); printf("\n"); return 0; }
/* * RSA Sign using Garners algorithm and Chinese Remainder theorem. * See the derivation on page 613 in handbook of applied cryptography * use factors dp and dq of secret exponent d and p and q of public * exponent n, and qinv */ void CSL_ComputeRsaSigFast(u8 *result, u32 *message, u32 *certpublickey, u32 *certp, u32 *certq, u32 *dmp, u32 *dmq, u32 *qinv, int num_bits) { u32 pDigits, qDigits, cDigits, nDigits; bigint_digit bigp[MAX_BIGINT_DIGITS]; bigint_digit bigq[MAX_BIGINT_DIGITS]; bigint_digit bigc[MAX_BIGINT_DIGITS]; bigint_digit bigdmp[MAX_BIGINT_DIGITS]; bigint_digit bigdmq[MAX_BIGINT_DIGITS]; bigint_digit bigqinv[MAX_BIGINT_DIGITS]; bigint_digit bign[MAX_BIGINT_DIGITS]; bigint_digit cP[MAX_BIGINT_DIGITS]; bigint_digit cQ[MAX_BIGINT_DIGITS]; bigint_digit mP[MAX_BIGINT_DIGITS]; bigint_digit mQ[MAX_BIGINT_DIGITS]; bigint_digit temp[MAX_BIGINT_DIGITS]; int outlen; int i; int num_words = num_bits/BIGINT_DIGIT_BITS; bigint_zero(bigp, MAX_BIGINT_DIGITS); bigint_zero(bigq, MAX_BIGINT_DIGITS); bigint_zero(bigdmp, MAX_BIGINT_DIGITS); bigint_zero(bigdmq, MAX_BIGINT_DIGITS); bigint_zero(bigqinv, MAX_BIGINT_DIGITS); bigint_zero(bigc, MAX_BIGINT_DIGITS); for (i = 0; i < num_words/2; i++) { bigp[num_words/2 - 1 - i] = certp[i]; bigq[num_words/2 - 1 - i] = certq[i]; bigdmp[num_words/2 - 1 - i] = dmp[i]; bigdmq[num_words/2 - 1 - i] = dmq[i]; bigqinv[num_words/2 - 1 - i] = qinv[i]; } for (i = 0; i < num_words; i++) { bigc[num_words - 1 - i] = message[i]; bign[num_words - 1 - i] = certpublickey[i]; } cDigits = bigint_digits(bigc, MAX_BIGINT_DIGITS); pDigits = bigint_digits(bigp, MAX_BIGINT_DIGITS); qDigits = bigint_digits(bigq, MAX_BIGINT_DIGITS); nDigits = bigint_digits(bign, MAX_BIGINT_DIGITS); /* * compute cP and cQ */ bigint_mod(cP, bigc, cDigits, bigp, pDigits); bigint_mod(cQ, bigc, cDigits, bigq, qDigits); /* * Compute mP = cP^dP mod p and mQ = cQ^dQ mod q. */ bigint_mod_exp(mP, cP, bigdmp, pDigits, bigp, pDigits); bigint_zero(mQ, nDigits); bigint_mod_exp(mQ, cQ, bigdmq, pDigits, bigq, pDigits); /* * do CRT * m = ((((mP - mQ) mod p)*qinv) mod p) *q + mQ */ if (bigint_cmp(mP, mQ, pDigits) >= 0) { bigint_sub(temp, mP, mQ, pDigits); } else { bigint_sub(temp, mQ, mP, pDigits); bigint_sub(temp, bigp, temp, pDigits); } bigint_mod_mult(temp, temp, bigqinv, bigp, pDigits); bigint_mult(temp, temp, bigq, pDigits); bigint_add(temp, temp, mQ, nDigits); outlen = (num_bits + 7)/8; I2OSP(result, outlen, temp, nDigits); }