Path: blob/master/libs/tomcrypt/src/pk/dsa/dsa_export.c
4396 views
/* LibTomCrypt, modular cryptographic library -- Tom St Denis1*2* LibTomCrypt is a library that provides various cryptographic3* algorithms in a highly modular and flexible manner.4*5* The library is free for all purposes without any express6* guarantee it works.7*/8#include "tomcrypt.h"910/**11@file dsa_export.c12DSA implementation, export key, Tom St Denis13*/1415#ifdef LTC_MDSA1617/**18Export a DSA key to a binary packet19@param out [out] Where to store the packet20@param outlen [in/out] The max size and resulting size of the packet21@param type The type of key to export (PK_PRIVATE or PK_PUBLIC)22@param key The key to export23@return CRYPT_OK if successful24*/25int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key)26{27unsigned long zero=0;28int err, std;2930LTC_ARGCHK(out != NULL);31LTC_ARGCHK(outlen != NULL);32LTC_ARGCHK(key != NULL);3334std = type & PK_STD;35type &= ~PK_STD;3637/* can we store the static header? */38if (type == PK_PRIVATE && key->type != PK_PRIVATE) {39return CRYPT_PK_TYPE_MISMATCH;40}4142if (type != PK_PUBLIC && type != PK_PRIVATE) {43return CRYPT_INVALID_ARG;44}4546if (type == PK_PRIVATE) {47if (std) {48return der_encode_sequence_multi(out, outlen,49LTC_ASN1_SHORT_INTEGER, 1UL, &zero,50LTC_ASN1_INTEGER, 1UL, key->p,51LTC_ASN1_INTEGER, 1UL, key->q,52LTC_ASN1_INTEGER, 1UL, key->g,53LTC_ASN1_INTEGER, 1UL, key->y,54LTC_ASN1_INTEGER, 1UL, key->x,55LTC_ASN1_EOL, 0UL, NULL);56}57else {58unsigned char flags[1];59flags[0] = 1;60return der_encode_sequence_multi(out, outlen,61LTC_ASN1_BIT_STRING, 1UL, flags,62LTC_ASN1_INTEGER, 1UL, key->g,63LTC_ASN1_INTEGER, 1UL, key->p,64LTC_ASN1_INTEGER, 1UL, key->q,65LTC_ASN1_INTEGER, 1UL, key->y,66LTC_ASN1_INTEGER, 1UL, key->x,67LTC_ASN1_EOL, 0UL, NULL);68}69} else {70if (std) {71unsigned long tmplen = (unsigned long)(mp_count_bits(key->y) / 8) + 8;72unsigned char* tmp = XMALLOC(tmplen);73ltc_asn1_list int_list[3];7475if (tmp == NULL) {76return CRYPT_MEM;77}7879err = der_encode_integer(key->y, tmp, &tmplen);80if (err != CRYPT_OK) {81goto error;82}8384LTC_SET_ASN1(int_list, 0, LTC_ASN1_INTEGER, key->p, 1UL);85LTC_SET_ASN1(int_list, 1, LTC_ASN1_INTEGER, key->q, 1UL);86LTC_SET_ASN1(int_list, 2, LTC_ASN1_INTEGER, key->g, 1UL);8788err = der_encode_subject_public_key_info(out, outlen, PKA_DSA, tmp,89tmplen, LTC_ASN1_SEQUENCE, int_list,90sizeof(int_list) / sizeof(int_list[0]));9192error:93XFREE(tmp);94return err;95}96else {97unsigned char flags[1];98flags[0] = 0;99return der_encode_sequence_multi(out, outlen,100LTC_ASN1_BIT_STRING, 1UL, flags,101LTC_ASN1_INTEGER, 1UL, key->g,102LTC_ASN1_INTEGER, 1UL, key->p,103LTC_ASN1_INTEGER, 1UL, key->q,104LTC_ASN1_INTEGER, 1UL, key->y,105LTC_ASN1_EOL, 0UL, NULL);106}107}108}109110#endif111112113