wifi_pass.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include <string.h>
  2. #include <unistd.h>
  3. #include <sys/file.h>
  4. #include "common.h"
  5. #include "control.h"
  6. #include "nlusctl.h"
  7. #include "crypto/pbkdf2.h"
  8. #include "wifi.h"
  9. static void put_psk(CTX, uint8_t* ssid, int slen, char* pass, int plen)
  10. {
  11. uint8_t psk[32];
  12. memzero(psk, sizeof(psk));
  13. pbkdf2_sha1(psk, sizeof(psk), pass, plen, ssid, slen, 4096);
  14. uc_put_bin(UC, ATTR_PSK, psk, sizeof(psk));
  15. }
  16. static int input_passphrase(char* buf, int len)
  17. {
  18. int rd;
  19. char* prompt = "Passphrase: ";
  20. write(STDOUT, prompt, strlen(prompt));
  21. rd = read(STDIN, buf, len);
  22. if(rd >= len)
  23. fail("passphrase too long\n");
  24. if(rd > 0 && buf[rd-1] == '\n')
  25. rd--;
  26. if(!rd)
  27. fail("empty passphrase rejected\n");
  28. buf[rd] = '\0';
  29. return rd;
  30. }
  31. /* As written this only works with sane ssids and passphrases.
  32. Should be extended at some point to handle ssid escapes and
  33. multiline phrases. */
  34. void put_psk_input(CTX, void* ssid, int slen)
  35. {
  36. char buf[256];
  37. int len = input_passphrase(buf, sizeof(buf));
  38. put_psk(ctx, ssid, slen, buf, len);
  39. }