00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00040 #ifndef AEGIS_CRYPTO_H
00041 #define AEGIS_CRYPTO_H
00042 #endif
00043
00044 #include "aegis_common.h"
00045
00046 #ifdef __cplusplus
00047 extern "C" {
00048 #endif
00049
00061 #define MAX_CRYPTO_INPUT_SIZE 4050
00062
00067 #define SIGNATURE_LENGTH 20
00068
00075 typedef struct aegis_signature_t {
00076 unsigned char d[SIGNATURE_LENGTH];
00077 } AEGIS_SIGNATURE_T;
00078
00084 #define SIGNATURE_STRING_LENGTH_HEX 40
00085
00091 #define SIGNATURE_STRING_LENGTH_BASE64 30
00092
00098 #define APPLICATION_ID NULL
00099
00112 #define AEGISFS_SGN_XATTR ".aegisfs-signature"
00113
00119 #define AEGISFS_VFY_TOKEN "aegisfs::aegisfs-verify"
00120
00126 #define AEGISFS_VFY_DATALEN 32
00127
00138 typedef enum {
00139 aegis_system_open,
00140 aegis_system_protected,
00141 aegis_system_emulated,
00142 aegis_system_plain
00143 } aegis_system_mode_t;
00144
00155 aegis_system_mode_t
00156 aegis_current_mode(void);
00157
00165 typedef enum {
00166 aegis_crypto_ok = 0,
00167 aegis_crypto_error,
00170 aegis_crypto_error_signature_missing,
00171 aegis_crypto_error_wrong_signature
00172 } aegis_crypto_result;
00173
00180 typedef enum {
00181 sysinvariant_imei
00182 } aegis_sysinvariant_t;
00183
00188 const char*
00189 aegis_system_invariant(aegis_sysinvariant_t invariant);
00190
00191
00199 void aegis_application_id(pid_t of_pid, char **to_this);
00200
00206 #define UNKNOWN_APP_ID "unknown.unknown."
00207
00215 void aegis_application_id_of_bin(const char* pathname, char **to_this);
00216
00228 aegis_crypto_result
00229 aegis_crypto_sign(const RAWDATA_PTR data,
00230 const size_t nbrof_bytes,
00231 const char *with_token,
00232 struct aegis_signature_t *signature);
00233
00244 aegis_crypto_result
00245 aegis_crypto_verify(struct aegis_signature_t *signature,
00246 const char *with_token,
00247 const RAWDATA_PTR data,
00248 const size_t nbrof_bytes,
00249 aegis_system_mode_t* made_in_mode);
00250
00255 typedef enum {
00256 aegis_as_hexstring,
00257 aegis_as_base64
00258 } aegis_format_t;
00259
00270 size_t
00271 aegis_crypto_signature_to_string(struct aegis_signature_t *from,
00272 const aegis_format_t use_format,
00273 const char* token_name,
00274 char **to);
00275
00285 aegis_crypto_result
00286 aegis_crypto_string_to_signature(const char *from,
00287 struct aegis_signature_t *to,
00288 char **token_name);
00289
00295 aegis_crypto_result
00296 aegis_crypto_free(RAWDATA_PTR ptr);
00297
00310 aegis_crypto_result
00311 aegis_crypto_encrypt(const RAWDATA_PTR plaintext,
00312 const size_t nbrof_bytes,
00313 const char *token_name,
00314 RAWDATA_RPTR ciphertext,
00315 size_t *result_size);
00316
00329 aegis_crypto_result
00330 aegis_crypto_decrypt(const RAWDATA_PTR ciphertext,
00331 const size_t nbrof_bytes,
00332 const char *token_name,
00333 RAWDATA_RPTR plaintext,
00334 size_t *result_size);
00335
00345 const char*
00346 aegis_crypto_last_error_str(void);
00347
00365 int aegis_crypto_init(void);
00366
00377 void aegis_crypto_finish(void);
00378
00387 ssize_t aegis_crypto_random(RAWDATA_PTR to_buf, size_t bytes);
00388
00397 size_t aegis_crypto_new_symkey(RAWDATA_RPTR to_buf);
00398
00405 size_t aegis_crypto_symkeylen(void);
00406
00419 aegis_crypto_result
00420 aegis_crypto_sign_file(const char *pathname,
00421 const void *data,
00422 const size_t len,
00423 const char *with_token);
00434 aegis_crypto_result
00435 aegis_crypto_verify_file(const char *pathname,
00436 const void *data,
00437 const size_t len,
00438 const char *with_token);
00439
00458 aegis_crypto_result
00459 aegis_crypto_verify_aegisfs(const char *dir,
00460 aegis_system_mode_t *cmode);
00461
00462 #ifdef __cplusplus
00463 };
00464 #endif