14 #define DISABLE_DEBUGLOG 17 #include "cryptkeyrsa_p.h" 18 #include <gwenhywfar/misc.h> 19 #include <gwenhywfar/debug.h> 20 #include <gwenhywfar/text.h> 31 static void dumpKeyData(gcry_ac_data_t data)
36 l=gcry_ac_data_length(data);
44 gcry_ac_data_get_index(data, 0, i, &dname, &mpi);
45 fprintf(stderr,
"%3d: [%s]\n", i, dname);
48 err=gcry_mpi_aprint(GCRYMPI_FMT_USG, &buf, &nbytes, mpi);
68 list=gcry_sexp_find_token(pkey, name, 0);
74 mpi=gcry_sexp_nth_mpi(list, 1, GCRYMPI_FMT_USG);
77 gcry_sexp_release(list);
82 gcry_sexp_release(list);
93 gcry_sexp_t keyparm, key;
104 snprintf(numbuf,
sizeof(numbuf)-1,
"%d", nbits);
106 snprintf(buffer,
sizeof(buffer)-1,
110 " (rsa-use-e 5:65537)\n" 116 snprintf(buffer,
sizeof(buffer)-1,
124 buffer[
sizeof(buffer)-1]=0;
128 rc=gcry_sexp_new(&keyparm, buffer, 0, 1);
131 "Error creating S-expression: %s", gpg_strerror(rc));
135 rc=gcry_pk_genkey(&key, keyparm);
136 gcry_sexp_release(keyparm);
142 pkey=gcry_sexp_find_token(key,
"public-key", 0);
145 gcry_sexp_release(key);
153 GWEN_CRYPT_KEY_RSA *xk;
159 gcry_sexp_release(key);
167 gcry_sexp_release(key);
179 xk->modulus=gcry_mpi_copy(n);
180 xk->pubExponent=gcry_mpi_copy(e);
189 pkey=gcry_sexp_find_token(key,
"private-key", 0);
192 gcry_sexp_release(key);
201 GWEN_CRYPT_KEY_RSA *xk;
207 gcry_sexp_release(key);
215 gcry_sexp_release(key);
224 gcry_sexp_release(key);
236 xk->modulus=gcry_mpi_copy(n);
237 xk->pubExponent=gcry_mpi_copy(e);
238 xk->privExponent=gcry_mpi_copy(d);
247 gcry_sexp_release(key);
250 *pSecretKey=secretKey;
257 #ifndef NO_DEPRECATED_SYMBOLS 264 "nbits is required to be a multiple of 8 (%d)", nbits);
269 #endif // ifndef NO_DEPRECATED_SYMBOLS 275 const uint8_t *pInData,
277 uint8_t *pSignatureData,
278 uint32_t *pSignatureLen)
280 GWEN_CRYPT_KEY_RSA *xk;
283 gcry_mpi_t mpi_in=
NULL;
284 gcry_mpi_t mpi_sigout1;
285 gcry_mpi_t mpi_sigout2=
NULL;
292 if (xk->modulus==
NULL) {
297 if (xk->privExponent==
NULL) {
303 err=gcry_mpi_scan(&mpi_in, GCRYMPI_FMT_USG, pInData, inLen, &nscanned);
306 gcry_mpi_release(mpi_in);
312 gcry_mpi_powm(mpi_sigout1, mpi_in, xk->privExponent, xk->modulus);
317 gcry_mpi_sub(mpi_sigout2, xk->modulus, mpi_sigout1);
319 if (gcry_mpi_cmp(mpi_sigout2, mpi_sigout1)<0) {
321 gcry_mpi_set(mpi_sigout1, mpi_sigout2);
326 gcry_mpi_release(mpi_sigout2);
327 gcry_mpi_release(mpi_in);
330 err=gcry_mpi_print(GCRYMPI_FMT_USG,
331 pSignatureData, *pSignatureLen,
332 &nwritten, mpi_sigout1);
333 gcry_mpi_release(mpi_sigout1);
338 *pSignatureLen=nwritten;
346 const uint8_t *pInData,
348 const uint8_t *pSignatureData,
349 uint32_t signatureLen)
351 GWEN_CRYPT_KEY_RSA *xk;
354 gcry_mpi_t mpi_in=
NULL;
355 gcry_mpi_t mpi_sigin1=
NULL;
356 gcry_mpi_t mpi_sigout;
362 if (xk->modulus==
NULL) {
367 if (xk->pubExponent==
NULL) {
374 err=gcry_mpi_scan(&mpi_in, GCRYMPI_FMT_USG, pInData, inLen, &nscanned);
377 gcry_mpi_release(mpi_in);
382 err=gcry_mpi_scan(&mpi_sigin1, GCRYMPI_FMT_USG,
383 pSignatureData, signatureLen,
387 gcry_mpi_release(mpi_sigin1);
388 gcry_mpi_release(mpi_in);
394 gcry_mpi_powm(mpi_sigout, mpi_sigin1, xk->pubExponent, xk->modulus);
396 if (gcry_mpi_cmp(mpi_sigout, mpi_in)) {
397 gcry_mpi_t mpi_sigin2;
402 gcry_mpi_sub(mpi_sigin2, xk->modulus, mpi_sigin1);
403 gcry_mpi_powm(mpi_sigout, mpi_sigin2, xk->pubExponent, xk->modulus);
404 if (gcry_mpi_cmp(mpi_sigout, mpi_in)) {
406 gcry_mpi_release(mpi_sigin2);
407 gcry_mpi_release(mpi_sigout);
408 gcry_mpi_release(mpi_sigin1);
409 gcry_mpi_release(mpi_in);
412 gcry_mpi_release(mpi_sigin2);
415 gcry_mpi_release(mpi_sigout);
416 gcry_mpi_release(mpi_sigin1);
417 gcry_mpi_release(mpi_in);
425 const uint8_t *pInData,
430 GWEN_CRYPT_KEY_RSA *xk;
433 gcry_mpi_t mpi_in=
NULL;
441 if (xk->modulus==
NULL) {
446 if (xk->pubExponent==
NULL) {
453 err=gcry_mpi_scan(&mpi_in, GCRYMPI_FMT_USG, pInData, inLen, &nscanned);
456 gcry_mpi_release(mpi_in);
462 gcry_mpi_powm(mpi_out, mpi_in, xk->pubExponent, xk->modulus);
465 gcry_mpi_release(mpi_in);
468 err=gcry_mpi_print(GCRYMPI_FMT_USG,
471 gcry_mpi_release(mpi_out);
484 const uint8_t *pInData,
489 GWEN_CRYPT_KEY_RSA *xk;
492 gcry_mpi_t mpi_in=
NULL;
500 if (xk->modulus==
NULL) {
505 if (xk->privExponent==
NULL) {
512 err=gcry_mpi_scan(&mpi_in, GCRYMPI_FMT_USG, pInData, inLen, &nscanned);
515 gcry_mpi_release(mpi_in);
521 gcry_mpi_powm(mpi_out, mpi_in, xk->privExponent, xk->modulus);
524 gcry_mpi_release(mpi_in);
527 err=gcry_mpi_print(GCRYMPI_FMT_USG,
530 gcry_mpi_release(mpi_out);
552 if (p==
NULL || len<1) {
557 err=gcry_mpi_scan(&mpi, GCRYMPI_FMT_USG, p, len, &nscanned);
560 gcry_mpi_release(mpi);
584 err=gcry_mpi_aprint(GCRYMPI_FMT_USG, &buf, &nbytes, mpi);
605 err=gcry_mpi_print(GCRYMPI_FMT_USG, buf, nbytes, &nwritten, mpi);
619 GWEN_CRYPT_KEY_RSA *xk;
621 xk=(GWEN_CRYPT_KEY_RSA *) p;
623 gcry_mpi_release(xk->modulus);
625 gcry_mpi_release(xk->pubExponent);
626 if (xk->privExponent)
627 gcry_mpi_release(xk->privExponent);
639 GWEN_CRYPT_KEY_RSA *xk;
704 GWEN_CRYPT_KEY_RSA *xk;
712 if (xk->pub && !pub) {
718 DBG_ERROR(0,
"toDb (%s):", pub?
"public":
"private");
768 GWEN_CRYPT_KEY_RSA *xk;
791 GWEN_CRYPT_KEY_RSA *xk;
814 GWEN_CRYPT_KEY_RSA *xk;
836 const uint8_t *pModulus,
838 const uint8_t *pExponent,
869 pExponent, lExponent);
875 "Internal error: Bad RSA key group");
888 const uint8_t *pModulus,
890 const uint8_t *pExponent,
892 const uint8_t *pPrivExponent,
893 uint32_t lPrivExponent)
904 assert(pPrivExponent);
905 assert(lPrivExponent);
925 pExponent, lExponent);
928 pPrivExponent, lPrivExponent);
934 "Internal error: Bad RSA key group");
948 GWEN_CRYPT_KEY_RSA *xk;
980 GWEN_CRYPT_KEY_RSA *xk;
993 GWEN_CRYPT_KEY_RSA *xk;
1006 GWEN_CRYPT_KEY_RSA *xk;
1019 GWEN_CRYPT_KEY_RSA *xk;
int GWEN_Crypt_KeyRsa_GeneratePair2(unsigned int nbits, int use65537e, GWEN_CRYPT_KEY **pPubKey, GWEN_CRYPT_KEY **pSecretKey)
#define GWEN_DB_FLAGS_OVERWRITE_VARS
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
GWEN_CRYPT_KEY * GWEN_Crypt_KeyRsa_fromModPrivExp(unsigned int nbytes, const uint8_t *pModulus, uint32_t lModulus, const uint8_t *pExponent, uint32_t lExponent, const uint8_t *pPrivExponent, uint32_t lPrivExponent)
static GWENHYWFAR_CB void GWEN_Crypt_KeyRsa_freeData(GWEN_UNUSED void *bp, void *p)
struct GWEN_DB_NODE GWEN_DB_NODE
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
#define GWEN_ERROR_INVALID
int GWEN_Crypt_Key_GetKeySize(const GWEN_CRYPT_KEY *k)
GWEN_CRYPT_KEY_VERIFY_FN GWEN_Crypt_Key_SetVerifyFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_VERIFY_FN f)
void GWEN_Crypt_KeyRsa_SetFlags(GWEN_CRYPT_KEY *k, uint32_t fl)
void GWEN_Text_DumpString(const char *s, unsigned int l, unsigned int insert)
void GWEN_Crypt_Key_free(GWEN_CRYPT_KEY *k)
int GWEN_Crypt_KeyRsa_GeneratePair(unsigned int nbytes, int use65537e, GWEN_CRYPT_KEY **pPubKey, GWEN_CRYPT_KEY **pSecretKey)
#define GWEN_FREE_OBJECT(varname)
GWEN_CRYPT_KEY * GWEN_Crypt_KeyRsa_fromModExp(unsigned int nbytes, const uint8_t *pModulus, uint32_t lModulus, const uint8_t *pExponent, uint32_t lExponent)
GWENHYWFAR_CB int GWEN_Crypt_KeyRsa_Sign(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pSignatureData, uint32_t *pSignatureLen)
void GWEN_Crypt_KeyRsa_SubFlags(GWEN_CRYPT_KEY *k, uint32_t fl)
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_Key_GetCryptAlgoId(const GWEN_CRYPT_KEY *k)
static int GWEN_Crypt_KeyRsa__WriteMpi(GWEN_DB_NODE *db, const char *dbName, const gcry_mpi_t mpi)
void GWEN_Crypt_KeyRsa_AddFlags(GWEN_CRYPT_KEY *k, uint32_t fl)
static GWENHYWFAR_CB int GWEN_Crypt_KeyRsa_Decipher(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen)
static int GWEN_Crypt_KeyRsa__getNamedElement(gcry_sexp_t pkey, const char *name, gcry_mpi_t *pMpi)
int GWEN_Crypt_Key_toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db)
#define GWEN_ERROR_BAD_DATA
int GWEN_DB_SetBinValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const void *val, unsigned int valSize)
#define GWEN_NEW_OBJECT(typ, varname)
GWEN_CRYPT_KEY * GWEN_Crypt_KeyRsa_fromDb(GWEN_DB_NODE *db)
GWEN_CRYPT_KEY_SIGN_FN GWEN_Crypt_Key_SetSignFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_SIGN_FN f)
#define DBG_DEBUG(dbg_logger, format, args...)
static GWENHYWFAR_CB int GWEN_Crypt_KeyRsa_Encipher(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen)
const char * GWEN_Crypt_CryptAlgoId_toString(GWEN_CRYPT_CRYPTALGOID a)
#define GWEN_DB_FLAGS_OVERWRITE_GROUPS
const void * GWEN_DB_GetBinValue(GWEN_DB_NODE *n, const char *path, int idx, const void *defVal, unsigned int defValSize, unsigned int *returnValueSize)
#define GWEN_ERROR_GENERIC
struct GWEN_CRYPT_KEY GWEN_CRYPT_KEY
static int GWEN_Crypt_KeyRsa__ReadMpi(GWEN_DB_NODE *db, const char *dbName, gcry_mpi_t *pMpi)
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
#define GWEN_CRYPT_KEYRSA_FLAGS_DIRECTSIGN
GWEN_CRYPT_KEY_DECIPHER_FN GWEN_Crypt_Key_SetDecipherFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_DECIPHER_FN f)
#define DBG_ERROR(dbg_logger, format, args...)
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
#define DBG_INFO(dbg_logger, format, args...)
int GWEN_Crypt_KeyRsa_GetSecretExponent(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen)
int GWEN_DB_GetIntValue(GWEN_DB_NODE *n, const char *path, int idx, int defVal)
#define GWEN_ERROR_VERIFY
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
uint32_t GWEN_Crypt_KeyRsa_GetFlags(const GWEN_CRYPT_KEY *k)
#define GWEN_INHERIT(bt, t)
GWEN_CRYPT_KEY_ENCIPHER_FN GWEN_Crypt_Key_SetEncipherFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_ENCIPHER_FN f)
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
GWEN_CRYPT_KEY * GWEN_Crypt_Key_new(GWEN_CRYPT_CRYPTALGOID cryptAlgoId, int keySize)
#define GWEN_ERROR_NO_DATA
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
GWEN_CRYPT_KEY * GWEN_Crypt_KeyRsa_dup(const GWEN_CRYPT_KEY *k)
int GWEN_Crypt_KeyRsa_GetExponent(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen)
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
int GWEN_Crypt_KeyRsa_toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db, int pub)
GWEN_CRYPT_KEY * GWEN_Crypt_Key_fromDb(GWEN_DB_NODE *db)
static int GWEN_Crypt_KeyRsa__MpiToBuffer(const gcry_mpi_t mpi, unsigned char *buf, size_t nbytes)
int GWEN_Crypt_KeyRsa_GetModulus(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen)
#define GWEN_INHERIT_GETDATA(bt, t, element)
static GWENHYWFAR_CB int GWEN_Crypt_KeyRsa_Verify(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, const uint8_t *pSignatureData, uint32_t signatureLen)