ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

implglue.c
Go to the documentation of this file.
00001 /*
00002  * dlls/rsaenh/implglue.c
00003  * Glueing the RSAENH specific code to the crypto library
00004  *
00005  * Copyright (c) 2004, 2005 Michael Jung
00006  * Copyright (c) 2007 Vijay Kiran Kamuju
00007  *
00008  * based on code by Mike McCormack and David Hammerton
00009  *
00010  * This library is free software; you can redistribute it and/or
00011  * modify it under the terms of the GNU Lesser General Public
00012  * License as published by the Free Software Foundation; either
00013  * version 2.1 of the License, or (at your option) any later version.
00014  *
00015  * This library is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018  * Lesser General Public License for more details.
00019  *
00020  * You should have received a copy of the GNU Lesser General Public
00021  * License along with this library; if not, write to the Free Software
00022  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00023  */
00024 #include "config.h"
00025 
00026 #include "wine/port.h"
00027 #include "wine/library.h"
00028 
00029 #include "windef.h"
00030 #include "wincrypt.h"
00031 
00032 #include "implglue.h"
00033 
00034 #include <stdio.h>
00035 
00036 /* Function prototypes copied from dlls/advapi32/crypt_md4.c */
00037 VOID WINAPI MD4Init( MD4_CTX *ctx );
00038 VOID WINAPI MD4Update( MD4_CTX *ctx, const unsigned char *buf, unsigned int len );
00039 VOID WINAPI MD4Final( MD4_CTX *ctx );
00040 /* Function prototypes copied from dlls/advapi32/crypt_md5.c */
00041 VOID WINAPI MD5Init( MD5_CTX *ctx );
00042 VOID WINAPI MD5Update( MD5_CTX *ctx, const unsigned char *buf, unsigned int len );
00043 VOID WINAPI MD5Final( MD5_CTX *ctx );
00044 /* Function prototypes copied from dlls/advapi32/crypt_sha.c */
00045 VOID WINAPI A_SHAInit(PSHA_CTX Context);
00046 VOID WINAPI A_SHAUpdate(PSHA_CTX Context, const unsigned char *Buffer, UINT BufferSize);
00047 VOID WINAPI A_SHAFinal(PSHA_CTX Context, PULONG Result);
00048 /* Function prototype copied from dlls/advapi32/crypt.c */
00049 BOOL WINAPI SystemFunction036(PVOID pbBuffer, ULONG dwLen);
00050         
00051 BOOL init_hash_impl(ALG_ID aiAlgid, HASH_CONTEXT *pHashContext) 
00052 {
00053     switch (aiAlgid) 
00054     {
00055         case CALG_MD2:
00056             md2_init(&pHashContext->md2);
00057             break;
00058         
00059         case CALG_MD4:
00060             MD4Init(&pHashContext->md4);
00061             break;
00062         
00063         case CALG_MD5:
00064             MD5Init(&pHashContext->md5);
00065             break;
00066         
00067         case CALG_SHA:
00068             A_SHAInit(&pHashContext->sha);
00069             break;
00070 
00071         case CALG_SHA_256:
00072             SHA256_Init(&pHashContext->sha256);
00073             break;
00074 
00075         case CALG_SHA_384:
00076             SHA384_Init(&pHashContext->sha384);
00077             break;
00078 
00079         case CALG_SHA_512:
00080             SHA512_Init(&pHashContext->sha512);
00081             break;
00082     }
00083 
00084     return TRUE;
00085 }
00086 
00087 BOOL update_hash_impl(ALG_ID aiAlgid, HASH_CONTEXT *pHashContext, CONST BYTE *pbData, 
00088                       DWORD dwDataLen) 
00089 {
00090     switch (aiAlgid)
00091     {
00092         case CALG_MD2:
00093             md2_process(&pHashContext->md2, pbData, dwDataLen);
00094             break;
00095         
00096         case CALG_MD4:
00097             MD4Update(&pHashContext->md4, pbData, dwDataLen);
00098             break;
00099     
00100         case CALG_MD5:
00101             MD5Update(&pHashContext->md5, pbData, dwDataLen);
00102             break;
00103         
00104         case CALG_SHA:
00105             A_SHAUpdate(&pHashContext->sha, pbData, dwDataLen);
00106             break;
00107         
00108         case CALG_SHA_256:
00109             SHA256_Update(&pHashContext->sha256, pbData, dwDataLen);
00110             break;
00111 
00112         case CALG_SHA_384:
00113             SHA384_Update(&pHashContext->sha384, pbData, dwDataLen);
00114             break;
00115 
00116         case CALG_SHA_512:
00117             SHA512_Update(&pHashContext->sha512, pbData, dwDataLen);
00118             break;
00119 
00120         default:
00121             SetLastError(NTE_BAD_ALGID);
00122             return FALSE;
00123     }
00124 
00125     return TRUE;
00126 }
00127 
00128 BOOL finalize_hash_impl(ALG_ID aiAlgid, HASH_CONTEXT *pHashContext, BYTE *pbHashValue) 
00129 {
00130     switch (aiAlgid)
00131     {
00132         case CALG_MD2:
00133             md2_done(&pHashContext->md2, pbHashValue);
00134             break;
00135         
00136         case CALG_MD4:
00137             MD4Final(&pHashContext->md4);
00138             memcpy(pbHashValue, pHashContext->md4.digest, 16);
00139             break;
00140         
00141         case CALG_MD5:
00142             MD5Final(&pHashContext->md5);
00143             memcpy(pbHashValue, pHashContext->md5.digest, 16);
00144             break;
00145         
00146         case CALG_SHA:
00147             A_SHAFinal(&pHashContext->sha, (PULONG)pbHashValue);
00148             break;
00149         
00150         case CALG_SHA_256:
00151             SHA256_Final(pbHashValue, &pHashContext->sha256);
00152             break;
00153 
00154         case CALG_SHA_384:
00155             SHA384_Final(pbHashValue, &pHashContext->sha384);
00156             break;
00157 
00158         case CALG_SHA_512:
00159             SHA512_Final(pbHashValue, &pHashContext->sha512);
00160             break;
00161 
00162         default:
00163             SetLastError(NTE_BAD_ALGID);
00164             return FALSE;
00165     }
00166 
00167     return TRUE;
00168 }
00169 
00170 BOOL duplicate_hash_impl(ALG_ID aiAlgid, CONST HASH_CONTEXT *pSrcHashContext, 
00171                          HASH_CONTEXT *pDestHashContext) 
00172 {
00173     *pDestHashContext = *pSrcHashContext;
00174 
00175     return TRUE;
00176 }
00177 
00178 BOOL new_key_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext, DWORD dwKeyLen) 
00179 {
00180     switch (aiAlgid)
00181     {
00182         case CALG_RSA_KEYX:
00183         case CALG_RSA_SIGN:
00184             if (rsa_make_key((int)dwKeyLen, 65537, &pKeyContext->rsa) != CRYPT_OK) {
00185                 SetLastError(NTE_FAIL);
00186                 return FALSE;
00187             }
00188             return TRUE;
00189     }
00190 
00191     return TRUE;
00192 }
00193 
00194 BOOL free_key_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext)
00195 {
00196     switch (aiAlgid)
00197     {
00198         case CALG_RSA_KEYX:
00199         case CALG_RSA_SIGN:
00200             rsa_free(&pKeyContext->rsa);
00201     }
00202 
00203     return TRUE;
00204 }
00205 
00206 BOOL setup_key_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext, DWORD dwKeyLen,
00207                     DWORD dwEffectiveKeyLen, DWORD dwSaltLen, BYTE *abKeyValue)
00208 {
00209     switch (aiAlgid) 
00210     {
00211         case CALG_RC4:
00212             rc4_start(&pKeyContext->rc4);
00213             rc4_add_entropy(abKeyValue, dwKeyLen + dwSaltLen, &pKeyContext->rc4);
00214             rc4_ready(&pKeyContext->rc4);
00215             break;
00216         
00217         case CALG_RC2:
00218             rc2_setup(abKeyValue, dwKeyLen + dwSaltLen, dwEffectiveKeyLen ?
00219                       dwEffectiveKeyLen : dwKeyLen << 3, 0, &pKeyContext->rc2);
00220             break;
00221         
00222         case CALG_3DES:
00223             des3_setup(abKeyValue, 24, 0, &pKeyContext->des3);
00224             break;
00225 
00226         case CALG_3DES_112:
00227             memcpy(abKeyValue+16, abKeyValue, 8);
00228             des3_setup(abKeyValue, 24, 0, &pKeyContext->des3);
00229             break;
00230         
00231         case CALG_DES:
00232             des_setup(abKeyValue, 8, 0, &pKeyContext->des);
00233             break;
00234 
00235         case CALG_AES:
00236         case CALG_AES_128:
00237             aes_setup(abKeyValue, 16, 0, &pKeyContext->aes);
00238             break;
00239 
00240         case CALG_AES_192:
00241             aes_setup(abKeyValue, 24, 0, &pKeyContext->aes);
00242             break;
00243 
00244         case CALG_AES_256:
00245             aes_setup(abKeyValue, 32, 0, &pKeyContext->aes);
00246             break;
00247     }
00248 
00249     return TRUE;
00250 }
00251 
00252 BOOL duplicate_key_impl(ALG_ID aiAlgid, CONST KEY_CONTEXT *pSrcKeyContext,
00253                         KEY_CONTEXT *pDestKeyContext) 
00254 {
00255     switch (aiAlgid) 
00256     {
00257         case CALG_RC4:
00258         case CALG_RC2:
00259         case CALG_3DES:
00260         case CALG_3DES_112:
00261         case CALG_DES:
00262         case CALG_AES:
00263         case CALG_AES_128:
00264         case CALG_AES_192:
00265         case CALG_AES_256:
00266             *pDestKeyContext = *pSrcKeyContext;
00267             break;
00268         case CALG_RSA_KEYX:
00269         case CALG_RSA_SIGN:
00270             pDestKeyContext->rsa.type = pSrcKeyContext->rsa.type;
00271             mp_init_copy(&pDestKeyContext->rsa.e, &pSrcKeyContext->rsa.e);
00272             mp_init_copy(&pDestKeyContext->rsa.d, &pSrcKeyContext->rsa.d);
00273             mp_init_copy(&pDestKeyContext->rsa.N, &pSrcKeyContext->rsa.N);
00274             mp_init_copy(&pDestKeyContext->rsa.p, &pSrcKeyContext->rsa.p);
00275             mp_init_copy(&pDestKeyContext->rsa.q, &pSrcKeyContext->rsa.q);
00276             mp_init_copy(&pDestKeyContext->rsa.qP, &pSrcKeyContext->rsa.qP);
00277             mp_init_copy(&pDestKeyContext->rsa.dP, &pSrcKeyContext->rsa.dP);
00278             mp_init_copy(&pDestKeyContext->rsa.dQ, &pSrcKeyContext->rsa.dQ);
00279             break;
00280         
00281         default:
00282             SetLastError(NTE_BAD_ALGID);
00283             return FALSE;
00284     }
00285 
00286     return TRUE;
00287 }
00288 
00289 static inline void reverse_bytes(BYTE *pbData, DWORD dwLen) {
00290     BYTE swap;
00291     DWORD i;
00292 
00293     for (i=0; i<dwLen/2; i++) {
00294         swap = pbData[i];
00295         pbData[i] = pbData[dwLen-i-1];
00296         pbData[dwLen-i-1] = swap;
00297     }
00298 }
00299 
00300 BOOL encrypt_block_impl(ALG_ID aiAlgid, DWORD dwKeySpec, KEY_CONTEXT *pKeyContext, CONST BYTE *in, BYTE *out, 
00301                         DWORD enc) 
00302 {
00303     unsigned long inlen, outlen;
00304     BYTE *in_reversed = NULL;
00305         
00306     switch (aiAlgid) {
00307         case CALG_RC2:
00308             if (enc) {
00309                 rc2_ecb_encrypt(in, out, &pKeyContext->rc2);
00310             } else {
00311                 rc2_ecb_decrypt(in, out, &pKeyContext->rc2);
00312             }
00313             break;
00314 
00315         case CALG_3DES:
00316         case CALG_3DES_112:
00317             if (enc) {
00318                 des3_ecb_encrypt(in, out, &pKeyContext->des3);
00319             } else {
00320                 des3_ecb_decrypt(in, out, &pKeyContext->des3);
00321             }
00322             break;
00323 
00324         case CALG_DES:
00325             if (enc) {
00326                 des_ecb_encrypt(in, out, &pKeyContext->des);
00327             } else {
00328                 des_ecb_decrypt(in, out, &pKeyContext->des);
00329             }
00330             break;
00331 
00332         case CALG_AES:
00333         case CALG_AES_128:
00334         case CALG_AES_192:
00335         case CALG_AES_256:
00336             if (enc) {
00337                 aes_ecb_encrypt(in, out, &pKeyContext->aes);
00338             } else {
00339                 aes_ecb_decrypt(in, out, &pKeyContext->aes);
00340             }
00341             break;
00342 
00343         case CALG_RSA_KEYX:
00344         case CALG_RSA_SIGN:
00345         case CALG_SSL3_SHAMD5:
00346             outlen = inlen = (mp_count_bits(&pKeyContext->rsa.N)+7)/8;
00347             if (enc) {
00348                 if (rsa_exptmod(in, inlen, out, &outlen, dwKeySpec, &pKeyContext->rsa) != CRYPT_OK) {
00349                     SetLastError(NTE_FAIL);
00350                     return FALSE;
00351                 }
00352                 reverse_bytes(out, outlen);
00353             } else {
00354                 in_reversed = HeapAlloc(GetProcessHeap(), 0, inlen);
00355                 if (!in_reversed) {
00356                     SetLastError(NTE_NO_MEMORY);
00357                     return FALSE;
00358                 }
00359                 memcpy(in_reversed, in, inlen);
00360                 reverse_bytes(in_reversed, inlen);
00361                 if (rsa_exptmod(in_reversed, inlen, out, &outlen, dwKeySpec, &pKeyContext->rsa) != CRYPT_OK) {
00362                     HeapFree(GetProcessHeap(), 0, in_reversed);
00363                     SetLastError(NTE_FAIL);
00364                     return FALSE;
00365                 }
00366                 HeapFree(GetProcessHeap(), 0, in_reversed);
00367             }
00368             break;
00369 
00370         default:
00371             SetLastError(NTE_BAD_ALGID);
00372             return FALSE;
00373     }
00374 
00375     return TRUE;
00376 }
00377 
00378 BOOL encrypt_stream_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext, BYTE *stream, DWORD dwLen)
00379 {
00380     switch (aiAlgid) {
00381         case CALG_RC4:
00382             rc4_read(stream, dwLen, &pKeyContext->rc4);
00383             break;
00384 
00385         default:
00386             SetLastError(NTE_BAD_ALGID);
00387             return FALSE;
00388     }
00389 
00390     return TRUE;
00391 }
00392 
00393 BOOL gen_rand_impl(BYTE *pbBuffer, DWORD dwLen)
00394 {
00395     return SystemFunction036(pbBuffer, dwLen);
00396 }
00397 
00398 BOOL export_public_key_impl(BYTE *pbDest, const KEY_CONTEXT *pKeyContext, DWORD dwKeyLen,DWORD *pdwPubExp)
00399 {
00400     mp_to_unsigned_bin(&pKeyContext->rsa.N, pbDest);
00401     reverse_bytes(pbDest, mp_unsigned_bin_size(&pKeyContext->rsa.N));
00402     if (mp_unsigned_bin_size(&pKeyContext->rsa.N) < dwKeyLen)
00403         memset(pbDest + mp_unsigned_bin_size(&pKeyContext->rsa.N), 0,
00404                dwKeyLen - mp_unsigned_bin_size(&pKeyContext->rsa.N));
00405     *pdwPubExp = (DWORD)mp_get_int(&pKeyContext->rsa.e);
00406     return TRUE;
00407 }
00408 
00409 BOOL import_public_key_impl(CONST BYTE *pbSrc, KEY_CONTEXT *pKeyContext, DWORD dwKeyLen, 
00410                             DWORD dwPubExp)
00411 {
00412     BYTE *pbTemp;
00413 
00414     if (mp_init_multi(&pKeyContext->rsa.e, &pKeyContext->rsa.d, &pKeyContext->rsa.N, 
00415                       &pKeyContext->rsa.dQ,&pKeyContext->rsa.dP,&pKeyContext->rsa.qP, 
00416                       &pKeyContext->rsa.p, &pKeyContext->rsa.q, NULL) != MP_OKAY)
00417     {
00418         SetLastError(NTE_FAIL);
00419         return FALSE;
00420     }
00421 
00422     pbTemp = HeapAlloc(GetProcessHeap(), 0, dwKeyLen);
00423     if (!pbTemp) return FALSE;
00424     memcpy(pbTemp, pbSrc, dwKeyLen);
00425     
00426     pKeyContext->rsa.type = PK_PUBLIC;
00427     reverse_bytes(pbTemp, dwKeyLen);
00428     mp_read_unsigned_bin(&pKeyContext->rsa.N, pbTemp, dwKeyLen);
00429     HeapFree(GetProcessHeap(), 0, pbTemp);
00430     mp_set_int(&pKeyContext->rsa.e, dwPubExp);
00431 
00432     return TRUE;    
00433 }
00434 
00435 BOOL export_private_key_impl(BYTE *pbDest, const KEY_CONTEXT *pKeyContext, DWORD dwKeyLen,
00436                              DWORD *pdwPubExp)
00437 {
00438     mp_to_unsigned_bin(&pKeyContext->rsa.N, pbDest);
00439     reverse_bytes(pbDest, mp_unsigned_bin_size(&pKeyContext->rsa.N));
00440     if (mp_unsigned_bin_size(&pKeyContext->rsa.N) < dwKeyLen)
00441         memset(pbDest + mp_unsigned_bin_size(&pKeyContext->rsa.N), 0,
00442                dwKeyLen - mp_unsigned_bin_size(&pKeyContext->rsa.N));
00443     pbDest += dwKeyLen;
00444     mp_to_unsigned_bin(&pKeyContext->rsa.p, pbDest);
00445     reverse_bytes(pbDest, mp_unsigned_bin_size(&pKeyContext->rsa.p));
00446     if (mp_unsigned_bin_size(&pKeyContext->rsa.p) < (dwKeyLen+1)>>1)
00447         memset(pbDest + mp_unsigned_bin_size(&pKeyContext->rsa.p), 0,
00448                ((dwKeyLen+1)>>1) - mp_unsigned_bin_size(&pKeyContext->rsa.p));
00449     pbDest += (dwKeyLen+1)>>1;
00450     mp_to_unsigned_bin(&pKeyContext->rsa.q, pbDest);
00451     reverse_bytes(pbDest, mp_unsigned_bin_size(&pKeyContext->rsa.q));
00452     if (mp_unsigned_bin_size(&pKeyContext->rsa.q) < (dwKeyLen+1)>>1)
00453         memset(pbDest + mp_unsigned_bin_size(&pKeyContext->rsa.q), 0,
00454                ((dwKeyLen+1)>>1) - mp_unsigned_bin_size(&pKeyContext->rsa.q));
00455     pbDest += (dwKeyLen+1)>>1;
00456     mp_to_unsigned_bin(&pKeyContext->rsa.dP, pbDest);
00457     reverse_bytes(pbDest, mp_unsigned_bin_size(&pKeyContext->rsa.dP));
00458     if (mp_unsigned_bin_size(&pKeyContext->rsa.dP) < (dwKeyLen+1)>>1)
00459         memset(pbDest + mp_unsigned_bin_size(&pKeyContext->rsa.dP), 0,
00460                ((dwKeyLen+1)>>1) - mp_unsigned_bin_size(&pKeyContext->rsa.dP));
00461     pbDest += (dwKeyLen+1)>>1;
00462     mp_to_unsigned_bin(&pKeyContext->rsa.dQ, pbDest);
00463     reverse_bytes(pbDest, mp_unsigned_bin_size(&pKeyContext->rsa.dQ));
00464     if (mp_unsigned_bin_size(&pKeyContext->rsa.dQ) < (dwKeyLen+1)>>1)
00465         memset(pbDest + mp_unsigned_bin_size(&pKeyContext->rsa.dQ), 0,
00466                ((dwKeyLen+1)>>1) - mp_unsigned_bin_size(&pKeyContext->rsa.dQ));
00467     pbDest += (dwKeyLen+1)>>1;
00468     mp_to_unsigned_bin(&pKeyContext->rsa.qP, pbDest);
00469     reverse_bytes(pbDest, mp_unsigned_bin_size(&pKeyContext->rsa.qP));
00470     if (mp_unsigned_bin_size(&pKeyContext->rsa.qP) < (dwKeyLen+1)>>1)
00471         memset(pbDest + mp_unsigned_bin_size(&pKeyContext->rsa.qP), 0,
00472                ((dwKeyLen+1)>>1) - mp_unsigned_bin_size(&pKeyContext->rsa.qP));
00473     pbDest += (dwKeyLen+1)>>1;
00474     mp_to_unsigned_bin(&pKeyContext->rsa.d, pbDest);
00475     reverse_bytes(pbDest, mp_unsigned_bin_size(&pKeyContext->rsa.d));
00476     if (mp_unsigned_bin_size(&pKeyContext->rsa.d) < dwKeyLen)
00477         memset(pbDest + mp_unsigned_bin_size(&pKeyContext->rsa.d), 0,
00478                dwKeyLen - mp_unsigned_bin_size(&pKeyContext->rsa.d));
00479     *pdwPubExp = (DWORD)mp_get_int(&pKeyContext->rsa.e);
00480 
00481     return TRUE;
00482 }
00483 
00484 BOOL import_private_key_impl(CONST BYTE *pbSrc, KEY_CONTEXT *pKeyContext, DWORD dwKeyLen, 
00485                              DWORD dwDataLen, DWORD dwPubExp)
00486 {
00487     BYTE *pbTemp, *pbBigNum;
00488 
00489     if (mp_init_multi(&pKeyContext->rsa.e, &pKeyContext->rsa.d, &pKeyContext->rsa.N, 
00490                       &pKeyContext->rsa.dQ,&pKeyContext->rsa.dP,&pKeyContext->rsa.qP, 
00491                       &pKeyContext->rsa.p, &pKeyContext->rsa.q, NULL) != MP_OKAY)
00492     {
00493         SetLastError(NTE_FAIL);
00494         return FALSE;
00495     }
00496 
00497     pbTemp = HeapAlloc(GetProcessHeap(), 0, 2*dwKeyLen+5*((dwKeyLen+1)>>1));
00498     if (!pbTemp) return FALSE;
00499     memcpy(pbTemp, pbSrc, min(dwDataLen, 2*dwKeyLen+5*((dwKeyLen+1)>>1)));
00500     pbBigNum = pbTemp;
00501 
00502     pKeyContext->rsa.type = PK_PRIVATE;
00503     reverse_bytes(pbBigNum, dwKeyLen);
00504     mp_read_unsigned_bin(&pKeyContext->rsa.N, pbBigNum, dwKeyLen);
00505     pbBigNum += dwKeyLen;
00506     reverse_bytes(pbBigNum, (dwKeyLen+1)>>1);
00507     mp_read_unsigned_bin(&pKeyContext->rsa.p, pbBigNum, (dwKeyLen+1)>>1);
00508     pbBigNum += (dwKeyLen+1)>>1;
00509     reverse_bytes(pbBigNum, (dwKeyLen+1)>>1);
00510     mp_read_unsigned_bin(&pKeyContext->rsa.q, pbBigNum, (dwKeyLen+1)>>1);
00511     pbBigNum += (dwKeyLen+1)>>1;
00512     reverse_bytes(pbBigNum, (dwKeyLen+1)>>1);
00513     mp_read_unsigned_bin(&pKeyContext->rsa.dP, pbBigNum, (dwKeyLen+1)>>1);
00514     pbBigNum += (dwKeyLen+1)>>1;
00515     reverse_bytes(pbBigNum, (dwKeyLen+1)>>1);
00516     mp_read_unsigned_bin(&pKeyContext->rsa.dQ, pbBigNum, (dwKeyLen+1)>>1);
00517     pbBigNum += (dwKeyLen+1)>>1;
00518     reverse_bytes(pbBigNum, (dwKeyLen+1)>>1);
00519     mp_read_unsigned_bin(&pKeyContext->rsa.qP, pbBigNum, (dwKeyLen+1)>>1);
00520     pbBigNum += (dwKeyLen+1)>>1;
00521     /* The size of the private exponent d is inferred from the remaining
00522      * data length.
00523      */
00524     dwKeyLen = min(dwKeyLen, dwDataLen - (pbBigNum - pbTemp));
00525     reverse_bytes(pbBigNum, dwKeyLen);
00526     mp_read_unsigned_bin(&pKeyContext->rsa.d, pbBigNum, dwKeyLen);
00527     mp_set_int(&pKeyContext->rsa.e, dwPubExp);
00528     
00529     HeapFree(GetProcessHeap(), 0, pbTemp);
00530     return TRUE;
00531 }

Generated on Sat May 26 2012 04:24:43 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.