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_export.c
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  Export RSA PKCS keys, Tom St Denis
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    This will export either an RSAPublicKey or RSAPrivateKey [defined in PKCS #1 v2.1]
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param out       [out] Destination of the packet
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param outlen    [in/out] The max size and resulting size of the packet
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param type      The type of exported key (PK_PRIVATE or PK_PUBLIC)
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @param key       The RSA key to export
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    @return CRYPT_OK if successful
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key)
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned long zero=0;
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(out    != NULL);
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(outlen != NULL);
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(key    != NULL);
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* type valid? */
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (!(key->type == PK_PRIVATE) && (type == PK_PRIVATE)) {
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return CRYPT_PK_INVALID_TYPE;
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (type == PK_PRIVATE) {
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      /* private key */
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      /* output is
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            Version, n, e, d, p, q, d mod (p-1), d mod (q - 1), 1/q mod p
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       */
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return der_encode_sequence_multi(out, outlen,
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                          LTC_ASN1_SHORT_INTEGER, 1UL, &zero,
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                          LTC_ASN1_INTEGER, 1UL,  key->N,
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                          LTC_ASN1_INTEGER, 1UL,  key->e,
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                          LTC_ASN1_INTEGER, 1UL,  key->d,
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                          LTC_ASN1_INTEGER, 1UL,  key->p,
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                          LTC_ASN1_INTEGER, 1UL,  key->q,
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                          LTC_ASN1_INTEGER, 1UL,  key->dP,
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                          LTC_ASN1_INTEGER, 1UL,  key->dQ,
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                          LTC_ASN1_INTEGER, 1UL,  key->qP,
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                          LTC_ASN1_EOL,     0UL, NULL);
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } else {
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      /* public key */
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return der_encode_sequence_multi(out, outlen,
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                 LTC_ASN1_INTEGER, 1UL,  key->N,
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                 LTC_ASN1_INTEGER, 1UL,  key->e,
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                                 LTC_ASN1_EOL,     0UL, NULL);
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* MRSA */
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_export.c,v $ */
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.15 $ */
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/03/31 14:15:35 $ */
70