| 497 | } |
| 498 | |
| 499 | async fn activate( |
| 500 | &self, |
| 501 | request: Request<api::ActivateDeviceRequest>, |
| 502 | ) -> Result<Response<()>, Status> { |
| 503 | let req_da = match &request.get_ref().device_activation { |
| 504 | Some(v) => v, |
| 505 | None => { |
| 506 | return Err(Status::invalid_argument("device_activation is missing")); |
| 507 | } |
| 508 | }; |
| 509 | |
| 510 | let dev_eui = EUI64::from_str(&req_da.dev_eui).map_err(|e| e.status())?; |
| 511 | |
| 512 | self.validator |
| 513 | .validate( |
| 514 | request.extensions(), |
| 515 | validator::ValidateDeviceAccess::new(validator::Flag::Update, dev_eui), |
| 516 | ) |
| 517 | .await?; |
| 518 | |
| 519 | let d = device::get(&dev_eui).await.map_err(|e| e.status())?; |
| 520 | let dp = device_profile::get(&d.device_profile_id) |
| 521 | .await |
| 522 | .map_err(|e| e.status())?; |
| 523 | |
| 524 | let dev_addr = DevAddr::from_str(&req_da.dev_addr).map_err(|e| e.status())?; |
| 525 | let s_nwk_s_int_key = |
| 526 | AES128Key::from_str(&req_da.s_nwk_s_int_key).map_err(|e| e.status())?; |
| 527 | let f_nwk_s_int_key = |
| 528 | AES128Key::from_str(&req_da.f_nwk_s_int_key).map_err(|e| e.status())?; |
| 529 | let nwk_s_enc_key = AES128Key::from_str(&req_da.nwk_s_enc_key).map_err(|e| e.status())?; |
| 530 | let app_s_key = AES128Key::from_str(&req_da.app_s_key).map_err(|e| e.status())?; |
| 531 | |
| 532 | let mut ds = internal::DeviceSession { |
| 533 | region_config_id: "".to_string(), |
| 534 | dev_addr: dev_addr.to_vec(), |
| 535 | mac_version: dp.mac_version.to_proto().into(), |
| 536 | s_nwk_s_int_key: s_nwk_s_int_key.to_vec(), |
| 537 | f_nwk_s_int_key: f_nwk_s_int_key.to_vec(), |
| 538 | nwk_s_enc_key: nwk_s_enc_key.to_vec(), |
| 539 | app_s_key: Some(common::KeyEnvelope { |
| 540 | kek_label: "".into(), |
| 541 | aes_key: app_s_key.to_vec(), |
| 542 | }), |
| 543 | n_f_cnt_down: req_da.n_f_cnt_down, |
| 544 | a_f_cnt_down: req_da.a_f_cnt_down, |
| 545 | skip_f_cnt_check: d.skip_fcnt_check, |
| 546 | ..Default::default() |
| 547 | }; |
| 548 | dp.reset_session_to_boot_params(&mut ds); |
| 549 | |
| 550 | let mut device_changeset = device::DeviceChangeset { |
| 551 | device_session: Some(Some(ds.into())), |
| 552 | dev_addr: Some(Some(dev_addr)), |
| 553 | secondary_dev_addr: Some(None), |
| 554 | f_cnt_up: Some(req_da.f_cnt_up as i64), |
| 555 | ..Default::default() |
| 556 | }; |