#include "bitstreamverifier.h" #include #include #include "mydebug.h" struct xilinx_db_t { const char* sign; const char* name; unsigned int expected_size; }; static const xilinx_db_t xdb[]= { {"xq7z045", "ZynQ", 0}, {"xcku040", "Xilinx/CARRIER", 0}, {0,0, 0} }; BitstreamVerifier::BitstreamVerifier() { } class BitstreamDecoder { public: BitstreamDecoder(const void* data, unsigned int size): d((unsigned char*)data), s(size), pos(0) { } unsigned int getFieldSize(unsigned int max_size=512) { unsigned short l=(d[pos]<<8)+d[pos+1]; if ((l>max_size) || ((pos+l)>s)) { throw "overrun"; } skip(2); return l; } void skip(unsigned int len) { if ((pos+len)>=s) throw "overrun"; pos+=len; } unsigned char getCode() { unsigned char c=d[pos]; skip(1); return c; } const char* str() { return (const char*)&d[pos]; } const unsigned char* d; unsigned int s; unsigned int pos; }; bool BitstreamVerifier::verify(const QString& filename) { QFile f(filename); bool ok=f.open(QIODevice::ReadOnly); if (!ok) return false; QByteArray d=f.read(8*1024); return verify(d); } bool BitstreamVerifier::verify(const QByteArray& d) { if (d.size()<8*1024) return false; BitstreamDecoder decoder(d.constData(), d.size()); try { //Field1: 9 bytes of some sort of header unsigned int l=decoder.getFieldSize(); if (l!=9) return false; decoder.skip(l); //Field 2: letter 'a' l=decoder.getFieldSize(); if (l!=1) return false; unsigned char c=decoder.getCode(); if (c!='a') return false; //Field 3: a string with some info as "name;UserID=...;Version=...\0 l=decoder.getFieldSize(); const char* p=decoder.str(); if (p[l-1]!=0) { MyDebug<<"BS:"<<"Unserminated string"; return false; } QString name(p); auto nl=name.split(QChar(';')); if (nl.size()<1) return false; m_info.name=nl[0]; for(int i=1; i