adding dsa_import_radix
This commit is contained in:
		
							parent
							
								
									a8df316581
								
							
						
					
					
						commit
						10545366d2
					
				| @ -430,6 +430,7 @@ int dsa_decrypt_key(const unsigned char *in,  unsigned long  inlen, | |||||||
|                           unsigned char *out, unsigned long *outlen, |                           unsigned char *out, unsigned long *outlen, | ||||||
|                           dsa_key *key); |                           dsa_key *key); | ||||||
| 
 | 
 | ||||||
|  | int dsa_import_radix(int radix, char *p, char *q, char *g, char *x, char *y, dsa_key *key); | ||||||
| int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key); | int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key); | ||||||
| int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key); | int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key); | ||||||
| int dsa_verify_key(dsa_key *key, int *stat); | int dsa_verify_key(dsa_key *key, int *stat); | ||||||
|  | |||||||
							
								
								
									
										67
									
								
								src/pk/dsa/dsa_import_radix.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										67
									
								
								src/pk/dsa/dsa_import_radix.c
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,67 @@ | |||||||
|  | /* LibTomCrypt, modular cryptographic library -- Tom St Denis
 | ||||||
|  |  * | ||||||
|  |  * LibTomCrypt is a library that provides various cryptographic | ||||||
|  |  * algorithms in a highly modular and flexible manner. | ||||||
|  |  * | ||||||
|  |  * The library is free for all purposes without any express | ||||||
|  |  * guarantee it works. | ||||||
|  |  * | ||||||
|  |  * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
 | ||||||
|  |  */ | ||||||
|  | #include "tomcrypt.h" | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Import DSA public or private key from raw numbers | ||||||
|  |   @param radix   the radix the numbers are represented in (2-64, 16 = hexadecimal) | ||||||
|  |   @param p       DSA's p  in radix representation | ||||||
|  |   @param q       DSA's q  in radix representation | ||||||
|  |   @param g       DSA's g  in radix representation | ||||||
|  |   @param x       DSA's x  in radix representation (only private key, NULL for public key) | ||||||
|  |   @param y       DSA's y  in radix representation | ||||||
|  |   @param key     [out] the destination for the imported key | ||||||
|  |   @return CRYPT_OK if successful, upon error allocated memory is freed | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #ifdef LTC_MDSA | ||||||
|  | 
 | ||||||
|  | int dsa_import_radix(int radix, char *p, char *q, char *g, char *x, char *y, dsa_key *key) | ||||||
|  | { | ||||||
|  |    int err; | ||||||
|  | 
 | ||||||
|  |    LTC_ARGCHK(p != NULL); | ||||||
|  |    LTC_ARGCHK(q != NULL); | ||||||
|  |    LTC_ARGCHK(g != NULL); | ||||||
|  |    LTC_ARGCHK(y != NULL); | ||||||
|  |    LTC_ARGCHK(ltc_mp.name != NULL); | ||||||
|  | 
 | ||||||
|  |    /* init key */ | ||||||
|  |    err = mp_init_multi(&key->p, &key->g, &key->q, &key->x, &key->y, NULL); | ||||||
|  |    if (err != CRYPT_OK) return err; | ||||||
|  |     | ||||||
|  |    if ((err = mp_read_radix(key->p , p , radix)) != CRYPT_OK) { goto LBL_ERR; } | ||||||
|  |    if ((err = mp_read_radix(key->q , q , radix)) != CRYPT_OK) { goto LBL_ERR; } | ||||||
|  |    if ((err = mp_read_radix(key->g , g , radix)) != CRYPT_OK) { goto LBL_ERR; } | ||||||
|  |    if ((err = mp_read_radix(key->y , y , radix)) != CRYPT_OK) { goto LBL_ERR; } | ||||||
|  |    if (x && strlen(x) > 0) { | ||||||
|  |       key->type = PK_PRIVATE; | ||||||
|  |       if ((err = mp_read_radix(key->x , x , radix)) != CRYPT_OK) { goto LBL_ERR; } | ||||||
|  |    } | ||||||
|  |    else { | ||||||
|  |       key->type = PK_PUBLIC; | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    key->qord = mp_unsigned_bin_size(key->q); | ||||||
|  | 
 | ||||||
|  |    if (key->qord >= LTC_MDSA_MAX_GROUP || key->qord <= 15 || | ||||||
|  |       (unsigned long)key->qord >= mp_unsigned_bin_size(key->p) || (mp_unsigned_bin_size(key->p) - key->qord) >= LTC_MDSA_DELTA) { | ||||||
|  |       err = CRYPT_INVALID_PACKET; | ||||||
|  |       goto LBL_ERR; | ||||||
|  |    } | ||||||
|  |    return CRYPT_OK; | ||||||
|  | 
 | ||||||
|  | LBL_ERR: | ||||||
|  |    mp_clear_multi(key->p, key->g, key->q, key->x, key->y, NULL); | ||||||
|  |    return err; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user