/** * PKCS #1 OAEP decoding */ static int OAEP_decode(unsigned char *message, unsigned int encoded_bytes, const unsigned char *encoded, unsigned int label_bytes, const unsigned char *label) { unsigned int i, message_bytes; unsigned char DB[RSA_MOD_BYTES - RSA_SHA_BYTES - 1 /* Add MGF1 buffer space */ + 4]; unsigned char seed[RSA_SHA_BYTES /* Add MGF1 buffer space */ + 4]; debugValue("OAEP decode: encoded message", encoded, encoded_bytes); // First byte of encoded message must be 0x00 if(encoded[0] != 0x00) { debugError("First byte of OAEP encoded message is not 0x00"); return RSA_ERROR_OAEP_DECODE; } // Extract maskedDB and maskedSeed debugValue("OAEP decode: maskedSeed", encoded + 1, RSA_SHA_BYTES); Copy(RSA_SHA_BYTES, DB, encoded + 1 + RSA_SHA_BYTES); debugValue("OAEP decode: maskedDB", encoded + 1 + RSA_SHA_BYTES, RSA_MOD_BYTES - RSA_SHA_BYTES - 1); // Finding seed and DB MGF1(RSA_MOD_BYTES - RSA_SHA_BYTES - 1, DB, RSA_SHA_BYTES, seed); debugValue("OAEP decode: seedMask", seed, RSA_SHA_BYTES); XorAssign(RSA_SHA_BYTES, seed, encoded + 1); debugValue("OAEP decode: seed", seed, RSA_SHA_BYTES); MGF1(RSA_SHA_BYTES, seed, RSA_MOD_BYTES - RSA_SHA_BYTES - 1, DB); debugValue("OAEP decode: dbMask", DB, RSA_MOD_BYTES - RSA_SHA_BYTES - 1); XorAssign(RSA_MOD_BYTES - RSA_SHA_BYTES - 1, DB, encoded + 1 + RSA_SHA_BYTES); debugValue("OAEP decode: DB", DB, RSA_MOD_BYTES - RSA_SHA_BYTES - 1); // Compute the hash of l debugValue("OAEP decode: label", label, label_bytes); SHA(RSA_SHA_BYTES, seed, label_bytes, label); debugValue("OAEP decode: hash of label", seed, RSA_SHA_BYTES); // Check whether the first RSA_SHA_BYTES bytes of DB equal to lHash if (NotEqual(RSA_SHA_BYTES, seed, DB)) { debugError("First RSA_SHA_BYTES of DB do not match with hash of label"); return RSA_ERROR_OAEP_DECODE; } // Try to locate the message in DB i = RSA_SHA_BYTES; while ((DB[i] == 0x00) && (DB[i] != 0x01) && (i < (RSA_MOD_BYTES - RSA_SHA_BYTES - 1 - 1))) i++; if ((i == (RSA_MOD_BYTES - RSA_SHA_BYTES - 1 - 1)) || (DB[i] != 0x01)) { debugError("Failed to locate the message in DB"); return RSA_ERROR_OAEP_DECODE; } // Extract the message, starting after 0x01 byte to the end of DB message_bytes = RSA_MOD_BYTES - RSA_SHA_BYTES - 1 - 1 - (i + 1) + 1; CopyBytes(message_bytes, message, DB + i + 1); debugValue("OAEP decode: recovered message", message, message_bytes); return message_bytes; }
/** * Verify a PIN code. * * @param buffer which contains the code to verify. */ int CHV_PIN_verify(CHV_PIN *pin, unsigned int length, unsigned char *buffer) { // Verify if the PIN has not been blocked if (pin->count == 0) { return CHV_BLOCKED; } // Check length of the provided data if (length > 0) { if (length != CHV_PIN_SIZE) { return CHV_WRONG_LENGTH; } else { // Compare the PIN with the stored code if (NotEqual(CHV_PIN_SIZE, buffer, pin->code)) { debugWarning("PIN verification failed"); debugInteger("Tries left", pin->count - 1); --(pin->count); CHV_flags &= (0xFF ^ pin->flag); } else { debugMessage("PIN verified"); pin->count = CHV_PIN_COUNT; CHV_flags |= pin->flag; } } } return CHV_PIN_query(pin); }
/** * PKCS #1 PSS verification */ static int PSS_verify(unsigned int message_bytes, const unsigned char *message, unsigned int encoded_bytes, const unsigned char *encoded) { unsigned char M[8 + RSA_SHA_BYTES + RSA_SALT_BYTES]; unsigned char DB[RSA_MOD_BYTES - RSA_SHA_BYTES - 1]; debugValue("PSS verify: message", message, message_bytes); if (encoded_bytes != RSA_MOD_BYTES) { return RSA_ERROR_PSS_INCONSISTENT; } debugValue("PSS verify: encoded message", encoded, encoded_bytes); // Verification if (encoded[RSA_MOD_BYTES - 1] != 0xbc) { return RSA_ERROR_PSS_INCONSISTENT; } // Extract maskedDB and H debugValue("PSS verify: maskedDB", encoded, RSA_MOD_BYTES - RSA_SHA_BYTES - 1); Copy(RSA_SHA_BYTES, M + 8, encoded + RSA_MOD_BYTES - RSA_SHA_BYTES - 1); debugValue("PSS verify: H", encoded + RSA_MOD_BYTES - RSA_SHA_BYTES - 1, RSA_SHA_BYTES); // Compute DB MGF1(RSA_SHA_BYTES, M + 8, RSA_MOD_BYTES - RSA_SHA_BYTES - 1, DB); debugValue("PSS verify: dbMask", DB, RSA_MOD_BYTES - RSA_SHA_BYTES - 1); XorAssign(RSA_MOD_BYTES - RSA_SHA_BYTES - 1, DB, encoded); debugValue("PSS verify: DB", DB, RSA_MOD_BYTES - RSA_SHA_BYTES - 1); if (DB[RSA_MOD_BYTES - RSA_SALT_BYTES - RSA_SHA_BYTES - 2] != 0x01) { return RSA_ERROR_PSS_INCONSISTENT; } // Compute hash of m SHA(RSA_SHA_BYTES, M + 8, message_bytes, message); debugValue("PSS verify: hash of message", M + 8, RSA_SHA_BYTES); Copy(RSA_SALT_BYTES, M + 8 + RSA_SHA_BYTES, DB + RSA_MOD_BYTES - RSA_SALT_BYTES - RSA_SHA_BYTES - 1); debugValue("PSS verify: recovered message to be encoded", M, 8 + RSA_SHA_BYTES + RSA_SALT_BYTES); SHA(RSA_SHA_BYTES, DB, 8 + RSA_SHA_BYTES + RSA_SALT_BYTES, M); debugValue("PSS verify: hash of recovered message to be encoded", DB, RSA_SHA_BYTES); if (NotEqual(RSA_SHA_BYTES, encoded + RSA_MOD_BYTES - RSA_SHA_BYTES - 1, DB)) { debugWarning("PSS verify: verification failed"); return RSA_ERROR_PSS_INCONSISTENT; } debugMessage("PSS verify: verification succeeded"); return RSA_PSS_CONSISTENT; }
bool Matrix::operator==(const Matrix& m) const { if(size() != m.size()) { return false; } if(precision() != m.precision()) { return false; } return reduce(apply(*this, m, NotEqual()), {}, Add())[0] == 0; }
void btDbvtBroadphase::setAabb( btBroadphaseProxy* absproxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* /*dispatcher*/) { btDbvtProxy* proxy=(btDbvtProxy*)absproxy; ATTRIBUTE_ALIGNED16(btDbvtVolume) aabb=btDbvtVolume::FromMM(aabbMin,aabbMax); #if DBVT_BP_PREVENTFALSEUPDATE if(NotEqual(aabb,proxy->leaf->volume)) #endif { bool docollide=false; if(proxy->stage==STAGECOUNT) {/* fixed -> dynamic set */ m_sets[1].remove(proxy->leaf); proxy->leaf=
/* Recognize and Translate a Relational "Less Than" */ void Less() { Next(); switch(Token) { case '=': LessOrEqual(); break; case '>': NotEqual(); break; default: CompareExpression(); SetLess(); break; } }
/** * RSA signature verification (as specified by PKCS #1) * * Note: the signature will be modified/overwritten by this function. * * @param key to be used for this operation. * @param message_bytes size in bytes of the message. * @param message that is to be verified. * @param signature_bytes size in bytes of the signature. * @param signature over the message to be verified. * @return whether the message/signature is correct. */ int RSA_RAW_verify(const RSA_public_key *key, unsigned int message_bytes, const unsigned char *message, unsigned int signature_bytes, unsigned char *signature) { if (signature_bytes != RSA_MOD_BYTES) { debugError("Incorrect size of signature"); return RSA_ERROR_RAW_VERIFY; } if (message_bytes > signature_bytes) { debugError("Incorrect size of message"); return RSA_ERROR_RAW_VERIFY; } ModExp(RSA_EXP_BYTES, RSA_MOD_BYTES, key->exponent, key->modulus, signature, signature); if (NotEqual(message_bytes, message, signature + RSA_MOD_BYTES - message_bytes)) { return RSA_ERROR_INCONSISTENT; } return RSA_CONSISTENT; }
static btDbvtNode* removeleaf( btDbvt* pdbvt, btDbvtNode* leaf) { if(leaf==pdbvt->m_root) { pdbvt->m_root=0; return(0); } else { btDbvtNode* parent=leaf->parent; btDbvtNode* prev=parent->parent; btDbvtNode* sibling=parent->childs[1-indexof(leaf)]; if(prev) { prev->childs[indexof(parent)]=sibling; sibling->parent=prev; deletenode(pdbvt,parent); while(prev) { const btDbvtVolume pb=prev->volume; Merge(prev->childs[0]->volume,prev->childs[1]->volume,prev->volume); if(NotEqual(pb,prev->volume)) { prev=prev->parent; } else break; } return(prev?prev:pdbvt->m_root); } else { pdbvt->m_root=sibling; sibling->parent=0; deletenode(pdbvt,parent); return(pdbvt->m_root); } } }
void btDbvtBroadphase::setAabb(btBroadphaseProxy* absproxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* /*dispatcher*/) { btDbvtProxy* proxy = (btDbvtProxy*)absproxy; ATTRIBUTE_ALIGNED16(btDbvtVolume) aabb = btDbvtVolume::FromMM(aabbMin, aabbMax); #if DBVT_BP_PREVENTFALSEUPDATE if (NotEqual(aabb, proxy->leaf->volume)) #endif { bool docollide = false; if (proxy->stage == STAGECOUNT) { /* fixed -> dynamic set */ m_sets[1].remove(proxy->leaf); proxy->leaf = m_sets[0].insert(aabb, proxy); docollide = true; } else { /* dynamic set */ ++m_updates_call; if (Intersect(proxy->leaf->volume, aabb)) { /* Moving */ const btVector3 delta = aabbMin - proxy->m_aabbMin; btVector3 velocity(((proxy->m_aabbMax - proxy->m_aabbMin) / 2) * m_prediction); if (delta[0] < 0) velocity[0] = -velocity[0]; if (delta[1] < 0) velocity[1] = -velocity[1]; if (delta[2] < 0) velocity[2] = -velocity[2]; if ( m_sets[0].update(proxy->leaf, aabb, velocity, gDbvtMargin) ) { ++m_updates_done; docollide = true; } } else { /* Teleporting */ m_sets[0].update(proxy->leaf, aabb); ++m_updates_done; docollide = true; } } listremove(proxy, m_stageRoots[proxy->stage]); proxy->m_aabbMin = aabbMin; proxy->m_aabbMax = aabbMax; proxy->stage = m_stageCurrent; listappend(proxy, m_stageRoots[m_stageCurrent]); if (docollide) { m_needcleanup = true; if (!m_deferedcollide) { btDbvtTreeCollider collider(this); m_sets[1].collideTTpersistentStack(m_sets[1].m_root, proxy->leaf, collider); m_sets[0].collideTTpersistentStack(m_sets[0].m_root, proxy->leaf, collider); } } } }
void btDbvt::benchmark() { static const btScalar cfgVolumeCenterScale = 100; static const btScalar cfgVolumeExentsBase = 1; static const btScalar cfgVolumeExentsScale = 4; static const int cfgLeaves = 8192; static const bool cfgEnable = true; //[1] btDbvtVolume intersections bool cfgBenchmark1_Enable = cfgEnable; static const int cfgBenchmark1_Iterations = 8; static const int cfgBenchmark1_Reference = 3499; //[2] btDbvtVolume merges bool cfgBenchmark2_Enable = cfgEnable; static const int cfgBenchmark2_Iterations = 4; static const int cfgBenchmark2_Reference = 1945; //[3] btDbvt::collideTT bool cfgBenchmark3_Enable = cfgEnable; static const int cfgBenchmark3_Iterations = 512; static const int cfgBenchmark3_Reference = 5485; //[4] btDbvt::collideTT self bool cfgBenchmark4_Enable = cfgEnable; static const int cfgBenchmark4_Iterations = 512; static const int cfgBenchmark4_Reference = 2814; //[5] btDbvt::collideTT xform bool cfgBenchmark5_Enable = cfgEnable; static const int cfgBenchmark5_Iterations = 512; static const btScalar cfgBenchmark5_OffsetScale = 2; static const int cfgBenchmark5_Reference = 7379; //[6] btDbvt::collideTT xform,self bool cfgBenchmark6_Enable = cfgEnable; static const int cfgBenchmark6_Iterations = 512; static const btScalar cfgBenchmark6_OffsetScale = 2; static const int cfgBenchmark6_Reference = 7270; //[7] btDbvt::rayTest bool cfgBenchmark7_Enable = cfgEnable; static const int cfgBenchmark7_Passes = 32; static const int cfgBenchmark7_Iterations = 65536; static const int cfgBenchmark7_Reference = 6307; //[8] insert/remove bool cfgBenchmark8_Enable = cfgEnable; static const int cfgBenchmark8_Passes = 32; static const int cfgBenchmark8_Iterations = 65536; static const int cfgBenchmark8_Reference = 2105; //[9] updates (teleport) bool cfgBenchmark9_Enable = cfgEnable; static const int cfgBenchmark9_Passes = 32; static const int cfgBenchmark9_Iterations = 65536; static const int cfgBenchmark9_Reference = 1879; //[10] updates (jitter) bool cfgBenchmark10_Enable = cfgEnable; static const btScalar cfgBenchmark10_Scale = cfgVolumeCenterScale/10000; static const int cfgBenchmark10_Passes = 32; static const int cfgBenchmark10_Iterations = 65536; static const int cfgBenchmark10_Reference = 1244; //[11] optimize (incremental) bool cfgBenchmark11_Enable = cfgEnable; static const int cfgBenchmark11_Passes = 64; static const int cfgBenchmark11_Iterations = 65536; static const int cfgBenchmark11_Reference = 2510; //[12] btDbvtVolume notequal bool cfgBenchmark12_Enable = cfgEnable; static const int cfgBenchmark12_Iterations = 32; static const int cfgBenchmark12_Reference = 3677; //[13] culling(OCL+fullsort) bool cfgBenchmark13_Enable = cfgEnable; static const int cfgBenchmark13_Iterations = 1024; static const int cfgBenchmark13_Reference = 2231; //[14] culling(OCL+qsort) bool cfgBenchmark14_Enable = cfgEnable; static const int cfgBenchmark14_Iterations = 8192; static const int cfgBenchmark14_Reference = 3500; //[15] culling(KDOP+qsort) bool cfgBenchmark15_Enable = cfgEnable; static const int cfgBenchmark15_Iterations = 8192; static const int cfgBenchmark15_Reference = 1151; //[16] insert/remove batch bool cfgBenchmark16_Enable = cfgEnable; static const int cfgBenchmark16_BatchCount = 256; static const int cfgBenchmark16_Passes = 16384; static const int cfgBenchmark16_Reference = 5138; //[17] select bool cfgBenchmark17_Enable = cfgEnable; static const int cfgBenchmark17_Iterations = 4; static const int cfgBenchmark17_Reference = 3390; btClock wallclock; printf("Benchmarking dbvt...\r\n"); printf("\tWorld scale: %f\r\n",cfgVolumeCenterScale); printf("\tExtents base: %f\r\n",cfgVolumeExentsBase); printf("\tExtents range: %f\r\n",cfgVolumeExentsScale); printf("\tLeaves: %u\r\n",cfgLeaves); printf("\tsizeof(btDbvtVolume): %u bytes\r\n",sizeof(btDbvtVolume)); printf("\tsizeof(btDbvtNode): %u bytes\r\n",sizeof(btDbvtNode)); if(cfgBenchmark1_Enable) {// Benchmark 1 srand(380843); btAlignedObjectArray<btDbvtVolume> volumes; btAlignedObjectArray<bool> results; volumes.resize(cfgLeaves); results.resize(cfgLeaves); for(int i=0;i<cfgLeaves;++i) { volumes[i]=btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale); } printf("[1] btDbvtVolume intersections: "); wallclock.reset(); for(int i=0;i<cfgBenchmark1_Iterations;++i) { for(int j=0;j<cfgLeaves;++j) { for(int k=0;k<cfgLeaves;++k) { results[k]=Intersect(volumes[j],volumes[k]); } } } const int time=(int)wallclock.getTimeMilliseconds(); printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark1_Reference)*100/time); } if(cfgBenchmark2_Enable) {// Benchmark 2 srand(380843); btAlignedObjectArray<btDbvtVolume> volumes; btAlignedObjectArray<btDbvtVolume> results; volumes.resize(cfgLeaves); results.resize(cfgLeaves); for(int i=0;i<cfgLeaves;++i) { volumes[i]=btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale); } printf("[2] btDbvtVolume merges: "); wallclock.reset(); for(int i=0;i<cfgBenchmark2_Iterations;++i) { for(int j=0;j<cfgLeaves;++j) { for(int k=0;k<cfgLeaves;++k) { Merge(volumes[j],volumes[k],results[k]); } } } const int time=(int)wallclock.getTimeMilliseconds(); printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark2_Reference)*100/time); } if(cfgBenchmark3_Enable) {// Benchmark 3 srand(380843); btDbvt dbvt[2]; btDbvtBenchmark::NilPolicy policy; btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt[0]); btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt[1]); dbvt[0].optimizeTopDown(); dbvt[1].optimizeTopDown(); printf("[3] btDbvt::collideTT: "); wallclock.reset(); for(int i=0;i<cfgBenchmark3_Iterations;++i) { btDbvt::collideTT(dbvt[0].m_root,dbvt[1].m_root,policy); } const int time=(int)wallclock.getTimeMilliseconds(); printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark3_Reference)*100/time); } if(cfgBenchmark4_Enable) {// Benchmark 4 srand(380843); btDbvt dbvt; btDbvtBenchmark::NilPolicy policy; btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt); dbvt.optimizeTopDown(); printf("[4] btDbvt::collideTT self: "); wallclock.reset(); for(int i=0;i<cfgBenchmark4_Iterations;++i) { btDbvt::collideTT(dbvt.m_root,dbvt.m_root,policy); } const int time=(int)wallclock.getTimeMilliseconds(); printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark4_Reference)*100/time); } if(cfgBenchmark5_Enable) {// Benchmark 5 srand(380843); btDbvt dbvt[2]; btAlignedObjectArray<btTransform> transforms; btDbvtBenchmark::NilPolicy policy; transforms.resize(cfgBenchmark5_Iterations); for(int i=0;i<transforms.size();++i) { transforms[i]=btDbvtBenchmark::RandTransform(cfgVolumeCenterScale*cfgBenchmark5_OffsetScale); } btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt[0]); btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt[1]); dbvt[0].optimizeTopDown(); dbvt[1].optimizeTopDown(); printf("[5] btDbvt::collideTT xform: "); wallclock.reset(); for(int i=0;i<cfgBenchmark5_Iterations;++i) { btDbvt::collideTT(dbvt[0].m_root,dbvt[1].m_root,transforms[i],policy); } const int time=(int)wallclock.getTimeMilliseconds(); printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark5_Reference)*100/time); } if(cfgBenchmark6_Enable) {// Benchmark 6 srand(380843); btDbvt dbvt; btAlignedObjectArray<btTransform> transforms; btDbvtBenchmark::NilPolicy policy; transforms.resize(cfgBenchmark6_Iterations); for(int i=0;i<transforms.size();++i) { transforms[i]=btDbvtBenchmark::RandTransform(cfgVolumeCenterScale*cfgBenchmark6_OffsetScale); } btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt); dbvt.optimizeTopDown(); printf("[6] btDbvt::collideTT xform,self: "); wallclock.reset(); for(int i=0;i<cfgBenchmark6_Iterations;++i) { btDbvt::collideTT(dbvt.m_root,dbvt.m_root,transforms[i],policy); } const int time=(int)wallclock.getTimeMilliseconds(); printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark6_Reference)*100/time); } if(cfgBenchmark7_Enable) {// Benchmark 7 srand(380843); btDbvt dbvt; btAlignedObjectArray<btVector3> rayorg; btAlignedObjectArray<btVector3> raydir; btDbvtBenchmark::NilPolicy policy; rayorg.resize(cfgBenchmark7_Iterations); raydir.resize(cfgBenchmark7_Iterations); for(int i=0;i<rayorg.size();++i) { rayorg[i]=btDbvtBenchmark::RandVector3(cfgVolumeCenterScale*2); raydir[i]=btDbvtBenchmark::RandVector3(cfgVolumeCenterScale*2); } btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt); dbvt.optimizeTopDown(); printf("[7] btDbvt::rayTest: "); wallclock.reset(); for(int i=0;i<cfgBenchmark7_Passes;++i) { for(int j=0;j<cfgBenchmark7_Iterations;++j) { btDbvt::rayTest(dbvt.m_root,rayorg[j],rayorg[j]+raydir[j],policy); } } const int time=(int)wallclock.getTimeMilliseconds(); unsigned rays=cfgBenchmark7_Passes*cfgBenchmark7_Iterations; printf("%u ms (%i%%),(%u r/s)\r\n",time,(time-cfgBenchmark7_Reference)*100/time,(rays*1000)/time); } if(cfgBenchmark8_Enable) {// Benchmark 8 srand(380843); btDbvt dbvt; btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt); dbvt.optimizeTopDown(); printf("[8] insert/remove: "); wallclock.reset(); for(int i=0;i<cfgBenchmark8_Passes;++i) { for(int j=0;j<cfgBenchmark8_Iterations;++j) { dbvt.remove(dbvt.insert(btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale),0)); } } const int time=(int)wallclock.getTimeMilliseconds(); const int ir=cfgBenchmark8_Passes*cfgBenchmark8_Iterations; printf("%u ms (%i%%),(%u ir/s)\r\n",time,(time-cfgBenchmark8_Reference)*100/time,ir*1000/time); } if(cfgBenchmark9_Enable) {// Benchmark 9 srand(380843); btDbvt dbvt; btAlignedObjectArray<const btDbvtNode*> leaves; btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt); dbvt.optimizeTopDown(); dbvt.extractLeaves(dbvt.m_root,leaves); printf("[9] updates (teleport): "); wallclock.reset(); for(int i=0;i<cfgBenchmark9_Passes;++i) { for(int j=0;j<cfgBenchmark9_Iterations;++j) { dbvt.update(const_cast<btDbvtNode*>(leaves[rand()%cfgLeaves]), btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale)); } } const int time=(int)wallclock.getTimeMilliseconds(); const int up=cfgBenchmark9_Passes*cfgBenchmark9_Iterations; printf("%u ms (%i%%),(%u u/s)\r\n",time,(time-cfgBenchmark9_Reference)*100/time,up*1000/time); } if(cfgBenchmark10_Enable) {// Benchmark 10 srand(380843); btDbvt dbvt; btAlignedObjectArray<const btDbvtNode*> leaves; btAlignedObjectArray<btVector3> vectors; vectors.resize(cfgBenchmark10_Iterations); for(int i=0;i<vectors.size();++i) { vectors[i]=(btDbvtBenchmark::RandVector3()*2-btVector3(1,1,1))*cfgBenchmark10_Scale; } btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt); dbvt.optimizeTopDown(); dbvt.extractLeaves(dbvt.m_root,leaves); printf("[10] updates (jitter): "); wallclock.reset(); for(int i=0;i<cfgBenchmark10_Passes;++i) { for(int j=0;j<cfgBenchmark10_Iterations;++j) { const btVector3& d=vectors[j]; btDbvtNode* l=const_cast<btDbvtNode*>(leaves[rand()%cfgLeaves]); btDbvtVolume v=btDbvtVolume::FromMM(l->volume.Mins()+d,l->volume.Maxs()+d); dbvt.update(l,v); } } const int time=(int)wallclock.getTimeMilliseconds(); const int up=cfgBenchmark10_Passes*cfgBenchmark10_Iterations; printf("%u ms (%i%%),(%u u/s)\r\n",time,(time-cfgBenchmark10_Reference)*100/time,up*1000/time); } if(cfgBenchmark11_Enable) {// Benchmark 11 srand(380843); btDbvt dbvt; btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt); dbvt.optimizeTopDown(); printf("[11] optimize (incremental): "); wallclock.reset(); for(int i=0;i<cfgBenchmark11_Passes;++i) { dbvt.optimizeIncremental(cfgBenchmark11_Iterations); } const int time=(int)wallclock.getTimeMilliseconds(); const int op=cfgBenchmark11_Passes*cfgBenchmark11_Iterations; printf("%u ms (%i%%),(%u o/s)\r\n",time,(time-cfgBenchmark11_Reference)*100/time,op/time*1000); } if(cfgBenchmark12_Enable) {// Benchmark 12 srand(380843); btAlignedObjectArray<btDbvtVolume> volumes; btAlignedObjectArray<bool> results; volumes.resize(cfgLeaves); results.resize(cfgLeaves); for(int i=0;i<cfgLeaves;++i) { volumes[i]=btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale); } printf("[12] btDbvtVolume notequal: "); wallclock.reset(); for(int i=0;i<cfgBenchmark12_Iterations;++i) { for(int j=0;j<cfgLeaves;++j) { for(int k=0;k<cfgLeaves;++k) { results[k]=NotEqual(volumes[j],volumes[k]); } } } const int time=(int)wallclock.getTimeMilliseconds(); printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark12_Reference)*100/time); } if(cfgBenchmark13_Enable) {// Benchmark 13 srand(380843); btDbvt dbvt; btAlignedObjectArray<btVector3> vectors; btDbvtBenchmark::NilPolicy policy; vectors.resize(cfgBenchmark13_Iterations); for(int i=0;i<vectors.size();++i) { vectors[i]=(btDbvtBenchmark::RandVector3()*2-btVector3(1,1,1)).normalized(); } btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt); dbvt.optimizeTopDown(); printf("[13] culling(OCL+fullsort): "); wallclock.reset(); for(int i=0;i<cfgBenchmark13_Iterations;++i) { static const btScalar offset=0; policy.m_depth=-SIMD_INFINITY; dbvt.collideOCL(dbvt.m_root,&vectors[i],&offset,vectors[i],1,policy); } const int time=(int)wallclock.getTimeMilliseconds(); const int t=cfgBenchmark13_Iterations; printf("%u ms (%i%%),(%u t/s)\r\n",time,(time-cfgBenchmark13_Reference)*100/time,(t*1000)/time); } if(cfgBenchmark14_Enable) {// Benchmark 14 srand(380843); btDbvt dbvt; btAlignedObjectArray<btVector3> vectors; btDbvtBenchmark::P14 policy; vectors.resize(cfgBenchmark14_Iterations); for(int i=0;i<vectors.size();++i) { vectors[i]=(btDbvtBenchmark::RandVector3()*2-btVector3(1,1,1)).normalized(); } btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt); dbvt.optimizeTopDown(); policy.m_nodes.reserve(cfgLeaves); printf("[14] culling(OCL+qsort): "); wallclock.reset(); for(int i=0;i<cfgBenchmark14_Iterations;++i) { static const btScalar offset=0; policy.m_nodes.resize(0); dbvt.collideOCL(dbvt.m_root,&vectors[i],&offset,vectors[i],1,policy,false); policy.m_nodes.quickSort(btDbvtBenchmark::P14::sortfnc); } const int time=(int)wallclock.getTimeMilliseconds(); const int t=cfgBenchmark14_Iterations; printf("%u ms (%i%%),(%u t/s)\r\n",time,(time-cfgBenchmark14_Reference)*100/time,(t*1000)/time); } if(cfgBenchmark15_Enable) {// Benchmark 15 srand(380843); btDbvt dbvt; btAlignedObjectArray<btVector3> vectors; btDbvtBenchmark::P15 policy; vectors.resize(cfgBenchmark15_Iterations); for(int i=0;i<vectors.size();++i) { vectors[i]=(btDbvtBenchmark::RandVector3()*2-btVector3(1,1,1)).normalized(); } btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt); dbvt.optimizeTopDown(); policy.m_nodes.reserve(cfgLeaves); printf("[15] culling(KDOP+qsort): "); wallclock.reset(); for(int i=0;i<cfgBenchmark15_Iterations;++i) { static const btScalar offset=0; policy.m_nodes.resize(0); policy.m_axis=vectors[i]; dbvt.collideKDOP(dbvt.m_root,&vectors[i],&offset,1,policy); policy.m_nodes.quickSort(btDbvtBenchmark::P15::sortfnc); } const int time=(int)wallclock.getTimeMilliseconds(); const int t=cfgBenchmark15_Iterations; printf("%u ms (%i%%),(%u t/s)\r\n",time,(time-cfgBenchmark15_Reference)*100/time,(t*1000)/time); } if(cfgBenchmark16_Enable) {// Benchmark 16 srand(380843); btDbvt dbvt; btAlignedObjectArray<btDbvtNode*> batch; btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt); dbvt.optimizeTopDown(); batch.reserve(cfgBenchmark16_BatchCount); printf("[16] insert/remove batch(%u): ",cfgBenchmark16_BatchCount); wallclock.reset(); for(int i=0;i<cfgBenchmark16_Passes;++i) { for(int j=0;j<cfgBenchmark16_BatchCount;++j) { batch.push_back(dbvt.insert(btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale),0)); } for(int j=0;j<cfgBenchmark16_BatchCount;++j) { dbvt.remove(batch[j]); } batch.resize(0); } const int time=(int)wallclock.getTimeMilliseconds(); const int ir=cfgBenchmark16_Passes*cfgBenchmark16_BatchCount; printf("%u ms (%i%%),(%u bir/s)\r\n",time,(time-cfgBenchmark16_Reference)*100/time,int(ir*1000.0/time)); } if(cfgBenchmark17_Enable) {// Benchmark 17 srand(380843); btAlignedObjectArray<btDbvtVolume> volumes; btAlignedObjectArray<int> results; btAlignedObjectArray<int> indices; volumes.resize(cfgLeaves); results.resize(cfgLeaves); indices.resize(cfgLeaves); for(int i=0;i<cfgLeaves;++i) { indices[i]=i; volumes[i]=btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale); } for(int i=0;i<cfgLeaves;++i) { btSwap(indices[i],indices[rand()%cfgLeaves]); } printf("[17] btDbvtVolume select: "); wallclock.reset(); for(int i=0;i<cfgBenchmark17_Iterations;++i) { for(int j=0;j<cfgLeaves;++j) { for(int k=0;k<cfgLeaves;++k) { const int idx=indices[k]; results[idx]=Select(volumes[idx],volumes[j],volumes[k]); } } } const int time=(int)wallclock.getTimeMilliseconds(); printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark17_Reference)*100/time); } printf("\r\n\r\n"); }
/** * Unwrap a command APDU from secure messaging */ int SM_APDU_unwrap(unsigned char *apdu, unsigned char *buffer, SM_parameters *params) { unsigned char mac[SM_MAC_BYTES]; int i; unsigned int offset = 0; unsigned int do87DataBytes = 0; unsigned int do87Data = 0; IncrementBytes(SM_SSC_BYTES, params->ssc); if (apdu[offset] == 0x87) { // do87 if (apdu[++offset] > 0x80) { do87Data = apdu[offset++] & 0x7f; } else { do87Data = 1; } for (i = 0; i < do87Data; i++) { do87DataBytes += apdu[offset + i] << (do87Data - 1 - i) * 8; } offset += do87Data; if (apdu[offset++] != 0x01) { return SM_ERROR_WRONG_DATA; } do87DataBytes--; // compensate for 0x01 marker // store pointer to data and defer decrypt to after mac check (do8e) do87Data = offset; offset += do87DataBytes; } if (apdu[offset] == 0x97) { // do97 if (apdu[++offset] != 0x01) { return SM_ERROR_WRONG_DATA; } Le = apdu[++offset]; offset++; } // do8e if (apdu[offset] != 0x8e || apdu[offset + 1] != 8) { return SM_ERROR_WRONG_DATA; } // verify mac i = 0; // SSC Copy(SM_SSC_BYTES, buffer, params->ssc); i += SM_SSC_BYTES; // Header buffer[i++] = CLA; buffer[i++] = INS; buffer[i++] = P1; buffer[i++] = P2; // Padding i = SM_ISO7816_4_pad(apdu, i); // Cryptogram (do87 and do97) CopyBytes(offset, buffer + i, apdu); do87Data += i; i += offset; // Padding i = SM_ISO7816_4_pad(buffer, i); // Verify the MAC SM_CBC_sign(i, buffer, mac, SM_KEY_BYTES, params->key_mac, SM_IV); if (NotEqual(SM_MAC_BYTES, mac, apdu + offset + 2)) { return SM_ERROR_MAC_INVALID; } // Decrypt data if available if (do87DataBytes != 0) { SM_CBC_decrypt(do87DataBytes, buffer + do87Data, apdu, SM_IV, SM_KEY_BYTES, params->key_enc); Lc = do87DataBytes; if (SM_ISO7816_4_unpad(apdu, &Lc) < 0) { return SM_ERROR_PADDING_INVALID; } else { return Lc; } } }