diff options
author | Arne Schwabe <arne@rfc2549.org> | 2015-04-15 00:17:26 +0200 |
---|---|---|
committer | Arne Schwabe <arne@rfc2549.org> | 2015-04-15 00:20:23 +0200 |
commit | c3ae4aaac9f0b168aed063d3e86c5196608eaba1 (patch) | |
tree | 1a18e7d8751d4dd3682d82d12c8441b335112984 /main/openssl/crypto/perlasm/readme | |
parent | 5e42114d22faefe7c272b1b498fdf5640da494c7 (diff) |
Move more to git, add submodules, fix build script, change hgignore to gitignore
Diffstat (limited to 'main/openssl/crypto/perlasm/readme')
m--------- | main/openssl | 0 | ||||
-rw-r--r-- | main/openssl/crypto/perlasm/readme | 124 |
2 files changed, 0 insertions, 124 deletions
diff --git a/main/openssl b/main/openssl new file mode 160000 +Subproject 4d377a9ce111930d8a8f06dc0e94a892a7f6c51 diff --git a/main/openssl/crypto/perlasm/readme b/main/openssl/crypto/perlasm/readme deleted file mode 100644 index f02bbee7..00000000 --- a/main/openssl/crypto/perlasm/readme +++ /dev/null @@ -1,124 +0,0 @@ -The perl scripts in this directory are my 'hack' to generate -multiple different assembler formats via the one origional script. - -The way to use this library is to start with adding the path to this directory -and then include it. - -push(@INC,"perlasm","../../perlasm"); -require "x86asm.pl"; - -The first thing we do is setup the file and type of assember - -&asm_init($ARGV[0],$0); - -The first argument is the 'type'. Currently -'cpp', 'sol', 'a.out', 'elf' or 'win32'. -Argument 2 is the file name. - -The reciprocal function is -&asm_finish() which should be called at the end. - -There are 2 main 'packages'. x86ms.pl, which is the microsoft assembler, -and x86unix.pl which is the unix (gas) version. - -Functions of interest are: -&external_label("des_SPtrans"); declare and external variable -&LB(reg); Low byte for a register -&HB(reg); High byte for a register -&BP(off,base,index,scale) Byte pointer addressing -&DWP(off,base,index,scale) Word pointer addressing -&stack_push(num) Basically a 'sub esp, num*4' with extra -&stack_pop(num) inverse of stack_push -&function_begin(name,extra) Start a function with pushing of - edi, esi, ebx and ebp. extra is extra win32 - external info that may be required. -&function_begin_B(name,extra) Same as norma function_begin but no pushing. -&function_end(name) Call at end of function. -&function_end_A(name) Standard pop and ret, for use inside functions -&function_end_B(name) Call at end but with poping or 'ret'. -&swtmp(num) Address on stack temp word. -&wparam(num) Parameter number num, that was push - in C convention. This all works over pushes - and pops. -&comment("hello there") Put in a comment. -&label("loop") Refer to a label, normally a jmp target. -&set_label("loop") Set a label at this point. -&data_word(word) Put in a word of data. - -So how does this all hold together? Given - -int calc(int len, int *data) - { - int i,j=0; - - for (i=0; i<len; i++) - { - j+=other(data[i]); - } - } - -So a very simple version of this function could be coded as - - push(@INC,"perlasm","../../perlasm"); - require "x86asm.pl"; - - &asm_init($ARGV[0],"cacl.pl"); - - &external_label("other"); - - $tmp1= "eax"; - $j= "edi"; - $data= "esi"; - $i= "ebp"; - - &comment("a simple function"); - &function_begin("calc"); - &mov( $data, &wparam(1)); # data - &xor( $j, $j); - &xor( $i, $i); - - &set_label("loop"); - &cmp( $i, &wparam(0)); - &jge( &label("end")); - - &mov( $tmp1, &DWP(0,$data,$i,4)); - &push( $tmp1); - &call( "other"); - &add( $j, "eax"); - &pop( $tmp1); - &inc( $i); - &jmp( &label("loop")); - - &set_label("end"); - &mov( "eax", $j); - - &function_end("calc"); - - &asm_finish(); - -The above example is very very unoptimised but gives an idea of how -things work. - -There is also a cbc mode function generator in cbc.pl - -&cbc( $name, - $encrypt_function_name, - $decrypt_function_name, - $true_if_byte_swap_needed, - $parameter_number_for_iv, - $parameter_number_for_encrypt_flag, - $first_parameter_to_pass, - $second_parameter_to_pass, - $third_parameter_to_pass); - -So for example, given -void BF_encrypt(BF_LONG *data,BF_KEY *key); -void BF_decrypt(BF_LONG *data,BF_KEY *key); -void BF_cbc_encrypt(unsigned char *in, unsigned char *out, long length, - BF_KEY *ks, unsigned char *iv, int enc); - -&cbc("BF_cbc_encrypt","BF_encrypt","BF_encrypt",1,4,5,3,-1,-1); - -&cbc("des_ncbc_encrypt","des_encrypt","des_encrypt",0,4,5,3,5,-1); -&cbc("des_ede3_cbc_encrypt","des_encrypt3","des_decrypt3",0,6,7,3,4,5); - |