void cmdSetPin(usbDevice_t *dev){ uint8_t pinHash[16]; uint8_t ePinHash[16]; //Build pinHash from globalArgs.pin memcpy(pinHash,globalArgs.pin,4); memcpy(&pinHash[4],globalArgs.pin,4); memcpy(&pinHash[8],globalArgs.pin,4); memcpy(&pinHash[12],globalArgs.pin,4); ncrypt(pinHash,ePinHash,sizeof(pinHash)); HIDwrite(dev,2,ePinHash,16); hexdump(ePinHash,sizeof(ePinHash)); }
DataBuf nikonCrypt(uint16_t tag, const byte* pData, uint32_t size, TiffComponent* const pRoot) { DataBuf buf; if (size < 4) return buf; const NikonArrayIdx* nci = find(nikonArrayIdx, NikonArrayIdx::Key(tag, reinterpret_cast<const char*>(pData), size)); if (nci == 0 || nci->start_ == NA || size <= nci->start_) return buf; // Find Exif.Nikon3.ShutterCount TiffFinder finder(0x00a7, nikon3Id); pRoot->accept(finder); TiffEntryBase* te = dynamic_cast<TiffEntryBase*>(finder.result()); if (!te || !te->pValue() || te->pValue()->count() == 0) return buf; uint32_t count = static_cast<uint32_t>(te->pValue()->toLong()); // Find Exif.Nikon3.SerialNumber finder.init(0x001d, nikon3Id); pRoot->accept(finder); te = dynamic_cast<TiffEntryBase*>(finder.result()); if (!te || !te->pValue() || te->pValue()->count() == 0) return buf; bool ok(false); uint32_t serial = stringTo<uint32_t>(te->pValue()->toString(), ok); if (!ok) { std::string model = getExifModel(pRoot); if (model.empty()) return buf; if (model.find("D50") != std::string::npos) { serial = 0x22; } else { serial = 0x60; } } buf.alloc(size); memcpy(buf.pData_, pData, buf.size_); ncrypt(buf.pData_ + nci->start_, buf.size_ - nci->start_, count, serial); return buf; }
uint16_t readXML(char* filePath) { XMLDoc doc; XMLSearch search; XMLNode* node; // XMLNode* child; XMLNode *name,*user,*hop,*pass,*submit; XMLDoc_init(&doc); XMLDoc_parse_file_DOM(filePath, &doc); XMLSearch_init(&search); XMLSearch_search_set_tag(&search, "cred"); //XMLSearch_search_add_attribute(&search, "presence", NULL); //XMLSearch_search_add_attribute(&search, "value", "a*"); uint8_t* buffptr = flashMemory; uint8_t* nextCredential_ptr; uint8_t* encryptStart; uint16_t length; node = doc.nodes[doc.i_root]; if (XMLSearch_node_matches(node, &search)) fprintf( stderr, "Found match: <%s>\n", node->tag); while ((node = XMLSearch_next(node, &search)) != NULL) { //child = XMLNode_next(node); //XMLNode* XMLNode_get_child(const XMLNode* node, int i_child); if (XMLNode_get_children_count(node) != 5) { fprintf( stderr, "[ERROR] BAD XML FILE"); } else { name = XMLNode_get_child(node, 0); user = XMLNode_get_child(node, 1); hop = XMLNode_get_child(node, 2); pass = XMLNode_get_child(node, 3); submit = XMLNode_get_child(node, 4); fprintf( stderr, "Name: %s\n", name->text); fprintf( stderr, "User: %s\n", user->text); fprintf( stderr, "Hop: %s\n", hop->text); fprintf( stderr, "Pass: %s\n", pass->text); fprintf( stderr, "Submit: %s\n", submit->text); if(name->text != 0) buffptr = buffptr + sprintf((char*)buffptr, "%s", name->text); else *buffptr = 0; buffptr += 1; nextCredential_ptr = buffptr; buffptr += 2; encryptStart = buffptr; // encryption must start here ! if(user->text != 0) buffptr = buffptr + sprintf((char*)buffptr, "%s", user->text); else *buffptr = 0; buffptr += 1; if(hop->text != 0) buffptr = buffptr + sprintf((char*)buffptr, "%s", hop->text); else *buffptr = 0; buffptr += 1; if(pass->text != 0) buffptr = buffptr + sprintf((char*)buffptr, "%s", pass->text); else *buffptr = 0; buffptr += 1; if(submit->text != 0) buffptr = buffptr + sprintf((char*)buffptr, "%s", submit->text); else *buffptr = 0; buffptr += 1; // call encryption here ! uint8_t source[4096]; uint8_t dest[4096]; uint16_t len = buffptr - encryptStart; // buffptr must be incremented to meet block size of encryption if( (len % 16) != 0) { // block must be multiple of 16 len = ((len / 16) + 1) * 16; buffptr = encryptStart + len; } memset((void*)source, 0, sizeof(source)); memset((void*)dest, 0, sizeof(source)); // copy credentials into memcpy((void*)(source), (void*)encryptStart, len); fprintf(stderr, "\n PLAIN BLOCK TEXT\n" ); fprintf(stderr, "\n ENCRYPTED BLOCK LEN %d\n",len ); // start encryption here! length = ncrypt(source, dest, len); hexdump(encryptStart, len); memcpy((void*)encryptStart, dest, len); hexdump(encryptStart, len); fprintf(stderr, "\n -----------------\n " ); uint16_t ptr = ((buffptr) - flashMemory); *nextCredential_ptr = (ptr & 0x00FF); *(nextCredential_ptr+1) = (ptr & 0xFF00)>> 8; } } *nextCredential_ptr = 0; *(nextCredential_ptr+1) = 0; uint16_t size = (buffptr - flashMemory); hexdump(flashMemory, size); XMLSearch_free(&search, true); XMLDoc_free(&doc); return size; }