1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* LibTomCrypt, modular cryptographic library -- Tom St Denis
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LibTomCrypt is a library that provides various cryptographic
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * algorithms in a highly modular and flexible manner.
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library is free for all purposes without any express
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * guarantee it works.
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "tomcrypt.h"
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  @file rsa_encrypt_key.c
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  RSA PKCS #1 encryption, Tom St Denis and Andreas Lange
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MRSA
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    (PKCS #1 v2.0) OAEP pad then encrypt
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param in          The plaintext
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param inlen       The length of the plaintext (octets)
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param out         [out] The ciphertext
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param outlen      [in/out] The max size and resulting size of the ciphertext
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param lparam      The system "lparam" for the encryption
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param lparamlen   The length of lparam (octets)
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param prng        An active PRNG
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param prng_idx    The index of the desired prng
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param hash_idx    The index of the desired hash
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param padding     Type of padding (LTC_PKCS_1_OAEP or LTC_PKCS_1_V1_5)
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param key         The RSA key to encrypt to
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @return CRYPT_OK if successful
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint rsa_encrypt_key_ex(const unsigned char *in,     unsigned long inlen,
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                             unsigned char *out,    unsigned long *outlen,
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                       const unsigned char *lparam, unsigned long lparamlen,
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                       prng_state *prng, int prng_idx, int hash_idx, int padding, rsa_key *key)
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned long modulus_bitlen, modulus_bytelen, x;
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  int           err;
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  LTC_ARGCHK(in     != NULL);
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  LTC_ARGCHK(out    != NULL);
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  LTC_ARGCHK(outlen != NULL);
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  LTC_ARGCHK(key    != NULL);
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* valid padding? */
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  if ((padding != LTC_PKCS_1_V1_5) &&
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (padding != LTC_PKCS_1_OAEP)) {
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    return CRYPT_PK_INVALID_PADDING;
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* valid prng? */
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  if ((err = prng_is_valid(prng_idx)) != CRYPT_OK) {
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     return err;
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  if (padding == LTC_PKCS_1_OAEP) {
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* valid hash? */
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if ((err = hash_is_valid(hash_idx)) != CRYPT_OK) {
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       return err;
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* get modulus len in bits */
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  modulus_bitlen = mp_count_bits( (key->N));
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* outlen must be at least the size of the modulus */
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  modulus_bytelen = mp_unsigned_bin_size( (key->N));
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  if (modulus_bytelen > *outlen) {
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     *outlen = modulus_bytelen;
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     return CRYPT_BUFFER_OVERFLOW;
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  if (padding == LTC_PKCS_1_OAEP) {
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* OAEP pad the key */
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    x = *outlen;
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if ((err = pkcs_1_oaep_encode(in, inlen, lparam,
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                  lparamlen, modulus_bitlen, prng, prng_idx, hash_idx,
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                  out, &x)) != CRYPT_OK) {
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       return err;
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  } else {
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* PKCS #1 v1.5 pad the key */
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    x = *outlen;
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if ((err = pkcs_1_v1_5_encode(in, inlen, LTC_PKCS_1_EME,
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                  modulus_bitlen, prng, prng_idx,
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                  out, &x)) != CRYPT_OK) {
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return err;
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* rsa exptmod the OAEP or PKCS #1 v1.5 pad */
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  return ltc_mp.rsa_me(out, x, out, outlen, PK_PUBLIC, key);
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* MRSA */
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_encrypt_key.c,v $ */
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.8 $ */
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/11/01 09:18:22 $ */
103