summaryrefslogtreecommitdiff
path: root/rsa-compat.h
blob: ad5c27577bd92025b12959d27fa3c8324fb42c9b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/* rsa-compat.h
 *
 * The RSA publickey algorithm, RSAREF compatible interface.
 */

/* nettle, low-level cryptographics library
 *
 * Copyright (C) 2001 Niels Möller
 *  
 * The nettle library is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or (at your
 * option) any later version.
 * 
 * The nettle library 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 Lesser General Public
 * License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with the nettle library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 * MA 02111-1307, USA.
 */
 
#ifndef NETTLE_RSA_COMPAT_H_INCLUDED
#define NETTLE_RSA_COMPAT_H_INCLUDED

#include "rsa.h"

/* 256 octets or 2048 bits */
#define MAX_RSA_MODULUS_LEN 256

typedef struct
{
  unsigned bits;
  uint8_t modulus[MAX_RSA_MODULUS_LEN];
  uint8_t exponent[MAX_RSA_MODULUS_LEN];
} R_RSA_PUBLIC_KEY;

typedef struct
{
  unsigned bits;
  uint8_t modulus[MAX_RSA_MODULUS_LEN];
  uint8_t publicExponent[MAX_RSA_MODULUS_LEN];
  uint8_t exponent[MAX_RSA_MODULUS_LEN];
  uint8_t prime[2][MAX_RSA_MODULUS_LEN];
  uint8_t primeExponent[2][MAX_RSA_MODULUS_LEN];
  uint8_t coefficient[MAX_RSA_MODULUS_LEN];
} R_RSA_PRIVATE_KEY;

/* Only MD5 is supported for now */
typedef struct
{
  struct md5_ctx hash;
} R_SIGNATURE_CTX;

/* Digest algorithms */
/* DA_MD2 not implemented */
enum { DA_MD5 = 1 };

/* Return values */
enum {
  RE_SUCCESS = 0,
  RE_CONTENT_ENCODING,     /* encryptedContent has RFC 1421 encoding error */
  RE_DATA,                 /* other party's private value out of range */
  RE_DIGEST_ALGORITHM,     /* message-digest algorithm is invalid */
  RE_ENCODING,             /* encoded block has RFC 1421 encoding error */
  RE_ENCRYPTION_ALGORITHM, /* encryption algorithm is invalid */
  RE_KEY,                  /* recovered data encryption key cannot decrypt */
  RE_KEY_ENCODING,         /* encrypted key has RFC 1421 encoding error */
  RE_LEN,                  /* signatureLen out of range */
  RE_MODULUS_LEN,          /* modulus length invalid */
  RE_NEED_RANDOM,          /* random structure is not seeded */
  RE_PRIVATE_KEY,          /* private key cannot encrypt message digest, */
  RE_PUBLIC_KEY,           /* publicKey cannot decrypt signature */
  RE_SIGNATURE,            /* signature is incorrect */
  RE_SIGNATURE_ENCODING,   /* encodedSignature has RFC 1421 encoding error */
};

int
R_SignInit(R_SIGNATURE_CTX *ctx,
           int digestAlgorithm);

int
R_SignUpdate(R_SIGNATURE_CTX *ctx,
             const uint8_t *data,
             /* Length is an unsigned char according to rsaref.txt,
              * but that must be a typo. */
             unsigned length);

int
R_SignFinal(R_SIGNATURE_CTX *ctx,
            uint8_t *signature,
            unsigned *length,
            R_RSA_PRIVATE_KEY *key);

int
R_VerifyInit(R_SIGNATURE_CTX *ctx,
             int digestAlgorithm);

int
R_VerifyUpdate(R_SIGNATURE_CTX *ctx,
               const uint8_t *data,
               /* Length is an unsigned char according to rsaref.txt,
                * but that must be a typo. */
               unsigned length);

int
R_VerifyFinal(R_SIGNATURE_CTX *ctx,
              uint8_t *signature,
              unsigned length,
              R_RSA_PUBLIC_KEY *key);


#endif /* NETTLE_RSA_COMPAT_H_INCLUDED */