3 * Cryptographic challenges
5 * (c) 2005 Straylight/Edgeware
8 /*----- Licensing notice --------------------------------------------------*
10 * This file is part of Trivial IP Encryption (TrIPE).
12 * TrIPE is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * TrIPE is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with TrIPE; if not, write to the Free Software Foundation,
24 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 /*----- Header files ------------------------------------------------------*/
31 /*----- Static variables --------------------------------------------------*/
37 /*----- Main code ---------------------------------------------------------*/
39 /* --- @c_genkey@ --- *
45 * Use: Generates a new challenge key.
48 static void c_genkey(void)
50 if (mac
&& GM_CLASS(mac
) == master
->algs
.m
&& oseq
< 0x07ffffff) return;
51 if (mac
) GM_DESTROY(mac
);
52 assert(master
->algs
.mksz
< sizeof(buf_t
));
53 rand_get(RAND_GLOBAL
, buf_t
, master
->algs
.mksz
);
54 mac
= GM_KEY(master
->algs
.m
, buf_t
, master
->algs
.mksz
);
58 trace(T_CHAL
, "chal: generated new challenge key");
59 trace_block(T_CRYPTO
, "chal: new key", buf_t
, master
->algs
.mksz
);
65 * Arguments: @buf *b@ = where to put the challenge
67 * Returns: Zero if OK, nonzero on error.
69 * Use: Issues a new challenge.
79 if (buf_putu32(b
, oseq
++)) return (-1);
81 GH_HASH(h
, p
, BCUR(b
) - p
);
82 buf_put(b
, GH_DONE(h
, 0), master
->algs
.tagsz
);
84 if (BBAD(b
)) return (-1);
86 trace(T_CHAL
, "chal: issuing challenge %lu", (unsigned long)(oseq
- 1));
87 trace_block(T_CRYPTO
, "chal: challenge block", p
, BCUR(b
) - p
);
92 /* --- @c_check@ --- *
94 * Arguments: @buf *b@ = where to find the challenge
96 * Returns: Zero if OK, nonzero if it didn't work.
98 * Use: Checks a challenge. On failure, the buffer is broken.
104 size_t sz
= 4 + master
->algs
.tagsz
;
109 if ((p
= buf_get(b
, sz
)) == 0) {
110 a_warn("CHAL", "invalid-challenge", A_END
);
113 IF_TRACING(T_CHAL
, trace_block(T_CRYPTO
, "chal: check challenge", p
, sz
); )
115 a_warn("CHAL", "impossible-challenge", A_END
);
120 ok
= ct_memeq(GH_DONE(h
, 0), p
+ 4, master
->algs
.tagsz
);
123 a_warn("CHAL", "incorrect-tag", A_END
);
127 if (seq_check(&iseq
, seq
, "CHAL"))
129 T( trace(T_CHAL
, "chal: checked challenge %lu", (unsigned long)seq
); )
137 /*----- That's all, folks -------------------------------------------------*/