pike.git/
src/
post_modules/
Nettle/
nettle.cmod
Branch:
Tag:
Non-build tags
All tags
No tags
2004-02-13
2004-02-13 23:27:29 by Martin Nilsson <mani@lysator.liu.se>
d7f88a870613d8b0ee882cc8cadf2891fda33c8a (
78
lines) (+
60
/-
18
)
[
Show
|
Annotate
]
Branch:
7.9
Allow crypt_md5 to run in a thread. Added flags.
Rev: src/post_modules/Nettle/nettle.cmod:1.32
1:
/* nettle.cmod -*- c -*- */ #include "global.h"
-
RCSID("$Id: nettle.cmod,v 1.
31
2004/02/
04
21
:
36
:29 nilsson Exp $");
+
RCSID("$Id: nettle.cmod,v 1.
32
2004/02/
13
23
:
27
:29 nilsson Exp $");
#include "interpret.h" #include "svalue.h" /* For this_object() */ #include "object.h" #include "operators.h" #include "module_support.h"
-
+
#include "threads.h"
#include "nettle_config.h"
51:
*! @seealso *! @[update] */
-
PIKEFUN void create(void|int arg) {
+
PIKEFUN void create(void|int arg)
+
{
INT32 num = 0; if(arg) {
83:
*! @[min_seed_size], @[get_seed], @[is_seeded] */ PIKEFUN object seed(string data)
+
optflags OPT_SIDE_EFFECT;
{ if(data->len < YARROW256_SEED_FILE_SIZE) Pike_error( "Seed must be at least 32 characters.\n" );
99:
*! @[seed] */ PIKEFUN int(0..) min_seed_size()
+
optflags OPT_TRY_OPTIMIZE;
{ RETURN YARROW256_SEED_FILE_SIZE; }
110:
*! @[seed] */ PIKEFUN string get_seed()
+
optflags OPT_EXTERNAL_DEPEND;
{ if( !yarrow256_is_seeded(&THIS->ctx) ) Pike_error("Random generator not seeded.\n");
-
RETURN make_shared_binary_string(THIS->ctx.seed_file, YARROW256_SEED_FILE_SIZE);
+
RETURN make_shared_binary_string(THIS->ctx.seed_file,
+
YARROW256_SEED_FILE_SIZE);
} /*! @decl int(0..1) is_seeded()
123:
*! @[seed] */ PIKEFUN int(0..1) is_seeded()
+
optflags OPT_EXTERNAL_DEPEND;
{ RETURN yarrow256_is_seeded(&THIS->ctx); }
133:
*! this. */ PIKEFUN void force_reseed()
+
optflags OPT_SIDE_EFFECT;
{ yarrow256_force_reseed(&THIS->ctx); }
144:
*! @[create] */ PIKEFUN int(0..1) update(string data, int source, int entropy)
+
optflags OPT_SIDE_EFFECT;
{ /* FIXME: Wide strings could actually be supported here */ NO_WIDE_STRING(data);
163:
*! slow reseed will happen. */ PIKEFUN int(0..) needed_sources()
+
optflags OPT_EXTERNAL_DEPEND;
{ RETURN yarrow256_needed_sources(&THIS->ctx); }
171:
*! Returns a pseudo-random string of the requested @[length]. */ PIKEFUN string random_string(int length)
+
optflags OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT;
+
/* We could however set this to not have side effect to allow
+
unused values from not getting generated. */
{ struct pike_string *rnd; if(length < 0)
204:
*! It is assumed that @[salt] does not contain "$". */ PIKEFUN string crypt_md5(string pw, string salt)
+
optflags OPT_TRY_OPTIMIZE;
{ NO_WIDE_STRING(pw); NO_WIDE_STRING(salt);
-
RETURN
make
_
shared_string
(crypt_md5(pw->len, pw->str,
-
salt->len, salt->str));
+
THREADS_ALLOW();
+
push
_
text
(crypt_md5(pw->len, pw->str,salt->len, salt->str));
+
THREADS_DISALLOW();
}
369:
*! an @[LFUN::`()], that LFUN will be called. If it is a function, *! that function will be called with @[args] as arguments. */
-
PIKEFUN void create(program|object|function cipher, mixed ... more) {
+
PIKEFUN void create(program|object|function cipher, mixed ... more)
+
flags ID_STATIC;
+
{
int old_block_size = THIS->block_size; THIS->object = make_cipher_object(args);
398:
*! Returns the string @expr{"CBC(x)"@} where x is the *! encapsulated algorithm. */
-
PIKEFUN string name() {
+
PIKEFUN string name()
+
optflags OPT_TRY_OPTIMIZE;
+
{
push_constant_text("CBC("); safe_apply(THIS->object, "name", 0); push_constant_text(")");
408:
/*! @decl int block_size() *! Reurns the block size of the encapsulated cipher. */
-
PIKEFUN int block_size() {
+
PIKEFUN int block_size()
+
optflags OPT_TRY_OPTIMIZE;
+
{
RETURN THIS->block_size; } /*! @decl int key_size() *! Returns the key size of the encapsulated cipher. */
-
PIKEFUN int key_size() {
+
PIKEFUN int key_size()
+
optflags OPT_EXTERNAL_DEPEND;
+
{
safe_apply(THIS->object, "key_size", args); }
423:
*! Prepare the cipher and the wrapper for encrypting *! with the given @[key]. */
-
PIKEFUN object set_encrypt_key(string key) {
+
PIKEFUN object set_encrypt_key(string key)
+
optflags OPT_SIDE_EFFECT;
+
{
assert(THIS->block_size); THIS->mode = 0; safe_apply(THIS->object, "set_encrypt_key", args);
435:
*! Prepare the cipher and the wrapper for decrypting *! with the given @[key]. */
-
PIKEFUN object set_decrypt_key(string key) {
+
PIKEFUN object set_decrypt_key(string key)
+
optflags OPT_SIDE_EFFECT;
+
{
assert(THIS->block_size); THIS->mode = 1; safe_apply(THIS->object, "set_decrypt_key", args);
446:
/*! @decl this_program set_iv(string iv) *! Set the initialization vector to @[iv]. */
-
PIKEFUN object set_iv(string iv) {
+
PIKEFUN object set_iv(string iv)
+
optflags OPT_SIDE_EFFECT;
+
{
assert(THIS->iv); NO_WIDE_STRING(iv); if(iv->len != THIS->block_size)
527:
*! an @[LFUN::`()], that LFUN will be called. If it is a function, *! that function will be called with @[args] as arguments. */
-
PIKEFUN void create(program|object|function cipher, mixed ... more) {
+
PIKEFUN void create(program|object|function cipher, mixed ... more)
+
flags ID_STATIC;
+
{
THIS->object = make_cipher_object(args); safe_apply(THIS->object, "block_size", 0);
550:
*! Returns the string @expr{"CBC(x)"@} where x is the *! encapsulated algorithm. */
-
PIKEFUN string name() {
+
PIKEFUN string name()
+
optflags OPT_TRY_OPTIMIZE;
+
{
push_constant_text("Proxy("); safe_apply(THIS->object, "name", 0); push_constant_text(")");
561:
*! *! Get the block size of the contained block crypto. */
-
PIKEFUN int block_size() {
+
PIKEFUN int block_size()
+
optflags OPT_TRY_OPTIMIZE;
+
{
RETURN THIS->block_size; }
569:
*! *! Get the key size of the contained block crypto. */
-
PIKEFUN int key_size() {
+
PIKEFUN int key_size()
+
optflags OPT_EXTERNAL_DEPEND;
+
{
safe_apply(THIS->object, "key_size", args); }
580:
*! @note *! As a side-effect any buffered data will be cleared. */
-
PIKEFUN object set_encrypt_key(string key) {
+
PIKEFUN object set_encrypt_key(string key)
+
optflags OPT_SIDE_EFFECT;
+
{
MEMSET(THIS->backlog, 0, THIS->block_size); THIS->backlog_len = 0; safe_apply(THIS->object, "set_encrypt_key", args);
595:
*! @note *! As a side-effect any buffered data will be cleared. */
-
PIKEFUN object set_decrypt_key(string key) {
+
PIKEFUN object set_decrypt_key(string key)
+
optflags OPT_SIDE_EFFECT;
+
{
MEMSET(THIS->backlog, 0, THIS->block_size); THIS->backlog_len = 0; safe_apply(THIS->object, "set_decrypt_key", args);