#endif
#endif
+/**
+ * Maximum size of a value that can be stored in a GNS block.
+ */
+#define GNUNET_NAMESTORE_MAX_VALUE_SIZE (63 * 1024)
+
/**
* Record type indicating any record/'*'
#define GNUNET_GNSRECORD_TYPE_PHONE 65542
+/**
+ * Flags that can be set for a record.
+ */
+enum GNUNET_NAMESTORE_RecordFlags
+{
+
+ /**
+ * No special options.
+ */
+ GNUNET_NAMESTORE_RF_NONE = 0,
+
+ /**
+ * This is a private record of this peer and it should
+ * thus not be handed out to other peers.
+ */
+ GNUNET_NAMESTORE_RF_PRIVATE = 2,
+
+ /**
+ * This record was added automatically by the system
+ * and is pending user confimation.
+ */
+ GNUNET_NAMESTORE_RF_PENDING = 4,
+
+ /**
+ * This expiration time of the record is a relative
+ * time (not an absolute time).
+ */
+ GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION = 8,
+
+ /**
+ * This record should not be used unless all (other) records with an absolute
+ * expiration time have expired.
+ */
+ GNUNET_NAMESTORE_RF_SHADOW_RECORD = 16
+
+ /**
+ * When comparing flags for record equality for removal,
+ * which flags should must match (in addition to the type,
+ * name, expiration value and data of the record)? All flags
+ * that are not listed here will be ignored for this purpose.
+ * (for example, we don't expect that users will remember to
+ * pass the '--private' option when removing a record from
+ * the namestore, hence we don't require this particular option
+ * to match upon removal). See also
+ * #GNUNET_NAMESTORE_records_cmp.
+ */
+#define GNUNET_NAMESTORE_RF_RCMP_FLAGS (GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION)
+};
+
+
+/**
+ * A GNS record.
+ */
+struct GNUNET_NAMESTORE_RecordData
+{
+
+ /**
+ * Binary value stored in the DNS record. Note: "data" must never
+ * be individually 'malloc'ed, but instead always points into some
+ * existing data area.
+ */
+ const void *data;
+
+ /**
+ * Expiration time for the DNS record. Can be relative
+ * or absolute, depending on 'flags'. Measured in the same
+ * unit as GNUnet time (microseconds).
+ */
+ uint64_t expiration_time;
+
+ /**
+ * Number of bytes in 'data'.
+ */
+ size_t data_size;
+
+ /**
+ * Type of the GNS/DNS record.
+ */
+ uint32_t record_type;
+
+ /**
+ * Flags for the record.
+ */
+ enum GNUNET_NAMESTORE_RecordFlags flags;
+};
+
+
+
+GNUNET_NETWORK_STRUCT_BEGIN
+
+
+/**
+ * Information we have in an encrypted block with record data (i.e. in the DHT).
+ */
+struct GNUNET_NAMESTORE_Block
+{
+
+ /**
+ * Signature of the block.
+ */
+ struct GNUNET_CRYPTO_EcdsaSignature signature;
+
+ /**
+ * Derived key used for signing; hash of this is the query.
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey derived_key;
+
+ /**
+ * Number of bytes signed; also specifies the number of bytes
+ * of encrypted data that follow.
+ */
+ struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
+
+ /**
+ * Expiration time of the block.
+ */
+ struct GNUNET_TIME_AbsoluteNBO expiration_time;
+
+ /* followed by encrypted data */
+};
+
+GNUNET_NETWORK_STRUCT_END
+
+
+/**
+ * Process a records that were decrypted from a block.
+ *
+ * @param cls closure
+ * @param rd_count number of entries in @a rd array
+ * @param rd array of records with data to store
+ */
+typedef void (*GNUNET_NAMESTORE_RecordCallback) (void *cls,
+ unsigned int rd_count,
+ const struct GNUNET_NAMESTORE_RecordData *rd);
+
+
+
+/* ***************** API related to GNSRECORD plugins ************** */
/**
* Convert the binary value @a data of a record of
GNUNET_GNSRECORD_number_to_typename (uint32_t type);
+/* convenience APIs for serializing / deserializing GNS records */
+
+/**
+ * Calculate how many bytes we will need to serialize the given
+ * records.
+ *
+ * @param rd_count number of records in the @a rd array
+ * @param rd array of #GNUNET_NAMESTORE_RecordData with @a rd_count elements
+ * @return the required size to serialize
+ */
+size_t
+GNUNET_NAMESTORE_records_get_size (unsigned int rd_count,
+ const struct GNUNET_NAMESTORE_RecordData *rd);
+
+
+/**
+ * Serialize the given records to the given destination buffer.
+ *
+ * @param rd_count number of records in the @a rd array
+ * @param rd array of #GNUNET_NAMESTORE_RecordData with @a rd_count elements
+ * @param dest_size size of the destination array @a dst
+ * @param dest where to write the result
+ * @return the size of serialized records, -1 if records do not fit
+ */
+ssize_t
+GNUNET_NAMESTORE_records_serialize (unsigned int rd_count,
+ const struct GNUNET_NAMESTORE_RecordData *rd,
+ size_t dest_size,
+ char *dest);
+
+
+/**
+ * Deserialize the given records to the given destination.
+ *
+ * @param len size of the serialized record data
+ * @param src the serialized record data
+ * @param rd_count number of records in the @a dest array
+ * @param dest where to put the data
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+int
+GNUNET_NAMESTORE_records_deserialize (size_t len,
+ const char *src,
+ unsigned int rd_count,
+ struct GNUNET_NAMESTORE_RecordData *dest);
+
+
+/* ******* general APIs relating to blocks, records and labels ******** */
+
+
+
+/**
+ * Test if a given record is expired.
+ *
+ * @param rd record to test
+ * @return #GNUNET_YES if the record is expired,
+ * #GNUNET_NO if not
+ */
+int
+GNUNET_NAMESTORE_is_expired (const struct GNUNET_NAMESTORE_RecordData *rd);
+
+
+/**
+ * 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 zone to a string (for printing debug messages).
+ * This is one of the very few calls in the entire API that is
+ * NOT reentrant!
+ *
+ * @param z public key of a zone
+ * @return string form; will be overwritten by next call to #GNUNET_NAMESTORE_z2s.
+ */
+const char *
+GNUNET_NAMESTORE_z2s (const struct GNUNET_CRYPTO_EcdsaPublicKey *z);
+
+
+/**
+ * Convert public key to the respective absolute domain name in the
+ * ".zkey" pTLD.
+ * This is one of the very few calls in the entire API that is
+ * NOT reentrant!
+ *
+ * @param pkey a public key with a point on the eliptic curve
+ * @return string "X.zkey" where X is the coordinates of the public
+ * key in an encoding suitable for DNS labels.
+ */
+const char *
+GNUNET_NAMESTORE_pkey_to_zkey (const struct GNUNET_CRYPTO_EcdsaPublicKey *pkey);
+
+
+/**
+ * Convert an absolute domain name in the ".zkey" pTLD to the
+ * respective public key.
+ *
+ * @param zkey string "X.zkey" where X is the public
+ * key in an encoding suitable for DNS labels.
+ * @param pkey set to a public key on the eliptic curve
+ * @return #GNUNET_SYSERR if @a zkey has the wrong syntax
+ */
+int
+GNUNET_NAMESTORE_zkey_to_pkey (const char *zkey,
+ struct GNUNET_CRYPTO_EcdsaPublicKey *pkey);
+
+
+/**
+ * Calculate the DHT query for a given @a label in a given @a zone.
+ *
+ * @param zone private key of the zone
+ * @param label label of the record
+ * @param query hash to use for the query
+ */
+void
+GNUNET_NAMESTORE_query_from_private_key (const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const char *label,
+ struct GNUNET_HashCode *query);
+
+
+/**
+ * Calculate the DHT query for a given @a label in a given @a zone.
+ *
+ * @param pub public key of the zone
+ * @param label label of the record
+ * @param query hash to use for the query
+ */
+void
+GNUNET_NAMESTORE_query_from_public_key (const struct GNUNET_CRYPTO_EcdsaPublicKey *pub,
+ const char *label,
+ struct GNUNET_HashCode *query);
+
+
+/**
+ * Sign name and records
+ *
+ * @param key the private key
+ * @param expire block expiration
+ * @param label the name for the records
+ * @param rd record data
+ * @param rd_count number of records in @a rd
+ */
+struct GNUNET_NAMESTORE_Block *
+GNUNET_NAMESTORE_block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
+ struct GNUNET_TIME_Absolute expire,
+ const char *label,
+ const struct GNUNET_NAMESTORE_RecordData *rd,
+ unsigned int rd_count);
+
+
+/**
+ * Check if a signature is valid. This API is used by the GNS Block
+ * to validate signatures received from the network.
+ *
+ * @param block block to verify
+ * @return #GNUNET_OK if the signature is valid
+ */
+int
+GNUNET_NAMESTORE_block_verify (const struct GNUNET_NAMESTORE_Block *block);
+
+
+/**
+ * Decrypt block.
+ *
+ * @param block block to decrypt
+ * @param zone_key public key of the zone
+ * @param label the name for the records
+ * @param proc function to call with the result
+ * @param proc_cls closure for @a proc
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR if the block was
+ * not well-formed
+ */
+int
+GNUNET_NAMESTORE_block_decrypt (const struct GNUNET_NAMESTORE_Block *block,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *zone_key,
+ const char *label,
+ GNUNET_NAMESTORE_RecordCallback proc,
+ void *proc_cls);
+
+
+/**
+ * Compares if two records are equal
+ *
+ * @param a a record
+ * @param b another record
+ * @return #GNUNET_YES if the records are equal, or #GNUNET_NO if not.
+ */
+int
+GNUNET_NAMESTORE_records_cmp (const struct GNUNET_NAMESTORE_RecordData *a,
+ const struct GNUNET_NAMESTORE_RecordData *b);
+
+
+/**
+ * Returns the expiration time of the given block of records. The block
+ * expiration time is the expiration time of the record with smallest
+ * expiration time.
+ *
+ * @param rd_count number of records given in @a rd
+ * @param rd array of records
+ * @return absolute expiration time
+ */
+struct GNUNET_TIME_Absolute
+GNUNET_NAMESTORE_record_get_expiration_time (unsigned int rd_count,
+ const struct GNUNET_NAMESTORE_RecordData *rd);
+
+
+
#if 0 /* keep Emacsens' auto-indent happy */
{
#endif