⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecrypt-sync.h

📁 最新的Salsa20 数据流同步加密算法实现的源代码。
💻 H
字号:
/* ecrypt-sync.h *//*  * Header file for synchronous stream ciphers without authentication * mechanism. *  * *** Please only edit parts marked with "[edit]". *** */#ifndef ECRYPT_SYNC_AE#define ECRYPT_SYNC_AE#include "ecrypt-portable.h"/* ------------------------------------------------------------------------- *//* Cipher parameters *//*  * The name of your cipher. */#define ECRYPT_NAME "Salsa20 stream cipher"    /* [edit] */ /* * Specify which key and IV sizes are supported by your cipher. A user * should be able to enumerate the supported sizes by running the * following code: * * for (i = 0; ECRYPT_KEYSIZE(i) <= ECRYPT_MAXKEYSIZE; ++i) *   { *     keysize = ECRYPT_KEYSIZE(i); * *     ... *   } * * All sizes are in bits. */#define ECRYPT_MAXKEYSIZE 256                 /* [edit] */#define ECRYPT_KEYSIZE(i) (128 + (i)*128)     /* [edit] */#define ECRYPT_MAXIVSIZE 64                   /* [edit] */#define ECRYPT_IVSIZE(i) (64 + (i)*64)        /* [edit] *//* ------------------------------------------------------------------------- *//* Data structures *//*  * ECRYPT_ctx is the structure containing the representation of the * internal state of your cipher.  */typedef struct{  u32 input[16]; /* could be compressed */  /*    * [edit]   *   * Put here all state variable needed during the encryption process.   */} ECRYPT_ctx;/* ------------------------------------------------------------------------- *//* Mandatory functions *//* * Key and message independent initialization. This function will be * called once when the program starts (e.g., to build expanded S-box * tables). */void ECRYPT_init();/* * Key setup. It is the user's responsibility to select the values of * keysize and ivsize from the set of supported values specified * above. */void ECRYPT_keysetup(  ECRYPT_ctx* ctx,   const u8* key,   u32 keysize,                /* Key size in bits. */   u32 ivsize);                /* IV size in bits. */ /* * IV setup. After having called ECRYPT_keysetup(), the user is * allowed to call ECRYPT_ivsetup() different times in order to * encrypt/decrypt different messages with the same key but different * IV's. */void ECRYPT_ivsetup(  ECRYPT_ctx* ctx,   const u8* iv);/* * Encryption/decryption of arbitrary length messages. * * For efficiency reasons, the API provides two types of * encrypt/decrypt functions. The ECRYPT_encrypt_bytes() function * (declared here) encrypts byte strings of arbitrary length, while * the ECRYPT_encrypt_blocks() function (defined later) only accepts * lengths which are multiples of ECRYPT_BLOCKLENGTH. *  * The user is allowed to make multiple calls to * ECRYPT_encrypt_blocks() to incrementally encrypt a long message, * but he is NOT allowed to make additional encryption calls once he * has called ECRYPT_encrypt_bytes() (unless he starts a new message * of course). For example, this sequence of calls is acceptable: * * ECRYPT_keysetup(); * * ECRYPT_ivsetup(); * ECRYPT_encrypt_blocks(); * ECRYPT_encrypt_blocks(); * ECRYPT_encrypt_bytes(); * * ECRYPT_ivsetup(); * ECRYPT_encrypt_blocks(); * ECRYPT_encrypt_blocks(); * * ECRYPT_ivsetup(); * ECRYPT_encrypt_bytes(); *  * The following sequence is not: * * ECRYPT_keysetup(); * ECRYPT_ivsetup(); * ECRYPT_encrypt_blocks(); * ECRYPT_encrypt_bytes(); * ECRYPT_encrypt_blocks(); */void ECRYPT_encrypt_bytes(  ECRYPT_ctx* ctx,   const u8* plaintext,   u8* ciphertext,   u32 msglen);                /* Message length in bytes. */ void ECRYPT_decrypt_bytes(  ECRYPT_ctx* ctx,   const u8* ciphertext,   u8* plaintext,   u32 msglen);                /* Message length in bytes. */ /* ------------------------------------------------------------------------- *//* Optional features *//*  * For testing purposes it can sometimes be useful to have a function * which immediately generates keystream without having to provide it * with a zero plaintext. If your cipher cannot provide this function * (e.g., because it is not strictly a synchronous cipher), please * reset the ECRYPT_GENERATES_KEYSTREAM flag. */#define ECRYPT_GENERATES_KEYSTREAM#ifdef ECRYPT_GENERATES_KEYSTREAMvoid ECRYPT_keystream_bytes(  ECRYPT_ctx* ctx,  u8* keystream,  u32 length);                /* Length of keystream in bytes. */#endif/* ------------------------------------------------------------------------- *//* Optional optimizations *//*  * By default, the functions in this section are implemented using * calls to functions declared above. However, you might want to * implement them differently for performance reasons. *//* * All-in-one encryption/decryption of (short) packets. * * The default definitions of these functions can be found in * "ecrypt-sync.c". If you want to implement them differently, please * undef the ECRYPT_USES_DEFAULT_ALL_IN_ONE flag. */#define ECRYPT_USES_DEFAULT_ALL_IN_ONE        /* [edit] */void ECRYPT_encrypt_packet(  ECRYPT_ctx* ctx,   const u8* iv,  const u8* plaintext,   u8* ciphertext,   u32 msglen);void ECRYPT_decrypt_packet(  ECRYPT_ctx* ctx,   const u8* iv,  const u8* ciphertext,   u8* plaintext,   u32 msglen);/* * Encryption/decryption of blocks. *  * By default, these functions are defined as macros. If you want to * provide a different implementation, please undef the * ECRYPT_USES_DEFAULT_BLOCK_MACROS flag and implement the functions * declared below. */#define ECRYPT_BLOCKLENGTH 64                  /* [edit] */#define ECRYPT_USES_DEFAULT_BLOCK_MACROS      /* [edit] */#ifdef ECRYPT_USES_DEFAULT_BLOCK_MACROS#define ECRYPT_encrypt_blocks(ctx, plaintext, ciphertext, blocks)  \  ECRYPT_encrypt_bytes(ctx, plaintext, ciphertext,                 \    (blocks) * ECRYPT_BLOCKLENGTH)#define ECRYPT_decrypt_blocks(ctx, ciphertext, plaintext, blocks)  \  ECRYPT_decrypt_bytes(ctx, ciphertext, plaintext,                 \    (blocks) * ECRYPT_BLOCKLENGTH)#ifdef ECRYPT_GENERATES_KEYSTREAM#define ECRYPT_keystream_blocks(ctx, keystream, blocks)            \  ECRYPT_AE_keystream_bytes(ctx, keystream,                        \    (blocks) * ECRYPT_BLOCKLENGTH)#endif#elsevoid ECRYPT_encrypt_blocks(  ECRYPT_ctx* ctx,   const u8* plaintext,   u8* ciphertext,   u32 blocks);                /* Message length in blocks. */ void ECRYPT_decrypt_blocks(  ECRYPT_ctx* ctx,   const u8* ciphertext,   u8* plaintext,   u32 blocks);                /* Message length in blocks. */ #ifdef ECRYPT_GENERATES_KEYSTREAMvoid ECRYPT_keystream_blocks(  ECRYPT_AE_ctx* ctx,  const u8* keystream,  u32 blocks);                /* Keystream length in blocks. */ #endif#endif/* ------------------------------------------------------------------------- */#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -