| /* { dg-do compile } */ |
| /* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */ |
| /* { dg-options "-ffat-lto-objects -Wno-return-type -Wno-attribute-warning" } */ |
| |
| 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 (); |
| return __dest; |
| } |
| } |
| 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) this->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 __attribute__((flatten)) |
| operator==(const OctetString& s1, const OctetString& s2) { |
| return (s1.bits_of() == s2.bits_of()); |
| } |