/home/dko/Projects/mobilec/src/security/xyssl-0.9/library/rsa.c File Reference

#include "xyssl/config.h"
#include "xyssl/rsa.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "xyssl/sha1.h"

Go to the source code of this file.

Defines

#define KEY_LEN   128
#define RSA_N
#define RSA_E   "10001"
#define RSA_D
#define RSA_P
#define RSA_Q
#define RSA_DP
#define RSA_DQ
#define RSA_QP
#define PT_LEN   24
#define RSA_PT

Functions

void rsa_init (rsa_context *ctx, int padding, int hash_id, int(*f_rng)(void *), void *p_rng)
 Initialize an RSA context.
int rsa_gen_key (rsa_context *ctx, int nbits, int exponent)
 Generate an RSA keypair.
int rsa_check_pubkey (rsa_context *ctx)
 Check a public RSA key.
int rsa_check_privkey (rsa_context *ctx)
 Check a private RSA key.
int rsa_public (rsa_context *ctx, unsigned char *input, unsigned char *output)
 Do an RSA public key operation.
int rsa_private (rsa_context *ctx, unsigned char *input, unsigned char *output)
 Do an RSA private key operation.
int rsa_pkcs1_encrypt (rsa_context *ctx, int mode, int ilen, unsigned char *input, unsigned char *output)
 Add the message padding, then do an RSA operation.
int rsa_pkcs1_decrypt (rsa_context *ctx, int mode, int *olen, unsigned char *input, unsigned char *output)
 Do an RSA operation, then remove the message padding.
int rsa_pkcs1_sign (rsa_context *ctx, int mode, int hash_id, int hashlen, unsigned char *hash, unsigned char *sig)
 Do a private RSA to sign a message digest.
int rsa_pkcs1_verify (rsa_context *ctx, int mode, int hash_id, int hashlen, unsigned char *hash, unsigned char *sig)
 Do a public RSA and check the message digest.
void rsa_free (rsa_context *ctx)
 Free the components of an RSA key.
int rsa_self_test (int verbose)
 Checkup routine.

Define Documentation

#define KEY_LEN   128

Definition at line 573 of file rsa.c.

Referenced by rsa_self_test().

#define PT_LEN   24

Definition at line 620 of file rsa.c.

Referenced by rsa_self_test().

#define RSA_D
Value:
"24BF6185468786FDD303083D25E64EFC" \
                "66CA472BC44D253102F8B4A9D3BFA750" \
                "91386C0077937FE33FA3252D28855837" \
                "AE1B484A8A9A45F7EE8C0C634F99E8CD" \
                "DF79C5CE07EE72C7F123142198164234" \
                "CABB724CF78B8173B9F880FC86322407" \
                "AF1FEDFDDE2BEB674CA15F3E81A1521E" \
                "071513A1E85B5DFA031F21ECAE91A34D"

Definition at line 586 of file rsa.c.

Referenced by rsa_self_test().

#define RSA_DP
Value:
"C1ACF567564274FB07A0BBAD5D26E298" \
                "3C94D22288ACD763FD8E5600ED4A702D" \
                "F84198A5F06C2E72236AE490C93F07F8" \
                "3CC559CD27BC2D1CA488811730BB5725"

Definition at line 605 of file rsa.c.

Referenced by rsa_self_test().

#define RSA_DQ
Value:
"4959CBF6F8FEF750AEE6977C155579C7" \
                "D8AAEA56749EA28623272E4F7D0592AF" \
                "7C1F1313CAC9471B5C523BFE592F517B" \
                "407A1BD76C164B93DA2D32A383E58357"

Definition at line 610 of file rsa.c.

Referenced by rsa_self_test().

#define RSA_E   "10001"

Definition at line 584 of file rsa.c.

Referenced by rsa_self_test().

#define RSA_N
Value:
"9292758453063D803DD603D5E777D788" \
                "8ED1D5BF35786190FA2F23EBC0848AEA" \
                "DDA92CA6C3D80B32C4D109BE0F36D6AE" \
                "7130B9CED7ACDF54CFC7555AC14EEBAB" \
                "93A89813FBF3C4F8066D2D800F7C38A8" \
                "1AE31942917403FF4946B0A83D3D3E05" \
                "EE57C6F5F5606FB5D4BC6CD34EE0801A" \
                "5E94BB77B07507233A0BC7BAC8F90F79"

Definition at line 575 of file rsa.c.

Referenced by rsa_self_test().

#define RSA_P
Value:
"C36D0EB7FCD285223CFB5AABA5BDA3D8" \
                "2C01CAD19EA484A87EA4377637E75500" \
                "FCB2005C5C7DD6EC4AC023CDA285D796" \
                "C3D9E75E1EFC42488BB4F1D13AC30A57"

Definition at line 595 of file rsa.c.

Referenced by rsa_self_test().

#define RSA_PT
Value:
"\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \
                "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD"

Definition at line 621 of file rsa.c.

Referenced by rsa_self_test().

#define RSA_Q
Value:
"C000DF51A7C77AE8D7C7370C1FF55B69" \
                "E211C2B9E5DB1ED0BF61D0D9899620F4" \
                "910E4168387E3C30AA1E00C339A79508" \
                "8452DD96A9A5EA5D9DCA68DA636032AF"

Definition at line 600 of file rsa.c.

Referenced by rsa_self_test().

#define RSA_QP
Value:
"9AE7FBC99546432DF71896FC239EADAE" \
                "F38D18D2B2F0E2DD275AA977E2BF4411" \
                "F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \
                "A74206CEC169D74BF5A8C50D6F48EA08"

Definition at line 615 of file rsa.c.

Referenced by rsa_self_test().


Function Documentation

int rsa_check_privkey ( rsa_context ctx  ) 

Check a private RSA key.

Parameters:
ctx RSA context to be checked
Returns:
0 if successful, or an XYSSL_ERR_RSA_XXX error code

Definition at line 152 of file rsa.c.

References rsa_context::D, rsa_context::E, MPI_CHK, mpi_cmp_int(), mpi_cmp_mpi(), mpi_free(), mpi_gcd(), mpi_init(), mpi_mod_mpi(), mpi_mul_mpi(), mpi_sub_int(), rsa_context::N, rsa_context::P, rsa_context::Q, rsa_check_pubkey(), and XYSSL_ERR_RSA_KEY_CHECK_FAILED.

Referenced by rsa_decryption(), rsa_self_test(), and x509parse_key().

int rsa_check_pubkey ( rsa_context ctx  ) 

Check a public RSA key.

Parameters:
ctx RSA context to be checked
Returns:
0 if successful, or an XYSSL_ERR_RSA_XXX error code

Definition at line 132 of file rsa.c.

References rsa_context::E, mpi_msb(), rsa_context::N, mpi::p, and XYSSL_ERR_RSA_KEY_CHECK_FAILED.

Referenced by rsa_check_privkey(), rsa_encryption(), rsa_self_test(), and x509parse_crt().

void rsa_free ( rsa_context ctx  ) 
int rsa_gen_key ( rsa_context ctx,
int  nbits,
int  exponent 
)

Generate an RSA keypair.

Parameters:
ctx RSA context that will hold the key
nbits size of the public key in bits
exponent public exponent (e.g., 65537)
Note:
rsa_init() must be called beforehand to setup the RSA context (especially f_rng and p_rng).
Returns:
0 if successful, or an XYSSL_ERR_RSA_XXX error code

Definition at line 60 of file rsa.c.

References rsa_context::D, rsa_context::DP, rsa_context::DQ, rsa_context::E, rsa_context::f_rng, rsa_context::len, MPI_CHK, mpi_cmp_int(), mpi_cmp_mpi(), mpi_free(), mpi_gcd(), mpi_gen_prime(), mpi_init(), mpi_inv_mod(), mpi_lset(), mpi_mod_mpi(), mpi_msb(), mpi_mul_mpi(), mpi_sub_int(), mpi_swap(), rsa_context::N, rsa_context::P, rsa_context::p_rng, rsa_context::Q, rsa_context::QP, rsa_free(), XYSSL_ERR_RSA_BAD_INPUT_DATA, and XYSSL_ERR_RSA_KEY_GEN_FAILED.

Referenced by generate_RSA_keys_ciphertext(), generate_RSA_keys_plaintext(), and main().

void rsa_init ( rsa_context ctx,
int  padding,
int  hash_id,
int(*)(void *)  f_rng,
void *  p_rng 
)

Initialize an RSA context.

Parameters:
ctx RSA context to be initialized
padding RSA_PKCS_V15 or RSA_PKCS_V21
hash_id RSA_PKCS_V21 hash identifier
f_rng RNG function
p_rng RNG parameter
Note:
The hash_id parameter is actually ignored when using RSA_PKCS_V15 padding.
Currently (xyssl-0.8), RSA_PKCS_V21 padding is not supported.

Definition at line 40 of file rsa.c.

References rsa_context::f_rng, rsa_context::hash_id, rsa_context::p_rng, and rsa_context::padding.

Referenced by generate_RSA_keys_ciphertext(), generate_RSA_keys_plaintext(), main(), rsa_decryption(), and rsa_encryption().

int rsa_pkcs1_decrypt ( rsa_context ctx,
int  mode,
int olen,
unsigned char *  input,
unsigned char *  output 
)

Do an RSA operation, then remove the message padding.

Parameters:
ctx RSA context
mode RSA_PUBLIC or RSA_PRIVATE
input buffer holding the encrypted data
output buffer that will hold the plaintext
olen will contain the plaintext length
Returns:
0 if successful, or an XYSSL_ERR_RSA_XXX error code
Note:
The output buffer must be as large as the size of ctx->N (eg. 128 bytes if RSA-1024 is used).

Definition at line 326 of file rsa.c.

References buf, int, rsa_context::len, rsa_context::padding, RSA_CRYPT, RSA_PKCS_V15, rsa_private(), rsa_public(), RSA_PUBLIC, XYSSL_ERR_RSA_BAD_INPUT_DATA, and XYSSL_ERR_RSA_INVALID_PADDING.

Referenced by rsa_decryption(), RSA_private_decrypt(), RSA_public_decrypt(), rsa_self_test(), and ssl_parse_client_key_exchange().

int rsa_pkcs1_encrypt ( rsa_context ctx,
int  mode,
int  ilen,
unsigned char *  input,
unsigned char *  output 
)

Add the message padding, then do an RSA operation.

Parameters:
ctx RSA context
mode RSA_PUBLIC or RSA_PRIVATE
ilen contains the the plaintext length
input buffer holding the data to be encrypted
output buffer that will hold the ciphertext
Returns:
0 if successful, or an XYSSL_ERR_RSA_XXX error code
Note:
The output buffer must be as large as the size of ctx->N (eg. 128 bytes if RSA-1024 is used).

Definition at line 280 of file rsa.c.

References rsa_context::len, rsa_context::padding, RSA_CRYPT, RSA_PKCS_V15, rsa_private(), rsa_public(), RSA_PUBLIC, XYSSL_ERR_RSA_BAD_INPUT_DATA, and XYSSL_ERR_RSA_INVALID_PADDING.

Referenced by rsa_encryption(), RSA_private_encrypt(), RSA_public_encrypt(), rsa_self_test(), and ssl_write_client_key_exchange().

int rsa_pkcs1_sign ( rsa_context ctx,
int  mode,
int  hash_id,
int  hashlen,
unsigned char *  hash,
unsigned char *  sig 
)

Do a private RSA to sign a message digest.

Parameters:
ctx RSA context
mode RSA_PUBLIC or RSA_PRIVATE
hash_id RSA_RAW, RSA_MD{2,4,5} or RSA_SHA{1,256}
hashlen message digest length (for RSA_RAW only)
hash buffer holding the message digest
sig buffer that will hold the ciphertext
Returns:
0 if the signing operation was successful, or an XYSSL_ERR_RSA_XXX error code
Note:
The "sig" buffer must be as large as the size of ctx->N (eg. 128 bytes if RSA-1024 is used).

Definition at line 379 of file rsa.c.

References ASN1_HASH_MDX, ASN1_HASH_SHA1, rsa_context::len, rsa_context::padding, RSA_MD2, RSA_MD4, RSA_MD5, RSA_PKCS_V15, rsa_private(), rsa_public(), RSA_PUBLIC, RSA_RAW, RSA_SHA1, RSA_SIGN, XYSSL_ERR_RSA_BAD_INPUT_DATA, and XYSSL_ERR_RSA_INVALID_PADDING.

Referenced by main(), rsa_self_test(), ssl_write_certificate_verify(), and ssl_write_server_key_exchange().

int rsa_pkcs1_verify ( rsa_context ctx,
int  mode,
int  hash_id,
int  hashlen,
unsigned char *  hash,
unsigned char *  sig 
)

Do a public RSA and check the message digest.

Parameters:
ctx points to an RSA public key
mode RSA_PUBLIC or RSA_PRIVATE
hash_id RSA_RAW, RSA_MD{2,4,5} or RSA_SHA{1,256}
hashlen message digest length (for RSA_RAW only)
hash buffer holding the message digest
sig buffer holding the ciphertext
Returns:
0 if the verify operation was successful, or an XYSSL_ERR_RSA_XXX error code
Note:
The "sig" buffer must be as large as the size of ctx->N (eg. 128 bytes if RSA-1024 is used).

Definition at line 468 of file rsa.c.

References ASN1_HASH_MDX, ASN1_HASH_SHA1, buf, int, rsa_context::len, rsa_context::padding, RSA_MD2, RSA_MD4, RSA_MD5, RSA_PKCS_V15, rsa_private(), rsa_public(), RSA_PUBLIC, RSA_RAW, RSA_SHA1, RSA_SIGN, XYSSL_ERR_RSA_BAD_INPUT_DATA, XYSSL_ERR_RSA_INVALID_PADDING, and XYSSL_ERR_RSA_VERIFY_FAILED.

Referenced by main(), rsa_self_test(), ssl_parse_certificate_verify(), ssl_parse_server_key_exchange(), and x509parse_verify().

int rsa_private ( rsa_context ctx,
unsigned char *  input,
unsigned char *  output 
)

Do an RSA private key operation.

Parameters:
ctx RSA context
input input buffer
output output buffer
Returns:
0 if successful, or an XYSSL_ERR_RSA_XXX error code
Note:
The input and output buffers must be large enough (eg. 128 bytes if RSA-1024 is used).

Definition at line 221 of file rsa.c.

References rsa_context::D, rsa_context::DP, rsa_context::DQ, rsa_context::len, mpi_add_mpi(), MPI_CHK, mpi_cmp_mpi(), mpi_exp_mod(), mpi_free(), mpi_init(), mpi_mod_mpi(), mpi_mul_mpi(), mpi_read_binary(), mpi_sub_mpi(), mpi_write_binary(), rsa_context::N, rsa_context::P, rsa_context::Q, rsa_context::QP, rsa_context::RN, rsa_context::RP, rsa_context::RQ, XYSSL_ERR_RSA_BAD_INPUT_DATA, and XYSSL_ERR_RSA_PRIVATE_FAILED.

Referenced by main(), rsa_pkcs1_decrypt(), rsa_pkcs1_encrypt(), rsa_pkcs1_sign(), and rsa_pkcs1_verify().

int rsa_public ( rsa_context ctx,
unsigned char *  input,
unsigned char *  output 
)

Do an RSA public key operation.

Parameters:
ctx RSA context
input input buffer
output output buffer
Returns:
0 if successful, or an XYSSL_ERR_RSA_XXX error code
Note:
This function does NOT take care of message padding. Also, be sure to set input[0] = 0.
The input and output buffers must be large enough (eg. 128 bytes if RSA-1024 is used).

Definition at line 187 of file rsa.c.

References rsa_context::E, rsa_context::len, MPI_CHK, mpi_cmp_mpi(), mpi_exp_mod(), mpi_free(), mpi_init(), mpi_read_binary(), mpi_write_binary(), rsa_context::N, rsa_context::RN, XYSSL_ERR_RSA_BAD_INPUT_DATA, and XYSSL_ERR_RSA_PUBLIC_FAILED.

Referenced by main(), rsa_pkcs1_decrypt(), rsa_pkcs1_encrypt(), rsa_pkcs1_sign(), and rsa_pkcs1_verify().

int rsa_self_test ( int  verbose  ) 
Generated on Tue Dec 28 15:15:29 2010 for Mobile-C by  doxygen 1.6.3