int WPSRegistrar::AskForPin() { if (g_regProtocol.UseStaticPIN()) { // in this mode, use static PIN value known to Registrar already return SendM2(); } printf("\n*********\nThe Device should be displaying its PIN. Please enter it now: "); unsigned long pin; int res = scanf("%u",&pin); if (res == 1 && pin < 100000000 && g_regProtocol.ValidateChecksum(pin)) { // okay SetPIN(pin); return SendM2(); } else { printf("Invalid PIN number entered %d\n",pin); return(init); } }
jint __MIX_PREFIX_FUNC_PASTE(MIX_PREFIX_UPAPI_FUNC,SetPIN(JNIEnv* env, jobject javaThis, jstring str_pwd_ori, jstring str_pwd_new, jint i_usr_type)) { if(!str_pwd_ori) { setLastErrInfo(EStateErrorInvalidArg); return EStateErrorInvalidArg; } if(!str_pwd_new) { setLastErrInfo(EStateErrorInvalidArg); return EStateErrorInvalidArg; } return (jint)SetPIN( (* env)->GetStringUTFChars(env, str_pwd_ori, 0), (* env)->GetStringUTFChars(env, str_pwd_new, 0) ,(int)i_usr_type); }
//Funcion con maquina de estados int DHT_Mde(void){ static uint8_t estado=0; static uint8_t byte[5]; static uint8_t i=0,j=7;//i recorre los bytes y j los bits de cada byte uint8_t neg=0; uint16_t checkmio=0; uint16_t hume=0,temp=0,check; uint16_t ent_temp,dec_temp,ent_hume,dec_hume; //partes enteras y partes decimales switch(estado){ case 0: SetDIR (DHT_DATA , SALIDA); //LO HAGO SALIDA SetPIN(DHT_DATA,0); TmrStartM(EVENTOM1,TM1);//ARRANCO TIMER QUE ESPERA 25ms estado=1; break; case 1: if(VencioESPERA25ms){ SetPIN(DHT_DATA,1); //PONGO UN UNO A LA SALIDA TmrStartM(EVENTOM2,TM2);//ARRANCO TIMER QUE espera 30us estado=2; } break; case 2: if(VencioESPERA30us){ SetDIR (DHT_DATA , ENTRADA);//LO HAGO ENTRADA TmrStartM(EVENTOM3,TM3);//ARRANCO TIMER QUE espera 20us estado=3; } break; case 3: if(VencioESPERA20us){ TmrStartM(EVENTOM4,TM4);//ARRANCA MI TIMEOUT de 0,5s estado=4; } break; case 4: //Primero espero un uno... if(GetPIN(DHT_DATA,1)) { estado=5; TmrStopM(EVENTOM4);//paro el timer 0,5s TmrStartM(EVENTOM4,TM4);//lo reinicio a 0,5s }//termina el 0 de 80us if(VENCIOTimeout)//sigo esperando o ya paso el tiempo? { estado=0; flagLeerMensajeNuevo=0;//termino lectura return 1; //DEVUELVO ERROR } break; case 5: if(GetPIN(DHT_DATA,0)) //espero un 0 { estado=7; //tengo q ir esperar el 1 TmrStopM(EVENTOM4);//paro el timer 0,5s }//termina el 1 de 80us if(VENCIOTimeout)//sigo esperando o ya paso el tiempo? { estado=0; flagLeerMensajeNuevo=0;//termino lectura return 1; //DEVUELVO ERROR } break; case 6: //espera un 0 if(GetPIN(DHT_DATA,0)) { estado=7; } if(VENCIOTimeout)//sigo esperando o ya paso el tiempo? { estado=0; flagLeerMensajeNuevo=0;//termino lectura return 1; //DEVUELVO ERROR } break; case 7: //espero un 1 if(GetPIN(DHT_DATA,1)) { estado=8; TmrStartM(EVENTOM5,TM5);//ARRANCA TIMER QUE espera 40us } //llego el 1 de transmision if(VENCIOTimeout)//sigo esperando o ya paso el tiempo? { estado=0; flagLeerMensajeNuevo=0;//termino lectura return 1; //DEVUELVO ERROR } break; case 8: if(VencioESPERA40us){ if(GetPIN(DHT_DATA,1)) { byte[i]|=(uint8_t)0x01<<j;//pongo un uno en la posicion estado=6; //espero q se haga cero TmrStartM(EVENTOM4,TM4);//lo reinicio a 0,5s } else{ //la lectura fue un 0, espero al proximo 1 estado=7; TmrStartM(EVENTOM4,TM4);//lo reinicio a 0,5s } j--; if(j>7) //era 0 y ahora hizo overflow { i++; j=7; if(i==5){ estado=9; //termino la lectura de los 5 bytes } } } break; case 9: checkmio=byte[0]+byte[1]+byte[2]+byte[3]; checkmio&=0x00ff; //anido los datos hume=byte[0]; hume=hume<<8; hume|=byte[1]; temp=byte[2]; temp=temp<<8; temp|=byte[3]; check=byte[4]; //checkeo si lo que me llego es correcto if(checkmio!=check) { estado=0; flagLeerMensajeNuevo=0;//termino lectura return 1; //suma incorrecta } //datos correctamente recibidos //estan en hume y temp // checkeo si la temperatura es negativa if(temp & 0x8000)//si esto es verdad es negativa { neg=1;//activo un flag temp=temp & 0x7FFF;//le saco el uno del bit mas significativo que indica negatividad } //decodifico la información dec_temp=temp%10; ent_temp=temp/10; dec_hume=hume%10; ent_hume=hume/10; //La coloco en el buffer que manipularán otras funciones: Humestring[6] = '\0';//para que puea ser manipulado como string Humestring[5] = 'H'; Humestring[4] = ' '; Humestring[3] = '0'+dec_hume; Humestring[2] = ','; for (i=1;i>=0 && i<=1;i--) { Humestring[i]='0'+ent_hume%10; ent_hume=ent_hume/10; } Tempstring[7] = '\0';//para que puea ser manipulado como string Tempstring[6] = 'C'; Tempstring[5] = ' '; Tempstring[4] = '0'+dec_temp; Tempstring[3] = ','; for (i=2;i>=1 && i<=2;i--) { Tempstring[i]='0'+ent_temp%10; ent_temp=ent_temp/10; } if(neg==1)//si es negativo le agrego un menos { Tempstring[0]='-'; } else{ Tempstring[0]=' ';//si es positivo dejo un espacio } estado=0; //para la proxima vez que entre i=0; j=7; byte[0]=byte[1]=byte[2]=byte[3]=byte[4]=0; flagLeerMensajeNuevo=0;//termino la lectura break; } return 0; //lectura correcta por el momento }
void EINT0_IRQHandler(void) { EXTINT = 0x0F; SetPIN(PORT0,28,0); }
uint8_t TecladoHW (void) { uint8_t Codigo = NO_KEY; SetPIN(FILA0, ON); SetPIN(FILA1, OFF); SetPIN(FILA2, OFF); SetPIN(FILA3, OFF); SetPIN(FILA0, ON); SetPIN(FILA1, OFF); SetPIN(FILA2, OFF); SetPIN(FILA3, OFF); SetPIN(FILA0, ON); SetPIN(FILA1, OFF); SetPIN(FILA2, OFF); SetPIN(FILA3, OFF); if ( GetPIN(COLUMNA0, ACTIVO_ALTO) ) return SW4; if ( GetPIN(COLUMNA1, ACTIVO_ALTO) ) return SW5; SetPIN(FILA0, OFF); SetPIN(FILA1, ON); SetPIN(FILA2, OFF); SetPIN(FILA3, OFF); SetPIN(FILA0, OFF); SetPIN(FILA1, ON); SetPIN(FILA2, OFF); SetPIN(FILA3, OFF); SetPIN(FILA0, OFF); SetPIN(FILA1, ON); SetPIN(FILA2, OFF); SetPIN(FILA3, OFF); if ( GetPIN(COLUMNA0, ACTIVO_ALTO) ) return SW1; if ( GetPIN(COLUMNA1, ACTIVO_ALTO) ) return SW8; SetPIN(FILA0, OFF); SetPIN(FILA1, OFF); SetPIN(FILA2, ON); SetPIN(FILA3, OFF); SetPIN(FILA0, OFF); SetPIN(FILA1, OFF); SetPIN(FILA2, ON); SetPIN(FILA3, OFF); SetPIN(FILA0, OFF); SetPIN(FILA1, OFF); SetPIN(FILA2, ON); SetPIN(FILA3, OFF); if ( GetPIN(COLUMNA0, ACTIVO_ALTO) ) return SW3; if ( GetPIN(COLUMNA1, ACTIVO_ALTO) ) return SW6; SetPIN(FILA0, OFF); SetPIN(FILA1, OFF); SetPIN(FILA2, OFF); SetPIN(FILA3, ON); SetPIN(FILA0, OFF); SetPIN(FILA1, OFF); SetPIN(FILA2, OFF); SetPIN(FILA3, ON); SetPIN(FILA0, OFF); SetPIN(FILA1, OFF); SetPIN(FILA2, OFF); SetPIN(FILA3, ON); if ( GetPIN(COLUMNA0, ACTIVO_ALTO) ) return SW2; if ( GetPIN(COLUMNA1, ACTIVO_ALTO) ) return SW7; if ( GetPIN(KEY3, ACTIVO_BAJO) ) if ( GetPIN(KEY3, ACTIVO_BAJO) ) if ( GetPIN(KEY3, ACTIVO_BAJO) ) return SW9; if ( GetPIN(KEY2, ACTIVO_BAJO) ) if ( GetPIN(KEY2, ACTIVO_BAJO) ) if ( GetPIN(KEY2, ACTIVO_BAJO) ) return SW10; if ( GetPIN(KEY1, ACTIVO_BAJO) ) if ( GetPIN(KEY1, ACTIVO_BAJO) ) if ( GetPIN(KEY1, ACTIVO_BAJO) ) return SW11; if ( GetPIN(KEY0, ACTIVO_BAJO) ) if ( GetPIN(KEY0, ACTIVO_BAJO) ) if ( GetPIN(KEY0, ACTIVO_BAJO) ) return SW12; return Codigo; }
int main() { int ulRet = 0; char data_value[2048] = {0}; int data_len = 2048; char szDBPath [1024] = {0}; int i = 0; int j = 0; unsigned char dataKey[16]; unsigned char keyIV[10]; unsigned char input[48] ; unsigned char output[33]; unsigned char output1[33]; unsigned int outputlen = 1024, outputlen1 = 1024; int keyPairCnt = 0; //for (i = 0; i < 16;i++) //{ // dataKey[i] = i; //} //for (i = 0; i < 10;i++) //{ // keyIV[i] = i; //} //funcddd((unsigned char *)"MHgCIGujeBGA0OXGoh1WYU7LKorsgKoiHqDQMn4ih1elxxDuAiB89t9D1kA4y95TThSBSjdZTMyToc1JBMMbj+r+yi9u6AQgIuMHlcX/N7mKvOfvU6jcYEeO9E+CM34VVQSQd7T1+MMEEIBRaH9mAh7qTuOPDVIrY14=",strlen("MHgCIGujeBGA0OXGoh1WYU7LKorsgKoiHqDQMn4ih1elxxDuAiB89t9D1kA4y95TThSBSjdZTMyToc1JBMMbj+r+yi9u6AQgIuMHlcX/N7mKvOfvU6jcYEeO9E+CM34VVQSQd7T1+MMEEIBRaH9mAh7qTuOPDVIrY14=")); //funcddd(0,1); strcpy((char *)input, "work hard"); //cryptoWithSeckey(dataKey,sizeof(dataKey), // keyIV,sizeof(keyIV), // 0x00001082,0, // input,48, // output,&outputlen); //outputlen = 1024; //cryptoWithSeckey(dataKey,sizeof(dataKey), // keyIV,sizeof(keyIV), // 0x00001082,1, // output,48, // output1,&outputlen1); setLicense("1","1"); setSystemDBDir("d:/nss_db"); for(i; i < 1000000; i++) { sprintf(szDBPath, "%s%d/", "d:/nss_db/", i); if( _mkdir(szDBPath) == 0 ) { if (0 == i % 1) { printf("mkdir %s OK\n", szDBPath); } } else { printf("mkdir %s ERR\n", szDBPath); } setSystemDBDir(szDBPath); ulRet = verifyPIN("","12345678", 0); //{ // int certCnt; // char nickname[255] = {0}; // char buffer[1024*4]; // ulRet = filterCert(&certCnt,"","","",0,0); // getCertNickName(nickname, 0); // ulRet = filterCert(&certCnt,"","","",0,0); // ulRet = encryptMessage(buffer, "abc","SM3",1); // ulRet = decryptMessage(buffer, buffer,"SM3",1); // ulRet = signMessage(buffer, "abc",0,"SM3",0); // ulRet = verifyMessage("abc",buffer,0,"SM3",0); // certCnt = 1; //} //ulRet = InitPIN("0Mozilla", "0Mozilla"); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = InitPIN("0Mozilla", "0Mozilla"); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); //ulRet = verifyPIN("","0Mozilla1", 0); if (0 == ulRet) { } else if (3 != ulRet) { printf("%s err\n", "verifyPIN"); break; } else { #if defined(PKCS11_USE_SO_PIN) ulRet = SetPIN("","12345678",0); if (ulRet) { printf("%s err\n", "SetPIN"); break; } ulRet = InitPIN("12345678", "12345678"); if (ulRet) { printf("%s err\n", "InitPIN"); break; } #else ulRet = changePIN("", "", "0Mozilla"); if (ulRet) { printf("%s err\n", "InitPIN"); break; } #endif } for( j = 0; j < 1; j++) { // 0 ulRet = verifyPIN("","12345678", 0); if (ulRet) { printf("%s err\n", "verifyPIN"); break; } //test_process("0Mozilla", 1); { char * tt = "MIIB0zCCAXigAwIBAgICNTUwCgYIKoEcz1UBg3UwEzERMA8GA1UEAx4Ilj9lr4SCgqwwHhcNMTYwNjIwMTA0NzE0WhcNMTYwNzEwMTA0NzE0WjBSMQ4wDAYDVQQKEwV0cnVzdDEOMAwGA1UECxMFdHJ1c3QxHzAdBgkqhkiG9w0BCQEWEDI0NDU0MDQ5OUBxcS5jb20xDzANBgNVBAMMBsDux7/HvzBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABKfvhpW55Z/E4DIA+sUof7EeVUkZJuI5DDSrdG4Zf7LaCDEzBb8CJ0Gvlls0OxkoPGIS4ECKMrBpodjjcX7HWyijfTB7MA8GA1UdEwEB/wQFMAMCAQEwHQYDVR0OBBYEFJ0dh7sd1NP3L0/mVZLC1687ww6tMDwGA1UdIwQ1MDOAFPWFFozl/60F0a0Vw5b/98Fz4bTToRekFTATMREwDwYDVQQDHgiWP2WvhIKCrIICRkYwCwYDVR0PBAQDAgbAMAoGCCqBHM9VAYN1A0kAMEYCIQCmJIXfnVUYW2WdP1SwZeeUAVXDnORKoppe1dBudKTaOAIhAIbeAZ+ndEPRAr6hQDhjYIAz4gnFPM28DOP/gxUTPgk0"; int certCnt; char nickname[255] = {0}; char * filepw = "12345678"; char * filename = "sm2.pfx"; char buffer[1024*4]; char pfxBuffer[1024*4]; int pfxBufferLen = 1024*4; FILE_READ("","SN-100000100000004.pfx",pfxBuffer,&pfxBufferLen); //importCert(0,tt); //ulRet = filterCert(&certCnt,"","","",0,0); ulRet = filterCert(&certCnt,"","","",0,0); getCertNickName(nickname, 0); //ulRet = FilePfxExport_main(pfxBuffer,&pfxBufferLen,filepw,nickname,NULL); //FILE_WRITE("","ppk.pfx",pfxBuffer,pfxBufferLen); ulRet = FilePfxImport_main(pfxBuffer, pfxBufferLen,filepw,nickname,NULL); ulRet = filterCert(&certCnt,"","","",0,0); ulRet = encryptMessage(buffer, "abc","SM3",1); ulRet = decryptMessage(buffer, buffer,"SM3",1); ulRet = signMessage(buffer, "abc",0,"SM3",0); ulRet = verifyMessage("abc",buffer,0,"SM3",0); certCnt = 1; } return 0; ulRet = genCSR( data_value, "", "李强强", "*****@*****.**", "trust", "trust", 256, "SM2"); if (ulRet) { printf("%s err\n", "genCSR"); break; } #if defined(PKCS11_USE_SO_PIN) // 1 ulRet = SetPIN("0Mozilla",szDBPath,0); if (ulRet) { printf("%s err\n", "SetPIN"); break; } ulRet = verifyPIN("","0Mozilla", 0); if (ulRet) { printf("%s err\n", "verifyPIN"); break; } ulRet = genCSR( data_value, "", "李强强", "*****@*****.**", "trust", "trust", 2048, "RSA"); if (ulRet) { printf("%s err\n", "genCSR"); break; } //2 ulRet = SetPIN("0Mozilla",szDBPath,1); if (ulRet) { printf("%s err\n", "SetPIN"); break; } ulRet = verifyPIN("",szDBPath, 0); if (ulRet) { printf("%s err\n", "verifyPIN"); break; } ulRet = genCSR( data_value, "", "李强强", "*****@*****.**", "trust", "trust", 256, "SM2"); if (ulRet) { printf("%s err\n", "genCSR"); break; } //3 ulRet = SetPIN(szDBPath, "0Mozilla",0); if (ulRet) { printf("%s err\n", "SetPIN"); break; } ulRet = verifyPIN("",szDBPath, 0); if (ulRet) { printf("%s err\n", "verifyPIN"); break; } ulRet = genCSR( data_value, "", "李强强", "*****@*****.**", "trust", "trust", 256, "SM2"); if (ulRet) { printf("%s err\n", "genCSR"); break; } //4 ulRet = InitPIN("0Mozilla","0Mozilla"); if (ulRet) { printf("%s err\n", "InitPIN"); break; } ulRet = verifyPIN("","0Mozilla", 0); if (ulRet) { printf("%s err\n", "verifyPIN"); break; } ulRet = genCSR( data_value, "", "李强强", "*****@*****.**", "trust", "trust", 256, "SM2"); if (ulRet) { printf("%s err\n", "genCSR"); break; } #else ulRet = SetPIN("0Mozilla","test",1); if (ulRet) { printf("%s err\n", "SetPIN"); break; } ulRet = verifyPIN("","test", 0); if (ulRet) { printf("%s err\n", "verifyPIN"); break; } ulRet = genCSR( data_value, "", "李强强", "*****@*****.**", "trust", "trust", 256, "SM2"); if (ulRet) { printf("%s err\n", "genCSR"); break; } ulRet = changePIN("", "test","0Mozilla"); if (ulRet) { printf("%s err\n", "SetPIN"); break; } ulRet = verifyPIN("","0Mozilla", 0); if (ulRet) { printf("%s err\n", "verifyPIN"); break; } ulRet = genCSR( data_value, "", "李强强", "*****@*****.**", "trust", "trust", 256, "SM2"); if (ulRet) { printf("%s err\n", "genCSR"); break; } #endif printf("current j = %d\n" , j); } //ulRet = genCSR( data_value, "", "李强强", "*****@*****.**", "trust", "trust", 256, "SM2"); //ulRet = enumKeyPair(&keyPairCnt); //{ // char * digital = "MHgCIF1PHwjtpIM8tOnxvBwVXVt6xJoyAgBZqb7H4wE0SN9RAiDsiL8W8TLVmslY57rUC50tGQbq3uHIMVBy6++MrWyo0AQg/UR08eazuJPhNDfIkN3g5O18iqj1J6ekoA9pdekv0/wEEKOO0iOf0QpP7lTgnVtV0/o="; // char * iv = "hqF+O1JTu1xnOHKZsrpMmA=="; // char * key = "nGameazgInZiRHBycWzXfkH3FtzSM8FVDTn4MVRjAh+TikzDtd1K4FkPzghs58zh"; // importDEPrivateKey(0,digital,0x00001082,iv,key); //} { //char * tt = "MIICAjCCAaigAwIBAgIBATAKBggqgRzPVQGDdTArMQ0wCwYDVQQDEwRyb290MRowGAYJKoZIhvcNAQkBFgtyb290QGNhLmNvbTAeFw0xNTExMTMwNjEyMDJaFw0xNjAxMDcwNjEyMDJaMFIxDjAMBgNVBAoTBXRydXN0MQ4wDAYDVQQLEwV0cnVzdDEfMB0GCSqGSIb3DQEJARYQMjQ0NTQwNDk5QHFxLmNvbTEPMA0GA1UEAwwGwO7Hv8e/MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEzx3tRmgaUr0d0Q9NcoZQ26Srn/g3TyooA20MSiDRKgOm9HnYp4bkYbvOQki25vz5hdUV+KAR/BrLgW8474zIeqOBlTCBkjAPBgNVHRMBAf8EBTADAgEBMB0GA1UdDgQWBBSe2mE9d+LGYPimZ7Dstz5LgW6i/DBTBgNVHSMETDBKgBRT9Im/OTjF4gLZpb1RTRwYg9RhVaEvpC0wKzENMAsGA1UEAxMEcm9vdDEaMBgGCSqGSIb3DQEJARYLcm9vdEBjYS5jb22CAQEwCwYDVR0PBAQDAgbAMAoGCCqBHM9VAYN1A0gAMEUCIEaMK0VHMuWoUQZsYF8I8/J0CUEIA8zlHmLoFY5e6MFlAiEAotRlzDuUDk/b0mqjEBTagZMJxbuUToHgvFbKnAht6Xc="; //int certCnt; //char buffer[10000]; //importCert(0,tt); //ulRet = filterCert(&certCnt,"","","",0,0); //ulRet = signMessage(buffer, "abc",0,"SM3",1); //ulRet = verifyMessage("abc",buffer,0,"SM3",1); //certCnt = 1; } { //unsigned char datakey[32] = {0xC2,0x17,0x51,0x1E,0x23,0x5A,0x2A,0xCE,0x72,0x15,0xCF,0x7F,0xE6,0x26,0x7D,0xD1,0xBB,0x1C,0x57,0x21,0x4A,0xC9,0x8A,0xFF,0x34,0x68,0x02,0xEC,0x28,0x68,0xDC,0xF3}; //ulRet = importSM2PrivateKey(datakey, 32); } if (0 == i%1) { unsigned char in_value[32] = {0}; unsigned int in_len = 32; unsigned int out_len = 256; unsigned char out_value[256] = {0}; int certID = 0; char nickname[100] = {0}; memcpy(in_value,"112233445566", 12); ulRet = enumKeyPair(&keyPairCnt); if (ulRet) { printf("%s err\n", "enumKeyPair"); break; } ulRet = cryptoWithKeyPairID(0,0,in_value, in_len,out_value,&out_len); if (ulRet) { printf("%s err\n", "cryptoWithKeyPairID"); break; } memset(in_value, 0, in_len); in_len *= 2; ulRet = cryptoWithKeyPairID(0,1,out_value, out_len,in_value,&in_len); if (ulRet) { printf("%s err\n", "cryptoWithKeyPairID"); break; } ulRet = sgnvfyMsgWithKeyPairID(0,0,320, in_value, in_len,out_value,&out_len); if (ulRet) { printf("%s err\n", "sgnvfyMsgWithKeyPairID"); break; } ulRet = sgnvfyMsgWithKeyPairID(0,1,320,in_value, in_len,out_value,&out_len); FILE_LOG_HEX("cc.txt",out_value,(unsigned long)out_len); if (ulRet) { printf("%s err\n", "sgnvfyMsgWithKeyPairID"); break; } printf("%s %d\n", "enumKeyPair", keyPairCnt); } } printf("number %d is ok\n",i); printf("input any key to close\n",i); getchar(); return 0; }