Moved loading functions to util.c.
[bcr-a2csamples.git] / printcert / util.c
blobe4f5d06203fdf18c47328b99157b140a859a26ad
1 #include "rfc3280.h"
3 #include "util.h"
5 #define BUFFER_LENGTH 4096
7 static A2C_ERROR _A2C_DecodeBerFile(PVOID * ppv, PC_A2C_DESCRIPTOR pdesc, int flags, FILE* file)
9 unsigned char buffer[BUFFER_LENGTH];
10 int return_code = 0;
11 A2C_CONTEXT* pcxt = NULL;
12 A2C_ERROR err = A2C_ERROR_Success;
14 while (1)
16 return_code = fread(buffer, 1, sizeof(buffer), file);
18 if (return_code < 0)
20 err = A2C_ERROR_malformedEncoding;
21 break;
24 if (return_code == 0)
26 break;
29 err = A2C_DecodeBer(
30 ppv,
31 pdesc,
32 flags,
33 &pcxt,
34 buffer,
35 return_code
37 if ((err < A2C_ERROR_Success) && (err != A2C_ERROR_needMoreData))
39 break;
42 flags |= A2C_FLAGS_MORE_DATA;
45 if ((err < A2C_ERROR_Success) && (pcxt != NULL))
47 /* A2C_FreeContext(pcxt); */
50 return err;
53 Cert_Certificate* read_certificate_from_file(const char* filename)
55 A2C_ERROR err = A2C_ERROR_Success;
56 Cert_Certificate* certificate = NULL;
57 FILE* file = NULL;
59 file = fopen(filename, "rb");
60 if (file == NULL)
62 perror(filename);
63 return NULL;
66 err = _A2C_DecodeBerFile(
67 (PVOID*) &certificate,
68 &Cert_Certificate_descriptor,
70 file
73 (void) fclose(file);
75 if (err < A2C_ERROR_Success)
77 return NULL;
80 return certificate;