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 katja_encrypt_key.c
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  Katja PKCS-style OAEP encryption, Tom St Denis
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MKAT
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 key         The Katja key to encrypt to
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @return CRYPT_OK if successful
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint katja_encrypt_key(const unsigned char *in,     unsigned long inlen,
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                          unsigned char *out,    unsigned long *outlen,
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                    const unsigned char *lparam, unsigned long lparamlen,
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                    prng_state *prng, int prng_idx, int hash_idx, katja_key *key)
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  unsigned long modulus_bitlen, modulus_bytelen, x;
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  int           err;
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  LTC_ARGCHK(in     != NULL);
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  LTC_ARGCHK(out    != NULL);
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  LTC_ARGCHK(outlen != NULL);
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  LTC_ARGCHK(key    != NULL);
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* valid prng and hash ? */
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  if ((err = prng_is_valid(prng_idx)) != CRYPT_OK) {
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     return err;
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  if ((err = hash_is_valid(hash_idx)) != CRYPT_OK) {
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     return err;
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* get modulus len in bits */
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  modulus_bitlen = mp_count_bits((key->N));
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* payload is upto pq, so we know q is 1/3rd the size of N and therefore pq is 2/3th the size */
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  modulus_bitlen = ((modulus_bitlen << 1) / 3);
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* round down to next byte */
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  modulus_bitlen -= (modulus_bitlen & 7) + 8;
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* outlen must be at least the size of the modulus */
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  modulus_bytelen = mp_unsigned_bin_size((key->N));
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  if (modulus_bytelen > *outlen) {
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     *outlen = modulus_bytelen;
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     return CRYPT_BUFFER_OVERFLOW;
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* OAEP pad the key */
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  x = *outlen;
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  if ((err = pkcs_1_oaep_encode(in, inlen, lparam,
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                lparamlen, modulus_bitlen, prng, prng_idx, hash_idx,
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                out, &x)) != CRYPT_OK) {
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     return err;
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* Katja exptmod the OAEP pad */
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  return katja_exptmod(out, x, out, outlen, PK_PUBLIC, key);
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* MRSA */
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/pk/katja/katja_encrypt_key.c,v $ */
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.5 $ */
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/06/16 21:53:41 $ */
88