Codebase list libcryptx-perl / 730c96f
ltc sync (DSA) Karel Miko 6 years ago
5 changed file(s) with 37 addition(s) and 19 deletion(s). Raw diff Collapse all Expand all
510510 int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key);
511511 int dsa_verify_key(dsa_key *key, int *stat);
512512 #ifdef LTC_SOURCE
513 /* internal helper functions */
513514 int dsa_int_validate_xy(dsa_key *key, int *stat);
514515 int dsa_int_validate_pqg(dsa_key *key, int *stat);
515516 int dsa_int_validate_primes(dsa_key *key, int *stat);
2323 */
2424 int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
2525 {
26 int err;
26 int err, stat;
2727 unsigned long zero = 0;
2828 unsigned char* tmpbuf = NULL;
2929 unsigned char flags[1];
115115 }
116116
117117 LBL_OK:
118 key->qord = mp_unsigned_bin_size(key->q);
118 key->qord = mp_unsigned_bin_size(key->q);
119119
120 if (key->qord >= LTC_MDSA_MAX_GROUP || key->qord <= 15 ||
121 (unsigned long)key->qord >= mp_unsigned_bin_size(key->p) || (mp_unsigned_bin_size(key->p) - key->qord) >= LTC_MDSA_DELTA) {
120 /* quick p, q, g validation, without primality testing */
121 if ((err = dsa_int_validate_pqg(key, &stat)) != CRYPT_OK) {
122 goto LBL_ERR;
123 }
124 if (stat == 0) {
125 err = CRYPT_INVALID_PACKET;
126 goto LBL_ERR;
127 }
128 /* validate x, y */
129 if ((err = dsa_int_validate_xy(key, &stat)) != CRYPT_OK) {
130 goto LBL_ERR;
131 }
132 if (stat == 0) {
122133 err = CRYPT_INVALID_PACKET;
123134 goto LBL_ERR;
124135 }
4444
4545 key->qord = mp_unsigned_bin_size(key->q);
4646
47 if (key->qord >= LTC_MDSA_MAX_GROUP || key->qord <= 15 ||
48 (unsigned long)key->qord >= mp_unsigned_bin_size(key->p) || (mp_unsigned_bin_size(key->p) - key->qord) >= LTC_MDSA_DELTA) {
49 err = CRYPT_INVALID_PACKET;
50 goto LBL_ERR;
51 }
52
5347 /* do only a quick validation, without primality testing */
5448 if ((err = dsa_int_validate_pqg(key, &stat)) != CRYPT_OK) { goto LBL_ERR; }
5549 if (stat == 0) {
56 err = CRYPT_INVALID_ARG;
50 err = CRYPT_INVALID_PACKET;
5751 goto LBL_ERR;
5852 }
5953
9993
10094 if ((err = dsa_int_validate_xy(key, &stat)) != CRYPT_OK) { goto LBL_ERR; }
10195 if (stat == 0) {
102 err = CRYPT_INVALID_ARG;
96 err = CRYPT_INVALID_PACKET;
10397 goto LBL_ERR;
10498 }
10599
2323 int dsa_set_pqg_dsaparam(const unsigned char *dsaparam, unsigned long dsaparamlen,
2424 dsa_key *key)
2525 {
26 int err;
26 int err, stat;
2727
2828 LTC_ARGCHK(dsaparam != NULL);
2929 LTC_ARGCHK(key != NULL);
4343
4444 key->qord = mp_unsigned_bin_size(key->q);
4545
46 if (key->qord >= LTC_MDSA_MAX_GROUP || key->qord <= 15 ||
47 (unsigned long)key->qord >= mp_unsigned_bin_size(key->p) || (mp_unsigned_bin_size(key->p) - key->qord) >= LTC_MDSA_DELTA) {
46 /* quick p, q, g validation, without primality testing */
47 if ((err = dsa_int_validate_pqg(key, &stat)) != CRYPT_OK) {
48 goto LBL_ERR;
49 }
50 if (stat == 0) {
4851 err = CRYPT_INVALID_PACKET;
4952 goto LBL_ERR;
5053 }
54
5155 return CRYPT_OK;
5256
5357 LBL_ERR:
5151 void *tmp1, *tmp2;
5252 int err;
5353
54 *stat = 0;
5554 LTC_ARGCHK(key != NULL);
5655 LTC_ARGCHK(stat != NULL);
56 *stat = 0;
57
58 /* check q-order */
59 if ( key->qord >= LTC_MDSA_MAX_GROUP || key->qord <= 15 ||
60 (unsigned long)key->qord >= mp_unsigned_bin_size(key->p) ||
61 (mp_unsigned_bin_size(key->p) - key->qord) >= LTC_MDSA_DELTA ) {
62 err = CRYPT_OK;
63 goto error;
64 }
5765
5866 /* FIPS 186-4 chapter 4.1: 1 < g < p */
5967 if (mp_cmp_d(key->g, 1) != LTC_MP_GT || mp_cmp(key->g, key->p) != LTC_MP_LT) {
8290 err = CRYPT_OK;
8391 *stat = 1;
8492 error:
85 mp_clear_multi(tmp1, tmp2, NULL);
93 mp_clear_multi(tmp2, tmp1, NULL);
8694 return err;
8795 }
8896
102110 LTC_ARGCHK(stat != NULL);
103111
104112 /* key->q prime? */
105 if ((err = mp_prime_is_prime(key->q, 8, &res)) != CRYPT_OK) {
113 if ((err = mp_prime_is_prime(key->q, LTC_MILLER_RABIN_REPS, &res)) != CRYPT_OK) {
106114 return err;
107115 }
108116 if (res == LTC_MP_NO) {
110118 }
111119
112120 /* key->p prime? */
113 if ((err = mp_prime_is_prime(key->p, 8, &res)) != CRYPT_OK) {
121 if ((err = mp_prime_is_prime(key->p, LTC_MILLER_RABIN_REPS, &res)) != CRYPT_OK) {
114122 return err;
115123 }
116124 if (res == LTC_MP_NO) {