+++ /dev/null
-/*
-
- silcpubkey.c
-
- Author: Pekka Riikonen <priikone@silcnet.org>
-
- Copyright (C) 2005 - 2007 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; 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
- GNU General Public License for more details.
-
-*/
-
-#include "silc.h"
-
-/* Encodes Public Key Payload for transmitting public keys and certificates. */
-
-SilcBuffer silc_public_key_payload_encode(SilcStack stack,
- SilcPublicKey public_key)
-{
- SilcBuffer buffer;
- unsigned char *pk;
- SilcUInt32 pk_len;
- SilcPKCSType type;
-
- if (!public_key)
- return NULL;
-
- type = silc_pkcs_get_type(public_key);
- pk = silc_pkcs_public_key_encode(stack, public_key, &pk_len);
- if (!pk)
- return NULL;
-
- buffer = silc_buffer_salloc_size(stack, 4 + pk_len);
- if (!buffer) {
- silc_sfree(stack, pk);
- return NULL;
- }
-
- if (silc_buffer_sformat(stack, buffer,
- SILC_STR_UI_SHORT(pk_len),
- SILC_STR_UI_SHORT(type),
- SILC_STR_DATA(pk, pk_len),
- SILC_STR_END) < 0) {
- silc_buffer_sfree(stack, buffer);
- silc_sfree(stack, pk);
- return NULL;
- }
-
- silc_sfree(stack, pk);
- return buffer;
-}
-
-/* Decodes public key payload and returns allocated public key */
-
-SilcBool silc_public_key_payload_decode(unsigned char *data,
- SilcUInt32 data_len,
- SilcPublicKey *public_key)
-{
- SilcBufferStruct buf;
- SilcUInt16 pk_len, pk_type;
- unsigned char *pk;
- int ret;
-
- if (!public_key)
- return FALSE;
-
- silc_buffer_set(&buf, data, data_len);
- ret = silc_buffer_unformat(&buf,
- SILC_STR_ADVANCE,
- SILC_STR_UI_SHORT(&pk_len),
- SILC_STR_UI_SHORT(&pk_type),
- SILC_STR_END);
- if (ret < 0 || pk_len > data_len - 4)
- return FALSE;
-
- if (pk_type < SILC_PKCS_SILC || pk_type > SILC_PKCS_SPKI)
- return FALSE;
-
- ret = silc_buffer_unformat(&buf,
- SILC_STR_DATA(&pk, pk_len),
- SILC_STR_END);
- if (ret < 0)
- return FALSE;
-
- return silc_pkcs_public_key_alloc((SilcPKCSType)pk_type,
- pk, pk_len, public_key);
-}