void recovery_init(uint32_t _word_count, bool passphrase_protection, bool pin_protection, const char *language, const char *label, bool _enforce_wordlist) { if (_word_count != 12 && _word_count != 18 && _word_count != 24) { fsm_sendFailure(FailureType_Failure_SyntaxError, "Invalid word count (has to be 12, 18 or 24 bits)"); go_home(); return; } word_count = _word_count; enforce_wordlist = _enforce_wordlist; if (pin_protection && !change_pin()) { go_home(); return; } storage_set_passphrase_protected(passphrase_protection); storage_set_language(language); storage_set_label(label); uint32_t i; for (i = 0; i < word_count; i++) { word_order[i] = i + 1; } for (i = word_count; i < 24; i++) { word_order[i] = 0; } random_permute(word_order, 24); awaiting_word = true; word_index = 0; next_word(); }
void fsm_msgChangePin(ChangePin *msg) { bool removal = msg->has_remove && msg->remove; bool confirmed = false; if(removal) { if(storage_has_pin()) { confirmed = confirm(ButtonRequestType_ButtonRequest_RemovePin, "Remove PIN", "Do you want to remove PIN protection?"); } else { fsm_sendSuccess("PIN removed"); return; } } else { if(storage_has_pin()) confirmed = confirm(ButtonRequestType_ButtonRequest_ChangePin, "Change PIN", "Do you want to change your PIN?"); else confirmed = confirm(ButtonRequestType_ButtonRequest_CreatePin, "Create PIN", "Do you want to add PIN protection?"); } if(!confirmed) { fsm_sendFailure(FailureType_Failure_ActionCancelled, removal ? "PIN removal cancelled" : "PIN change cancelled"); go_home(); return; } if(!pin_protect("Enter Current PIN")) { go_home(); return; } if(removal) { storage_set_pin(0); storage_commit(); fsm_sendSuccess("PIN removed"); } else { if(change_pin()) { storage_commit(); fsm_sendSuccess("PIN changed"); } } go_home(); }
void pwm(void *arg){ double duty_cycle=0,Ton=0; long current_period=0; int DIR; current_period=gs->period*1000; rt_task_set_periodic(NULL, TM_NOW,current_period); while (running) { rt_task_wait_period(NULL); DEBUG("Hi guys %ld, %4.2f!\n",current_period,Ton); duty_cycle=io.input_result[0].matrix[0][0]; //saturate if(duty_cycle<-100) duty_cycle=-100; if(duty_cycle>100) duty_cycle=100; //Motor specific. if(duty_cycle<0){ DIR=1; duty_cycle=100+duty_cycle; } else{ DIR=0; } Ton=duty_cycle*0.01*current_period; lpt_lock(); fakeWave=1; set_pin(PWM); change_pin(DIRE,DIR?LP_SET:LP_CLEAR); lpt_unlock(); rt_task_sleep(Ton); lpt_lock(); fakeWave=0; clear_pin(PWM); lpt_unlock(); if(current_period==0) break; if(current_period!=gs->period*1000){ current_period=gs->period*1000; rt_task_set_periodic(NULL, TM_NOW,current_period); } } }
void reset_init(bool display_random, uint32_t _strength, bool passphrase_protection, bool pin_protection, const char *language, const char *label) { if(_strength != 128 && _strength != 192 && _strength != 256) { fsm_sendFailure(FailureType_Failure_SyntaxError, "Invalid strength (has to be 128, 192 or 256 bits)"); go_home(); return; } strength = _strength; random_buffer(int_entropy, 32); char ent_str[4][17]; data2hex(int_entropy , 8, ent_str[0]); data2hex(int_entropy + 8, 8, ent_str[1]); data2hex(int_entropy + 16, 8, ent_str[2]); data2hex(int_entropy + 24, 8, ent_str[3]); if(display_random) { if(!confirm(ButtonRequestType_ButtonRequest_ResetDevice, "Internal Entropy", "%s %s %s %s", ent_str[0], ent_str[1], ent_str[2], ent_str[3])) { fsm_sendFailure(FailureType_Failure_ActionCancelled, "Reset cancelled"); go_home(); return; } } if(pin_protection && !change_pin()) { go_home(); return; } storage_set_passphrase_protected(passphrase_protection); storage_set_language(language); storage_set_label(label); EntropyRequest resp; memset(&resp, 0, sizeof(EntropyRequest)); msg_write(MessageType_MessageType_EntropyRequest, &resp); awaiting_entropy = true; }
int main(int argc, char* argv[]) { /************** VARIABLE DECLARATION */ KeyStruct keyPadState; AlarmStruct state; EdgeStruct sense; char code[CODE_DIM+1]; DEFAULT_CODE(code); bool isEquals; /************* INIT ***************/ keypad_init(&keyPadState); timer_start(); sense_init(&sense); alarm_init(&state); lcd_init(); buzzer_init(); /************** INFINITE LOOP *****/ HD44780_ClrScr(); HD44780_GotoXY(0,0); HD44780_PutStr("SALVE PRF FOGGIA"); HD44780_GotoXY(0,1); HD44780_PutStr("Alarm System 1.0"); keypad_flush(&keyPadState); while(1){ state.eventsArray[MAGN1] = magn_one_read(&sense); state.eventsArray[MAGN2] = magn_two_read(&sense); state.eventsArray[MOVE1] = move_one_read(&sense); state.eventsArray[MOVE2] = move_two_read(&sense); state.eventsArray[MOVE3] = move_three_read(&sense); state.eventsArray[MOVE4] = move_four_read(&sense); state.eventsArray[KEYPAD] = get_code(&keyPadState); /******** Update State ***********/ isEquals = true; if(state.eventsArray[KEYPAD]){ pin_sound(); int i=0; HD44780_ClrScr(); HD44780_GotoXY(0,0); HD44780_PutStr("PIN:"); HD44780_GotoXY(0,1); alarm_off(); while(keyPadState.code[i] != '\0' && code[i] != '\0'){ HD44780_PutChar(keyPadState.code[i]); (isEquals & (keyPadState.code[i] == code[i])) ? (isEquals = true) : (isEquals = false); i++; } if(isEquals){ state.isActive = !state.isActive; keypad_flush(&keyPadState); if(state.isActive){ HD44780_ClrScr(); HD44780_GotoXY(0,0); HD44780_PutStr("ALLARME"); HD44780_GotoXY(0,1); HD44780_PutStr("ATTIVATO"); }else{ HD44780_ClrScr(); HD44780_GotoXY(0,0); HD44780_PutStr("ALLARME"); HD44780_GotoXY(0,1); HD44780_PutStr("DISATTIVATO"); } } if(!isEquals && keyPadState.index == CODE_DIM){ HD44780_GotoXY(0,1); HD44780_PutStr("ERRATO"); keypad_flush(&keyPadState); } } /******** Generate Outputs *******/ if(state.eventsArray[MAGN1] && state.isActive){ state.isRinging = true; HD44780_ClrScr(); HD44780_GotoXY(0,0); HD44780_PutStr("VIOLAZIONE"); HD44780_GotoXY(0,1); HD44780_PutStr("PORTA 1"); } if(state.eventsArray[MAGN2] && state.isActive){ state.isRinging = true; HD44780_ClrScr(); HD44780_GotoXY(0,0); HD44780_PutStr("VIOLAZIONE"); HD44780_GotoXY(0,1); HD44780_PutStr("PORTA 2"); } if(state.eventsArray[MOVE1] && state.isActive){ state.isRinging = true; HD44780_ClrScr(); HD44780_GotoXY(0,0); HD44780_PutStr("VIOLAZIONE"); HD44780_GotoXY(0,1); HD44780_PutStr("STANZA 1"); } if(state.eventsArray[MOVE2] && state.isActive){ state.isRinging = true; HD44780_ClrScr(); HD44780_GotoXY(0,0); HD44780_PutStr("VIOLAZIONE"); HD44780_GotoXY(0,1); HD44780_PutStr("STANZA 2"); } if(state.eventsArray[MOVE3] && state.isActive){ state.isRinging = true; HD44780_ClrScr(); HD44780_GotoXY(0,0); HD44780_PutStr("VIOLAZIONE"); HD44780_GotoXY(0,1); HD44780_PutStr("STANZA 3"); } if(state.eventsArray[MOVE4] && state.isActive){ state.isRinging = true; HD44780_ClrScr(); HD44780_GotoXY(0,0); HD44780_PutStr("VIOLAZIONE"); HD44780_GotoXY(0,1); HD44780_PutStr("STANZA 4"); } if(!state.isActive){ alarm_off(); state.isRinging = false; } if(state.isRinging) alarm_on(); if(keyPadState.prevChar == ENTER_CHAR) change_pin(code, &keyPadState); timer_sleep(1); } }
int main(int argc, char *argv[]) { int r, c, long_optind = 0; sc_context_param_t ctx_param; sc_card_t *card = NULL; sc_context_t *ctx = NULL; sc_file_t *file = NULL; sc_path_t path; RSA *rsa = NULL; BIGNUM *bn = NULL; BIO *mem = NULL; static const char *pin = NULL; static const char *puk = NULL; while (1) { c = getopt_long(argc, argv, "r:wgol:ix:y:nut:fj:k:hv", \ options, &long_optind); if (c == -1) break; if (c == '?' || c == 'h') util_print_usage_and_die(app_name, options, option_help, NULL); switch (c) { case 'r': opt_reader = optarg; break; case 'w': opt_wait = 1; break; case 'g': if(keylen == 0) keylen = 1536; break; case 'o': overwrite = 1; break; case 'l': keylen = atoi(optarg); break; case 'i': install_pin = 1; break; case 'x': util_get_pin(optarg, &pin); break; case 'y': util_get_pin(optarg, &puk); break; case 'n': new_pin = 1; break; case 'u': unlock = 1; break; case 't': cert = optarg; break; case 'f': finalize = 1; break; case 'j': get_filename = optarg; break; case 'k': put_filename = optarg; break; case 'v': verbose++; break; } } memset(&ctx_param, 0, sizeof(ctx_param)); ctx_param.ver = 0; ctx_param.app_name = argv[0]; r = sc_context_create(&ctx, &ctx_param); if (r) { printf("Failed to establish context: %s\n", sc_strerror(r)); return 1; } if (verbose > 1) { ctx->debug = verbose; sc_ctx_log_to_file(ctx, "stderr"); } if (opt_driver != NULL) { r = sc_set_card_driver(ctx, opt_driver); if (r) { printf("Driver '%s' not found!\n", opt_driver); goto out; } } r = util_connect_card(ctx, &card, opt_reader, opt_wait, 0); if (r) goto out; sc_format_path("3F00", &path); r = sc_select_file(card, &path, NULL); if(r) goto out; if(install_pin) { sc_format_path("AAAA", &path); r = sc_select_file(card, &path, NULL); if(r) { if(r != SC_ERROR_FILE_NOT_FOUND) goto out; file = sc_file_new(); if(file == NULL) { printf("Not enougth memory.\n"); goto out; } file->type = SC_FILE_TYPE_INTERNAL_EF; file->ef_structure = SC_FILE_EF_TRANSPARENT; file->shareable = 0; file->id = 0xAAAA; file->size = 37; r = sc_file_add_acl_entry(file, SC_AC_OP_READ, SC_AC_NONE, 0); if(r) goto out; r = sc_file_add_acl_entry(file, SC_AC_OP_UPDATE, SC_AC_NONE, 0); if(r) goto out; r = sc_file_add_acl_entry(file, SC_AC_OP_ERASE, SC_AC_NONE, 0); if(r) goto out; /* sc_format_path("3F00AAAA", &(file->path)); */ file->path = path; r = sc_create_file(card, file); if(r) goto out; } if(pin != NULL) { sc_changekey_t ck; struct sc_pin_cmd_pin pin_cmd; int ret; memset(&pin_cmd, 0, sizeof(pin_cmd)); memset(&ck, 0, sizeof(ck)); memcpy(ck.key_template, "\x1e\x00\x00\x10", 4); pin_cmd.encoding = SC_PIN_ENCODING_GLP; pin_cmd.len = strlen(pin); pin_cmd.data = (u8*)pin; pin_cmd.max_length = 8; ret = sc_build_pin(ck.new_key.key_value, sizeof(ck.new_key.key_value), &pin_cmd, 1); if(ret < 0) goto out; ck.new_key.key_len = ret; r = sc_card_ctl(card, SC_CARDCTL_WESTCOS_CHANGE_KEY, &ck); if(r) goto out; } if(puk != NULL) { sc_changekey_t ck; struct sc_pin_cmd_pin puk_cmd; int ret; memset(&puk_cmd, 0, sizeof(puk_cmd)); memset(&ck, 0, sizeof(ck)); memcpy(ck.key_template, "\x1e\x00\x00\x20", 4); puk_cmd.encoding = SC_PIN_ENCODING_GLP; puk_cmd.len = strlen(puk); puk_cmd.data = (u8*)puk; puk_cmd.max_length = 8; ret = sc_build_pin(ck.new_key.key_value, sizeof(ck.new_key.key_value), &puk_cmd, 1); if(ret < 0) goto out; ck.new_key.key_len = ret; r = sc_card_ctl(card, SC_CARDCTL_WESTCOS_CHANGE_KEY, &ck); if(r) goto out; } } if(new_pin) { if(change_pin(card, 0, pin, puk)) printf("Wrong pin.\n"); goto out; } if(unlock) { if(unlock_pin(card, 0, puk, pin)) printf("Error unblocking pin.\n"); goto out; } printf("verify pin.\n"); { if(verify_pin(card, 0, pin)) { printf("Wrong pin.\n"); goto out; } } if(keylen) { size_t lg; struct sc_pkcs15_pubkey key; struct sc_pkcs15_pubkey_rsa *dst = &(key.u.rsa); u8 *pdata; memset(&key, 0, sizeof(key)); key.algorithm = SC_ALGORITHM_RSA; printf("Generate key of length %d.\n", keylen); #if OPENSSL_VERSION_NUMBER>=0x00908000L rsa = RSA_new(); bn = BN_new(); mem = BIO_new(BIO_s_mem()); if(rsa == NULL || bn == NULL || mem == NULL) { printf("Not enougth memory.\n"); goto out; } if(!BN_set_word(bn, RSA_F4) || !RSA_generate_key_ex(rsa, keylen, bn, NULL)) #else rsa = RSA_generate_key(keylen, RSA_F4, NULL, NULL); mem = BIO_new(BIO_s_mem()); if(mem == NULL) { printf("Not enougth memory.\n"); goto out; } if (!rsa) #endif { printf("RSA_generate_key_ex return %ld\n", ERR_get_error()); goto out; } RSA_set_method(rsa, RSA_PKCS1_OpenSSL()); if(!i2d_RSAPrivateKey_bio(mem, rsa)) { printf("i2d_RSAPrivateKey_bio return %ld\n", ERR_get_error()); goto out; } lg = BIO_get_mem_data(mem, &pdata); sc_format_path("0001", &path); r = sc_select_file(card, &path, NULL); if(r) { if(r != SC_ERROR_FILE_NOT_FOUND) goto out; file = sc_file_new(); if(file == NULL) { printf("Not enougth memory.\n"); goto out; } file->type = SC_FILE_TYPE_WORKING_EF; file->ef_structure = SC_FILE_EF_TRANSPARENT; file->shareable = 0; file->size = ((lg/4)+1)*4; r = sc_file_add_acl_entry(file, SC_AC_OP_READ, SC_AC_CHV, 0); if(r) goto out; r = sc_file_add_acl_entry(file, SC_AC_OP_UPDATE, SC_AC_CHV, 0); if(r) goto out; r = sc_file_add_acl_entry(file, SC_AC_OP_ERASE, SC_AC_CHV, 0); if(r) goto out; file->path = path; printf("File key creation %s, size %"SC_FORMAT_LEN_SIZE_T"d.\n", file->path.value, file->size); r = sc_create_file(card, file); if(r) goto out; } else { if(!overwrite) { printf("Key file already exist,"\ " use -o to replace it.\n"); goto out; } } printf("Private key length is %"SC_FORMAT_LEN_SIZE_T"d\n", lg); printf("Write private key.\n"); r = sc_update_binary(card,0,pdata,lg,0); if(r<0) goto out; printf("Private key correctly written.\n"); r = create_file_cert(card); if(r) goto out; { const BIGNUM *rsa_n, *rsa_e; RSA_get0_key(rsa, &rsa_n, &rsa_e, NULL); if (!do_convert_bignum(&dst->modulus, rsa_n) || !do_convert_bignum(&dst->exponent, rsa_e)) goto out; } r = sc_pkcs15_encode_pubkey(ctx, &key, &pdata, &lg); if(r) goto out; printf("Public key length %"SC_FORMAT_LEN_SIZE_T"d\n", lg); sc_format_path("3F000002", &path); r = sc_select_file(card, &path, NULL); if(r) goto out; printf("Write public key.\n"); r = sc_update_binary(card,0,pdata,lg,0); if(r<0) goto out; printf("Public key correctly written.\n"); } if(cert) { BIO *bio; X509 *xp; u8 *pdata; bio = BIO_new(BIO_s_file()); if (BIO_read_filename(bio, cert) <= 0) { BIO_free(bio); printf("Can't open file %s.\n", cert); goto out; } xp = PEM_read_bio_X509(bio, NULL, NULL, NULL); BIO_free(bio); if (xp == NULL) { print_openssl_error(); goto out; } else { int lg = cert2der(xp, &pdata); sc_format_path("0002", &path); r = sc_select_file(card, &path, NULL); if(r) goto out; /* FIXME: verify if the file has a compatible size... */ printf("Write certificate %s.\n", cert); r = sc_update_binary(card,0,pdata,lg,0); if(r == SC_ERROR_SECURITY_STATUS_NOT_SATISFIED) { if(verify_pin(card, 0, pin)) { printf("Wrong pin.\n"); } else { r = sc_update_binary(card,0,pdata,lg,0); } } if(r<0) { if(pdata) free(pdata); goto out; } if(xp) X509_free(xp); if(pdata) free(pdata); printf("Certificate correctly written.\n"); } } if(finalize) { int mode = SC_CARDCTRL_LIFECYCLE_USER; if(card->atr.value[10] != 0x82) { sc_format_path("0001", &path); r = sc_select_file(card, &path, NULL); if(r) { printf("This card don't have private key"\ " and can't be finalize.\n"); goto out; } printf("Finalize card...\n"); if(sc_card_ctl(card, SC_CARDCTL_WESTCOS_AUT_KEY, NULL) || sc_card_ctl(card, SC_CARDCTL_LIFECYCLE_SET, &mode)) { printf("Error finalizing card,"\ " card isn't secure.\n"); goto out; } } printf("Card correctly finalized.\n"); } if(get_filename) { FILE *fp; u8 *b; if(file) { sc_file_free(file); file = NULL; } sc_format_path(get_filename, &path); r = sc_select_file(card, &path, &file); if(r) { printf("Error file not found.\n"); goto out; } b = malloc(file->size); if(b == NULL) { printf("Not enougth memory.\n"); goto out; } r = sc_read_binary(card, 0, b, file->size, 0); if(r == SC_ERROR_SECURITY_STATUS_NOT_SATISFIED) { if(verify_pin(card, 0, pin)) { printf("Wrong pin.\n"); goto out; } r = sc_read_binary(card, 0, b, file->size, 0); } if(r<0) { printf("Error reading file.\n"); goto out; } fp = fopen(get_filename, "wb"); fwrite(b, 1, file->size, fp); fclose(fp); free(b); } if(put_filename) { FILE *fp; u8 *b; if(file) { sc_file_free(file); file = NULL; } sc_format_path(put_filename, &path); r = sc_select_file(card, &path, &file); if(r) { printf("File not found.\n"); goto out; } b = malloc(file->size); if(b == NULL) { printf("Not enougth memory.\n"); goto out; } memset(b, 0, file->size); fp = fopen(put_filename, "rb"); fread(b, 1, file->size, fp); fclose(fp); r = sc_update_binary(card, 0, b, file->size, 0); if(r == SC_ERROR_SECURITY_STATUS_NOT_SATISFIED) { if(verify_pin(card, 0, pin)) { printf("Wrong pin.\n"); } else { r = sc_update_binary(card, 0, b, file->size, 0); } } if(r<0) { free(b); printf("Error writing file.\n"); goto out; } free(b); } out: if(mem) BIO_free(mem); if(bn) BN_free(bn); if(rsa) RSA_free(rsa); if(file) sc_file_free(file); if (card) { sc_unlock(card); sc_disconnect_card(card); } sc_release_context(ctx); return EXIT_SUCCESS; }