MagickCore 7.0.10
serpent.c File Reference
Include dependency graph for serpent.c:

Go to the source code of this file.

Data Structures

struct  _SerpentInfo
 

Macros

#define Read32Bits(value, p)
 
#define SerpentBlocksize   32
 
#define Write32Bits(p, value)
 
#define DecipherSbox0(alpha, beta, gamma, delta, epsilon)
 
#define DecipherSbox1(alpha, beta, gamma, delta, epsilon)
 
#define DecipherSbox2(alpha, beta, gamma, delta, epsilon)
 
#define DecipherSbox3(alpha, beta, gamma, delta, epsilon)
 
#define DecipherSbox4(alpha, beta, gamma, delta, epsilon)
 
#define DecipherSbox5(alpha, beta, gamma, delta, epsilon)
 
#define DecipherSbox6(alpha, beta, gamma, delta, epsilon)
 
#define DecipherSbox7(alpha, beta, gamma, delta, epsilon)
 
#define DecipherK(alpha, beta, gamma, delta, epsilon, i)
 
#define MixKey(alpha, beta, gamma, delta, i)
 
#define EncipherK(alpha, beta, gamma, delta, epsilon, i)
 
#define EncipherSbox0(alpha, beta, gamma, delta, epsilon)
 
#define EncipherSbox1(alpha, beta, gamma, delta, epsilon)
 
#define EncipherSbox2(alpha, beta, gamma, delta, epsilon)
 
#define EncipherSbox3(alpha, beta, gamma, delta, epsilon)
 
#define EncipherSbox4(alpha, beta, gamma, delta, epsilon)
 
#define EncipherSbox5(alpha, beta, gamma, delta, epsilon)
 
#define EncipherSbox6(alpha, beta, gamma, delta, epsilon)
 
#define EncipherSbox7(alpha, beta, gamma, delta, epsilon)
 
#define ChurnKey(alpha, beta, gamma, delta, i, j)
 
#define LoadKey(alpha, beta, gamma, delta, i)
 
#define MaximumSerpentKeyLength   32
 
#define StoreKey(alpha, beta, gamma, delta, i)
 

Functions

WizardExport SerpentInfoAcquireSerpentInfo (void)
 
static unsigned int Trunc32 (unsigned int x)
 
static unsigned int RotateRight (unsigned int x, unsigned int n)
 
WizardExport void DecipherSerpentBlock (SerpentInfo *serpent_info, const unsigned char *ciphertext, unsigned char *plaintext)
 
WizardExport SerpentInfoDestroySerpentInfo (SerpentInfo *serpent_info)
 
static unsigned int RotateLeft (unsigned int x, unsigned int n)
 
WizardExport void EncipherSerpentBlock (SerpentInfo *serpent_info, const unsigned char *plaintext, unsigned char *ciphertext)
 
WizardExport unsigned int GetSerpentBlocksize (const SerpentInfo *serpent_info)
 
WizardExport void SetSerpentKey (SerpentInfo *serpent_info, const StringInfo *key)
 

Macro Definition Documentation

◆ ChurnKey

#define ChurnKey (   alpha,
  beta,
  gamma,
  delta,
  i,
 
)
Value:
{ \
beta^=delta; beta^=gamma; beta^=alpha; beta^=0x9e3779b9UL ^ i; \
beta=RotateLeft(beta,11); crypt_key[j]=beta; \
}
static unsigned int RotateLeft(unsigned int x, unsigned int n)
Definition serpent.c:398

◆ DecipherK

#define DecipherK (   alpha,
  beta,
  gamma,
  delta,
  epsilon,
 
)
Value:
{ \
MixKey(alpha,beta,gamma,delta,i) \
alpha=RotateRight(alpha,5); gamma=RotateRight(gamma,22); \
alpha^=delta; gamma^=delta; epsilon=beta << 7; alpha^=beta; \
beta=RotateRight(beta,1); gamma^=epsilon; delta=RotateRight(delta,7); \
epsilon=alpha << 3; beta^=alpha; delta^=epsilon; \
alpha=RotateRight(alpha,13); beta^=gamma; delta^=gamma; \
gamma=RotateRight(gamma,3); \
}
#define RotateRight(x, n)

◆ DecipherSbox0

#define DecipherSbox0 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
beta^=alpha; epsilon=delta; delta|=beta; epsilon^=beta; \
alpha=(~alpha); gamma^=delta; delta^=alpha; alpha&=beta; \
alpha^=gamma; gamma&=delta; delta^=epsilon; gamma^=delta; \
beta^=delta; delta&=alpha; beta^=alpha; alpha^=gamma; epsilon^=delta; \
}

◆ DecipherSbox1

#define DecipherSbox1 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
beta^=delta; epsilon=alpha; alpha^=gamma; gamma=(~gamma); \
epsilon|=beta; epsilon^=delta; delta&=beta; beta^=gamma; \
gamma&=epsilon; epsilon^=beta; beta|=delta; delta^=alpha; \
gamma^=alpha; alpha|=epsilon; gamma^=epsilon; beta^=alpha; epsilon^=beta; \
}

◆ DecipherSbox2

#define DecipherSbox2 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
gamma^=beta; epsilon=delta; delta=(~delta); delta|=gamma; \
gamma^=epsilon; epsilon^=alpha; delta^=beta; beta|=gamma; \
gamma^=alpha; beta^=epsilon; epsilon|=delta; gamma^=delta; \
epsilon^=gamma; gamma&=beta; gamma^=delta; delta^=epsilon; epsilon^=alpha; \
}

◆ DecipherSbox3

#define DecipherSbox3 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
gamma^=beta; epsilon=beta; beta&=gamma; beta^=alpha; \
alpha|=epsilon; epsilon^=delta; alpha^=delta; delta|=beta; \
beta^=gamma; beta^=delta; alpha^=gamma; gamma^=delta; delta&=beta; \
beta^=alpha; alpha&=gamma; epsilon^=delta; delta^=alpha; alpha^=beta; \
}

◆ DecipherSbox4

#define DecipherSbox4 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
gamma^=delta; epsilon=alpha; alpha&=beta; alpha^=gamma; \
gamma|=delta; epsilon=(~epsilon); beta^=alpha; alpha^=gamma; \
gamma&=epsilon; gamma^=alpha; alpha|=epsilon; alpha^=delta; \
delta&=gamma; epsilon^=delta; delta^=beta; beta&=alpha; \
epsilon^=beta; alpha^=delta; \
}

◆ DecipherSbox5

#define DecipherSbox5 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
epsilon=beta; beta|=gamma; gamma^=epsilon; beta^=delta; \
delta&=epsilon; gamma^=delta; delta|=alpha; alpha=(~alpha); \
delta^=gamma; gamma|=alpha; epsilon^=beta; gamma^=epsilon; \
epsilon&=alpha; alpha^=beta; beta^=delta; alpha&=gamma; \
gamma^=delta; alpha^=gamma; gamma^=epsilon; epsilon^=delta; \
}

◆ DecipherSbox6

#define DecipherSbox6 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
alpha^=gamma; epsilon=alpha; alpha&=delta; gamma^=delta; \
alpha^=gamma; delta^=beta; gamma|=epsilon; gamma^=delta; \
delta&=alpha; alpha=(~alpha); delta^=beta; beta&=gamma; \
epsilon^=alpha; delta^=epsilon; epsilon^=gamma; alpha^=beta; gamma^=alpha; \
}

◆ DecipherSbox7

#define DecipherSbox7 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
epsilon=delta; delta&=alpha; alpha^=gamma; gamma|=epsilon; \
epsilon^=beta; alpha=(~alpha); beta|=delta; epsilon^=alpha; \
alpha&=gamma; alpha^=beta; beta&=gamma; delta^=gamma; \
epsilon^=delta; gamma&=delta; delta|=alpha; beta^=epsilon; \
delta^=epsilon; epsilon&=alpha; epsilon^=gamma; \
}

◆ EncipherK

#define EncipherK (   alpha,
  beta,
  gamma,
  delta,
  epsilon,
 
)
Value:
{ \
alpha=RotateLeft(alpha,13); gamma=RotateLeft(gamma,3); \
beta^=alpha; epsilon=alpha << 3; delta^=gamma; beta^=gamma; \
beta=RotateLeft(beta,1); delta^=epsilon; delta=RotateLeft(delta,7); \
epsilon=beta << 7; alpha^=beta; gamma^=delta; alpha^=delta; \
gamma^=epsilon; delta^=crypt_key[4*(i)+3]; beta^=crypt_key[4*(i)+1]; \
alpha=RotateLeft(alpha,5); gamma=RotateLeft(gamma,22); \
alpha^=crypt_key[4*(i)+0]; gamma^=crypt_key[4*(i)+2]; \
}

◆ EncipherSbox0

#define EncipherSbox0 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
epsilon=delta; delta|=alpha; alpha^=epsilon; epsilon^=gamma; \
epsilon=(~epsilon); delta^=beta; beta&=alpha; beta^=epsilon; \
gamma^=alpha; alpha^=delta; epsilon|=alpha; alpha^=gamma; \
gamma&=beta; delta^=gamma; beta=(~beta); gamma^=epsilon; beta^=gamma; \
}

◆ EncipherSbox1

#define EncipherSbox1 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
epsilon=beta; beta^=alpha; alpha^=delta; delta=~delta; \
epsilon&=beta; alpha|=beta; delta^=gamma; alpha^=delta; \
beta^=delta; delta^=epsilon; beta|=epsilon; epsilon^=gamma; \
gamma&=alpha; gamma^=beta; beta|=alpha; alpha=(~alpha); \
alpha^=gamma; epsilon^=beta; \
}

◆ EncipherSbox2

#define EncipherSbox2 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
delta=(~delta); beta^=alpha; epsilon=alpha; alpha&=gamma; \
alpha^=delta; delta|=epsilon; gamma^=beta; delta^=beta; \
beta&=alpha; alpha^=gamma; gamma&=delta; delta|=beta; \
alpha=(~alpha); delta^=alpha; epsilon^=alpha; alpha^=gamma; beta|=gamma; \
}

◆ EncipherSbox3

#define EncipherSbox3 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
epsilon=beta; beta^=delta; delta|=alpha; epsilon&=alpha; \
alpha^=gamma; gamma^=beta; beta&=delta; gamma^=delta; \
alpha|=epsilon; epsilon^=delta; beta^=alpha; alpha&=delta; \
delta&=epsilon; delta^=gamma; epsilon|=beta; gamma&=beta; \
epsilon^=delta; alpha^=delta; delta^=gamma; \
}

◆ EncipherSbox4

#define EncipherSbox4 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
epsilon=delta; delta&=alpha; alpha^=epsilon; delta^=gamma; \
gamma|=epsilon; alpha^=beta; epsilon^=delta; gamma|=alpha; \
gamma^=beta; beta&=alpha; beta^=epsilon; epsilon&=gamma; \
gamma^=delta; epsilon^=alpha; delta|=beta; beta=(~beta); delta^=alpha; \
}

◆ EncipherSbox5

#define EncipherSbox5 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
epsilon=beta; beta|=alpha; gamma^=beta; delta=(~delta); \
epsilon^=alpha; alpha^=gamma; beta&=epsilon; epsilon|=delta; \
epsilon^=alpha; alpha&=delta; beta^=delta; delta^=gamma; \
alpha^=beta; gamma&=epsilon; beta^=gamma; gamma&=alpha; delta^=gamma; \
}

◆ EncipherSbox6

#define EncipherSbox6 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
epsilon=beta; delta^=alpha; beta^=gamma; gamma^=alpha; \
alpha&=delta; beta|=delta; epsilon=(~epsilon); alpha^=beta; \
beta^=gamma; delta^=epsilon; epsilon^=alpha; gamma&=alpha; \
epsilon^=beta; gamma^=delta; delta&=beta; delta^=alpha; beta^=gamma; \
}

◆ EncipherSbox7

#define EncipherSbox7 (   alpha,
  beta,
  gamma,
  delta,
  epsilon 
)
Value:
{ \
beta=(~beta); epsilon=beta; alpha=(~alpha); beta&=gamma; \
beta^=delta; delta|=epsilon; epsilon^=gamma; gamma^=delta; \
delta^=alpha; alpha|=beta; gamma&=alpha; alpha^=epsilon; \
epsilon^=delta; delta&=alpha; epsilon^=beta; gamma^=epsilon; \
delta^=beta; epsilon|=alpha; epsilon^=beta; \
}

◆ LoadKey

#define LoadKey (   alpha,
  beta,
  gamma,
  delta,
 
)
Value:
{ \
alpha=crypt_key[i]; beta=crypt_key[(i)+1]; \
gamma=crypt_key[(i)+2]; delta=crypt_key[(i)+3]; \
}

◆ MaximumSerpentKeyLength

#define MaximumSerpentKeyLength   32

◆ MixKey

#define MixKey (   alpha,
  beta,
  gamma,
  delta,
 
)
Value:
{ \
alpha^=crypt_key[4*(i)+0]; beta^=crypt_key[4*(i)+1]; \
gamma^=crypt_key[4*(i)+2]; delta^=crypt_key[4*(i)+3]; \
}

◆ Read32Bits

#define Read32Bits (   value,
 
)
Value:
{ \
(value)=(*p++); \
(value)|=(*p++) << 8; \
(value)|=(*p++) << 16; \
(value)|=(*p++) << 24; \
}

Definition at line 66 of file serpent.c.

◆ SerpentBlocksize

#define SerpentBlocksize   32

Definition at line 73 of file serpent.c.

◆ StoreKey

#define StoreKey (   alpha,
  beta,
  gamma,
  delta,
 
)
Value:
{ \
crypt_key[i]=alpha; crypt_key[(i)+1]=beta; \
crypt_key[(i)+2]=gamma; crypt_key[(i)+3]=delta; \
}

◆ Write32Bits

#define Write32Bits (   p,
  value 
)
Value:
{ \
*p++=(unsigned char) (value); \
*p++=(unsigned char) ((value) >> 8); \
*p++=(unsigned char) ((value) >> 16); \
*p++=(unsigned char) ((value) >> 24); \
}

Definition at line 74 of file serpent.c.

Function Documentation

◆ AcquireSerpentInfo()

◆ DecipherSerpentBlock()

WizardExport void DecipherSerpentBlock ( SerpentInfo serpent_info,
const unsigned char *  ciphertext,
unsigned char *  plaintext 
)

◆ DestroySerpentInfo()

◆ EncipherSerpentBlock()

WizardExport void EncipherSerpentBlock ( SerpentInfo serpent_info,
const unsigned char *  plaintext,
unsigned char *  ciphertext 
)

◆ GetSerpentBlocksize()

WizardExport unsigned int GetSerpentBlocksize ( const SerpentInfo serpent_info)

◆ RotateLeft()

static unsigned int RotateLeft ( unsigned int  x,
unsigned int  n 
)
inlinestatic

Definition at line 398 of file serpent.c.

References Trunc32.

◆ RotateRight()

static unsigned int RotateRight ( unsigned int  x,
unsigned int  n 
)
inlinestatic

Definition at line 149 of file serpent.c.

References Trunc32.

◆ SetSerpentKey()

◆ Trunc32()

static unsigned int Trunc32 ( unsigned int  x)
inlinestatic

Definition at line 144 of file serpent.c.