~ubuntu-branches/ubuntu/hardy/openswan/hardy-updates

« back to all changes in this revision

Viewing changes to linux/crypto/ciphers/des/asm/perlasm/readme

  • Committer: Bazaar Package Importer
  • Author(s): Rene Mayrhofer
  • Date: 2005-01-27 16:10:11 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20050127161011-idgybmyz3vwhpfiq
Tags: 2.3.0-2
Urgency HIGH due to security issue and problems with build-deps in sarge.
* Fix the security issue. Please see
  http://www.idefense.com/application/poi/display?id=190&
      type=vulnerabilities&flashstatus=false
  for more details. Thanks to Martin Schulze for informing me about
  this issue.
  Closes: #292458: Openswan XAUTH/PAM Buffer Overflow Vulnerability
* Added a Build-Dependency to lynx.
  Closes: #291143: openswan: FTBFS: Missing build dependency.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
The perl scripts in this directory are my 'hack' to generate
2
 
multiple different assembler formats via the one origional script.
3
 
 
4
 
The way to use this library is to start with adding the path to this directory
5
 
and then include it.
6
 
 
7
 
push(@INC,"perlasm","../../perlasm");
8
 
require "x86asm.pl";
9
 
 
10
 
The first thing we do is setup the file and type of assember
11
 
 
12
 
&asm_init($ARGV[0],$0);
13
 
 
14
 
The first argument is the 'type'.  Currently
15
 
'cpp', 'sol', 'a.out', 'elf' or 'win32'.
16
 
Argument 2 is the file name.
17
 
 
18
 
The reciprocal function is
19
 
&asm_finish() which should be called at the end.
20
 
 
21
 
There are 2 main 'packages'. x86ms.pl, which is the microsoft assembler,
22
 
and x86unix.pl which is the unix (gas) version.
23
 
 
24
 
Functions of interest are:
25
 
&external_label("des_SPtrans"); declare and external variable
26
 
&LB(reg);                       Low byte for a register
27
 
&HB(reg);                       High byte for a register
28
 
&BP(off,base,index,scale)       Byte pointer addressing
29
 
&DWP(off,base,index,scale)      Word pointer addressing
30
 
&stack_push(num)                Basically a 'sub esp, num*4' with extra
31
 
&stack_pop(num)                 inverse of stack_push
32
 
&function_begin(name,extra)     Start a function with pushing of
33
 
                                edi, esi, ebx and ebp.  extra is extra win32
34
 
                                external info that may be required.
35
 
&function_begin_B(name,extra)   Same as norma function_begin but no pushing.
36
 
&function_end(name)             Call at end of function.
37
 
&function_end_A(name)           Standard pop and ret, for use inside functions
38
 
&function_end_B(name)           Call at end but with poping or 'ret'.
39
 
&swtmp(num)                     Address on stack temp word.
40
 
&wparam(num)                    Parameter number num, that was push
41
 
                                in C convention.  This all works over pushes
42
 
                                and pops.
43
 
&comment("hello there")         Put in a comment.
44
 
&label("loop")                  Refer to a label, normally a jmp target.
45
 
&set_label("loop")              Set a label at this point.
46
 
&data_word(word)                Put in a word of data.
47
 
 
48
 
So how does this all hold together?  Given
49
 
 
50
 
int calc(int len, int *data)
51
 
        {
52
 
        int i,j=0;
53
 
 
54
 
        for (i=0; i<len; i++)
55
 
                {
56
 
                j+=other(data[i]);
57
 
                }
58
 
        }
59
 
 
60
 
So a very simple version of this function could be coded as
61
 
 
62
 
        push(@INC,"perlasm","../../perlasm");
63
 
        require "x86asm.pl";
64
 
        
65
 
        &asm_init($ARGV[0],"cacl.pl");
66
 
 
67
 
        &external_label("other");
68
 
 
69
 
        $tmp1=  "eax";
70
 
        $j=     "edi";
71
 
        $data=  "esi";
72
 
        $i=     "ebp";
73
 
 
74
 
        &comment("a simple function");
75
 
        &function_begin("calc");
76
 
        &mov(   $data,          &wparam(1)); # data
77
 
        &xor(   $j,             $j);
78
 
        &xor(   $i,             $i);
79
 
 
80
 
        &set_label("loop");
81
 
        &cmp(   $i,             &wparam(0));
82
 
        &jge(   &label("end"));
83
 
 
84
 
        &mov(   $tmp1,          &DWP(0,$data,$i,4));
85
 
        &push(  $tmp1);
86
 
        &call(  "other");
87
 
        &add(   $j,             "eax");
88
 
        &pop(   $tmp1);
89
 
        &inc(   $i);
90
 
        &jmp(   &label("loop"));
91
 
 
92
 
        &set_label("end");
93
 
        &mov(   "eax",          $j);
94
 
 
95
 
        &function_end("calc");
96
 
 
97
 
        &asm_finish();
98
 
 
99
 
The above example is very very unoptimised but gives an idea of how
100
 
things work.
101
 
 
102
 
There is also a cbc mode function generator in cbc.pl
103
 
 
104
 
&cbc(   $name,
105
 
        $encrypt_function_name,
106
 
        $decrypt_function_name,
107
 
        $true_if_byte_swap_needed,
108
 
        $parameter_number_for_iv,
109
 
        $parameter_number_for_encrypt_flag,
110
 
        $first_parameter_to_pass,
111
 
        $second_parameter_to_pass,
112
 
        $third_parameter_to_pass);
113
 
 
114
 
So for example, given
115
 
void BF_encrypt(BF_LONG *data,BF_KEY *key);
116
 
void BF_decrypt(BF_LONG *data,BF_KEY *key);
117
 
void BF_cbc_encrypt(unsigned char *in, unsigned char *out, long length,
118
 
        BF_KEY *ks, unsigned char *iv, int enc);
119
 
 
120
 
&cbc("BF_cbc_encrypt","BF_encrypt","BF_encrypt",1,4,5,3,-1,-1);
121
 
 
122
 
&cbc("des_ncbc_encrypt","des_encrypt","des_encrypt",0,4,5,3,5,-1);
123
 
&cbc("des_ede3_cbc_encrypt","des_encrypt3","des_decrypt3",0,6,7,3,4,5);
124