NeoMutt  2024-10-02-7-gd3e66a
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
pgplib.c File Reference

Misc PGP helper routines. More...

#include "config.h"
#include <stdbool.h>
#include "mutt/lib.h"
#include "pgplib.h"
+ Include dependency graph for pgplib.c:

Go to the source code of this file.

Functions

const char * pgp_pkalgbytype (unsigned char type)
 Get the name of the algorithm from its ID.
 
bool pgp_canencrypt (unsigned char type)
 Does this algorithm ID support encryption?
 
bool pgp_cansign (unsigned char type)
 Does this algorithm ID support signing?
 
static void pgp_uid_free (struct PgpUid **upp)
 Free a PGP UID.
 
struct PgpUidpgp_copy_uids (struct PgpUid *up, struct PgpKeyInfo *parent)
 Copy a list of PGP UIDs.
 
static void key_free (struct PgpKeyInfo **ptr)
 Free a PGP Key info.
 
struct PgpKeyInfopgp_remove_key (struct PgpKeyInfo **klist, struct PgpKeyInfo *key)
 Remove a PGP key from a list.
 
void pgp_key_free (struct PgpKeyInfo **kpp)
 Free a PGP key info.
 

Detailed Description

Misc PGP helper routines.

Authors
  • Richard Russon
  • Pietro Cerutti

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/.

Definition in file pgplib.c.

Function Documentation

◆ pgp_pkalgbytype()

const char * pgp_pkalgbytype ( unsigned char  type)

Get the name of the algorithm from its ID.

Parameters
typeAlgorithm ID
Return values
ptrAlgorithm name

Definition at line 42 of file pgplib.c.

43{
44 switch (type)
45 {
46 case 1:
47 return "RSA";
48 case 2:
49 return "RSA";
50 case 3:
51 return "RSA";
52 case 16:
53 return "ElG";
54 case 17:
55 return "DSA";
56 case 20:
57 return "ElG";
58 default:
59 return "unk";
60 }
61}
+ Here is the caller graph for this function:

◆ pgp_canencrypt()

bool pgp_canencrypt ( unsigned char  type)

Does this algorithm ID support encryption?

Parameters
typeAlgorithm ID
Return values
trueAlgorithm does support encryption

Definition at line 68 of file pgplib.c.

69{
70 switch (type)
71 {
72 case 1:
73 case 2:
74 case 16:
75 case 20:
76 return true;
77 default:
78 return false;
79 }
80}

◆ pgp_cansign()

bool pgp_cansign ( unsigned char  type)

Does this algorithm ID support signing?

Parameters
typeAlgorithm ID
Return values
trueAlgorithm does support signing

Definition at line 87 of file pgplib.c.

88{
89 switch (type)
90 {
91 case 1:
92 case 3:
93 case 17:
94 case 20:
95 return true;
96 default:
97 return false;
98 }
99}

◆ pgp_uid_free()

static void pgp_uid_free ( struct PgpUid **  upp)
static

Free a PGP UID.

Parameters
[out]uppPGP UID to free

Definition at line 105 of file pgplib.c.

106{
107 struct PgpUid *up = NULL, *q = NULL;
108
109 if (!upp || !*upp)
110 return;
111 for (up = *upp; up; up = q)
112 {
113 q = up->next;
114 FREE(&up->addr);
115 FREE(&up);
116 }
117
118 *upp = NULL;
119}
#define FREE(x)
Definition: memory.h:45
PGP User ID.
Definition: pgplib.h:35
char * addr
Definition: pgplib.h:36
struct PgpUid * next
Linked list.
Definition: pgplib.h:40
+ Here is the caller graph for this function:

◆ pgp_copy_uids()

struct PgpUid * pgp_copy_uids ( struct PgpUid up,
struct PgpKeyInfo parent 
)

Copy a list of PGP UIDs.

Parameters
upList of PGP UIDs
parentParent PGP key
Return values
ptrNew list of PGP UIDs

Definition at line 127 of file pgplib.c.

128{
129 struct PgpUid *l = NULL;
130 struct PgpUid **lp = &l;
131
132 for (; up; up = up->next)
133 {
134 *lp = mutt_mem_calloc(1, sizeof(struct PgpUid));
135 (*lp)->trust = up->trust;
136 (*lp)->flags = up->flags;
137 (*lp)->addr = mutt_str_dup(up->addr);
138 (*lp)->parent = parent;
139 lp = &(*lp)->next;
140 }
141
142 return l;
143}
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:51
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:253
short trust
Definition: pgplib.h:37
struct PgpKeyInfo * parent
Parent key.
Definition: pgplib.h:39
int flags
Definition: pgplib.h:38
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ key_free()

static void key_free ( struct PgpKeyInfo **  ptr)
static

Free a PGP Key info.

Parameters
[out]ptrPGP Key info to free

Definition at line 149 of file pgplib.c.

150{
151 if (!ptr || !*ptr)
152 return;
153
154 struct PgpKeyInfo *key = *ptr;
155
156 pgp_uid_free(&key->address);
157 FREE(&key->keyid);
158 FREE(&key->fingerprint);
159
160 FREE(ptr);
161}
static void pgp_uid_free(struct PgpUid **upp)
Free a PGP UID.
Definition: pgplib.c:105
Information about a PGP key.
Definition: pgplib.h:47
char * keyid
Definition: pgplib.h:48
struct PgpUid * address
Definition: pgplib.h:50
char * fingerprint
Definition: pgplib.h:49
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ pgp_remove_key()

struct PgpKeyInfo * pgp_remove_key ( struct PgpKeyInfo **  klist,
struct PgpKeyInfo key 
)

Remove a PGP key from a list.

Parameters
[out]klistList of PGP Keys
[in]keyKey to remove
Return values
ptrUpdated list of PGP Keys

Definition at line 169 of file pgplib.c.

170{
171 if (!klist || !*klist || !key)
172 return NULL;
173
174 struct PgpKeyInfo **last = NULL;
175 struct PgpKeyInfo *p = NULL, *q = NULL, *r = NULL;
176
177 if (key->parent && (key->parent != key))
178 key = key->parent;
179
180 last = klist;
181 for (p = *klist; p && p != key; p = p->next)
182 last = &p->next;
183
184 if (!p)
185 return NULL;
186
187 for (q = p->next, r = p; q && q->parent == p; q = q->next)
188 r = q;
189
190 if (r)
191 r->next = NULL;
192
193 *last = q;
194 return q;
195}
struct PgpKeyInfo * next
Definition: pgplib.h:57
struct PgpKeyInfo * parent
Definition: pgplib.h:56
+ Here is the caller graph for this function:

◆ pgp_key_free()

void pgp_key_free ( struct PgpKeyInfo **  kpp)

Free a PGP key info.

Parameters
[out]kppPGP key info to free

Definition at line 201 of file pgplib.c.

202{
203 if (!kpp || !*kpp)
204 return;
205
206 struct PgpKeyInfo *p = NULL, *q = NULL, *r = NULL;
207
208 if ((*kpp)->parent && ((*kpp)->parent != *kpp))
209 *kpp = (*kpp)->parent;
210
211 /* Order is important here:
212 *
213 * - First free all children.
214 * - If we are an orphan (i.e., our parent was not in the key list),
215 * free our parent.
216 * - free ourselves. */
217
218 for (p = *kpp; p; p = q)
219 {
220 for (q = p->next; q && q->parent == p; q = r)
221 {
222 r = q->next;
223 key_free(&q);
224 }
225
226 key_free(&p->parent);
227 key_free(&p);
228 }
229
230 *kpp = NULL;
231}
static void key_free(struct PgpKeyInfo **ptr)
Free a PGP Key info.
Definition: pgplib.c:149
+ Here is the call graph for this function:
+ Here is the caller graph for this function: