1*0Sstevel@tonic-gate#!/usr/local/bin/perl 2*0Sstevel@tonic-gate 3*0Sstevel@tonic-gate# void des_ncbc_encrypt(input, output, length, schedule, ivec, enc) 4*0Sstevel@tonic-gate# des_cblock (*input); 5*0Sstevel@tonic-gate# des_cblock (*output); 6*0Sstevel@tonic-gate# long length; 7*0Sstevel@tonic-gate# des_key_schedule schedule; 8*0Sstevel@tonic-gate# des_cblock (*ivec); 9*0Sstevel@tonic-gate# int enc; 10*0Sstevel@tonic-gate# 11*0Sstevel@tonic-gate# calls 12*0Sstevel@tonic-gate# des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); 13*0Sstevel@tonic-gate# 14*0Sstevel@tonic-gate 15*0Sstevel@tonic-gate#&cbc("des_ncbc_encrypt","des_encrypt",0); 16*0Sstevel@tonic-gate#&cbc("BF_cbc_encrypt","BF_encrypt","BF_encrypt", 17*0Sstevel@tonic-gate# 1,4,5,3,5,-1); 18*0Sstevel@tonic-gate#&cbc("des_ncbc_encrypt","des_encrypt","des_encrypt", 19*0Sstevel@tonic-gate# 0,4,5,3,5,-1); 20*0Sstevel@tonic-gate#&cbc("des_ede3_cbc_encrypt","des_encrypt3","des_decrypt3", 21*0Sstevel@tonic-gate# 0,6,7,3,4,5); 22*0Sstevel@tonic-gate# 23*0Sstevel@tonic-gate# When doing a cipher that needs bigendian order, 24*0Sstevel@tonic-gate# for encrypt, the iv is kept in bigendian form, 25*0Sstevel@tonic-gate# while for decrypt, it is kept in little endian. 26*0Sstevel@tonic-gatesub cbc 27*0Sstevel@tonic-gate { 28*0Sstevel@tonic-gate local($name,$enc_func,$dec_func,$swap,$iv_off,$enc_off,$p1,$p2,$p3)=@_; 29*0Sstevel@tonic-gate # name is the function name 30*0Sstevel@tonic-gate # enc_func and dec_func and the functions to call for encrypt/decrypt 31*0Sstevel@tonic-gate # swap is true if byte order needs to be reversed 32*0Sstevel@tonic-gate # iv_off is parameter number for the iv 33*0Sstevel@tonic-gate # enc_off is parameter number for the encrypt/decrypt flag 34*0Sstevel@tonic-gate # p1,p2,p3 are the offsets for parameters to be passed to the 35*0Sstevel@tonic-gate # underlying calls. 36*0Sstevel@tonic-gate 37*0Sstevel@tonic-gate &function_begin_B($name,""); 38*0Sstevel@tonic-gate &comment(""); 39*0Sstevel@tonic-gate 40*0Sstevel@tonic-gate $in="esi"; 41*0Sstevel@tonic-gate $out="edi"; 42*0Sstevel@tonic-gate $count="ebp"; 43*0Sstevel@tonic-gate 44*0Sstevel@tonic-gate &push("ebp"); 45*0Sstevel@tonic-gate &push("ebx"); 46*0Sstevel@tonic-gate &push("esi"); 47*0Sstevel@tonic-gate &push("edi"); 48*0Sstevel@tonic-gate 49*0Sstevel@tonic-gate $data_off=4; 50*0Sstevel@tonic-gate $data_off+=4 if ($p1 > 0); 51*0Sstevel@tonic-gate $data_off+=4 if ($p2 > 0); 52*0Sstevel@tonic-gate $data_off+=4 if ($p3 > 0); 53*0Sstevel@tonic-gate 54*0Sstevel@tonic-gate &mov($count, &wparam(2)); # length 55*0Sstevel@tonic-gate 56*0Sstevel@tonic-gate &comment("getting iv ptr from parameter $iv_off"); 57*0Sstevel@tonic-gate &mov("ebx", &wparam($iv_off)); # Get iv ptr 58*0Sstevel@tonic-gate 59*0Sstevel@tonic-gate &mov($in, &DWP(0,"ebx","",0));# iv[0] 60*0Sstevel@tonic-gate &mov($out, &DWP(4,"ebx","",0));# iv[1] 61*0Sstevel@tonic-gate 62*0Sstevel@tonic-gate &push($out); 63*0Sstevel@tonic-gate &push($in); 64*0Sstevel@tonic-gate &push($out); # used in decrypt for iv[1] 65*0Sstevel@tonic-gate &push($in); # used in decrypt for iv[0] 66*0Sstevel@tonic-gate 67*0Sstevel@tonic-gate &mov("ebx", "esp"); # This is the address of tin[2] 68*0Sstevel@tonic-gate 69*0Sstevel@tonic-gate &mov($in, &wparam(0)); # in 70*0Sstevel@tonic-gate &mov($out, &wparam(1)); # out 71*0Sstevel@tonic-gate 72*0Sstevel@tonic-gate # We have loaded them all, how lets push things 73*0Sstevel@tonic-gate &comment("getting encrypt flag from parameter $enc_off"); 74*0Sstevel@tonic-gate &mov("ecx", &wparam($enc_off)); # Get enc flag 75*0Sstevel@tonic-gate if ($p3 > 0) 76*0Sstevel@tonic-gate { 77*0Sstevel@tonic-gate &comment("get and push parameter $p3"); 78*0Sstevel@tonic-gate if ($enc_off != $p3) 79*0Sstevel@tonic-gate { &mov("eax", &wparam($p3)); &push("eax"); } 80*0Sstevel@tonic-gate else { &push("ecx"); } 81*0Sstevel@tonic-gate } 82*0Sstevel@tonic-gate if ($p2 > 0) 83*0Sstevel@tonic-gate { 84*0Sstevel@tonic-gate &comment("get and push parameter $p2"); 85*0Sstevel@tonic-gate if ($enc_off != $p2) 86*0Sstevel@tonic-gate { &mov("eax", &wparam($p2)); &push("eax"); } 87*0Sstevel@tonic-gate else { &push("ecx"); } 88*0Sstevel@tonic-gate } 89*0Sstevel@tonic-gate if ($p1 > 0) 90*0Sstevel@tonic-gate { 91*0Sstevel@tonic-gate &comment("get and push parameter $p1"); 92*0Sstevel@tonic-gate if ($enc_off != $p1) 93*0Sstevel@tonic-gate { &mov("eax", &wparam($p1)); &push("eax"); } 94*0Sstevel@tonic-gate else { &push("ecx"); } 95*0Sstevel@tonic-gate } 96*0Sstevel@tonic-gate &push("ebx"); # push data/iv 97*0Sstevel@tonic-gate 98*0Sstevel@tonic-gate &cmp("ecx",0); 99*0Sstevel@tonic-gate &jz(&label("decrypt")); 100*0Sstevel@tonic-gate 101*0Sstevel@tonic-gate &and($count,0xfffffff8); 102*0Sstevel@tonic-gate &mov("eax", &DWP($data_off,"esp","",0)); # load iv[0] 103*0Sstevel@tonic-gate &mov("ebx", &DWP($data_off+4,"esp","",0)); # load iv[1] 104*0Sstevel@tonic-gate 105*0Sstevel@tonic-gate &jz(&label("encrypt_finish")); 106*0Sstevel@tonic-gate 107*0Sstevel@tonic-gate ############################################################# 108*0Sstevel@tonic-gate 109*0Sstevel@tonic-gate &set_label("encrypt_loop"); 110*0Sstevel@tonic-gate # encrypt start 111*0Sstevel@tonic-gate # "eax" and "ebx" hold iv (or the last cipher text) 112*0Sstevel@tonic-gate 113*0Sstevel@tonic-gate &mov("ecx", &DWP(0,$in,"",0)); # load first 4 bytes 114*0Sstevel@tonic-gate &mov("edx", &DWP(4,$in,"",0)); # second 4 bytes 115*0Sstevel@tonic-gate 116*0Sstevel@tonic-gate &xor("eax", "ecx"); 117*0Sstevel@tonic-gate &xor("ebx", "edx"); 118*0Sstevel@tonic-gate 119*0Sstevel@tonic-gate &bswap("eax") if $swap; 120*0Sstevel@tonic-gate &bswap("ebx") if $swap; 121*0Sstevel@tonic-gate 122*0Sstevel@tonic-gate &mov(&DWP($data_off,"esp","",0), "eax"); # put in array for call 123*0Sstevel@tonic-gate &mov(&DWP($data_off+4,"esp","",0), "ebx"); # 124*0Sstevel@tonic-gate 125*0Sstevel@tonic-gate &call($enc_func); 126*0Sstevel@tonic-gate 127*0Sstevel@tonic-gate &mov("eax", &DWP($data_off,"esp","",0)); 128*0Sstevel@tonic-gate &mov("ebx", &DWP($data_off+4,"esp","",0)); 129*0Sstevel@tonic-gate 130*0Sstevel@tonic-gate &bswap("eax") if $swap; 131*0Sstevel@tonic-gate &bswap("ebx") if $swap; 132*0Sstevel@tonic-gate 133*0Sstevel@tonic-gate &mov(&DWP(0,$out,"",0),"eax"); 134*0Sstevel@tonic-gate &mov(&DWP(4,$out,"",0),"ebx"); 135*0Sstevel@tonic-gate 136*0Sstevel@tonic-gate # eax and ebx are the next iv. 137*0Sstevel@tonic-gate 138*0Sstevel@tonic-gate &add($in, 8); 139*0Sstevel@tonic-gate &add($out, 8); 140*0Sstevel@tonic-gate 141*0Sstevel@tonic-gate &sub($count, 8); 142*0Sstevel@tonic-gate &jnz(&label("encrypt_loop")); 143*0Sstevel@tonic-gate 144*0Sstevel@tonic-gate###################################################################3 145*0Sstevel@tonic-gate &set_label("encrypt_finish"); 146*0Sstevel@tonic-gate &mov($count, &wparam(2)); # length 147*0Sstevel@tonic-gate &and($count, 7); 148*0Sstevel@tonic-gate &jz(&label("finish")); 149*0Sstevel@tonic-gate &call(&label("PIC_point")); 150*0Sstevel@tonic-gate&set_label("PIC_point"); 151*0Sstevel@tonic-gate &blindpop("edx"); 152*0Sstevel@tonic-gate &lea("ecx",&DWP(&label("cbc_enc_jmp_table")."-".&label("PIC_point"),"edx")); 153*0Sstevel@tonic-gate &mov($count,&DWP(0,"ecx",$count,4)) 154*0Sstevel@tonic-gate &add($count,"edx"); 155*0Sstevel@tonic-gate &xor("ecx","ecx"); 156*0Sstevel@tonic-gate &xor("edx","edx"); 157*0Sstevel@tonic-gate #&mov($count,&DWP(&label("cbc_enc_jmp_table"),"",$count,4)); 158*0Sstevel@tonic-gate &jmp_ptr($count); 159*0Sstevel@tonic-gate 160*0Sstevel@tonic-gate&set_label("ej7"); 161*0Sstevel@tonic-gate &xor("edx", "edx") if $ppro; # ppro friendly 162*0Sstevel@tonic-gate &movb(&HB("edx"), &BP(6,$in,"",0)); 163*0Sstevel@tonic-gate &shl("edx",8); 164*0Sstevel@tonic-gate&set_label("ej6"); 165*0Sstevel@tonic-gate &movb(&HB("edx"), &BP(5,$in,"",0)); 166*0Sstevel@tonic-gate&set_label("ej5"); 167*0Sstevel@tonic-gate &movb(&LB("edx"), &BP(4,$in,"",0)); 168*0Sstevel@tonic-gate&set_label("ej4"); 169*0Sstevel@tonic-gate &mov("ecx", &DWP(0,$in,"",0)); 170*0Sstevel@tonic-gate &jmp(&label("ejend")); 171*0Sstevel@tonic-gate&set_label("ej3"); 172*0Sstevel@tonic-gate &movb(&HB("ecx"), &BP(2,$in,"",0)); 173*0Sstevel@tonic-gate &xor("ecx", "ecx") if $ppro; # ppro friendly 174*0Sstevel@tonic-gate &shl("ecx",8); 175*0Sstevel@tonic-gate&set_label("ej2"); 176*0Sstevel@tonic-gate &movb(&HB("ecx"), &BP(1,$in,"",0)); 177*0Sstevel@tonic-gate&set_label("ej1"); 178*0Sstevel@tonic-gate &movb(&LB("ecx"), &BP(0,$in,"",0)); 179*0Sstevel@tonic-gate&set_label("ejend"); 180*0Sstevel@tonic-gate 181*0Sstevel@tonic-gate &xor("eax", "ecx"); 182*0Sstevel@tonic-gate &xor("ebx", "edx"); 183*0Sstevel@tonic-gate 184*0Sstevel@tonic-gate &bswap("eax") if $swap; 185*0Sstevel@tonic-gate &bswap("ebx") if $swap; 186*0Sstevel@tonic-gate 187*0Sstevel@tonic-gate &mov(&DWP($data_off,"esp","",0), "eax"); # put in array for call 188*0Sstevel@tonic-gate &mov(&DWP($data_off+4,"esp","",0), "ebx"); # 189*0Sstevel@tonic-gate 190*0Sstevel@tonic-gate &call($enc_func); 191*0Sstevel@tonic-gate 192*0Sstevel@tonic-gate &mov("eax", &DWP($data_off,"esp","",0)); 193*0Sstevel@tonic-gate &mov("ebx", &DWP($data_off+4,"esp","",0)); 194*0Sstevel@tonic-gate 195*0Sstevel@tonic-gate &bswap("eax") if $swap; 196*0Sstevel@tonic-gate &bswap("ebx") if $swap; 197*0Sstevel@tonic-gate 198*0Sstevel@tonic-gate &mov(&DWP(0,$out,"",0),"eax"); 199*0Sstevel@tonic-gate &mov(&DWP(4,$out,"",0),"ebx"); 200*0Sstevel@tonic-gate 201*0Sstevel@tonic-gate &jmp(&label("finish")); 202*0Sstevel@tonic-gate 203*0Sstevel@tonic-gate ############################################################# 204*0Sstevel@tonic-gate ############################################################# 205*0Sstevel@tonic-gate &set_label("decrypt",1); 206*0Sstevel@tonic-gate # decrypt start 207*0Sstevel@tonic-gate &and($count,0xfffffff8); 208*0Sstevel@tonic-gate # The next 2 instructions are only for if the jz is taken 209*0Sstevel@tonic-gate &mov("eax", &DWP($data_off+8,"esp","",0)); # get iv[0] 210*0Sstevel@tonic-gate &mov("ebx", &DWP($data_off+12,"esp","",0)); # get iv[1] 211*0Sstevel@tonic-gate &jz(&label("decrypt_finish")); 212*0Sstevel@tonic-gate 213*0Sstevel@tonic-gate &set_label("decrypt_loop"); 214*0Sstevel@tonic-gate &mov("eax", &DWP(0,$in,"",0)); # load first 4 bytes 215*0Sstevel@tonic-gate &mov("ebx", &DWP(4,$in,"",0)); # second 4 bytes 216*0Sstevel@tonic-gate 217*0Sstevel@tonic-gate &bswap("eax") if $swap; 218*0Sstevel@tonic-gate &bswap("ebx") if $swap; 219*0Sstevel@tonic-gate 220*0Sstevel@tonic-gate &mov(&DWP($data_off,"esp","",0), "eax"); # put back 221*0Sstevel@tonic-gate &mov(&DWP($data_off+4,"esp","",0), "ebx"); # 222*0Sstevel@tonic-gate 223*0Sstevel@tonic-gate &call($dec_func); 224*0Sstevel@tonic-gate 225*0Sstevel@tonic-gate &mov("eax", &DWP($data_off,"esp","",0)); # get return 226*0Sstevel@tonic-gate &mov("ebx", &DWP($data_off+4,"esp","",0)); # 227*0Sstevel@tonic-gate 228*0Sstevel@tonic-gate &bswap("eax") if $swap; 229*0Sstevel@tonic-gate &bswap("ebx") if $swap; 230*0Sstevel@tonic-gate 231*0Sstevel@tonic-gate &mov("ecx", &DWP($data_off+8,"esp","",0)); # get iv[0] 232*0Sstevel@tonic-gate &mov("edx", &DWP($data_off+12,"esp","",0)); # get iv[1] 233*0Sstevel@tonic-gate 234*0Sstevel@tonic-gate &xor("ecx", "eax"); 235*0Sstevel@tonic-gate &xor("edx", "ebx"); 236*0Sstevel@tonic-gate 237*0Sstevel@tonic-gate &mov("eax", &DWP(0,$in,"",0)); # get old cipher text, 238*0Sstevel@tonic-gate &mov("ebx", &DWP(4,$in,"",0)); # next iv actually 239*0Sstevel@tonic-gate 240*0Sstevel@tonic-gate &mov(&DWP(0,$out,"",0),"ecx"); 241*0Sstevel@tonic-gate &mov(&DWP(4,$out,"",0),"edx"); 242*0Sstevel@tonic-gate 243*0Sstevel@tonic-gate &mov(&DWP($data_off+8,"esp","",0), "eax"); # save iv 244*0Sstevel@tonic-gate &mov(&DWP($data_off+12,"esp","",0), "ebx"); # 245*0Sstevel@tonic-gate 246*0Sstevel@tonic-gate &add($in, 8); 247*0Sstevel@tonic-gate &add($out, 8); 248*0Sstevel@tonic-gate 249*0Sstevel@tonic-gate &sub($count, 8); 250*0Sstevel@tonic-gate &jnz(&label("decrypt_loop")); 251*0Sstevel@tonic-gate############################ ENDIT #######################3 252*0Sstevel@tonic-gate &set_label("decrypt_finish"); 253*0Sstevel@tonic-gate &mov($count, &wparam(2)); # length 254*0Sstevel@tonic-gate &and($count, 7); 255*0Sstevel@tonic-gate &jz(&label("finish")); 256*0Sstevel@tonic-gate 257*0Sstevel@tonic-gate &mov("eax", &DWP(0,$in,"",0)); # load first 4 bytes 258*0Sstevel@tonic-gate &mov("ebx", &DWP(4,$in,"",0)); # second 4 bytes 259*0Sstevel@tonic-gate 260*0Sstevel@tonic-gate &bswap("eax") if $swap; 261*0Sstevel@tonic-gate &bswap("ebx") if $swap; 262*0Sstevel@tonic-gate 263*0Sstevel@tonic-gate &mov(&DWP($data_off,"esp","",0), "eax"); # put back 264*0Sstevel@tonic-gate &mov(&DWP($data_off+4,"esp","",0), "ebx"); # 265*0Sstevel@tonic-gate 266*0Sstevel@tonic-gate &call($dec_func); 267*0Sstevel@tonic-gate 268*0Sstevel@tonic-gate &mov("eax", &DWP($data_off,"esp","",0)); # get return 269*0Sstevel@tonic-gate &mov("ebx", &DWP($data_off+4,"esp","",0)); # 270*0Sstevel@tonic-gate 271*0Sstevel@tonic-gate &bswap("eax") if $swap; 272*0Sstevel@tonic-gate &bswap("ebx") if $swap; 273*0Sstevel@tonic-gate 274*0Sstevel@tonic-gate &mov("ecx", &DWP($data_off+8,"esp","",0)); # get iv[0] 275*0Sstevel@tonic-gate &mov("edx", &DWP($data_off+12,"esp","",0)); # get iv[1] 276*0Sstevel@tonic-gate 277*0Sstevel@tonic-gate &xor("ecx", "eax"); 278*0Sstevel@tonic-gate &xor("edx", "ebx"); 279*0Sstevel@tonic-gate 280*0Sstevel@tonic-gate # this is for when we exit 281*0Sstevel@tonic-gate &mov("eax", &DWP(0,$in,"",0)); # get old cipher text, 282*0Sstevel@tonic-gate &mov("ebx", &DWP(4,$in,"",0)); # next iv actually 283*0Sstevel@tonic-gate 284*0Sstevel@tonic-gate&set_label("dj7"); 285*0Sstevel@tonic-gate &rotr("edx", 16); 286*0Sstevel@tonic-gate &movb(&BP(6,$out,"",0), &LB("edx")); 287*0Sstevel@tonic-gate &shr("edx",16); 288*0Sstevel@tonic-gate&set_label("dj6"); 289*0Sstevel@tonic-gate &movb(&BP(5,$out,"",0), &HB("edx")); 290*0Sstevel@tonic-gate&set_label("dj5"); 291*0Sstevel@tonic-gate &movb(&BP(4,$out,"",0), &LB("edx")); 292*0Sstevel@tonic-gate&set_label("dj4"); 293*0Sstevel@tonic-gate &mov(&DWP(0,$out,"",0), "ecx"); 294*0Sstevel@tonic-gate &jmp(&label("djend")); 295*0Sstevel@tonic-gate&set_label("dj3"); 296*0Sstevel@tonic-gate &rotr("ecx", 16); 297*0Sstevel@tonic-gate &movb(&BP(2,$out,"",0), &LB("ecx")); 298*0Sstevel@tonic-gate &shl("ecx",16); 299*0Sstevel@tonic-gate&set_label("dj2"); 300*0Sstevel@tonic-gate &movb(&BP(1,$in,"",0), &HB("ecx")); 301*0Sstevel@tonic-gate&set_label("dj1"); 302*0Sstevel@tonic-gate &movb(&BP(0,$in,"",0), &LB("ecx")); 303*0Sstevel@tonic-gate&set_label("djend"); 304*0Sstevel@tonic-gate 305*0Sstevel@tonic-gate # final iv is still in eax:ebx 306*0Sstevel@tonic-gate &jmp(&label("finish")); 307*0Sstevel@tonic-gate 308*0Sstevel@tonic-gate 309*0Sstevel@tonic-gate############################ FINISH #######################3 310*0Sstevel@tonic-gate &set_label("finish",1); 311*0Sstevel@tonic-gate &mov("ecx", &wparam($iv_off)); # Get iv ptr 312*0Sstevel@tonic-gate 313*0Sstevel@tonic-gate ################################################# 314*0Sstevel@tonic-gate $total=16+4; 315*0Sstevel@tonic-gate $total+=4 if ($p1 > 0); 316*0Sstevel@tonic-gate $total+=4 if ($p2 > 0); 317*0Sstevel@tonic-gate $total+=4 if ($p3 > 0); 318*0Sstevel@tonic-gate &add("esp",$total); 319*0Sstevel@tonic-gate 320*0Sstevel@tonic-gate &mov(&DWP(0,"ecx","",0), "eax"); # save iv 321*0Sstevel@tonic-gate &mov(&DWP(4,"ecx","",0), "ebx"); # save iv 322*0Sstevel@tonic-gate 323*0Sstevel@tonic-gate &function_end_A($name); 324*0Sstevel@tonic-gate 325*0Sstevel@tonic-gate &set_label("cbc_enc_jmp_table",1); 326*0Sstevel@tonic-gate &data_word("0"); 327*0Sstevel@tonic-gate &data_word(&label("ej1")."-".&label("PIC_point")); 328*0Sstevel@tonic-gate &data_word(&label("ej2")."-".&label("PIC_point")); 329*0Sstevel@tonic-gate &data_word(&label("ej3")."-".&label("PIC_point")); 330*0Sstevel@tonic-gate &data_word(&label("ej4")."-".&label("PIC_point")); 331*0Sstevel@tonic-gate &data_word(&label("ej5")."-".&label("PIC_point")); 332*0Sstevel@tonic-gate &data_word(&label("ej6")."-".&label("PIC_point")); 333*0Sstevel@tonic-gate &data_word(&label("ej7")."-".&label("PIC_point")); 334*0Sstevel@tonic-gate # not used 335*0Sstevel@tonic-gate #&set_label("cbc_dec_jmp_table",1); 336*0Sstevel@tonic-gate #&data_word("0"); 337*0Sstevel@tonic-gate #&data_word(&label("dj1")."-".&label("PIC_point")); 338*0Sstevel@tonic-gate #&data_word(&label("dj2")."-".&label("PIC_point")); 339*0Sstevel@tonic-gate #&data_word(&label("dj3")."-".&label("PIC_point")); 340*0Sstevel@tonic-gate #&data_word(&label("dj4")."-".&label("PIC_point")); 341*0Sstevel@tonic-gate #&data_word(&label("dj5")."-".&label("PIC_point")); 342*0Sstevel@tonic-gate #&data_word(&label("dj6")."-".&label("PIC_point")); 343*0Sstevel@tonic-gate #&data_word(&label("dj7")."-".&label("PIC_point")); 344*0Sstevel@tonic-gate 345*0Sstevel@tonic-gate &function_end_B($name); 346*0Sstevel@tonic-gate 347*0Sstevel@tonic-gate } 348*0Sstevel@tonic-gate 349*0Sstevel@tonic-gate1; 350