/** * crypto_aesctr_stream(stream, inbuf, outbuf, buflen): * Generate the next ${buflen} bytes of the AES-CTR stream and xor them with * bytes from ${inbuf}, writing the result into ${outbuf}. If the buffers * ${inbuf} and ${outbuf} overlap, they must be identical. */ void crypto_aesctr_stream(struct crypto_aesctr * stream, const uint8_t * inbuf, uint8_t * outbuf, size_t buflen) { uint8_t pblk[16]; size_t pos; int bytemod; for (pos = 0; pos < buflen; pos++) { /* How far through the buffer are we? */ bytemod = stream->bytectr % 16; /* Generate a block of cipherstream if needed. */ if (bytemod == 0) { be64enc(pblk, stream->nonce); be64enc(pblk + 8, stream->bytectr / 16); crypto_aes_encrypt_block(pblk, stream->buf, stream->key); } /* Encrypt a byte. */ outbuf[pos] = inbuf[pos] ^ stream->buf[bytemod]; /* Move to the next byte of cipherstream. */ stream->bytectr += 1; } }
/***************************************************************************** * 函 数 名 : crypto_encrypt * * 功能描述 : 使用指定的密钥和指定的算法对输入的数据加密,输出加密后的数据。 * 当前支持AES-ECB算法。 * * 输入参数 : data: 待加密数据。 * len: 待加密数据长度。(byte) * algorithm: 所用HASH算法。 * key: 密钥buffer。 * klen: 密钥buffer长度。(byte) * cipher_len: 加密后的数据的存放buffer的buffer size。(byte)(没有检查) * * 输出参数 : cipher_data: 加密后的数据的存放buffer。 * cipher_len: 加密后的数据的实际长度。(byte) * * 返 回 值 : BSP_OK: 加密成功。 * BSP_ERROR: 加密失败。 * * 其它说明 : cipher_len为输入/输出参数,传入的cipher_len变量所用内存必须可写回。 * 所以避免直接传入类似sizeof()的函数调用结果。 * *****************************************************************************/ int crypto_encrypt_o (char *data, int len, CRYPTO_ENCRYPT_ALGORITHM algorithm, char *key, int klen, char *cipher_data, int *cipher_len) { crypto_aes aes_ctx; int16 keybits = 0; if(data == NULL || key == NULL || cipher_data == NULL || cipher_len == NULL) { security_print("ERROR crypto_encrypt: param is NULL pointer!\n"); return BSP_ERROR; } if(len<=0 || (klen != AES_KEY_LEN && klen != 16)) { security_print("ERROR crypto_encrypt: param is invalid!\n"); return BSP_ERROR; } if (klen == 16) { keybits = 128;/* [false alarm]:误报 */ } else if(klen == AES_KEY_LEN) { keybits = 256;/* [false alarm]:误报 */ } crypto_aes_init(&aes_ctx,(UINT8*)key,keybits,MODE_ECB,NULL); switch(algorithm) { case CRYPTO_ENCRYPT_ALGORITHM_AES_ECB: //if(0 != crypto_aes_encrypt_pad(&aes_ctx,data,len,cipher_data,cipher_len)) if(0 != crypto_aes_encrypt_block(&aes_ctx,(UINT8*)data,len,(UINT8*)cipher_data,(int32*)cipher_len)) { security_print("ERROR crypto_encrypt: crypto_aes_encrypt_pad failed!\n"); return BSP_ERROR; } break; default: security_print("ERROR crypto_encrypt: unknown algorithm!\n"); return BSP_ERROR; } return BSP_OK; }