Update pre9
This commit is contained in:
@@ -894,13 +894,13 @@ ecp_nistz256_scatter_w7:
|
||||
.Loop_scatter_w7:
|
||||
ldr $mask,[$inp],#4
|
||||
subs $index,$index,#1
|
||||
strb $mask,[$out,#64*0-1]
|
||||
strb $mask,[$out,#64*0]
|
||||
mov $mask,$mask,lsr#8
|
||||
strb $mask,[$out,#64*1-1]
|
||||
strb $mask,[$out,#64*1]
|
||||
mov $mask,$mask,lsr#8
|
||||
strb $mask,[$out,#64*2-1]
|
||||
strb $mask,[$out,#64*2]
|
||||
mov $mask,$mask,lsr#8
|
||||
strb $mask,[$out,#64*3-1]
|
||||
strb $mask,[$out,#64*3]
|
||||
add $out,$out,#64*4
|
||||
bne .Loop_scatter_w7
|
||||
|
||||
|
||||
@@ -1776,21 +1776,21 @@ ecp_nistz256_scatter_w7:
|
||||
prfm pstl1strm,[$out,#4096+64*5]
|
||||
prfm pstl1strm,[$out,#4096+64*6]
|
||||
prfm pstl1strm,[$out,#4096+64*7]
|
||||
strb w3,[$out,#64*0-1]
|
||||
strb w3,[$out,#64*0]
|
||||
lsr x3,x3,#8
|
||||
strb w3,[$out,#64*1-1]
|
||||
strb w3,[$out,#64*1]
|
||||
lsr x3,x3,#8
|
||||
strb w3,[$out,#64*2-1]
|
||||
strb w3,[$out,#64*2]
|
||||
lsr x3,x3,#8
|
||||
strb w3,[$out,#64*3-1]
|
||||
strb w3,[$out,#64*3]
|
||||
lsr x3,x3,#8
|
||||
strb w3,[$out,#64*4-1]
|
||||
strb w3,[$out,#64*4]
|
||||
lsr x3,x3,#8
|
||||
strb w3,[$out,#64*5-1]
|
||||
strb w3,[$out,#64*5]
|
||||
lsr x3,x3,#8
|
||||
strb w3,[$out,#64*6-1]
|
||||
strb w3,[$out,#64*6]
|
||||
lsr x3,x3,#8
|
||||
strb w3,[$out,#64*7-1]
|
||||
strb w3,[$out,#64*7]
|
||||
add $out,$out,#64*8
|
||||
b.ne .Loop_scatter_w7
|
||||
|
||||
|
||||
@@ -2297,21 +2297,21 @@ ecp_nistz256_scatter_w7:
|
||||
|
||||
.Loop_scatter_w7:
|
||||
ldu r0,8($inp)
|
||||
stb r0,64*0-1($out)
|
||||
stb r0,64*0($out)
|
||||
srdi r0,r0,8
|
||||
stb r0,64*1-1($out)
|
||||
stb r0,64*1($out)
|
||||
srdi r0,r0,8
|
||||
stb r0,64*2-1($out)
|
||||
stb r0,64*2($out)
|
||||
srdi r0,r0,8
|
||||
stb r0,64*3-1($out)
|
||||
stb r0,64*3($out)
|
||||
srdi r0,r0,8
|
||||
stb r0,64*4-1($out)
|
||||
stb r0,64*4($out)
|
||||
srdi r0,r0,8
|
||||
stb r0,64*5-1($out)
|
||||
stb r0,64*5($out)
|
||||
srdi r0,r0,8
|
||||
stb r0,64*6-1($out)
|
||||
stb r0,64*6($out)
|
||||
srdi r0,r0,8
|
||||
stb r0,64*7-1($out)
|
||||
stb r0,64*7($out)
|
||||
addi $out,$out,64*8
|
||||
bdnz .Loop_scatter_w7
|
||||
|
||||
|
||||
@@ -1531,13 +1531,13 @@ ecp_nistz256_scatter_w7:
|
||||
ld [$inp],%l0
|
||||
add $inp,4,$inp
|
||||
subcc $index,1,$index
|
||||
stb %l0,[$out+64*0-1]
|
||||
stb %l0,[$out+64*0]
|
||||
srl %l0,8,%l1
|
||||
stb %l1,[$out+64*1-1]
|
||||
stb %l1,[$out+64*1]
|
||||
srl %l0,16,%l2
|
||||
stb %l2,[$out+64*2-1]
|
||||
stb %l2,[$out+64*2]
|
||||
srl %l0,24,%l3
|
||||
stb %l3,[$out+64*3-1]
|
||||
stb %l3,[$out+64*3]
|
||||
bne .Loop_scatter_w7
|
||||
add $out,64*4,$out
|
||||
|
||||
|
||||
@@ -1179,7 +1179,7 @@ for ($i=0;$i<7;$i++) {
|
||||
&mov ("esi",&wparam(1));
|
||||
&mov ("ebp",&wparam(2));
|
||||
|
||||
&lea ("edi",&DWP(-1,"edi","ebp"));
|
||||
&lea ("edi",&DWP(0,"edi","ebp"));
|
||||
&mov ("ebp",64/4);
|
||||
&set_label("scatter_w7_loop");
|
||||
&mov ("eax",&DWP(0,"esi"));
|
||||
|
||||
Executable
+824
@@ -0,0 +1,824 @@
|
||||
#! /usr/bin/env perl
|
||||
# Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the OpenSSL license (the "License"). You may not use
|
||||
# this file except in compliance with the License. You can obtain a copy
|
||||
# in the file LICENSE in the source distribution or at
|
||||
# https://www.openssl.org/source/license.html
|
||||
#
|
||||
# ====================================================================
|
||||
# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
|
||||
# project. The module is, however, dual licensed under OpenSSL and
|
||||
# CRYPTOGAMS licenses depending on where you obtain it. For further
|
||||
# details see http://www.openssl.org/~appro/cryptogams/.
|
||||
# ====================================================================
|
||||
#
|
||||
# X25519 lower-level primitives for PPC64.
|
||||
#
|
||||
# July 2018.
|
||||
#
|
||||
# Base 2^64 is faster than base 2^51 on pre-POWER8, most notably ~15%
|
||||
# faster on PPC970/G5. POWER8 on the other hand seems to trip on own
|
||||
# shoelaces when handling longer carry chains. As base 2^51 has just
|
||||
# single-carry pairs, it's 25% faster than base 2^64. Since PPC970 is
|
||||
# pretty old, base 2^64 implementation is not engaged. Comparison to
|
||||
# compiler-generated code is complicated by the fact that not all
|
||||
# compilers support 128-bit integers. When compiler doesn't, like xlc,
|
||||
# this module delivers more than 2x improvement, and when it does,
|
||||
# from 12% to 30% improvement was measured...
|
||||
|
||||
$flavour = shift;
|
||||
while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
|
||||
|
||||
$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
|
||||
( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
|
||||
( $xlate="${dir}../../perlasm/ppc-xlate.pl" and -f $xlate) or
|
||||
die "can't locate ppc-xlate.pl";
|
||||
|
||||
open OUT,"| \"$^X\" $xlate $flavour $output";
|
||||
*STDOUT=*OUT;
|
||||
|
||||
my $sp = "r1";
|
||||
my ($rp,$ap,$bp) = map("r$_",3..5);
|
||||
|
||||
####################################################### base 2^64
|
||||
if (0) {
|
||||
my ($bi,$a0,$a1,$a2,$a3,$t0,$t1, $t2,$t3,
|
||||
$acc0,$acc1,$acc2,$acc3,$acc4,$acc5,$acc6,$acc7) =
|
||||
map("r$_",(6..12,22..31));
|
||||
my $zero = "r0";
|
||||
my $FRAME = 16*8;
|
||||
|
||||
$code.=<<___;
|
||||
.text
|
||||
|
||||
.globl x25519_fe64_mul
|
||||
.type x25519_fe64_mul,\@function
|
||||
.align 5
|
||||
x25519_fe64_mul:
|
||||
stdu $sp,-$FRAME($sp)
|
||||
std r22,`$FRAME-8*10`($sp)
|
||||
std r23,`$FRAME-8*9`($sp)
|
||||
std r24,`$FRAME-8*8`($sp)
|
||||
std r25,`$FRAME-8*7`($sp)
|
||||
std r26,`$FRAME-8*6`($sp)
|
||||
std r27,`$FRAME-8*5`($sp)
|
||||
std r28,`$FRAME-8*4`($sp)
|
||||
std r29,`$FRAME-8*3`($sp)
|
||||
std r30,`$FRAME-8*2`($sp)
|
||||
std r31,`$FRAME-8*1`($sp)
|
||||
|
||||
ld $bi,0($bp)
|
||||
ld $a0,0($ap)
|
||||
xor $zero,$zero,$zero
|
||||
ld $a1,8($ap)
|
||||
ld $a2,16($ap)
|
||||
ld $a3,24($ap)
|
||||
|
||||
mulld $acc0,$a0,$bi # a[0]*b[0]
|
||||
mulhdu $t0,$a0,$bi
|
||||
mulld $acc1,$a1,$bi # a[1]*b[0]
|
||||
mulhdu $t1,$a1,$bi
|
||||
mulld $acc2,$a2,$bi # a[2]*b[0]
|
||||
mulhdu $t2,$a2,$bi
|
||||
mulld $acc3,$a3,$bi # a[3]*b[0]
|
||||
mulhdu $t3,$a3,$bi
|
||||
___
|
||||
for(my @acc=($acc0,$acc1,$acc2,$acc3,$acc4,$acc5,$acc6,$acc7),
|
||||
my $i=1; $i<4; shift(@acc), $i++) {
|
||||
my $acc4 = $i==1? $zero : @acc[4];
|
||||
|
||||
$code.=<<___;
|
||||
ld $bi,`8*$i`($bp)
|
||||
addc @acc[1],@acc[1],$t0 # accumulate high parts
|
||||
mulld $t0,$a0,$bi
|
||||
adde @acc[2],@acc[2],$t1
|
||||
mulld $t1,$a1,$bi
|
||||
adde @acc[3],@acc[3],$t2
|
||||
mulld $t2,$a2,$bi
|
||||
adde @acc[4],$acc4,$t3
|
||||
mulld $t3,$a3,$bi
|
||||
addc @acc[1],@acc[1],$t0 # accumulate low parts
|
||||
mulhdu $t0,$a0,$bi
|
||||
adde @acc[2],@acc[2],$t1
|
||||
mulhdu $t1,$a1,$bi
|
||||
adde @acc[3],@acc[3],$t2
|
||||
mulhdu $t2,$a2,$bi
|
||||
adde @acc[4],@acc[4],$t3
|
||||
mulhdu $t3,$a3,$bi
|
||||
adde @acc[5],$zero,$zero
|
||||
___
|
||||
}
|
||||
$code.=<<___;
|
||||
li $bi,38
|
||||
addc $acc4,$acc4,$t0
|
||||
mulld $t0,$acc4,$bi
|
||||
adde $acc5,$acc5,$t1
|
||||
mulld $t1,$acc5,$bi
|
||||
adde $acc6,$acc6,$t2
|
||||
mulld $t2,$acc6,$bi
|
||||
adde $acc7,$acc7,$t3
|
||||
mulld $t3,$acc7,$bi
|
||||
|
||||
addc $acc0,$acc0,$t0
|
||||
mulhdu $t0,$acc4,$bi
|
||||
adde $acc1,$acc1,$t1
|
||||
mulhdu $t1,$acc5,$bi
|
||||
adde $acc2,$acc2,$t2
|
||||
mulhdu $t2,$acc6,$bi
|
||||
adde $acc3,$acc3,$t3
|
||||
mulhdu $t3,$acc7,$bi
|
||||
adde $acc4,$zero,$zero
|
||||
|
||||
addc $acc1,$acc1,$t0
|
||||
adde $acc2,$acc2,$t1
|
||||
adde $acc3,$acc3,$t2
|
||||
adde $acc4,$acc4,$t3
|
||||
|
||||
mulld $acc4,$acc4,$bi
|
||||
|
||||
addc $acc0,$acc0,$acc4
|
||||
addze $acc1,$acc1
|
||||
addze $acc2,$acc2
|
||||
addze $acc3,$acc3
|
||||
|
||||
subfe $acc4,$acc4,$acc4 # carry -> ~mask
|
||||
std $acc1,8($rp)
|
||||
andc $acc4,$bi,$acc4
|
||||
std $acc2,16($rp)
|
||||
add $acc0,$acc0,$acc4
|
||||
std $acc3,24($rp)
|
||||
std $acc0,0($rp)
|
||||
|
||||
ld r22,`$FRAME-8*10`($sp)
|
||||
ld r23,`$FRAME-8*9`($sp)
|
||||
ld r24,`$FRAME-8*8`($sp)
|
||||
ld r25,`$FRAME-8*7`($sp)
|
||||
ld r26,`$FRAME-8*6`($sp)
|
||||
ld r27,`$FRAME-8*5`($sp)
|
||||
ld r28,`$FRAME-8*4`($sp)
|
||||
ld r29,`$FRAME-8*3`($sp)
|
||||
ld r30,`$FRAME-8*2`($sp)
|
||||
ld r31,`$FRAME-8*1`($sp)
|
||||
addi $sp,$sp,$FRAME
|
||||
blr
|
||||
.long 0
|
||||
.byte 0,12,4,0,0x80,10,3,0
|
||||
.long 0
|
||||
.size x25519_fe64_mul,.-x25519_fe64_mul
|
||||
|
||||
.globl x25519_fe64_sqr
|
||||
.type x25519_fe64_sqr,\@function
|
||||
.align 5
|
||||
x25519_fe64_sqr:
|
||||
stdu $sp,-$FRAME($sp)
|
||||
std r22,`$FRAME-8*10`($sp)
|
||||
std r23,`$FRAME-8*9`($sp)
|
||||
std r24,`$FRAME-8*8`($sp)
|
||||
std r25,`$FRAME-8*7`($sp)
|
||||
std r26,`$FRAME-8*6`($sp)
|
||||
std r27,`$FRAME-8*5`($sp)
|
||||
std r28,`$FRAME-8*4`($sp)
|
||||
std r29,`$FRAME-8*3`($sp)
|
||||
std r30,`$FRAME-8*2`($sp)
|
||||
std r31,`$FRAME-8*1`($sp)
|
||||
|
||||
ld $a0,0($ap)
|
||||
xor $zero,$zero,$zero
|
||||
ld $a1,8($ap)
|
||||
ld $a2,16($ap)
|
||||
ld $a3,24($ap)
|
||||
|
||||
################################
|
||||
# | | | | | |a1*a0| |
|
||||
# | | | | |a2*a0| | |
|
||||
# | |a3*a2|a3*a0| | | |
|
||||
# | | | |a2*a1| | | |
|
||||
# | | |a3*a1| | | | |
|
||||
# *| | | | | | | | 2|
|
||||
# +|a3*a3|a2*a2|a1*a1|a0*a0|
|
||||
# |--+--+--+--+--+--+--+--|
|
||||
# |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is $accx, i.e. follow $accx
|
||||
#
|
||||
# "can't overflow" below mark carrying into high part of
|
||||
# multiplication result, which can't overflow, because it
|
||||
# can never be all ones.
|
||||
|
||||
mulld $acc1,$a1,$a0 # a[1]*a[0]
|
||||
mulhdu $t1,$a1,$a0
|
||||
mulld $acc2,$a2,$a0 # a[2]*a[0]
|
||||
mulhdu $t2,$a2,$a0
|
||||
mulld $acc3,$a3,$a0 # a[3]*a[0]
|
||||
mulhdu $acc4,$a3,$a0
|
||||
|
||||
addc $acc2,$acc2,$t1 # accumulate high parts of multiplication
|
||||
mulld $t0,$a2,$a1 # a[2]*a[1]
|
||||
mulhdu $t1,$a2,$a1
|
||||
adde $acc3,$acc3,$t2
|
||||
mulld $t2,$a3,$a1 # a[3]*a[1]
|
||||
mulhdu $t3,$a3,$a1
|
||||
addze $acc4,$acc4 # can't overflow
|
||||
|
||||
mulld $acc5,$a3,$a2 # a[3]*a[2]
|
||||
mulhdu $acc6,$a3,$a2
|
||||
|
||||
addc $t1,$t1,$t2 # accumulate high parts of multiplication
|
||||
mulld $acc0,$a0,$a0 # a[0]*a[0]
|
||||
addze $t2,$t3 # can't overflow
|
||||
|
||||
addc $acc3,$acc3,$t0 # accumulate low parts of multiplication
|
||||
mulhdu $a0,$a0,$a0
|
||||
adde $acc4,$acc4,$t1
|
||||
mulld $t1,$a1,$a1 # a[1]*a[1]
|
||||
adde $acc5,$acc5,$t2
|
||||
mulhdu $a1,$a1,$a1
|
||||
addze $acc6,$acc6 # can't overflow
|
||||
|
||||
addc $acc1,$acc1,$acc1 # acc[1-6]*=2
|
||||
mulld $t2,$a2,$a2 # a[2]*a[2]
|
||||
adde $acc2,$acc2,$acc2
|
||||
mulhdu $a2,$a2,$a2
|
||||
adde $acc3,$acc3,$acc3
|
||||
mulld $t3,$a3,$a3 # a[3]*a[3]
|
||||
adde $acc4,$acc4,$acc4
|
||||
mulhdu $a3,$a3,$a3
|
||||
adde $acc5,$acc5,$acc5
|
||||
adde $acc6,$acc6,$acc6
|
||||
addze $acc7,$zero
|
||||
|
||||
addc $acc1,$acc1,$a0 # +a[i]*a[i]
|
||||
li $bi,38
|
||||
adde $acc2,$acc2,$t1
|
||||
adde $acc3,$acc3,$a1
|
||||
adde $acc4,$acc4,$t2
|
||||
adde $acc5,$acc5,$a2
|
||||
adde $acc6,$acc6,$t3
|
||||
adde $acc7,$acc7,$a3
|
||||
|
||||
mulld $t0,$acc4,$bi
|
||||
mulld $t1,$acc5,$bi
|
||||
mulld $t2,$acc6,$bi
|
||||
mulld $t3,$acc7,$bi
|
||||
|
||||
addc $acc0,$acc0,$t0
|
||||
mulhdu $t0,$acc4,$bi
|
||||
adde $acc1,$acc1,$t1
|
||||
mulhdu $t1,$acc5,$bi
|
||||
adde $acc2,$acc2,$t2
|
||||
mulhdu $t2,$acc6,$bi
|
||||
adde $acc3,$acc3,$t3
|
||||
mulhdu $t3,$acc7,$bi
|
||||
addze $acc4,$zero
|
||||
|
||||
addc $acc1,$acc1,$t0
|
||||
adde $acc2,$acc2,$t1
|
||||
adde $acc3,$acc3,$t2
|
||||
adde $acc4,$acc4,$t3
|
||||
|
||||
mulld $acc4,$acc4,$bi
|
||||
|
||||
addc $acc0,$acc0,$acc4
|
||||
addze $acc1,$acc1
|
||||
addze $acc2,$acc2
|
||||
addze $acc3,$acc3
|
||||
|
||||
subfe $acc4,$acc4,$acc4 # carry -> ~mask
|
||||
std $acc1,8($rp)
|
||||
andc $acc4,$bi,$acc4
|
||||
std $acc2,16($rp)
|
||||
add $acc0,$acc0,$acc4
|
||||
std $acc3,24($rp)
|
||||
std $acc0,0($rp)
|
||||
|
||||
ld r22,`$FRAME-8*10`($sp)
|
||||
ld r23,`$FRAME-8*9`($sp)
|
||||
ld r24,`$FRAME-8*8`($sp)
|
||||
ld r25,`$FRAME-8*7`($sp)
|
||||
ld r26,`$FRAME-8*6`($sp)
|
||||
ld r27,`$FRAME-8*5`($sp)
|
||||
ld r28,`$FRAME-8*4`($sp)
|
||||
ld r29,`$FRAME-8*3`($sp)
|
||||
ld r30,`$FRAME-8*2`($sp)
|
||||
ld r31,`$FRAME-8*1`($sp)
|
||||
addi $sp,$sp,$FRAME
|
||||
blr
|
||||
.long 0
|
||||
.byte 0,12,4,0,0x80,10,2,0
|
||||
.long 0
|
||||
.size x25519_fe64_sqr,.-x25519_fe64_sqr
|
||||
|
||||
.globl x25519_fe64_mul121666
|
||||
.type x25519_fe64_mul121666,\@function
|
||||
.align 5
|
||||
x25519_fe64_mul121666:
|
||||
lis $bi,`65536>>16`
|
||||
ori $bi,$bi,`121666-65536`
|
||||
|
||||
ld $t0,0($ap)
|
||||
ld $t1,8($ap)
|
||||
ld $bp,16($ap)
|
||||
ld $ap,24($ap)
|
||||
|
||||
mulld $a0,$t0,$bi
|
||||
mulhdu $t0,$t0,$bi
|
||||
mulld $a1,$t1,$bi
|
||||
mulhdu $t1,$t1,$bi
|
||||
mulld $a2,$bp,$bi
|
||||
mulhdu $bp,$bp,$bi
|
||||
mulld $a3,$ap,$bi
|
||||
mulhdu $ap,$ap,$bi
|
||||
|
||||
addc $a1,$a1,$t0
|
||||
adde $a2,$a2,$t1
|
||||
adde $a3,$a3,$bp
|
||||
addze $ap, $ap
|
||||
|
||||
mulli $ap,$ap,38
|
||||
|
||||
addc $a0,$a0,$ap
|
||||
addze $a1,$a1
|
||||
addze $a2,$a2
|
||||
addze $a3,$a3
|
||||
|
||||
subfe $t1,$t1,$t1 # carry -> ~mask
|
||||
std $a1,8($rp)
|
||||
andc $t0,$t0,$t1
|
||||
std $a2,16($rp)
|
||||
add $a0,$a0,$t0
|
||||
std $a3,24($rp)
|
||||
std $a0,0($rp)
|
||||
|
||||
blr
|
||||
.long 0
|
||||
.byte 0,12,0x14,0,0,0,2,0
|
||||
.long 0
|
||||
.size x25519_fe64_mul121666,.-x25519_fe64_mul121666
|
||||
|
||||
.globl x25519_fe64_add
|
||||
.type x25519_fe64_add,\@function
|
||||
.align 5
|
||||
x25519_fe64_add:
|
||||
ld $a0,0($ap)
|
||||
ld $t0,0($bp)
|
||||
ld $a1,8($ap)
|
||||
ld $t1,8($bp)
|
||||
ld $a2,16($ap)
|
||||
ld $bi,16($bp)
|
||||
ld $a3,24($ap)
|
||||
ld $bp,24($bp)
|
||||
|
||||
addc $a0,$a0,$t0
|
||||
adde $a1,$a1,$t1
|
||||
adde $a2,$a2,$bi
|
||||
adde $a3,$a3,$bp
|
||||
|
||||
li $t0,38
|
||||
subfe $t1,$t1,$t1 # carry -> ~mask
|
||||
andc $t1,$t0,$t1
|
||||
|
||||
addc $a0,$a0,$t1
|
||||
addze $a1,$a1
|
||||
addze $a2,$a2
|
||||
addze $a3,$a3
|
||||
|
||||
subfe $t1,$t1,$t1 # carry -> ~mask
|
||||
std $a1,8($rp)
|
||||
andc $t0,$t0,$t1
|
||||
std $a2,16($rp)
|
||||
add $a0,$a0,$t0
|
||||
std $a3,24($rp)
|
||||
std $a0,0($rp)
|
||||
|
||||
blr
|
||||
.long 0
|
||||
.byte 0,12,0x14,0,0,0,3,0
|
||||
.long 0
|
||||
.size x25519_fe64_add,.-x25519_fe64_add
|
||||
|
||||
.globl x25519_fe64_sub
|
||||
.type x25519_fe64_sub,\@function
|
||||
.align 5
|
||||
x25519_fe64_sub:
|
||||
ld $a0,0($ap)
|
||||
ld $t0,0($bp)
|
||||
ld $a1,8($ap)
|
||||
ld $t1,8($bp)
|
||||
ld $a2,16($ap)
|
||||
ld $bi,16($bp)
|
||||
ld $a3,24($ap)
|
||||
ld $bp,24($bp)
|
||||
|
||||
subfc $a0,$t0,$a0
|
||||
subfe $a1,$t1,$a1
|
||||
subfe $a2,$bi,$a2
|
||||
subfe $a3,$bp,$a3
|
||||
|
||||
li $t0,38
|
||||
subfe $t1,$t1,$t1 # borrow -> mask
|
||||
xor $zero,$zero,$zero
|
||||
and $t1,$t0,$t1
|
||||
|
||||
subfc $a0,$t1,$a0
|
||||
subfe $a1,$zero,$a1
|
||||
subfe $a2,$zero,$a2
|
||||
subfe $a3,$zero,$a3
|
||||
|
||||
subfe $t1,$t1,$t1 # borrow -> mask
|
||||
std $a1,8($rp)
|
||||
and $t0,$t0,$t1
|
||||
std $a2,16($rp)
|
||||
subf $a0,$t0,$a0
|
||||
std $a3,24($rp)
|
||||
std $a0,0($rp)
|
||||
|
||||
blr
|
||||
.long 0
|
||||
.byte 0,12,0x14,0,0,0,3,0
|
||||
.long 0
|
||||
.size x25519_fe64_sub,.-x25519_fe64_sub
|
||||
|
||||
.globl x25519_fe64_tobytes
|
||||
.type x25519_fe64_tobytes,\@function
|
||||
.align 5
|
||||
x25519_fe64_tobytes:
|
||||
ld $a3,24($ap)
|
||||
ld $a0,0($ap)
|
||||
ld $a1,8($ap)
|
||||
ld $a2,16($ap)
|
||||
|
||||
sradi $t0,$a3,63 # most significant bit -> mask
|
||||
li $t1,19
|
||||
and $t0,$t0,$t1
|
||||
sldi $a3,$a3,1
|
||||
add $t0,$t0,$t1 # compare to modulus in the same go
|
||||
srdi $a3,$a3,1 # most signifcant bit cleared
|
||||
|
||||
addc $a0,$a0,$t0
|
||||
addze $a1,$a1
|
||||
addze $a2,$a2
|
||||
addze $a3,$a3
|
||||
|
||||
xor $zero,$zero,$zero
|
||||
sradi $t0,$a3,63 # most significant bit -> mask
|
||||
sldi $a3,$a3,1
|
||||
andc $t0,$t1,$t0
|
||||
srdi $a3,$a3,1 # most signifcant bit cleared
|
||||
|
||||
subi $rp,$rp,1
|
||||
subfc $a0,$t0,$a0
|
||||
subfe $a1,$zero,$a1
|
||||
subfe $a2,$zero,$a2
|
||||
subfe $a3,$zero,$a3
|
||||
|
||||
___
|
||||
for (my @a=($a0,$a1,$a2,$a3), my $i=0; $i<4; shift(@a), $i++) {
|
||||
$code.=<<___;
|
||||
srdi $t0,@a[0],8
|
||||
stbu @a[0],1($rp)
|
||||
srdi @a[0],@a[0],16
|
||||
stbu $t0,1($rp)
|
||||
srdi $t0,@a[0],8
|
||||
stbu @a[0],1($rp)
|
||||
srdi @a[0],@a[0],16
|
||||
stbu $t0,1($rp)
|
||||
srdi $t0,@a[0],8
|
||||
stbu @a[0],1($rp)
|
||||
srdi @a[0],@a[0],16
|
||||
stbu $t0,1($rp)
|
||||
srdi $t0,@a[0],8
|
||||
stbu @a[0],1($rp)
|
||||
stbu $t0,1($rp)
|
||||
___
|
||||
}
|
||||
$code.=<<___;
|
||||
blr
|
||||
.long 0
|
||||
.byte 0,12,0x14,0,0,0,2,0
|
||||
.long 0
|
||||
.size x25519_fe64_tobytes,.-x25519_fe64_tobytes
|
||||
___
|
||||
}
|
||||
####################################################### base 2^51
|
||||
{
|
||||
my ($bi,$a0,$a1,$a2,$a3,$a4,$t0, $t1,
|
||||
$h0lo,$h0hi,$h1lo,$h1hi,$h2lo,$h2hi,$h3lo,$h3hi,$h4lo,$h4hi) =
|
||||
map("r$_",(6..12,21..31));
|
||||
my $mask = "r0";
|
||||
my $FRAME = 18*8;
|
||||
|
||||
$code.=<<___;
|
||||
.text
|
||||
|
||||
.globl x25519_fe51_mul
|
||||
.type x25519_fe51_mul,\@function
|
||||
.align 5
|
||||
x25519_fe51_mul:
|
||||
stdu $sp,-$FRAME($sp)
|
||||
std r21,`$FRAME-8*11`($sp)
|
||||
std r22,`$FRAME-8*10`($sp)
|
||||
std r23,`$FRAME-8*9`($sp)
|
||||
std r24,`$FRAME-8*8`($sp)
|
||||
std r25,`$FRAME-8*7`($sp)
|
||||
std r26,`$FRAME-8*6`($sp)
|
||||
std r27,`$FRAME-8*5`($sp)
|
||||
std r28,`$FRAME-8*4`($sp)
|
||||
std r29,`$FRAME-8*3`($sp)
|
||||
std r30,`$FRAME-8*2`($sp)
|
||||
std r31,`$FRAME-8*1`($sp)
|
||||
|
||||
ld $bi,0($bp)
|
||||
ld $a0,0($ap)
|
||||
ld $a1,8($ap)
|
||||
ld $a2,16($ap)
|
||||
ld $a3,24($ap)
|
||||
ld $a4,32($ap)
|
||||
|
||||
mulld $h0lo,$a0,$bi # a[0]*b[0]
|
||||
mulhdu $h0hi,$a0,$bi
|
||||
|
||||
mulld $h1lo,$a1,$bi # a[1]*b[0]
|
||||
mulhdu $h1hi,$a1,$bi
|
||||
|
||||
mulld $h4lo,$a4,$bi # a[4]*b[0]
|
||||
mulhdu $h4hi,$a4,$bi
|
||||
ld $ap,8($bp)
|
||||
mulli $a4,$a4,19
|
||||
|
||||
mulld $h2lo,$a2,$bi # a[2]*b[0]
|
||||
mulhdu $h2hi,$a2,$bi
|
||||
|
||||
mulld $h3lo,$a3,$bi # a[3]*b[0]
|
||||
mulhdu $h3hi,$a3,$bi
|
||||
___
|
||||
for(my @a=($a0,$a1,$a2,$a3,$a4),
|
||||
my $i=1; $i<4; $i++) {
|
||||
($ap,$bi) = ($bi,$ap);
|
||||
$code.=<<___;
|
||||
mulld $t0,@a[4],$bi
|
||||
mulhdu $t1,@a[4],$bi
|
||||
addc $h0lo,$h0lo,$t0
|
||||
adde $h0hi,$h0hi,$t1
|
||||
|
||||
mulld $t0,@a[0],$bi
|
||||
mulhdu $t1,@a[0],$bi
|
||||
addc $h1lo,$h1lo,$t0
|
||||
adde $h1hi,$h1hi,$t1
|
||||
|
||||
mulld $t0,@a[3],$bi
|
||||
mulhdu $t1,@a[3],$bi
|
||||
ld $ap,`8*($i+1)`($bp)
|
||||
mulli @a[3],@a[3],19
|
||||
addc $h4lo,$h4lo,$t0
|
||||
adde $h4hi,$h4hi,$t1
|
||||
|
||||
mulld $t0,@a[1],$bi
|
||||
mulhdu $t1,@a[1],$bi
|
||||
addc $h2lo,$h2lo,$t0
|
||||
adde $h2hi,$h2hi,$t1
|
||||
|
||||
mulld $t0,@a[2],$bi
|
||||
mulhdu $t1,@a[2],$bi
|
||||
addc $h3lo,$h3lo,$t0
|
||||
adde $h3hi,$h3hi,$t1
|
||||
___
|
||||
unshift(@a,pop(@a));
|
||||
}
|
||||
($ap,$bi) = ($bi,$ap);
|
||||
$code.=<<___;
|
||||
mulld $t0,$a1,$bi
|
||||
mulhdu $t1,$a1,$bi
|
||||
addc $h0lo,$h0lo,$t0
|
||||
adde $h0hi,$h0hi,$t1
|
||||
|
||||
mulld $t0,$a2,$bi
|
||||
mulhdu $t1,$a2,$bi
|
||||
addc $h1lo,$h1lo,$t0
|
||||
adde $h1hi,$h1hi,$t1
|
||||
|
||||
mulld $t0,$a3,$bi
|
||||
mulhdu $t1,$a3,$bi
|
||||
addc $h2lo,$h2lo,$t0
|
||||
adde $h2hi,$h2hi,$t1
|
||||
|
||||
mulld $t0,$a4,$bi
|
||||
mulhdu $t1,$a4,$bi
|
||||
addc $h3lo,$h3lo,$t0
|
||||
adde $h3hi,$h3hi,$t1
|
||||
|
||||
mulld $t0,$a0,$bi
|
||||
mulhdu $t1,$a0,$bi
|
||||
addc $h4lo,$h4lo,$t0
|
||||
adde $h4hi,$h4hi,$t1
|
||||
|
||||
.Lfe51_reduce:
|
||||
li $mask,-1
|
||||
srdi $mask,$mask,13 # 0x7ffffffffffff
|
||||
|
||||
srdi $t0,$h2lo,51
|
||||
and $a2,$h2lo,$mask
|
||||
insrdi $t0,$h2hi,51,0 # h2>>51
|
||||
srdi $t1,$h0lo,51
|
||||
and $a0,$h0lo,$mask
|
||||
insrdi $t1,$h0hi,51,0 # h0>>51
|
||||
addc $h3lo,$h3lo,$t0
|
||||
addze $h3hi,$h3hi
|
||||
addc $h1lo,$h1lo,$t1
|
||||
addze $h1hi,$h1hi
|
||||
|
||||
srdi $t0,$h3lo,51
|
||||
and $a3,$h3lo,$mask
|
||||
insrdi $t0,$h3hi,51,0 # h3>>51
|
||||
srdi $t1,$h1lo,51
|
||||
and $a1,$h1lo,$mask
|
||||
insrdi $t1,$h1hi,51,0 # h1>>51
|
||||
addc $h4lo,$h4lo,$t0
|
||||
addze $h4hi,$h4hi
|
||||
add $a2,$a2,$t1
|
||||
|
||||
srdi $t0,$h4lo,51
|
||||
and $a4,$h4lo,$mask
|
||||
insrdi $t0,$h4hi,51,0
|
||||
mulli $t0,$t0,19 # (h4 >> 51) * 19
|
||||
|
||||
add $a0,$a0,$t0
|
||||
|
||||
srdi $t1,$a2,51
|
||||
and $a2,$a2,$mask
|
||||
add $a3,$a3,$t1
|
||||
|
||||
srdi $t0,$a0,51
|
||||
and $a0,$a0,$mask
|
||||
add $a1,$a1,$t0
|
||||
|
||||
std $a2,16($rp)
|
||||
std $a3,24($rp)
|
||||
std $a4,32($rp)
|
||||
std $a0,0($rp)
|
||||
std $a1,8($rp)
|
||||
|
||||
ld r21,`$FRAME-8*11`($sp)
|
||||
ld r22,`$FRAME-8*10`($sp)
|
||||
ld r23,`$FRAME-8*9`($sp)
|
||||
ld r24,`$FRAME-8*8`($sp)
|
||||
ld r25,`$FRAME-8*7`($sp)
|
||||
ld r26,`$FRAME-8*6`($sp)
|
||||
ld r27,`$FRAME-8*5`($sp)
|
||||
ld r28,`$FRAME-8*4`($sp)
|
||||
ld r29,`$FRAME-8*3`($sp)
|
||||
ld r30,`$FRAME-8*2`($sp)
|
||||
ld r31,`$FRAME-8*1`($sp)
|
||||
addi $sp,$sp,$FRAME
|
||||
blr
|
||||
.long 0
|
||||
.byte 0,12,4,0,0x80,11,3,0
|
||||
.long 0
|
||||
.size x25519_fe51_mul,.-x25519_fe51_mul
|
||||
___
|
||||
{
|
||||
my ($a0,$a1,$a2,$a3,$a4,$t0,$t1) = ($a0,$a1,$a2,$a3,$a4,$t0,$t1);
|
||||
$code.=<<___;
|
||||
.globl x25519_fe51_sqr
|
||||
.type x25519_fe51_sqr,\@function
|
||||
.align 5
|
||||
x25519_fe51_sqr:
|
||||
stdu $sp,-$FRAME($sp)
|
||||
std r21,`$FRAME-8*11`($sp)
|
||||
std r22,`$FRAME-8*10`($sp)
|
||||
std r23,`$FRAME-8*9`($sp)
|
||||
std r24,`$FRAME-8*8`($sp)
|
||||
std r25,`$FRAME-8*7`($sp)
|
||||
std r26,`$FRAME-8*6`($sp)
|
||||
std r27,`$FRAME-8*5`($sp)
|
||||
std r28,`$FRAME-8*4`($sp)
|
||||
std r29,`$FRAME-8*3`($sp)
|
||||
std r30,`$FRAME-8*2`($sp)
|
||||
std r31,`$FRAME-8*1`($sp)
|
||||
|
||||
ld $a0,0($ap)
|
||||
ld $a1,8($ap)
|
||||
ld $a2,16($ap)
|
||||
ld $a3,24($ap)
|
||||
ld $a4,32($ap)
|
||||
|
||||
add $bi,$a0,$a0 # a[0]*2
|
||||
mulli $t1,$a4,19 # a[4]*19
|
||||
|
||||
mulld $h0lo,$a0,$a0
|
||||
mulhdu $h0hi,$a0,$a0
|
||||
mulld $h1lo,$a1,$bi
|
||||
mulhdu $h1hi,$a1,$bi
|
||||
mulld $h2lo,$a2,$bi
|
||||
mulhdu $h2hi,$a2,$bi
|
||||
mulld $h3lo,$a3,$bi
|
||||
mulhdu $h3hi,$a3,$bi
|
||||
mulld $h4lo,$a4,$bi
|
||||
mulhdu $h4hi,$a4,$bi
|
||||
add $bi,$a1,$a1 # a[1]*2
|
||||
___
|
||||
($a4,$t1) = ($t1,$a4);
|
||||
$code.=<<___;
|
||||
mulld $t0,$t1,$a4
|
||||
mulhdu $t1,$t1,$a4
|
||||
addc $h3lo,$h3lo,$t0
|
||||
adde $h3hi,$h3hi,$t1
|
||||
|
||||
mulli $bp,$a3,19 # a[3]*19
|
||||
|
||||
mulld $t0,$a1,$a1
|
||||
mulhdu $t1,$a1,$a1
|
||||
addc $h2lo,$h2lo,$t0
|
||||
adde $h2hi,$h2hi,$t1
|
||||
mulld $t0,$a2,$bi
|
||||
mulhdu $t1,$a2,$bi
|
||||
addc $h3lo,$h3lo,$t0
|
||||
adde $h3hi,$h3hi,$t1
|
||||
mulld $t0,$a3,$bi
|
||||
mulhdu $t1,$a3,$bi
|
||||
addc $h4lo,$h4lo,$t0
|
||||
adde $h4hi,$h4hi,$t1
|
||||
mulld $t0,$a4,$bi
|
||||
mulhdu $t1,$a4,$bi
|
||||
add $bi,$a3,$a3 # a[3]*2
|
||||
addc $h0lo,$h0lo,$t0
|
||||
adde $h0hi,$h0hi,$t1
|
||||
___
|
||||
($a3,$t1) = ($bp,$a3);
|
||||
$code.=<<___;
|
||||
mulld $t0,$t1,$a3
|
||||
mulhdu $t1,$t1,$a3
|
||||
addc $h1lo,$h1lo,$t0
|
||||
adde $h1hi,$h1hi,$t1
|
||||
mulld $t0,$bi,$a4
|
||||
mulhdu $t1,$bi,$a4
|
||||
add $bi,$a2,$a2 # a[2]*2
|
||||
addc $h2lo,$h2lo,$t0
|
||||
adde $h2hi,$h2hi,$t1
|
||||
|
||||
mulld $t0,$a2,$a2
|
||||
mulhdu $t1,$a2,$a2
|
||||
addc $h4lo,$h4lo,$t0
|
||||
adde $h4hi,$h4hi,$t1
|
||||
mulld $t0,$a3,$bi
|
||||
mulhdu $t1,$a3,$bi
|
||||
addc $h0lo,$h0lo,$t0
|
||||
adde $h0hi,$h0hi,$t1
|
||||
mulld $t0,$a4,$bi
|
||||
mulhdu $t1,$a4,$bi
|
||||
addc $h1lo,$h1lo,$t0
|
||||
adde $h1hi,$h1hi,$t1
|
||||
|
||||
b .Lfe51_reduce
|
||||
.long 0
|
||||
.byte 0,12,4,0,0x80,11,2,0
|
||||
.long 0
|
||||
.size x25519_fe51_sqr,.-x25519_fe51_sqr
|
||||
___
|
||||
}
|
||||
$code.=<<___;
|
||||
.globl x25519_fe51_mul121666
|
||||
.type x25519_fe51_mul121666,\@function
|
||||
.align 5
|
||||
x25519_fe51_mul121666:
|
||||
stdu $sp,-$FRAME($sp)
|
||||
std r21,`$FRAME-8*11`($sp)
|
||||
std r22,`$FRAME-8*10`($sp)
|
||||
std r23,`$FRAME-8*9`($sp)
|
||||
std r24,`$FRAME-8*8`($sp)
|
||||
std r25,`$FRAME-8*7`($sp)
|
||||
std r26,`$FRAME-8*6`($sp)
|
||||
std r27,`$FRAME-8*5`($sp)
|
||||
std r28,`$FRAME-8*4`($sp)
|
||||
std r29,`$FRAME-8*3`($sp)
|
||||
std r30,`$FRAME-8*2`($sp)
|
||||
std r31,`$FRAME-8*1`($sp)
|
||||
|
||||
lis $bi,`65536>>16`
|
||||
ori $bi,$bi,`121666-65536`
|
||||
ld $a0,0($ap)
|
||||
ld $a1,8($ap)
|
||||
ld $a2,16($ap)
|
||||
ld $a3,24($ap)
|
||||
ld $a4,32($ap)
|
||||
|
||||
mulld $h0lo,$a0,$bi # a[0]*121666
|
||||
mulhdu $h0hi,$a0,$bi
|
||||
mulld $h1lo,$a1,$bi # a[1]*121666
|
||||
mulhdu $h1hi,$a1,$bi
|
||||
mulld $h2lo,$a2,$bi # a[2]*121666
|
||||
mulhdu $h2hi,$a2,$bi
|
||||
mulld $h3lo,$a3,$bi # a[3]*121666
|
||||
mulhdu $h3hi,$a3,$bi
|
||||
mulld $h4lo,$a4,$bi # a[4]*121666
|
||||
mulhdu $h4hi,$a4,$bi
|
||||
|
||||
b .Lfe51_reduce
|
||||
.long 0
|
||||
.byte 0,12,4,0,0x80,11,2,0
|
||||
.long 0
|
||||
.size x25519_fe51_mul121666,.-x25519_fe51_mul121666
|
||||
___
|
||||
}
|
||||
|
||||
$code =~ s/\`([^\`]*)\`/eval $1/gem;
|
||||
print $code;
|
||||
close STDOUT;
|
||||
@@ -27,6 +27,7 @@ INCLUDE[ecp_nistz256-armv8.o]=..
|
||||
GENERATE[ecp_nistz256-ppc64.s]=asm/ecp_nistz256-ppc64.pl $(PERLASM_SCHEME)
|
||||
|
||||
GENERATE[x25519-x86_64.s]=asm/x25519-x86_64.pl $(PERLASM_SCHEME)
|
||||
GENERATE[x25519-ppc64.s]=asm/x25519-ppc64.pl $(PERLASM_SCHEME)
|
||||
|
||||
BEGINRAW[Makefile]
|
||||
{- $builddir -}/ecp_nistz256-%.S: {- $sourcedir -}/asm/ecp_nistz256-%.pl
|
||||
|
||||
+5
-6
@@ -94,7 +94,7 @@ int ec_GF2m_simple_set_compressed_coordinates(const EC_GROUP *group,
|
||||
}
|
||||
}
|
||||
|
||||
if (!EC_POINT_set_affine_coordinates_GF2m(group, point, x, y, ctx))
|
||||
if (!EC_POINT_set_affine_coordinates(group, point, x, y, ctx))
|
||||
goto err;
|
||||
|
||||
ret = 1;
|
||||
@@ -166,7 +166,7 @@ size_t ec_GF2m_simple_point2oct(const EC_GROUP *group, const EC_POINT *point,
|
||||
if (yxi == NULL)
|
||||
goto err;
|
||||
|
||||
if (!EC_POINT_get_affine_coordinates_GF2m(group, point, x, y, ctx))
|
||||
if (!EC_POINT_get_affine_coordinates(group, point, x, y, ctx))
|
||||
goto err;
|
||||
|
||||
buf[0] = form;
|
||||
@@ -301,8 +301,7 @@ int ec_GF2m_simple_oct2point(const EC_GROUP *group, EC_POINT *point,
|
||||
}
|
||||
|
||||
if (form == POINT_CONVERSION_COMPRESSED) {
|
||||
if (!EC_POINT_set_compressed_coordinates_GF2m
|
||||
(group, point, x, y_bit, ctx))
|
||||
if (!EC_POINT_set_compressed_coordinates(group, point, x, y_bit, ctx))
|
||||
goto err;
|
||||
} else {
|
||||
if (!BN_bin2bn(buf + 1 + field_len, field_len, y))
|
||||
@@ -321,10 +320,10 @@ int ec_GF2m_simple_oct2point(const EC_GROUP *group, EC_POINT *point,
|
||||
}
|
||||
|
||||
/*
|
||||
* EC_POINT_set_affine_coordinates_GF2m is responsible for checking that
|
||||
* EC_POINT_set_affine_coordinates is responsible for checking that
|
||||
* the point is on the curve.
|
||||
*/
|
||||
if (!EC_POINT_set_affine_coordinates_GF2m(group, point, x, y, ctx))
|
||||
if (!EC_POINT_set_affine_coordinates(group, point, x, y, ctx))
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
||||
@@ -390,7 +390,7 @@ int ec_GF2m_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
|
||||
if (!BN_copy(y0, a->Y))
|
||||
goto err;
|
||||
} else {
|
||||
if (!EC_POINT_get_affine_coordinates_GF2m(group, a, x0, y0, ctx))
|
||||
if (!EC_POINT_get_affine_coordinates(group, a, x0, y0, ctx))
|
||||
goto err;
|
||||
}
|
||||
if (b->Z_is_one) {
|
||||
@@ -399,7 +399,7 @@ int ec_GF2m_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
|
||||
if (!BN_copy(y1, b->Y))
|
||||
goto err;
|
||||
} else {
|
||||
if (!EC_POINT_get_affine_coordinates_GF2m(group, b, x1, y1, ctx))
|
||||
if (!EC_POINT_get_affine_coordinates(group, b, x1, y1, ctx))
|
||||
goto err;
|
||||
}
|
||||
|
||||
@@ -447,7 +447,7 @@ int ec_GF2m_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
|
||||
if (!BN_GF2m_add(y2, y2, y1))
|
||||
goto err;
|
||||
|
||||
if (!EC_POINT_set_affine_coordinates_GF2m(group, r, x2, y2, ctx))
|
||||
if (!EC_POINT_set_affine_coordinates(group, r, x2, y2, ctx))
|
||||
goto err;
|
||||
|
||||
ret = 1;
|
||||
@@ -590,9 +590,9 @@ int ec_GF2m_simple_cmp(const EC_GROUP *group, const EC_POINT *a,
|
||||
if (bY == NULL)
|
||||
goto err;
|
||||
|
||||
if (!EC_POINT_get_affine_coordinates_GF2m(group, a, aX, aY, ctx))
|
||||
if (!EC_POINT_get_affine_coordinates(group, a, aX, aY, ctx))
|
||||
goto err;
|
||||
if (!EC_POINT_get_affine_coordinates_GF2m(group, b, bX, bY, ctx))
|
||||
if (!EC_POINT_get_affine_coordinates(group, b, bX, bY, ctx))
|
||||
goto err;
|
||||
ret = ((BN_cmp(aX, bX) == 0) && BN_cmp(aY, bY) == 0) ? 0 : 1;
|
||||
|
||||
@@ -625,7 +625,7 @@ int ec_GF2m_simple_make_affine(const EC_GROUP *group, EC_POINT *point,
|
||||
if (y == NULL)
|
||||
goto err;
|
||||
|
||||
if (!EC_POINT_get_affine_coordinates_GF2m(group, point, x, y, ctx))
|
||||
if (!EC_POINT_get_affine_coordinates(group, point, x, y, ctx))
|
||||
goto err;
|
||||
if (!BN_copy(point->X, x))
|
||||
goto err;
|
||||
|
||||
@@ -92,19 +92,19 @@ static int eckey_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
|
||||
static EC_KEY *eckey_type2param(int ptype, const void *pval)
|
||||
{
|
||||
EC_KEY *eckey = NULL;
|
||||
EC_GROUP *group = NULL;
|
||||
|
||||
if (ptype == V_ASN1_SEQUENCE) {
|
||||
const ASN1_STRING *pstr = pval;
|
||||
const unsigned char *pm = NULL;
|
||||
int pmlen;
|
||||
pm = pstr->data;
|
||||
pmlen = pstr->length;
|
||||
const unsigned char *pm = pstr->data;
|
||||
int pmlen = pstr->length;
|
||||
|
||||
if ((eckey = d2i_ECParameters(NULL, &pm, pmlen)) == NULL) {
|
||||
ECerr(EC_F_ECKEY_TYPE2PARAM, EC_R_DECODE_ERROR);
|
||||
goto ecerr;
|
||||
}
|
||||
} else if (ptype == V_ASN1_OBJECT) {
|
||||
const ASN1_OBJECT *poid = pval;
|
||||
EC_GROUP *group;
|
||||
|
||||
/*
|
||||
* type == V_ASN1_OBJECT => the parameters are given by an asn1 OID
|
||||
@@ -129,6 +129,7 @@ static EC_KEY *eckey_type2param(int ptype, const void *pval)
|
||||
|
||||
ecerr:
|
||||
EC_KEY_free(eckey);
|
||||
EC_GROUP_free(group);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
+5
-17
@@ -266,7 +266,7 @@ static int ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field)
|
||||
goto err;
|
||||
}
|
||||
/* the parameters are specified by the prime number p */
|
||||
if (!EC_GROUP_get_curve_GFp(group, tmp, NULL, NULL, NULL)) {
|
||||
if (!EC_GROUP_get_curve(group, tmp, NULL, NULL, NULL)) {
|
||||
ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
@@ -365,7 +365,7 @@ static int ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field)
|
||||
|
||||
static int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve)
|
||||
{
|
||||
int ok = 0, nid;
|
||||
int ok = 0;
|
||||
BIGNUM *tmp_1 = NULL, *tmp_2 = NULL;
|
||||
unsigned char *a_buf = NULL, *b_buf = NULL;
|
||||
size_t len;
|
||||
@@ -378,24 +378,12 @@ static int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve)
|
||||
goto err;
|
||||
}
|
||||
|
||||
nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group));
|
||||
|
||||
/* get a and b */
|
||||
if (nid == NID_X9_62_prime_field) {
|
||||
if (!EC_GROUP_get_curve_GFp(group, NULL, tmp_1, tmp_2, NULL)) {
|
||||
ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
if (!EC_GROUP_get_curve(group, NULL, tmp_1, tmp_2, NULL)) {
|
||||
ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
#ifndef OPENSSL_NO_EC2M
|
||||
else { /* nid == NID_X9_62_characteristic_two_field */
|
||||
|
||||
if (!EC_GROUP_get_curve_GF2m(group, NULL, tmp_1, tmp_2, NULL)) {
|
||||
ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Per SEC 1, the curve coefficients must be padded up to size. See C.2's
|
||||
* definition of Curve, C.1's definition of FieldElement, and 2.3.5's
|
||||
|
||||
@@ -3078,7 +3078,7 @@ static EC_GROUP *ec_group_new_from_data(const ec_list_element curve)
|
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
}
|
||||
if (!EC_POINT_set_affine_coordinates_GFp(group, P, x, y, ctx)) {
|
||||
if (!EC_POINT_set_affine_coordinates(group, P, x, y, ctx)) {
|
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
+2
-2
@@ -51,7 +51,7 @@ EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a,
|
||||
if (ret == NULL)
|
||||
return NULL;
|
||||
|
||||
if (!EC_GROUP_set_curve_GFp(ret, p, a, b, ctx)) {
|
||||
if (!EC_GROUP_set_curve(ret, p, a, b, ctx)) {
|
||||
EC_GROUP_clear_free(ret);
|
||||
return NULL;
|
||||
}
|
||||
@@ -72,7 +72,7 @@ EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a,
|
||||
if (ret == NULL)
|
||||
return NULL;
|
||||
|
||||
if (!EC_GROUP_set_curve_GF2m(ret, p, a, b, ctx)) {
|
||||
if (!EC_GROUP_set_curve(ret, p, a, b, ctx)) {
|
||||
EC_GROUP_clear_free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -146,6 +146,7 @@ static const ERR_STRING_DATA EC_str_functs[] = {
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_GROUP_CHECK_DISCRIMINANT, 0),
|
||||
"EC_GROUP_check_discriminant"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_GROUP_COPY, 0), "EC_GROUP_copy"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_GROUP_GET_CURVE, 0), "EC_GROUP_get_curve"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_GROUP_GET_CURVE_GF2M, 0),
|
||||
"EC_GROUP_get_curve_GF2m"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_GROUP_GET_CURVE_GFP, 0),
|
||||
@@ -168,6 +169,7 @@ static const ERR_STRING_DATA EC_str_functs[] = {
|
||||
"EC_GROUP_new_from_ecparameters"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_GROUP_NEW_FROM_ECPKPARAMETERS, 0),
|
||||
"EC_GROUP_new_from_ecpkparameters"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_GROUP_SET_CURVE, 0), "EC_GROUP_set_curve"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_GROUP_SET_CURVE_GF2M, 0),
|
||||
"EC_GROUP_set_curve_GF2m"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_GROUP_SET_CURVE_GFP, 0),
|
||||
@@ -203,6 +205,8 @@ static const ERR_STRING_DATA EC_str_functs[] = {
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_CMP, 0), "EC_POINT_cmp"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_COPY, 0), "EC_POINT_copy"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_DBL, 0), "EC_POINT_dbl"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_GET_AFFINE_COORDINATES, 0),
|
||||
"EC_POINT_get_affine_coordinates"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M, 0),
|
||||
"EC_POINT_get_affine_coordinates_GF2m"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP, 0),
|
||||
@@ -220,10 +224,14 @@ static const ERR_STRING_DATA EC_str_functs[] = {
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_OCT2POINT, 0), "EC_POINT_oct2point"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_POINT2BUF, 0), "EC_POINT_point2buf"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_POINT2OCT, 0), "EC_POINT_point2oct"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_SET_AFFINE_COORDINATES, 0),
|
||||
"EC_POINT_set_affine_coordinates"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M, 0),
|
||||
"EC_POINT_set_affine_coordinates_GF2m"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP, 0),
|
||||
"EC_POINT_set_affine_coordinates_GFp"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_SET_COMPRESSED_COORDINATES, 0),
|
||||
"EC_POINT_set_compressed_coordinates"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M, 0),
|
||||
"EC_POINT_set_compressed_coordinates_GF2m"},
|
||||
{ERR_PACK(ERR_LIB_EC, EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP, 0),
|
||||
|
||||
+4
-25
@@ -341,9 +341,6 @@ int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x,
|
||||
BIGNUM *tx, *ty;
|
||||
EC_POINT *point = NULL;
|
||||
int ok = 0;
|
||||
#ifndef OPENSSL_NO_EC2M
|
||||
int tmp_nid, is_char_two = 0;
|
||||
#endif
|
||||
|
||||
if (key == NULL || key->group == NULL || x == NULL || y == NULL) {
|
||||
ECerr(EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES,
|
||||
@@ -365,29 +362,11 @@ int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x,
|
||||
if (ty == NULL)
|
||||
goto err;
|
||||
|
||||
#ifndef OPENSSL_NO_EC2M
|
||||
tmp_nid = EC_METHOD_get_field_type(EC_GROUP_method_of(key->group));
|
||||
if (!EC_POINT_set_affine_coordinates(key->group, point, x, y, ctx))
|
||||
goto err;
|
||||
if (!EC_POINT_get_affine_coordinates(key->group, point, tx, ty, ctx))
|
||||
goto err;
|
||||
|
||||
if (tmp_nid == NID_X9_62_characteristic_two_field)
|
||||
is_char_two = 1;
|
||||
|
||||
if (is_char_two) {
|
||||
if (!EC_POINT_set_affine_coordinates_GF2m(key->group, point,
|
||||
x, y, ctx))
|
||||
goto err;
|
||||
if (!EC_POINT_get_affine_coordinates_GF2m(key->group, point,
|
||||
tx, ty, ctx))
|
||||
goto err;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
if (!EC_POINT_set_affine_coordinates_GFp(key->group, point,
|
||||
x, y, ctx))
|
||||
goto err;
|
||||
if (!EC_POINT_get_affine_coordinates_GFp(key->group, point,
|
||||
tx, ty, ctx))
|
||||
goto err;
|
||||
}
|
||||
/*
|
||||
* Check if retrieved coordinates match originals and are less than field
|
||||
* order: if not values are out of range.
|
||||
|
||||
+23
-17
@@ -50,8 +50,7 @@ struct ec_method_st {
|
||||
void (*group_finish) (EC_GROUP *);
|
||||
void (*group_clear_finish) (EC_GROUP *);
|
||||
int (*group_copy) (EC_GROUP *, const EC_GROUP *);
|
||||
/* used by EC_GROUP_set_curve_GFp, EC_GROUP_get_curve_GFp, */
|
||||
/* EC_GROUP_set_curve_GF2m, and EC_GROUP_get_curve_GF2m: */
|
||||
/* used by EC_GROUP_set_curve, EC_GROUP_get_curve: */
|
||||
int (*group_set_curve) (EC_GROUP *, const BIGNUM *p, const BIGNUM *a,
|
||||
const BIGNUM *b, BN_CTX *);
|
||||
int (*group_get_curve) (const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b,
|
||||
@@ -73,9 +72,9 @@ struct ec_method_st {
|
||||
* used by EC_POINT_set_to_infinity,
|
||||
* EC_POINT_set_Jprojective_coordinates_GFp,
|
||||
* EC_POINT_get_Jprojective_coordinates_GFp,
|
||||
* EC_POINT_set_affine_coordinates_GFp, ..._GF2m,
|
||||
* EC_POINT_get_affine_coordinates_GFp, ..._GF2m,
|
||||
* EC_POINT_set_compressed_coordinates_GFp, ..._GF2m:
|
||||
* EC_POINT_set_affine_coordinates,
|
||||
* EC_POINT_get_affine_coordinates,
|
||||
* EC_POINT_set_compressed_coordinates:
|
||||
*/
|
||||
int (*point_set_to_infinity) (const EC_GROUP *, EC_POINT *);
|
||||
int (*point_set_Jprojective_coordinates_GFp) (const EC_GROUP *,
|
||||
@@ -301,7 +300,6 @@ struct ec_point_st {
|
||||
* special case */
|
||||
};
|
||||
|
||||
|
||||
static ossl_inline int ec_point_is_compat(const EC_POINT *point,
|
||||
const EC_GROUP *group)
|
||||
{
|
||||
@@ -314,7 +312,6 @@ static ossl_inline int ec_point_is_compat(const EC_POINT *point,
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
NISTP224_PRE_COMP *EC_nistp224_pre_comp_dup(NISTP224_PRE_COMP *);
|
||||
NISTP256_PRE_COMP *EC_nistp256_pre_comp_dup(NISTP256_PRE_COMP *);
|
||||
NISTP521_PRE_COMP *EC_nistp521_pre_comp_dup(NISTP521_PRE_COMP *);
|
||||
@@ -394,7 +391,16 @@ int ec_GFp_simple_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a,
|
||||
int ec_GFp_simple_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a,
|
||||
BN_CTX *);
|
||||
int ec_GFp_simple_blind_coordinates(const EC_GROUP *group, EC_POINT *p,
|
||||
BN_CTX *ctx);
|
||||
BN_CTX *ctx);
|
||||
int ec_GFp_simple_ladder_pre(const EC_GROUP *group,
|
||||
EC_POINT *r, EC_POINT *s,
|
||||
EC_POINT *p, BN_CTX *ctx);
|
||||
int ec_GFp_simple_ladder_step(const EC_GROUP *group,
|
||||
EC_POINT *r, EC_POINT *s,
|
||||
EC_POINT *p, BN_CTX *ctx);
|
||||
int ec_GFp_simple_ladder_post(const EC_GROUP *group,
|
||||
EC_POINT *r, EC_POINT *s,
|
||||
EC_POINT *p, BN_CTX *ctx);
|
||||
|
||||
/* method functions in ecp_mont.c */
|
||||
int ec_GFp_mont_group_init(EC_GROUP *);
|
||||
@@ -681,9 +687,9 @@ int ec_scalar_mul_ladder(const EC_GROUP *group, EC_POINT *r,
|
||||
|
||||
int ec_point_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx);
|
||||
|
||||
static inline int ec_point_ladder_pre(const EC_GROUP *group,
|
||||
EC_POINT *r, EC_POINT *s,
|
||||
EC_POINT *p, BN_CTX *ctx)
|
||||
static ossl_inline int ec_point_ladder_pre(const EC_GROUP *group,
|
||||
EC_POINT *r, EC_POINT *s,
|
||||
EC_POINT *p, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->ladder_pre != NULL)
|
||||
return group->meth->ladder_pre(group, r, s, p, ctx);
|
||||
@@ -695,9 +701,9 @@ static inline int ec_point_ladder_pre(const EC_GROUP *group,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int ec_point_ladder_step(const EC_GROUP *group,
|
||||
EC_POINT *r, EC_POINT *s,
|
||||
EC_POINT *p, BN_CTX *ctx)
|
||||
static ossl_inline int ec_point_ladder_step(const EC_GROUP *group,
|
||||
EC_POINT *r, EC_POINT *s,
|
||||
EC_POINT *p, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->ladder_step != NULL)
|
||||
return group->meth->ladder_step(group, r, s, p, ctx);
|
||||
@@ -710,9 +716,9 @@ static inline int ec_point_ladder_step(const EC_GROUP *group,
|
||||
|
||||
}
|
||||
|
||||
static inline int ec_point_ladder_post(const EC_GROUP *group,
|
||||
EC_POINT *r, EC_POINT *s,
|
||||
EC_POINT *p, BN_CTX *ctx)
|
||||
static ossl_inline int ec_point_ladder_post(const EC_GROUP *group,
|
||||
EC_POINT *r, EC_POINT *s,
|
||||
EC_POINT *p, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->ladder_post != NULL)
|
||||
return group->meth->ladder_post(group, r, s, p, ctx);
|
||||
|
||||
+69
-78
@@ -415,48 +415,52 @@ size_t EC_GROUP_get_seed_len(const EC_GROUP *group)
|
||||
return group->seed_len;
|
||||
}
|
||||
|
||||
int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a,
|
||||
const BIGNUM *b, BN_CTX *ctx)
|
||||
int EC_GROUP_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a,
|
||||
const BIGNUM *b, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->group_set_curve == 0) {
|
||||
ECerr(EC_F_EC_GROUP_SET_CURVE_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
ECerr(EC_F_EC_GROUP_SET_CURVE, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
return 0;
|
||||
}
|
||||
return group->meth->group_set_curve(group, p, a, b, ctx);
|
||||
}
|
||||
|
||||
int EC_GROUP_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b,
|
||||
BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->group_get_curve == NULL) {
|
||||
ECerr(EC_F_EC_GROUP_GET_CURVE, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
return 0;
|
||||
}
|
||||
return group->meth->group_get_curve(group, p, a, b, ctx);
|
||||
}
|
||||
|
||||
#if OPENSSL_API_COMPAT < 0x10200000L
|
||||
int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a,
|
||||
const BIGNUM *b, BN_CTX *ctx)
|
||||
{
|
||||
return EC_GROUP_set_curve(group, p, a, b, ctx);
|
||||
}
|
||||
|
||||
int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a,
|
||||
BIGNUM *b, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->group_get_curve == 0) {
|
||||
ECerr(EC_F_EC_GROUP_GET_CURVE_GFP, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
return 0;
|
||||
}
|
||||
return group->meth->group_get_curve(group, p, a, b, ctx);
|
||||
return EC_GROUP_get_curve(group, p, a, b, ctx);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_EC2M
|
||||
# ifndef OPENSSL_NO_EC2M
|
||||
int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a,
|
||||
const BIGNUM *b, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->group_set_curve == 0) {
|
||||
ECerr(EC_F_EC_GROUP_SET_CURVE_GF2M,
|
||||
ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
return 0;
|
||||
}
|
||||
return group->meth->group_set_curve(group, p, a, b, ctx);
|
||||
return EC_GROUP_set_curve(group, p, a, b, ctx);
|
||||
}
|
||||
|
||||
int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a,
|
||||
BIGNUM *b, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->group_get_curve == 0) {
|
||||
ECerr(EC_F_EC_GROUP_GET_CURVE_GF2M,
|
||||
ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
return 0;
|
||||
}
|
||||
return group->meth->group_get_curve(group, p, a, b, ctx);
|
||||
return EC_GROUP_get_curve(group, p, a, b, ctx);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
int EC_GROUP_get_degree(const EC_GROUP *group)
|
||||
@@ -699,92 +703,79 @@ int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group,
|
||||
y, z, ctx);
|
||||
}
|
||||
|
||||
int EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *point,
|
||||
const BIGNUM *x, const BIGNUM *y,
|
||||
BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->point_set_affine_coordinates == NULL) {
|
||||
ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES,
|
||||
ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
return 0;
|
||||
}
|
||||
if (!ec_point_is_compat(point, group)) {
|
||||
ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES, EC_R_INCOMPATIBLE_OBJECTS);
|
||||
return 0;
|
||||
}
|
||||
if (!group->meth->point_set_affine_coordinates(group, point, x, y, ctx))
|
||||
return 0;
|
||||
|
||||
if (EC_POINT_is_on_curve(group, point, ctx) <= 0) {
|
||||
ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES, EC_R_POINT_IS_NOT_ON_CURVE);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if OPENSSL_API_COMPAT < 0x10200000L
|
||||
int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group,
|
||||
EC_POINT *point, const BIGNUM *x,
|
||||
const BIGNUM *y, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->point_set_affine_coordinates == 0) {
|
||||
ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP,
|
||||
ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
return 0;
|
||||
}
|
||||
if (!ec_point_is_compat(point, group)) {
|
||||
ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP,
|
||||
EC_R_INCOMPATIBLE_OBJECTS);
|
||||
return 0;
|
||||
}
|
||||
if (!group->meth->point_set_affine_coordinates(group, point, x, y, ctx))
|
||||
return 0;
|
||||
|
||||
if (EC_POINT_is_on_curve(group, point, ctx) <= 0) {
|
||||
ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP,
|
||||
EC_R_POINT_IS_NOT_ON_CURVE);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return EC_POINT_set_affine_coordinates(group, point, x, y, ctx);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_EC2M
|
||||
# ifndef OPENSSL_NO_EC2M
|
||||
int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group,
|
||||
EC_POINT *point, const BIGNUM *x,
|
||||
const BIGNUM *y, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->point_set_affine_coordinates == 0) {
|
||||
ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M,
|
||||
return EC_POINT_set_affine_coordinates(group, point, x, y, ctx);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
int EC_POINT_get_affine_coordinates(const EC_GROUP *group,
|
||||
const EC_POINT *point, BIGNUM *x, BIGNUM *y,
|
||||
BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->point_get_affine_coordinates == NULL) {
|
||||
ECerr(EC_F_EC_POINT_GET_AFFINE_COORDINATES,
|
||||
ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
return 0;
|
||||
}
|
||||
if (!ec_point_is_compat(point, group)) {
|
||||
ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M,
|
||||
EC_R_INCOMPATIBLE_OBJECTS);
|
||||
ECerr(EC_F_EC_POINT_GET_AFFINE_COORDINATES, EC_R_INCOMPATIBLE_OBJECTS);
|
||||
return 0;
|
||||
}
|
||||
if (!group->meth->point_set_affine_coordinates(group, point, x, y, ctx))
|
||||
return 0;
|
||||
|
||||
if (EC_POINT_is_on_curve(group, point, ctx) <= 0) {
|
||||
ECerr(EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M,
|
||||
EC_R_POINT_IS_NOT_ON_CURVE);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return group->meth->point_get_affine_coordinates(group, point, x, y, ctx);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if OPENSSL_API_COMPAT < 0x10200000L
|
||||
int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group,
|
||||
const EC_POINT *point, BIGNUM *x,
|
||||
BIGNUM *y, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->point_get_affine_coordinates == 0) {
|
||||
ECerr(EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP,
|
||||
ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
return 0;
|
||||
}
|
||||
if (!ec_point_is_compat(point, group)) {
|
||||
ECerr(EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP,
|
||||
EC_R_INCOMPATIBLE_OBJECTS);
|
||||
return 0;
|
||||
}
|
||||
return group->meth->point_get_affine_coordinates(group, point, x, y, ctx);
|
||||
return EC_POINT_get_affine_coordinates(group, point, x, y, ctx);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_EC2M
|
||||
# ifndef OPENSSL_NO_EC2M
|
||||
int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group,
|
||||
const EC_POINT *point, BIGNUM *x,
|
||||
BIGNUM *y, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->point_get_affine_coordinates == 0) {
|
||||
ECerr(EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M,
|
||||
ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
return 0;
|
||||
}
|
||||
if (!ec_point_is_compat(point, group)) {
|
||||
ECerr(EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M,
|
||||
EC_R_INCOMPATIBLE_OBJECTS);
|
||||
return 0;
|
||||
}
|
||||
return group->meth->point_get_affine_coordinates(group, point, x, y, ctx);
|
||||
return EC_POINT_get_affine_coordinates(group, point, x, y, ctx);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
|
||||
|
||||
+17
-29
@@ -15,18 +15,17 @@
|
||||
|
||||
#include "ec_lcl.h"
|
||||
|
||||
int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group,
|
||||
EC_POINT *point, const BIGNUM *x,
|
||||
int y_bit, BN_CTX *ctx)
|
||||
int EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point,
|
||||
const BIGNUM *x, int y_bit, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->point_set_compressed_coordinates == 0
|
||||
if (group->meth->point_set_compressed_coordinates == NULL
|
||||
&& !(group->meth->flags & EC_FLAGS_DEFAULT_OCT)) {
|
||||
ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP,
|
||||
ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES,
|
||||
ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
return 0;
|
||||
}
|
||||
if (!ec_point_is_compat(point, group)) {
|
||||
ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP,
|
||||
ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES,
|
||||
EC_R_INCOMPATIBLE_OBJECTS);
|
||||
return 0;
|
||||
}
|
||||
@@ -37,7 +36,7 @@ int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group,
|
||||
else
|
||||
#ifdef OPENSSL_NO_EC2M
|
||||
{
|
||||
ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP,
|
||||
ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES,
|
||||
EC_R_GF2M_NOT_SUPPORTED);
|
||||
return 0;
|
||||
}
|
||||
@@ -50,33 +49,22 @@ int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group,
|
||||
y_bit, ctx);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_EC2M
|
||||
#if OPENSSL_API_COMPAT < 0x10200000L
|
||||
int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group,
|
||||
EC_POINT *point, const BIGNUM *x,
|
||||
int y_bit, BN_CTX *ctx)
|
||||
{
|
||||
return EC_POINT_set_compressed_coordinates(group, point, x, y_bit, ctx);
|
||||
}
|
||||
|
||||
# ifndef OPENSSL_NO_EC2M
|
||||
int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group,
|
||||
EC_POINT *point, const BIGNUM *x,
|
||||
int y_bit, BN_CTX *ctx)
|
||||
{
|
||||
if (group->meth->point_set_compressed_coordinates == 0
|
||||
&& !(group->meth->flags & EC_FLAGS_DEFAULT_OCT)) {
|
||||
ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M,
|
||||
ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||
return 0;
|
||||
}
|
||||
if (!ec_point_is_compat(point, group)) {
|
||||
ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M,
|
||||
EC_R_INCOMPATIBLE_OBJECTS);
|
||||
return 0;
|
||||
}
|
||||
if (group->meth->flags & EC_FLAGS_DEFAULT_OCT) {
|
||||
if (group->meth->field_type == NID_X9_62_prime_field)
|
||||
return ec_GFp_simple_set_compressed_coordinates(group, point, x,
|
||||
y_bit, ctx);
|
||||
else
|
||||
return ec_GF2m_simple_set_compressed_coordinates(group, point, x,
|
||||
y_bit, ctx);
|
||||
}
|
||||
return group->meth->point_set_compressed_coordinates(group, point, x,
|
||||
y_bit, ctx);
|
||||
return EC_POINT_set_compressed_coordinates(group, point, x, y_bit, ctx);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point,
|
||||
|
||||
+3
-14
@@ -83,21 +83,10 @@ int ecdh_simple_compute_key(unsigned char **pout, size_t *poutlen,
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) ==
|
||||
NID_X9_62_prime_field) {
|
||||
if (!EC_POINT_get_affine_coordinates_GFp(group, tmp, x, NULL, ctx)) {
|
||||
ECerr(EC_F_ECDH_SIMPLE_COMPUTE_KEY, EC_R_POINT_ARITHMETIC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
if (!EC_POINT_get_affine_coordinates(group, tmp, x, NULL, ctx)) {
|
||||
ECerr(EC_F_ECDH_SIMPLE_COMPUTE_KEY, EC_R_POINT_ARITHMETIC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
#ifndef OPENSSL_NO_EC2M
|
||||
else {
|
||||
if (!EC_POINT_get_affine_coordinates_GF2m(group, tmp, x, NULL, ctx)) {
|
||||
ECerr(EC_F_ECDH_SIMPLE_COMPUTE_KEY, EC_R_POINT_ARITHMETIC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
buflen = (EC_GROUP_get_degree(group) + 7) / 8;
|
||||
len = BN_num_bytes(x);
|
||||
|
||||
+9
-30
@@ -104,23 +104,12 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
||||
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) ==
|
||||
NID_X9_62_prime_field) {
|
||||
if (!EC_POINT_get_affine_coordinates_GFp(group, tmp_point, X,
|
||||
NULL, ctx)) {
|
||||
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!EC_POINT_get_affine_coordinates(group, tmp_point, X, NULL, ctx)) {
|
||||
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
#ifndef OPENSSL_NO_EC2M
|
||||
else { /* NID_X9_62_characteristic_two_field */
|
||||
if (!EC_POINT_get_affine_coordinates_GF2m(group, tmp_point, X,
|
||||
NULL, ctx)) {
|
||||
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!BN_nnmod(r, X, order, ctx)) {
|
||||
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
@@ -408,22 +397,12 @@ int ossl_ecdsa_verify_sig(const unsigned char *dgst, int dgst_len,
|
||||
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) ==
|
||||
NID_X9_62_prime_field) {
|
||||
if (!EC_POINT_get_affine_coordinates_GFp(group, point, X, NULL, ctx)) {
|
||||
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
#ifndef OPENSSL_NO_EC2M
|
||||
else { /* NID_X9_62_characteristic_two_field */
|
||||
|
||||
if (!EC_POINT_get_affine_coordinates_GF2m(group, point, X, NULL, ctx)) {
|
||||
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
if (!EC_POINT_get_affine_coordinates(group, point, X, NULL, ctx)) {
|
||||
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!BN_nnmod(u1, X, order, ctx)) {
|
||||
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
|
||||
+4
-13
@@ -125,19 +125,10 @@ int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off)
|
||||
reason = ERR_R_MALLOC_FAILURE;
|
||||
goto err;
|
||||
}
|
||||
#ifndef OPENSSL_NO_EC2M
|
||||
if (is_char_two) {
|
||||
if (!EC_GROUP_get_curve_GF2m(x, p, a, b, ctx)) {
|
||||
reason = ERR_R_EC_LIB;
|
||||
goto err;
|
||||
}
|
||||
} else /* prime field */
|
||||
#endif
|
||||
{
|
||||
if (!EC_GROUP_get_curve_GFp(x, p, a, b, ctx)) {
|
||||
reason = ERR_R_EC_LIB;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!EC_GROUP_get_curve(x, p, a, b, ctx)) {
|
||||
reason = ERR_R_EC_LIB;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if ((point = EC_GROUP_get0_generator(x)) == NULL) {
|
||||
|
||||
@@ -64,9 +64,9 @@ const EC_METHOD *EC_GFp_mont_method(void)
|
||||
ecdh_simple_compute_key,
|
||||
0, /* field_inverse_mod_ord */
|
||||
ec_GFp_simple_blind_coordinates,
|
||||
0, /* ladder_pre */
|
||||
0, /* ladder_step */
|
||||
0 /* ladder_post */
|
||||
ec_GFp_simple_ladder_pre,
|
||||
ec_GFp_simple_ladder_step,
|
||||
ec_GFp_simple_ladder_post
|
||||
};
|
||||
|
||||
return &ret;
|
||||
|
||||
@@ -66,9 +66,9 @@ const EC_METHOD *EC_GFp_nist_method(void)
|
||||
ecdh_simple_compute_key,
|
||||
0, /* field_inverse_mod_ord */
|
||||
ec_GFp_simple_blind_coordinates,
|
||||
0, /* ladder_pre */
|
||||
0, /* ladder_step */
|
||||
0 /* ladder_post */
|
||||
ec_GFp_simple_ladder_pre,
|
||||
ec_GFp_simple_ladder_step,
|
||||
ec_GFp_simple_ladder_post
|
||||
};
|
||||
|
||||
return &ret;
|
||||
|
||||
@@ -1608,7 +1608,7 @@ int ec_GFp_nistp224_precompute_mult(EC_GROUP *group, BN_CTX *ctx)
|
||||
goto err;
|
||||
BN_bin2bn(nistp224_curve_params[3], sizeof(felem_bytearray), x);
|
||||
BN_bin2bn(nistp224_curve_params[4], sizeof(felem_bytearray), y);
|
||||
if (!EC_POINT_set_affine_coordinates_GFp(group, generator, x, y, ctx))
|
||||
if (!EC_POINT_set_affine_coordinates(group, generator, x, y, ctx))
|
||||
goto err;
|
||||
if ((pre = nistp224_pre_comp_new()) == NULL)
|
||||
goto err;
|
||||
|
||||
@@ -2238,7 +2238,7 @@ int ec_GFp_nistp256_precompute_mult(EC_GROUP *group, BN_CTX *ctx)
|
||||
goto err;
|
||||
BN_bin2bn(nistp256_curve_params[3], sizeof(felem_bytearray), x);
|
||||
BN_bin2bn(nistp256_curve_params[4], sizeof(felem_bytearray), y);
|
||||
if (!EC_POINT_set_affine_coordinates_GFp(group, generator, x, y, ctx))
|
||||
if (!EC_POINT_set_affine_coordinates(group, generator, x, y, ctx))
|
||||
goto err;
|
||||
if ((pre = nistp256_pre_comp_new()) == NULL)
|
||||
goto err;
|
||||
|
||||
@@ -2071,7 +2071,7 @@ int ec_GFp_nistp521_precompute_mult(EC_GROUP *group, BN_CTX *ctx)
|
||||
goto err;
|
||||
BN_bin2bn(nistp521_curve_params[3], sizeof(felem_bytearray), x);
|
||||
BN_bin2bn(nistp521_curve_params[4], sizeof(felem_bytearray), y);
|
||||
if (!EC_POINT_set_affine_coordinates_GFp(group, generator, x, y, ctx))
|
||||
if (!EC_POINT_set_affine_coordinates(group, generator, x, y, ctx))
|
||||
goto err;
|
||||
if ((pre = nistp521_pre_comp_new()) == NULL)
|
||||
goto err;
|
||||
|
||||
@@ -1104,28 +1104,12 @@ __owur static int ecp_nistz256_set_from_affine(EC_POINT *out, const EC_GROUP *gr
|
||||
const P256_POINT_AFFINE *in,
|
||||
BN_CTX *ctx)
|
||||
{
|
||||
BIGNUM *x, *y;
|
||||
BN_ULONG d_x[P256_LIMBS], d_y[P256_LIMBS];
|
||||
int ret = 0;
|
||||
|
||||
x = BN_new();
|
||||
if (x == NULL)
|
||||
return 0;
|
||||
y = BN_new();
|
||||
if (y == NULL) {
|
||||
BN_free(x);
|
||||
return 0;
|
||||
}
|
||||
memcpy(d_x, in->X, sizeof(d_x));
|
||||
bn_set_static_words(x, d_x, P256_LIMBS);
|
||||
|
||||
memcpy(d_y, in->Y, sizeof(d_y));
|
||||
bn_set_static_words(y, d_y, P256_LIMBS);
|
||||
|
||||
ret = EC_POINT_set_affine_coordinates_GFp(group, out, x, y, ctx);
|
||||
|
||||
BN_free(x);
|
||||
BN_free(y);
|
||||
if ((ret = bn_set_words(out->X, in->X, P256_LIMBS))
|
||||
&& (ret = bn_set_words(out->Y, in->Y, P256_LIMBS))
|
||||
&& (ret = bn_set_words(out->Z, ONE, P256_LIMBS)))
|
||||
out->Z_is_one = 1;
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1181,9 +1165,9 @@ __owur static int ecp_nistz256_points_mul(const EC_GROUP *group,
|
||||
if (pre_comp_generator == NULL)
|
||||
goto err;
|
||||
|
||||
ecp_nistz256_gather_w7(&p.a, pre_comp->precomp[0], 1);
|
||||
if (!ecp_nistz256_set_from_affine(pre_comp_generator,
|
||||
group, pre_comp->precomp[0],
|
||||
ctx)) {
|
||||
group, &p.a, ctx)) {
|
||||
EC_POINT_free(pre_comp_generator);
|
||||
goto err;
|
||||
}
|
||||
@@ -1355,8 +1339,7 @@ __owur static int ecp_nistz256_points_mul(const EC_GROUP *group,
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
if (ctx)
|
||||
BN_CTX_end(ctx);
|
||||
BN_CTX_end(ctx);
|
||||
OPENSSL_free(new_points);
|
||||
OPENSSL_free(new_scalars);
|
||||
return ret;
|
||||
|
||||
+5
-6
@@ -140,7 +140,7 @@ int ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *group,
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!EC_POINT_set_affine_coordinates_GFp(group, point, x, y, ctx))
|
||||
if (!EC_POINT_set_affine_coordinates(group, point, x, y, ctx))
|
||||
goto err;
|
||||
|
||||
ret = 1;
|
||||
@@ -206,7 +206,7 @@ size_t ec_GFp_simple_point2oct(const EC_GROUP *group, const EC_POINT *point,
|
||||
if (y == NULL)
|
||||
goto err;
|
||||
|
||||
if (!EC_POINT_get_affine_coordinates_GFp(group, point, x, y, ctx))
|
||||
if (!EC_POINT_get_affine_coordinates(group, point, x, y, ctx))
|
||||
goto err;
|
||||
|
||||
if ((form == POINT_CONVERSION_COMPRESSED
|
||||
@@ -333,8 +333,7 @@ int ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point,
|
||||
}
|
||||
|
||||
if (form == POINT_CONVERSION_COMPRESSED) {
|
||||
if (!EC_POINT_set_compressed_coordinates_GFp
|
||||
(group, point, x, y_bit, ctx))
|
||||
if (!EC_POINT_set_compressed_coordinates(group, point, x, y_bit, ctx))
|
||||
goto err;
|
||||
} else {
|
||||
if (!BN_bin2bn(buf + 1 + field_len, field_len, y))
|
||||
@@ -351,10 +350,10 @@ int ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point,
|
||||
}
|
||||
|
||||
/*
|
||||
* EC_POINT_set_affine_coordinates_GFp is responsible for checking that
|
||||
* EC_POINT_set_affine_coordinates is responsible for checking that
|
||||
* the point is on the curve.
|
||||
*/
|
||||
if (!EC_POINT_set_affine_coordinates_GFp(group, point, x, y, ctx))
|
||||
if (!EC_POINT_set_affine_coordinates(group, point, x, y, ctx))
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
||||
+225
-7
@@ -65,9 +65,9 @@ const EC_METHOD *EC_GFp_simple_method(void)
|
||||
ecdh_simple_compute_key,
|
||||
0, /* field_inverse_mod_ord */
|
||||
ec_GFp_simple_blind_coordinates,
|
||||
0, /* ladder_pre */
|
||||
0, /* ladder_step */
|
||||
0 /* ladder_post */
|
||||
ec_GFp_simple_ladder_pre,
|
||||
ec_GFp_simple_ladder_step,
|
||||
ec_GFp_simple_ladder_post
|
||||
};
|
||||
|
||||
return &ret;
|
||||
@@ -1181,9 +1181,9 @@ int ec_GFp_simple_make_affine(const EC_GROUP *group, EC_POINT *point,
|
||||
if (y == NULL)
|
||||
goto err;
|
||||
|
||||
if (!EC_POINT_get_affine_coordinates_GFp(group, point, x, y, ctx))
|
||||
if (!EC_POINT_get_affine_coordinates(group, point, x, y, ctx))
|
||||
goto err;
|
||||
if (!EC_POINT_set_affine_coordinates_GFp(group, point, x, y, ctx))
|
||||
if (!EC_POINT_set_affine_coordinates(group, point, x, y, ctx))
|
||||
goto err;
|
||||
if (!point->Z_is_one) {
|
||||
ECerr(EC_F_EC_GFP_SIMPLE_MAKE_AFFINE, ERR_R_INTERNAL_ERROR);
|
||||
@@ -1418,6 +1418,224 @@ int ec_GFp_simple_blind_coordinates(const EC_GROUP *group, EC_POINT *p,
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
BN_CTX_end(ctx);
|
||||
return ret;
|
||||
BN_CTX_end(ctx);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*-
|
||||
* Set s := p, r := 2p.
|
||||
*
|
||||
* For doubling we use Formula 3 from Izu-Takagi "A fast parallel elliptic curve
|
||||
* multiplication resistant against side channel attacks" appendix, as described
|
||||
* at
|
||||
* https://hyperelliptic.org/EFD/g1p/auto-shortw-xz.html#doubling-dbl-2002-it-2
|
||||
*
|
||||
* The input point p will be in randomized Jacobian projective coords:
|
||||
* x = X/Z**2, y=Y/Z**3
|
||||
*
|
||||
* The output points p, s, and r are converted to standard (homogeneous)
|
||||
* projective coords:
|
||||
* x = X/Z, y=Y/Z
|
||||
*/
|
||||
int ec_GFp_simple_ladder_pre(const EC_GROUP *group,
|
||||
EC_POINT *r, EC_POINT *s,
|
||||
EC_POINT *p, BN_CTX *ctx)
|
||||
{
|
||||
BIGNUM *t1, *t2, *t3, *t4, *t5, *t6 = NULL;
|
||||
|
||||
t1 = r->Z;
|
||||
t2 = r->Y;
|
||||
t3 = s->X;
|
||||
t4 = r->X;
|
||||
t5 = s->Y;
|
||||
t6 = s->Z;
|
||||
|
||||
/* convert p: (X,Y,Z) -> (XZ,Y,Z**3) */
|
||||
if (!group->meth->field_mul(group, p->X, p->X, p->Z, ctx)
|
||||
|| !group->meth->field_sqr(group, t1, p->Z, ctx)
|
||||
|| !group->meth->field_mul(group, p->Z, p->Z, t1, ctx)
|
||||
/* r := 2p */
|
||||
|| !group->meth->field_sqr(group, t2, p->X, ctx)
|
||||
|| !group->meth->field_sqr(group, t3, p->Z, ctx)
|
||||
|| !group->meth->field_mul(group, t4, t3, group->a, ctx)
|
||||
|| !BN_mod_sub_quick(t5, t2, t4, group->field)
|
||||
|| !BN_mod_add_quick(t2, t2, t4, group->field)
|
||||
|| !group->meth->field_sqr(group, t5, t5, ctx)
|
||||
|| !group->meth->field_mul(group, t6, t3, group->b, ctx)
|
||||
|| !group->meth->field_mul(group, t1, p->X, p->Z, ctx)
|
||||
|| !group->meth->field_mul(group, t4, t1, t6, ctx)
|
||||
|| !BN_mod_lshift_quick(t4, t4, 3, group->field)
|
||||
/* r->X coord output */
|
||||
|| !BN_mod_sub_quick(r->X, t5, t4, group->field)
|
||||
|| !group->meth->field_mul(group, t1, t1, t2, ctx)
|
||||
|| !group->meth->field_mul(group, t2, t3, t6, ctx)
|
||||
|| !BN_mod_add_quick(t1, t1, t2, group->field)
|
||||
/* r->Z coord output */
|
||||
|| !BN_mod_lshift_quick(r->Z, t1, 2, group->field)
|
||||
|| !EC_POINT_copy(s, p))
|
||||
return 0;
|
||||
|
||||
r->Z_is_one = 0;
|
||||
s->Z_is_one = 0;
|
||||
p->Z_is_one = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*-
|
||||
* Differential addition-and-doubling using Eq. (8) and (10) from Izu-Takagi
|
||||
* "A fast parallel elliptic curve multiplication resistant against side channel
|
||||
* attacks", as described at
|
||||
* https://hyperelliptic.org/EFD/g1p/auto-shortw-xz.html#ladder-ladd-2002-it-3
|
||||
*/
|
||||
int ec_GFp_simple_ladder_step(const EC_GROUP *group,
|
||||
EC_POINT *r, EC_POINT *s,
|
||||
EC_POINT *p, BN_CTX *ctx)
|
||||
{
|
||||
int ret = 0;
|
||||
BIGNUM *t0, *t1, *t2, *t3, *t4, *t5, *t6, *t7 = NULL;
|
||||
|
||||
BN_CTX_start(ctx);
|
||||
t0 = BN_CTX_get(ctx);
|
||||
t1 = BN_CTX_get(ctx);
|
||||
t2 = BN_CTX_get(ctx);
|
||||
t3 = BN_CTX_get(ctx);
|
||||
t4 = BN_CTX_get(ctx);
|
||||
t5 = BN_CTX_get(ctx);
|
||||
t6 = BN_CTX_get(ctx);
|
||||
t7 = BN_CTX_get(ctx);
|
||||
|
||||
if (t7 == NULL
|
||||
|| !group->meth->field_mul(group, t0, r->X, s->X, ctx)
|
||||
|| !group->meth->field_mul(group, t1, r->Z, s->Z, ctx)
|
||||
|| !group->meth->field_mul(group, t2, r->X, s->Z, ctx)
|
||||
|| !group->meth->field_mul(group, t3, r->Z, s->X, ctx)
|
||||
|| !group->meth->field_mul(group, t4, group->a, t1, ctx)
|
||||
|| !BN_mod_sub_quick(t4, t0, t4, group->field)
|
||||
|| !BN_mod_add_quick(t5, t3, t2, group->field)
|
||||
|| !group->meth->field_sqr(group, t4, t4, ctx)
|
||||
|| !group->meth->field_mul(group, t5, t1, t5, ctx)
|
||||
|| !BN_mod_lshift_quick(t0, group->b, 2, group->field)
|
||||
|| !group->meth->field_mul(group, t5, t0, t5, ctx)
|
||||
|| !BN_mod_sub_quick(t5, t4, t5, group->field)
|
||||
/* s->X coord output */
|
||||
|| !group->meth->field_mul(group, s->X, t5, p->Z, ctx)
|
||||
|| !BN_mod_sub_quick(t3, t2, t3, group->field)
|
||||
|| !group->meth->field_sqr(group, t3, t3, ctx)
|
||||
/* s->Z coord output */
|
||||
|| !group->meth->field_mul(group, s->Z, t3, p->X, ctx)
|
||||
|| !group->meth->field_sqr(group, t2, r->X, ctx)
|
||||
|| !group->meth->field_sqr(group, t4, r->Z, ctx)
|
||||
|| !group->meth->field_mul(group, t1, t4, group->a, ctx)
|
||||
|| !BN_mod_add_quick(t6, r->X, r->Z, group->field)
|
||||
|| !group->meth->field_sqr(group, t6, t6, ctx)
|
||||
|| !BN_mod_sub_quick(t6, t6, t2, group->field)
|
||||
|| !BN_mod_sub_quick(t6, t6, t4, group->field)
|
||||
|| !BN_mod_sub_quick(t7, t2, t1, group->field)
|
||||
|| !group->meth->field_sqr(group, t7, t7, ctx)
|
||||
|| !group->meth->field_mul(group, t5, t4, t6, ctx)
|
||||
|| !group->meth->field_mul(group, t5, t0, t5, ctx)
|
||||
/* r->X coord output */
|
||||
|| !BN_mod_sub_quick(r->X, t7, t5, group->field)
|
||||
|| !BN_mod_add_quick(t2, t2, t1, group->field)
|
||||
|| !group->meth->field_sqr(group, t5, t4, ctx)
|
||||
|| !group->meth->field_mul(group, t5, t5, t0, ctx)
|
||||
|| !group->meth->field_mul(group, t6, t6, t2, ctx)
|
||||
|| !BN_mod_lshift1_quick(t6, t6, group->field)
|
||||
/* r->Z coord output */
|
||||
|| !BN_mod_add_quick(r->Z, t5, t6, group->field))
|
||||
goto err;
|
||||
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
BN_CTX_end(ctx);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*-
|
||||
* Recovers the y-coordinate of r using Eq. (8) from Brier-Joye, "Weierstrass
|
||||
* Elliptic Curves and Side-Channel Attacks", modified to work in projective
|
||||
* coordinates and return r in Jacobian projective coordinates.
|
||||
*
|
||||
* X4 = two*Y1*X2*Z3*Z2*Z1;
|
||||
* Y4 = two*b*Z3*SQR(Z2*Z1) + Z3*(a*Z2*Z1+X1*X2)*(X1*Z2+X2*Z1) - X3*SQR(X1*Z2-X2*Z1);
|
||||
* Z4 = two*Y1*Z3*SQR(Z2)*Z1;
|
||||
*
|
||||
* Z4 != 0 because:
|
||||
* - Z1==0 implies p is at infinity, which would have caused an early exit in
|
||||
* the caller;
|
||||
* - Z2==0 implies r is at infinity (handled by the BN_is_zero(r->Z) branch);
|
||||
* - Z3==0 implies s is at infinity (handled by the BN_is_zero(s->Z) branch);
|
||||
* - Y1==0 implies p has order 2, so either r or s are infinity and handled by
|
||||
* one of the BN_is_zero(...) branches.
|
||||
*/
|
||||
int ec_GFp_simple_ladder_post(const EC_GROUP *group,
|
||||
EC_POINT *r, EC_POINT *s,
|
||||
EC_POINT *p, BN_CTX *ctx)
|
||||
{
|
||||
int ret = 0;
|
||||
BIGNUM *t0, *t1, *t2, *t3, *t4, *t5, *t6 = NULL;
|
||||
|
||||
if (BN_is_zero(r->Z))
|
||||
return EC_POINT_set_to_infinity(group, r);
|
||||
|
||||
if (BN_is_zero(s->Z)) {
|
||||
/* (X,Y,Z) -> (XZ,YZ**2,Z) */
|
||||
if (!group->meth->field_mul(group, r->X, p->X, p->Z, ctx)
|
||||
|| !group->meth->field_sqr(group, r->Z, p->Z, ctx)
|
||||
|| !group->meth->field_mul(group, r->Y, p->Y, r->Z, ctx)
|
||||
|| !BN_copy(r->Z, p->Z)
|
||||
|| !EC_POINT_invert(group, r, ctx))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
BN_CTX_start(ctx);
|
||||
t0 = BN_CTX_get(ctx);
|
||||
t1 = BN_CTX_get(ctx);
|
||||
t2 = BN_CTX_get(ctx);
|
||||
t3 = BN_CTX_get(ctx);
|
||||
t4 = BN_CTX_get(ctx);
|
||||
t5 = BN_CTX_get(ctx);
|
||||
t6 = BN_CTX_get(ctx);
|
||||
|
||||
if (t6 == NULL
|
||||
|| !BN_mod_lshift1_quick(t0, p->Y, group->field)
|
||||
|| !group->meth->field_mul(group, t1, r->X, p->Z, ctx)
|
||||
|| !group->meth->field_mul(group, t2, r->Z, s->Z, ctx)
|
||||
|| !group->meth->field_mul(group, t2, t1, t2, ctx)
|
||||
|| !group->meth->field_mul(group, t3, t2, t0, ctx)
|
||||
|| !group->meth->field_mul(group, t2, r->Z, p->Z, ctx)
|
||||
|| !group->meth->field_sqr(group, t4, t2, ctx)
|
||||
|| !BN_mod_lshift1_quick(t5, group->b, group->field)
|
||||
|| !group->meth->field_mul(group, t4, t4, t5, ctx)
|
||||
|| !group->meth->field_mul(group, t6, t2, group->a, ctx)
|
||||
|| !group->meth->field_mul(group, t5, r->X, p->X, ctx)
|
||||
|| !BN_mod_add_quick(t5, t6, t5, group->field)
|
||||
|| !group->meth->field_mul(group, t6, r->Z, p->X, ctx)
|
||||
|| !BN_mod_add_quick(t2, t6, t1, group->field)
|
||||
|| !group->meth->field_mul(group, t5, t5, t2, ctx)
|
||||
|| !BN_mod_sub_quick(t6, t6, t1, group->field)
|
||||
|| !group->meth->field_sqr(group, t6, t6, ctx)
|
||||
|| !group->meth->field_mul(group, t6, t6, s->X, ctx)
|
||||
|| !BN_mod_add_quick(t4, t5, t4, group->field)
|
||||
|| !group->meth->field_mul(group, t4, t4, s->Z, ctx)
|
||||
|| !BN_mod_sub_quick(t4, t4, t6, group->field)
|
||||
|| !group->meth->field_sqr(group, t5, r->Z, ctx)
|
||||
|| !group->meth->field_mul(group, r->Z, p->Z, s->Z, ctx)
|
||||
|| !group->meth->field_mul(group, r->Z, t5, r->Z, ctx)
|
||||
|| !group->meth->field_mul(group, r->Z, r->Z, t0, ctx)
|
||||
/* t3 := X, t4 := Y */
|
||||
/* (X,Y,Z) -> (XZ,YZ**2,Z) */
|
||||
|| !group->meth->field_mul(group, r->X, t3, r->Z, ctx)
|
||||
|| !group->meth->field_sqr(group, t3, r->Z, ctx)
|
||||
|| !group->meth->field_mul(group, r->Y, t4, t3, ctx))
|
||||
goto err;
|
||||
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
BN_CTX_end(ctx);
|
||||
return ret;
|
||||
}
|
||||
Reference in New Issue
Block a user