Path: blob/master/libs/tomcrypt/src/headers/tomcrypt_pk.h
5971 views
/* LibTomCrypt, modular cryptographic library -- Tom St Denis1*2* LibTomCrypt is a library that provides various cryptographic3* algorithms in a highly modular and flexible manner.4*5* The library is free for all purposes without any express6* guarantee it works.7*/89/* ---- NUMBER THEORY ---- */1011enum {12PK_PUBLIC=0,13PK_PRIVATE=114};1516/* Indicates standard output formats that can be read e.g. by OpenSSL or GnuTLS */17#define PK_STD 0x10001819int rand_prime(void *N, long len, prng_state *prng, int wprng);2021#ifdef LTC_SOURCE22/* internal helper functions */23int rand_bn_bits(void *N, int bits, prng_state *prng, int wprng);24int rand_bn_upto(void *N, void *limit, prng_state *prng, int wprng);2526enum public_key_algorithms {27PKA_RSA,28PKA_DSA29};3031typedef struct Oid {32unsigned long OID[16];33/** Number of OID digits in use */34unsigned long OIDlen;35} oid_st;3637int pk_get_oid(int pk, oid_st *st);38#endif /* LTC_SOURCE */3940/* ---- RSA ---- */41#ifdef LTC_MRSA4243/** RSA PKCS style key */44typedef struct Rsa_key {45/** Type of key, PK_PRIVATE or PK_PUBLIC */46int type;47/** The public exponent */48void *e;49/** The private exponent */50void *d;51/** The modulus */52void *N;53/** The p factor of N */54void *p;55/** The q factor of N */56void *q;57/** The 1/q mod p CRT param */58void *qP;59/** The d mod (p - 1) CRT param */60void *dP;61/** The d mod (q - 1) CRT param */62void *dQ;63} rsa_key;6465int rsa_make_key(prng_state *prng, int wprng, int size, long e, rsa_key *key);6667int rsa_get_size(rsa_key *key);6869int rsa_exptmod(const unsigned char *in, unsigned long inlen,70unsigned char *out, unsigned long *outlen, int which,71rsa_key *key);7273void rsa_free(rsa_key *key);7475/* These use PKCS #1 v2.0 padding */76#define rsa_encrypt_key(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _prng, _prng_idx, _hash_idx, _key) \77rsa_encrypt_key_ex(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _prng, _prng_idx, _hash_idx, LTC_PKCS_1_OAEP, _key)7879#define rsa_decrypt_key(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _hash_idx, _stat, _key) \80rsa_decrypt_key_ex(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _hash_idx, LTC_PKCS_1_OAEP, _stat, _key)8182#define rsa_sign_hash(_in, _inlen, _out, _outlen, _prng, _prng_idx, _hash_idx, _saltlen, _key) \83rsa_sign_hash_ex(_in, _inlen, _out, _outlen, LTC_PKCS_1_PSS, _prng, _prng_idx, _hash_idx, _saltlen, _key)8485#define rsa_verify_hash(_sig, _siglen, _hash, _hashlen, _hash_idx, _saltlen, _stat, _key) \86rsa_verify_hash_ex(_sig, _siglen, _hash, _hashlen, LTC_PKCS_1_PSS, _hash_idx, _saltlen, _stat, _key)8788#define rsa_sign_saltlen_get_max(_hash_idx, _key) \89rsa_sign_saltlen_get_max_ex(LTC_PKCS_1_PSS, _hash_idx, _key)9091/* These can be switched between PKCS #1 v2.x and PKCS #1 v1.5 paddings */92int rsa_encrypt_key_ex(const unsigned char *in, unsigned long inlen,93unsigned char *out, unsigned long *outlen,94const unsigned char *lparam, unsigned long lparamlen,95prng_state *prng, int prng_idx, int hash_idx, int padding, rsa_key *key);9697int rsa_decrypt_key_ex(const unsigned char *in, unsigned long inlen,98unsigned char *out, unsigned long *outlen,99const unsigned char *lparam, unsigned long lparamlen,100int hash_idx, int padding,101int *stat, rsa_key *key);102103int rsa_sign_hash_ex(const unsigned char *in, unsigned long inlen,104unsigned char *out, unsigned long *outlen,105int padding,106prng_state *prng, int prng_idx,107int hash_idx, unsigned long saltlen,108rsa_key *key);109110int rsa_verify_hash_ex(const unsigned char *sig, unsigned long siglen,111const unsigned char *hash, unsigned long hashlen,112int padding,113int hash_idx, unsigned long saltlen,114int *stat, rsa_key *key);115116int rsa_sign_saltlen_get_max_ex(int padding, int hash_idx, rsa_key *key);117118/* PKCS #1 import/export */119int rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key);120int rsa_import(const unsigned char *in, unsigned long inlen, rsa_key *key);121122int rsa_import_x509(const unsigned char *in, unsigned long inlen, rsa_key *key);123int rsa_import_pkcs8(const unsigned char *in, unsigned long inlen,124const void *passwd, unsigned long passwdlen, rsa_key *key);125126int rsa_set_key(const unsigned char *N, unsigned long Nlen,127const unsigned char *e, unsigned long elen,128const unsigned char *d, unsigned long dlen,129rsa_key *key);130int rsa_set_factors(const unsigned char *p, unsigned long plen,131const unsigned char *q, unsigned long qlen,132rsa_key *key);133int rsa_set_crt_params(const unsigned char *dP, unsigned long dPlen,134const unsigned char *dQ, unsigned long dQlen,135const unsigned char *qP, unsigned long qPlen,136rsa_key *key);137#endif138139/* ---- Katja ---- */140#ifdef LTC_MKAT141142/* Min and Max KAT key sizes (in bits) */143#define MIN_KAT_SIZE 1024144#define MAX_KAT_SIZE 4096145146/** Katja PKCS style key */147typedef struct KAT_key {148/** Type of key, PK_PRIVATE or PK_PUBLIC */149int type;150/** The private exponent */151void *d;152/** The modulus */153void *N;154/** The p factor of N */155void *p;156/** The q factor of N */157void *q;158/** The 1/q mod p CRT param */159void *qP;160/** The d mod (p - 1) CRT param */161void *dP;162/** The d mod (q - 1) CRT param */163void *dQ;164/** The pq param */165void *pq;166} katja_key;167168int katja_make_key(prng_state *prng, int wprng, int size, katja_key *key);169170int katja_exptmod(const unsigned char *in, unsigned long inlen,171unsigned char *out, unsigned long *outlen, int which,172katja_key *key);173174void katja_free(katja_key *key);175176/* These use PKCS #1 v2.0 padding */177int katja_encrypt_key(const unsigned char *in, unsigned long inlen,178unsigned char *out, unsigned long *outlen,179const unsigned char *lparam, unsigned long lparamlen,180prng_state *prng, int prng_idx, int hash_idx, katja_key *key);181182int katja_decrypt_key(const unsigned char *in, unsigned long inlen,183unsigned char *out, unsigned long *outlen,184const unsigned char *lparam, unsigned long lparamlen,185int hash_idx, int *stat,186katja_key *key);187188/* PKCS #1 import/export */189int katja_export(unsigned char *out, unsigned long *outlen, int type, katja_key *key);190int katja_import(const unsigned char *in, unsigned long inlen, katja_key *key);191192#endif193194/* ---- DH Routines ---- */195#ifdef LTC_MDH196197typedef struct {198int type;199void *x;200void *y;201void *base;202void *prime;203} dh_key;204205int dh_get_groupsize(dh_key *key);206207int dh_export(unsigned char *out, unsigned long *outlen, int type, dh_key *key);208int dh_import(const unsigned char *in, unsigned long inlen, dh_key *key);209210int dh_set_pg(const unsigned char *p, unsigned long plen,211const unsigned char *g, unsigned long glen,212dh_key *key);213int dh_set_pg_dhparam(const unsigned char *dhparam, unsigned long dhparamlen, dh_key *key);214int dh_set_pg_groupsize(int groupsize, dh_key *key);215216int dh_set_key(const unsigned char *in, unsigned long inlen, int type, dh_key *key);217int dh_generate_key(prng_state *prng, int wprng, dh_key *key);218219int dh_shared_secret(dh_key *private_key, dh_key *public_key,220unsigned char *out, unsigned long *outlen);221222void dh_free(dh_key *key);223224int dh_export_key(void *out, unsigned long *outlen, int type, dh_key *key);225226#ifdef LTC_SOURCE227typedef struct {228int size;229const char *name, *base, *prime;230} ltc_dh_set_type;231232extern const ltc_dh_set_type ltc_dh_sets[];233234/* internal helper functions */235int dh_check_pubkey(dh_key *key);236#endif237238#endif /* LTC_MDH */239240241/* ---- ECC Routines ---- */242#ifdef LTC_MECC243244/* size of our temp buffers for exported keys */245#define ECC_BUF_SIZE 256246247/* max private key size */248#define ECC_MAXSIZE 66249250/** Structure defines a NIST GF(p) curve */251typedef struct {252/** The size of the curve in octets */253int size;254255/** name of curve */256const char *name;257258/** The prime that defines the field the curve is in (encoded in hex) */259const char *prime;260261/** The fields B param (hex) */262const char *B;263264/** The order of the curve (hex) */265const char *order;266267/** The x co-ordinate of the base point on the curve (hex) */268const char *Gx;269270/** The y co-ordinate of the base point on the curve (hex) */271const char *Gy;272} ltc_ecc_set_type;273274/** A point on a ECC curve, stored in Jacbobian format such that (x,y,z) => (x/z^2, y/z^3, 1) when interpretted as affine */275typedef struct {276/** The x co-ordinate */277void *x;278279/** The y co-ordinate */280void *y;281282/** The z co-ordinate */283void *z;284} ecc_point;285286/** An ECC key */287typedef struct {288/** Type of key, PK_PRIVATE or PK_PUBLIC */289int type;290291/** Index into the ltc_ecc_sets[] for the parameters of this curve; if -1, then this key is using user supplied curve in dp */292int idx;293294/** pointer to domain parameters; either points to NIST curves (identified by idx >= 0) or user supplied curve */295const ltc_ecc_set_type *dp;296297/** The public key */298ecc_point pubkey;299300/** The private key */301void *k;302} ecc_key;303304/** the ECC params provided */305extern const ltc_ecc_set_type ltc_ecc_sets[];306307int ecc_test(void);308void ecc_sizes(int *low, int *high);309int ecc_get_size(ecc_key *key);310311int ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key);312int ecc_make_key_ex(prng_state *prng, int wprng, ecc_key *key, const ltc_ecc_set_type *dp);313void ecc_free(ecc_key *key);314315int ecc_export(unsigned char *out, unsigned long *outlen, int type, ecc_key *key);316int ecc_import(const unsigned char *in, unsigned long inlen, ecc_key *key);317int ecc_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, const ltc_ecc_set_type *dp);318319int ecc_ansi_x963_export(ecc_key *key, unsigned char *out, unsigned long *outlen);320int ecc_ansi_x963_import(const unsigned char *in, unsigned long inlen, ecc_key *key);321int ecc_ansi_x963_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp);322323int ecc_shared_secret(ecc_key *private_key, ecc_key *public_key,324unsigned char *out, unsigned long *outlen);325326int ecc_encrypt_key(const unsigned char *in, unsigned long inlen,327unsigned char *out, unsigned long *outlen,328prng_state *prng, int wprng, int hash,329ecc_key *key);330331int ecc_decrypt_key(const unsigned char *in, unsigned long inlen,332unsigned char *out, unsigned long *outlen,333ecc_key *key);334335int ecc_sign_hash_rfc7518(const unsigned char *in, unsigned long inlen,336unsigned char *out, unsigned long *outlen,337prng_state *prng, int wprng, ecc_key *key);338339int ecc_sign_hash(const unsigned char *in, unsigned long inlen,340unsigned char *out, unsigned long *outlen,341prng_state *prng, int wprng, ecc_key *key);342343int ecc_verify_hash_rfc7518(const unsigned char *sig, unsigned long siglen,344const unsigned char *hash, unsigned long hashlen,345int *stat, ecc_key *key);346347int ecc_verify_hash(const unsigned char *sig, unsigned long siglen,348const unsigned char *hash, unsigned long hashlen,349int *stat, ecc_key *key);350351/* low level functions */352ecc_point *ltc_ecc_new_point(void);353void ltc_ecc_del_point(ecc_point *p);354int ltc_ecc_is_valid_idx(int n);355356/* point ops (mp == montgomery digit) */357#if !defined(LTC_MECC_ACCEL) || defined(LTM_DESC) || defined(GMP_DESC)358/* R = 2P */359int ltc_ecc_projective_dbl_point(ecc_point *P, ecc_point *R, void *modulus, void *mp);360361/* R = P + Q */362int ltc_ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *mp);363#endif364365#if defined(LTC_MECC_FP)366/* optimized point multiplication using fixed point cache (HAC algorithm 14.117) */367int ltc_ecc_fp_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map);368369/* functions for saving/loading/freeing/adding to fixed point cache */370int ltc_ecc_fp_save_state(unsigned char **out, unsigned long *outlen);371int ltc_ecc_fp_restore_state(unsigned char *in, unsigned long inlen);372void ltc_ecc_fp_free(void);373int ltc_ecc_fp_add_point(ecc_point *g, void *modulus, int lock);374375/* lock/unlock all points currently in fixed point cache */376void ltc_ecc_fp_tablelock(int lock);377#endif378379/* R = kG */380int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map);381382#ifdef LTC_ECC_SHAMIR383/* kA*A + kB*B = C */384int ltc_ecc_mul2add(ecc_point *A, void *kA,385ecc_point *B, void *kB,386ecc_point *C,387void *modulus);388389#ifdef LTC_MECC_FP390/* Shamir's trick with optimized point multiplication using fixed point cache */391int ltc_ecc_fp_mul2add(ecc_point *A, void *kA,392ecc_point *B, void *kB,393ecc_point *C, void *modulus);394#endif395396#endif397398399/* map P to affine from projective */400int ltc_ecc_map(ecc_point *P, void *modulus, void *mp);401402#endif403404#ifdef LTC_MDSA405406/* Max diff between group and modulus size in bytes */407#define LTC_MDSA_DELTA 512408409/* Max DSA group size in bytes (default allows 4k-bit groups) */410#define LTC_MDSA_MAX_GROUP 512411412/** DSA key structure */413typedef struct {414/** The key type, PK_PRIVATE or PK_PUBLIC */415int type;416417/** The order of the sub-group used in octets */418int qord;419420/** The generator */421void *g;422423/** The prime used to generate the sub-group */424void *q;425426/** The large prime that generats the field the contains the sub-group */427void *p;428429/** The private key */430void *x;431432/** The public key */433void *y;434} dsa_key;435436int dsa_make_key(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key);437438int dsa_set_pqg(const unsigned char *p, unsigned long plen,439const unsigned char *q, unsigned long qlen,440const unsigned char *g, unsigned long glen,441dsa_key *key);442int dsa_set_pqg_dsaparam(const unsigned char *dsaparam, unsigned long dsaparamlen, dsa_key *key);443int dsa_generate_pqg(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key);444445int dsa_set_key(const unsigned char *in, unsigned long inlen, int type, dsa_key *key);446int dsa_generate_key(prng_state *prng, int wprng, dsa_key *key);447448void dsa_free(dsa_key *key);449450int dsa_sign_hash_raw(const unsigned char *in, unsigned long inlen,451void *r, void *s,452prng_state *prng, int wprng, dsa_key *key);453454int dsa_sign_hash(const unsigned char *in, unsigned long inlen,455unsigned char *out, unsigned long *outlen,456prng_state *prng, int wprng, dsa_key *key);457458int dsa_verify_hash_raw( void *r, void *s,459const unsigned char *hash, unsigned long hashlen,460int *stat, dsa_key *key);461462int dsa_verify_hash(const unsigned char *sig, unsigned long siglen,463const unsigned char *hash, unsigned long hashlen,464int *stat, dsa_key *key);465466int dsa_encrypt_key(const unsigned char *in, unsigned long inlen,467unsigned char *out, unsigned long *outlen,468prng_state *prng, int wprng, int hash,469dsa_key *key);470471int dsa_decrypt_key(const unsigned char *in, unsigned long inlen,472unsigned char *out, unsigned long *outlen,473dsa_key *key);474475int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key);476int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key);477int dsa_verify_key(dsa_key *key, int *stat);478#ifdef LTC_SOURCE479/* internal helper functions */480int dsa_int_validate_xy(dsa_key *key, int *stat);481int dsa_int_validate_pqg(dsa_key *key, int *stat);482int dsa_int_validate_primes(dsa_key *key, int *stat);483#endif484int dsa_shared_secret(void *private_key, void *base,485dsa_key *public_key,486unsigned char *out, unsigned long *outlen);487#endif488489#ifdef LTC_DER490/* DER handling */491492typedef enum ltc_asn1_type_ {493/* 0 */494LTC_ASN1_EOL,495LTC_ASN1_BOOLEAN,496LTC_ASN1_INTEGER,497LTC_ASN1_SHORT_INTEGER,498LTC_ASN1_BIT_STRING,499/* 5 */500LTC_ASN1_OCTET_STRING,501LTC_ASN1_NULL,502LTC_ASN1_OBJECT_IDENTIFIER,503LTC_ASN1_IA5_STRING,504LTC_ASN1_PRINTABLE_STRING,505/* 10 */506LTC_ASN1_UTF8_STRING,507LTC_ASN1_UTCTIME,508LTC_ASN1_CHOICE,509LTC_ASN1_SEQUENCE,510LTC_ASN1_SET,511/* 15 */512LTC_ASN1_SETOF,513LTC_ASN1_RAW_BIT_STRING,514LTC_ASN1_TELETEX_STRING,515LTC_ASN1_CONSTRUCTED,516LTC_ASN1_CONTEXT_SPECIFIC,517/* 20 */518LTC_ASN1_GENERALIZEDTIME,519} ltc_asn1_type;520521/** A LTC ASN.1 list type */522typedef struct ltc_asn1_list_ {523/** The LTC ASN.1 enumerated type identifier */524ltc_asn1_type type;525/** The data to encode or place for decoding */526void *data;527/** The size of the input or resulting output */528unsigned long size;529/** The used flag, this is used by the CHOICE ASN.1 type to indicate which choice was made */530int used;531/** prev/next entry in the list */532struct ltc_asn1_list_ *prev, *next, *child, *parent;533} ltc_asn1_list;534535#define LTC_SET_ASN1(list, index, Type, Data, Size) \536do { \537int LTC_MACRO_temp = (index); \538ltc_asn1_list *LTC_MACRO_list = (list); \539LTC_MACRO_list[LTC_MACRO_temp].type = (Type); \540LTC_MACRO_list[LTC_MACRO_temp].data = (void*)(Data); \541LTC_MACRO_list[LTC_MACRO_temp].size = (Size); \542LTC_MACRO_list[LTC_MACRO_temp].used = 0; \543} while (0)544545/* SEQUENCE */546int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen,547unsigned char *out, unsigned long *outlen, int type_of);548549#define der_encode_sequence(list, inlen, out, outlen) der_encode_sequence_ex(list, inlen, out, outlen, LTC_ASN1_SEQUENCE)550551int der_decode_sequence_ex(const unsigned char *in, unsigned long inlen,552ltc_asn1_list *list, unsigned long outlen, int ordered);553554#define der_decode_sequence(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, 1)555556int der_length_sequence(ltc_asn1_list *list, unsigned long inlen,557unsigned long *outlen);558559560#ifdef LTC_SOURCE561/* internal helper functions */562int der_length_sequence_ex(ltc_asn1_list *list, unsigned long inlen,563unsigned long *outlen, unsigned long *payloadlen);564/* SUBJECT PUBLIC KEY INFO */565int der_encode_subject_public_key_info(unsigned char *out, unsigned long *outlen,566unsigned int algorithm, void* public_key, unsigned long public_key_len,567unsigned long parameters_type, void* parameters, unsigned long parameters_len);568569int der_decode_subject_public_key_info(const unsigned char *in, unsigned long inlen,570unsigned int algorithm, void* public_key, unsigned long* public_key_len,571unsigned long parameters_type, ltc_asn1_list* parameters, unsigned long parameters_len);572#endif /* LTC_SOURCE */573574/* SET */575#define der_decode_set(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, 0)576#define der_length_set der_length_sequence577int der_encode_set(ltc_asn1_list *list, unsigned long inlen,578unsigned char *out, unsigned long *outlen);579580int der_encode_setof(ltc_asn1_list *list, unsigned long inlen,581unsigned char *out, unsigned long *outlen);582583/* VA list handy helpers with triplets of <type, size, data> */584int der_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...);585int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...);586587/* FLEXI DECODER handle unknown list decoder */588int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc_asn1_list **out);589#define der_free_sequence_flexi der_sequence_free590void der_sequence_free(ltc_asn1_list *in);591void der_sequence_shrink(ltc_asn1_list *in);592593/* BOOLEAN */594int der_length_boolean(unsigned long *outlen);595int der_encode_boolean(int in,596unsigned char *out, unsigned long *outlen);597int der_decode_boolean(const unsigned char *in, unsigned long inlen,598int *out);599/* INTEGER */600int der_encode_integer(void *num, unsigned char *out, unsigned long *outlen);601int der_decode_integer(const unsigned char *in, unsigned long inlen, void *num);602int der_length_integer(void *num, unsigned long *len);603604/* INTEGER -- handy for 0..2^32-1 values */605int der_decode_short_integer(const unsigned char *in, unsigned long inlen, unsigned long *num);606int der_encode_short_integer(unsigned long num, unsigned char *out, unsigned long *outlen);607int der_length_short_integer(unsigned long num, unsigned long *outlen);608609/* BIT STRING */610int der_encode_bit_string(const unsigned char *in, unsigned long inlen,611unsigned char *out, unsigned long *outlen);612int der_decode_bit_string(const unsigned char *in, unsigned long inlen,613unsigned char *out, unsigned long *outlen);614int der_encode_raw_bit_string(const unsigned char *in, unsigned long inlen,615unsigned char *out, unsigned long *outlen);616int der_decode_raw_bit_string(const unsigned char *in, unsigned long inlen,617unsigned char *out, unsigned long *outlen);618int der_length_bit_string(unsigned long nbits, unsigned long *outlen);619620/* OCTET STRING */621int der_encode_octet_string(const unsigned char *in, unsigned long inlen,622unsigned char *out, unsigned long *outlen);623int der_decode_octet_string(const unsigned char *in, unsigned long inlen,624unsigned char *out, unsigned long *outlen);625int der_length_octet_string(unsigned long noctets, unsigned long *outlen);626627/* OBJECT IDENTIFIER */628int der_encode_object_identifier(unsigned long *words, unsigned long nwords,629unsigned char *out, unsigned long *outlen);630int der_decode_object_identifier(const unsigned char *in, unsigned long inlen,631unsigned long *words, unsigned long *outlen);632int der_length_object_identifier(unsigned long *words, unsigned long nwords, unsigned long *outlen);633unsigned long der_object_identifier_bits(unsigned long x);634635/* IA5 STRING */636int der_encode_ia5_string(const unsigned char *in, unsigned long inlen,637unsigned char *out, unsigned long *outlen);638int der_decode_ia5_string(const unsigned char *in, unsigned long inlen,639unsigned char *out, unsigned long *outlen);640int der_length_ia5_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen);641642int der_ia5_char_encode(int c);643int der_ia5_value_decode(int v);644645/* TELETEX STRING */646int der_decode_teletex_string(const unsigned char *in, unsigned long inlen,647unsigned char *out, unsigned long *outlen);648int der_length_teletex_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen);649650#ifdef LTC_SOURCE651/* internal helper functions */652int der_teletex_char_encode(int c);653int der_teletex_value_decode(int v);654#endif /* LTC_SOURCE */655656657/* PRINTABLE STRING */658int der_encode_printable_string(const unsigned char *in, unsigned long inlen,659unsigned char *out, unsigned long *outlen);660int der_decode_printable_string(const unsigned char *in, unsigned long inlen,661unsigned char *out, unsigned long *outlen);662int der_length_printable_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen);663664int der_printable_char_encode(int c);665int der_printable_value_decode(int v);666667/* UTF-8 */668#if (defined(SIZE_MAX) || __STDC_VERSION__ >= 199901L || defined(WCHAR_MAX) || defined(__WCHAR_MAX__) || defined(_WCHAR_T) || defined(_WCHAR_T_DEFINED) || defined (__WCHAR_TYPE__)) && !defined(LTC_NO_WCHAR)669#if defined(__WCHAR_MAX__)670#define LTC_WCHAR_MAX __WCHAR_MAX__671#else672#include <wchar.h>673#define LTC_WCHAR_MAX WCHAR_MAX674#endif675/* please note that it might happen that LTC_WCHAR_MAX is undefined */676#else677typedef ulong32 wchar_t;678#define LTC_WCHAR_MAX 0xFFFFFFFF679#endif680681int der_encode_utf8_string(const wchar_t *in, unsigned long inlen,682unsigned char *out, unsigned long *outlen);683684int der_decode_utf8_string(const unsigned char *in, unsigned long inlen,685wchar_t *out, unsigned long *outlen);686unsigned long der_utf8_charsize(const wchar_t c);687#ifdef LTC_SOURCE688/* internal helper functions */689int der_utf8_valid_char(const wchar_t c);690#endif /* LTC_SOURCE */691int der_length_utf8_string(const wchar_t *in, unsigned long noctets, unsigned long *outlen);692693694/* CHOICE */695int der_decode_choice(const unsigned char *in, unsigned long *inlen,696ltc_asn1_list *list, unsigned long outlen);697698/* UTCTime */699typedef struct {700unsigned YY, /* year */701MM, /* month */702DD, /* day */703hh, /* hour */704mm, /* minute */705ss, /* second */706off_dir, /* timezone offset direction 0 == +, 1 == - */707off_hh, /* timezone offset hours */708off_mm; /* timezone offset minutes */709} ltc_utctime;710711int der_encode_utctime(ltc_utctime *utctime,712unsigned char *out, unsigned long *outlen);713714int der_decode_utctime(const unsigned char *in, unsigned long *inlen,715ltc_utctime *out);716717int der_length_utctime(ltc_utctime *utctime, unsigned long *outlen);718719/* GeneralizedTime */720typedef struct {721unsigned YYYY, /* year */722MM, /* month */723DD, /* day */724hh, /* hour */725mm, /* minute */726ss, /* second */727fs, /* fractional seconds */728off_dir, /* timezone offset direction 0 == +, 1 == - */729off_hh, /* timezone offset hours */730off_mm; /* timezone offset minutes */731} ltc_generalizedtime;732733int der_encode_generalizedtime(ltc_generalizedtime *gtime,734unsigned char *out, unsigned long *outlen);735736int der_decode_generalizedtime(const unsigned char *in, unsigned long *inlen,737ltc_generalizedtime *out);738739int der_length_generalizedtime(ltc_generalizedtime *gtime, unsigned long *outlen);740741742#endif743744745