Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
aa5a99ae
Commit
aa5a99ae
authored
Jul 17, 2009
by
Kostya Shishkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add SHA-2 hashing
Originally committed as revision 19449 to
svn://svn.ffmpeg.org/ffmpeg/trunk
parent
6bb17c51
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
168 additions
and
6 deletions
+168
-6
sha.c
libavutil/sha.c
+167
-5
sha.h
libavutil/sha.h
+1
-1
No files found.
libavutil/sha.c
View file @
aa5a99ae
/*
/*
* Copyright (C) 2007 Michael Niedermayer <michaelni@gmx.at>
* Copyright (C) 2007 Michael Niedermayer <michaelni@gmx.at>
* Copyright (C) 2009 Konstantin Shishkov
* based on public domain SHA-1 code by Steve Reid <steve@edmweb.com>
* based on public domain SHA-1 code by Steve Reid <steve@edmweb.com>
* and on BSD-licensed SHA-2 code by Aaron D. Gifford
*
*
* This file is part of FFmpeg.
* This file is part of FFmpeg.
*
*
...
@@ -128,14 +130,154 @@ static void sha1_transform(uint32_t state[5], const uint8_t buffer[64])
...
@@ -128,14 +130,154 @@ static void sha1_transform(uint32_t state[5], const uint8_t buffer[64])
state
[
4
]
+=
e
;
state
[
4
]
+=
e
;
}
}
static
const
uint32_t
K256
[
64
]
=
{
0x428a2f98
,
0x71374491
,
0xb5c0fbcf
,
0xe9b5dba5
,
0x3956c25b
,
0x59f111f1
,
0x923f82a4
,
0xab1c5ed5
,
0xd807aa98
,
0x12835b01
,
0x243185be
,
0x550c7dc3
,
0x72be5d74
,
0x80deb1fe
,
0x9bdc06a7
,
0xc19bf174
,
0xe49b69c1
,
0xefbe4786
,
0x0fc19dc6
,
0x240ca1cc
,
0x2de92c6f
,
0x4a7484aa
,
0x5cb0a9dc
,
0x76f988da
,
0x983e5152
,
0xa831c66d
,
0xb00327c8
,
0xbf597fc7
,
0xc6e00bf3
,
0xd5a79147
,
0x06ca6351
,
0x14292967
,
0x27b70a85
,
0x2e1b2138
,
0x4d2c6dfc
,
0x53380d13
,
0x650a7354
,
0x766a0abb
,
0x81c2c92e
,
0x92722c85
,
0xa2bfe8a1
,
0xa81a664b
,
0xc24b8b70
,
0xc76c51a3
,
0xd192e819
,
0xd6990624
,
0xf40e3585
,
0x106aa070
,
0x19a4c116
,
0x1e376c08
,
0x2748774c
,
0x34b0bcb5
,
0x391c0cb3
,
0x4ed8aa4a
,
0x5b9cca4f
,
0x682e6ff3
,
0x748f82ee
,
0x78a5636f
,
0x84c87814
,
0x8cc70208
,
0x90befffa
,
0xa4506ceb
,
0xbef9a3f7
,
0xc67178f2
};
#define Ch(x,y,z) (((x) & ((y) ^ (z))) ^ (z))
#define Maj(x,y,z) ((((x) | (y)) & (z)) | ((x) & (y)))
#define Sigma0_256(x) (rol((x), 30) ^ rol((x), 19) ^ rol((x), 10))
#define Sigma1_256(x) (rol((x), 26) ^ rol((x), 21) ^ rol((x), 7))
#define sigma0_256(x) (rol((x), 25) ^ rol((x), 14) ^ ((x) >> 3))
#define sigma1_256(x) (rol((x), 15) ^ rol((x), 13) ^ ((x) >> 10))
#undef blk
#define blk(i) (block[i] = block[i - 16] + sigma0_256(block[i - 15]) + \
sigma1_256(block[i - 2]) + block[i - 7])
#define ROUND256(a,b,c,d,e,f,g,h) \
T1 += (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[i]; \
(d) += T1; \
(h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
i++
#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
T1 = blk0(i); \
ROUND256(a,b,c,d,e,f,g,h)
#define ROUND256_16_TO_63(a,b,c,d,e,f,g,h) \
T1 = blk(i); \
ROUND256(a,b,c,d,e,f,g,h)
static
void
sha256_transform
(
uint32_t
*
state
,
const
uint8_t
buffer
[
64
])
{
unsigned
int
i
,
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
;
uint32_t
block
[
64
];
uint32_t
T1
,
T2
;
a
=
state
[
0
];
b
=
state
[
1
];
c
=
state
[
2
];
d
=
state
[
3
];
e
=
state
[
4
];
f
=
state
[
5
];
g
=
state
[
6
];
h
=
state
[
7
];
#if CONFIG_SMALL
for
(
i
=
0
;
i
<
64
;
i
++
)
{
if
(
i
<
16
)
T1
=
blk0
(
i
);
else
T1
=
blk
(
i
);
T1
+=
h
+
Sigma1_256
(
e
)
+
Ch
(
e
,
f
,
g
)
+
K256
[
i
];
T2
=
Sigma0_256
(
a
)
+
Maj
(
a
,
b
,
c
);
h
=
g
;
g
=
f
;
f
=
e
;
e
=
d
+
T1
;
d
=
c
;
c
=
b
;
b
=
a
;
a
=
T1
+
T2
;
}
#else
for
(
i
=
0
;
i
<
16
;)
{
ROUND256_0_TO_15
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
);
ROUND256_0_TO_15
(
h
,
a
,
b
,
c
,
d
,
e
,
f
,
g
);
ROUND256_0_TO_15
(
g
,
h
,
a
,
b
,
c
,
d
,
e
,
f
);
ROUND256_0_TO_15
(
f
,
g
,
h
,
a
,
b
,
c
,
d
,
e
);
ROUND256_0_TO_15
(
e
,
f
,
g
,
h
,
a
,
b
,
c
,
d
);
ROUND256_0_TO_15
(
d
,
e
,
f
,
g
,
h
,
a
,
b
,
c
);
ROUND256_0_TO_15
(
c
,
d
,
e
,
f
,
g
,
h
,
a
,
b
);
ROUND256_0_TO_15
(
b
,
c
,
d
,
e
,
f
,
g
,
h
,
a
);
}
for
(;
i
<
64
;)
{
ROUND256_16_TO_63
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
);
ROUND256_16_TO_63
(
h
,
a
,
b
,
c
,
d
,
e
,
f
,
g
);
ROUND256_16_TO_63
(
g
,
h
,
a
,
b
,
c
,
d
,
e
,
f
);
ROUND256_16_TO_63
(
f
,
g
,
h
,
a
,
b
,
c
,
d
,
e
);
ROUND256_16_TO_63
(
e
,
f
,
g
,
h
,
a
,
b
,
c
,
d
);
ROUND256_16_TO_63
(
d
,
e
,
f
,
g
,
h
,
a
,
b
,
c
);
ROUND256_16_TO_63
(
c
,
d
,
e
,
f
,
g
,
h
,
a
,
b
);
ROUND256_16_TO_63
(
b
,
c
,
d
,
e
,
f
,
g
,
h
,
a
);
}
#endif
state
[
0
]
+=
a
;
state
[
1
]
+=
b
;
state
[
2
]
+=
c
;
state
[
3
]
+=
d
;
state
[
4
]
+=
e
;
state
[
5
]
+=
f
;
state
[
6
]
+=
g
;
state
[
7
]
+=
h
;
}
int
av_sha_init
(
AVSHA
*
ctx
,
int
bits
)
int
av_sha_init
(
AVSHA
*
ctx
,
int
bits
)
{
{
ctx
->
digest_len
=
bits
>>
5
;
switch
(
bits
)
{
case
160
:
// SHA-1
ctx
->
state
[
0
]
=
0x67452301
;
ctx
->
state
[
0
]
=
0x67452301
;
ctx
->
state
[
1
]
=
0xEFCDAB89
;
ctx
->
state
[
1
]
=
0xEFCDAB89
;
ctx
->
state
[
2
]
=
0x98BADCFE
;
ctx
->
state
[
2
]
=
0x98BADCFE
;
ctx
->
state
[
3
]
=
0x10325476
;
ctx
->
state
[
3
]
=
0x10325476
;
ctx
->
state
[
4
]
=
0xC3D2E1F0
;
ctx
->
state
[
4
]
=
0xC3D2E1F0
;
ctx
->
transform
=
sha1_transform
;
ctx
->
transform
=
sha1_transform
;
break
;
case
224
:
// SHA-224
ctx
->
state
[
0
]
=
0xC1059ED8
;
ctx
->
state
[
1
]
=
0x367CD507
;
ctx
->
state
[
2
]
=
0x3070DD17
;
ctx
->
state
[
3
]
=
0xF70E5939
;
ctx
->
state
[
4
]
=
0xFFC00B31
;
ctx
->
state
[
5
]
=
0x68581511
;
ctx
->
state
[
6
]
=
0x64F98FA7
;
ctx
->
state
[
7
]
=
0xBEFA4FA4
;
ctx
->
transform
=
sha256_transform
;
break
;
case
256
:
// SHA-256
ctx
->
state
[
0
]
=
0x6A09E667
;
ctx
->
state
[
1
]
=
0xBB67AE85
;
ctx
->
state
[
2
]
=
0x3C6EF372
;
ctx
->
state
[
3
]
=
0xA54FF53A
;
ctx
->
state
[
4
]
=
0x510E527F
;
ctx
->
state
[
5
]
=
0x9B05688C
;
ctx
->
state
[
6
]
=
0x1F83D9AB
;
ctx
->
state
[
7
]
=
0x5BE0CD19
;
ctx
->
transform
=
sha256_transform
;
break
;
default:
return
-
1
;
}
ctx
->
count
=
0
;
ctx
->
count
=
0
;
return
0
;
return
0
;
}
}
...
@@ -176,7 +318,7 @@ void av_sha_final(AVSHA* ctx, uint8_t *digest)
...
@@ -176,7 +318,7 @@ void av_sha_final(AVSHA* ctx, uint8_t *digest)
while
((
ctx
->
count
&
63
)
!=
56
)
while
((
ctx
->
count
&
63
)
!=
56
)
av_sha_update
(
ctx
,
""
,
1
);
av_sha_update
(
ctx
,
""
,
1
);
av_sha_update
(
ctx
,
(
uint8_t
*
)
&
finalcount
,
8
);
/* Should cause a transform() */
av_sha_update
(
ctx
,
(
uint8_t
*
)
&
finalcount
,
8
);
/* Should cause a transform() */
for
(
i
=
0
;
i
<
5
;
i
++
)
for
(
i
=
0
;
i
<
ctx
->
digest_len
;
i
++
)
((
uint32_t
*
)
digest
)[
i
]
=
be2me_32
(
ctx
->
state
[
i
]);
((
uint32_t
*
)
digest
)[
i
]
=
be2me_32
(
ctx
->
state
[
i
]);
}
}
...
@@ -209,12 +351,15 @@ void av_sha1_final(struct AVSHA1* context, uint8_t digest[20])
...
@@ -209,12 +351,15 @@ void av_sha1_final(struct AVSHA1* context, uint8_t digest[20])
int
main
(
void
)
int
main
(
void
)
{
{
int
i
,
k
;
int
i
,
j
,
k
;
AVSHA
ctx
;
AVSHA
ctx
;
unsigned
char
digest
[
20
];
unsigned
char
digest
[
32
];
const
int
lengths
[
3
]
=
{
160
,
224
,
256
};
for
(
j
=
0
;
j
<
3
;
j
++
)
{
printf
(
"Testing SHA-%d
\n
"
,
lengths
[
j
]);
for
(
k
=
0
;
k
<
3
;
k
++
)
{
for
(
k
=
0
;
k
<
3
;
k
++
)
{
av_sha_init
(
&
ctx
,
160
);
av_sha_init
(
&
ctx
,
lengths
[
j
]
);
if
(
k
==
0
)
if
(
k
==
0
)
av_sha_update
(
&
ctx
,
"abc"
,
3
);
av_sha_update
(
&
ctx
,
"abc"
,
3
);
else
if
(
k
==
1
)
else
if
(
k
==
1
)
...
@@ -223,14 +368,31 @@ int main(void)
...
@@ -223,14 +368,31 @@ int main(void)
for
(
i
=
0
;
i
<
1000
*
1000
;
i
++
)
for
(
i
=
0
;
i
<
1000
*
1000
;
i
++
)
av_sha_update
(
&
ctx
,
"a"
,
1
);
av_sha_update
(
&
ctx
,
"a"
,
1
);
av_sha_final
(
&
ctx
,
digest
);
av_sha_final
(
&
ctx
,
digest
);
for
(
i
=
0
;
i
<
20
;
i
++
)
for
(
i
=
0
;
i
<
lengths
[
j
]
>>
3
;
i
++
)
printf
(
"%02X"
,
digest
[
i
]);
printf
(
"%02X"
,
digest
[
i
]);
putchar
(
'\n'
);
putchar
(
'\n'
);
}
}
switch
(
j
)
{
case
0
:
//test vectors (from FIPS PUB 180-1)
//test vectors (from FIPS PUB 180-1)
printf
(
"A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
\n
"
printf
(
"A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
\n
"
"84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
\n
"
"84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
\n
"
"34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
\n
"
);
"34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
\n
"
);
break
;
case
1
:
//test vectors (from FIPS PUB 180-2 Appendix A)
printf
(
"23097d22 3405d822 8642a477 bda255b3 2aadbce4 bda0b3f7 e36c9da7
\n
"
"75388b16 512776cc 5dba5da1 fd890150 b0c6455c b4f58b19 52522525
\n
"
"20794655 980c91d8 bbb4c1ea 97618a4b f03f4258 1948b2ee 4ee7ad67
\n
"
);
break
;
case
2
:
//test vectors (from FIPS PUB 180-2)
printf
(
"ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad
\n
"
"248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1
\n
"
"cdc76e5c 9914fb92 81a1c7e2 84d73e67 f1809a48 a497200e 046d39cc c7112cd0
\n
"
);
break
;
}
}
return
0
;
return
0
;
}
}
...
...
libavutil/sha.h
View file @
aa5a99ae
...
@@ -28,7 +28,7 @@ extern const int av_sha_size;
...
@@ -28,7 +28,7 @@ extern const int av_sha_size;
struct
AVSHA
;
struct
AVSHA
;
/**
/**
* Initializes SHA-1 hashing.
* Initializes SHA-1
or SHA-2
hashing.
*
*
* @param context pointer to the function context (of size av_sha_size)
* @param context pointer to the function context (of size av_sha_size)
* @param bits number of bits in digest (SHA-1 - 160 bits, SHA-2 224 or 256 bits)
* @param bits number of bits in digest (SHA-1 - 160 bits, SHA-2 224 or 256 bits)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment