mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-12 03:18:26 -06:00
EMV keyfile support: Overall code improvements and bug fixes
This commit is contained in:
@@ -1,80 +1,80 @@
|
||||
//
|
||||
// Created by bshp on 1/20/23.
|
||||
//
|
||||
#ifndef TC_HEADER_Common_TLVPARSER
|
||||
#define TC_HEADER_Common_TLVPARSER
|
||||
|
||||
#ifndef ICC_EXTRACTOR_TLVPARSER_H
|
||||
#define ICC_EXTRACTOR_TLVPARSER_H
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <algorithm>
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include "iostream"
|
||||
#include "Platform/PlatformBase.h"
|
||||
#include "Tcdefs.h"
|
||||
using namespace std;
|
||||
struct TLVNode{
|
||||
uint16_t Tag; /* T */
|
||||
uint16_t Length; /* L */
|
||||
unsigned char* Value; /* V */
|
||||
unsigned char TagSize;
|
||||
unsigned char LengthSize;
|
||||
uint16_t MoreFlag; /* Used In Sub */
|
||||
uint16_t SubFlag; /* Does it have sub-nodes? */
|
||||
uint16_t SubCount;
|
||||
shared_ptr<TLVNode> Sub[256];
|
||||
shared_ptr<TLVNode> Next;
|
||||
|
||||
~TLVNode() {
|
||||
burn(Value, Length);
|
||||
delete Value;
|
||||
}
|
||||
};
|
||||
|
||||
class TLVParser{
|
||||
private :
|
||||
|
||||
/* TLV node structure creation */
|
||||
static shared_ptr<TLVNode> TLV_CreateNode();
|
||||
|
||||
/* Check if the bit is correct */
|
||||
static uint16_t CheckBit(unsigned char value, int bit);
|
||||
|
||||
/* Parsing one TLV node */
|
||||
static shared_ptr<TLVNode> TLV_Parse_One(unsigned char* buf,int size);
|
||||
|
||||
/* Parsing all TLV nodes */
|
||||
static int TLV_Parse_SubNodes(shared_ptr<TLVNode> parent);
|
||||
|
||||
/* Parsing all sub-nodes (in width not in depth) of a given parent node */
|
||||
static int TLV_Parse_All(shared_ptr<TLVNode> parent);
|
||||
|
||||
/* Recursive function to parse all nodes starting from a root parent node */
|
||||
static void TLV_Parse_Sub(shared_ptr<TLVNode> parent);
|
||||
|
||||
public:
|
||||
|
||||
/* Parsing TLV from a buffer and constructing TLV structure */
|
||||
static shared_ptr<TLVNode> TLV_Parse(unsigned char* buf,int size);
|
||||
|
||||
/* Finding a TLV node with a particular tag */
|
||||
static shared_ptr<TLVNode> TLV_Find(shared_ptr<TLVNode> node,uint16_t tag);
|
||||
};
|
||||
|
||||
/* The definition of the exception class related to the TLV parsing */
|
||||
class TLVException
|
||||
namespace VeraCrypt
|
||||
{
|
||||
public:
|
||||
TLVException(std::string errormessage): m_errormessage(errormessage){}
|
||||
|
||||
/* Get the error message */
|
||||
inline std::string ErrorMessage() const
|
||||
struct TLVNode
|
||||
{
|
||||
return m_errormessage;
|
||||
}
|
||||
uint16 Tag; /* T */
|
||||
uint16 Length; /* L */
|
||||
shared_ptr<vector<byte>> Value; /* V */
|
||||
byte TagSize;
|
||||
byte LengthSize;
|
||||
uint16 MoreFlag; /* Used In Sub */
|
||||
uint16 SubFlag; /* Does it have sub-nodes? */
|
||||
shared_ptr<vector<shared_ptr<TLVNode>>> Subs;
|
||||
|
||||
protected:
|
||||
std::string m_errormessage;
|
||||
};
|
||||
TLVNode() : Tag(0), Length(0), TagSize(0), LengthSize(0), MoreFlag(0), SubFlag(0)
|
||||
{
|
||||
Value = make_shared<vector<byte>>();
|
||||
Subs = make_shared<vector<shared_ptr<TLVNode>>>();
|
||||
}
|
||||
|
||||
#endif //ICC_EXTRACTOR_TLVPARSER_H
|
||||
~TLVNode()
|
||||
{
|
||||
burn(Value->data(), Value->size());
|
||||
}
|
||||
};
|
||||
|
||||
class TLVParser
|
||||
{
|
||||
private :
|
||||
|
||||
/* TLV node structure creation */
|
||||
static shared_ptr<TLVNode> TLV_CreateNode();
|
||||
|
||||
/* Check if the bit is correct */
|
||||
static uint16 CheckBit(byte value, int bit);
|
||||
|
||||
/* Parsing one TLV node */
|
||||
static shared_ptr<TLVNode> TLV_Parse_One(byte* buf, size_t size);
|
||||
|
||||
/* Parsing all TLV nodes */
|
||||
static int TLV_Parse_SubNodes(shared_ptr<TLVNode> parent);
|
||||
|
||||
/* Parsing all sub-nodes (in width not in depth) of a given parent node */
|
||||
static int TLV_Parse_All(shared_ptr<TLVNode> parent);
|
||||
|
||||
/* Recursive function to parse all nodes starting from a root parent node */
|
||||
static void TLV_Parse_Sub(shared_ptr<TLVNode> parent);
|
||||
|
||||
public:
|
||||
|
||||
/* Parsing TLV from a buffer and constructing TLV structure */
|
||||
static shared_ptr<TLVNode> TLV_Parse(byte* buf, size_t size);
|
||||
|
||||
/* Finding a TLV node with a particular tag */
|
||||
static shared_ptr<TLVNode> TLV_Find(shared_ptr<TLVNode> node, uint16 tag);
|
||||
};
|
||||
|
||||
/* The definition of the exception class related to the TLV parsing */
|
||||
class TLVException
|
||||
{
|
||||
public:
|
||||
TLVException(std::string errormessage): m_errormessage(errormessage){}
|
||||
|
||||
/* Get the error message */
|
||||
inline std::string ErrorMessage() const
|
||||
{
|
||||
return m_errormessage;
|
||||
}
|
||||
|
||||
protected:
|
||||
std::string m_errormessage;
|
||||
};
|
||||
}
|
||||
|
||||
#endif //TC_HEADER_Common_TLVPARSER
|
||||
|
||||
Reference in New Issue
Block a user