92 lines
1.9 KiB
C++
92 lines
1.9 KiB
C++
|
#ifndef _library__httpauth__hpp__included__
|
||
|
#define _library__httpauth__hpp__included__
|
||
|
|
||
|
#include "curve25519.hpp"
|
||
|
#include "skein.hpp"
|
||
|
#include <string>
|
||
|
#include <cstring>
|
||
|
|
||
|
/**
|
||
|
* DH25519 HTTP auth class.
|
||
|
*/
|
||
|
class dh25519_http_auth
|
||
|
{
|
||
|
public:
|
||
|
/**
|
||
|
* Internal hashing instance.
|
||
|
*/
|
||
|
class request_hash
|
||
|
{
|
||
|
public:
|
||
|
/**
|
||
|
* Construct.
|
||
|
*/
|
||
|
request_hash(const std::string& _id, const uint8_t* _key, unsigned _nonce, skein_hash _h,
|
||
|
const uint8_t* _prereq)
|
||
|
: id(_id), nonce(_nonce), h(_h)
|
||
|
{
|
||
|
memcpy(pubkey, _key, 32);
|
||
|
memcpy(prereq, _prereq, 8);
|
||
|
}
|
||
|
/**
|
||
|
* Append data to hash.
|
||
|
*/
|
||
|
void hash(const uint8_t* data, size_t datalen)
|
||
|
{
|
||
|
h.write(data, datalen);
|
||
|
}
|
||
|
/**
|
||
|
* Read the final Authorization header.
|
||
|
*/
|
||
|
std::string get_authorization();
|
||
|
private:
|
||
|
std::string id;
|
||
|
uint8_t pubkey[32];
|
||
|
uint8_t prereq[8];
|
||
|
unsigned nonce;
|
||
|
skein_hash h;
|
||
|
};
|
||
|
/**
|
||
|
* Create a new instance.
|
||
|
*
|
||
|
* Parameter privkey: The private key (32 bytes).
|
||
|
*/
|
||
|
dh25519_http_auth(const uint8_t* privkey);
|
||
|
/**
|
||
|
* Format a session creation request
|
||
|
*
|
||
|
* Returns: The value for Authorization header.
|
||
|
*/
|
||
|
std::string format_get_session_request();
|
||
|
/**
|
||
|
* Start request hash computation. Hashes in the shared secret and nonce. The nonce is incremented.
|
||
|
*
|
||
|
* Parameter url: The notional URL.
|
||
|
* Returns: The skein hash instance.
|
||
|
*/
|
||
|
request_hash start_request(const std::string& url, const std::string& verb);
|
||
|
/**
|
||
|
* Parse session auth response. If it contains new session parameters, the session is updated.
|
||
|
*
|
||
|
* Parameter response: The response from server (WWW-Authenticate).
|
||
|
*/
|
||
|
void parse_auth_response(const std::string& response);
|
||
|
/**
|
||
|
* Is the session ready?
|
||
|
*/
|
||
|
bool is_ready() { return ready; }
|
||
|
/**
|
||
|
* Output pubkey.
|
||
|
*/
|
||
|
void get_pubkey(uint8_t* pubkey);
|
||
|
private:
|
||
|
unsigned char privkey[32];
|
||
|
unsigned char pubkey[32];
|
||
|
unsigned char ssecret[32];
|
||
|
std::string id;
|
||
|
unsigned nonce;
|
||
|
bool ready; //id&ssecret is valid.
|
||
|
};
|
||
|
|
||
|
#endif
|