/*
- silcpkcs.h
+ silcpkcs.h
- Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+ Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 1997 - 2001 Pekka Riikonen
+ Copyright (C) 1997 - 2002 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
+ the Free Software Foundation; version 2 of the License.
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#ifndef SILCPKCS_H
#define SILCPKCS_H
+/****h* silccrypt/SILC PKCS Interface
+ *
+ * DESCRIPTION
+ *
+ * This is the interface for public key cryptosystems, and various
+ * utility functions related to public keys and private keys. This
+ * interface also defines the actual PKCS objects, public keys and
+ * private keys. The interface is generic PKCS interface, which has
+ * capability of supporting any kind of public key algorithm. This
+ * interface also implements the SILC Public Key and routines for
+ * encoding and decoding SILC Public Key (as defined by the SILC
+ * protocol specification). Interface or encrypting, decrypting,
+ * producing digital signatures and verifying digital signatures are
+ * also defined in this header.
+ *
+ ***/
+
+/****s* silccrypt/SilcPKCSAPI/SilcPKCS
+ *
+ * NAME
+ *
+ * typedef struct SilcPKCSStruct *SilcPKCS;
+ *
+ * DESCRIPTION
+ *
+ * This context is the actual PKCS context and is allocated
+ * by silc_pkcs_alloc and given as argument usually to all
+ * silc_pkcs _* functions. It is freed by the silc_pkcs_free
+ * function.
+ *
+ ***/
+typedef struct SilcPKCSStruct *SilcPKCS;
+
/* The default SILC PKCS (Public Key Cryptosystem) object to represent
any PKCS in SILC. */
typedef struct SilcPKCSObjectStruct {
unsigned char *(*get_public_key)(void *, SilcUInt32 *);
unsigned char *(*get_private_key)(void *, SilcUInt32 *);
SilcUInt32 (*set_public_key)(void *, unsigned char *, SilcUInt32);
- int (*set_private_key)(void *, unsigned char *, SilcUInt32);
+ SilcUInt32 (*set_private_key)(void *, unsigned char *, SilcUInt32);
SilcUInt32 (*context_len)();
int (*encrypt)(void *, unsigned char *, SilcUInt32,
unsigned char *, SilcUInt32 *);
unsigned char *, SilcUInt32);
} SilcPKCSObject;
-/* The main SILC PKCS structure. Use SilcPKCS instead of SilcPKCSStruct.
- Also remember that SilcPKCS is a pointer. */
-typedef struct SilcPKCSStruct {
- void *context;
- SilcPKCSObject *pkcs;
- SilcUInt32 key_len;
-
- SilcUInt32 (*get_key_len)(struct SilcPKCSStruct *);
-} *SilcPKCS;
-
-/* SILC style public key object. Public key is read from file to this
- object. Public keys received from network must be in this format as
- well. */
+/****s* silccrypt/SilcPKCSAPI/SilcPublicKey
+ *
+ * NAME
+ *
+ * typedef struct { ... } *SilcPublicKey;
+ *
+ * DESCRIPTION
+ *
+ * SILC style public key object. Public key is read from file to this
+ * object. Public keys received from network must be in this format as
+ * well. The format is defined by the SILC protocol specification.
+ * This object is allocated by silc_pkcs_public_key_alloc and freed
+ * by silc_pkcs_public_key_free. The object is given as argument to
+ * all silc_pkcs_public_key_* functions.
+ *
+ * SOURCE
+ */
typedef struct {
+ SilcUInt16 pk_type; /* Public key type (SilcSKEPKType) */
SilcUInt32 len;
char *name;
char *identifier;
unsigned char *pk;
SilcUInt32 pk_len;
} *SilcPublicKey;
+/***/
-/* SILC style private key object. Private key is read from file to this
- object. */
-typedef struct {
- char *name;
- unsigned char *prv;
- SilcUInt32 prv_len;
-} *SilcPrivateKey;
-
-/* Decoded SILC Public Key identifier. Note that some of the fields
- may be NULL. */
+/****s* silccrypt/SilcPKCSAPI/SilcPublicKeyIdentifier
+ *
+ * NAME
+ *
+ * typedef struct { ... } *SilcPublicKeyIdentifier;
+ *
+ * DESCRIPTION
+ *
+ * Decoded SILC Public Key identifier. Note that some of the fields
+ * may be NULL. This context is allcated by the function
+ * silc_pkcs_decode_identifier and freed by silc_pkcs_free_identifier.
+ * The identifier in SilcPublicKey is the 'identifier' field, which
+ * can be given as argument to silc_pkcs_decode_identifier.
+ *
+ * SOURCE
+ */
typedef struct {
char *username;
char *host;
char *org;
char *country;
} *SilcPublicKeyIdentifier;
+/***/
+
+/****s* silccrypt/SilcPKCSAPI/SilcPrivateKey
+ *
+ * NAME
+ *
+ * typedef struct { ... } *SilcPrivateKey;
+ *
+ * DESCRIPTION
+ *
+ * SILC style private key object. Public key is read from file to this
+ * object. This object is allocated by silc_pkcs_private_key_alloc and
+ * freed by silc_pkcs_private_key_free. The object is given as argument
+ * to all silc_pkcs_private_key_* functions.
+ *
+ ***/
+typedef struct {
+ char *name;
+ unsigned char *prv;
+ SilcUInt32 prv_len;
+} *SilcPrivateKey;
/* Public and private key file headers */
#define SILC_PKCS_PUBLIC_KEYFILE_BEGIN "-----BEGIN SILC PUBLIC KEY-----\n"
SilcUInt32 *ret_len)
#define SILC_PKCS_API_SET_PUBLIC_KEY(pkcs) \
SilcUInt32 silc_##pkcs##_set_public_key(void *context, unsigned char *key_data, \
- SilcUInt32 key_len)
+ SilcUInt32 key_len)
#define SILC_PKCS_API_SET_PRIVATE_KEY(pkcs) \
-int silc_##pkcs##_set_private_key(void *context, unsigned char *key_data, \
- SilcUInt32 key_len)
+SilcUInt32 silc_##pkcs##_set_private_key(void *context, unsigned char *key_data, \
+ SilcUInt32 key_len)
#define SILC_PKCS_API_CONTEXT_LEN(pkcs) \
SilcUInt32 silc_##pkcs##_context_len()
#define SILC_PKCS_API_ENCRYPT(pkcs) \
SilcUInt32 data_len)
/* Prototypes */
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_register
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_register(const SilcPKCSObject *pkcs);
+ *
+ * DESCRIPTION
+ *
+ * Registers a new PKCS into the SILC. This function is used
+ * at the initialization of the SILC. All registered PKCSs
+ * should be unregistered with silc_pkcs_unregister. The `pkcs' includes
+ * the name of the PKCS and member functions for the algorithm. Usually
+ * this function is not called directly. Instead, application can call
+ * the silc_pkcs_register_default to register all PKCSs that are
+ * builtin the sources. Returns FALSE on error.
+ *
+ ***/
bool silc_pkcs_register(const SilcPKCSObject *pkcs);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_unregister
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_unregister(SilcPKCSObject *pkcs);
+ *
+ * DESCRIPTION
+ *
+ * Unregister a PKCS from the SILC. Returns FALSE on error.
+ *
+ ***/
bool silc_pkcs_unregister(SilcPKCSObject *pkcs);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_register_default
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_register_default(void);
+ *
+ * DESCRIPTION
+ *
+ * Registers all the default PKCS (all builtin PKCS). The application may
+ * use this to register the default PKCS if specific PKCS in any specific
+ * order is not wanted. Returns FALSE on error.
+ *
+ ***/
bool silc_pkcs_register_default(void);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_unregister_all
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_unregister_all(void);
+ *
+ * DESCRIPTION
+ *
+ * Returns FALSE on error.
+ *
+ ***/
+bool silc_pkcs_unregister_all(void);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_alloc
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_alloc(const unsigned char *name, SilcPKCS *new_pkcs);
+ *
+ * DESCRIPTION
+ *
+ * Allocates a new SilcPKCS object. The new allocated object is returned
+ * to the 'new_pkcs' argument. Returns FALSE on error.
+ *
+ ***/
bool silc_pkcs_alloc(const unsigned char *name, SilcPKCS *new_pkcs);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_free
+ *
+ * SYNOPSIS
+ *
+ * void silc_pkcs_free(SilcPKCS pkcs);
+ *
+ * DESCRIPTION
+ *
+ * Frees the PKCS object.
+ *
+ ***/
void silc_pkcs_free(SilcPKCS pkcs);
-int silc_pkcs_is_supported(const unsigned char *name);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_is_supported
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_is_supported(const unsigned char *name);
+ *
+ * DESCRIPTION
+ *
+ * Returns TRUE if PKCS algorithm `name' is supported.
+ *
+ ***/
+bool silc_pkcs_is_supported(const unsigned char *name);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_get_supported
+ *
+ * SYNOPSIS
+ *
+ * char *silc_pkcs_get_supported(void);
+ *
+ * DESCRIPTION
+ *
+ * Returns comma separated list of supported PKCS algorithms.
+ *
+ ***/
char *silc_pkcs_get_supported(void);
-int silc_pkcs_generate_key(SilcPKCS pkcs, SilcUInt32 bits_key_len,
- SilcRng rng);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_generate_key
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_generate_key(SilcPKCS pkcs, SilcUInt32 bits_key_len,
+ * SilcRng rng);
+ *
+ * DESCRIPTION
+ *
+ * Generate new key pair into the `pkcs' context. Returns FALSE on error.
+ *
+ ***/
+bool silc_pkcs_generate_key(SilcPKCS pkcs, SilcUInt32 bits_key_len,
+ SilcRng rng);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_get_key_len
+ *
+ * SYNOPSIS
+ *
+ * SilcUInt32 silc_pkcs_get_key_len(SilcPKCS self);
+ *
+ * DESCRIPTION
+ *
+ * Returns the length of the key.
+ *
+ ***/
SilcUInt32 silc_pkcs_get_key_len(SilcPKCS self);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_get_name
+ *
+ * SYNOPSIS
+ *
+ * const char *silc_pkcs_get_name(SilcPKCS pkcs);
+ *
+ * DESCRIPTION
+ *
+ * Returns PKCS name.
+ *
+ ***/
+const char *silc_pkcs_get_name(SilcPKCS pkcs);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_get_public_key
+ *
+ * SYNOPSIS
+ *
+ * unsigned char *silc_pkcs_get_public_key(SilcPKCS pkcs, SilcUInt32 *len);
+ *
+ * DESCRIPTION
+ *
+ * Returns SILC style public key. The caller must free the returned
+ * data.
+ *
+ ***/
unsigned char *silc_pkcs_get_public_key(SilcPKCS pkcs, SilcUInt32 *len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_get_private_key
+ *
+ * SYNOPSIS
+ *
+ * unsigned char *silc_pkcs_get_private_key(SilcPKCS pkcs,
+ * SilcUInt32 *len);
+ *
+ * DESCRIPTION
+ *
+ * Returns SILC style private key. The caller must free the returned
+ * data and SHOULD zero the memory area before freeing.
+ *
+ ***/
unsigned char *silc_pkcs_get_private_key(SilcPKCS pkcs, SilcUInt32 *len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_public_key_set
+ *
+ * SYNOPSIS
+ *
+ * SilcUInt32 silc_pkcs_public_key_set(SilcPKCS pkcs,
+ * SilcPublicKey public_key);
+ *
+ * DESCRIPTION
+ *
+ * Sets public key from SilcPublicKey. Returns the length of the key.
+ *
+ ***/
SilcUInt32 silc_pkcs_public_key_set(SilcPKCS pkcs, SilcPublicKey public_key);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_public_key_data_set
+ *
+ * SYNOPSIS
+ *
+ * SilcUInt32 silc_pkcs_public_key_data_set(SilcPKCS pkcs,
+ * unsigned char *pk,
+ * SilcUInt32 pk_len);
+ *
+ * DESCRIPTION
+ *
+ * Sets public key from data. Returns the length of the key.
+ *
+ ***/
SilcUInt32 silc_pkcs_public_key_data_set(SilcPKCS pkcs, unsigned char *pk,
- SilcUInt32 pk_len);
-int silc_pkcs_private_key_set(SilcPKCS pkcs, SilcPrivateKey private_key);
-int silc_pkcs_private_key_data_set(SilcPKCS pkcs, unsigned char *prv,
- SilcUInt32 prv_len);
-int silc_pkcs_encrypt(SilcPKCS pkcs, unsigned char *src, SilcUInt32 src_len,
- unsigned char *dst, SilcUInt32 *dst_len);
-int silc_pkcs_decrypt(SilcPKCS pkcs, unsigned char *src, SilcUInt32 src_len,
- unsigned char *dst, SilcUInt32 *dst_len);
-int silc_pkcs_sign(SilcPKCS pkcs, unsigned char *src, SilcUInt32 src_len,
- unsigned char *dst, SilcUInt32 *dst_len);
-int silc_pkcs_verify(SilcPKCS pkcs, unsigned char *signature,
- SilcUInt32 signature_len, unsigned char *data,
- SilcUInt32 data_len);
-int silc_pkcs_sign_with_hash(SilcPKCS pkcs, SilcHash hash,
- unsigned char *src, SilcUInt32 src_len,
- unsigned char *dst, SilcUInt32 *dst_len);
-int silc_pkcs_verify_with_hash(SilcPKCS pkcs, SilcHash hash,
- unsigned char *signature,
- SilcUInt32 signature_len,
- unsigned char *data,
- SilcUInt32 data_len);
+ SilcUInt32 pk_len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_private_key_set
+ *
+ * SYNOPSIS
+ *
+ * SilcUInt32 silc_pkcs_private_key_set(SilcPKCS pkcs,
+ * SilcPrivateKey private_key);
+ *
+ * DESCRIPTION
+ *
+ * Sets private key from SilcPrivateKey. Returns the length of the key.
+ *
+ ***/
+SilcUInt32 silc_pkcs_private_key_set(SilcPKCS pkcs, SilcPrivateKey private_key);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_private_key_data_set
+ *
+ * SYNOPSIS
+ *
+ * SilcUInt32 silc_pkcs_private_key_data_set(SilcPKCS pkcs,
+ * unsigned char *prv,
+ * SilcUInt32 prv_len);
+ *
+ * DESCRIPTION
+ *
+ * Sets private key from data. Returns the length of the key.
+ *
+ ***/
+SilcUInt32 silc_pkcs_private_key_data_set(SilcPKCS pkcs, unsigned char *prv,
+ SilcUInt32 prv_len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_encrypt
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_encrypt(SilcPKCS pkcs, unsigned char *src,
+ * SilcUInt32 src_len, unsigned char *dst,
+ * SilcUInt32 *dst_len);
+ *
+ * DESCRIPTION
+ *
+ * Encrypts. Returns FALSE on error.
+ *
+ ***/
+bool silc_pkcs_encrypt(SilcPKCS pkcs, unsigned char *src, SilcUInt32 src_len,
+ unsigned char *dst, SilcUInt32 *dst_len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_decrypt
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_decrypt(SilcPKCS pkcs, unsigned char *src,
+ * SilcUInt32 src_len, unsigned char *dst,
+ * SilcUInt32 *dst_len);
+ *
+ * DESCRIPTION
+ *
+ * Decrypts. Returns FALSE on error.
+ *
+ ***/
+bool silc_pkcs_decrypt(SilcPKCS pkcs, unsigned char *src, SilcUInt32 src_len,
+ unsigned char *dst, SilcUInt32 *dst_len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_sign
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_sign(SilcPKCS pkcs, unsigned char *src,
+ * SilcUInt32 src_len, unsigned char *dst,
+ * SilcUInt32 *dst_len);
+ *
+ * DESCRIPTION
+ *
+ * Generates signature. Returns FALSE on error.
+ *
+ ***/
+bool silc_pkcs_sign(SilcPKCS pkcs, unsigned char *src, SilcUInt32 src_len,
+ unsigned char *dst, SilcUInt32 *dst_len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_verify
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_verify(SilcPKCS pkcs, unsigned char *signature,
+ * SilcUInt32 signature_len, unsigned char *data,
+ * SilcUInt32 data_len);
+ *
+ * DESCRIPTION
+ *
+ * Verifies signature. Returns FALSE on error.
+ *
+ ***/
+bool silc_pkcs_verify(SilcPKCS pkcs, unsigned char *signature,
+ SilcUInt32 signature_len, unsigned char *data,
+ SilcUInt32 data_len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_sign_with_hash
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_sign_with_hash(SilcPKCS pkcs, SilcHash hash,
+ * unsigned char *src, SilcUInt32 src_len,
+ * unsigned char *dst, SilcUInt32 *dst_len);
+ *
+ * DESCRIPTION
+ *
+ * Generates signature with hash. The hash is signed. Returns FALSE on
+ * error.
+ *
+ ***/
+bool silc_pkcs_sign_with_hash(SilcPKCS pkcs, SilcHash hash,
+ unsigned char *src, SilcUInt32 src_len,
+ unsigned char *dst, SilcUInt32 *dst_len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_verify_with_hash
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_verify_with_hash(SilcPKCS pkcs, SilcHash hash,
+ * unsigned char *signature,
+ * SilcUInt32 signature_len,
+ * unsigned char *data,
+ * SilcUInt32 data_len);
+ *
+ * DESCRIPTION
+ *
+ * Verifies signature with hash. The `data' is hashed and verified against
+ * the `signature'. Returns FALSE on error.
+ *
+ ***/
+bool silc_pkcs_verify_with_hash(SilcPKCS pkcs, SilcHash hash,
+ unsigned char *signature,
+ SilcUInt32 signature_len,
+ unsigned char *data,
+ SilcUInt32 data_len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_encode_identifier
+ *
+ * SYNOPSIS
+ *
+ * char *silc_pkcs_encode_identifier(char *username, char *host,
+ * char *realname, char *email,
+ * char *org, char *country);
+ *
+ * DESCRIPTION
+ *
+ * Encodes and returns SILC public key identifier. If some of the
+ * arguments is NULL those are not encoded into the identifier string.
+ * Protocol says that at least username and host must be provided.
+ *
+ ***/
char *silc_pkcs_encode_identifier(char *username, char *host, char *realname,
char *email, char *org, char *country);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_decode_identifier
+ *
+ * SYNOPSIS
+ *
+ * SilcPublicKeyIdentifier silc_pkcs_decode_identifier(char *identifier);
+ *
+ * DESCRIPTION
+ *
+ * Decodes the provided `identifier' and returns allocated context for
+ * the identifier.
+ *
+ ***/
SilcPublicKeyIdentifier silc_pkcs_decode_identifier(char *identifier);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_free_identifier
+ *
+ * SYNOPSIS
+ *
+ * void silc_pkcs_free_identifier(SilcPublicKeyIdentifier identifier);
+ *
+ * DESCRIPTION
+ *
+ * Frees decoded public key identifier context. Call this to free the
+ * context returned by the silc_pkcs_decode_identifier.
+ *
+ ***/
void silc_pkcs_free_identifier(SilcPublicKeyIdentifier identifier);
-SilcPublicKey silc_pkcs_public_key_alloc(char *name, char *identifier,
- unsigned char *pk,
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_public_key_alloc
+ *
+ * SYNOPSIS
+ *
+ * SilcPublicKey silc_pkcs_public_key_alloc(const char *name,
+ * const char *identifier,
+ * const unsigned char *pk,
+ * SilcUInt32 pk_len);
+ *
+ * DESCRIPTION
+ *
+ * Allocates SILC style public key formed from sent arguments. All data
+ * is duplicated.
+ *
+ ***/
+SilcPublicKey silc_pkcs_public_key_alloc(const char *name,
+ const char *identifier,
+ const unsigned char *pk,
SilcUInt32 pk_len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_public_key_free
+ *
+ * SYNOPSIS
+ *
+ * void silc_pkcs_public_key_free(SilcPublicKey public_key);
+ *
+ * DESCRIPTION
+ *
+ * Frees public key.
+ *
+ ***/
void silc_pkcs_public_key_free(SilcPublicKey public_key);
-SilcPrivateKey silc_pkcs_private_key_alloc(char *name, unsigned char *prv,
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_private_key_alloc
+ *
+ * SYNOPSIS
+ *
+ * SilcPrivateKey silc_pkcs_private_key_alloc(const char *name,
+ * const unsigned char *prv,
+ * SilcUInt32 prv_len);
+ *
+ * DESCRIPTION
+ *
+ * Allocates SILC private key formed from sent arguments. All data is
+ * duplicated.
+ *
+ ***/
+SilcPrivateKey silc_pkcs_private_key_alloc(const char *name,
+ const unsigned char *prv,
SilcUInt32 prv_len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_private_key_free
+ *
+ * SYNOPSIS
+ *
+ * void silc_pkcs_private_key_free(SilcPrivateKey private_key);
+ *
+ * DESCRIPTION
+ *
+ * Frees private key.
+ *
+ ***/
void silc_pkcs_private_key_free(SilcPrivateKey private_key);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_public_key_encode
+ *
+ * SYNOPSIS
+ *
+ * unsigned char *
+ * silc_pkcs_public_key_encode(SilcPublicKey public_key, SilcUInt32 *len);
+ *
+ * DESCRIPTION
+ *
+ * Encodes SILC style public key from SilcPublicKey. Returns the encoded
+ * data.
+ *
+ ***/
unsigned char *
silc_pkcs_public_key_encode(SilcPublicKey public_key, SilcUInt32 *len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_public_key_data_encode
+ *
+ * SYNOPSIS
+ *
+ * unsigned char *
+ * silc_pkcs_public_key_data_encode(unsigned char *pk, SilcUInt32 pk_len,
+ * char *pkcs, char *identifier,
+ * SilcUInt32 *len);
+ *
+ * DESCRIPTION
+ *
+ * Encodes SILC style public key. Returns the encoded data.
+ *
+ ***/
unsigned char *
silc_pkcs_public_key_data_encode(unsigned char *pk, SilcUInt32 pk_len,
- char *pkcs, char *identifier,
+ char *pkcs, char *identifier,
SilcUInt32 *len);
-int silc_pkcs_public_key_decode(unsigned char *data, SilcUInt32 data_len,
- SilcPublicKey *public_key);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_public_key_decode
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_public_key_decode(unsigned char *data,
+ * SilcUInt32 data_len,
+ * SilcPublicKey *public_key);
+ *
+ * DESCRIPTION
+ *
+ * Decodes SILC style public key. Returns TRUE if the decoding was
+ * successful. Allocates new public key as well.
+ *
+ ***/
+bool silc_pkcs_public_key_decode(unsigned char *data, SilcUInt32 data_len,
+ SilcPublicKey *public_key);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_public_key_decode
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_public_key_payload_encode(SilcPublicKey public_key);
+ *
+ * DESCRIPTION
+ *
+ * Encodes the Public Key Payload from the public key indicated by
+ * `public_key' of type of `pk_type'. The type is SilcSKEPKType.
+ * Returns the encoded payload buffer.
+ *
+ ***/
+SilcBuffer silc_pkcs_public_key_payload_encode(SilcPublicKey public_key);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_public_key_decode
+ *
+ * SYNOPSIS
+ *
+ * bool
+ * silc_pkcs_public_key_payload_decode(unsigned char *data,
+ * SilcUInt32 data_len,
+ * SilcPublicKey *public_key);
+ *
+ * DESCRIPTION
+ *
+ * Decodes Public Key Payload from `data' of `data_len' bytes in length
+ * data buffer into `public_key' pointer. Returns FALSE if the payload
+ * cannot be decoded.
+ *
+ ***/
+bool silc_pkcs_public_key_payload_decode(unsigned char *data,
+ SilcUInt32 data_len,
+ SilcPublicKey *public_key);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_public_key_compare
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_public_key_compare(SilcPublicKey key1,
+ * SilcPublicKey key2);
+ *
+ * DESCRIPTION
+ *
+ * Compares two public keys and returns TRUE if they are same key, and
+ * FALSE if they are not same.
+ *
+ ***/
bool silc_pkcs_public_key_compare(SilcPublicKey key1, SilcPublicKey key2);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_public_key_copy
+ *
+ * SYNOPSIS
+ *
+ * SilcPublicKey silc_pkcs_public_key_copy(SilcPublicKey public_key);
+ *
+ * DESCRIPTION
+ *
+ * Copies the public key indicated by `public_key' and returns new allocated
+ * public key which is indentical to the `public_key'.
+ *
+ ***/
+SilcPublicKey silc_pkcs_public_key_copy(SilcPublicKey public_key);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_private_key_encode
+ *
+ * SYNOPSIS
+ *
+ * unsigned char *
+ * silc_pkcs_private_key_encode(SilcPrivateKey private_key,
+ * SilcUInt32 *len);
+ *
+ * DESCRIPTION
+ *
+ * Encodes SILC private key from SilcPrivateKey. Returns the encoded data.
+ *
+ ***/
unsigned char *
silc_pkcs_private_key_encode(SilcPrivateKey private_key, SilcUInt32 *len);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_private_key_data_encode
+ *
+ * SYNOPSIS
+ *
+ * unsigned char *
+ * silc_pkcs_private_key_data_encode(unsigned char *prv, SilcUInt32 prv_len,
+ * char *pkcs, SilcUInt32 *len);
+ *
+ * DESCRIPTION
+ *
+ * Encodes SILC private key. Returns the encoded data.
+ *
+ ***/
unsigned char *
silc_pkcs_private_key_data_encode(unsigned char *prv, SilcUInt32 prv_len,
char *pkcs, SilcUInt32 *len);
-int silc_pkcs_private_key_decode(unsigned char *data, SilcUInt32 data_len,
- SilcPrivateKey *private_key);
-int silc_pkcs_save_public_key(char *filename, SilcPublicKey public_key,
- SilcUInt32 encoding);
-int silc_pkcs_save_public_key_data(char *filename, unsigned char *data,
- SilcUInt32 data_len,
- SilcUInt32 encoding);
-int silc_pkcs_save_private_key(char *filename, SilcPrivateKey private_key,
- unsigned char *passphrase,
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_private_key_decode
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_private_key_decode(unsigned char *data,
+ * SilcUInt32 data_len,
+ * SilcPrivateKey *private_key);
+ *
+ * DESCRIPTION
+ *
+ * Decodes SILC style private key. Returns TRUE if the decoding was
+ * successful. Allocates new private key as well.
+ *
+ ***/
+bool silc_pkcs_private_key_decode(unsigned char *data, SilcUInt32 data_len,
+ SilcPrivateKey *private_key);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_save_public_key
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_save_public_key(char *filename, SilcPublicKey public_key,
+ * SilcUInt32 encoding);
+ *
+ * DESCRIPTION
+ *
+ * Saves public key into file. Returns FALSE on error.
+ *
+ ***/
+bool silc_pkcs_save_public_key(char *filename, SilcPublicKey public_key,
SilcUInt32 encoding);
-int silc_pkcs_save_private_key_data(char *filename, unsigned char *data,
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_save_public_key_data
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_save_public_key_data(char *filename, unsigned char *data,
+ * SilcUInt32 data_len,
+ * SilcUInt32 encoding);
+ *
+ * DESCRIPTION
+ *
+ * Saves public key into file. The public key is already encoded as
+ * data when calling this function. Returns FALSE on error.
+ *
+ ***/
+bool silc_pkcs_save_public_key_data(char *filename, unsigned char *data,
SilcUInt32 data_len,
- unsigned char *passphrase,
SilcUInt32 encoding);
-int silc_pkcs_load_public_key(char *filename, SilcPublicKey *public_key,
- SilcUInt32 encoding);
-int silc_pkcs_load_private_key(char *filename, SilcPrivateKey *private_key,
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_save_private_key
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_save_private_key(char *filename,
+ * SilcPrivateKey private_key,
+ * unsigned char *passphrase,
+ * SilcUInt32 passphrase_len,
+ * SilcUInt32 encoding);
+ *
+ * DESCRIPTION
+ *
+ * Saves private key into file. The private key is encrypted into
+ * the file with the `passphrase' as a key. The encryption algorithm
+ * is AES with 256 bit key in CBC mode. Returns FALSE on error.
+ *
+ ***/
+bool silc_pkcs_save_private_key(char *filename, SilcPrivateKey private_key,
+ unsigned char *passphrase,
+ SilcUInt32 passphrase_len,
+ SilcUInt32 encoding);
+
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_load_public_key
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_load_public_key(char *filename, SilcPublicKey *public_key,
+ * SilcUInt32 encoding);
+ *
+ * DESCRIPTION
+ *
+ * Loads public key from file and allocates new public key. Returns TRUE
+ * if loading was successful.
+ *
+ ***/
+bool silc_pkcs_load_public_key(char *filename, SilcPublicKey *public_key,
SilcUInt32 encoding);
-#endif
+/****f* silccrypt/SilcPKCSAPI/silc_pkcs_load_private_key
+ *
+ * SYNOPSIS
+ *
+ * bool silc_pkcs_load_private_key(char *filename,
+ * SilcPrivateKey *private_key,
+ * unsigned char *passphrase,
+ * SilcUInt32 passphrase_len,
+ * SilcUInt32 encoding);
+ *
+ * DESCRIPTION
+ *
+ * Load private key from file and allocates new private key. Returns TRUE
+ * if loading was successful. The `passphrase' is used as decryption
+ * key of the private key file.
+ *
+ ***/
+bool silc_pkcs_load_private_key(char *filename, SilcPrivateKey *private_key,
+ unsigned char *passphrase,
+ SilcUInt32 passphrase_len,
+ SilcUInt32 encoding);
+
+#endif /* SILCPKCS_H */