Files
mosh/src/crypto/prng.h
T
Keegan McAllister d1c4b0a5d7 Test the OCB-AES reference implementation
This tests cryptographic primitives implemented by others.  It uses the same
interfaces and indeed the same compiled object code as the Mosh client and
server.  It does not particularly test any code written for the Mosh project.
2012-04-06 23:43:42 -04:00

84 lines
1.8 KiB
C++

/*
Mosh: the mobile shell
Copyright 2012 Keith Winstein
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PRNG_HPP
#define PRNG_HPP
#include <string>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>
#include "crypto.h"
/* Read random bytes from /dev/urandom.
We rely on stdio buffering for efficiency. */
static const char rdev[] = "/dev/urandom";
using namespace Crypto;
class PRNG {
private:
FILE *randfile;
/* unimplemented to satisfy -Weffc++ */
PRNG( const PRNG & );
PRNG & operator=( const PRNG & );
public:
PRNG() : randfile( fopen( rdev, "rb" ) )
{
if ( randfile == NULL ) {
throw CryptoException( std::string( rdev ) + ": " + strerror( errno ) );
}
}
~PRNG() {
if ( 0 != fclose( randfile ) ) {
throw CryptoException( std::string( rdev ) + ": " + strerror( errno ) );
}
}
void fill( void *dest, size_t size ) {
if ( 0 == size ) {
return;
}
if ( 1 != fread( dest, size, 1, randfile ) ) {
throw CryptoException( "Could not read from " + std::string( rdev ) );
}
}
uint8_t uint8() {
uint8_t x;
fill( &x, 1 );
return x;
}
uint32_t uint32() {
uint32_t x;
fill( &x, 4 );
return x;
}
};
#endif