75 lines
1.9 KiB
C
75 lines
1.9 KiB
C
/* { dg-do compile } */
|
|
/* { dg-options "-O2" } */
|
|
|
|
typedef unsigned char uint8_t;
|
|
typedef unsigned int uint32_t;
|
|
typedef uint8_t byte;
|
|
typedef uint32_t u32bit;
|
|
__extension__ typedef __SIZE_TYPE__ size_t;
|
|
extern "C" {
|
|
extern void __warn_memset_zero_len (void) __attribute__((__warning__ ("")));
|
|
extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__, __artificial__))
|
|
void * memset (void *__dest, int __ch, size_t __len) throw () {
|
|
if (__builtin_constant_p (__len) && __len == 0)
|
|
__warn_memset_zero_len (); /* { dg-warning "" } */
|
|
}
|
|
}
|
|
inline void clear_mem(void* ptr, u32bit n) {
|
|
memset(ptr, 0, n);
|
|
}
|
|
template<typename T> class MemoryRegion {
|
|
public:
|
|
u32bit size() const {
|
|
}
|
|
const T* begin() const {
|
|
}
|
|
void set(const T in[], u32bit n) {
|
|
create(n);
|
|
}
|
|
void set(const MemoryRegion<T>& in) {
|
|
set(in.begin(), in.size());
|
|
}
|
|
void clear() {
|
|
clear_mem(buf, allocated);
|
|
}
|
|
void create(u32bit);
|
|
MemoryRegion() {
|
|
used = allocated = 0;
|
|
}
|
|
mutable T* buf;
|
|
mutable u32bit used;
|
|
mutable u32bit allocated;
|
|
};
|
|
template<typename T> void MemoryRegion<T>::create(u32bit n) {
|
|
if(n <= allocated) {
|
|
clear();
|
|
}
|
|
}
|
|
template<typename T> class SecureVector : public MemoryRegion<T> {
|
|
public:
|
|
SecureVector<T>& operator=(const MemoryRegion<T>& in) {
|
|
if(this != &in) set(in);
|
|
}
|
|
};
|
|
class OctetString {
|
|
public:
|
|
SecureVector<byte> bits_of() const {
|
|
}
|
|
OctetString& operator^=(const OctetString&);
|
|
void change(const MemoryRegion<byte>& in) {
|
|
bits = in;
|
|
}
|
|
OctetString(const MemoryRegion<byte>& in) {
|
|
change(in);
|
|
}
|
|
SecureVector<byte> bits;
|
|
};
|
|
OctetString& OctetString::operator^=(const OctetString& k) {
|
|
if(&k == this) {
|
|
bits.clear();
|
|
}
|
|
}
|
|
bool operator==(const OctetString& s1, const OctetString& s2) {
|
|
return (s1.bits_of() == s2.bits_of());
|
|
}
|