/* This file is part of GNUnet. (C) 2009 Christian Grothoff (and other contributing authors) GNUnet 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 3, or (at your option) any later version. GNUnet 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. You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /** * @file namestore/namestore.h * @brief common internal definitions for namestore service * @author Matthias Wachs */ #ifndef NAMESTORE_H #define NAMESTORE_H /** * Maximum length of any name, including 0-termination. */ #define MAX_NAME_LEN 256 /** * Convert a UTF-8 string to UTF-8 lowercase * @param src source string * @return converted result */ char * GNUNET_NAMESTORE_normalize_string (const char *src); /** * Convert a short hash to a string (for printing debug messages). * This is one of the very few calls in the entire API that is * NOT reentrant! * * @param hc the short hash code * @return string form; will be overwritten by next call to GNUNET_h2s. */ const char * GNUNET_short_h2s (const struct GNUNET_CRYPTO_ShortHashCode * hc); /** * Sign name and records * * @param key the private key * @param expire block expiration * @param name the name * @param rd record data * @param rd_count number of records * * @return the signature */ struct GNUNET_CRYPTO_RsaSignature * GNUNET_NAMESTORE_create_signature (const struct GNUNET_CRYPTO_RsaPrivateKey *key, struct GNUNET_TIME_Absolute expire, const char *name, const struct GNUNET_NAMESTORE_RecordData *rd, unsigned int rd_count); /** * Compares if two records are equal * * @param a Record a * @param b Record b * * @return GNUNET_YES or GNUNET_NO */ int GNUNET_NAMESTORE_records_cmp (const struct GNUNET_NAMESTORE_RecordData *a, const struct GNUNET_NAMESTORE_RecordData *b); GNUNET_NETWORK_STRUCT_BEGIN /** * A GNS record serialized for network transmission. * * Layout is [struct GNUNET_NAMESTORE_NetworkRecord][char[data_size] data] */ struct GNUNET_NAMESTORE_NetworkRecord { /** * Expiration time for the DNS record. */ struct GNUNET_TIME_AbsoluteNBO expiration; /** * Number of bytes in 'data'. */ uint32_t data_size; /** * Type of the GNS/DNS record. */ uint32_t record_type; /** * Flags for the record. */ uint32_t flags; }; /** * Connect to namestore service. FIXME: UNNECESSARY. */ struct StartMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_START */ struct GNUNET_MessageHeader header; }; /** * Generic namestore message with op id */ struct GNUNET_NAMESTORE_Header { /** * header.type will be GNUNET_MESSAGE_TYPE_NAMESTORE_* * header.size will be message size */ struct GNUNET_MessageHeader header; /** * Request ID in NBO */ uint32_t r_id; }; /** * Lookup a name in the namestore */ struct LookupNameMessage { struct GNUNET_NAMESTORE_Header gns_header; /** * The zone */ struct GNUNET_CRYPTO_ShortHashCode zone; /** * Requested record type */ uint32_t record_type; /** * Length of the name */ uint32_t name_len; /* 0-terminated name here */ }; /** * Lookup response */ struct LookupNameResponseMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_LOOKUP_NAME_RESPONSE */ struct GNUNET_NAMESTORE_Header gns_header; /** * Expiration time */ struct GNUNET_TIME_AbsoluteNBO expire; /** * Name length */ uint16_t name_len; /** * Bytes of serialized record data */ uint16_t rd_len; /** * Number of records contained */ uint16_t rd_count; /** * Is the signature valid * GNUNET_YES or GNUNET_NO */ int16_t contains_sig; /** * All zeros if 'contains_sig' is GNUNET_NO. */ struct GNUNET_CRYPTO_RsaSignature signature; /** * The public key for the name */ struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded public_key; /* 0-terminated name and serialized record data */ /* rd_len bytes serialized record data */ }; /** * Put a record to the namestore */ struct RecordPutMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_LOOKUP_RECORD_PUT */ struct GNUNET_NAMESTORE_Header gns_header; /** * Expiration time */ struct GNUNET_TIME_AbsoluteNBO expire; /** * Name length */ uint16_t name_len; /** * Length of serialized record data */ uint16_t rd_len; /** * Number of records contained */ uint16_t rd_count; /** * always zero (for alignment) */ uint16_t reserved; /** * The signature */ struct GNUNET_CRYPTO_RsaSignature signature; /** * The public key */ struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded public_key; /* name (0-terminated) followed by "rd_count" serialized records */ }; /** * Put a record to the namestore response */ struct RecordPutResponseMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_PUT_RESPONSE */ struct GNUNET_NAMESTORE_Header gns_header; /** * result: * GNUNET_SYSERR on failure * GNUNET_OK on success */ int32_t op_result; }; /** * Create a record and put it to the namestore * Memory layout: */ struct RecordCreateMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_CREATE */ struct GNUNET_NAMESTORE_Header gns_header; struct GNUNET_TIME_AbsoluteNBO expire; /** * Name length */ uint16_t name_len; /** * Length of serialized record data */ uint16_t rd_len; /** * Record count */ uint16_t rd_count; /** * private key length */ uint16_t pkey_len; /* followed by: * GNUNET_CRYPTO_RsaPrivateKeyBinaryEncoded private key with length pkey_len * name with length name_len * serialized record data with length rd_len * */ }; /** * Create a record to the namestore response */ struct RecordCreateResponseMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_CREATE_RESPONSE */ struct GNUNET_NAMESTORE_Header gns_header; /** * name length: GNUNET_NO already exists, GNUNET_YES on success, GNUNET_SYSERR error */ int32_t op_result; }; /** * Remove a record from the namestore * Memory layout: */ struct RecordRemoveMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_REMOVE */ struct GNUNET_NAMESTORE_Header gns_header; /** * Name length */ uint16_t name_len; /** * Length of serialized rd data */ uint16_t rd_len; /** * Number of records contained */ uint16_t rd_count; /** * Length of private key */ uint16_t pkey_len; /* followed by: * GNUNET_CRYPTO_RsaPrivateKeyBinaryEncoded private key with length pkey_len * name with length name_len * serialized record data with length rd_len * */ }; /** * Removal of the record succeeded. */ #define RECORD_REMOVE_RESULT_SUCCESS 0 /** * There are NO records for the given name. */ #define RECORD_REMOVE_RESULT_NO_RECORDS 1 /** * The specific record that was to be removed was * not found. */ #define RECORD_REMOVE_RESULT_RECORD_NOT_FOUND 2 /** * Internal error, failed to sign the remaining records. * (Note: not used?) */ #define RECORD_REMOVE_RESULT_FAILED_TO_SIGN 3 /** * Internal error, failed to store the updated record set */ #define RECORD_REMOVE_RESULT_FAILED_TO_PUT_UPDATE 4 /** * Internal error, failed to remove records from database */ #define RECORD_REMOVE_RESULT_FAILED_TO_REMOVE 5 /** * Internal error, failed to access database */ #define RECORD_REMOVE_RESULT_FAILED_ACCESS_DATABASE 6 /** * Internal error, failed to access database */ #define RECORD_REMOVE_RESULT_FAILED_INTERNAL_ERROR 7 /** * Remove a record from the namestore response */ struct RecordRemoveResponseMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_REMOVE_RESPONSE */ struct GNUNET_NAMESTORE_Header gns_header; /** * Result code (see RECORD_REMOVE_RESULT_*). In network byte order. */ int32_t op_result; }; /** * Lookup a name for a zone hash */ struct ZoneToNameMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME */ struct GNUNET_NAMESTORE_Header gns_header; /** * The hash of public key of the zone to look up in */ struct GNUNET_CRYPTO_ShortHashCode zone; /** * The hash of the public key of the target zone */ struct GNUNET_CRYPTO_ShortHashCode value_zone; }; /** * Respone for zone to name lookup */ struct ZoneToNameResponseMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME_RESPONSE */ struct GNUNET_NAMESTORE_Header gns_header; /** * Record block expiration */ struct GNUNET_TIME_AbsoluteNBO expire; /** * Length of the name */ uint16_t name_len; /** * Length of serialized record data */ uint16_t rd_len; /** * Number of records contained */ uint16_t rd_count; /* result in NBO: GNUNET_OK on success, GNUNET_NO if there were no results, GNUNET_SYSERR on error */ int16_t res; /** * Signature */ struct GNUNET_CRYPTO_RsaSignature signature; /** * Publik key */ struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded zone_key; }; /** * Start a zone iteration for the given zone */ struct ZoneIterationStartMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_START */ struct GNUNET_NAMESTORE_Header gns_header; /** * Zone hash */ struct GNUNET_CRYPTO_ShortHashCode zone; /** * Which flags must be included */ uint16_t must_have_flags; /** * Which flags must not be included */ uint16_t must_not_have_flags; }; /** * Ask for next result of zone iteration for the given operation */ struct ZoneIterationNextMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_NEXT */ struct GNUNET_NAMESTORE_Header gns_header; }; /** * Stop zone iteration for the given operation */ struct ZoneIterationStopMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_STOP */ struct GNUNET_NAMESTORE_Header gns_header; }; /** * Next result of zone iteration for the given operation * // FIXME: use 'struct LookupResponseMessage' instead? (identical except * for having 'contains_sig' instead of 'reserved', but fully compatible otherwise). */ struct ZoneIterationResponseMessage { /** * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_RESPONSE */ struct GNUNET_NAMESTORE_Header gns_header; struct GNUNET_TIME_AbsoluteNBO expire; uint16_t name_len; /* Record data length */ uint16_t rd_len; /** * Number of records contained */ uint16_t rd_count; /** * always zero (for alignment) */ uint16_t reserved; /** * All zeros if 'contains_sig' is GNUNET_NO. */ struct GNUNET_CRYPTO_RsaSignature signature; /** * The public key */ struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded public_key; }; GNUNET_NETWORK_STRUCT_END /* end of namestore.h */ #endif