יום שני, אפריל 18, 2011

איך להגדיר מפתח ציבורי שמגיע ממקור חיצוני ב ligcrypt ? שאלו אותי איך להגדיר מפתח ציבורי בהינתן ערך n משתנה ו e קבוע לקבוצה, אבל הופתעתי לגלות שאין בתיעוד איך לבצע פעולה זאת על כן אדם הבא שצריך להתמודד עם בעייה של איך ליצור public key (או private) :




//This code example explain how to create a public key structure for libgcrypt using a predefined n and e value.
//Boris Shtrasman MIT/X11 license

void get_keys_from_char_array (const char *n_element_in_public_key , gcry_sexp_t *pkey)
{
gcry_sexp_t pub_key;
gcry_mpi_t mpi_struct_holding_public_key;

int rc;

// e.g. from basic.c
// const char *n_element_in_public_key =
// "00e0ce96f90b6c9e02f3922beada93fe50a875eac6bcc18bb9a9cf2e84965caa"
// "2d1ff95a7f542465c6c0c19d276e4526ce048868a7a914fd343cc3a87dd74291"
// "ffc565506d5bbb25cbac6a0e2dd1f8bcaab0d4a29c2f37c950f363484bf269f7"
// "891440464baf79827e03a36e70b814938eebdc63e964247be75dc58b014b7ea251";

//convert char * to mpi object
if( gcry_mpi_scan( &mpi_struct_holding_public_key,
GCRYMPI_FMT_HEX, //Here is a tricky part if use hex value the length must be NULL
n_element_in_public_key,
NULL, //must be NULL
NULL ) ) die( " failed to use mpi to create s_exp" );

rc = gcry_sexp_build (&mpi_struct_holding_public_key, NULL,
"(public-key\n"
" (rsa\n"
" (n %m)\n"
" (e #010001#)\n"
" )\n"
")\n",
plain_mpi
);
//as this value was just allocated you must free it.
gcry_mpi_release( mpi_struct_holding_public_key );

if (rc)
die ("converting vadims keys failed: %s\n", gcry_strerror (rc));

*pkey = pub_key;
}


החלק הטריקי הוא לגלות שצריך להשתמש בmpi כאשר מעבירים ערך לבניית ה s-experssion (קיימת תמיכה בהעברת ערך טקסטואלי אבל היא לא נועדה בשביל זה).
מבנה המפתח ניתן בmanual :

6.2.1 RSA key parameters
An RSA private key is described by this S-expression:
(private-key
(rsa
(n n-mpi)
(e e-mpi)
(d d-mpi)
(p p-mpi)
(q q-mpi)
(u u-mpi)))

An RSA public key is described by this S-expression:
(public-key
(rsa
(n n-mpi)
(e e-mpi)))

n-mpi
RSA public modulus n.
e-mpi
RSA public exponent e.
d-mpi
RSA secret exponent d = e^-1 \bmod (p-1)(q-1).
p-mpi
RSA secret prime p.
q-mpi
RSA secret prime q with p < q. u-mpi Multiplicative inverse u = p^-1 \bmod q.


על מנת להפוך מחרוזות מ char * ל gcry_sexp_t * (הקוד קיים בlibgcrypt):

//Taken from pubkey.c
void null_terminated_char_array_to_sexp (const char * null_terminated_char_array, gcry_sexp_t * s_exp ){
gcry_mpi_t temp_mpi_struct_hold_formated_value;

if( gcry_mpi_scan( &temp_mpi_struct_hold_formated_value, GCRYMPI_FMT_USG, null_terminated_char_array, strlen(null_terminated_char_array), NULL ) ) die( " failed to convert char * to mpi struct" );
if( gcry_sexp_build( s_exp, NULL, "(data(flags raw)(value %m))", temp_mpi_struct_hold_formated_value ) ) die( " failed to convert mpi to s_expression " );

gcry_mpi_release( temp_mpi_struct_hold_formated_value );
}


אין תגובות:

הוסף רשומת תגובה