Browse code

Merge commit '10de408738d28ab17aa5c1fdccd809b0637c12d5'

* commit '10de408738d28ab17aa5c1fdccd809b0637c12d5':
lavf: Update to the new crypto API

Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>

Hendrik Leppkes authored on 2015/09/16 18:06:55
Showing 2 changed files
... ...
@@ -146,8 +146,8 @@ static uint64_t multiswap_dec(const uint32_t keys[12],
146 146
 
147 147
 void ff_asfcrypt_dec(const uint8_t key[20], uint8_t *data, int len)
148 148
 {
149
-    struct AVDES des;
150
-    struct AVRC4 rc4;
149
+    struct AVDES *des;
150
+    struct AVRC4 *rc4;
151 151
     int num_qwords      = len >> 3;
152 152
     uint8_t *qwords     = data;
153 153
     uint64_t rc4buff[8] = { 0 };
... ...
@@ -160,19 +160,26 @@ void ff_asfcrypt_dec(const uint8_t key[20], uint8_t *data, int len)
160 160
             data[i] ^= key[i];
161 161
         return;
162 162
     }
163
+    des = av_des_alloc();
164
+    rc4 = av_rc4_alloc();
165
+    if (!des || !rc4) {
166
+        av_freep(&des);
167
+        av_freep(&rc4);
168
+        return;
169
+    }
163 170
 
164
-    av_rc4_init(&rc4, key, 12 * 8, 1);
165
-    av_rc4_crypt(&rc4, (uint8_t *)rc4buff, NULL, sizeof(rc4buff), NULL, 1);
171
+    av_rc4_init(rc4, key, 12 * 8, 1);
172
+    av_rc4_crypt(rc4, (uint8_t *)rc4buff, NULL, sizeof(rc4buff), NULL, 1);
166 173
     multiswap_init((uint8_t *)rc4buff, ms_keys);
167 174
 
168 175
     packetkey  = AV_RN64(&qwords[num_qwords * 8 - 8]);
169 176
     packetkey ^= rc4buff[7];
170
-    av_des_init(&des, key + 12, 64, 1);
171
-    av_des_crypt(&des, (uint8_t *)&packetkey, (uint8_t *)&packetkey, 1, NULL, 1);
177
+    av_des_init(des, key + 12, 64, 1);
178
+    av_des_crypt(des, (uint8_t *)&packetkey, (uint8_t *)&packetkey, 1, NULL, 1);
172 179
     packetkey ^= rc4buff[6];
173 180
 
174
-    av_rc4_init(&rc4, (uint8_t *)&packetkey, 64, 1);
175
-    av_rc4_crypt(&rc4, data, data, len, NULL, 1);
181
+    av_rc4_init(rc4, (uint8_t *)&packetkey, 64, 1);
182
+    av_rc4_crypt(rc4, data, data, len, NULL, 1);
176 183
 
177 184
     ms_state = 0;
178 185
     for (i = 0; i < num_qwords - 1; i++, qwords += 8)
... ...
@@ -182,4 +189,7 @@ void ff_asfcrypt_dec(const uint8_t key[20], uint8_t *data, int len)
182 182
     packetkey = av_le2ne64(packetkey);
183 183
     packetkey = multiswap_dec(ms_keys, ms_state, packetkey);
184 184
     AV_WL64(qwords, packetkey);
185
+
186
+    av_free(rc4);
187
+    av_free(des);
185 188
 }
... ...
@@ -74,7 +74,7 @@ typedef struct OMAContext {
74 74
     uint8_t sm_val[8];
75 75
     uint8_t e_val[8];
76 76
     uint8_t iv[8];
77
-    struct AVDES av_des;
77
+    struct AVDES *av_des;
78 78
 } OMAContext;
79 79
 
80 80
 static void hex_log(AVFormatContext *s, int level,
... ...
@@ -125,28 +125,34 @@ static int rprobe(AVFormatContext *s, uint8_t *enc_header, unsigned size,
125 125
 {
126 126
     OMAContext *oc = s->priv_data;
127 127
     unsigned int pos;
128
-    struct AVDES av_des;
128
+    struct AVDES *av_des;
129 129
 
130 130
     if (!enc_header || !r_val ||
131 131
         size < OMA_ENC_HEADER_SIZE + oc->k_size + oc->e_size + oc->i_size ||
132 132
         size < OMA_RPROBE_M_VAL)
133 133
         return -1;
134 134
 
135
+    av_des = av_des_alloc();
136
+    if (!av_des)
137
+        return AVERROR(ENOMEM);
138
+
135 139
     /* m_val */
136
-    av_des_init(&av_des, r_val, 192, 1);
137
-    av_des_crypt(&av_des, oc->m_val, &enc_header[48], 1, NULL, 1);
140
+    av_des_init(av_des, r_val, 192, 1);
141
+    av_des_crypt(av_des, oc->m_val, &enc_header[48], 1, NULL, 1);
138 142
 
139 143
     /* s_val */
140
-    av_des_init(&av_des, oc->m_val, 64, 0);
141
-    av_des_crypt(&av_des, oc->s_val, NULL, 1, NULL, 0);
144
+    av_des_init(av_des, oc->m_val, 64, 0);
145
+    av_des_crypt(av_des, oc->s_val, NULL, 1, NULL, 0);
142 146
 
143 147
     /* sm_val */
144 148
     pos = OMA_ENC_HEADER_SIZE + oc->k_size + oc->e_size;
145
-    av_des_init(&av_des, oc->s_val, 64, 0);
146
-    av_des_mac(&av_des, oc->sm_val, &enc_header[pos], (oc->i_size >> 3));
149
+    av_des_init(av_des, oc->s_val, 64, 0);
150
+    av_des_mac(av_des, oc->sm_val, &enc_header[pos], (oc->i_size >> 3));
147 151
 
148 152
     pos += oc->i_size;
149 153
 
154
+    av_free(av_des);
155
+
150 156
     return memcmp(&enc_header[pos], oc->sm_val, 8) ? -1 : 0;
151 157
 }
152 158
 
... ...
@@ -156,7 +162,7 @@ static int nprobe(AVFormatContext *s, uint8_t *enc_header, unsigned size,
156 156
     OMAContext *oc = s->priv_data;
157 157
     uint64_t pos;
158 158
     uint32_t taglen, datalen;
159
-    struct AVDES av_des;
159
+    struct AVDES *av_des;
160 160
 
161 161
     if (!enc_header || !n_val ||
162 162
         size < OMA_ENC_HEADER_SIZE + oc->k_size + 4)
... ...
@@ -180,15 +186,22 @@ static int nprobe(AVFormatContext *s, uint8_t *enc_header, unsigned size,
180 180
     if (pos + (((uint64_t)datalen) << 4) > size)
181 181
         return -1;
182 182
 
183
-    av_des_init(&av_des, n_val, 192, 1);
183
+    av_des = av_des_alloc();
184
+    if (!av_des)
185
+        return AVERROR(ENOMEM);
186
+
187
+    av_des_init(av_des, n_val, 192, 1);
184 188
     while (datalen-- > 0) {
185
-        av_des_crypt(&av_des, oc->r_val, &enc_header[pos], 2, NULL, 1);
186
-        kset(s, oc->r_val, NULL, 16);
189
+        av_des_crypt(av_des, oc->r_val, &enc_header[pos], 2, NULL, 1);
190
+        kset(s, oc->r_val, NULL, 16); {
187 191
         if (!rprobe(s, enc_header, size, oc->r_val))
192
+            av_free(av_des);
188 193
             return 0;
194
+        }
189 195
         pos += 16;
190 196
     }
191 197
 
198
+    av_free(av_des);
192 199
     return -1;
193 200
 }
194 201
 
... ...
@@ -273,14 +286,18 @@ static int decrypt_init(AVFormatContext *s, ID3v2ExtraMeta *em, uint8_t *header)
273 273
         }
274 274
     }
275 275
 
276
+    oc->av_des = av_des_alloc();
277
+    if (!oc->av_des)
278
+        return AVERROR(ENOMEM);
279
+
276 280
     /* e_val */
277
-    av_des_init(&oc->av_des, oc->m_val, 64, 0);
278
-    av_des_crypt(&oc->av_des, oc->e_val,
281
+    av_des_init(oc->av_des, oc->m_val, 64, 0);
282
+    av_des_crypt(oc->av_des, oc->e_val,
279 283
                  &gdata[OMA_ENC_HEADER_SIZE + 40], 1, NULL, 0);
280 284
     hex_log(s, AV_LOG_DEBUG, "EK", oc->e_val, 8);
281 285
 
282 286
     /* init e_val */
283
-    av_des_init(&oc->av_des, oc->e_val, 64, 1);
287
+    av_des_init(oc->av_des, oc->e_val, 64, 1);
284 288
 
285 289
     return 0;
286 290
 }
... ...
@@ -440,7 +457,7 @@ static int oma_read_packet(AVFormatContext *s, AVPacket *pkt)
440 440
         /* previous unencrypted block saved in IV for
441 441
          * the next packet (CBC mode) */
442 442
         if (ret == packet_size)
443
-            av_des_crypt(&oc->av_des, pkt->data, pkt->data,
443
+            av_des_crypt(oc->av_des, pkt->data, pkt->data,
444 444
                          (packet_size >> 3), oc->iv, 1);
445 445
         else
446 446
             memset(oc->iv, 0, 8);
... ...
@@ -496,6 +513,13 @@ wipe:
496 496
     return err;
497 497
 }
498 498
 
499
+static int oma_read_close(AVFormatContext *s)
500
+{
501
+    OMAContext *oc = s->priv_data;
502
+    av_free(oc->av_des);
503
+    return 0;
504
+}
505
+
499 506
 AVInputFormat ff_oma_demuxer = {
500 507
     .name           = "oma",
501 508
     .long_name      = NULL_IF_CONFIG_SMALL("Sony OpenMG audio"),
... ...
@@ -504,6 +528,7 @@ AVInputFormat ff_oma_demuxer = {
504 504
     .read_header    = oma_read_header,
505 505
     .read_packet    = oma_read_packet,
506 506
     .read_seek      = oma_read_seek,
507
+    .read_close     = oma_read_close,
507 508
     .flags          = AVFMT_GENERIC_INDEX,
508 509
     .extensions     = "oma,omg,aa3",
509 510
     .codec_tag      = (const AVCodecTag* const []){ff_oma_codec_tags, 0},