store gnutls patch for fully-enabling the monkeysphere on FreeBSD 7.1, which ships...
[monkeysphere.git] / packaging / freebsd / security / gnutls / files / patch-lib__opencdk__opencdk__use-GNU-dummy.diff
1 --- ./lib/opencdk/opencdk.h.orig        2008-06-30 16:45:51.000000000 -0400
2 +++ ./lib/opencdk/opencdk.h     2008-08-21 19:23:44.000000000 -0400
3 @@ -214,7 +214,11 @@
4  enum cdk_s2k_type_t {
5      CDK_S2K_SIMPLE     = 0,
6      CDK_S2K_SALTED     = 1,
7 -    CDK_S2K_ITERSALTED = 3
8 +    CDK_S2K_ITERSALTED = 3,
9 +    CDK_S2K_GNU_EXT = 101 
10 + /* GNU S2K extensions: refer to DETAILS from GnuPG: 
11 +  http://cvs.gnupg.org/cgi-bin/viewcvs.cgi/trunk/doc/DETAILS?root=GnuPG
12 + */
13  };
14  
15  
16 --- ./lib/opencdk/read-packet.c.orig    2008-06-30 16:45:51.000000000 -0400
17 +++ ./lib/opencdk/read-packet.c 2008-08-21 19:30:09.000000000 -0400
18 @@ -78,10 +78,35 @@
19  }
20  
21  
22 -static int
23 +/* read about S2K at http://tools.ietf.org/html/rfc4880#section-3.7.1 */
24 +static cdk_error_t
25  read_s2k (cdk_stream_t inp, cdk_s2k_t s2k)
26  {
27 -  return CDK_Not_Implemented;
28 +  size_t nread;
29 +
30 +  s2k->mode = cdk_stream_getc (inp);
31 +  s2k->hash_algo = cdk_stream_getc (inp);
32 +  if (s2k->mode == CDK_S2K_SIMPLE) 
33 +      return 0;
34 +  else if (s2k->mode == CDK_S2K_SALTED || s2k->mode == CDK_S2K_ITERSALTED)
35 +    {
36 +      if (stream_read (inp, s2k->salt, DIM (s2k->salt), &nread))
37 +       return CDK_Inv_Packet;
38 +      if (nread != DIM (s2k->salt))
39 +       return CDK_Inv_Packet;
40 +      
41 +      if (s2k->mode == CDK_S2K_ITERSALTED)
42 +       s2k->count = cdk_stream_getc (inp);
43 +    }
44 +  else if (s2k->mode == CDK_S2K_GNU_EXT)
45 +    {
46 +      /* GNU extensions to the S2K : read DETAILS from gnupg */
47 +      return 0;
48 +    }
49 +  else
50 +    return CDK_Not_Implemented;
51 +
52 +  return 0;
53  }
54  
55  
56 @@ -194,6 +219,7 @@
57  static cdk_error_t
58  read_symkey_enc (cdk_stream_t inp, size_t pktlen, cdk_pkt_symkey_enc_t ske)
59  {
60 +  cdk_error_t ret;
61    cdk_s2k_t s2k;
62    size_t minlen;
63    size_t nread, nleft;
64 @@ -213,7 +239,9 @@
65      return CDK_Out_Of_Core;
66    
67    ske->cipher_algo = cdk_stream_getc (inp);
68 -  s2k->mode = cdk_stream_getc (inp);
69 +  ret = read_s2k(inp, s2k);
70 +  if (ret != 0)
71 +    return ret;
72    switch (s2k->mode)
73      {
74      case CDK_S2K_SIMPLE    : minlen = 0; break;
75 @@ -225,18 +253,6 @@
76        return CDK_Inv_Packet;
77      }
78    
79 -  s2k->hash_algo = cdk_stream_getc (inp);
80 -  if (s2k->mode == CDK_S2K_SALTED || s2k->mode == CDK_S2K_ITERSALTED)
81 -    {
82 -      if (stream_read (inp, s2k->salt, DIM (s2k->salt), &nread))
83 -       return CDK_Inv_Packet;
84 -      if (nread != DIM (s2k->salt))
85 -       return CDK_Inv_Packet;
86 -      
87 -      if (s2k->mode == CDK_S2K_ITERSALTED)
88 -       s2k->count = cdk_stream_getc (inp);
89 -    }
90 -  
91    ske->seskeylen = pktlen - 4 - minlen;
92    /* We check if there is an encrypted session key and if it fits into
93       the buffer. The maximal key length is 256-bit. */
94 @@ -421,14 +437,19 @@
95        rc = read_s2k (inp, sk->protect.s2k);
96        if (rc) 
97         return rc;
98 -      sk->protect.ivlen = gcry_cipher_get_algo_blklen (sk->protect.algo);
99 -      if (!sk->protect.ivlen)
100 -       return CDK_Inv_Packet;
101 -      rc = stream_read (inp, sk->protect.iv, sk->protect.ivlen, &nread);
102 -      if (rc)
103 -       return rc;
104 -      if (nread != sk->protect.ivlen)
105 -       return CDK_Inv_Packet;
106 +      /* refer to --export-secret-subkeys in gpg(1) */
107 +      if (sk->protect.s2k->mode == CDK_S2K_GNU_EXT) 
108 +       sk->protect.ivlen = 0;
109 +      else {
110 +       sk->protect.ivlen = gcry_cipher_get_algo_blklen (sk->protect.algo);
111 +       if (!sk->protect.ivlen)
112 +         return CDK_Inv_Packet;
113 +       rc = stream_read (inp, sk->protect.iv, sk->protect.ivlen, &nread);
114 +       if (rc)
115 +         return rc;
116 +       if (nread != sk->protect.ivlen)
117 +         return CDK_Inv_Packet;
118 +      }
119      }
120    else
121      sk->protect.algo = sk->s2k_usage;
122 @@ -476,6 +497,22 @@
123         return CDK_Out_Of_Core;
124        if (stream_read (inp, sk->encdata, sk->enclen, &nread))
125         return CDK_Inv_Packet;
126 +      /* Handle the GNU S2K extensions we know (just gnu-dummy right now): */
127 +      if (sk->protect.s2k->mode == CDK_S2K_GNU_EXT) {
128 +       unsigned char gnumode;
129 +       if ((sk->enclen < strlen("GNU") + 1) ||
130 +           (0 != memcmp("GNU", sk->encdata, strlen("GNU"))))
131 +         return CDK_Inv_Packet;
132 +       gnumode = sk->encdata[strlen("GNU")];
133 +       /* we only handle gnu-dummy (mode 1).
134 +          mode 2 should refer to external smart cards.
135 +       */
136 +       if (gnumode != 1)
137 +         return CDK_Inv_Packet;
138 +       /* gnu-dummy should have no more data */
139 +       if (sk->enclen != strlen("GNU") + 1)
140 +         return CDK_Inv_Packet;
141 +      }
142        nskey = cdk_pk_get_nskey (sk->pk->pubkey_algo);
143        if (!nskey)
144         return CDK_Inv_Algo;