/*
**
** Copyright 2009, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

#ifndef __CERT_H__
#define __CERT_H__

#define ANDROID_KEYSTORE "Android Keystore"
#define KEYGEN_STORE_SIZE     5
#define KEYLENGTH_MEDIUM      1024
#define KEYLENGTH_MAXIMUM     2048
#define MAX_CERT_NAME_LEN     128
#define MAX_PEM_LENGTH        4096
#define REPLY_MAX             MAX_PEM_LENGTH


#define STR(token) #token
#define ERR_INVALID_KEY_LENGTH  1
#define ERR_CONSTRUCT_NEW_DATA  2
#define ERR_RSA_KEYGEN          3
#define ERR_X509_PROCESS        4
#define ERR_BIO_READ            5
#define ERR_MAXIMUM             6

typedef struct {
    EVP_PKEY *pkey;
    unsigned char *public_key;
    int key_len;
} PKEY_STORE;

typedef struct {
    PKCS12  *p12;
    EVP_PKEY *pkey;
    X509 *cert;
    STACK_OF(X509) *certs;
} PKCS12_KEYSTORE;

#define PKEY_STORE_free(x) { \
    if(x.pkey) EVP_PKEY_free(x.pkey); \
    if(x.public_key) free(x.public_key); \
}

#define nelem(x) (sizeof (x) / sizeof *(x))

int gen_csr(int bits, const char *organizations, char reply[REPLY_MAX]);
PKCS12_KEYSTORE *get_pkcs12_keystore_handle(const char *buf, int bufLen,
                                            const char *passwd);
int get_pkcs12_certificate(PKCS12_KEYSTORE *p12store, char *buf, int size);
int get_pkcs12_private_key(PKCS12_KEYSTORE *p12store, char *buf, int size);
int pop_pkcs12_certs_stack(PKCS12_KEYSTORE *p12store, char *buf, int size);
void free_pkcs12_keystore(PKCS12_KEYSTORE *p12store);
int is_pkcs12(const char *buf, int bufLen);
X509 *parse_cert(const char *buf, int bufLen);
int get_cert_name(X509 *cert, char *buf, int size);
int get_issuer_name(X509 *cert, char *buf, int size);
int is_ca_cert(X509 *cert);
int get_private_key_pem(X509 *cert, char *buf, int size);

#endif
